internal.c 1.3 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154
  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. * WOLFSSL_NO_INIT_CTX_KEY
  88. * Allows SSL objects to be created from a CTX without a loaded key/cert
  89. * pair
  90. */
  91. #ifdef EXTERNAL_OPTS_OPENVPN
  92. #error EXTERNAL_OPTS_OPENVPN should not be defined\
  93. when building wolfSSL
  94. #endif
  95. #ifndef WOLFCRYPT_ONLY
  96. #include <wolfssl/internal.h>
  97. #include <wolfssl/error-ssl.h>
  98. #include <wolfssl/wolfcrypt/asn.h>
  99. #include <wolfssl/wolfcrypt/dh.h>
  100. #ifdef NO_INLINE
  101. #include <wolfssl/wolfcrypt/misc.h>
  102. #else
  103. #define WOLFSSL_MISC_INCLUDED
  104. #include <wolfcrypt/src/misc.c>
  105. #endif
  106. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
  107. #include <wolfssl/wolfcrypt/srp.h>
  108. #endif
  109. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  110. #include <wolfssl/wolfcrypt/coding.h>
  111. #endif
  112. #ifdef HAVE_LIBZ
  113. #include "zlib.h"
  114. #endif
  115. #ifdef WOLFSSL_QNX_CAAM
  116. /* included to get CAAM devId value */
  117. #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
  118. #endif
  119. #ifdef HAVE_ARIA
  120. /* included to get ARIA devId value */
  121. #include <wolfssl/wolfcrypt/port/aria/aria-cryptocb.h>
  122. #endif
  123. #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
  124. defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
  125. #ifndef NO_STDIO_FILESYSTEM
  126. #ifdef FUSION_RTOS
  127. #include <fclstdio.h>
  128. #else
  129. #include <stdio.h>
  130. #endif
  131. #endif
  132. #endif
  133. #ifdef __sun
  134. #include <sys/filio.h>
  135. #endif
  136. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  137. #ifdef _MSC_VER
  138. /* disable for while(0) cases at the .c level for now */
  139. #pragma warning(disable:4127)
  140. #endif
  141. #if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
  142. #error \
  143. WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
  144. #endif
  145. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
  146. #error Cannot use both secure-renegotiation and renegotiation-indication
  147. #endif
  148. #ifndef WOLFSSL_NO_TLS12
  149. #ifndef NO_WOLFSSL_CLIENT
  150. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  151. word32* inOutIdx, word32 size);
  152. #ifndef NO_CERTS
  153. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input,
  154. word32* inOutIdx, word32 size);
  155. #endif
  156. #ifdef HAVE_SESSION_TICKET
  157. static int DoSessionTicket(WOLFSSL* ssl, const byte* input,
  158. word32* inOutIdx, word32 size);
  159. #endif
  160. #endif
  161. #ifndef NO_WOLFSSL_SERVER
  162. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input,
  163. word32* inOutIdx, word32 size);
  164. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  165. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  166. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  167. word32* inOutIdx, word32 size);
  168. #endif
  169. #endif /* !NO_WOLFSSL_SERVER */
  170. #endif /* !WOLFSSL_NO_TLS12 */
  171. #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SESSION_TICKET)
  172. #if defined(WOLFSSL_HAPROXY)
  173. #define SSL_TICKET_CTX(ssl) ssl->initial_ctx->ticketEncCtx
  174. #else
  175. #define SSL_TICKET_CTX(ssl) ssl->ctx->ticketEncCtx
  176. #endif
  177. #if !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  178. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx,
  179. TicketEncCbCtx* keyCtx);
  180. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx);
  181. static int DefTicketEncCb(WOLFSSL* ssl,
  182. byte key_name[WOLFSSL_TICKET_NAME_SZ],
  183. byte iv[WOLFSSL_TICKET_IV_SZ],
  184. byte mac[WOLFSSL_TICKET_MAC_SZ],
  185. int enc, byte* ticket, int inLen, int* outLen,
  186. void* userCtx);
  187. #endif
  188. #endif
  189. #ifdef WOLFSSL_DTLS
  190. static int _DtlsCheckWindow(WOLFSSL* ssl);
  191. static int _DtlsUpdateWindow(WOLFSSL* ssl);
  192. #endif
  193. #ifdef WOLFSSL_DTLS13
  194. #ifndef WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT
  195. #define WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT 0
  196. #endif
  197. #endif /* WOLFSSL_DTLS13 */
  198. enum processReply {
  199. doProcessInit = 0,
  200. #ifndef NO_WOLFSSL_SERVER
  201. runProcessOldClientHello,
  202. #endif
  203. getRecordLayerHeader,
  204. getData,
  205. verifyEncryptedMessage,
  206. decryptMessage,
  207. verifyMessage,
  208. runProcessingOneRecord,
  209. runProcessingOneMessage
  210. };
  211. #ifndef WOLFSSL_NO_TLS12
  212. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  213. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  214. static const byte tls13Downgrade[7] = {
  215. 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
  216. };
  217. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  218. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  219. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  220. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  221. int padLen, int content, int verify, int epochOrder);
  222. #endif
  223. #endif /* !WOLFSSL_NO_TLS12 */
  224. #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  225. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  226. #endif
  227. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  228. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  229. int* secretSz, void* ctx);
  230. #ifdef WOLFSSL_TLS13
  231. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  232. const unsigned char* secret, int secretSz, void* ctx);
  233. #endif
  234. /* Label string for client random. */
  235. #define SSC_CR "CLIENT_RANDOM"
  236. /*
  237. * This function builds up string for key-logging then call user's
  238. * key-log-callback to pass the string for TLS1.2 and older.
  239. * The user's key-logging callback has been set via
  240. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  241. * "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  242. * parameter
  243. * - ssl: WOLFSSL object
  244. * - secret: pointer to the buffer holding master-secret
  245. * - secretSz: size of secret
  246. * - ctx: not used
  247. * returns 0 on success, negative value on failure.
  248. */
  249. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  250. int* secretSz, void* ctx)
  251. {
  252. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  253. int msSz;
  254. int hasVal;
  255. int i;
  256. const char* label = SSC_CR;
  257. int labelSz = sizeof(SSC_CR);
  258. int buffSz;
  259. byte* log = NULL;
  260. word32 outSz;
  261. int idx;
  262. int ret;
  263. (void)ctx;
  264. if (ssl == NULL || secret == NULL || *secretSz == 0)
  265. return BAD_FUNC_ARG;
  266. if (ssl->arrays == NULL)
  267. return BAD_FUNC_ARG;
  268. /* get the user-callback func from CTX*/
  269. logCb = ssl->ctx->keyLogCb;
  270. if (logCb == NULL)
  271. return 0;
  272. /* need to make sure the given master-secret has a meaningful value */
  273. msSz = *secretSz;
  274. hasVal = 0;
  275. for (i = 0; i < msSz; i++) {
  276. if (*((byte*)secret) != 0) {
  277. hasVal = 1;
  278. break;
  279. }
  280. }
  281. if (hasVal == 0)
  282. return 0; /* master-secret looks invalid */
  283. /* build up a hex-decoded keylog string
  284. "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  285. note that each keylog string does not have CR/LF.
  286. */
  287. buffSz = labelSz + (RAN_LEN * 2) + 1 + ((*secretSz) * 2) + 1;
  288. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  289. if (log == NULL)
  290. return MEMORY_E;
  291. #ifdef WOLFSSL_CHECK_MEM_ZERO
  292. wc_MemZero_Add("SessionSecret log", log, buffSz);
  293. #endif
  294. XMEMSET(log, 0, buffSz);
  295. XMEMCPY(log, label, labelSz -1); /* put label w/o terminator */
  296. log[labelSz - 1] = ' '; /* '\0' -> ' ' */
  297. idx = labelSz;
  298. outSz = buffSz - idx;
  299. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  300. log + idx, &outSz)) == 0) {
  301. idx += (outSz - 1); /* reduce terminator byte */
  302. outSz = buffSz - idx;
  303. if (outSz > 1) {
  304. log[idx++] = ' '; /* add space*/
  305. outSz = buffSz - idx;
  306. if ((ret = Base16_Encode((byte*)secret, *secretSz,
  307. log + idx, &outSz)) == 0) {
  308. /* pass the log to the client callback*/
  309. logCb(ssl, (char*)log);
  310. ret = 0;
  311. }
  312. }
  313. else
  314. ret = MEMORY_E;
  315. }
  316. /* Zero out Base16 encoded secret and other data. */
  317. ForceZero(log, buffSz);
  318. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  319. return ret;
  320. }
  321. #if defined(WOLFSSL_TLS13)
  322. /* Label string for client early traffic secret. */
  323. #define SSC_TLS13_CETS "CLIENT_EARLY_TRAFFIC_SECRET"
  324. /* Label string for client handshake traffic secret. */
  325. #define SSC_TLS13_CHTS "CLIENT_HANDSHAKE_TRAFFIC_SECRET"
  326. /* Label string for server handshake traffic secret. */
  327. #define SSC_TLS13_SHTS "SERVER_HANDSHAKE_TRAFFIC_SECRET"
  328. /* Label string for client traffic secret. */
  329. #define SSC_TLS13_CTS "CLIENT_TRAFFIC_SECRET_0"
  330. /* Label string for server traffic secret. */
  331. #define SSC_TLS13_STS "SERVER_TRAFFIC_SECRET_0"
  332. /* Label string for early exporter secret. */
  333. #define SSC_TLS13_EES "EARLY_EXPORTER_SECRET"
  334. /* Label string for exporter secret. */
  335. #define SSC_TLS13_ES "EXPORTER_SECRET"
  336. /*
  337. * This function builds up string for key-logging then call user's
  338. * key-log-callback to pass the string for TLS1.3.
  339. * The user's key-logging callback has been set via
  340. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  341. * "<Label> <hex-encoded client random> <hex-encoded secret>"
  342. *
  343. * parameter
  344. * - ssl: WOLFSSL object
  345. * - id: type of secret for logging
  346. * - secret: pointer to the buffer holding secret
  347. * - secretSz: size of secret
  348. * - ctx: not used
  349. * returns 0 on success, negative value on failure.
  350. */
  351. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  352. const unsigned char* secret, int secretSz, void* ctx)
  353. {
  354. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  355. const char* label;
  356. int labelSz = 0;
  357. int buffSz = 0;
  358. byte* log = NULL;
  359. word32 outSz;
  360. int idx;
  361. int ret;
  362. (void)ctx;
  363. if (ssl == NULL || secret == NULL || secretSz == 0)
  364. return BAD_FUNC_ARG;
  365. if (ssl->arrays == NULL)
  366. return BAD_FUNC_ARG;
  367. /* get the user-callback func from CTX*/
  368. logCb = ssl->ctx->keyLogCb;
  369. if (logCb == NULL)
  370. return 0;
  371. switch (id) {
  372. case CLIENT_EARLY_TRAFFIC_SECRET:
  373. labelSz = sizeof(SSC_TLS13_CETS);
  374. label = SSC_TLS13_CETS;
  375. break;
  376. case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
  377. labelSz = sizeof(SSC_TLS13_CHTS);
  378. label = SSC_TLS13_CHTS;
  379. break;
  380. case SERVER_HANDSHAKE_TRAFFIC_SECRET:
  381. labelSz = sizeof(SSC_TLS13_SHTS);
  382. label = SSC_TLS13_SHTS;
  383. break;
  384. case CLIENT_TRAFFIC_SECRET:
  385. labelSz = sizeof(SSC_TLS13_CTS);
  386. label = SSC_TLS13_CTS;
  387. break;
  388. case SERVER_TRAFFIC_SECRET:
  389. labelSz = sizeof(SSC_TLS13_STS);
  390. label = SSC_TLS13_STS;
  391. break;
  392. case EARLY_EXPORTER_SECRET:
  393. labelSz = sizeof(SSC_TLS13_EES);
  394. label = SSC_TLS13_EES;
  395. break;
  396. case EXPORTER_SECRET:
  397. labelSz = sizeof(SSC_TLS13_ES);
  398. label = SSC_TLS13_ES;
  399. break;
  400. default:
  401. return BAD_FUNC_ARG;
  402. }
  403. /* prepare a log string for passing user callback
  404. * "<Label> <hex-encoded client random> <hex-encoded secret>" */
  405. buffSz = labelSz + (RAN_LEN * 2) + 1 + secretSz * 2 + 1;
  406. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  407. if (log == NULL)
  408. return MEMORY_E;
  409. #ifdef WOLFSSL_CHECK_MEM_ZERO
  410. wc_MemZero_Add("SessionSecret log", log, buffSz);
  411. #endif
  412. XMEMSET(log, 0, buffSz);
  413. XMEMCPY(log, label, labelSz - 1); /* put label w/o terminator */
  414. log[labelSz - 1] = ' '; /* '\0' -> ' ' */
  415. idx = labelSz;
  416. outSz = buffSz - idx;
  417. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  418. log + idx, &outSz)) == 0) {
  419. idx += (outSz - 1); /* reduce terminator byte */
  420. outSz = buffSz - idx;
  421. if (outSz >1) {
  422. log[idx++] = ' '; /* add space*/
  423. outSz = buffSz - idx;
  424. if ((ret = Base16_Encode((byte*)secret, secretSz,
  425. log + idx, &outSz)) == 0) {
  426. logCb(ssl, (char*)log);
  427. ret = 0;
  428. }
  429. }
  430. else
  431. ret = MEMORY_E;
  432. }
  433. /* Zero out Base16 encoded secret and other data. */
  434. ForceZero(log, buffSz);
  435. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  436. return ret;
  437. }
  438. #endif /* WOLFSSL_TLS13*/
  439. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK*/
  440. int IsTLS(const WOLFSSL* ssl)
  441. {
  442. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  443. return 1;
  444. return 0;
  445. }
  446. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  447. {
  448. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  449. return 1;
  450. #ifdef WOLFSSL_DTLS
  451. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  452. return 1;
  453. #endif
  454. return 0;
  455. }
  456. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  457. {
  458. int ret;
  459. ret = (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  460. #ifdef WOLFSSL_DTLS13
  461. if (ret == 0 && pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_3_MINOR)
  462. return 1;
  463. #endif
  464. return ret;
  465. }
  466. int IsEncryptionOn(WOLFSSL* ssl, int isSend)
  467. {
  468. #ifdef WOLFSSL_DTLS
  469. /* For DTLS, epoch 0 is always not encrypted. */
  470. if (ssl->options.dtls && !isSend) {
  471. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->keys.curEpoch == 0)
  472. return 0;
  473. #ifdef WOLFSSL_DTLS13
  474. else if (IsAtLeastTLSv1_3(ssl->version)
  475. && w64IsZero(ssl->keys.curEpoch64))
  476. return 0;
  477. #endif /* WOLFSSL_DTLS13 */
  478. }
  479. #endif /* WOLFSSL_DTLS */
  480. #ifdef WOLFSSL_QUIC
  481. if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version)) {
  482. return 0;
  483. }
  484. #endif
  485. return ssl->keys.encryptionOn &&
  486. (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
  487. }
  488. #ifdef WOLFSSL_DTLS
  489. /* Stream Control Transmission Protocol */
  490. /* If SCTP is not enabled returns the state of the dtls option.
  491. * If SCTP is enabled returns dtls && !sctp. */
  492. int IsDtlsNotSctpMode(WOLFSSL* ssl)
  493. {
  494. #ifdef WOLFSSL_SCTP
  495. return ssl->options.dtls && !ssl->options.dtlsSctp;
  496. #else
  497. return ssl->options.dtls;
  498. #endif
  499. }
  500. #if !defined(WOLFSSL_NO_TLS12) && !defined(NO_WOLFSSL_SERVER)
  501. /* Secure Real-time Transport Protocol */
  502. /* If SRTP is not enabled returns the state of the dtls option.
  503. * If SRTP is enabled returns dtls && !dtlsSrtpProfiles. */
  504. int IsDtlsNotSrtpMode(WOLFSSL* ssl)
  505. {
  506. #ifdef WOLFSSL_SRTP
  507. return ssl->options.dtls && !ssl->dtlsSrtpProfiles;
  508. #else
  509. return ssl->options.dtls;
  510. #endif
  511. }
  512. #endif /* !WOLFSSL_NO_TLS12 && !NO_WOLFSSL_SERVER */
  513. #endif /* WOLFSSL_DTLS */
  514. #ifdef HAVE_LIBZ
  515. /* alloc user allocs to work with zlib */
  516. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  517. {
  518. (void)opaque;
  519. return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  520. }
  521. static void myFree(void* opaque, void* memory)
  522. {
  523. (void)opaque;
  524. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  525. }
  526. /* init zlib comp/decomp streams, 0 on success */
  527. static int InitStreams(WOLFSSL* ssl)
  528. {
  529. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  530. ssl->c_stream.zfree = (free_func)myFree;
  531. ssl->c_stream.opaque = (voidpf)ssl->heap;
  532. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  533. return ZLIB_INIT_ERROR;
  534. ssl->didStreamInit = 1;
  535. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  536. ssl->d_stream.zfree = (free_func)myFree;
  537. ssl->d_stream.opaque = (voidpf)ssl->heap;
  538. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  539. return 0;
  540. }
  541. static void FreeStreams(WOLFSSL* ssl)
  542. {
  543. if (ssl->didStreamInit) {
  544. deflateEnd(&ssl->c_stream);
  545. inflateEnd(&ssl->d_stream);
  546. }
  547. }
  548. /* compress in to out, return out size or error */
  549. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  550. {
  551. int err;
  552. int currTotal = (int)ssl->c_stream.total_out;
  553. ssl->c_stream.next_in = in;
  554. ssl->c_stream.avail_in = inSz;
  555. ssl->c_stream.next_out = out;
  556. ssl->c_stream.avail_out = outSz;
  557. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  558. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  559. return (int)ssl->c_stream.total_out - currTotal;
  560. }
  561. /* decompress in to out, return out size or error */
  562. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  563. {
  564. int err;
  565. int currTotal = (int)ssl->d_stream.total_out;
  566. ssl->d_stream.next_in = in;
  567. ssl->d_stream.avail_in = inSz;
  568. ssl->d_stream.next_out = out;
  569. ssl->d_stream.avail_out = outSz;
  570. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  571. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  572. return (int)ssl->d_stream.total_out - currTotal;
  573. }
  574. #endif /* HAVE_LIBZ */
  575. #ifdef WOLFSSL_SESSION_EXPORT
  576. /**
  577. * serializes the cipher specs struct for exporting
  578. * @return the amount written to 'exp' buffer
  579. */
  580. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  581. int type)
  582. {
  583. word32 idx = 0;
  584. CipherSpecs* specs;
  585. WOLFSSL_ENTER("ExportCipherSpecState");
  586. if (exp == NULL || ssl == NULL) {
  587. return BAD_FUNC_ARG;
  588. }
  589. specs = &ssl->specs;
  590. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  591. return BUFFER_E;
  592. }
  593. XMEMSET(exp, 0, WOLFSSL_EXPORT_SPC_SZ);
  594. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  595. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  596. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  597. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  598. exp[idx++] = specs->bulk_cipher_algorithm;
  599. exp[idx++] = specs->cipher_type;
  600. exp[idx++] = specs->mac_algorithm;
  601. exp[idx++] = specs->kea;
  602. exp[idx++] = specs->sig_algo;
  603. exp[idx++] = specs->hash_size;
  604. exp[idx++] = specs->pad_size;
  605. exp[idx++] = specs->static_ecdh;
  606. if (idx != WOLFSSL_EXPORT_SPC_SZ) {
  607. WOLFSSL_MSG("WOLFSSL_EXPORT_SPC_SZ needs updated and export version");
  608. return DTLS_EXPORT_VER_E;
  609. }
  610. /* send over state of AES too */
  611. if (type == WOLFSSL_EXPORT_TLS &&
  612. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  613. byte *pt = (byte*)ssl->encrypt.aes->reg;
  614. if ((idx + 2*AES_BLOCK_SIZE) > len) {
  615. WOLFSSL_MSG("Can not fit AES state into buffer");
  616. return BUFFER_E;
  617. }
  618. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  619. idx += AES_BLOCK_SIZE;
  620. pt = (byte*)ssl->decrypt.aes->reg;
  621. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  622. idx += AES_BLOCK_SIZE;
  623. }
  624. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  625. (void)ver;
  626. return idx;
  627. }
  628. /* serializes the key struct for exporting */
  629. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  630. byte small, int type)
  631. {
  632. word32 idx = 0;
  633. byte sz;
  634. Keys* keys;
  635. WOLFSSL_ENTER("ExportKeyState");
  636. if (exp == NULL || ssl == NULL) {
  637. return BAD_FUNC_ARG;
  638. }
  639. keys = &(ssl->keys);
  640. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  641. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  642. return BUFFER_E;
  643. }
  644. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  645. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  646. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  647. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  648. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  649. #if defined(WOLFSSL_DTLS)
  650. if (type == WOLFSSL_EXPORT_DTLS) {
  651. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  652. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  653. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  654. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  655. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  656. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  657. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  658. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  659. c16toa(keys->dtls_peer_handshake_number, exp + idx);
  660. idx += OPAQUE16_LEN;
  661. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  662. idx += OPAQUE16_LEN;
  663. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  664. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  665. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx);
  666. idx += OPAQUE16_LEN;
  667. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx);
  668. idx += OPAQUE32_LEN;
  669. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  670. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  671. }
  672. #endif
  673. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  674. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  675. exp[idx++] = keys->encryptionOn;
  676. exp[idx++] = keys->decryptedCur;
  677. /* from here on the buffer needs checked because is variable length that
  678. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  679. #ifdef WOLFSSL_DTLS
  680. if (type == WOLFSSL_EXPORT_DTLS) {
  681. word32 i;
  682. if ((OPAQUE16_LEN * 2) + idx +
  683. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  684. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  685. return BUFFER_E;
  686. }
  687. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  688. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  689. c32toa(keys->peerSeq[0].window[i], exp + idx);
  690. idx += OPAQUE32_LEN;
  691. }
  692. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  693. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  694. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  695. idx += OPAQUE32_LEN;
  696. }
  697. }
  698. #endif
  699. if (idx >= len) {
  700. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  701. return BUFFER_E;
  702. }
  703. #ifdef HAVE_TRUNCATED_HMAC
  704. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  705. exp[idx++] = ssl->truncated_hmac;
  706. #else
  707. sz = ssl->specs.hash_size;
  708. exp[idx++] = 0; /* no truncated hmac */
  709. #endif
  710. sz = (small)? 0: sz;
  711. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  712. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  713. return BUFFER_E;
  714. }
  715. exp[idx++] = sz;
  716. if (sz > 0) {
  717. #ifndef WOLFSSL_AEAD_ONLY
  718. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  719. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  720. #else
  721. XMEMSET(exp + idx, 0, sz); idx += sz;
  722. XMEMSET(exp + idx, 0, sz); idx += sz;
  723. #endif
  724. }
  725. sz = (small)? 0: ssl->specs.key_size;
  726. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  727. WOLFSSL_MSG("Buffer not large enough for write key");
  728. return BUFFER_E;
  729. }
  730. exp[idx++] = sz;
  731. if (sz > 0) {
  732. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  733. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  734. }
  735. sz = (small)? 0: ssl->specs.iv_size;
  736. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  737. WOLFSSL_MSG("Buffer not large enough for IVs");
  738. return BUFFER_E;
  739. }
  740. exp[idx++] = sz;
  741. if (sz > 0) {
  742. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  743. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  744. }
  745. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  746. idx += AEAD_MAX_EXP_SZ;
  747. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  748. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  749. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  750. return BUFFER_E;
  751. }
  752. exp[idx++] = sz;
  753. if (sz > 0) {
  754. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  755. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  756. }
  757. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  758. if (idx > DTLS_EXPORT_KEY_SZ) {
  759. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  760. return DTLS_EXPORT_VER_E;
  761. }
  762. WOLFSSL_LEAVE("ExportKeyState", idx);
  763. (void)ver;
  764. (void)type;
  765. return idx;
  766. }
  767. /**
  768. * Imports the buffer 'exp' into the 'ssl' CipherSpec structure.
  769. * @param ssl WOLFSSL structure to import into
  770. * @param exp input buffer to read from
  771. * @param len length of exp buffer
  772. * @param ver version of import buffer found
  773. * @param type flag for importing a TLS session or DTLS
  774. *
  775. * @return size of exp buffer consumed on success and negative value on fail
  776. */
  777. static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len,
  778. byte ver, int type)
  779. {
  780. word32 idx = 0;
  781. CipherSpecs* specs;
  782. word32 tmp_seq_peer_lo;
  783. word32 tmp_seq_peer_hi;
  784. word32 tmp_seq_lo;
  785. word32 tmp_seq_hi;
  786. int ret;
  787. WOLFSSL_ENTER("ImportCipherSpecState");
  788. if (exp == NULL || ssl == NULL) {
  789. return BAD_FUNC_ARG;
  790. }
  791. specs= &(ssl->specs);
  792. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  793. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  794. return BUFFER_E;
  795. }
  796. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  797. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  798. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  799. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  800. specs->bulk_cipher_algorithm = exp[idx++];
  801. specs->cipher_type = exp[idx++];
  802. specs->mac_algorithm = exp[idx++];
  803. specs->kea = exp[idx++];
  804. specs->sig_algo = exp[idx++];
  805. specs->hash_size = exp[idx++];
  806. specs->pad_size = exp[idx++];
  807. specs->static_ecdh = exp[idx++];
  808. if (specs->pad_size != PAD_MD5 && specs->pad_size != PAD_SHA) {
  809. WOLFSSL_MSG("Importing bad or unknown pad size");
  810. return BAD_STATE_E;
  811. }
  812. /* temporarily save the sequence numbers */
  813. tmp_seq_peer_lo = ssl->keys.peer_sequence_number_lo;
  814. tmp_seq_peer_hi = ssl->keys.peer_sequence_number_hi;
  815. tmp_seq_lo = ssl->keys.sequence_number_lo;
  816. tmp_seq_hi = ssl->keys.sequence_number_hi;
  817. if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) < 0) {
  818. return ret;
  819. }
  820. /* reset sequence numbers after setting keys */
  821. ssl->keys.peer_sequence_number_lo = tmp_seq_peer_lo;
  822. ssl->keys.peer_sequence_number_hi = tmp_seq_peer_hi;
  823. ssl->keys.sequence_number_lo = tmp_seq_lo;
  824. ssl->keys.sequence_number_hi = tmp_seq_hi;
  825. if (type == WOLFSSL_EXPORT_TLS &&
  826. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  827. byte *pt = (byte*)ssl->encrypt.aes->reg;
  828. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  829. idx += AES_BLOCK_SIZE;
  830. pt = (byte*)ssl->decrypt.aes->reg;
  831. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  832. idx += AES_BLOCK_SIZE;
  833. }
  834. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  835. (void)ver;
  836. return idx;
  837. }
  838. /**
  839. * Import the Key structure
  840. *
  841. * @param ssl WOLFSSL structure to import into
  842. * @param exp buffer to read Key values from
  843. * @param len max length of buffer 'exp'
  844. * @param ver version of import buffer found
  845. * @param type flag for TLS vs DTLS
  846. *
  847. * @return amount of data read from exp on success or negative on fail
  848. */
  849. static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  850. int type)
  851. {
  852. word32 idx = 0;
  853. byte sz;
  854. Keys *keys;
  855. WOLFSSL_ENTER("ImportKeyState");
  856. if (exp == NULL || ssl == NULL) {
  857. return BAD_FUNC_ARG;
  858. }
  859. keys = &(ssl->keys);
  860. /* check minimum length -- includes byte used for size indicators */
  861. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  862. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  863. return BUFFER_E;
  864. }
  865. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  866. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  867. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  868. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  869. #if defined(WOLFSSL_DTLS)
  870. if (type == WOLFSSL_EXPORT_DTLS) {
  871. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  872. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  873. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  874. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  875. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  876. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  877. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  878. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  879. ato16(exp + idx, &keys->dtls_peer_handshake_number);
  880. idx += OPAQUE16_LEN;
  881. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  882. idx += OPAQUE16_LEN;
  883. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  884. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  885. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi);
  886. idx += OPAQUE16_LEN;
  887. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo);
  888. idx += OPAQUE32_LEN;
  889. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  890. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  891. }
  892. #endif
  893. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  894. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  895. keys->encryptionOn = exp[idx++];
  896. keys->decryptedCur = exp[idx++];
  897. #if defined(WOLFSSL_DTLS)
  898. if (type == WOLFSSL_EXPORT_DTLS) {
  899. word16 i, wordCount, wordAdj = 0;
  900. /* do window */
  901. ato16(exp + idx, &wordCount);
  902. idx += OPAQUE16_LEN;
  903. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  904. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  905. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  906. }
  907. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  908. for (i = 0; i < wordCount; i++) {
  909. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  910. idx += OPAQUE32_LEN;
  911. }
  912. idx += wordAdj;
  913. /* do prevWindow */
  914. ato16(exp + idx, &wordCount);
  915. idx += OPAQUE16_LEN;
  916. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  917. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  918. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  919. }
  920. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  921. for (i = 0; i < wordCount; i++) {
  922. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  923. idx += OPAQUE32_LEN;
  924. }
  925. idx += wordAdj;
  926. }
  927. #endif
  928. #ifdef HAVE_TRUNCATED_HMAC
  929. ssl->truncated_hmac = exp[idx++];
  930. #else
  931. idx++; /* no truncated hmac */
  932. #endif
  933. sz = exp[idx++];
  934. #ifndef WOLFSSL_AEAD_ONLY
  935. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  936. WOLFSSL_MSG("Buffer not large enough for MAC import");
  937. return BUFFER_E;
  938. }
  939. if (sz > 0) {
  940. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  941. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  942. }
  943. #else
  944. if (sz + idx > len) {
  945. return BUFFER_E;
  946. }
  947. idx += sz; idx += sz;
  948. #endif
  949. sz = exp[idx++];
  950. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  951. WOLFSSL_MSG("Buffer not large enough for key import");
  952. return BUFFER_E;
  953. }
  954. if (sz > 0) {
  955. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  956. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  957. }
  958. sz = exp[idx++];
  959. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  960. WOLFSSL_MSG("Buffer not large enough for write IV import");
  961. return BUFFER_E;
  962. }
  963. if (sz > 0) {
  964. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  965. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  966. }
  967. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  968. idx += AEAD_MAX_EXP_SZ;
  969. sz = exp[idx++];
  970. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  971. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  972. return BUFFER_E;
  973. }
  974. if (sz > 0) {
  975. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  976. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  977. }
  978. WOLFSSL_LEAVE("ImportKeyState", idx);
  979. (void)ver;
  980. (void)type;
  981. return idx;
  982. }
  983. /* copy over necessary information from Options struct to buffer
  984. * On success returns size of buffer used on failure returns a negative value */
  985. static int ExportOptions(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  986. int type)
  987. {
  988. int idx = 0;
  989. word16 zero = 0;
  990. Options *options;
  991. WOLFSSL_ENTER("ExportOptions");
  992. if (ssl == NULL || exp == NULL || len < DTLS_EXPORT_OPT_SZ) {
  993. return BAD_FUNC_ARG;
  994. }
  995. options = &ssl->options;
  996. if (options == NULL) {
  997. return BAD_FUNC_ARG;
  998. }
  999. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  1000. /* these options are kept and sent to indicate verify status and strength
  1001. * of handshake */
  1002. exp[idx++] = options->sendVerify;
  1003. exp[idx++] = options->verifyPeer;
  1004. exp[idx++] = options->verifyNone;
  1005. exp[idx++] = options->downgrade;
  1006. #ifndef NO_DH
  1007. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  1008. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  1009. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  1010. #else
  1011. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1012. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1013. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1014. #endif
  1015. #ifndef NO_RSA
  1016. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  1017. #else
  1018. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1019. #endif
  1020. #ifdef HAVE_ECC
  1021. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  1022. #else
  1023. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1024. #endif
  1025. /* these options are kept to indicate state and behavior */
  1026. #ifndef NO_PSK
  1027. exp[idx++] = options->havePSK;
  1028. #else
  1029. exp[idx++] = 0;
  1030. #endif
  1031. exp[idx++] = options->sessionCacheOff;
  1032. exp[idx++] = options->sessionCacheFlushOff;
  1033. exp[idx++] = options->side;
  1034. exp[idx++] = options->resuming;
  1035. exp[idx++] = options->haveSessionId;
  1036. exp[idx++] = options->tls;
  1037. exp[idx++] = options->tls1_1;
  1038. exp[idx++] = options->dtls;
  1039. exp[idx++] = options->connReset;
  1040. exp[idx++] = options->isClosed;
  1041. exp[idx++] = options->closeNotify;
  1042. exp[idx++] = options->sentNotify;
  1043. exp[idx++] = options->usingCompression;
  1044. exp[idx++] = options->haveRSA;
  1045. exp[idx++] = options->haveECC;
  1046. exp[idx++] = options->haveDH;
  1047. exp[idx++] = 0; /* Historical: haveNTRU */
  1048. exp[idx++] = 0; /* Historical: haveQSH */
  1049. exp[idx++] = options->haveECDSAsig;
  1050. exp[idx++] = options->haveStaticECC;
  1051. exp[idx++] = options->havePeerVerify;
  1052. exp[idx++] = options->usingPSK_cipher;
  1053. exp[idx++] = options->usingAnon_cipher;
  1054. exp[idx++] = 0; /* Historical: options->sendAlertState */
  1055. exp[idx++] = options->partialWrite;
  1056. exp[idx++] = options->quietShutdown;
  1057. exp[idx++] = options->groupMessages;
  1058. #ifdef HAVE_POLY1305
  1059. exp[idx++] = options->oldPoly;
  1060. #else
  1061. exp[idx++] = 0;
  1062. #endif
  1063. #ifdef HAVE_ANON
  1064. exp[idx++] = options->haveAnon;
  1065. #else
  1066. exp[idx++] = 0;
  1067. #endif
  1068. #ifdef HAVE_SESSION_TICKET
  1069. exp[idx++] = options->createTicket;
  1070. exp[idx++] = options->useTicket;
  1071. exp[idx++] = options->noTicketTls12;
  1072. #ifdef WOLFSSL_TLS13
  1073. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1074. exp[idx++] = options->noTicketTls13;
  1075. }
  1076. #else
  1077. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1078. exp[idx++] = 0;
  1079. }
  1080. #endif
  1081. #else
  1082. exp[idx++] = 0;
  1083. exp[idx++] = 0;
  1084. exp[idx++] = 0;
  1085. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1086. exp[idx++] = 0;
  1087. }
  1088. #endif
  1089. exp[idx++] = options->processReply;
  1090. exp[idx++] = options->cipherSuite0;
  1091. exp[idx++] = options->cipherSuite;
  1092. exp[idx++] = options->serverState;
  1093. exp[idx++] = options->clientState;
  1094. exp[idx++] = options->handShakeState;
  1095. exp[idx++] = options->handShakeDone;
  1096. exp[idx++] = options->minDowngrade;
  1097. exp[idx++] = options->connectState;
  1098. exp[idx++] = options->acceptState;
  1099. exp[idx++] = options->asyncState;
  1100. if (type == WOLFSSL_EXPORT_TLS) {
  1101. #ifdef HAVE_ENCRYPT_THEN_MAC
  1102. exp[idx++] = options->disallowEncThenMac;
  1103. exp[idx++] = options->encThenMac;
  1104. exp[idx++] = options->startedETMRead;
  1105. exp[idx++] = options->startedETMWrite;
  1106. #else
  1107. exp[idx++] = 0;
  1108. exp[idx++] = 0;
  1109. exp[idx++] = 0;
  1110. exp[idx++] = 0;
  1111. #endif
  1112. }
  1113. /* version of connection */
  1114. exp[idx++] = ssl->version.major;
  1115. exp[idx++] = ssl->version.minor;
  1116. (void)zero;
  1117. /* check if changes were made and notify of need to update export version */
  1118. switch (ver) {
  1119. case WOLFSSL_EXPORT_VERSION_3:
  1120. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  1121. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1122. return DTLS_EXPORT_VER_E;
  1123. }
  1124. break;
  1125. case WOLFSSL_EXPORT_VERSION:
  1126. if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) {
  1127. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1128. return DTLS_EXPORT_VER_E;
  1129. }
  1130. break;
  1131. default:
  1132. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  1133. return DTLS_EXPORT_VER_E;
  1134. }
  1135. WOLFSSL_LEAVE("ExportOptions", idx);
  1136. (void)type;
  1137. return idx;
  1138. }
  1139. /* copy items from Export struct to Options struct
  1140. * On success returns size of buffer used on failure returns a negative value */
  1141. static int ImportOptions(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  1142. int type)
  1143. {
  1144. int idx = 0;
  1145. Options* options = &ssl->options;
  1146. switch (ver) {
  1147. case WOLFSSL_EXPORT_VERSION:
  1148. if (len < DTLS_EXPORT_OPT_SZ) {
  1149. WOLFSSL_MSG("Sanity check on buffer size failed");
  1150. return BAD_FUNC_ARG;
  1151. }
  1152. break;
  1153. case WOLFSSL_EXPORT_VERSION_3:
  1154. if (len < DTLS_EXPORT_OPT_SZ_3) {
  1155. WOLFSSL_MSG("Sanity check on buffer size failed");
  1156. return BAD_FUNC_ARG;
  1157. }
  1158. break;
  1159. default:
  1160. WOLFSSL_MSG("Export version not supported");
  1161. return BAD_FUNC_ARG;
  1162. }
  1163. if (exp == NULL || options == NULL) {
  1164. return BAD_FUNC_ARG;
  1165. }
  1166. /* these options are kept and sent to indicate verify status and strength
  1167. * of handshake */
  1168. options->sendVerify = exp[idx++];
  1169. options->verifyPeer = exp[idx++];
  1170. options->verifyNone = exp[idx++];
  1171. options->downgrade = exp[idx++];
  1172. #ifndef NO_DH
  1173. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  1174. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  1175. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  1176. #else
  1177. idx += OPAQUE16_LEN;
  1178. idx += OPAQUE16_LEN;
  1179. idx += OPAQUE16_LEN;
  1180. #endif
  1181. #ifndef NO_RSA
  1182. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  1183. #else
  1184. idx += OPAQUE16_LEN;
  1185. #endif
  1186. #ifdef HAVE_ECC
  1187. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  1188. #else
  1189. idx += OPAQUE16_LEN;
  1190. #endif
  1191. /* these options are kept to indicate state and behavior */
  1192. #ifndef NO_PSK
  1193. options->havePSK = exp[idx++];
  1194. #else
  1195. idx++;
  1196. #endif
  1197. options->sessionCacheOff = exp[idx++];
  1198. options->sessionCacheFlushOff = exp[idx++];
  1199. options->side = exp[idx++];
  1200. options->resuming = exp[idx++];
  1201. options->haveSessionId = exp[idx++];
  1202. options->tls = exp[idx++];
  1203. options->tls1_1 = exp[idx++];
  1204. options->dtls = exp[idx++];
  1205. options->connReset = exp[idx++];
  1206. options->isClosed = exp[idx++];
  1207. options->closeNotify = exp[idx++];
  1208. options->sentNotify = exp[idx++];
  1209. options->usingCompression = exp[idx++];
  1210. options->haveRSA = exp[idx++];
  1211. options->haveECC = exp[idx++];
  1212. options->haveDH = exp[idx++];
  1213. idx++; /* Historical: haveNTRU */
  1214. idx++; /* Historical: haveQSH */
  1215. options->haveECDSAsig = exp[idx++];
  1216. options->haveStaticECC = exp[idx++];
  1217. options->havePeerVerify = exp[idx++];
  1218. options->usingPSK_cipher = exp[idx++];
  1219. options->usingAnon_cipher = exp[idx++];
  1220. idx++; /* Historical: options->sendAlertState */
  1221. options->partialWrite = exp[idx++];
  1222. options->quietShutdown = exp[idx++];
  1223. options->groupMessages = exp[idx++];
  1224. #ifdef HAVE_POLY1305
  1225. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  1226. #else
  1227. idx++;
  1228. #endif
  1229. #ifdef HAVE_ANON
  1230. options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */
  1231. #else
  1232. idx++;
  1233. #endif
  1234. #ifdef HAVE_SESSION_TICKET
  1235. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  1236. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  1237. options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
  1238. #ifdef WOLFSSL_TLS13
  1239. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1240. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  1241. }
  1242. #else
  1243. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1244. idx++;
  1245. }
  1246. #endif
  1247. #else
  1248. idx++;
  1249. idx++;
  1250. idx++;
  1251. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1252. idx++;
  1253. }
  1254. #endif
  1255. options->processReply = exp[idx++];
  1256. options->cipherSuite0 = exp[idx++];
  1257. options->cipherSuite = exp[idx++];
  1258. options->serverState = exp[idx++];
  1259. options->clientState = exp[idx++];
  1260. options->handShakeState = exp[idx++];
  1261. options->handShakeDone = exp[idx++];
  1262. options->minDowngrade = exp[idx++];
  1263. options->connectState = exp[idx++];
  1264. options->acceptState = exp[idx++];
  1265. options->asyncState = exp[idx++];
  1266. if (type == WOLFSSL_EXPORT_TLS) {
  1267. #ifdef HAVE_ENCRYPT_THEN_MAC
  1268. options->disallowEncThenMac = exp[idx++];
  1269. options->encThenMac = exp[idx++];
  1270. options->startedETMRead = exp[idx++];
  1271. options->startedETMWrite = exp[idx++];
  1272. #else
  1273. idx++;
  1274. idx++;
  1275. idx++;
  1276. idx++;
  1277. #endif
  1278. }
  1279. /* version of connection */
  1280. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  1281. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  1282. return VERSION_ERROR;
  1283. }
  1284. /* set TLS 1.3 flag in options if this was a TLS 1.3 connection */
  1285. if (ssl->version.major == SSLv3_MAJOR &&
  1286. ssl->version.minor == TLSv1_3_MINOR) {
  1287. options->tls1_3 = 1;
  1288. }
  1289. return idx;
  1290. }
  1291. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  1292. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  1293. {
  1294. int idx = 0;
  1295. int ipSz = MAX_EXPORT_IP; /* start as max size */
  1296. int fam = 0;
  1297. word16 port = 0;
  1298. char ip[MAX_EXPORT_IP];
  1299. if (ver != WOLFSSL_EXPORT_VERSION) {
  1300. WOLFSSL_MSG("Export version not supported");
  1301. return BAD_FUNC_ARG;
  1302. }
  1303. if (ssl == NULL || exp == NULL ||
  1304. len < (sizeof(ip) + 3 * WOLFSSL_EXPORT_LEN)) {
  1305. return BAD_FUNC_ARG;
  1306. }
  1307. if (ssl->ctx->CBGetPeer == NULL) {
  1308. WOLFSSL_MSG("No get peer call back set");
  1309. return BAD_FUNC_ARG;
  1310. }
  1311. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  1312. WOLFSSL_MSG("Get peer callback error");
  1313. return SOCKET_ERROR_E;
  1314. }
  1315. /* check that ipSz/fam is not negative or too large since user can set cb */
  1316. if (ipSz < 0 || ipSz > MAX_EXPORT_IP || fam < 0) {
  1317. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  1318. return SOCKET_ERROR_E;
  1319. }
  1320. c16toa((word16)fam, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1321. c16toa((word16)ipSz, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1322. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  1323. c16toa(port, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1324. return idx;
  1325. }
  1326. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  1327. static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
  1328. {
  1329. word16 idx = 0;
  1330. word16 ipSz;
  1331. word16 fam;
  1332. word16 port;
  1333. char ip[MAX_EXPORT_IP];
  1334. if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_3) {
  1335. WOLFSSL_MSG("Export version not supported");
  1336. return BAD_FUNC_ARG;
  1337. }
  1338. if (len == 0) {
  1339. WOLFSSL_MSG("No peer info sent");
  1340. return 0;
  1341. }
  1342. if (ssl == NULL || buf == NULL || len < 3 * WOLFSSL_EXPORT_LEN) {
  1343. return BAD_FUNC_ARG;
  1344. }
  1345. /* import sin family */
  1346. ato16(buf + idx, &fam); idx += WOLFSSL_EXPORT_LEN;
  1347. /* import ip address idx, and ipSz are unsigned but cast for enum */
  1348. ato16(buf + idx, &ipSz); idx += WOLFSSL_EXPORT_LEN;
  1349. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + WOLFSSL_EXPORT_LEN) > len) {
  1350. return BUFFER_E;
  1351. }
  1352. XMEMSET(ip, 0, sizeof(ip));
  1353. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  1354. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  1355. ato16(buf + idx, &port); idx += WOLFSSL_EXPORT_LEN;
  1356. /* sanity check for a function to call, then use it to import peer info */
  1357. if (ssl->ctx->CBSetPeer == NULL) {
  1358. WOLFSSL_MSG("No set peer function");
  1359. return BAD_FUNC_ARG;
  1360. }
  1361. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  1362. WOLFSSL_MSG("Error setting peer info");
  1363. return SOCKET_ERROR_E;
  1364. }
  1365. return idx;
  1366. }
  1367. #ifdef WOLFSSL_DTLS
  1368. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1369. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1370. * passed in.
  1371. * On success returns the size of serialized session state.*/
  1372. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1373. {
  1374. int ret;
  1375. word32 idx = 0;
  1376. word32 totalLen = 0;
  1377. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1378. if (buf == NULL || ssl == NULL) {
  1379. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1380. return BAD_FUNC_ARG;
  1381. }
  1382. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1383. /* each of the following have a 2 byte length before data */
  1384. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1385. if (totalLen > sz) {
  1386. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1387. return BUFFER_E;
  1388. }
  1389. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1390. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1391. ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1392. idx += WOLFSSL_EXPORT_LEN; /* leave room for total length */
  1393. /* export keys struct and dtls state -- variable length stored in ret */
  1394. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1395. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1396. WOLFSSL_EXPORT_VERSION, 1, WOLFSSL_EXPORT_DTLS)) < 0) {
  1397. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1398. return ret;
  1399. }
  1400. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1401. /* place total length of exported buffer minus 2 bytes protocol/version */
  1402. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1403. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1404. /* if compiled with debug options then print the version, protocol, size */
  1405. {
  1406. char debug[256];
  1407. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1408. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1409. , (int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1410. WOLFSSL_MSG(debug);
  1411. }
  1412. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1413. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1414. return idx;
  1415. }
  1416. /* On success return amount of buffer consumed */
  1417. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1418. {
  1419. word32 idx = 0;
  1420. word16 length = 0;
  1421. int version;
  1422. int ret;
  1423. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1424. /* check at least enough room for protocol and length */
  1425. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1426. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1427. return BAD_FUNC_ARG;
  1428. }
  1429. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1430. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1431. WOLFSSL_MSG("Incorrect protocol");
  1432. return BAD_FUNC_ARG;
  1433. }
  1434. version = buf[idx++] & 0x0F;
  1435. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1436. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1437. WOLFSSL_MSG("Buffer size sanity check failed");
  1438. return BUFFER_E;
  1439. }
  1440. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1441. /* if compiled with debug options then print the version, protocol, size */
  1442. {
  1443. char debug[256];
  1444. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1445. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1446. , (int)version, buf[0], (buf[1] >> 4), length);
  1447. WOLFSSL_MSG(debug);
  1448. }
  1449. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1450. /* perform sanity checks and extract Options information used */
  1451. switch (version) {
  1452. case WOLFSSL_EXPORT_VERSION:
  1453. break;
  1454. default:
  1455. WOLFSSL_MSG("Bad export state version");
  1456. return BAD_FUNC_ARG;
  1457. }
  1458. /* perform sanity checks and extract Keys struct */
  1459. if (WOLFSSL_EXPORT_LEN + idx > sz) {
  1460. WOLFSSL_MSG("Import Key struct error");
  1461. return BUFFER_E;
  1462. }
  1463. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1464. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1465. WOLFSSL_MSG("Import Key struct error");
  1466. return BUFFER_E;
  1467. }
  1468. if ((ret = ImportKeyState(ssl, buf + idx, length, version,
  1469. WOLFSSL_EXPORT_DTLS)) < 0) {
  1470. WOLFSSL_MSG("Import Key struct error");
  1471. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1472. return ret;
  1473. }
  1474. idx += ret;
  1475. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1476. return idx;
  1477. }
  1478. #endif /* WOLFSSL_DTLS */
  1479. /**
  1480. * Imports a serialized buffer (both TLS and DTLS)
  1481. *
  1482. * @param ssl WOLFSSL structure to import into
  1483. * @param buf buffer containing serialized session
  1484. * @param sz size of buffer 'buf'
  1485. * @param type flag for TLS or DTLS
  1486. *
  1487. * @return the size of serialized buffer on success
  1488. */
  1489. int wolfSSL_session_import_internal(WOLFSSL* ssl, const unsigned char* buf,
  1490. unsigned int sz, int type)
  1491. {
  1492. word32 idx = 0;
  1493. word16 length = 0;
  1494. int version = 0;
  1495. int ret = 0;
  1496. int optSz = 0;
  1497. int rc;
  1498. WOLFSSL_ENTER("wolfSSL_session_import_internal");
  1499. /* check at least enough room for protocol and length */
  1500. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1501. ret = BAD_FUNC_ARG;
  1502. }
  1503. /* Check if is TLS export protocol */
  1504. if (ret == 0) {
  1505. byte validProto = 0; /* did we find a valid protocol */
  1506. if (buf[idx] == (byte)TLS_EXPORT_PRO &&
  1507. (buf[idx + 1] & 0xF0) == ((byte)TLS_EXPORT_PRO & 0xF0)) {
  1508. validProto = 1;
  1509. }
  1510. /* Check if is DTLS export protocol */
  1511. if (buf[idx] == (byte)DTLS_EXPORT_PRO &&
  1512. (buf[idx + 1] & 0xF0) == ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1513. validProto = 1;
  1514. }
  1515. if (validProto == 0) {
  1516. #ifdef WOLFSSL_DTLS
  1517. /* check if importing state only */
  1518. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1519. #else
  1520. WOLFSSL_MSG("Invalid serialized session protocol value");
  1521. ret = BAD_FUNC_ARG;
  1522. #endif
  1523. }
  1524. idx += 1;
  1525. }
  1526. if (ret == 0) {
  1527. version = buf[idx++] & 0x0F;
  1528. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1529. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1530. ret = BUFFER_E;
  1531. }
  1532. }
  1533. /* if compiled with debug options then print the version, protocol, size */
  1534. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1535. {
  1536. char debug[256];
  1537. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1538. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1539. , (int)version, buf[0], (buf[1] >> 4), length);
  1540. WOLFSSL_MSG(debug);
  1541. }
  1542. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1543. /* perform sanity checks and extract Options information used */
  1544. if (ret == 0) {
  1545. switch (version) {
  1546. case WOLFSSL_EXPORT_VERSION:
  1547. if (type == WOLFSSL_EXPORT_DTLS) {
  1548. optSz = DTLS_EXPORT_OPT_SZ;
  1549. }
  1550. else {
  1551. optSz = TLS_EXPORT_OPT_SZ;
  1552. }
  1553. break;
  1554. case WOLFSSL_EXPORT_VERSION_3:
  1555. WOLFSSL_MSG("Importing older version 3");
  1556. optSz = DTLS_EXPORT_OPT_SZ_3;
  1557. break;
  1558. default:
  1559. WOLFSSL_MSG("Bad export version");
  1560. ret = BAD_FUNC_ARG;
  1561. }
  1562. }
  1563. if (ret == 0 && (WOLFSSL_EXPORT_LEN + optSz + idx > sz)) {
  1564. WOLFSSL_MSG("Import Options struct error");
  1565. ret = BUFFER_E;
  1566. }
  1567. if (ret == 0) {
  1568. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1569. if (length != optSz) {
  1570. WOLFSSL_MSG("Import Options struct error");
  1571. ret = BUFFER_E;
  1572. }
  1573. }
  1574. if (ret == 0) {
  1575. rc = ImportOptions(ssl, buf + idx, length, version, type);
  1576. if (rc < 0) {
  1577. WOLFSSL_MSG("Import Options struct error");
  1578. ret = rc;
  1579. }
  1580. else {
  1581. idx += length;
  1582. }
  1583. }
  1584. /* perform sanity checks and extract Keys struct */
  1585. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1586. WOLFSSL_MSG("Import Key struct error");
  1587. ret = BUFFER_E;
  1588. }
  1589. if (ret == 0) {
  1590. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1591. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1592. WOLFSSL_MSG("Import Key struct error");
  1593. ret = BUFFER_E;
  1594. }
  1595. }
  1596. if (ret == 0) {
  1597. rc = ImportKeyState(ssl, buf + idx, length, version, type);
  1598. if (rc < 0) {
  1599. WOLFSSL_MSG("Import Key struct error");
  1600. ret = rc;
  1601. }
  1602. else {
  1603. idx += rc;
  1604. }
  1605. }
  1606. /* perform sanity checks and extract CipherSpecs struct */
  1607. if (ret == 0 && (WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ + idx > sz)) {
  1608. WOLFSSL_MSG("Import CipherSpecs struct error");
  1609. ret = BUFFER_E;
  1610. }
  1611. if (ret == 0) {
  1612. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1613. if (length != WOLFSSL_EXPORT_SPC_SZ) {
  1614. WOLFSSL_MSG("Import CipherSpecs struct error");
  1615. ret = BUFFER_E;
  1616. }
  1617. }
  1618. if (ret == 0) {
  1619. rc = ImportCipherSpecState(ssl, buf + idx, length, version, type);
  1620. if (rc < 0) {
  1621. WOLFSSL_MSG("Import CipherSpecs struct error");
  1622. ret = rc;
  1623. }
  1624. else {
  1625. idx += rc;
  1626. }
  1627. }
  1628. /* perform sanity checks and extract DTLS peer info */
  1629. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1630. WOLFSSL_MSG("Import DTLS peer info error");
  1631. ret = BUFFER_E;
  1632. }
  1633. if (ret == 0) {
  1634. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1635. if (idx + length > sz) {
  1636. WOLFSSL_MSG("Import DTLS peer info error");
  1637. ret = BUFFER_E;
  1638. }
  1639. }
  1640. if (ret == 0) {
  1641. rc = ImportPeerInfo(ssl, buf + idx, length, version);
  1642. if (rc < 0) {
  1643. WOLFSSL_MSG("Import Peer Addr error");
  1644. ret = rc;
  1645. }
  1646. else {
  1647. idx += rc;
  1648. }
  1649. }
  1650. /* make sure is a valid suite used */
  1651. if (ret == 0 && wolfSSL_get_cipher(ssl) == NULL) {
  1652. WOLFSSL_MSG("Can not match cipher suite imported");
  1653. ret = MATCH_SUITE_ERROR;
  1654. }
  1655. #ifndef WOLFSSL_AEAD_ONLY
  1656. /* set hmac function to use when verifying */
  1657. if (ret == 0 && (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1658. ssl->options.dtls == 1)) {
  1659. #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  1660. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  1661. ssl->hmac = TLS_hmac;
  1662. #else
  1663. ssl->hmac = Renesas_cmn_TLS_hmac;
  1664. #endif
  1665. }
  1666. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1667. if (ret == 0 && ssl->specs.cipher_type == stream &&
  1668. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1669. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1670. ret = SANITY_CIPHER_E;
  1671. }
  1672. #endif /* !WOLFSSL_AEAD_ONLY */
  1673. if (ret != 0) {
  1674. idx = ret;
  1675. }
  1676. WOLFSSL_LEAVE("wolfSSL_session_import_internal", idx);
  1677. return idx;
  1678. }
  1679. /**
  1680. * Handles serializing the session information.
  1681. *
  1682. * @param ssl WOLFSSL structure to serialize session from
  1683. * @param buf output buffer to hold serialized session
  1684. * @param sz the size of buffer 'buf', if too small then gets updated
  1685. * @param type if the input WOLFSSL structure is expected to be TLS or DTLS
  1686. * 1 for yes is TLS and 0 for no is DTLS
  1687. *
  1688. * @return the size of serialized buffer on success and negative values on fail
  1689. */
  1690. int wolfSSL_session_export_internal(WOLFSSL* ssl, byte* buf, word32* sz,
  1691. int type)
  1692. {
  1693. int ret = 0;
  1694. word32 idx = 0;
  1695. word32 totalLen = 0;
  1696. WOLFSSL_ENTER("wolfSSL_session_export_internal");
  1697. if (ssl == NULL) {
  1698. WOLFSSL_MSG("unexpected null argument");
  1699. ret = BAD_FUNC_ARG;
  1700. }
  1701. if (ret == 0) {
  1702. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1703. /* each of the following have a 2 byte length before data */
  1704. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1705. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1706. totalLen += WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ;
  1707. #ifdef WOLFSSL_DTLS
  1708. if (type == WOLFSSL_EXPORT_DTLS) {
  1709. totalLen += WOLFSSL_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1710. }
  1711. #endif
  1712. }
  1713. /* check is at least the minimum size needed, TLS cipher states add more */
  1714. if (ret == 0 && (totalLen > *sz || buf == NULL)) {
  1715. WOLFSSL_MSG("export buffer was too small or null");
  1716. *sz = totalLen;
  1717. /* possible AES state needed */
  1718. if (type == WOLFSSL_EXPORT_TLS) {
  1719. *sz += AES_BLOCK_SIZE*2;
  1720. }
  1721. ret = LENGTH_ONLY_E;
  1722. }
  1723. if (ret == 0) {
  1724. buf[idx++] = (byte)(type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1725. DTLS_EXPORT_PRO;
  1726. buf[idx++] = ((byte)((type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1727. DTLS_EXPORT_PRO) & 0xF0)
  1728. | ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1729. idx += WOLFSSL_EXPORT_LEN; /* leave spot for length of total buffer */
  1730. idx += WOLFSSL_EXPORT_LEN;
  1731. ret = ExportOptions(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1732. type);
  1733. if (ret >= 0) {
  1734. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1735. idx += ret;
  1736. ret = 0;
  1737. }
  1738. }
  1739. /* export keys struct and dtls state -- variable length stored in ret */
  1740. if (ret == 0) {
  1741. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1742. ret = ExportKeyState(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1743. 0, type);
  1744. if (ret >= 0) {
  1745. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1746. ret = 0;
  1747. }
  1748. }
  1749. /* export of cipher specs struct */
  1750. if (ret == 0) {
  1751. c16toa((word16)WOLFSSL_EXPORT_SPC_SZ, buf + idx);
  1752. idx += WOLFSSL_EXPORT_LEN;
  1753. ret = ExportCipherSpecState(ssl, buf + idx, *sz - idx,
  1754. WOLFSSL_EXPORT_VERSION, type);
  1755. if (ret >= 0) {
  1756. idx += ret;
  1757. ret = 0;
  1758. }
  1759. }
  1760. /* export of peer information */
  1761. if (ret == 0) {
  1762. idx += WOLFSSL_EXPORT_LEN;
  1763. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1764. ret = 0; /* not saving peer port/ip information */
  1765. #else
  1766. ret = ExportPeerInfo(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION);
  1767. #endif
  1768. if (ret >= 0) {
  1769. c16toa(ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1770. idx += ret;
  1771. ret = 0;
  1772. }
  1773. }
  1774. if (ret != 0 && ret != LENGTH_ONLY_E && buf != NULL) {
  1775. /*in a fail case clear the buffer which could contain partial key info*/
  1776. XMEMSET(buf, 0, *sz);
  1777. }
  1778. /* place total length of exported buffer minus 2 bytes protocol/version */
  1779. if (ret == 0) {
  1780. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1781. ret = idx;
  1782. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1783. {
  1784. char debug[256];
  1785. XSNPRINTF(debug, sizeof(debug), "Exporting TLS session\n"
  1786. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1787. ,(int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1788. WOLFSSL_MSG(debug);
  1789. }
  1790. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1791. }
  1792. if (ret >= 0) {
  1793. *sz = ret;
  1794. }
  1795. WOLFSSL_LEAVE("wolfSSL_session_export_internal", ret);
  1796. return ret;
  1797. }
  1798. #endif /* WOLFSSL_SESSION_EXPORT */
  1799. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1800. {
  1801. method->version = pv;
  1802. method->side = WOLFSSL_CLIENT_END;
  1803. method->downgrade = 0;
  1804. }
  1805. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) || \
  1806. defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  1807. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1808. {
  1809. if (ssl == NULL)
  1810. return BAD_FUNC_ARG;
  1811. /* set side */
  1812. ssl->options.side = side;
  1813. /* reset options that are side specific */
  1814. #ifdef HAVE_ECC
  1815. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1816. ssl->options.haveECDSAsig = 1; /* always on client side */
  1817. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1818. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1819. }
  1820. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1821. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1822. ssl->options.haveECDSAsig = 1; /* always on client side */
  1823. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1824. }
  1825. #endif
  1826. #ifdef HAVE_PQC
  1827. #ifdef HAVE_FALCON
  1828. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1829. ssl->options.haveFalconSig = 1; /* always on client side */
  1830. }
  1831. #endif /* HAVE_FALCON */
  1832. #ifdef HAVE_DILITHIUM
  1833. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1834. ssl->options.haveDilithiumSig = 1; /* always on client side */
  1835. }
  1836. #endif /* HAVE_DILITHIUM */
  1837. #endif /* HAVE_PQC */
  1838. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1839. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1840. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1841. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1842. ssl->options.haveEMS = 1;
  1843. }
  1844. #ifdef WOLFSSL_DTLS
  1845. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1846. ssl->options.haveEMS = 1;
  1847. #endif /* WOLFSSL_DTLS */
  1848. }
  1849. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1850. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  1851. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  1852. int ret;
  1853. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  1854. if (ret != 0) {
  1855. WOLFSSL_MSG("DTLS Cookie Secret error");
  1856. return ret;
  1857. }
  1858. }
  1859. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  1860. return InitSSL_Suites(ssl);
  1861. }
  1862. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1863. /* Initialize SSL context, return 0 on success */
  1864. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1865. {
  1866. int ret = 0;
  1867. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1868. ctx->method = method;
  1869. if (heap == NULL) {
  1870. ctx->heap = ctx; /* defaults to self */
  1871. }
  1872. else {
  1873. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  1874. }
  1875. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1876. #ifdef WOLFSSL_DTLS
  1877. if (method->version.major == DTLS_MAJOR) {
  1878. ctx->minDowngrade = WOLFSSL_MIN_DTLS_DOWNGRADE;
  1879. }
  1880. else
  1881. #endif /* WOLFSSL_DTLS */
  1882. {
  1883. /* current default: TLSv1_MINOR */
  1884. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE;
  1885. }
  1886. wolfSSL_RefInit(&ctx->ref, &ret);
  1887. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  1888. if (ret < 0) {
  1889. WOLFSSL_MSG("Mutex error on CTX init");
  1890. ctx->err = CTX_INIT_MUTEX_E;
  1891. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  1892. return BAD_MUTEX_E;
  1893. }
  1894. #else
  1895. (void)ret;
  1896. #endif
  1897. #ifndef NO_CERTS
  1898. ctx->privateKeyDevId = INVALID_DEVID;
  1899. #endif
  1900. #ifndef NO_DH
  1901. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1902. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1903. #endif
  1904. #ifndef NO_RSA
  1905. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1906. #endif
  1907. #ifdef HAVE_ECC
  1908. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1909. ctx->eccTempKeySz = ECDHE_SIZE;
  1910. #endif
  1911. #ifdef HAVE_PQC
  1912. #ifdef HAVE_FALCON
  1913. ctx->minFalconKeySz = MIN_FALCONKEY_SZ;
  1914. #endif /* HAVE_FALCON */
  1915. #ifdef HAVE_DILITHIUM
  1916. ctx->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ;
  1917. #endif /* HAVE_DILITHIUM */
  1918. #endif /* HAVE_PQC */
  1919. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1920. #ifdef OPENSSL_EXTRA
  1921. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1922. #endif
  1923. #ifdef HAVE_NETX
  1924. ctx->CBIORecv = NetX_Receive;
  1925. ctx->CBIOSend = NetX_Send;
  1926. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1927. ctx->CBIORecv = Mynewt_Receive;
  1928. ctx->CBIOSend = Mynewt_Send;
  1929. #elif defined WOLFSSL_LWIP_NATIVE
  1930. ctx->CBIORecv = LwIPNativeReceive;
  1931. ctx->CBIOSend = LwIPNativeSend;
  1932. #elif defined(WOLFSSL_GNRC)
  1933. ctx->CBIORecv = GNRC_ReceiveFrom;
  1934. ctx->CBIOSend = GNRC_SendTo;
  1935. #elif defined WOLFSSL_ISOTP
  1936. ctx->CBIORecv = ISOTP_Receive;
  1937. ctx->CBIOSend = ISOTP_Send;
  1938. #elif !defined(WOLFSSL_USER_IO)
  1939. #ifdef MICRIUM
  1940. ctx->CBIORecv = MicriumReceive;
  1941. ctx->CBIOSend = MicriumSend;
  1942. #ifdef WOLFSSL_DTLS
  1943. if (method->version.major == DTLS_MAJOR) {
  1944. ctx->CBIORecv = MicriumReceiveFrom;
  1945. ctx->CBIOSend = MicriumSendTo;
  1946. }
  1947. #ifdef WOLFSSL_SESSION_EXPORT
  1948. #error Micrium port does not support DTLS session export yet
  1949. #endif
  1950. #endif
  1951. #elif defined WOLFSSL_UIP
  1952. ctx->CBIORecv = uIPReceive;
  1953. ctx->CBIOSend = uIPSend;
  1954. #ifdef WOLFSSL_DTLS
  1955. if (method->version.major == DTLS_MAJOR) {
  1956. ctx->CBIOSendTo = uIPSendTo;
  1957. ctx->CBIORecvFrom = uIPRecvFrom;
  1958. }
  1959. #endif
  1960. #else
  1961. ctx->CBIORecv = EmbedReceive;
  1962. ctx->CBIOSend = EmbedSend;
  1963. #ifdef WOLFSSL_SESSION_EXPORT
  1964. ctx->CBGetPeer = EmbedGetPeer;
  1965. ctx->CBSetPeer = EmbedSetPeer;
  1966. #endif
  1967. #ifdef WOLFSSL_DTLS
  1968. if (method->version.major == DTLS_MAJOR) {
  1969. ctx->CBIORecv = EmbedReceiveFrom;
  1970. ctx->CBIOSend = EmbedSendTo;
  1971. }
  1972. #endif
  1973. #endif /* MICRIUM */
  1974. #endif /* WOLFSSL_USER_IO */
  1975. #ifdef HAVE_PQC
  1976. #ifdef HAVE_FALCON
  1977. if (method->side == WOLFSSL_CLIENT_END)
  1978. ctx->haveFalconSig = 1; /* always on client side */
  1979. /* server can turn on by loading key */
  1980. #endif /* HAVE_FALCON */
  1981. #ifdef HAVE_DILITHIUM
  1982. if (method->side == WOLFSSL_CLIENT_END)
  1983. ctx->haveDilithiumSig = 1; /* always on client side */
  1984. /* server can turn on by loading key */
  1985. #endif /* HAVE_DILITHIUM */
  1986. #endif /* HAVE_PQC */
  1987. #ifdef HAVE_ECC
  1988. if (method->side == WOLFSSL_CLIENT_END) {
  1989. ctx->haveECDSAsig = 1; /* always on client side */
  1990. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1991. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  1992. }
  1993. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1994. if (method->side == WOLFSSL_CLIENT_END) {
  1995. ctx->haveECDSAsig = 1; /* always on client side */
  1996. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1997. }
  1998. #endif
  1999. #ifdef WOLFSSL_QNX_CAAM
  2000. /* default to try using CAAM when built */
  2001. ctx->devId = WOLFSSL_CAAM_DEVID;
  2002. #elif defined(HAVE_ARIA) && defined(WOLF_CRYPTO_CB)
  2003. ctx->devId = WOLFSSL_ARIA_DEVID;
  2004. #else
  2005. ctx->devId = INVALID_DEVID;
  2006. #endif
  2007. #if defined(WOLFSSL_DTLS)
  2008. #ifdef WOLFSSL_SCTP
  2009. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  2010. #elif defined(WOLFSSL_DTLS_MTU)
  2011. ctx->dtlsMtuSz = MAX_MTU;
  2012. #endif
  2013. #endif
  2014. #ifndef NO_CERTS
  2015. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  2016. if (ctx->cm == NULL) {
  2017. WOLFSSL_MSG("Bad Cert Manager New");
  2018. WOLFSSL_ERROR_VERBOSE(BAD_CERT_MANAGER_ERROR);
  2019. return BAD_CERT_MANAGER_ERROR;
  2020. }
  2021. #ifdef OPENSSL_EXTRA
  2022. /* setup WOLFSSL_X509_STORE */
  2023. ctx->x509_store.cm = ctx->cm;
  2024. /* set pointer back to x509 store */
  2025. ctx->cm->x509_store_p = &ctx->x509_store;
  2026. /* WOLFSSL_X509_VERIFY_PARAM */
  2027. if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  2028. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  2029. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  2030. WOLFSSL_MSG("ctx->param memory error");
  2031. return MEMORY_E;
  2032. }
  2033. XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  2034. /* WOLFSSL_X509_LOOKUP */
  2035. if ((ctx->x509_store.lookup.dirs =
  2036. (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR),
  2037. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  2038. WOLFSSL_MSG("ctx-x509_store.lookup.dir memory allocation error");
  2039. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  2040. ctx->param = NULL;
  2041. return MEMORY_E;
  2042. }
  2043. XMEMSET(ctx->x509_store.lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
  2044. if (wc_InitMutex(&ctx->x509_store.lookup.dirs->lock) != 0) {
  2045. WOLFSSL_MSG("Bad mutex init");
  2046. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  2047. ctx->param = NULL;
  2048. XFREE(ctx->x509_store.lookup.dirs, heap, DYNAMIC_TYPE_OPENSSL);
  2049. ctx->x509_store.lookup.dirs = NULL;
  2050. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  2051. return BAD_MUTEX_E;
  2052. }
  2053. #endif
  2054. #endif
  2055. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  2056. if (method->side == WOLFSSL_CLIENT_END) {
  2057. if ((method->version.major == SSLv3_MAJOR) &&
  2058. (method->version.minor >= TLSv1_MINOR)) {
  2059. ctx->haveEMS = 1;
  2060. }
  2061. #ifdef WOLFSSL_DTLS
  2062. if (method->version.major == DTLS_MAJOR)
  2063. ctx->haveEMS = 1;
  2064. #endif /* WOLFSSL_DTLS */
  2065. }
  2066. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  2067. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  2068. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  2069. ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
  2070. if (ret != 0) return ret;
  2071. ctx->ticketEncCb = DefTicketEncCb;
  2072. ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
  2073. #endif
  2074. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  2075. #if defined(WOLFSSL_TLS13)
  2076. ctx->maxTicketTls13 = 1; /* default to sending a session ticket if compiled
  2077. in */
  2078. #endif
  2079. #endif
  2080. #ifdef WOLFSSL_EARLY_DATA
  2081. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  2082. #endif
  2083. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  2084. #if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
  2085. ctx->noPskDheKe = 1;
  2086. #endif
  2087. #endif
  2088. #if defined(WOLFSSL_QT) && !defined(NO_PSK)
  2089. /* Qt retrieves supported cipher list at initialization
  2090. * from get_cipher_compat().
  2091. * Qt doesn't allow to use a cipher if it is not in the supported list.
  2092. * Therefore, we need to enable PSK cipher at the beginning.
  2093. */
  2094. ctx->havePSK = 1;
  2095. #endif
  2096. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  2097. #ifdef HAVE_WOLF_EVENT
  2098. ret = wolfEventQueue_Init(&ctx->event_queue);
  2099. #endif /* HAVE_WOLF_EVENT */
  2100. #ifdef WOLFSSL_MAXQ10XX_TLS
  2101. /* Let maxq10xx know what TLS version we are using. */
  2102. ctx->devId = MAXQ_DEVICE_ID;
  2103. maxq10xx_SetupPkCallbacks(ctx, &method->version);
  2104. #endif /* WOLFSSL_MAXQ10XX_TLS */
  2105. return ret;
  2106. }
  2107. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2108. void wolfSSL_CRYPTO_cleanup_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data)
  2109. {
  2110. int n_ex_data = (int)(sizeof ex_data->ex_data / sizeof ex_data->ex_data[0]);
  2111. for (--n_ex_data; n_ex_data >= 0; --n_ex_data) {
  2112. if (ex_data->ex_data[n_ex_data] != NULL)
  2113. (void)wolfSSL_CRYPTO_set_ex_data_with_cleanup(ex_data, n_ex_data,
  2114. NULL, NULL);
  2115. }
  2116. }
  2117. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  2118. #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
  2119. /* free all ech configs in the list */
  2120. static void FreeEchConfigs(WOLFSSL_EchConfig* configs, void* heap)
  2121. {
  2122. WOLFSSL_EchConfig* working_config = configs;
  2123. WOLFSSL_EchConfig* next_config;
  2124. while (working_config != NULL) {
  2125. next_config = working_config->next;
  2126. XFREE(working_config->cipherSuites, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2127. XFREE(working_config->publicName, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2128. if (working_config->raw != NULL)
  2129. XFREE(working_config->raw, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2130. if (working_config->receiverPrivkey != NULL) {
  2131. wc_HpkeFreeKey(NULL, working_config->kemId,
  2132. working_config->receiverPrivkey, heap);
  2133. }
  2134. XFREE(working_config, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2135. working_config = next_config;
  2136. }
  2137. (void)heap;
  2138. }
  2139. #endif
  2140. /* In case contexts are held in array and don't want to free actual ctx. */
  2141. /* The allocations done in InitSSL_Ctx must be free'd with ctx->onHeapHint
  2142. * logic. A WOLFSSL_CTX can be assigned a static memory heap hint using
  2143. * wolfSSL_CTX_load_static_memory after CTX creation, which means variables
  2144. * allocated in InitSSL_Ctx were allocated from heap and should be free'd with
  2145. * a NULL heap hint. */
  2146. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  2147. {
  2148. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
  2149. defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
  2150. int i;
  2151. #endif
  2152. void* heapAtCTXInit = ctx->heap;
  2153. #ifdef WOLFSSL_STATIC_MEMORY
  2154. if (ctx->onHeapHint == 0) {
  2155. heapAtCTXInit = NULL;
  2156. }
  2157. #endif
  2158. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2159. wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
  2160. #endif
  2161. #ifdef HAVE_WOLF_EVENT
  2162. wolfEventQueue_Free(&ctx->event_queue);
  2163. #endif /* HAVE_WOLF_EVENT */
  2164. XFREE(ctx->method, heapAtCTXInit, DYNAMIC_TYPE_METHOD);
  2165. ctx->method = NULL;
  2166. if (ctx->suites) {
  2167. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  2168. ctx->suites = NULL;
  2169. }
  2170. #ifndef NO_DH
  2171. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2172. ctx->serverDH_G.buffer = NULL;
  2173. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2174. ctx->serverDH_P.buffer = NULL;
  2175. #endif /* !NO_DH */
  2176. #ifdef SINGLE_THREADED
  2177. if (ctx->rng) {
  2178. wc_FreeRng(ctx->rng);
  2179. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  2180. ctx->rng = NULL;
  2181. }
  2182. #endif /* SINGLE_THREADED */
  2183. #ifndef NO_CERTS
  2184. if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) {
  2185. ForceZero(ctx->privateKey->buffer, ctx->privateKey->length);
  2186. }
  2187. FreeDer(&ctx->privateKey);
  2188. #ifdef OPENSSL_ALL
  2189. wolfSSL_EVP_PKEY_free(ctx->privateKeyPKey);
  2190. #endif
  2191. FreeDer(&ctx->certificate);
  2192. #ifdef KEEP_OUR_CERT
  2193. if (ctx->ourCert && ctx->ownOurCert) {
  2194. wolfSSL_X509_free(ctx->ourCert);
  2195. ctx->ourCert = NULL;
  2196. }
  2197. #endif /* KEEP_OUR_CERT */
  2198. FreeDer(&ctx->certChain);
  2199. wolfSSL_CertManagerFree(ctx->cm);
  2200. ctx->cm = NULL;
  2201. #ifdef OPENSSL_ALL
  2202. if (ctx->x509_store.objs != NULL) {
  2203. wolfSSL_sk_X509_OBJECT_pop_free(ctx->x509_store.objs, NULL);
  2204. ctx->x509_store.objs = NULL;
  2205. }
  2206. #endif
  2207. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
  2208. defined(WOLFSSL_WPAS_SMALL)
  2209. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  2210. #endif
  2211. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  2212. wolfSSL_sk_X509_NAME_pop_free(ctx->client_ca_names, NULL);
  2213. ctx->client_ca_names = NULL;
  2214. #endif
  2215. #ifdef OPENSSL_EXTRA
  2216. if (ctx->x509Chain) {
  2217. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  2218. ctx->x509Chain = NULL;
  2219. }
  2220. #endif
  2221. #endif /* !NO_CERTS */
  2222. #ifdef HAVE_TLS_EXTENSIONS
  2223. #if !defined(NO_TLS)
  2224. TLSX_FreeAll(ctx->extensions, ctx->heap);
  2225. #endif /* !NO_TLS */
  2226. #ifndef NO_WOLFSSL_SERVER
  2227. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  2228. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  2229. if (ctx->certOcspRequest) {
  2230. FreeOcspRequest(ctx->certOcspRequest);
  2231. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2232. }
  2233. #endif
  2234. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2235. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  2236. if (ctx->chainOcspRequest[i]) {
  2237. FreeOcspRequest(ctx->chainOcspRequest[i]);
  2238. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2239. ctx->chainOcspRequest[i] = NULL;
  2240. }
  2241. }
  2242. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2243. #endif /* !NO_WOLFSSL_SERVER */
  2244. #endif /* HAVE_TLS_EXTENSIONS */
  2245. #ifdef OPENSSL_EXTRA
  2246. if (ctx->alpn_cli_protos) {
  2247. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  2248. ctx->alpn_cli_protos = NULL;
  2249. }
  2250. if (ctx->param) {
  2251. XFREE(ctx->param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2252. ctx->param = NULL;
  2253. }
  2254. if (ctx->x509_store.lookup.dirs) {
  2255. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  2256. if (ctx->x509_store.lookup.dirs->dir_entry) {
  2257. wolfSSL_sk_BY_DIR_entry_free(ctx->x509_store.lookup.dirs->dir_entry);
  2258. }
  2259. #endif
  2260. wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
  2261. XFREE(ctx->x509_store.lookup.dirs, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2262. }
  2263. #endif
  2264. #ifdef WOLFSSL_STATIC_EPHEMERAL
  2265. #ifndef NO_DH
  2266. FreeDer(&ctx->staticKE.dhKey);
  2267. #endif
  2268. #ifdef HAVE_ECC
  2269. FreeDer(&ctx->staticKE.ecKey);
  2270. #endif
  2271. #ifdef HAVE_CURVE25519
  2272. FreeDer(&ctx->staticKE.x25519Key);
  2273. #endif
  2274. #ifdef HAVE_CURVE448
  2275. FreeDer(&ctx->staticKE.x448Key);
  2276. #endif
  2277. #ifndef SINGLE_THREADED
  2278. if (ctx->staticKELockInit) {
  2279. wc_FreeMutex(&ctx->staticKELock);
  2280. ctx->staticKELockInit = 0;
  2281. }
  2282. #endif
  2283. #endif
  2284. #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
  2285. FreeEchConfigs(ctx->echConfigs, ctx->heap);
  2286. ctx->echConfigs = NULL;
  2287. #endif
  2288. (void)heapAtCTXInit;
  2289. }
  2290. #ifdef WOLFSSL_STATIC_MEMORY
  2291. static void SSL_CtxResourceFreeStaticMem(void* heap)
  2292. {
  2293. if (heap != NULL
  2294. #ifdef WOLFSSL_HEAP_TEST
  2295. /* avoid dereferencing a test value */
  2296. && heap != (void*)WOLFSSL_HEAP_TEST
  2297. #endif
  2298. ) {
  2299. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)heap;
  2300. WOLFSSL_HEAP* mem = hint->memory;
  2301. wc_FreeMutex(&mem->memory_mutex);
  2302. }
  2303. }
  2304. #endif /* WOLFSSL_STATIC_MEMORY */
  2305. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  2306. {
  2307. int isZero;
  2308. int ret;
  2309. void* heap = ctx->heap;
  2310. #ifdef WOLFSSL_STATIC_MEMORY
  2311. if (ctx->onHeapHint == 0) {
  2312. heap = NULL;
  2313. }
  2314. #endif
  2315. /* decrement CTX reference count */
  2316. wolfSSL_RefDec(&ctx->ref, &isZero, &ret);
  2317. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  2318. if (ret < 0) {
  2319. /* check error state, if mutex error code then mutex init failed but
  2320. * CTX was still malloc'd */
  2321. if (ctx->err == CTX_INIT_MUTEX_E) {
  2322. SSL_CtxResourceFree(ctx);
  2323. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2324. #ifdef WOLFSSL_STATIC_MEMORY
  2325. SSL_CtxResourceFreeStaticMem(heap);
  2326. #endif
  2327. }
  2328. return;
  2329. }
  2330. #else
  2331. (void)ret;
  2332. #endif
  2333. if (isZero) {
  2334. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  2335. SSL_CtxResourceFree(ctx);
  2336. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  2337. !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  2338. TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
  2339. #endif
  2340. wolfSSL_RefFree(&ctx->ref);
  2341. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2342. #ifdef WOLFSSL_STATIC_MEMORY
  2343. SSL_CtxResourceFreeStaticMem(heap);
  2344. #endif
  2345. }
  2346. else {
  2347. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  2348. }
  2349. (void)heap; /* not used in some builds */
  2350. }
  2351. /* Set cipher pointers to null */
  2352. void InitCiphers(WOLFSSL* ssl)
  2353. {
  2354. #ifdef BUILD_ARC4
  2355. ssl->encrypt.arc4 = NULL;
  2356. ssl->decrypt.arc4 = NULL;
  2357. #endif
  2358. #ifdef BUILD_DES3
  2359. ssl->encrypt.des3 = NULL;
  2360. ssl->decrypt.des3 = NULL;
  2361. #endif
  2362. #ifdef BUILD_AES
  2363. ssl->encrypt.aes = NULL;
  2364. ssl->decrypt.aes = NULL;
  2365. #endif
  2366. #ifdef HAVE_ARIA
  2367. ssl->encrypt.aria = NULL;
  2368. ssl->decrypt.aria = NULL;
  2369. #endif
  2370. #ifdef HAVE_CAMELLIA
  2371. ssl->encrypt.cam = NULL;
  2372. ssl->decrypt.cam = NULL;
  2373. #endif
  2374. #ifdef HAVE_CHACHA
  2375. ssl->encrypt.chacha = NULL;
  2376. ssl->decrypt.chacha = NULL;
  2377. #endif
  2378. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2379. ssl->auth.poly1305 = NULL;
  2380. #endif
  2381. ssl->encrypt.setup = 0;
  2382. ssl->decrypt.setup = 0;
  2383. #ifdef HAVE_ONE_TIME_AUTH
  2384. ssl->auth.setup = 0;
  2385. #endif
  2386. #ifdef WOLFSSL_DTLS13
  2387. XMEMSET(&ssl->dtlsRecordNumberEncrypt, 0,
  2388. sizeof(ssl->dtlsRecordNumberEncrypt));
  2389. XMEMSET(&ssl->dtlsRecordNumberDecrypt, 0,
  2390. sizeof(ssl->dtlsRecordNumberEncrypt));
  2391. #endif /* WOLFSSL_DTLS13 */
  2392. }
  2393. /* Free ciphers */
  2394. void FreeCiphers(WOLFSSL* ssl)
  2395. {
  2396. (void)ssl;
  2397. #ifdef BUILD_ARC4
  2398. wc_Arc4Free(ssl->encrypt.arc4);
  2399. wc_Arc4Free(ssl->decrypt.arc4);
  2400. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2401. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2402. #endif
  2403. #ifdef BUILD_DES3
  2404. wc_Des3Free(ssl->encrypt.des3);
  2405. wc_Des3Free(ssl->decrypt.des3);
  2406. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2407. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2408. #endif
  2409. #if defined(BUILD_AES) || defined(BUILD_AESGCM) || defined(HAVE_ARIA)
  2410. /* See: InitKeys() in keys.c on addition of BUILD_AESGCM check (enc->aes, dec->aes) */
  2411. wc_AesFree(ssl->encrypt.aes);
  2412. wc_AesFree(ssl->decrypt.aes);
  2413. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2414. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2415. #endif
  2416. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  2417. wc_Sm4Free(ssl->encrypt.sm4);
  2418. wc_Sm4Free(ssl->decrypt.sm4);
  2419. XFREE(ssl->encrypt.sm4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2420. XFREE(ssl->decrypt.sm4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2421. #endif
  2422. #if (defined(BUILD_AESGCM) || defined(BUILD_AESCCM) || defined(HAVE_ARIA)) && \
  2423. !defined(WOLFSSL_NO_TLS12)
  2424. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2425. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2426. #endif
  2427. #ifdef CIPHER_NONCE
  2428. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2429. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2430. #endif
  2431. #ifdef HAVE_ARIA
  2432. wc_AriaFreeCrypt(ssl->encrypt.aria);
  2433. wc_AriaFreeCrypt(ssl->decrypt.aria);
  2434. XFREE(ssl->encrypt.aria, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2435. XFREE(ssl->decrypt.aria, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2436. #endif
  2437. #ifdef HAVE_CAMELLIA
  2438. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2439. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2440. #endif
  2441. #ifdef HAVE_CHACHA
  2442. if (ssl->encrypt.chacha)
  2443. ForceZero(ssl->encrypt.chacha, sizeof(ChaCha));
  2444. if (ssl->decrypt.chacha)
  2445. ForceZero(ssl->decrypt.chacha, sizeof(ChaCha));
  2446. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2447. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2448. #endif
  2449. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2450. if (ssl->auth.poly1305)
  2451. ForceZero(ssl->auth.poly1305, sizeof(Poly1305));
  2452. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2453. #endif
  2454. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  2455. wc_HmacFree(ssl->encrypt.hmac);
  2456. wc_HmacFree(ssl->decrypt.hmac);
  2457. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2458. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2459. #endif
  2460. #ifdef WOLFSSL_DTLS13
  2461. #ifdef BUILD_AES
  2462. if (ssl->dtlsRecordNumberEncrypt.aes != NULL) {
  2463. wc_AesFree(ssl->dtlsRecordNumberEncrypt.aes);
  2464. XFREE(ssl->dtlsRecordNumberEncrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2465. ssl->dtlsRecordNumberEncrypt.aes = NULL;
  2466. }
  2467. if (ssl->dtlsRecordNumberDecrypt.aes != NULL) {
  2468. wc_AesFree(ssl->dtlsRecordNumberDecrypt.aes);
  2469. XFREE(ssl->dtlsRecordNumberDecrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2470. ssl->dtlsRecordNumberDecrypt.aes = NULL;
  2471. }
  2472. #endif /* BUILD_AES */
  2473. #ifdef HAVE_CHACHA
  2474. XFREE(ssl->dtlsRecordNumberEncrypt.chacha,
  2475. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2476. XFREE(ssl->dtlsRecordNumberDecrypt.chacha,
  2477. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2478. ssl->dtlsRecordNumberEncrypt.chacha = NULL;
  2479. ssl->dtlsRecordNumberDecrypt.chacha = NULL;
  2480. #endif /* HAVE_CHACHA */
  2481. #endif /* WOLFSSL_DTLS13 */
  2482. }
  2483. void InitCipherSpecs(CipherSpecs* cs)
  2484. {
  2485. XMEMSET(cs, 0, sizeof(CipherSpecs));
  2486. cs->bulk_cipher_algorithm = INVALID_BYTE;
  2487. cs->cipher_type = INVALID_BYTE;
  2488. cs->mac_algorithm = INVALID_BYTE;
  2489. cs->kea = INVALID_BYTE;
  2490. cs->sig_algo = INVALID_BYTE;
  2491. }
  2492. #if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
  2493. defined(HAVE_ECC))
  2494. static int GetMacDigestSize(byte macAlgo)
  2495. {
  2496. switch (macAlgo) {
  2497. #ifndef NO_SHA
  2498. case sha_mac:
  2499. return WC_SHA_DIGEST_SIZE;
  2500. #endif
  2501. #ifndef NO_SHA256
  2502. case sha256_mac:
  2503. return WC_SHA256_DIGEST_SIZE;
  2504. #endif
  2505. #ifdef WOLFSSL_SHA384
  2506. case sha384_mac:
  2507. return WC_SHA384_DIGEST_SIZE;
  2508. #endif
  2509. #ifdef WOLFSSL_SHA512
  2510. case sha512_mac:
  2511. return WC_SHA512_DIGEST_SIZE;
  2512. #endif
  2513. #ifdef WOLFSSL_SM3
  2514. case sm3_mac:
  2515. return WC_SM3_DIGEST_SIZE;
  2516. #endif
  2517. default:
  2518. break;
  2519. }
  2520. return NOT_COMPILED_IN;
  2521. }
  2522. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO || (WOLFSSL_TLS13 && HAVE_ECC) */
  2523. #define ADD_HASH_SIG_ALGO(out, inOutIdx, major, minor) \
  2524. do { \
  2525. if ((out) != NULL) { \
  2526. (out)[*(inOutIdx) ] = (major); \
  2527. (out)[*(inOutIdx) + 1] = (minor); \
  2528. } \
  2529. *(inOutIdx) += 2; \
  2530. } while (0)
  2531. static WC_INLINE void AddSuiteHashSigAlgo(byte* hashSigAlgo, byte macAlgo,
  2532. byte sigAlgo, int keySz, word16* inOutIdx)
  2533. {
  2534. int addSigAlgo = 1;
  2535. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  2536. if (sigAlgo == ecc_dsa_sa_algo) {
  2537. int digestSz = GetMacDigestSize(macAlgo);
  2538. /* do not add sig/algos with digest size larger than key size */
  2539. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  2540. addSigAlgo = 0;
  2541. }
  2542. }
  2543. #else
  2544. (void)keySz;
  2545. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2546. if (addSigAlgo) {
  2547. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  2548. if (sigAlgo == sm2_sa_algo) {
  2549. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2550. SM2_SA_MAJOR, SM2_SA_MINOR);
  2551. }
  2552. else
  2553. #endif
  2554. #ifdef HAVE_ED25519
  2555. if (sigAlgo == ed25519_sa_algo) {
  2556. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2557. ED25519_SA_MAJOR, ED25519_SA_MINOR);
  2558. }
  2559. else
  2560. #endif
  2561. #ifdef HAVE_ED448
  2562. if (sigAlgo == ed448_sa_algo) {
  2563. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2564. ED448_SA_MAJOR, ED448_SA_MINOR);
  2565. }
  2566. else
  2567. #endif
  2568. #ifdef HAVE_PQC
  2569. #ifdef HAVE_FALCON
  2570. if (sigAlgo == falcon_level1_sa_algo) {
  2571. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2572. FALCON_LEVEL1_SA_MAJOR, FALCON_LEVEL1_SA_MINOR);
  2573. }
  2574. else
  2575. if (sigAlgo == falcon_level5_sa_algo) {
  2576. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2577. FALCON_LEVEL5_SA_MAJOR, FALCON_LEVEL5_SA_MINOR);
  2578. }
  2579. else
  2580. #endif /* HAVE_FALCON */
  2581. #ifdef HAVE_DILITHIUM
  2582. if (sigAlgo == dilithium_level2_sa_algo) {
  2583. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2584. DILITHIUM_LEVEL2_SA_MAJOR, DILITHIUM_LEVEL2_SA_MINOR);
  2585. }
  2586. else
  2587. if (sigAlgo == dilithium_level3_sa_algo) {
  2588. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2589. DILITHIUM_LEVEL3_SA_MAJOR, DILITHIUM_LEVEL3_SA_MINOR);
  2590. }
  2591. else
  2592. if (sigAlgo == dilithium_level5_sa_algo) {
  2593. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2594. DILITHIUM_LEVEL5_SA_MAJOR, DILITHIUM_LEVEL5_SA_MINOR);
  2595. }
  2596. else
  2597. #endif /* HAVE_DILITHIUM */
  2598. #endif /* HAVE_PQC */
  2599. #ifdef WC_RSA_PSS
  2600. if (sigAlgo == rsa_pss_sa_algo) {
  2601. /* RSA PSS is sig then mac */
  2602. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, sigAlgo, macAlgo);
  2603. #ifdef WOLFSSL_TLS13
  2604. /* Add the certificate algorithm as well */
  2605. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, sigAlgo,
  2606. PSS_RSAE_TO_PSS_PSS(macAlgo));
  2607. #endif
  2608. }
  2609. else
  2610. #endif
  2611. {
  2612. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, macAlgo, sigAlgo);
  2613. }
  2614. }
  2615. }
  2616. void InitSuitesHashSigAlgo_ex2(byte* hashSigAlgo, int haveSig, int tls1_2,
  2617. int keySz, word16* len)
  2618. {
  2619. word16 idx = 0;
  2620. (void)tls1_2;
  2621. (void)keySz;
  2622. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  2623. if (haveSig & SIG_ECDSA) {
  2624. #ifdef HAVE_ECC
  2625. #ifdef WOLFSSL_SHA512
  2626. AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, ecc_dsa_sa_algo, keySz,
  2627. &idx);
  2628. #endif
  2629. #ifdef WOLFSSL_SHA384
  2630. AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, ecc_dsa_sa_algo, keySz,
  2631. &idx);
  2632. #endif
  2633. #ifndef NO_SHA256
  2634. AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, ecc_dsa_sa_algo, keySz,
  2635. &idx);
  2636. #endif
  2637. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2638. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2639. AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  2640. #endif
  2641. #endif
  2642. #ifdef HAVE_ED25519
  2643. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, ed25519_sa_algo, keySz, &idx);
  2644. #endif
  2645. #ifdef HAVE_ED448
  2646. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, ed448_sa_algo, keySz, &idx);
  2647. #endif
  2648. }
  2649. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  2650. #if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  2651. if (haveSig & SIG_SM2) {
  2652. AddSuiteHashSigAlgo(hashSigAlgo, sm3_mac, sm2_sa_algo, keySz,
  2653. &idx);
  2654. }
  2655. #endif
  2656. #if defined(HAVE_PQC)
  2657. #ifdef HAVE_FALCON
  2658. if (haveSig & SIG_FALCON) {
  2659. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, falcon_level1_sa_algo, keySz,
  2660. &idx);
  2661. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, falcon_level5_sa_algo, keySz,
  2662. &idx);
  2663. }
  2664. #endif /* HAVE_FALCON */
  2665. #ifdef HAVE_DILITHIUM
  2666. if (haveSig & SIG_DILITHIUM) {
  2667. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level2_sa_algo,
  2668. keySz, &idx);
  2669. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level3_sa_algo,
  2670. keySz, &idx);
  2671. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level5_sa_algo,
  2672. keySz, &idx);
  2673. }
  2674. #endif /* HAVE_DILITHIUM */
  2675. #endif /* HAVE_PQC */
  2676. if (haveSig & SIG_RSA) {
  2677. #ifdef WC_RSA_PSS
  2678. if (tls1_2) {
  2679. #ifdef WOLFSSL_SHA512
  2680. AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, rsa_pss_sa_algo, keySz,
  2681. &idx);
  2682. #endif
  2683. #ifdef WOLFSSL_SHA384
  2684. AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, rsa_pss_sa_algo, keySz,
  2685. &idx);
  2686. #endif
  2687. #ifndef NO_SHA256
  2688. AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, rsa_pss_sa_algo, keySz,
  2689. &idx);
  2690. #endif
  2691. }
  2692. #endif
  2693. #ifdef WOLFSSL_SHA512
  2694. AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, rsa_sa_algo, keySz, &idx);
  2695. #endif
  2696. #ifdef WOLFSSL_SHA384
  2697. AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, rsa_sa_algo, keySz, &idx);
  2698. #endif
  2699. #ifndef NO_SHA256
  2700. AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, rsa_sa_algo, keySz, &idx);
  2701. #endif
  2702. #ifdef WOLFSSL_SHA224
  2703. AddSuiteHashSigAlgo(hashSigAlgo, sha224_mac, rsa_sa_algo, keySz, &idx);
  2704. #endif
  2705. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2706. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2707. AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, rsa_sa_algo, keySz, &idx);
  2708. #endif
  2709. }
  2710. #ifdef HAVE_ANON
  2711. if (haveSig & SIG_ANON) {
  2712. AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, anonymous_sa_algo, keySz,
  2713. &idx);
  2714. }
  2715. #endif
  2716. *len = idx;
  2717. }
  2718. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  2719. int haveFalconSig, int haveDilithiumSig, int haveAnon, int tls1_2,
  2720. int keySz)
  2721. {
  2722. InitSuitesHashSigAlgo_ex(suites->hashSigAlgo, haveECDSAsig, haveRSAsig,
  2723. haveFalconSig, haveDilithiumSig, haveAnon, tls1_2, keySz,
  2724. &suites->hashSigAlgoSz);
  2725. }
  2726. void InitSuitesHashSigAlgo_ex(byte* hashSigAlgo, int haveECDSAsig,
  2727. int haveRSAsig, int haveFalconSig, int haveDilithiumSig, int haveAnon,
  2728. int tls1_2, int keySz, word16* len)
  2729. {
  2730. int have = 0;
  2731. if (haveECDSAsig) have |= SIG_ECDSA;
  2732. if (haveRSAsig) have |= SIG_RSA;
  2733. if (haveFalconSig) have |= SIG_FALCON;
  2734. if (haveDilithiumSig) have |= SIG_DILITHIUM;
  2735. if (haveAnon) have |= SIG_ANON;
  2736. InitSuitesHashSigAlgo_ex2(hashSigAlgo, have, tls1_2, keySz, len);
  2737. }
  2738. int AllocateCtxSuites(WOLFSSL_CTX* ctx)
  2739. {
  2740. if (ctx->suites == NULL) {
  2741. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  2742. DYNAMIC_TYPE_SUITES);
  2743. if (ctx->suites == NULL) {
  2744. WOLFSSL_MSG("Memory alloc for Suites failed");
  2745. return MEMORY_ERROR;
  2746. }
  2747. XMEMSET(ctx->suites, 0, sizeof(Suites));
  2748. }
  2749. return 0;
  2750. }
  2751. /* Call this when the ssl object needs to have its own ssl->suites object */
  2752. int AllocateSuites(WOLFSSL* ssl)
  2753. {
  2754. if (ssl->suites == NULL) {
  2755. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  2756. DYNAMIC_TYPE_SUITES);
  2757. if (ssl->suites == NULL) {
  2758. WOLFSSL_MSG("Suites Memory error");
  2759. return MEMORY_ERROR;
  2760. }
  2761. if (ssl->ctx != NULL && ssl->ctx->suites != NULL)
  2762. XMEMCPY(ssl->suites, ssl->ctx->suites, sizeof(Suites));
  2763. else
  2764. XMEMSET(ssl->suites, 0, sizeof(Suites));
  2765. }
  2766. return 0;
  2767. }
  2768. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  2769. word16 havePSK, word16 haveDH, word16 haveECDSAsig,
  2770. word16 haveECC, word16 haveStaticRSA, word16 haveStaticECC,
  2771. word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon,
  2772. word16 haveNull, int side)
  2773. {
  2774. word16 idx = 0;
  2775. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  2776. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  2777. #ifdef WOLFSSL_TLS13
  2778. int tls1_3 = IsAtLeastTLSv1_3(pv);
  2779. #endif
  2780. int dtls = 0;
  2781. int haveRSAsig = 1;
  2782. #ifdef WOLFSSL_DTLS
  2783. /* If DTLS v1.2 or later than set tls1_2 flag */
  2784. if (pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_2_MINOR) {
  2785. tls1_2 = 1;
  2786. }
  2787. #endif
  2788. (void)tls; /* shut up compiler */
  2789. (void)tls1_2;
  2790. (void)dtls;
  2791. (void)haveDH;
  2792. (void)havePSK;
  2793. (void)haveStaticRSA;
  2794. (void)haveStaticECC;
  2795. (void)haveECC;
  2796. (void)side;
  2797. (void)haveRSA; /* some builds won't read */
  2798. (void)haveRSAsig; /* non ecc builds won't read */
  2799. (void)haveAnon; /* anon ciphers optional */
  2800. (void)haveNull;
  2801. (void)haveFalconSig;
  2802. (void)haveDilithiumSig;
  2803. if (suites == NULL) {
  2804. WOLFSSL_MSG("InitSuites pointer error");
  2805. return;
  2806. }
  2807. if (suites->setSuites)
  2808. return; /* trust user settings, don't override */
  2809. #ifdef WOLFSSL_TLS13
  2810. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  2811. if (tls1_3) {
  2812. suites->suites[idx++] = TLS13_BYTE;
  2813. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  2814. }
  2815. #endif
  2816. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  2817. if (tls1_3) {
  2818. suites->suites[idx++] = TLS13_BYTE;
  2819. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  2820. }
  2821. #endif
  2822. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  2823. if (tls1_3) {
  2824. suites->suites[idx++] = TLS13_BYTE;
  2825. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  2826. }
  2827. #endif
  2828. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  2829. if (tls1_3) {
  2830. suites->suites[idx++] = TLS13_BYTE;
  2831. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  2832. }
  2833. #endif
  2834. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  2835. if (tls1_3) {
  2836. suites->suites[idx++] = TLS13_BYTE;
  2837. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  2838. }
  2839. #endif
  2840. #ifdef BUILD_TLS_SM4_GCM_SM3
  2841. if (tls1_3) {
  2842. suites->suites[idx++] = CIPHER_BYTE;
  2843. suites->suites[idx++] = TLS_SM4_GCM_SM3;
  2844. }
  2845. #endif
  2846. #ifdef BUILD_TLS_SM4_CCM_SM3
  2847. if (tls1_3) {
  2848. suites->suites[idx++] = CIPHER_BYTE;
  2849. suites->suites[idx++] = TLS_SM4_CCM_SM3;
  2850. }
  2851. #endif
  2852. #ifdef HAVE_NULL_CIPHER
  2853. #ifdef BUILD_TLS_SHA256_SHA256
  2854. if (tls1_3 && haveNull) {
  2855. suites->suites[idx++] = ECC_BYTE;
  2856. suites->suites[idx++] = TLS_SHA256_SHA256;
  2857. }
  2858. #endif
  2859. #ifdef BUILD_TLS_SHA384_SHA384
  2860. if (tls1_3 && haveNull) {
  2861. suites->suites[idx++] = ECC_BYTE;
  2862. suites->suites[idx++] = TLS_SHA384_SHA384;
  2863. }
  2864. #endif
  2865. #endif
  2866. #endif /* WOLFSSL_TLS13 */
  2867. #ifndef WOLFSSL_NO_TLS12
  2868. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  2869. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  2870. haveRSA = 0; /* can't do RSA with ECDSA key */
  2871. }
  2872. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  2873. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  2874. }
  2875. #endif /* !NO_WOLFSSL_SERVER */
  2876. #ifdef NO_RSA
  2877. haveRSAsig = 0; /* can't have RSA sig if don't have RSA */
  2878. #endif
  2879. #ifdef WOLFSSL_DTLS
  2880. if (pv.major == DTLS_MAJOR) {
  2881. dtls = 1;
  2882. tls = 1;
  2883. /* May be dead assignments dependent upon configuration */
  2884. (void) dtls;
  2885. (void) tls;
  2886. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  2887. }
  2888. #endif
  2889. #ifdef HAVE_RENEGOTIATION_INDICATION
  2890. if (side == WOLFSSL_CLIENT_END) {
  2891. suites->suites[idx++] = CIPHER_BYTE;
  2892. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  2893. }
  2894. #endif
  2895. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2896. if (tls1_2 && haveECC) {
  2897. suites->suites[idx++] = ECC_BYTE;
  2898. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2899. }
  2900. #endif
  2901. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2902. if (tls1_2 && haveECC) {
  2903. suites->suites[idx++] = ECC_BYTE;
  2904. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2905. }
  2906. #endif
  2907. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2908. /* OpenSSL enables ECDHE when using ECDHE aliases without RSA */
  2909. #ifdef OPENSSL_EXTRA
  2910. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  2911. #else
  2912. if (tls1_2 && haveRSA) {
  2913. #endif
  2914. suites->suites[idx++] = ECC_BYTE;
  2915. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2916. }
  2917. #endif
  2918. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2919. #ifdef OPENSSL_EXTRA
  2920. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  2921. #else
  2922. if (tls1_2 && haveRSA) {
  2923. #endif
  2924. suites->suites[idx++] = ECC_BYTE;
  2925. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2926. }
  2927. #endif
  2928. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2929. if (tls1_2 && haveDH && haveRSA) {
  2930. suites->suites[idx++] = CIPHER_BYTE;
  2931. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2932. }
  2933. #endif
  2934. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2935. if (tls1_2 && haveDH && haveRSA) {
  2936. suites->suites[idx++] = CIPHER_BYTE;
  2937. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2938. }
  2939. #endif
  2940. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  2941. if (tls1_2 && haveRSA && haveStaticRSA) {
  2942. suites->suites[idx++] = CIPHER_BYTE;
  2943. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  2944. }
  2945. #endif
  2946. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  2947. if (tls1_2 && haveRSA && haveStaticRSA) {
  2948. suites->suites[idx++] = CIPHER_BYTE;
  2949. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  2950. }
  2951. #endif
  2952. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  2953. if (tls1_2 && haveECC && haveStaticECC) {
  2954. suites->suites[idx++] = ECC_BYTE;
  2955. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  2956. }
  2957. #endif
  2958. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  2959. if (tls1_2 && haveECC && haveStaticECC) {
  2960. suites->suites[idx++] = ECC_BYTE;
  2961. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  2962. }
  2963. #endif
  2964. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  2965. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2966. suites->suites[idx++] = ECC_BYTE;
  2967. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  2968. }
  2969. #endif
  2970. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  2971. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2972. suites->suites[idx++] = ECC_BYTE;
  2973. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  2974. }
  2975. #endif
  2976. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
  2977. if (tls1_2 && haveECC) {
  2978. suites->suites[idx++] = ECC_BYTE;
  2979. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384;
  2980. }
  2981. #endif
  2982. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
  2983. if (tls1_2 && haveECC) {
  2984. suites->suites[idx++] = ECC_BYTE;
  2985. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256;
  2986. }
  2987. #endif
  2988. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  2989. if (tls1_2 && haveDH && havePSK) {
  2990. suites->suites[idx++] = CIPHER_BYTE;
  2991. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  2992. }
  2993. #endif
  2994. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  2995. if (tls1_2 && haveDH && haveAnon) {
  2996. suites->suites[idx++] = CIPHER_BYTE;
  2997. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  2998. }
  2999. #endif
  3000. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  3001. if (tls1_2 && haveDH && haveAnon) {
  3002. suites->suites[idx++] = CIPHER_BYTE;
  3003. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  3004. }
  3005. #endif
  3006. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  3007. if (tls1_2 && haveDH && havePSK) {
  3008. suites->suites[idx++] = CIPHER_BYTE;
  3009. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  3010. }
  3011. #endif
  3012. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  3013. if (tls1_2 && havePSK) {
  3014. suites->suites[idx++] = CIPHER_BYTE;
  3015. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  3016. }
  3017. #endif
  3018. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  3019. if (tls1_2 && havePSK) {
  3020. suites->suites[idx++] = CIPHER_BYTE;
  3021. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  3022. }
  3023. #endif
  3024. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  3025. if (tls1_2 && haveECC) {
  3026. suites->suites[idx++] = CHACHA_BYTE;
  3027. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  3028. }
  3029. #endif
  3030. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  3031. #ifdef OPENSSL_EXTRA
  3032. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  3033. #else
  3034. if (tls1_2 && haveRSA) {
  3035. #endif
  3036. suites->suites[idx++] = CHACHA_BYTE;
  3037. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  3038. }
  3039. #endif
  3040. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  3041. if (tls1_2 && haveRSA) {
  3042. suites->suites[idx++] = CHACHA_BYTE;
  3043. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  3044. }
  3045. #endif
  3046. /* Place as higher priority for MYSQL */
  3047. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  3048. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  3049. if (tls && haveDH && haveRSA) {
  3050. suites->suites[idx++] = CIPHER_BYTE;
  3051. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  3052. }
  3053. #endif
  3054. #endif
  3055. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  3056. #ifdef OPENSSL_EXTRA
  3057. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  3058. #else
  3059. if (tls1_2 && haveRSA) {
  3060. #endif
  3061. suites->suites[idx++] = ECC_BYTE;
  3062. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  3063. }
  3064. #endif
  3065. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  3066. if (tls1_2 && haveECC) {
  3067. suites->suites[idx++] = ECC_BYTE;
  3068. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  3069. }
  3070. #endif
  3071. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  3072. if (tls1_2 && haveRSAsig && haveStaticECC) {
  3073. suites->suites[idx++] = ECC_BYTE;
  3074. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  3075. }
  3076. #endif
  3077. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  3078. if (tls1_2 && haveECC && haveStaticECC) {
  3079. suites->suites[idx++] = ECC_BYTE;
  3080. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  3081. }
  3082. #endif
  3083. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  3084. #ifdef OPENSSL_EXTRA
  3085. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  3086. #else
  3087. if (tls1_2 && haveRSA) {
  3088. #endif
  3089. suites->suites[idx++] = ECC_BYTE;
  3090. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  3091. }
  3092. #endif
  3093. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  3094. if (tls1_2 && haveECC) {
  3095. suites->suites[idx++] = ECC_BYTE;
  3096. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  3097. }
  3098. #endif
  3099. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  3100. if (tls1_2 && haveRSAsig && haveStaticECC) {
  3101. suites->suites[idx++] = ECC_BYTE;
  3102. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  3103. }
  3104. #endif
  3105. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  3106. if (tls1_2 && haveECC && haveStaticECC) {
  3107. suites->suites[idx++] = ECC_BYTE;
  3108. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  3109. }
  3110. #endif
  3111. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  3112. if (tls && haveECC) {
  3113. suites->suites[idx++] = ECC_BYTE;
  3114. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  3115. }
  3116. #endif
  3117. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  3118. if (tls && haveECC && haveStaticECC) {
  3119. suites->suites[idx++] = ECC_BYTE;
  3120. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  3121. }
  3122. #endif
  3123. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  3124. if (tls && haveECC) {
  3125. suites->suites[idx++] = ECC_BYTE;
  3126. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  3127. }
  3128. #endif
  3129. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  3130. if (tls && haveECC && haveStaticECC) {
  3131. suites->suites[idx++] = ECC_BYTE;
  3132. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  3133. }
  3134. #endif
  3135. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  3136. if (!dtls && tls && haveECC) {
  3137. suites->suites[idx++] = ECC_BYTE;
  3138. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  3139. }
  3140. #endif
  3141. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  3142. if (!dtls && tls && haveECC && haveStaticECC) {
  3143. suites->suites[idx++] = ECC_BYTE;
  3144. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  3145. }
  3146. #endif
  3147. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  3148. if (tls && haveECC) {
  3149. suites->suites[idx++] = ECC_BYTE;
  3150. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  3151. }
  3152. #endif
  3153. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  3154. if (tls && haveECC && haveStaticECC) {
  3155. suites->suites[idx++] = ECC_BYTE;
  3156. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  3157. }
  3158. #endif
  3159. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  3160. #ifdef OPENSSL_EXTRA
  3161. if ((tls && haveRSA) || (tls && haveECDSAsig)) {
  3162. #else
  3163. if (tls && haveRSA) {
  3164. #endif
  3165. suites->suites[idx++] = ECC_BYTE;
  3166. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  3167. }
  3168. #endif
  3169. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  3170. if (tls && haveRSAsig && haveStaticECC) {
  3171. suites->suites[idx++] = ECC_BYTE;
  3172. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  3173. }
  3174. #endif
  3175. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  3176. #ifdef OPENSSL_EXTRA
  3177. if ((tls && haveRSA) || (tls && haveECDSAsig)) {
  3178. #else
  3179. if (tls && haveRSA) {
  3180. #endif
  3181. suites->suites[idx++] = ECC_BYTE;
  3182. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  3183. }
  3184. #endif
  3185. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  3186. if (tls && haveRSAsig && haveStaticECC) {
  3187. suites->suites[idx++] = ECC_BYTE;
  3188. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  3189. }
  3190. #endif
  3191. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  3192. if (!dtls && tls && haveRSA) {
  3193. suites->suites[idx++] = ECC_BYTE;
  3194. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  3195. }
  3196. #endif
  3197. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  3198. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  3199. suites->suites[idx++] = ECC_BYTE;
  3200. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  3201. }
  3202. #endif
  3203. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  3204. #ifdef OPENSSL_EXTRA
  3205. if ((tls && haveRSA) || (tls && haveECDSAsig)) {
  3206. #else
  3207. if (tls && haveRSA) {
  3208. #endif
  3209. suites->suites[idx++] = ECC_BYTE;
  3210. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  3211. }
  3212. #endif
  3213. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  3214. if (tls && haveRSAsig && haveStaticECC) {
  3215. suites->suites[idx++] = ECC_BYTE;
  3216. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  3217. }
  3218. #endif
  3219. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  3220. if (tls1_2 && haveECC) {
  3221. suites->suites[idx++] = ECC_BYTE;
  3222. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  3223. }
  3224. #endif
  3225. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  3226. if (tls1_2 && haveECC) {
  3227. suites->suites[idx++] = ECC_BYTE;
  3228. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  3229. }
  3230. #endif
  3231. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  3232. if (tls1_2 && haveECC) {
  3233. suites->suites[idx++] = ECC_BYTE;
  3234. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  3235. }
  3236. #endif
  3237. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  3238. if (tls1_2 && haveRSA && haveStaticRSA) {
  3239. suites->suites[idx++] = ECC_BYTE;
  3240. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  3241. }
  3242. #endif
  3243. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  3244. if (tls1_2 && haveRSA && haveStaticRSA) {
  3245. suites->suites[idx++] = ECC_BYTE;
  3246. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  3247. }
  3248. #endif
  3249. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  3250. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3251. if (tls1_2 && haveDH && haveRSA)
  3252. #else
  3253. if (tls && haveDH && haveRSA)
  3254. #endif
  3255. {
  3256. suites->suites[idx++] = CIPHER_BYTE;
  3257. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  3258. }
  3259. #endif
  3260. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  3261. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3262. if (tls1_2 && haveDH && haveRSA)
  3263. #else
  3264. if (tls && haveDH && haveRSA)
  3265. #endif
  3266. {
  3267. suites->suites[idx++] = CIPHER_BYTE;
  3268. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  3269. }
  3270. #endif
  3271. /* Place as higher priority for MYSQL testing */
  3272. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  3273. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  3274. if (tls && haveDH && haveRSA) {
  3275. suites->suites[idx++] = CIPHER_BYTE;
  3276. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  3277. }
  3278. #endif
  3279. #endif
  3280. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  3281. if (tls && haveDH && haveRSA) {
  3282. suites->suites[idx++] = CIPHER_BYTE;
  3283. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  3284. }
  3285. #endif
  3286. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  3287. if (tls && haveDH && haveRSA) {
  3288. suites->suites[idx++] = CIPHER_BYTE;
  3289. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  3290. }
  3291. #endif
  3292. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  3293. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3294. if (tls1_2 && haveRSA && haveStaticRSA)
  3295. #else
  3296. if (tls && haveRSA && haveStaticRSA)
  3297. #endif
  3298. {
  3299. suites->suites[idx++] = CIPHER_BYTE;
  3300. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  3301. }
  3302. #endif
  3303. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  3304. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3305. if (tls1_2 && haveRSA && haveStaticRSA)
  3306. #else
  3307. if (tls && haveRSA && haveStaticRSA)
  3308. #endif
  3309. {
  3310. suites->suites[idx++] = CIPHER_BYTE;
  3311. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  3312. }
  3313. #endif
  3314. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  3315. if (tls && haveRSA && haveStaticRSA) {
  3316. suites->suites[idx++] = CIPHER_BYTE;
  3317. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  3318. }
  3319. #endif
  3320. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  3321. if (tls && haveRSA && haveStaticRSA) {
  3322. suites->suites[idx++] = CIPHER_BYTE;
  3323. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  3324. }
  3325. #endif
  3326. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3327. if (tls1_2 && haveECC) {
  3328. suites->suites[idx++] = CHACHA_BYTE;
  3329. suites->suites[idx++] =
  3330. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3331. }
  3332. #endif
  3333. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3334. #ifdef OPENSSL_EXTRA
  3335. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  3336. #else
  3337. if (tls1_2 && haveRSA) {
  3338. #endif
  3339. suites->suites[idx++] = CHACHA_BYTE;
  3340. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3341. }
  3342. #endif
  3343. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3344. #ifdef OPENSSL_EXTRA
  3345. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  3346. #else
  3347. if (tls1_2 && haveRSA) {
  3348. #endif
  3349. suites->suites[idx++] = CHACHA_BYTE;
  3350. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3351. }
  3352. #endif
  3353. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  3354. if (tls && haveECC && haveNull) {
  3355. suites->suites[idx++] = ECC_BYTE;
  3356. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  3357. }
  3358. #endif
  3359. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  3360. if (tls && haveRSA && haveNull && haveStaticRSA) {
  3361. suites->suites[idx++] = CIPHER_BYTE;
  3362. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  3363. }
  3364. #endif
  3365. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  3366. if (tls && haveRSA && haveNull && haveStaticRSA) {
  3367. suites->suites[idx++] = CIPHER_BYTE;
  3368. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  3369. }
  3370. #endif
  3371. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  3372. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3373. if (tls1_2 && haveRSA && haveNull && haveStaticRSA)
  3374. #else
  3375. if (tls && haveRSA && haveNull && haveStaticRSA)
  3376. #endif
  3377. {
  3378. suites->suites[idx++] = CIPHER_BYTE;
  3379. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  3380. }
  3381. #endif
  3382. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  3383. if (tls && havePSK) {
  3384. suites->suites[idx++] = CIPHER_BYTE;
  3385. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  3386. }
  3387. #endif
  3388. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  3389. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3390. if (tls1_2 && haveDH && havePSK)
  3391. #else
  3392. if (tls && haveDH && havePSK)
  3393. #endif
  3394. {
  3395. suites->suites[idx++] = CIPHER_BYTE;
  3396. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  3397. }
  3398. #endif
  3399. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  3400. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3401. if (tls1_2 && havePSK)
  3402. #else
  3403. if (tls && havePSK)
  3404. #endif
  3405. {
  3406. suites->suites[idx++] = CIPHER_BYTE;
  3407. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  3408. }
  3409. #endif
  3410. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  3411. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3412. if (tls1_2 && haveDH && havePSK)
  3413. #else
  3414. if (tls && haveDH && havePSK)
  3415. #endif
  3416. {
  3417. suites->suites[idx++] = CIPHER_BYTE;
  3418. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  3419. }
  3420. #endif
  3421. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  3422. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3423. if (tls1_2 && havePSK)
  3424. #else
  3425. if (tls1 && havePSK)
  3426. #endif
  3427. {
  3428. suites->suites[idx++] = CIPHER_BYTE;
  3429. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  3430. }
  3431. #endif
  3432. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  3433. if (tls && havePSK) {
  3434. suites->suites[idx++] = CIPHER_BYTE;
  3435. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  3436. }
  3437. #endif
  3438. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  3439. if (tls && haveDH && havePSK) {
  3440. suites->suites[idx++] = ECC_BYTE;
  3441. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  3442. }
  3443. #endif
  3444. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  3445. if (tls && haveDH && havePSK) {
  3446. suites->suites[idx++] = ECC_BYTE;
  3447. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  3448. }
  3449. #endif
  3450. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  3451. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3452. if (tls1_2 && havePSK)
  3453. #else
  3454. if (tls && havePSK)
  3455. #endif
  3456. {
  3457. suites->suites[idx++] = CHACHA_BYTE;
  3458. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3459. }
  3460. #endif
  3461. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3462. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3463. if (tls1_2 && havePSK)
  3464. #else
  3465. if (tls && havePSK)
  3466. #endif
  3467. {
  3468. suites->suites[idx++] = CHACHA_BYTE;
  3469. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3470. }
  3471. #endif
  3472. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3473. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3474. if (tls1_2 && havePSK)
  3475. #else
  3476. if (tls && havePSK)
  3477. #endif
  3478. {
  3479. suites->suites[idx++] = CHACHA_BYTE;
  3480. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3481. }
  3482. #endif
  3483. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  3484. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3485. if (tls1_2 && havePSK)
  3486. #else
  3487. if (tls && havePSK)
  3488. #endif
  3489. {
  3490. suites->suites[idx++] = ECC_BYTE;
  3491. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  3492. }
  3493. #endif
  3494. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
  3495. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3496. if (tls1_2 && havePSK)
  3497. #else
  3498. if (tls && havePSK)
  3499. #endif
  3500. {
  3501. suites->suites[idx++] = ECDHE_PSK_BYTE;
  3502. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256;
  3503. }
  3504. #endif
  3505. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  3506. if (tls && havePSK) {
  3507. suites->suites[idx++] = ECC_BYTE;
  3508. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  3509. }
  3510. #endif
  3511. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  3512. if (tls && havePSK) {
  3513. suites->suites[idx++] = ECC_BYTE;
  3514. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  3515. }
  3516. #endif
  3517. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  3518. if (tls && havePSK) {
  3519. suites->suites[idx++] = ECC_BYTE;
  3520. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  3521. }
  3522. #endif
  3523. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  3524. if (tls && havePSK) {
  3525. suites->suites[idx++] = ECC_BYTE;
  3526. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  3527. }
  3528. #endif
  3529. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  3530. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3531. if (tls1_2 && haveDH && havePSK)
  3532. #else
  3533. if (tls && haveDH && havePSK && haveNull)
  3534. #endif
  3535. {
  3536. suites->suites[idx++] = CIPHER_BYTE;
  3537. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  3538. }
  3539. #endif
  3540. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  3541. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3542. if (tls1_2 && havePSK && haveNull)
  3543. #else
  3544. if (tls && havePSK && haveNull)
  3545. #endif
  3546. {
  3547. suites->suites[idx++] = CIPHER_BYTE;
  3548. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  3549. }
  3550. #endif
  3551. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  3552. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3553. if (tls1_2 && havePSK && haveNull)
  3554. #else
  3555. if (tls && havePSK && haveNull)
  3556. #endif
  3557. {
  3558. suites->suites[idx++] = ECC_BYTE;
  3559. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  3560. }
  3561. #endif
  3562. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  3563. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3564. if (tls1_2 && haveDH && havePSK && haveNull)
  3565. #else
  3566. if (tls && haveDH && havePSK && haveNull)
  3567. #endif
  3568. {
  3569. suites->suites[idx++] = CIPHER_BYTE;
  3570. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  3571. }
  3572. #endif
  3573. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  3574. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3575. if (tls1_2 && havePSK && haveNull)
  3576. #else
  3577. if (tls && havePSK && haveNull)
  3578. #endif
  3579. {
  3580. suites->suites[idx++] = CIPHER_BYTE;
  3581. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  3582. }
  3583. #endif
  3584. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  3585. if (tls && havePSK && haveNull) {
  3586. suites->suites[idx++] = CIPHER_BYTE;
  3587. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  3588. }
  3589. #endif
  3590. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  3591. if (!dtls && haveRSA && haveStaticRSA) {
  3592. suites->suites[idx++] = CIPHER_BYTE;
  3593. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  3594. }
  3595. #endif
  3596. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  3597. if (!dtls && haveRSA && haveStaticRSA) {
  3598. suites->suites[idx++] = CIPHER_BYTE;
  3599. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  3600. }
  3601. #endif
  3602. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  3603. if (haveRSA && haveStaticRSA) {
  3604. suites->suites[idx++] = CIPHER_BYTE;
  3605. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  3606. }
  3607. #endif
  3608. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  3609. if (tls && haveRSA && haveStaticRSA) {
  3610. suites->suites[idx++] = CIPHER_BYTE;
  3611. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3612. }
  3613. #endif
  3614. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  3615. if (tls && haveDH && haveRSA && haveStaticRSA) {
  3616. suites->suites[idx++] = CIPHER_BYTE;
  3617. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3618. }
  3619. #endif
  3620. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  3621. if (tls && haveRSA && haveStaticRSA) {
  3622. suites->suites[idx++] = CIPHER_BYTE;
  3623. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3624. }
  3625. #endif
  3626. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  3627. if (tls && haveDH && haveRSA && haveStaticRSA) {
  3628. suites->suites[idx++] = CIPHER_BYTE;
  3629. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3630. }
  3631. #endif
  3632. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3633. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3634. if (tls1_2 && haveRSA && haveStaticRSA)
  3635. #else
  3636. if (tls && haveRSA && haveStaticRSA)
  3637. #endif
  3638. {
  3639. suites->suites[idx++] = CIPHER_BYTE;
  3640. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3641. }
  3642. #endif
  3643. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3644. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3645. if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
  3646. #else
  3647. if (tls && haveDH && haveRSA && haveStaticRSA)
  3648. #endif
  3649. {
  3650. suites->suites[idx++] = CIPHER_BYTE;
  3651. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3652. }
  3653. #endif
  3654. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3655. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3656. if (tls1_2 && haveRSA && haveStaticRSA)
  3657. #else
  3658. if (tls && haveRSA && haveStaticRSA)
  3659. #endif
  3660. {
  3661. suites->suites[idx++] = CIPHER_BYTE;
  3662. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3663. }
  3664. #endif
  3665. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3666. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3667. if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
  3668. #else
  3669. if (tls && haveDH && haveRSA && haveStaticRSA)
  3670. #endif
  3671. {
  3672. suites->suites[idx++] = CIPHER_BYTE;
  3673. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3674. }
  3675. #endif
  3676. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  3677. if (tls && haveECC) {
  3678. suites->suites[idx++] = SM_BYTE;
  3679. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3;
  3680. }
  3681. #endif
  3682. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  3683. if (tls && haveECC) {
  3684. suites->suites[idx++] = SM_BYTE;
  3685. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3;
  3686. }
  3687. #endif
  3688. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  3689. if (tls && haveECC) {
  3690. suites->suites[idx++] = SM_BYTE;
  3691. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3;
  3692. }
  3693. #endif
  3694. #endif /* !WOLFSSL_NO_TLS12 */
  3695. suites->suiteSz = idx;
  3696. if (suites->hashSigAlgoSz == 0) {
  3697. int haveSig = 0;
  3698. haveSig |= (haveRSAsig | haveRSA) ? SIG_RSA : 0;
  3699. haveSig |= (haveECDSAsig | haveECC) ? SIG_ECDSA : 0;
  3700. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  3701. haveSig |= (haveECDSAsig | haveECC) ? SIG_SM2 : 0;
  3702. #endif
  3703. haveSig |= haveFalconSig ? SIG_FALCON : 0;
  3704. haveSig |= haveDilithiumSig ? SIG_DILITHIUM : 0;
  3705. haveSig &= ~SIG_ANON;
  3706. InitSuitesHashSigAlgo_ex2(suites->hashSigAlgo, haveSig, tls1_2, keySz,
  3707. &suites->hashSigAlgoSz);
  3708. }
  3709. }
  3710. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  3711. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  3712. /* Decode the signature algorithm.
  3713. *
  3714. * input The encoded signature algorithm.
  3715. * hashalgo The hash algorithm.
  3716. * hsType The signature type.
  3717. */
  3718. static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  3719. {
  3720. *hsType = invalid_sa_algo;
  3721. switch (input[0]) {
  3722. case NEW_SA_MAJOR:
  3723. #ifdef HAVE_ED25519
  3724. /* ED25519: 0x0807 */
  3725. if (input[1] == ED25519_SA_MINOR) {
  3726. *hsType = ed25519_sa_algo;
  3727. /* Hash performed as part of sign/verify operation. */
  3728. *hashAlgo = sha512_mac;
  3729. }
  3730. else
  3731. #endif
  3732. #ifdef HAVE_ED448
  3733. /* ED448: 0x0808 */
  3734. if (input[1] == ED448_SA_MINOR) {
  3735. *hsType = ed448_sa_algo;
  3736. /* Hash performed as part of sign/verify operation. */
  3737. *hashAlgo = sha512_mac;
  3738. }
  3739. else
  3740. #endif
  3741. #ifdef WC_RSA_PSS
  3742. /* PSS PSS signatures: 0x080[9-b] */
  3743. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  3744. *hsType = rsa_pss_pss_algo;
  3745. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  3746. }
  3747. else
  3748. #endif
  3749. {
  3750. *hsType = input[0];
  3751. *hashAlgo = input[1];
  3752. }
  3753. break;
  3754. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  3755. case SM2_SA_MAJOR:
  3756. /* SM2: 0x0708 */
  3757. if (input[1] == SM2_SA_MINOR) {
  3758. *hsType = sm2_sa_algo;
  3759. /* Hash performed as part of sign/verify operation. */
  3760. *hashAlgo = sm3_mac;
  3761. }
  3762. break;
  3763. #endif
  3764. #ifdef HAVE_PQC
  3765. case PQC_SA_MAJOR:
  3766. /* Hash performed as part of sign/verify operation. */
  3767. #ifdef HAVE_FALCON
  3768. if (input[1] == FALCON_LEVEL1_SA_MINOR) {
  3769. *hsType = falcon_level1_sa_algo;
  3770. *hashAlgo = sha512_mac;
  3771. }
  3772. else if (input[1] == FALCON_LEVEL5_SA_MINOR) {
  3773. *hsType = falcon_level5_sa_algo;
  3774. *hashAlgo = sha512_mac;
  3775. }
  3776. #endif /* HAVE_FALCON */
  3777. #ifdef HAVE_DILITHIUM
  3778. if (input[1] == DILITHIUM_LEVEL2_SA_MINOR) {
  3779. *hsType = dilithium_level2_sa_algo;
  3780. *hashAlgo = sha512_mac;
  3781. }
  3782. else if (input[1] == DILITHIUM_LEVEL3_SA_MINOR) {
  3783. *hsType = dilithium_level3_sa_algo;
  3784. *hashAlgo = sha512_mac;
  3785. }
  3786. else if (input[1] == DILITHIUM_LEVEL5_SA_MINOR) {
  3787. *hsType = dilithium_level5_sa_algo;
  3788. *hashAlgo = sha512_mac;
  3789. }
  3790. #endif /* HAVE_DILITHIUM */
  3791. break;
  3792. #endif
  3793. default:
  3794. *hashAlgo = input[0];
  3795. *hsType = input[1];
  3796. break;
  3797. }
  3798. }
  3799. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  3800. #ifndef WOLFSSL_NO_TLS12
  3801. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3802. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  3803. defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
  3804. static enum wc_HashType HashAlgoToType(int hashAlgo)
  3805. {
  3806. switch (hashAlgo) {
  3807. #ifdef WOLFSSL_SHA512
  3808. case sha512_mac:
  3809. return WC_HASH_TYPE_SHA512;
  3810. #endif
  3811. #ifdef WOLFSSL_SHA384
  3812. case sha384_mac:
  3813. return WC_HASH_TYPE_SHA384;
  3814. #endif
  3815. #ifdef WOLFSSL_SM3
  3816. case sm3_mac:
  3817. return WC_HASH_TYPE_SM3;
  3818. #endif
  3819. #ifndef NO_SHA256
  3820. case sha256_mac:
  3821. return WC_HASH_TYPE_SHA256;
  3822. #endif
  3823. #ifdef WOLFSSL_SHA224
  3824. case sha224_mac:
  3825. return WC_HASH_TYPE_SHA224;
  3826. #endif
  3827. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  3828. defined(WOLFSSL_ALLOW_TLS_SHA1))
  3829. case sha_mac:
  3830. return WC_HASH_TYPE_SHA;
  3831. #endif
  3832. default:
  3833. WOLFSSL_MSG("Bad hash sig algo");
  3834. break;
  3835. }
  3836. return WC_HASH_TYPE_NONE;
  3837. }
  3838. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  3839. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3840. #endif /* !WOLFSSL_NO_TLS12 */
  3841. #ifndef NO_CERTS
  3842. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
  3843. {
  3844. (void)dynamicFlag;
  3845. if (name != NULL) {
  3846. XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME));
  3847. name->name = name->staticName;
  3848. name->heap = heap;
  3849. name->dynamicName = 0;
  3850. }
  3851. }
  3852. void FreeX509Name(WOLFSSL_X509_NAME* name)
  3853. {
  3854. if (name != NULL) {
  3855. if (name->dynamicName) {
  3856. XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
  3857. name->name = NULL;
  3858. }
  3859. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3860. {
  3861. int i;
  3862. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  3863. if (name->entry[i].object != NULL)
  3864. wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
  3865. if (name->entry[i].value != NULL)
  3866. wolfSSL_ASN1_STRING_free(name->entry[i].value);
  3867. XMEMSET(&name->entry[i], 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  3868. }
  3869. }
  3870. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3871. #ifdef OPENSSL_ALL
  3872. if (name->entries) {
  3873. wolfSSL_sk_X509_NAME_ENTRY_free(name->entries);
  3874. name->entries = NULL;
  3875. }
  3876. #endif
  3877. }
  3878. }
  3879. /* Initialize wolfSSL X509 type */
  3880. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  3881. {
  3882. if (x509 == NULL) {
  3883. WOLFSSL_MSG("Null parameter passed in!");
  3884. return;
  3885. }
  3886. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  3887. x509->heap = heap;
  3888. InitX509Name(&x509->issuer, 0, heap);
  3889. InitX509Name(&x509->subject, 0, heap);
  3890. x509->dynamicMemory = (byte)dynamicFlag;
  3891. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  3892. {
  3893. int ret;
  3894. wolfSSL_RefInit(&x509->ref, &ret);
  3895. (void)ret;
  3896. }
  3897. #endif
  3898. }
  3899. /* Free wolfSSL X509 type */
  3900. void FreeX509(WOLFSSL_X509* x509)
  3901. {
  3902. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL) \
  3903. && defined( WOLFSSL_CUSTOM_OID)
  3904. int idx;
  3905. #endif /* WOLFSSL_CERT_REQ && OPENSSL_ALL && WOLFSSL_CUSTOM_OID */
  3906. if (x509 == NULL)
  3907. return;
  3908. FreeX509Name(&x509->issuer);
  3909. FreeX509Name(&x509->subject);
  3910. if (x509->pubKey.buffer) {
  3911. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  3912. x509->pubKey.buffer = NULL;
  3913. }
  3914. FreeDer(&x509->derCert);
  3915. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  3916. x509->sig.buffer = NULL;
  3917. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3918. if (x509->authKeyIdSrc != NULL) {
  3919. XFREE(x509->authKeyIdSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3920. }
  3921. else {
  3922. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3923. }
  3924. x509->authKeyIdSrc = NULL;
  3925. x509->authKeyId = NULL;
  3926. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3927. x509->subjKeyId = NULL;
  3928. if (x509->authInfo != NULL) {
  3929. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3930. x509->authInfo = NULL;
  3931. }
  3932. if (x509->rawCRLInfo != NULL) {
  3933. XFREE(x509->rawCRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3934. x509->rawCRLInfo = NULL;
  3935. }
  3936. if (x509->CRLInfo != NULL) {
  3937. XFREE(x509->CRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3938. x509->CRLInfo = NULL;
  3939. }
  3940. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  3941. defined(WOLFSSL_QT)
  3942. if (x509->authInfoCaIssuer != NULL) {
  3943. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3944. }
  3945. if (x509->ext_sk != NULL) {
  3946. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk, NULL);
  3947. }
  3948. if (x509->ext_sk_full != NULL) {
  3949. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk_full, NULL);
  3950. }
  3951. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  3952. #ifdef OPENSSL_EXTRA
  3953. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  3954. if (x509->serialNumber != NULL) {
  3955. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  3956. }
  3957. #endif
  3958. if (x509->extKeyUsageSrc != NULL) {
  3959. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3960. x509->extKeyUsageSrc= NULL;
  3961. }
  3962. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3963. #if defined(OPENSSL_ALL)
  3964. if (x509->algor.algorithm) {
  3965. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  3966. x509->algor.algorithm = NULL;
  3967. }
  3968. if (x509->key.algor) {
  3969. wolfSSL_X509_ALGOR_free(x509->key.algor);
  3970. x509->key.algor = NULL;
  3971. }
  3972. if (x509->key.pkey) {
  3973. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  3974. x509->key.pkey = NULL;
  3975. }
  3976. if (x509->subjAltNameSrc != NULL) {
  3977. XFREE(x509->subjAltNameSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3978. x509->subjAltNameSrc= NULL;
  3979. }
  3980. #endif /* OPENSSL_ALL */
  3981. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
  3982. if (x509->reqAttributes) {
  3983. wolfSSL_sk_pop_free(x509->reqAttributes, NULL);
  3984. }
  3985. #ifdef WOLFSSL_CUSTOM_OID
  3986. for (idx = 0; idx < x509->customExtCount; idx++) {
  3987. XFREE(x509->custom_exts[idx].oid, x509->heap,
  3988. DYNAMIC_TYPE_X509_EXT);
  3989. XFREE(x509->custom_exts[idx].val, x509->heap,
  3990. DYNAMIC_TYPE_X509_EXT);
  3991. }
  3992. #endif /* WOLFSSL_CUSTOM_OID */
  3993. #endif /* WOLFSSL_CERT_REQ && OPENSSL_ALL */
  3994. if (x509->altNames) {
  3995. FreeAltNames(x509->altNames, x509->heap);
  3996. x509->altNames = NULL;
  3997. }
  3998. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3999. wolfSSL_RefFree(&x509->ref);
  4000. #endif
  4001. }
  4002. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  4003. #if !defined(WOLFSSL_NO_TLS12)
  4004. /* Encode the signature algorithm into buffer.
  4005. *
  4006. * hashalgo The hash algorithm.
  4007. * hsType The signature type.
  4008. * output The buffer to encode into.
  4009. */
  4010. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  4011. {
  4012. switch (hsType) {
  4013. #ifdef HAVE_ECC
  4014. case ecc_dsa_sa_algo:
  4015. output[0] = hashAlgo;
  4016. output[1] = ecc_dsa_sa_algo;
  4017. break;
  4018. #endif
  4019. #ifdef HAVE_ED25519
  4020. case ed25519_sa_algo:
  4021. output[0] = ED25519_SA_MAJOR;
  4022. output[1] = ED25519_SA_MINOR;
  4023. (void)hashAlgo;
  4024. break;
  4025. #endif
  4026. #ifdef HAVE_ED448
  4027. case ed448_sa_algo:
  4028. output[0] = ED448_SA_MAJOR;
  4029. output[1] = ED448_SA_MINOR;
  4030. (void)hashAlgo;
  4031. break;
  4032. #endif
  4033. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  4034. case sm2_sa_algo:
  4035. output[0] = SM2_SA_MAJOR;
  4036. output[1] = SM2_SA_MINOR;
  4037. (void)hashAlgo;
  4038. break;
  4039. #endif
  4040. #ifndef NO_RSA
  4041. case rsa_sa_algo:
  4042. output[0] = hashAlgo;
  4043. output[1] = rsa_sa_algo;
  4044. break;
  4045. #ifdef WC_RSA_PSS
  4046. /* PSS signatures: 0x080[4-6] */
  4047. case rsa_pss_sa_algo:
  4048. output[0] = rsa_pss_sa_algo;
  4049. output[1] = hashAlgo;
  4050. break;
  4051. #endif
  4052. #endif
  4053. default:
  4054. break;
  4055. }
  4056. (void)hashAlgo;
  4057. (void)output;
  4058. }
  4059. #endif
  4060. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  4061. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  4062. {
  4063. switch (hashAlgo) {
  4064. #ifndef NO_SHA
  4065. case sha_mac:
  4066. ssl->options.dontFreeDigest = 1;
  4067. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  4068. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  4069. break;
  4070. #endif /* !NO_SHA */
  4071. #ifndef NO_SHA256
  4072. case sha256_mac:
  4073. ssl->options.dontFreeDigest = 1;
  4074. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  4075. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  4076. break;
  4077. #endif /* !NO_SHA256 */
  4078. #ifdef WOLFSSL_SM3
  4079. case sm3_mac:
  4080. ssl->options.dontFreeDigest = 1;
  4081. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sm3;
  4082. ssl->buffers.digest.length = WC_SM3_DIGEST_SIZE;
  4083. break;
  4084. #endif /* WOLFSSL_SM2 */
  4085. #ifdef WOLFSSL_SHA384
  4086. case sha384_mac:
  4087. ssl->options.dontFreeDigest = 1;
  4088. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  4089. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  4090. break;
  4091. #endif /* WOLFSSL_SHA384 */
  4092. #ifdef WOLFSSL_SHA512
  4093. case sha512_mac:
  4094. ssl->options.dontFreeDigest = 1;
  4095. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  4096. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  4097. break;
  4098. #endif /* WOLFSSL_SHA512 */
  4099. default:
  4100. break;
  4101. } /* switch */
  4102. }
  4103. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  4104. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  4105. #endif /* !NO_CERTS */
  4106. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  4107. static word32 MacSize(WOLFSSL* ssl)
  4108. {
  4109. #ifdef HAVE_TRUNCATED_HMAC
  4110. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  4111. : ssl->specs.hash_size;
  4112. #else
  4113. word32 digestSz = ssl->specs.hash_size;
  4114. #endif
  4115. return digestSz;
  4116. }
  4117. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  4118. #ifndef NO_RSA
  4119. #if !defined(WOLFSSL_NO_TLS12) || \
  4120. (defined(WC_RSA_PSS) && defined(HAVE_PK_CALLBACKS))
  4121. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  4122. static int TypeHash(int hashAlgo)
  4123. {
  4124. switch (hashAlgo) {
  4125. #ifdef WOLFSSL_SHA512
  4126. case sha512_mac:
  4127. return SHA512h;
  4128. #endif
  4129. #ifdef WOLFSSL_SHA384
  4130. case sha384_mac:
  4131. return SHA384h;
  4132. #endif
  4133. #ifndef NO_SHA256
  4134. case sha256_mac:
  4135. return SHA256h;
  4136. #endif
  4137. #ifdef WOLFSSL_SHA224
  4138. case sha224_mac:
  4139. return SHA224h;
  4140. #endif
  4141. #ifndef NO_SHA
  4142. case sha_mac:
  4143. return SHAh;
  4144. #endif
  4145. default:
  4146. break;
  4147. }
  4148. return 0;
  4149. }
  4150. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  4151. #endif /* !WOLFSSL_NO_TLS12 */
  4152. #if defined(WC_RSA_PSS)
  4153. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  4154. {
  4155. switch (hashAlgo) {
  4156. #ifdef WOLFSSL_SHA512
  4157. case sha512_mac:
  4158. *hashType = WC_HASH_TYPE_SHA512;
  4159. if (mgf != NULL)
  4160. *mgf = WC_MGF1SHA512;
  4161. break;
  4162. #endif
  4163. #ifdef WOLFSSL_SHA384
  4164. case sha384_mac:
  4165. *hashType = WC_HASH_TYPE_SHA384;
  4166. if (mgf != NULL)
  4167. *mgf = WC_MGF1SHA384;
  4168. break;
  4169. #endif
  4170. #ifndef NO_SHA256
  4171. case sha256_mac:
  4172. *hashType = WC_HASH_TYPE_SHA256;
  4173. if (mgf != NULL)
  4174. *mgf = WC_MGF1SHA256;
  4175. break;
  4176. #endif
  4177. default:
  4178. return BAD_FUNC_ARG;
  4179. }
  4180. return 0;
  4181. }
  4182. #endif
  4183. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  4184. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4185. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  4186. DerBuffer* keyBufInfo)
  4187. {
  4188. int ret;
  4189. #ifdef HAVE_PK_CALLBACKS
  4190. const byte* keyBuf = NULL;
  4191. word32 keySz = 0;
  4192. if (keyBufInfo) {
  4193. keyBuf = keyBufInfo->buffer;
  4194. keySz = keyBufInfo->length;
  4195. }
  4196. #endif
  4197. (void)ssl;
  4198. (void)keyBufInfo;
  4199. (void)sigAlgo;
  4200. (void)hashAlgo;
  4201. WOLFSSL_ENTER("RsaSign");
  4202. #ifdef WOLFSSL_ASYNC_CRYPT
  4203. /* initialize event */
  4204. if (key) {
  4205. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4206. if (ret != 0)
  4207. return ret;
  4208. }
  4209. #endif
  4210. #if defined(WC_RSA_PSS)
  4211. if (sigAlgo == rsa_pss_sa_algo) {
  4212. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4213. int mgf = 0;
  4214. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4215. if (ret != 0)
  4216. return ret;
  4217. #if defined(HAVE_PK_CALLBACKS)
  4218. if (ssl->ctx->RsaPssSignCb) {
  4219. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  4220. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  4221. TypeHash(hashAlgo), mgf,
  4222. keyBuf, keySz, ctx);
  4223. }
  4224. else
  4225. #endif
  4226. {
  4227. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  4228. ssl->rng);
  4229. }
  4230. }
  4231. else
  4232. #endif
  4233. #if defined(HAVE_PK_CALLBACKS)
  4234. if (ssl->ctx->RsaSignCb) {
  4235. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  4236. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4237. ctx);
  4238. }
  4239. else
  4240. #endif /*HAVE_PK_CALLBACKS */
  4241. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  4242. /* Handle async pending response */
  4243. #ifdef WOLFSSL_ASYNC_CRYPT
  4244. if (key && ret == WC_PENDING_E) {
  4245. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4246. }
  4247. #endif /* WOLFSSL_ASYNC_CRYPT */
  4248. /* For positive response return in outSz */
  4249. if (ret > 0) {
  4250. *outSz = ret;
  4251. ret = 0;
  4252. }
  4253. WOLFSSL_LEAVE("RsaSign", ret);
  4254. return ret;
  4255. }
  4256. #endif
  4257. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  4258. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  4259. {
  4260. int ret = SIG_VERIFY_E;
  4261. #ifdef HAVE_PK_CALLBACKS
  4262. const byte* keyBuf = NULL;
  4263. word32 keySz = 0;
  4264. if (keyBufInfo) {
  4265. keyBuf = keyBufInfo->buffer;
  4266. keySz = keyBufInfo->length;
  4267. }
  4268. #endif
  4269. (void)ssl;
  4270. (void)keyBufInfo;
  4271. (void)sigAlgo;
  4272. (void)hashAlgo;
  4273. WOLFSSL_ENTER("RsaVerify");
  4274. #ifdef WOLFSSL_ASYNC_CRYPT
  4275. /* initialize event */
  4276. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4277. if (ret != 0)
  4278. return ret;
  4279. #endif
  4280. #if defined(WC_RSA_PSS)
  4281. if (sigAlgo == rsa_pss_sa_algo) {
  4282. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4283. int mgf = 0;
  4284. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4285. if (ret != 0)
  4286. return ret;
  4287. #ifdef HAVE_PK_CALLBACKS
  4288. if (ssl->ctx->RsaPssVerifyCb) {
  4289. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  4290. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  4291. TypeHash(hashAlgo), mgf,
  4292. keyBuf, keySz, ctx);
  4293. }
  4294. else
  4295. #endif /*HAVE_PK_CALLBACKS */
  4296. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  4297. }
  4298. else
  4299. #endif
  4300. #ifdef HAVE_PK_CALLBACKS
  4301. if (ssl->ctx->RsaVerifyCb) {
  4302. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  4303. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  4304. }
  4305. #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  4306. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4307. else
  4308. #else
  4309. if (!ssl->ctx->RsaVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4310. #endif
  4311. #endif /*HAVE_PK_CALLBACKS */
  4312. {
  4313. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  4314. }
  4315. /* Handle async pending response */
  4316. #ifdef WOLFSSL_ASYNC_CRYPT
  4317. if (ret == WC_PENDING_E) {
  4318. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4319. }
  4320. #endif /* WOLFSSL_ASYNC_CRYPT */
  4321. WOLFSSL_LEAVE("RsaVerify", ret);
  4322. return ret;
  4323. }
  4324. /* Verify RSA signature, 0 on success */
  4325. /* This function is used to check the sign result */
  4326. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  4327. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  4328. DerBuffer* keyBufInfo)
  4329. {
  4330. byte* out = NULL; /* inline result */
  4331. int ret;
  4332. #ifdef HAVE_PK_CALLBACKS
  4333. const byte* keyBuf = NULL;
  4334. word32 keySz = 0;
  4335. if (keyBufInfo) {
  4336. keyBuf = keyBufInfo->buffer;
  4337. keySz = keyBufInfo->length;
  4338. }
  4339. #endif
  4340. (void)ssl;
  4341. (void)keyBufInfo;
  4342. (void)sigAlgo;
  4343. (void)hashAlgo;
  4344. WOLFSSL_ENTER("VerifyRsaSign");
  4345. if (verifySig == NULL || plain == NULL) {
  4346. return BAD_FUNC_ARG;
  4347. }
  4348. if (sigSz > ENCRYPT_LEN) {
  4349. WOLFSSL_MSG("Signature buffer too big");
  4350. return BUFFER_E;
  4351. }
  4352. #ifdef WOLFSSL_ASYNC_CRYPT
  4353. /* initialize event */
  4354. if (key) {
  4355. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4356. if (ret != 0)
  4357. return ret;
  4358. }
  4359. #endif
  4360. #if defined(WC_RSA_PSS)
  4361. if (sigAlgo == rsa_pss_sa_algo) {
  4362. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4363. int mgf = 0;
  4364. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4365. if (ret != 0)
  4366. return ret;
  4367. #ifdef HAVE_PK_CALLBACKS
  4368. if (ssl->ctx->RsaPssSignCheckCb) {
  4369. /* The key buffer includes private/public portion,
  4370. but only public is used */
  4371. /* If HSM hardware is checking the signature result you can
  4372. optionally skip the sign check and return 0 */
  4373. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  4374. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  4375. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  4376. TypeHash(hashAlgo), mgf,
  4377. keyBuf, keySz, ctx);
  4378. if (ret > 0) {
  4379. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  4380. hashType);
  4381. if (ret != 0) {
  4382. ret = VERIFY_CERT_ERROR;
  4383. WOLFSSL_ERROR_VERBOSE(ret);
  4384. }
  4385. }
  4386. }
  4387. else
  4388. #endif /* HAVE_PK_CALLBACKS */
  4389. {
  4390. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  4391. key);
  4392. if (ret > 0) {
  4393. #ifdef HAVE_SELFTEST
  4394. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  4395. hashType);
  4396. #else
  4397. ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret,
  4398. hashType, -1,
  4399. mp_count_bits(&key->n));
  4400. #endif
  4401. if (ret != 0) {
  4402. ret = VERIFY_CERT_ERROR;
  4403. WOLFSSL_ERROR_VERBOSE(ret);
  4404. }
  4405. }
  4406. }
  4407. }
  4408. else
  4409. #endif /* WC_RSA_PSS */
  4410. {
  4411. #ifdef HAVE_PK_CALLBACKS
  4412. if (ssl->ctx->RsaSignCheckCb) {
  4413. /* The key buffer includes private/public portion,
  4414. but only public is used */
  4415. /* If HSM hardware is checking the signature result you can
  4416. optionally skip the sign check and return 0 */
  4417. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  4418. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  4419. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  4420. keyBuf, keySz, ctx);
  4421. }
  4422. else
  4423. #endif /* HAVE_PK_CALLBACKS */
  4424. {
  4425. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  4426. }
  4427. if (ret > 0) {
  4428. if (ret != (int)plainSz || !out ||
  4429. XMEMCMP(plain, out, plainSz) != 0) {
  4430. WOLFSSL_MSG("RSA Signature verification failed");
  4431. ret = RSA_SIGN_FAULT;
  4432. WOLFSSL_ERROR_VERBOSE(ret);
  4433. }
  4434. else {
  4435. ret = 0; /* RSA reset */
  4436. }
  4437. }
  4438. }
  4439. /* Handle async pending response */
  4440. #ifdef WOLFSSL_ASYNC_CRYPT
  4441. if (key && ret == WC_PENDING_E) {
  4442. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4443. }
  4444. #endif /* WOLFSSL_ASYNC_CRYPT */
  4445. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  4446. return ret;
  4447. }
  4448. #ifndef WOLFSSL_NO_TLS12
  4449. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  4450. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  4451. RsaKey* key, DerBuffer* keyBufInfo)
  4452. {
  4453. byte *outTmp;
  4454. byte mask;
  4455. int ret;
  4456. #ifdef HAVE_PK_CALLBACKS
  4457. const byte* keyBuf = NULL;
  4458. word32 keySz = 0;
  4459. if (keyBufInfo) {
  4460. keyBuf = keyBufInfo->buffer;
  4461. keySz = keyBufInfo->length;
  4462. }
  4463. #endif
  4464. (void)ssl;
  4465. (void)keyBufInfo;
  4466. WOLFSSL_ENTER("RsaDec");
  4467. outTmp = *out;
  4468. #ifdef WOLFSSL_ASYNC_CRYPT
  4469. /* initialize event */
  4470. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4471. if (ret != 0)
  4472. return ret;
  4473. #endif
  4474. #ifdef HAVE_PK_CALLBACKS
  4475. if (ssl->ctx->RsaDecCb) {
  4476. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  4477. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, &outTmp, keyBuf, keySz, ctx);
  4478. }
  4479. else
  4480. #endif /* HAVE_PK_CALLBACKS */
  4481. {
  4482. #ifdef WC_RSA_BLINDING
  4483. ret = wc_RsaSetRNG(key, ssl->rng);
  4484. if (ret != 0)
  4485. return ret;
  4486. #endif
  4487. ret = wc_RsaPrivateDecryptInline(in, inSz, &outTmp, key);
  4488. }
  4489. /* Handle async pending response */
  4490. #ifdef WOLFSSL_ASYNC_CRYPT
  4491. if (ret == WC_PENDING_E) {
  4492. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4493. }
  4494. #endif /* WOLFSSL_ASYNC_CRYPT */
  4495. mask = ctMaskGT(ret, 0);
  4496. *outSz = (word32)(ret & (int)(sword8)mask);
  4497. ret &= (int)(sword8)(~mask);
  4498. /* Copy pointer */
  4499. ctMaskCopy(mask, (byte*)out, (byte*)&outTmp, sizeof(*out));
  4500. WOLFSSL_LEAVE("RsaDec", ret);
  4501. return ret;
  4502. }
  4503. #endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
  4504. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  4505. RsaKey* key, buffer* keyBufInfo)
  4506. {
  4507. int ret = BAD_FUNC_ARG;
  4508. #ifdef HAVE_PK_CALLBACKS
  4509. const byte* keyBuf = NULL;
  4510. word32 keySz = 0;
  4511. if (keyBufInfo) {
  4512. keyBuf = keyBufInfo->buffer;
  4513. keySz = keyBufInfo->length;
  4514. }
  4515. #endif
  4516. (void)ssl;
  4517. (void)keyBufInfo;
  4518. WOLFSSL_ENTER("RsaEnc");
  4519. #ifdef WOLFSSL_ASYNC_CRYPT
  4520. /* initialize event */
  4521. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4522. if (ret != 0)
  4523. return ret;
  4524. #endif
  4525. #ifdef HAVE_PK_CALLBACKS
  4526. if (ssl->ctx->RsaEncCb) {
  4527. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  4528. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  4529. }
  4530. #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  4531. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4532. else
  4533. #else
  4534. if (!ssl->ctx->RsaEncCb || ret == CRYPTOCB_UNAVAILABLE)
  4535. #endif
  4536. #endif /* HAVE_PK_CALLBACKS */
  4537. {
  4538. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  4539. }
  4540. /* Handle async pending response */
  4541. #ifdef WOLFSSL_ASYNC_CRYPT
  4542. if (ret == WC_PENDING_E) {
  4543. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4544. }
  4545. #endif /* WOLFSSL_ASYNC_CRYPT */
  4546. /* For positive response return in outSz */
  4547. if (ret > 0) {
  4548. *outSz = ret;
  4549. ret = 0;
  4550. }
  4551. WOLFSSL_LEAVE("RsaEnc", ret);
  4552. return ret;
  4553. }
  4554. #endif /* !WOLFSSL_NO_TLS12 */
  4555. #endif /* NO_RSA */
  4556. #ifdef HAVE_ECC
  4557. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4558. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  4559. {
  4560. int ret;
  4561. #ifdef HAVE_PK_CALLBACKS
  4562. const byte* keyBuf = NULL;
  4563. word32 keySz = 0;
  4564. if (keyBufInfo) {
  4565. keyBuf = keyBufInfo->buffer;
  4566. keySz = keyBufInfo->length;
  4567. }
  4568. #endif
  4569. (void)ssl;
  4570. (void)keyBufInfo;
  4571. WOLFSSL_ENTER("EccSign");
  4572. #ifdef WOLFSSL_ASYNC_CRYPT
  4573. /* initialize event */
  4574. if (key) {
  4575. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4576. if (ret != 0)
  4577. return ret;
  4578. }
  4579. #endif
  4580. #if defined(HAVE_PK_CALLBACKS)
  4581. if (ssl->ctx->EccSignCb) {
  4582. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  4583. if (ctx == NULL) {
  4584. /* Try to get the WOLFSSL_CTX EccSignCtx*/
  4585. ctx = wolfSSL_CTX_GetEccSignCtx(ssl->ctx);
  4586. }
  4587. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  4588. keySz, ctx);
  4589. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  4590. if (ret == CRYPTOCB_UNAVAILABLE) {
  4591. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4592. }
  4593. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  4594. }
  4595. else
  4596. #endif /* HAVE_PK_CALLBACKS */
  4597. {
  4598. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4599. }
  4600. /* Handle async pending response */
  4601. #ifdef WOLFSSL_ASYNC_CRYPT
  4602. if (key && ret == WC_PENDING_E) {
  4603. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4604. }
  4605. #endif /* WOLFSSL_ASYNC_CRYPT */
  4606. WOLFSSL_LEAVE("EccSign", ret);
  4607. return ret;
  4608. }
  4609. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  4610. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  4611. {
  4612. int ret = SIG_VERIFY_E;
  4613. #ifdef HAVE_PK_CALLBACKS
  4614. const byte* keyBuf = NULL;
  4615. word32 keySz = 0;
  4616. if (keyBufInfo) {
  4617. keyBuf = keyBufInfo->buffer;
  4618. keySz = keyBufInfo->length;
  4619. }
  4620. #endif
  4621. (void)ssl;
  4622. (void)keyBufInfo;
  4623. WOLFSSL_ENTER("EccVerify");
  4624. #ifdef WOLFSSL_ASYNC_CRYPT
  4625. /* initialize event */
  4626. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4627. if (ret != 0)
  4628. return ret;
  4629. #endif
  4630. #ifdef HAVE_PK_CALLBACKS
  4631. if (ssl->ctx->EccVerifyCb) {
  4632. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  4633. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4634. &ssl->eccVerifyRes, ctx);
  4635. }
  4636. #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  4637. !defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  4638. !defined(WOLFSSL_MAXQ108X)
  4639. else
  4640. #else
  4641. if (!ssl->ctx->EccVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4642. #endif
  4643. #endif /* HAVE_PK_CALLBACKS */
  4644. {
  4645. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  4646. }
  4647. /* Handle async pending response */
  4648. #ifdef WOLFSSL_ASYNC_CRYPT
  4649. if (ret == WC_PENDING_E) {
  4650. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4651. }
  4652. else
  4653. #endif /* WOLFSSL_ASYNC_CRYPT */
  4654. {
  4655. if (ret != 0 || ssl->eccVerifyRes == 0) {
  4656. if (ret == 0) {
  4657. ret = VERIFY_SIGN_ERROR;
  4658. }
  4659. WOLFSSL_ERROR_VERBOSE(ret);
  4660. }
  4661. else {
  4662. ret = 0;
  4663. }
  4664. }
  4665. WOLFSSL_LEAVE("EccVerify", ret);
  4666. return ret;
  4667. }
  4668. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  4669. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  4670. int side)
  4671. {
  4672. int ret;
  4673. #ifdef WOLFSSL_ASYNC_CRYPT
  4674. WC_ASYNC_DEV* asyncDev = NULL;
  4675. #endif
  4676. (void)ssl;
  4677. (void)pubKeyDer;
  4678. (void)pubKeySz;
  4679. (void)side;
  4680. WOLFSSL_ENTER("EccSharedSecret");
  4681. #ifdef WOLFSSL_ASYNC_CRYPT
  4682. /* initialize event */
  4683. if (priv_key != NULL) {
  4684. asyncDev = &priv_key->asyncDev;
  4685. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4686. if (ret != 0)
  4687. return ret;
  4688. }
  4689. #endif
  4690. #ifdef HAVE_PK_CALLBACKS
  4691. if (ssl->ctx->EccSharedSecretCb) {
  4692. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  4693. ecc_key* otherKey = (side == WOLFSSL_CLIENT_END) ? pub_key : priv_key;
  4694. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  4695. pubKeySz, out, outlen, side, ctx);
  4696. }
  4697. else
  4698. #endif
  4699. {
  4700. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  4701. !defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2)) && \
  4702. !defined(HAVE_SELFTEST)
  4703. ret = wc_ecc_set_rng(priv_key, ssl->rng);
  4704. if (ret == 0)
  4705. #endif
  4706. {
  4707. PRIVATE_KEY_UNLOCK();
  4708. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  4709. PRIVATE_KEY_LOCK();
  4710. }
  4711. }
  4712. /* Handle async pending response */
  4713. #ifdef WOLFSSL_ASYNC_CRYPT
  4714. if (ret == WC_PENDING_E) {
  4715. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  4716. }
  4717. #endif /* WOLFSSL_ASYNC_CRYPT */
  4718. WOLFSSL_LEAVE("EccSharedSecret", ret);
  4719. return ret;
  4720. }
  4721. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  4722. {
  4723. int ret = 0;
  4724. int keySz = 0;
  4725. int ecc_curve = ECC_CURVE_DEF;
  4726. WOLFSSL_ENTER("EccMakeKey");
  4727. #ifdef WOLFSSL_ASYNC_CRYPT
  4728. /* initialize event */
  4729. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4730. if (ret != 0)
  4731. return ret;
  4732. #endif
  4733. /* get key size */
  4734. if (peer == NULL || peer->dp == NULL) {
  4735. keySz = ssl->eccTempKeySz;
  4736. /* get curve type */
  4737. if (ssl->ecdhCurveOID > 0) {
  4738. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  4739. }
  4740. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \
  4741. (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \
  4742. defined(WOLFSSL_SM4_CCM))
  4743. if ((ssl->options.cipherSuite0 == SM_BYTE) && (0
  4744. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  4745. || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3)
  4746. #endif
  4747. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  4748. || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3)
  4749. #endif
  4750. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  4751. || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3)
  4752. #endif
  4753. )) {
  4754. keySz = 32;
  4755. ecc_curve = ECC_SM2P256V1;
  4756. }
  4757. #endif
  4758. }
  4759. else {
  4760. keySz = peer->dp->size;
  4761. ecc_curve = peer->dp->id;
  4762. }
  4763. #ifdef HAVE_PK_CALLBACKS
  4764. if (ssl->ctx->EccKeyGenCb) {
  4765. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  4766. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  4767. }
  4768. else
  4769. #endif
  4770. {
  4771. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  4772. }
  4773. /* make sure the curve is set for TLS */
  4774. if (ret == 0 && key->dp) {
  4775. ssl->ecdhCurveOID = key->dp->oidSum;
  4776. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4777. ssl->namedGroup = 0;
  4778. #endif
  4779. }
  4780. /* Handle async pending response */
  4781. #ifdef WOLFSSL_ASYNC_CRYPT
  4782. if (ret == WC_PENDING_E) {
  4783. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4784. }
  4785. #endif /* WOLFSSL_ASYNC_CRYPT */
  4786. WOLFSSL_LEAVE("EccMakeKey", ret);
  4787. return ret;
  4788. }
  4789. #endif /* HAVE_ECC */
  4790. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  4791. int Sm2wSm3Sign(WOLFSSL* ssl, const byte* id, word32 idSz, const byte* in,
  4792. word32 inSz, byte* out, word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  4793. {
  4794. int ret;
  4795. byte hash[WC_SM3_DIGEST_SIZE];
  4796. (void)ssl;
  4797. (void)keyBufInfo;
  4798. WOLFSSL_ENTER("Sm2wSm3Sign");
  4799. ret = wc_ecc_sm2_create_digest(id, idSz, in, inSz, WC_HASH_TYPE_SM3, hash,
  4800. sizeof(hash), key);
  4801. if (ret == 0) {
  4802. ret = wc_ecc_sm2_sign_hash(hash, sizeof(hash), out, outSz, ssl->rng,
  4803. key);
  4804. }
  4805. WOLFSSL_LEAVE("Sm2wSm3Sign", ret);
  4806. return ret;
  4807. }
  4808. int Sm2wSm3Verify(WOLFSSL* ssl, const byte* id, word32 idSz, const byte* sig,
  4809. word32 sigSz, const byte* msg, word32 msgSz, ecc_key* key,
  4810. buffer* keyBufInfo)
  4811. {
  4812. int ret = SIG_VERIFY_E;
  4813. byte hash[WC_SM3_DIGEST_SIZE];
  4814. (void)ssl;
  4815. (void)keyBufInfo;
  4816. WOLFSSL_ENTER("Sm2wSm3Verify");
  4817. ret = wc_ecc_sm2_create_digest(id, idSz, msg, msgSz, WC_HASH_TYPE_SM3, hash,
  4818. sizeof(hash), key);
  4819. if (ret == 0) {
  4820. ret = wc_ecc_sm2_verify_hash(sig, sigSz, hash, sizeof(hash),
  4821. &ssl->eccVerifyRes, key);
  4822. if (ret == 0 && ssl->eccVerifyRes == 0) {
  4823. ret = VERIFY_SIGN_ERROR;
  4824. }
  4825. }
  4826. if (ret != 0) {
  4827. WOLFSSL_ERROR_VERBOSE(ret);
  4828. }
  4829. WOLFSSL_LEAVE("Sm2wSm3Verify", ret);
  4830. return ret;
  4831. }
  4832. #endif /* WOLFSSL_SM2 */
  4833. #ifdef HAVE_ED25519
  4834. /* Check whether the key contains a public key.
  4835. * If not then pull it out of the leaf certificate.
  4836. *
  4837. * ssl SSL/TLS object.
  4838. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4839. * 0 on success.
  4840. */
  4841. int Ed25519CheckPubKey(WOLFSSL* ssl)
  4842. {
  4843. #ifndef HAVE_ED25519_KEY_IMPORT
  4844. (void)ssl;
  4845. return NOT_COMPILED_IN;
  4846. #else /* HAVE_ED25519_KEY_IMPORT */
  4847. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  4848. int ret = 0;
  4849. /* Public key required for signing. */
  4850. if (key != NULL && !key->pubKeySet) {
  4851. const unsigned char* pubKey;
  4852. word32 pubKeySz;
  4853. ret = wc_CertGetPubKey(ssl->buffers.certificate->buffer,
  4854. ssl->buffers.certificate->length, &pubKey, &pubKeySz);
  4855. if (ret == 0) {
  4856. ret = wc_ed25519_import_public(pubKey, pubKeySz, key);
  4857. }
  4858. }
  4859. return ret;
  4860. #endif /* HAVE_ED25519_KEY_IMPORT */
  4861. }
  4862. /* Sign the data using EdDSA and key using Ed25519.
  4863. *
  4864. * ssl SSL object.
  4865. * in Data or message to sign.
  4866. * inSz Length of the data.
  4867. * out Buffer to hold signature.
  4868. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4869. * key The private Ed25519 key data.
  4870. * keySz The length of the private key data in bytes.
  4871. * ctx The callback context.
  4872. * returns 0 on success, otherwise the value is an error.
  4873. */
  4874. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4875. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  4876. {
  4877. #ifndef HAVE_ED25519_SIGN
  4878. (void)ssl;
  4879. (void)in;
  4880. (void)inSz;
  4881. (void)out;
  4882. (void)outSz;
  4883. (void)key;
  4884. (void)keyBufInfo;
  4885. return NOT_COMPILED_IN;
  4886. #else /* HAVE_ED25519_SIGN */
  4887. int ret;
  4888. #ifdef HAVE_PK_CALLBACKS
  4889. const byte* keyBuf = NULL;
  4890. word32 keySz = 0;
  4891. if (keyBufInfo) {
  4892. keyBuf = keyBufInfo->buffer;
  4893. keySz = keyBufInfo->length;
  4894. }
  4895. #endif
  4896. (void)ssl;
  4897. (void)keyBufInfo;
  4898. WOLFSSL_ENTER("Ed25519Sign");
  4899. #ifdef WOLFSSL_ASYNC_CRYPT
  4900. /* initialize event */
  4901. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4902. if (ret != 0)
  4903. return ret;
  4904. #endif
  4905. #if defined(HAVE_PK_CALLBACKS)
  4906. if (ssl->ctx->Ed25519SignCb) {
  4907. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  4908. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  4909. keySz, ctx);
  4910. }
  4911. else
  4912. #endif /* HAVE_PK_CALLBACKS */
  4913. {
  4914. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  4915. }
  4916. /* Handle async pending response */
  4917. #ifdef WOLFSSL_ASYNC_CRYPT
  4918. if (ret == WC_PENDING_E) {
  4919. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4920. }
  4921. #endif /* WOLFSSL_ASYNC_CRYPT */
  4922. WOLFSSL_LEAVE("Ed25519Sign", ret);
  4923. return ret;
  4924. #endif /* HAVE_ED25519_SIGN */
  4925. }
  4926. /* Verify the data using EdDSA and key using Ed25519.
  4927. *
  4928. * ssl SSL object.
  4929. * in Signature data.
  4930. * inSz Length of the signature data in bytes.
  4931. * msg Message to verify.
  4932. * outSz Length of message in bytes.
  4933. * key The public Ed25519 key data.
  4934. * keySz The length of the private key data in bytes.
  4935. * ctx The callback context.
  4936. * returns 0 on success, otherwise the value is an error.
  4937. */
  4938. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4939. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  4940. {
  4941. #ifndef HAVE_ED25519_VERIFY
  4942. (void)ssl;
  4943. (void)in;
  4944. (void)inSz;
  4945. (void)msg;
  4946. (void)msgSz;
  4947. (void)key;
  4948. (void)keyBufInfo;
  4949. return NOT_COMPILED_IN;
  4950. #else /* HAVE_ED25519_VERIFY */
  4951. int ret;
  4952. #ifdef HAVE_PK_CALLBACKS
  4953. const byte* keyBuf = NULL;
  4954. word32 keySz = 0;
  4955. if (keyBufInfo) {
  4956. keyBuf = keyBufInfo->buffer;
  4957. keySz = keyBufInfo->length;
  4958. }
  4959. #endif
  4960. (void)ssl;
  4961. (void)keyBufInfo;
  4962. WOLFSSL_ENTER("Ed25519Verify");
  4963. #ifdef WOLFSSL_ASYNC_CRYPT
  4964. /* initialize event */
  4965. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4966. if (ret != 0)
  4967. return ret;
  4968. #endif
  4969. #ifdef HAVE_PK_CALLBACKS
  4970. if (ssl->ctx->Ed25519VerifyCb) {
  4971. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  4972. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  4973. keySz, &ssl->eccVerifyRes, ctx);
  4974. }
  4975. else
  4976. #endif /* HAVE_PK_CALLBACKS */
  4977. {
  4978. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  4979. &ssl->eccVerifyRes, key);
  4980. }
  4981. /* Handle async pending response */
  4982. #ifdef WOLFSSL_ASYNC_CRYPT
  4983. if (ret == WC_PENDING_E) {
  4984. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4985. }
  4986. else
  4987. #endif /* WOLFSSL_ASYNC_CRYPT */
  4988. {
  4989. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4990. }
  4991. WOLFSSL_LEAVE("Ed25519Verify", ret);
  4992. return ret;
  4993. #endif /* HAVE_ED25519_VERIFY */
  4994. }
  4995. #endif /* HAVE_ED25519 */
  4996. #ifndef WOLFSSL_NO_TLS12
  4997. #ifdef HAVE_CURVE25519
  4998. #ifdef HAVE_PK_CALLBACKS
  4999. /* Gets X25519 key for shared secret callback testing
  5000. * Client side: returns peer key
  5001. * Server side: returns private key
  5002. */
  5003. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  5004. {
  5005. int ret = NO_PEER_KEY;
  5006. struct curve25519_key* tmpKey = NULL;
  5007. if (ssl == NULL || otherKey == NULL) {
  5008. return BAD_FUNC_ARG;
  5009. }
  5010. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5011. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  5012. !ssl->peerX25519Key->dp) {
  5013. return NO_PEER_KEY;
  5014. }
  5015. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  5016. }
  5017. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  5018. if (!ssl->eccTempKeyPresent) {
  5019. return NO_PRIVATE_KEY;
  5020. }
  5021. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  5022. }
  5023. if (tmpKey) {
  5024. *otherKey = (curve25519_key *)tmpKey;
  5025. ret = 0;
  5026. }
  5027. return ret;
  5028. }
  5029. #endif /* HAVE_PK_CALLBACKS */
  5030. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  5031. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  5032. byte* out, word32* outlen, int side)
  5033. {
  5034. int ret;
  5035. (void)ssl;
  5036. (void)pubKeyDer;
  5037. (void)pubKeySz;
  5038. (void)side;
  5039. WOLFSSL_ENTER("X25519SharedSecret");
  5040. #ifdef WOLFSSL_ASYNC_CRYPT
  5041. /* initialize event */
  5042. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5043. if (ret != 0)
  5044. return ret;
  5045. #endif
  5046. #ifdef HAVE_PK_CALLBACKS
  5047. if (ssl->ctx->X25519SharedSecretCb) {
  5048. curve25519_key* otherKey = NULL;
  5049. ret = X25519GetKey(ssl, &otherKey);
  5050. if (ret == 0) {
  5051. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  5052. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  5053. pubKeySz, out, outlen, side, ctx);
  5054. }
  5055. }
  5056. else
  5057. #endif
  5058. {
  5059. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  5060. EC25519_LITTLE_ENDIAN);
  5061. }
  5062. /* Handle async pending response */
  5063. #ifdef WOLFSSL_ASYNC_CRYPT
  5064. if (ret == WC_PENDING_E) {
  5065. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  5066. }
  5067. #endif /* WOLFSSL_ASYNC_CRYPT */
  5068. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  5069. return ret;
  5070. }
  5071. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  5072. curve25519_key* peer)
  5073. {
  5074. int ret = 0;
  5075. (void)peer;
  5076. WOLFSSL_ENTER("X25519MakeKey");
  5077. #ifdef WOLFSSL_ASYNC_CRYPT
  5078. /* initialize event */
  5079. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  5080. if (ret != 0)
  5081. return ret;
  5082. #endif
  5083. #ifdef HAVE_PK_CALLBACKS
  5084. if (ssl->ctx->X25519KeyGenCb) {
  5085. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  5086. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  5087. }
  5088. else
  5089. #endif
  5090. {
  5091. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  5092. }
  5093. if (ret == 0) {
  5094. ssl->ecdhCurveOID = ECC_X25519_OID;
  5095. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  5096. ssl->namedGroup = 0;
  5097. #endif
  5098. }
  5099. /* Handle async pending response */
  5100. #ifdef WOLFSSL_ASYNC_CRYPT
  5101. if (ret == WC_PENDING_E) {
  5102. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5103. }
  5104. #endif /* WOLFSSL_ASYNC_CRYPT */
  5105. WOLFSSL_LEAVE("X25519MakeKey", ret);
  5106. return ret;
  5107. }
  5108. #endif /* HAVE_CURVE25519 */
  5109. #endif /* !WOLFSSL_NO_TLS12 */
  5110. #ifdef HAVE_ED448
  5111. /* Check whether the key contains a public key.
  5112. * If not then pull it out of the leaf certificate.
  5113. *
  5114. * ssl SSL/TLS object.
  5115. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  5116. * 0 on success.
  5117. */
  5118. int Ed448CheckPubKey(WOLFSSL* ssl)
  5119. {
  5120. #ifndef HAVE_ED448_KEY_IMPORT
  5121. (void)ssl;
  5122. return NOT_COMPILED_IN;
  5123. #else /* HAVE_ED448_KEY_IMPORT */
  5124. ed448_key* key = (ed448_key*)ssl->hsKey;
  5125. int ret = 0;
  5126. /* Public key required for signing. */
  5127. if (key != NULL && !key->pubKeySet) {
  5128. const unsigned char* pubKey;
  5129. word32 pubKeySz;
  5130. ret = wc_CertGetPubKey(ssl->buffers.certificate->buffer,
  5131. ssl->buffers.certificate->length, &pubKey, &pubKeySz);
  5132. if (ret == 0) {
  5133. ret = wc_ed448_import_public(pubKey, pubKeySz, key);
  5134. }
  5135. }
  5136. return ret;
  5137. #endif /* HAVE_ED448_KEY_IMPORT */
  5138. }
  5139. /* Sign the data using EdDSA and key using Ed448.
  5140. *
  5141. * ssl SSL object.
  5142. * in Data or message to sign.
  5143. * inSz Length of the data.
  5144. * out Buffer to hold signature.
  5145. * outSz On entry, size of the buffer. On exit, the size of the signature.
  5146. * key The private Ed448 key data.
  5147. * keySz The length of the private key data in bytes.
  5148. * ctx The callback context.
  5149. * returns 0 on success, otherwise the value is an error.
  5150. */
  5151. int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  5152. word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
  5153. {
  5154. #ifndef HAVE_ED448_SIGN
  5155. (void)ssl;
  5156. (void)in;
  5157. (void)inSz;
  5158. (void)out;
  5159. (void)outSz;
  5160. (void)key;
  5161. (void)keyBufInfo;
  5162. return NOT_COMPILED_IN;
  5163. #else /* HAVE_ED448_SIGN */
  5164. int ret;
  5165. #ifdef HAVE_PK_CALLBACKS
  5166. const byte* keyBuf = NULL;
  5167. word32 keySz = 0;
  5168. if (keyBufInfo) {
  5169. keyBuf = keyBufInfo->buffer;
  5170. keySz = keyBufInfo->length;
  5171. }
  5172. #endif
  5173. (void)ssl;
  5174. (void)keyBufInfo;
  5175. WOLFSSL_ENTER("Ed448Sign");
  5176. #ifdef WOLFSSL_ASYNC_CRYPT
  5177. /* initialize event */
  5178. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5179. if (ret != 0)
  5180. return ret;
  5181. #endif
  5182. #if defined(HAVE_PK_CALLBACKS)
  5183. if (ssl->ctx->Ed448SignCb) {
  5184. void* ctx = wolfSSL_GetEd448SignCtx(ssl);
  5185. ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  5186. ctx);
  5187. }
  5188. else
  5189. #endif /* HAVE_PK_CALLBACKS */
  5190. {
  5191. ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
  5192. }
  5193. /* Handle async pending response */
  5194. #ifdef WOLFSSL_ASYNC_CRYPT
  5195. if (ret == WC_PENDING_E) {
  5196. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5197. }
  5198. #endif /* WOLFSSL_ASYNC_CRYPT */
  5199. WOLFSSL_LEAVE("Ed448Sign", ret);
  5200. return ret;
  5201. #endif /* HAVE_ED448_SIGN */
  5202. }
  5203. /* Verify the data using EdDSA and key using Ed448.
  5204. *
  5205. * ssl SSL object.
  5206. * in Signature data.
  5207. * inSz Length of the signature data in bytes.
  5208. * msg Message to verify.
  5209. * outSz Length of message in bytes.
  5210. * key The public Ed448 key data.
  5211. * keySz The length of the private key data in bytes.
  5212. * ctx The callback context.
  5213. * returns 0 on success, otherwise the value is an error.
  5214. */
  5215. int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  5216. word32 msgSz, ed448_key* key, buffer* keyBufInfo)
  5217. {
  5218. #ifndef HAVE_ED448_VERIFY
  5219. (void)ssl;
  5220. (void)in;
  5221. (void)inSz;
  5222. (void)msg;
  5223. (void)msgSz;
  5224. (void)key;
  5225. (void)keyBufInfo;
  5226. return NOT_COMPILED_IN;
  5227. #else /* HAVE_ED448_VERIFY */
  5228. int ret;
  5229. #ifdef HAVE_PK_CALLBACKS
  5230. const byte* keyBuf = NULL;
  5231. word32 keySz = 0;
  5232. if (keyBufInfo) {
  5233. keyBuf = keyBufInfo->buffer;
  5234. keySz = keyBufInfo->length;
  5235. }
  5236. #endif
  5237. (void)ssl;
  5238. (void)keyBufInfo;
  5239. WOLFSSL_ENTER("Ed448Verify");
  5240. #ifdef WOLFSSL_ASYNC_CRYPT
  5241. /* initialize event */
  5242. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5243. if (ret != 0)
  5244. return ret;
  5245. #endif
  5246. #ifdef HAVE_PK_CALLBACKS
  5247. if (ssl->ctx->Ed448VerifyCb) {
  5248. void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
  5249. ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
  5250. &ssl->eccVerifyRes, ctx);
  5251. }
  5252. else
  5253. #endif /* HAVE_PK_CALLBACKS */
  5254. {
  5255. ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
  5256. NULL, 0);
  5257. }
  5258. /* Handle async pending response */
  5259. #ifdef WOLFSSL_ASYNC_CRYPT
  5260. if (ret == WC_PENDING_E) {
  5261. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5262. }
  5263. else
  5264. #endif /* WOLFSSL_ASYNC_CRYPT */
  5265. {
  5266. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  5267. }
  5268. WOLFSSL_LEAVE("Ed448Verify", ret);
  5269. return ret;
  5270. #endif /* HAVE_ED448_VERIFY */
  5271. }
  5272. #endif /* HAVE_ED448 */
  5273. #ifndef WOLFSSL_NO_TLS12
  5274. #ifdef HAVE_CURVE448
  5275. #ifdef HAVE_PK_CALLBACKS
  5276. /* Gets X448 key for shared secret callback testing
  5277. * Client side: returns peer key
  5278. * Server side: returns private key
  5279. */
  5280. static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
  5281. {
  5282. int ret = NO_PEER_KEY;
  5283. struct curve448_key* tmpKey = NULL;
  5284. if (ssl == NULL || otherKey == NULL) {
  5285. return BAD_FUNC_ARG;
  5286. }
  5287. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5288. if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
  5289. return NO_PEER_KEY;
  5290. }
  5291. tmpKey = (struct curve448_key*)ssl->peerX448Key;
  5292. }
  5293. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  5294. if (!ssl->eccTempKeyPresent) {
  5295. return NO_PRIVATE_KEY;
  5296. }
  5297. tmpKey = (struct curve448_key*)ssl->eccTempKey;
  5298. }
  5299. if (tmpKey) {
  5300. *otherKey = (curve448_key *)tmpKey;
  5301. ret = 0;
  5302. }
  5303. return ret;
  5304. }
  5305. #endif /* HAVE_PK_CALLBACKS */
  5306. static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
  5307. curve448_key* pub_key, byte* pubKeyDer,
  5308. word32* pubKeySz, byte* out, word32* outlen,
  5309. int side)
  5310. {
  5311. int ret;
  5312. (void)ssl;
  5313. (void)pubKeyDer;
  5314. (void)pubKeySz;
  5315. (void)side;
  5316. WOLFSSL_ENTER("X448SharedSecret");
  5317. #ifdef WOLFSSL_ASYNC_CRYPT
  5318. /* initialize event */
  5319. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5320. if (ret != 0)
  5321. return ret;
  5322. #endif
  5323. #ifdef HAVE_PK_CALLBACKS
  5324. if (ssl->ctx->X448SharedSecretCb) {
  5325. curve448_key* otherKey = NULL;
  5326. ret = X448GetKey(ssl, &otherKey);
  5327. if (ret == 0) {
  5328. void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
  5329. ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
  5330. pubKeySz, out, outlen, side, ctx);
  5331. }
  5332. }
  5333. else
  5334. #endif
  5335. {
  5336. ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
  5337. EC448_LITTLE_ENDIAN);
  5338. }
  5339. /* Handle async pending response */
  5340. #ifdef WOLFSSL_ASYNC_CRYPT
  5341. if (ret == WC_PENDING_E) {
  5342. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  5343. }
  5344. #endif /* WOLFSSL_ASYNC_CRYPT */
  5345. WOLFSSL_LEAVE("X448SharedSecret", ret);
  5346. return ret;
  5347. }
  5348. static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
  5349. {
  5350. int ret = 0;
  5351. (void)peer;
  5352. WOLFSSL_ENTER("X448MakeKey");
  5353. #ifdef WOLFSSL_ASYNC_CRYPT
  5354. /* initialize event */
  5355. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  5356. if (ret != 0)
  5357. return ret;
  5358. #endif
  5359. #ifdef HAVE_PK_CALLBACKS
  5360. if (ssl->ctx->X448KeyGenCb) {
  5361. void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
  5362. ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
  5363. }
  5364. else
  5365. #endif
  5366. {
  5367. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  5368. }
  5369. if (ret == 0) {
  5370. ssl->ecdhCurveOID = ECC_X448_OID;
  5371. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  5372. ssl->namedGroup = 0;
  5373. #endif
  5374. }
  5375. /* Handle async pending response */
  5376. #ifdef WOLFSSL_ASYNC_CRYPT
  5377. if (ret == WC_PENDING_E) {
  5378. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5379. }
  5380. #endif /* WOLFSSL_ASYNC_CRYPT */
  5381. WOLFSSL_LEAVE("X448MakeKey", ret);
  5382. return ret;
  5383. }
  5384. #endif /* HAVE_CURVE448 */
  5385. #endif /* !WOLFSSL_NO_TLS12 */
  5386. #if !defined(NO_CERTS) || !defined(NO_PSK)
  5387. #if !defined(NO_DH)
  5388. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  5389. byte* priv, word32* privSz,
  5390. byte* pub, word32* pubSz)
  5391. {
  5392. int ret;
  5393. WOLFSSL_ENTER("DhGenKeyPair");
  5394. #ifdef WOLFSSL_ASYNC_CRYPT
  5395. /* initialize event */
  5396. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5397. if (ret != 0)
  5398. return ret;
  5399. #endif
  5400. #if defined(HAVE_PK_CALLBACKS)
  5401. ret = NOT_COMPILED_IN;
  5402. if (ssl && ssl->ctx && ssl->ctx->DhGenerateKeyPairCb) {
  5403. ret = ssl->ctx->DhGenerateKeyPairCb(dhKey, ssl->rng, priv, privSz,
  5404. pub, pubSz);
  5405. }
  5406. if (ret == NOT_COMPILED_IN)
  5407. #endif
  5408. {
  5409. PRIVATE_KEY_UNLOCK();
  5410. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  5411. PRIVATE_KEY_LOCK();
  5412. }
  5413. /* Handle async pending response */
  5414. #ifdef WOLFSSL_ASYNC_CRYPT
  5415. if (ret == WC_PENDING_E) {
  5416. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  5417. }
  5418. #endif /* WOLFSSL_ASYNC_CRYPT */
  5419. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  5420. return ret;
  5421. }
  5422. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  5423. const byte* priv, word32 privSz,
  5424. const byte* otherPub, word32 otherPubSz,
  5425. byte* agree, word32* agreeSz,
  5426. const byte* prime, word32 primeSz)
  5427. {
  5428. int ret;
  5429. (void)ssl;
  5430. WOLFSSL_ENTER("DhAgree");
  5431. #ifdef WOLFSSL_ASYNC_CRYPT
  5432. /* initialize event */
  5433. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5434. if (ret != 0)
  5435. return ret;
  5436. #endif
  5437. #ifdef HAVE_PK_CALLBACKS
  5438. if (ssl->ctx->DhAgreeCb) {
  5439. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  5440. WOLFSSL_MSG("Calling DhAgree Callback Function");
  5441. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  5442. otherPub, otherPubSz, agree, agreeSz, ctx);
  5443. }
  5444. else
  5445. #endif
  5446. {
  5447. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  5448. /* check the public key has valid number */
  5449. if (dhKey != NULL && (prime == NULL || primeSz == 0)) {
  5450. /* wc_DhCheckPubKey does not do exponentiation */
  5451. ret = wc_DhCheckPubKey(dhKey, otherPub, otherPubSz);
  5452. }
  5453. else {
  5454. ret = wc_DhCheckPubValue(prime, primeSz, otherPub, otherPubSz);
  5455. }
  5456. if (ret != 0) {
  5457. /* translate to valid error (wc_DhCheckPubValue returns MP_VAL -1) */
  5458. ret = PEER_KEY_ERROR;
  5459. WOLFSSL_ERROR_VERBOSE(ret);
  5460. #ifdef OPENSSL_EXTRA
  5461. SendAlert(ssl, alert_fatal, illegal_parameter);
  5462. #endif
  5463. }
  5464. else
  5465. #endif
  5466. {
  5467. PRIVATE_KEY_UNLOCK();
  5468. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  5469. otherPubSz);
  5470. PRIVATE_KEY_LOCK();
  5471. }
  5472. }
  5473. /* Handle async pending response */
  5474. #ifdef WOLFSSL_ASYNC_CRYPT
  5475. if (ret == WC_PENDING_E) {
  5476. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  5477. }
  5478. #endif /* WOLFSSL_ASYNC_CRYPT */
  5479. WOLFSSL_LEAVE("DhAgree", ret);
  5480. (void)prime;
  5481. (void)primeSz;
  5482. return ret;
  5483. }
  5484. #endif /* !NO_DH */
  5485. #endif /* !NO_CERTS || !NO_PSK */
  5486. #ifdef HAVE_PK_CALLBACKS
  5487. int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
  5488. {
  5489. int pkcbset = 0;
  5490. (void)ssl;
  5491. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5492. !defined(NO_RSA)
  5493. if (0
  5494. #ifdef HAVE_ECC
  5495. || (ssl->ctx->EccSignCb != NULL &&
  5496. ssl->buffers.keyType == ecc_dsa_sa_algo)
  5497. #endif
  5498. #ifdef HAVE_ED25519
  5499. || (ssl->ctx->Ed25519SignCb != NULL &&
  5500. ssl->buffers.keyType == ed25519_sa_algo)
  5501. #endif
  5502. #ifdef HAVE_ED448
  5503. || (ssl->ctx->Ed448SignCb != NULL &&
  5504. ssl->buffers.keyType == ed448_sa_algo)
  5505. #endif
  5506. #ifndef NO_RSA
  5507. || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
  5508. || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
  5509. #ifdef WC_RSA_PSS
  5510. || (ssl->ctx->RsaPssSignCb != NULL &&
  5511. ssl->buffers.keyType == rsa_pss_sa_algo)
  5512. #endif
  5513. #endif
  5514. ) {
  5515. pkcbset = 1;
  5516. }
  5517. #endif
  5518. return pkcbset;
  5519. }
  5520. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  5521. {
  5522. int pkcbset = 0;
  5523. (void)ctx;
  5524. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5525. !defined(NO_RSA)
  5526. if (0
  5527. #ifdef HAVE_ECC
  5528. || ctx->EccSignCb != NULL
  5529. #endif
  5530. #ifdef HAVE_ED25519
  5531. || ctx->Ed25519SignCb != NULL
  5532. #endif
  5533. #ifdef HAVE_ED448
  5534. || ctx->Ed448SignCb != NULL
  5535. #endif
  5536. #ifndef NO_RSA
  5537. || ctx->RsaSignCb != NULL
  5538. || ctx->RsaDecCb != NULL
  5539. #ifdef WC_RSA_PSS
  5540. || ctx->RsaPssSignCb != NULL
  5541. #endif
  5542. #endif
  5543. ) {
  5544. pkcbset = 1;
  5545. }
  5546. #endif
  5547. return pkcbset;
  5548. }
  5549. #endif /* HAVE_PK_CALLBACKS */
  5550. static void InitSuites_EitherSide(Suites* suites, ProtocolVersion pv, int keySz,
  5551. word16 haveRSA, word16 havePSK, word16 haveDH, word16 haveECDSAsig,
  5552. word16 haveECC, word16 haveStaticECC,
  5553. word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon,
  5554. int side)
  5555. {
  5556. /* make sure server has DH params, and add PSK if there */
  5557. if (side == WOLFSSL_SERVER_END) {
  5558. InitSuites(suites, pv, keySz, haveRSA, havePSK, haveDH, haveECDSAsig,
  5559. haveECC, TRUE, haveStaticECC, haveFalconSig,
  5560. haveDilithiumSig, haveAnon, TRUE, side);
  5561. }
  5562. else {
  5563. InitSuites(suites, pv, keySz, haveRSA, havePSK, TRUE, haveECDSAsig,
  5564. haveECC, TRUE, haveStaticECC, haveFalconSig,
  5565. haveDilithiumSig, haveAnon, TRUE, side);
  5566. }
  5567. }
  5568. void InitSSL_CTX_Suites(WOLFSSL_CTX* ctx)
  5569. {
  5570. int keySz = 0;
  5571. byte havePSK = 0;
  5572. byte haveAnon = 0;
  5573. byte haveRSA = 0;
  5574. #ifndef NO_RSA
  5575. haveRSA = 1;
  5576. #endif
  5577. #ifndef NO_PSK
  5578. havePSK = ctx->havePSK;
  5579. #endif /* NO_PSK */
  5580. #ifdef HAVE_ANON
  5581. haveAnon = ctx->haveAnon;
  5582. #endif /* HAVE_ANON*/
  5583. #ifndef NO_CERTS
  5584. keySz = ctx->privateKeySz;
  5585. #endif
  5586. InitSuites_EitherSide(ctx->suites, ctx->method->version, keySz,
  5587. haveRSA, havePSK, ctx->haveDH, ctx->haveECDSAsig, ctx->haveECC,
  5588. ctx->haveStaticECC, ctx->haveFalconSig, ctx->haveDilithiumSig,
  5589. haveAnon, ctx->method->side);
  5590. }
  5591. int InitSSL_Suites(WOLFSSL* ssl)
  5592. {
  5593. int keySz = 0;
  5594. byte havePSK = 0;
  5595. byte haveAnon = 0;
  5596. byte haveRSA = 0;
  5597. byte haveMcast = 0;
  5598. (void)haveAnon; /* Squash unused var warnings */
  5599. (void)haveMcast;
  5600. if (!ssl)
  5601. return BAD_FUNC_ARG;
  5602. #ifndef NO_RSA
  5603. haveRSA = 1;
  5604. #endif
  5605. #ifndef NO_PSK
  5606. havePSK = (byte)ssl->options.havePSK;
  5607. #endif /* NO_PSK */
  5608. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5609. #ifdef HAVE_ANON
  5610. haveAnon = (byte)ssl->options.haveAnon;
  5611. #endif /* HAVE_ANON*/
  5612. #ifdef WOLFSSL_MULTICAST
  5613. haveMcast = (byte)ssl->options.haveMcast;
  5614. #endif /* WOLFSSL_MULTICAST */
  5615. #endif /* !NO_CERTS && !WOLFSSL_SESSION_EXPORT */
  5616. #ifdef WOLFSSL_EARLY_DATA
  5617. if (ssl->options.side == WOLFSSL_SERVER_END)
  5618. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  5619. #endif
  5620. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5621. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  5622. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5623. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5624. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5625. ssl->buffers.keyType == ed25519_sa_algo ||
  5626. ssl->buffers.keyType == ed448_sa_algo ||
  5627. ssl->buffers.keyType == sm2_sa_algo;
  5628. #endif
  5629. #ifndef NO_CERTS
  5630. keySz = ssl->buffers.keySz;
  5631. #endif
  5632. if (ssl->suites != NULL) {
  5633. InitSuites_EitherSide(ssl->suites, ssl->version, keySz, haveRSA,
  5634. havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
  5635. ssl->options.haveECC, ssl->options.haveStaticECC,
  5636. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  5637. ssl->options.haveAnon, ssl->options.side);
  5638. }
  5639. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5640. /* make sure server has cert and key unless using PSK, Anon, or
  5641. * Multicast. This should be true even if just switching ssl ctx */
  5642. if (ssl->options.side == WOLFSSL_SERVER_END &&
  5643. !havePSK && !haveAnon && !haveMcast) {
  5644. /* server certificate must be loaded */
  5645. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  5646. WOLFSSL_MSG("Server missing certificate");
  5647. WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
  5648. return NO_PRIVATE_KEY;
  5649. }
  5650. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  5651. /* allow no private key if using existing key */
  5652. #ifdef WOLF_PRIVATE_KEY_ID
  5653. if (ssl->devId != INVALID_DEVID
  5654. #ifdef HAVE_PK_CALLBACKS
  5655. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  5656. #endif
  5657. ) {
  5658. WOLFSSL_MSG("Allowing no server private key (external)");
  5659. }
  5660. else
  5661. #endif
  5662. {
  5663. WOLFSSL_MSG("Server missing private key");
  5664. WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
  5665. return NO_PRIVATE_KEY;
  5666. }
  5667. }
  5668. }
  5669. #endif
  5670. return WOLFSSL_SUCCESS;
  5671. }
  5672. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  5673. It is used during initialization and to switch an ssl's CTX with
  5674. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  5675. unless writeDup is on.
  5676. ssl object to initialize
  5677. ctx parent factory
  5678. writeDup flag indicating this is a write dup only
  5679. WOLFSSL_SUCCESS return value on success */
  5680. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5681. {
  5682. int ret;
  5683. byte newSSL;
  5684. WOLFSSL_ENTER("SetSSL_CTX");
  5685. if (!ssl || !ctx)
  5686. return BAD_FUNC_ARG;
  5687. newSSL = ssl->ctx == NULL; /* Assign after null check */
  5688. #ifndef NO_PSK
  5689. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  5690. return BAD_FUNC_ARG; /* needed for copy below */
  5691. }
  5692. #endif
  5693. /* decrement previous CTX reference count if exists.
  5694. * This should only happen if switching ctxs!*/
  5695. if (!newSSL) {
  5696. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  5697. wolfSSL_CTX_free(ssl->ctx);
  5698. #if defined(WOLFSSL_HAPROXY)
  5699. wolfSSL_CTX_free(ssl->initial_ctx);
  5700. #endif
  5701. }
  5702. /* increment CTX reference count */
  5703. wolfSSL_RefInc(&ctx->ref, &ret);
  5704. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  5705. if (ret < 0) {
  5706. return ret;
  5707. }
  5708. #else
  5709. (void)ret;
  5710. #endif
  5711. ret = WOLFSSL_SUCCESS; /* set default ret */
  5712. ssl->ctx = ctx; /* only for passing to calls, options could change */
  5713. /* Don't change version on a SSL object that has already started a
  5714. * handshake */
  5715. #if defined(WOLFSSL_HAPROXY)
  5716. ret = wolfSSL_CTX_up_ref(ctx);
  5717. if (ret == WOLFSSL_SUCCESS) {
  5718. ssl->initial_ctx = ctx; /* Save access to session key materials */
  5719. }
  5720. else {
  5721. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  5722. return ret;
  5723. #else
  5724. (void)ret;
  5725. #endif
  5726. }
  5727. #endif
  5728. if (!ssl->msgsReceived.got_client_hello &&
  5729. !ssl->msgsReceived.got_server_hello)
  5730. ssl->version = ctx->method->version;
  5731. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  5732. ssl->options.mask = ctx->mask;
  5733. ssl->options.minProto = ctx->minProto;
  5734. ssl->options.maxProto = ctx->maxProto;
  5735. #endif
  5736. #ifdef OPENSSL_EXTRA
  5737. #ifdef WOLFSSL_TLS13
  5738. if (ssl->version.minor == TLSv1_3_MINOR &&
  5739. (ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  5740. if (!ctx->method->downgrade) {
  5741. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
  5742. "allowed and downgrading disabled.");
  5743. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5744. return VERSION_ERROR;
  5745. }
  5746. WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
  5747. ssl->version.minor = TLSv1_2_MINOR;
  5748. }
  5749. #endif
  5750. if (ssl->version.minor == TLSv1_2_MINOR &&
  5751. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  5752. if (!ctx->method->downgrade) {
  5753. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
  5754. "allowed and downgrading disabled.");
  5755. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5756. return VERSION_ERROR;
  5757. }
  5758. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  5759. ssl->version.minor = TLSv1_1_MINOR;
  5760. }
  5761. if (ssl->version.minor == TLSv1_1_MINOR &&
  5762. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  5763. if (!ctx->method->downgrade) {
  5764. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
  5765. "allowed and downgrading disabled.");
  5766. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5767. return VERSION_ERROR;
  5768. }
  5769. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  5770. ssl->options.tls1_1 = 0;
  5771. ssl->version.minor = TLSv1_MINOR;
  5772. }
  5773. if (ssl->version.minor == TLSv1_MINOR &&
  5774. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  5775. if (!ctx->method->downgrade) {
  5776. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
  5777. "allowed and downgrading disabled.");
  5778. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5779. return VERSION_ERROR;
  5780. }
  5781. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  5782. ssl->options.tls = 0;
  5783. ssl->options.tls1_1 = 0;
  5784. ssl->version.minor = SSLv3_MINOR;
  5785. }
  5786. if (ssl->version.minor == SSLv3_MINOR &&
  5787. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  5788. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  5789. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5790. return VERSION_ERROR;
  5791. }
  5792. if (ssl->version.minor < ssl->options.minDowngrade) {
  5793. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  5794. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5795. return VERSION_ERROR;
  5796. }
  5797. #endif
  5798. #ifdef HAVE_ECC
  5799. ssl->eccTempKeySz = ctx->eccTempKeySz;
  5800. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  5801. #endif
  5802. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  5803. ssl->pkCurveOID = ctx->pkCurveOID;
  5804. #endif
  5805. #ifdef OPENSSL_EXTRA
  5806. ssl->CBIS = ctx->CBIS;
  5807. #endif
  5808. ssl->timeout = ctx->timeout;
  5809. ssl->verifyCallback = ctx->verifyCallback;
  5810. /* If we are setting the ctx on an already initialized SSL object
  5811. * then we possibly already have a side defined. Don't overwrite unless
  5812. * the context has a well defined role. */
  5813. if (newSSL || ctx->method->side != WOLFSSL_NEITHER_END)
  5814. ssl->options.side = ctx->method->side;
  5815. ssl->options.downgrade = ctx->method->downgrade;
  5816. ssl->options.minDowngrade = ctx->minDowngrade;
  5817. ssl->options.haveRSA = ctx->haveRSA;
  5818. ssl->options.haveDH = ctx->haveDH;
  5819. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  5820. ssl->options.haveECC = ctx->haveECC;
  5821. ssl->options.haveStaticECC = ctx->haveStaticECC;
  5822. ssl->options.haveFalconSig = ctx->haveFalconSig;
  5823. ssl->options.haveDilithiumSig = ctx->haveDilithiumSig;
  5824. #ifndef NO_PSK
  5825. ssl->options.havePSK = ctx->havePSK;
  5826. ssl->options.client_psk_cb = ctx->client_psk_cb;
  5827. ssl->options.server_psk_cb = ctx->server_psk_cb;
  5828. ssl->options.psk_ctx = ctx->psk_ctx;
  5829. #ifdef WOLFSSL_TLS13
  5830. ssl->options.client_psk_cs_cb = ctx->client_psk_cs_cb;
  5831. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  5832. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  5833. #endif
  5834. #endif /* NO_PSK */
  5835. #ifdef WOLFSSL_EARLY_DATA
  5836. if (ssl->options.side == WOLFSSL_SERVER_END)
  5837. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  5838. #endif
  5839. #ifdef HAVE_ANON
  5840. ssl->options.haveAnon = ctx->haveAnon;
  5841. #endif
  5842. #ifndef NO_DH
  5843. ssl->options.minDhKeySz = ctx->minDhKeySz;
  5844. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  5845. #endif
  5846. #ifndef NO_RSA
  5847. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  5848. #endif
  5849. #ifdef HAVE_ECC
  5850. ssl->options.minEccKeySz = ctx->minEccKeySz;
  5851. #endif
  5852. #ifdef HAVE_PQC
  5853. #ifdef HAVE_FALCON
  5854. ssl->options.minFalconKeySz = ctx->minFalconKeySz;
  5855. #endif /* HAVE_FALCON */
  5856. #ifdef HAVE_DILITHIUM
  5857. ssl->options.minDilithiumKeySz = ctx->minDilithiumKeySz;
  5858. #endif /* HAVE_DILITHIUM */
  5859. #endif /* HAVE_PQC */
  5860. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  5861. ssl->options.verifyDepth = ctx->verifyDepth;
  5862. #endif
  5863. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  5864. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  5865. #ifdef HAVE_EXT_CACHE
  5866. ssl->options.internalCacheOff = ctx->internalCacheOff;
  5867. ssl->options.internalCacheLookupOff = ctx->internalCacheLookupOff;
  5868. #endif
  5869. ssl->options.verifyPeer = ctx->verifyPeer;
  5870. ssl->options.verifyNone = ctx->verifyNone;
  5871. ssl->options.failNoCert = ctx->failNoCert;
  5872. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  5873. ssl->options.sendVerify = ctx->sendVerify;
  5874. ssl->options.partialWrite = ctx->partialWrite;
  5875. ssl->options.quietShutdown = ctx->quietShutdown;
  5876. ssl->options.groupMessages = ctx->groupMessages;
  5877. #ifndef NO_DH
  5878. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5879. !defined(HAVE_SELFTEST)
  5880. ssl->options.dhKeyTested = ctx->dhKeyTested;
  5881. #endif
  5882. ssl->buffers.serverDH_P = ctx->serverDH_P;
  5883. ssl->buffers.serverDH_G = ctx->serverDH_G;
  5884. #endif
  5885. #ifndef NO_CERTS
  5886. /* ctx still owns certificate, certChain, key, dh, and cm */
  5887. ssl->buffers.certificate = ctx->certificate;
  5888. ssl->buffers.certChain = ctx->certChain;
  5889. #ifdef WOLFSSL_TLS13
  5890. ssl->buffers.certChainCnt = ctx->certChainCnt;
  5891. #endif
  5892. ssl->buffers.key = ctx->privateKey;
  5893. ssl->buffers.keyType = ctx->privateKeyType;
  5894. ssl->buffers.keyId = ctx->privateKeyId;
  5895. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  5896. ssl->buffers.keySz = ctx->privateKeySz;
  5897. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  5898. #endif
  5899. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5900. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  5901. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5902. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5903. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5904. ssl->buffers.keyType == ed25519_sa_algo ||
  5905. ssl->buffers.keyType == ed448_sa_algo ||
  5906. ssl->buffers.keyType == sm2_sa_algo;
  5907. #endif
  5908. #ifdef WOLFSSL_ASYNC_CRYPT
  5909. ssl->devId = ctx->devId;
  5910. #endif
  5911. if (writeDup == 0) {
  5912. #ifndef NO_PSK
  5913. if (ctx->server_hint[0]) { /* set in CTX */
  5914. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  5915. sizeof(ssl->arrays->server_hint));
  5916. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  5917. }
  5918. #endif /* NO_PSK */
  5919. if (ssl->suites != NULL) {
  5920. if (ctx->suites == NULL)
  5921. XMEMSET(ssl->suites, 0, sizeof(Suites));
  5922. else
  5923. XMEMCPY(ssl->suites, ctx->suites, sizeof(Suites));
  5924. }
  5925. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  5926. /* Defer initializing suites until accept or connect */
  5927. ret = InitSSL_Suites(ssl);
  5928. }
  5929. } /* writeDup check */
  5930. if (ctx->mask != 0 && wolfSSL_set_options(ssl, ctx->mask) == 0) {
  5931. WOLFSSL_MSG("wolfSSL_set_options error");
  5932. return BAD_FUNC_ARG;
  5933. }
  5934. #ifdef WOLFSSL_SESSION_EXPORT
  5935. #ifdef WOLFSSL_DTLS
  5936. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  5937. #endif
  5938. #endif
  5939. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  5940. ssl->AcceptFilter = ctx->AcceptFilter;
  5941. ssl->AcceptFilter_arg = ctx->AcceptFilter_arg;
  5942. ssl->ConnectFilter = ctx->ConnectFilter;
  5943. ssl->ConnectFilter_arg = ctx->ConnectFilter_arg;
  5944. #endif
  5945. #ifdef OPENSSL_EXTRA
  5946. ssl->readAhead = ctx->readAhead;
  5947. #endif
  5948. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5949. /* Don't change recv callback if currently using BIO's */
  5950. if (ssl->CBIORecv != BioReceive)
  5951. #endif
  5952. ssl->CBIORecv = ctx->CBIORecv;
  5953. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5954. /* Don't change send callback if currently using BIO's */
  5955. if (ssl->CBIOSend != BioSend)
  5956. #endif
  5957. ssl->CBIOSend = ctx->CBIOSend;
  5958. ssl->verifyDepth = ctx->verifyDepth;
  5959. return ret;
  5960. }
  5961. int InitHandshakeHashes(WOLFSSL* ssl)
  5962. {
  5963. int ret;
  5964. /* make sure existing handshake hashes are free'd */
  5965. if (ssl->hsHashes != NULL) {
  5966. FreeHandshakeHashes(ssl);
  5967. }
  5968. /* allocate handshake hashes */
  5969. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  5970. DYNAMIC_TYPE_HASHES);
  5971. if (ssl->hsHashes == NULL) {
  5972. WOLFSSL_MSG("HS_Hashes Memory error");
  5973. return MEMORY_E;
  5974. }
  5975. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  5976. #ifndef NO_OLD_TLS
  5977. #ifndef NO_MD5
  5978. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  5979. if (ret != 0)
  5980. return ret;
  5981. #ifdef WOLFSSL_HASH_FLAGS
  5982. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  5983. #endif
  5984. #endif
  5985. #ifndef NO_SHA
  5986. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  5987. if (ret != 0)
  5988. return ret;
  5989. #ifdef WOLFSSL_HASH_FLAGS
  5990. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  5991. #endif
  5992. #endif
  5993. #endif /* !NO_OLD_TLS */
  5994. #ifndef NO_SHA256
  5995. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  5996. if (ret != 0)
  5997. return ret;
  5998. #ifdef WOLFSSL_HASH_FLAGS
  5999. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  6000. #endif
  6001. #endif
  6002. #ifdef WOLFSSL_SHA384
  6003. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  6004. if (ret != 0)
  6005. return ret;
  6006. #ifdef WOLFSSL_HASH_FLAGS
  6007. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  6008. #endif
  6009. #endif
  6010. #ifdef WOLFSSL_SHA512
  6011. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  6012. if (ret != 0)
  6013. return ret;
  6014. #ifdef WOLFSSL_HASH_FLAGS
  6015. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  6016. #endif
  6017. #endif
  6018. #ifdef WOLFSSL_SM3
  6019. ret = wc_InitSm3(&ssl->hsHashes->hashSm3, ssl->heap, ssl->devId);
  6020. if (ret != 0)
  6021. return ret;
  6022. #ifdef WOLFSSL_HASH_FLAGS
  6023. wc_Sm3SetFlags(&ssl->hsHashes->hashSm3, WC_HASH_FLAG_WILLCOPY);
  6024. #endif
  6025. #endif
  6026. return ret;
  6027. }
  6028. void FreeHandshakeHashes(WOLFSSL* ssl)
  6029. {
  6030. if (ssl->hsHashes) {
  6031. #ifndef NO_OLD_TLS
  6032. #ifndef NO_MD5
  6033. wc_Md5Free(&ssl->hsHashes->hashMd5);
  6034. #endif
  6035. #ifndef NO_SHA
  6036. wc_ShaFree(&ssl->hsHashes->hashSha);
  6037. #endif
  6038. #endif /* !NO_OLD_TLS */
  6039. #ifndef NO_SHA256
  6040. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  6041. #endif
  6042. #ifdef WOLFSSL_SHA384
  6043. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  6044. #endif
  6045. #ifdef WOLFSSL_SHA512
  6046. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  6047. #endif
  6048. #ifdef WOLFSSL_SM3
  6049. wc_Sm3Free(&ssl->hsHashes->hashSm3);
  6050. #endif
  6051. #if (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  6052. (defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3))) && \
  6053. !defined(WOLFSSL_NO_CLIENT_AUTH)
  6054. if (ssl->hsHashes->messages != NULL) {
  6055. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  6056. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  6057. ssl->hsHashes->messages = NULL;
  6058. }
  6059. #endif
  6060. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  6061. ssl->hsHashes = NULL;
  6062. }
  6063. }
  6064. /* copy the hashes from source to a newly made destination return status */
  6065. int InitHandshakeHashesAndCopy(WOLFSSL* ssl, HS_Hashes* source,
  6066. HS_Hashes** destination)
  6067. {
  6068. int ret = 0;
  6069. HS_Hashes* tmpHashes;
  6070. if (source == NULL)
  6071. return BAD_FUNC_ARG;
  6072. /* save the original so we can put it back afterward */
  6073. tmpHashes = ssl->hsHashes;
  6074. ssl->hsHashes = NULL;
  6075. InitHandshakeHashes(ssl);
  6076. *destination = ssl->hsHashes;
  6077. ssl->hsHashes = tmpHashes;
  6078. /* now copy the source contents to the destination */
  6079. #ifndef NO_OLD_TLS
  6080. #ifndef NO_SHA
  6081. ret = wc_ShaCopy(&source->hashSha, &(*destination)->hashSha);
  6082. #endif
  6083. #ifndef NO_MD5
  6084. if (ret == 0)
  6085. ret = wc_Md5Copy(&source->hashMd5, &(*destination)->hashMd5);
  6086. #endif
  6087. #endif /* !NO_OLD_TLS */
  6088. #ifndef NO_SHA256
  6089. if (ret == 0)
  6090. ret = wc_Sha256Copy(&source->hashSha256,
  6091. &(*destination)->hashSha256);
  6092. #endif
  6093. #ifdef WOLFSSL_SHA384
  6094. if (ret == 0)
  6095. ret = wc_Sha384Copy(&source->hashSha384,
  6096. &(*destination)->hashSha384);
  6097. #endif
  6098. #ifdef WOLFSSL_SHA512
  6099. if (ret == 0)
  6100. ret = wc_Sha512Copy(&source->hashSha512,
  6101. &(*destination)->hashSha512);
  6102. #endif
  6103. #ifdef WOLFSSL_SM3
  6104. if (ret == 0)
  6105. ret = wc_Sm3Copy(&source->hashSm3,
  6106. &(*destination)->hashSm3);
  6107. #endif
  6108. #if (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  6109. (defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3))) && \
  6110. !defined(WOLFSSL_NO_CLIENT_AUTH)
  6111. if (ret == 0 && source->messages != NULL) {
  6112. (*destination)->messages = (byte*)XMALLOC(source->length, ssl->heap,
  6113. DYNAMIC_TYPE_HASHES);
  6114. (*destination)->length = source->length;
  6115. (*destination)->prevLen = source->prevLen;
  6116. if ((*destination)->messages == NULL) {
  6117. ret = MEMORY_E;
  6118. }
  6119. else {
  6120. XMEMCPY((*destination)->messages, source->messages,
  6121. source->length);
  6122. }
  6123. }
  6124. #endif
  6125. return ret;
  6126. }
  6127. /* called if user attempts to reuse WOLFSSL object for a new session.
  6128. * For example wolfSSL_clear() is called then wolfSSL_connect or accept */
  6129. int ReinitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  6130. {
  6131. int ret = 0;
  6132. WOLFSSL_ENTER("ReinitSSL");
  6133. /* arrays */
  6134. if (!writeDup && ssl->arrays == NULL) {
  6135. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  6136. DYNAMIC_TYPE_ARRAYS);
  6137. if (ssl->arrays == NULL) {
  6138. WOLFSSL_MSG("Arrays Memory error");
  6139. return MEMORY_E;
  6140. }
  6141. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6142. wc_MemZero_Add("SSL Arrays", ssl->arrays, sizeof(*ssl->arrays));
  6143. #endif
  6144. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  6145. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  6146. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  6147. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  6148. DYNAMIC_TYPE_SECRET);
  6149. if (ssl->arrays->preMasterSecret == NULL) {
  6150. return MEMORY_E;
  6151. }
  6152. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6153. wc_MemZero_Add("SSL Arrays", ssl->arrays->preMasterSecret, ENCRYPT_LEN);
  6154. #endif
  6155. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  6156. #endif
  6157. }
  6158. /* RNG */
  6159. #ifdef SINGLE_THREADED
  6160. if (ssl->rng == NULL) {
  6161. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  6162. }
  6163. #endif
  6164. if (ssl->rng == NULL) {
  6165. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  6166. if (ssl->rng == NULL) {
  6167. WOLFSSL_MSG("RNG Memory error");
  6168. return MEMORY_E;
  6169. }
  6170. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  6171. ssl->options.weOwnRng = 1;
  6172. /* FIPS RNG API does not accept a heap hint */
  6173. #ifndef HAVE_FIPS
  6174. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  6175. WOLFSSL_MSG("RNG Init error");
  6176. return ret;
  6177. }
  6178. #else
  6179. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  6180. WOLFSSL_MSG("RNG Init error");
  6181. return ret;
  6182. }
  6183. #endif
  6184. }
  6185. (void)ctx;
  6186. ssl->options.shutdownDone = 0;
  6187. if (ssl->session != NULL)
  6188. ssl->session->side = (byte)ssl->options.side;
  6189. return ret;
  6190. }
  6191. /* init everything to 0, NULL, default values before calling anything that may
  6192. fail so that destructor has a "good" state to cleanup
  6193. ssl object to initialize
  6194. ctx parent factory
  6195. writeDup flag indicating this is a write dup only
  6196. 0 on success */
  6197. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  6198. {
  6199. int ret;
  6200. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  6201. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6202. wc_MemZero_Add("SSL Keys", &ssl->keys, sizeof(ssl->keys));
  6203. #ifdef WOLFSSL_TLS13
  6204. wc_MemZero_Add("SSL client secret", &ssl->clientSecret,
  6205. sizeof(ssl->clientSecret));
  6206. wc_MemZero_Add("SSL client secret", &ssl->serverSecret,
  6207. sizeof(ssl->serverSecret));
  6208. #endif
  6209. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  6210. wc_MemZero_Add("ClientFinished hash", &ssl->clientFinished,
  6211. TLS_FINISHED_SZ_MAX);
  6212. wc_MemZero_Add("ServerFinished hash", &ssl->serverFinished,
  6213. TLS_FINISHED_SZ_MAX);
  6214. #endif
  6215. #endif
  6216. #if defined(WOLFSSL_STATIC_MEMORY)
  6217. if (ctx->heap != NULL) {
  6218. WOLFSSL_HEAP_HINT* ssl_hint;
  6219. WOLFSSL_HEAP_HINT* ctx_hint;
  6220. /* avoid dereferencing a test value */
  6221. #ifdef WOLFSSL_HEAP_TEST
  6222. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  6223. ssl->heap = ctx->heap;
  6224. }
  6225. else {
  6226. #endif
  6227. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  6228. ctx->heap, DYNAMIC_TYPE_SSL);
  6229. if (ssl->heap == NULL) {
  6230. return MEMORY_E;
  6231. }
  6232. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  6233. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  6234. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  6235. /* lock and check IO count / handshake count */
  6236. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  6237. WOLFSSL_MSG("Bad memory_mutex lock");
  6238. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  6239. ssl->heap = NULL; /* free and set to NULL for IO counter */
  6240. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  6241. return BAD_MUTEX_E;
  6242. }
  6243. if (ctx_hint->memory->maxHa > 0 &&
  6244. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  6245. WOLFSSL_MSG("At max number of handshakes for static memory");
  6246. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6247. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  6248. ssl->heap = NULL; /* free and set to NULL for IO counter */
  6249. return MEMORY_E;
  6250. }
  6251. if (ctx_hint->memory->maxIO > 0 &&
  6252. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  6253. WOLFSSL_MSG("At max number of IO allowed for static memory");
  6254. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6255. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  6256. ssl->heap = NULL; /* free and set to NULL for IO counter */
  6257. return MEMORY_E;
  6258. }
  6259. ctx_hint->memory->curIO++;
  6260. ctx_hint->memory->curHa++;
  6261. ssl_hint->memory = ctx_hint->memory;
  6262. ssl_hint->haFlag = 1;
  6263. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6264. /* check if tracking stats */
  6265. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  6266. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  6267. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  6268. if (ssl_hint->stats == NULL) {
  6269. return MEMORY_E;
  6270. }
  6271. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  6272. }
  6273. /* check if using fixed IO buffers */
  6274. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  6275. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  6276. WOLFSSL_MSG("Bad memory_mutex lock");
  6277. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  6278. return BAD_MUTEX_E;
  6279. }
  6280. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  6281. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6282. return MEMORY_E;
  6283. }
  6284. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  6285. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6286. return MEMORY_E;
  6287. }
  6288. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  6289. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  6290. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6291. return MEMORY_E;
  6292. }
  6293. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6294. }
  6295. #ifdef WOLFSSL_HEAP_TEST
  6296. }
  6297. #endif
  6298. }
  6299. else {
  6300. ssl->heap = ctx->heap;
  6301. }
  6302. #else
  6303. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  6304. #endif /* WOLFSSL_STATIC_MEMORY */
  6305. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  6306. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  6307. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  6308. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  6309. #ifdef KEEP_PEER_CERT
  6310. InitX509(&ssl->peerCert, 0, ssl->heap);
  6311. #endif
  6312. ssl->rfd = -1; /* set to invalid descriptor */
  6313. ssl->wfd = -1;
  6314. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  6315. /* initialize states */
  6316. ssl->options.serverState = NULL_STATE;
  6317. ssl->options.clientState = NULL_STATE;
  6318. ssl->options.connectState = CONNECT_BEGIN;
  6319. ssl->options.acceptState = ACCEPT_BEGIN;
  6320. ssl->options.handShakeState = NULL_STATE;
  6321. ssl->options.processReply = doProcessInit;
  6322. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  6323. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  6324. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  6325. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  6326. #ifndef NO_DH
  6327. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  6328. !defined(HAVE_SELFTEST)
  6329. ssl->options.dhDoKeyTest = 1;
  6330. #endif
  6331. #endif
  6332. #ifdef WOLFSSL_DTLS
  6333. #ifdef WOLFSSL_SCTP
  6334. ssl->options.dtlsSctp = ctx->dtlsSctp;
  6335. #endif
  6336. #ifdef WOLFSSL_SRTP
  6337. ssl->dtlsSrtpProfiles = ctx->dtlsSrtpProfiles;
  6338. #endif
  6339. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  6340. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  6341. ssl->dtls_expected_rx = ssl->dtlsMtuSz;
  6342. #else
  6343. ssl->dtls_expected_rx = MAX_MTU;
  6344. #endif
  6345. /* Add some bytes so that we can operate with slight difference
  6346. * in set MTU size on each peer */
  6347. ssl->dtls_expected_rx += DTLS_MTU_ADDITIONAL_READ_BUFFER;
  6348. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  6349. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  6350. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6351. ssl->buffers.dtlsCtx.rfd = -1;
  6352. ssl->buffers.dtlsCtx.wfd = -1;
  6353. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx; /* prevent invalid pointer access if not */
  6354. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx; /* correctly set */
  6355. #else
  6356. #ifdef HAVE_NETX
  6357. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  6358. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  6359. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  6360. ssl->mnCtx = mynewt_ctx_new();
  6361. if(!ssl->mnCtx) {
  6362. return MEMORY_E;
  6363. }
  6364. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  6365. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  6366. #elif defined (WOLFSSL_GNRC)
  6367. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  6368. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  6369. #else
  6370. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  6371. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  6372. #endif
  6373. #endif
  6374. #ifndef WOLFSSL_AEAD_ONLY
  6375. #ifndef NO_OLD_TLS
  6376. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  6377. #elif !defined(WOLFSSL_NO_TLS12) && !defined(NO_TLS)
  6378. #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  6379. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  6380. ssl->hmac = TLS_hmac;
  6381. #else
  6382. ssl->hmac = Renesas_cmn_TLS_hmac;
  6383. #endif
  6384. #endif
  6385. #endif
  6386. #if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
  6387. /* Save arrays by default for OpenVPN */
  6388. ssl->options.saveArrays = 1;
  6389. #endif
  6390. ssl->cipher.ssl = ssl;
  6391. #ifdef HAVE_EXTENDED_MASTER
  6392. ssl->options.haveEMS = ctx->haveEMS;
  6393. #endif
  6394. ssl->options.useClientOrder = ctx->useClientOrder;
  6395. ssl->options.mutualAuth = ctx->mutualAuth;
  6396. #ifdef WOLFSSL_TLS13
  6397. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  6398. ssl->options.maxTicketTls13 = ctx->maxTicketTls13;
  6399. #endif
  6400. #ifdef HAVE_SESSION_TICKET
  6401. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  6402. #endif
  6403. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6404. ssl->options.noPskDheKe = ctx->noPskDheKe;
  6405. #ifdef HAVE_SUPPORTED_CURVES
  6406. ssl->options.onlyPskDheKe = ctx->onlyPskDheKe;
  6407. #endif /* HAVE_SUPPORTED_CURVES */
  6408. #endif /* HAVE_SESSION_TICKET || !NO_PSK */
  6409. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6410. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  6411. ssl->options.verifyPostHandshake = ctx->verifyPostHandshake;
  6412. #endif
  6413. if (ctx->numGroups > 0) {
  6414. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  6415. ssl->numGroups = ctx->numGroups;
  6416. }
  6417. #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
  6418. ssl->options.tls13MiddleBoxCompat = 1;
  6419. #endif
  6420. #endif
  6421. #ifdef HAVE_TLS_EXTENSIONS
  6422. #ifdef HAVE_MAX_FRAGMENT
  6423. ssl->max_fragment = MAX_RECORD_SIZE;
  6424. #endif
  6425. #ifdef HAVE_ALPN
  6426. ssl->alpn_peer_requested = NULL;
  6427. ssl->alpn_peer_requested_length = 0;
  6428. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  6429. ssl->alpnSelect = ctx->alpnSelect;
  6430. ssl->alpnSelectArg = ctx->alpnSelectArg;
  6431. #endif
  6432. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  6433. if (ctx->alpn_cli_protos != NULL && ctx->alpn_cli_protos_len > 0) {
  6434. ret = wolfSSL_set_alpn_protos(ssl, ctx->alpn_cli_protos,
  6435. ctx->alpn_cli_protos_len);
  6436. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  6437. if (ret) {
  6438. #else
  6439. if (!ret) {
  6440. #endif
  6441. WOLFSSL_MSG("failed to set alpn protos to ssl object");
  6442. return ret;
  6443. }
  6444. }
  6445. #endif
  6446. #endif
  6447. #ifdef HAVE_SUPPORTED_CURVES
  6448. ssl->options.userCurves = ctx->userCurves;
  6449. #endif
  6450. #endif /* HAVE_TLS_EXTENSIONS */
  6451. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  6452. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  6453. #endif
  6454. /* default alert state (none) */
  6455. ssl->alert_history.last_rx.code = -1;
  6456. ssl->alert_history.last_rx.level = -1;
  6457. ssl->alert_history.last_tx.code = -1;
  6458. ssl->alert_history.last_tx.level = -1;
  6459. #ifdef OPENSSL_EXTRA
  6460. /* copy over application session context ID */
  6461. ssl->sessionCtxSz = ctx->sessionCtxSz;
  6462. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  6463. ssl->cbioFlag = ctx->cbioFlag;
  6464. ssl->protoMsgCb = ctx->protoMsgCb;
  6465. ssl->protoMsgCtx = ctx->protoMsgCtx;
  6466. /* follow default behavior of setting toInfoOn similar to
  6467. * wolfSSL_set_msg_callback when the callback is set */
  6468. if (ctx->protoMsgCb != NULL) {
  6469. ssl->toInfoOn = 1;
  6470. }
  6471. ssl->disabledCurves = ctx->disabledCurves;
  6472. #endif
  6473. InitCiphers(ssl);
  6474. InitCipherSpecs(&ssl->specs);
  6475. /* all done with init, now can return errors, call other stuff */
  6476. if ((ret = ReinitSSL(ssl, ctx, writeDup)) != 0) {
  6477. return ret;
  6478. }
  6479. if (!writeDup) {
  6480. #ifdef OPENSSL_EXTRA
  6481. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  6482. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  6483. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  6484. WOLFSSL_MSG("ssl->param memory error");
  6485. return MEMORY_E;
  6486. }
  6487. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  6488. #endif
  6489. if (ctx->suites == NULL) {
  6490. /* suites */
  6491. ret = AllocateCtxSuites(ctx);
  6492. if (ret != 0)
  6493. return ret;
  6494. InitSSL_CTX_Suites(ctx);
  6495. }
  6496. #ifdef OPENSSL_ALL
  6497. ssl->suitesStack = NULL;
  6498. #endif
  6499. } /* !writeDup */
  6500. /* Initialize SSL with the appropriate fields from it's ctx */
  6501. /* requires valid arrays and suites unless writeDup ing */
  6502. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS
  6503. #ifdef WOLFSSL_NO_INIT_CTX_KEY
  6504. && ret != NO_PRIVATE_KEY
  6505. #endif
  6506. ) {
  6507. return ret;
  6508. }
  6509. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  6510. #ifdef HAVE_WRITE_DUP
  6511. if (writeDup) {
  6512. /* all done */
  6513. return 0;
  6514. }
  6515. #endif
  6516. /* hsHashes */
  6517. ret = InitHandshakeHashes(ssl);
  6518. if (ret != 0)
  6519. return ret;
  6520. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  6521. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  6522. if (!IsAtLeastTLSv1_3(ssl->version)) {
  6523. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  6524. if (ret != 0) {
  6525. WOLFSSL_MSG("DTLS Cookie Secret error");
  6526. return ret;
  6527. }
  6528. }
  6529. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
  6530. else {
  6531. ret = wolfSSL_send_hrr_cookie(ssl, NULL, 0);
  6532. if (ret != WOLFSSL_SUCCESS) {
  6533. WOLFSSL_MSG("DTLS1.3 Cookie secret error");
  6534. return ret;
  6535. }
  6536. }
  6537. #endif /* WOLFSSL_DTLS13 && WOLFSSL_SEND_HRR_COOKIE */
  6538. }
  6539. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  6540. #ifdef HAVE_SECRET_CALLBACK
  6541. ssl->sessionSecretCb = NULL;
  6542. ssl->sessionSecretCtx = NULL;
  6543. #ifdef WOLFSSL_TLS13
  6544. ssl->tls13SecretCb = NULL;
  6545. ssl->tls13SecretCtx = NULL;
  6546. #endif
  6547. #endif
  6548. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  6549. if (ctx->keyLogCb != NULL) {
  6550. ssl->keyLogCb = SessionSecret_callback;
  6551. #if defined(WOLFSSL_TLS13)
  6552. ssl->tls13KeyLogCb = SessionSecret_callback_Tls13;
  6553. #endif /*WOLFSSL_TLS13*/
  6554. }
  6555. #endif /*OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  6556. ssl->session = wolfSSL_NewSession(ssl->heap);
  6557. if (ssl->session == NULL) {
  6558. WOLFSSL_MSG("SSL Session Memory error");
  6559. return MEMORY_E;
  6560. }
  6561. #ifdef HAVE_SESSION_TICKET
  6562. ssl->options.noTicketTls12 = ctx->noTicketTls12;
  6563. #endif
  6564. #ifdef WOLFSSL_MULTICAST
  6565. if (ctx->haveMcast) {
  6566. int i;
  6567. ssl->options.haveMcast = 1;
  6568. ssl->options.mcastID = ctx->mcastID;
  6569. /* Force the state to look like handshake has completed. */
  6570. /* Keying material is supplied externally. */
  6571. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  6572. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  6573. ssl->options.connectState = SECOND_REPLY_DONE;
  6574. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  6575. ssl->options.handShakeState = HANDSHAKE_DONE;
  6576. ssl->options.handShakeDone = 1;
  6577. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  6578. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  6579. }
  6580. #endif
  6581. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  6582. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  6583. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  6584. int useSecureReneg = ssl->ctx->useSecureReneg;
  6585. /* use secure renegotiation by default (not recommend) */
  6586. #if defined(WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT) || \
  6587. (defined(WOLFSSL_HARDEN_TLS) && !defined(WOLFSSL_NO_TLS12) && \
  6588. !defined(WOLFSSL_HARDEN_TLS_NO_SCR_CHECK))
  6589. useSecureReneg = 1;
  6590. #endif
  6591. if (useSecureReneg) {
  6592. ret = wolfSSL_UseSecureRenegotiation(ssl);
  6593. if (ret != WOLFSSL_SUCCESS)
  6594. return ret;
  6595. }
  6596. }
  6597. #endif /* HAVE_SECURE_RENEGOTIATION */
  6598. #ifdef WOLFSSL_DTLS13
  6599. /* setup 0 (un-protected) epoch */
  6600. ssl->dtls13Epochs[0].isValid = 1;
  6601. ssl->dtls13Epochs[0].side = ENCRYPT_AND_DECRYPT_SIDE;
  6602. ssl->dtls13EncryptEpoch = &ssl->dtls13Epochs[0];
  6603. ssl->dtls13DecryptEpoch = &ssl->dtls13Epochs[0];
  6604. ssl->options.dtls13SendMoreAcks = WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT;
  6605. ssl->dtls13Rtx.rtxRecordTailPtr = &ssl->dtls13Rtx.rtxRecords;
  6606. #endif /* WOLFSSL_DTLS13 */
  6607. #ifdef WOLFSSL_QUIC
  6608. if (ctx->quic.method) {
  6609. ret = wolfSSL_set_quic_method(ssl, ctx->quic.method);
  6610. if (ret != WOLFSSL_SUCCESS)
  6611. return ret;
  6612. }
  6613. #endif
  6614. #if defined(WOLFSSL_MAXQ10XX_TLS)
  6615. ret = wolfSSL_maxq10xx_load_certificate(ssl);
  6616. if (ret != WOLFSSL_SUCCESS)
  6617. return ret;
  6618. #endif
  6619. #if defined(HAVE_SECRET_CALLBACK) && defined(SHOW_SECRETS) && \
  6620. defined(WOLFSSL_SSLKEYLOGFILE)
  6621. (void)wolfSSL_set_tls13_secret_cb(ssl, tls13ShowSecrets, NULL);
  6622. #endif
  6623. return 0;
  6624. }
  6625. /* free use of temporary arrays */
  6626. void FreeArrays(WOLFSSL* ssl, int keep)
  6627. {
  6628. if (ssl->arrays) {
  6629. if (keep && !IsAtLeastTLSv1_3(ssl->version)) {
  6630. /* keeps session id for user retrieval */
  6631. XMEMCPY(ssl->session->sessionID, ssl->arrays->sessionID, ID_LEN);
  6632. ssl->session->sessionIDSz = ssl->arrays->sessionIDSz;
  6633. }
  6634. if (ssl->arrays->preMasterSecret) {
  6635. ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
  6636. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  6637. ssl->arrays->preMasterSecret = NULL;
  6638. }
  6639. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  6640. ssl->arrays->pendingMsg = NULL;
  6641. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  6642. }
  6643. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  6644. ssl->arrays = NULL;
  6645. }
  6646. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  6647. {
  6648. if (ssl && pKey && *pKey) {
  6649. switch (type) {
  6650. #ifndef NO_RSA
  6651. case DYNAMIC_TYPE_RSA:
  6652. wc_FreeRsaKey((RsaKey*)*pKey);
  6653. break;
  6654. #endif /* ! NO_RSA */
  6655. #ifdef HAVE_ECC
  6656. case DYNAMIC_TYPE_ECC:
  6657. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6658. defined(WC_ASYNC_ENABLE_ECC)
  6659. if (((ecc_key*)*pKey)->nb_ctx != NULL) {
  6660. XFREE(((ecc_key*)*pKey)->nb_ctx, ((ecc_key*)*pKey)->heap,
  6661. DYNAMIC_TYPE_TMP_BUFFER);
  6662. }
  6663. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
  6664. WC_ASYNC_ENABLE_ECC */
  6665. wc_ecc_free((ecc_key*)*pKey);
  6666. break;
  6667. #endif /* HAVE_ECC */
  6668. #ifdef HAVE_ED25519
  6669. case DYNAMIC_TYPE_ED25519:
  6670. wc_ed25519_free((ed25519_key*)*pKey);
  6671. break;
  6672. #endif /* HAVE_ED25519 */
  6673. #ifdef HAVE_CURVE25519
  6674. case DYNAMIC_TYPE_CURVE25519:
  6675. wc_curve25519_free((curve25519_key*)*pKey);
  6676. break;
  6677. #endif /* HAVE_CURVE25519 */
  6678. #ifdef HAVE_ED448
  6679. case DYNAMIC_TYPE_ED448:
  6680. wc_ed448_free((ed448_key*)*pKey);
  6681. break;
  6682. #endif /* HAVE_ED448 */
  6683. #ifdef HAVE_CURVE448
  6684. case DYNAMIC_TYPE_CURVE448:
  6685. wc_curve448_free((curve448_key*)*pKey);
  6686. break;
  6687. #endif /* HAVE_CURVE448 */
  6688. #if defined(HAVE_PQC)
  6689. #if defined(HAVE_FALCON)
  6690. case DYNAMIC_TYPE_FALCON:
  6691. wc_falcon_free((falcon_key*)*pKey);
  6692. break;
  6693. #endif /* HAVE_FALCON */
  6694. #if defined(HAVE_DILITHIUM)
  6695. case DYNAMIC_TYPE_DILITHIUM:
  6696. wc_dilithium_free((dilithium_key*)*pKey);
  6697. break;
  6698. #endif /* HAVE_DILITHIUM */
  6699. #endif /* HAVE_PQC */
  6700. #ifndef NO_DH
  6701. case DYNAMIC_TYPE_DH:
  6702. wc_FreeDhKey((DhKey*)*pKey);
  6703. break;
  6704. #endif /* !NO_DH */
  6705. default:
  6706. break;
  6707. }
  6708. XFREE(*pKey, ssl->heap, type);
  6709. /* Reset pointer */
  6710. *pKey = NULL;
  6711. }
  6712. }
  6713. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  6714. {
  6715. int ret = BAD_FUNC_ARG;
  6716. int sz = 0;
  6717. #ifdef HAVE_ECC
  6718. ecc_key* eccKey;
  6719. #endif /* HAVE_ECC */
  6720. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6721. defined(WC_ASYNC_ENABLE_ECC)
  6722. ecc_nb_ctx_t* nbCtx;
  6723. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW && WC_ASYNC_ENABLE_ECC*/
  6724. if (ssl == NULL || pKey == NULL) {
  6725. return BAD_FUNC_ARG;
  6726. }
  6727. /* Sanity check key destination */
  6728. if (*pKey != NULL) {
  6729. WOLFSSL_MSG("Key already present!");
  6730. return BAD_STATE_E;
  6731. }
  6732. /* Determine size */
  6733. switch (type) {
  6734. #ifndef NO_RSA
  6735. case DYNAMIC_TYPE_RSA:
  6736. sz = sizeof(RsaKey);
  6737. break;
  6738. #endif /* ! NO_RSA */
  6739. #ifdef HAVE_ECC
  6740. case DYNAMIC_TYPE_ECC:
  6741. sz = sizeof(ecc_key);
  6742. break;
  6743. #endif /* HAVE_ECC */
  6744. #ifdef HAVE_ED25519
  6745. case DYNAMIC_TYPE_ED25519:
  6746. sz = sizeof(ed25519_key);
  6747. break;
  6748. #endif /* HAVE_ED25519 */
  6749. #ifdef HAVE_CURVE25519
  6750. case DYNAMIC_TYPE_CURVE25519:
  6751. sz = sizeof(curve25519_key);
  6752. break;
  6753. #endif /* HAVE_CURVE25519 */
  6754. #ifdef HAVE_ED448
  6755. case DYNAMIC_TYPE_ED448:
  6756. sz = sizeof(ed448_key);
  6757. break;
  6758. #endif /* HAVE_ED448 */
  6759. #ifdef HAVE_CURVE448
  6760. case DYNAMIC_TYPE_CURVE448:
  6761. sz = sizeof(curve448_key);
  6762. break;
  6763. #endif /* HAVE_CURVE448 */
  6764. #if defined(HAVE_PQC)
  6765. #if defined(HAVE_FALCON)
  6766. case DYNAMIC_TYPE_FALCON:
  6767. sz = sizeof(falcon_key);
  6768. break;
  6769. #endif /* HAVE_FALCON */
  6770. #if defined(HAVE_DILITHIUM)
  6771. case DYNAMIC_TYPE_DILITHIUM:
  6772. sz = sizeof(dilithium_key);
  6773. break;
  6774. #endif /* HAVE_DILITHIUM */
  6775. #endif /* HAVE_PQC */
  6776. #ifndef NO_DH
  6777. case DYNAMIC_TYPE_DH:
  6778. sz = sizeof(DhKey);
  6779. break;
  6780. #endif /* !NO_DH */
  6781. default:
  6782. return BAD_FUNC_ARG;
  6783. }
  6784. /* Allocate memory for key */
  6785. *pKey = (void *)XMALLOC(sz, ssl->heap, type);
  6786. if (*pKey == NULL) {
  6787. return MEMORY_E;
  6788. }
  6789. /* Initialize key */
  6790. switch (type) {
  6791. #ifndef NO_RSA
  6792. case DYNAMIC_TYPE_RSA:
  6793. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  6794. break;
  6795. #endif /* ! NO_RSA */
  6796. #ifdef HAVE_ECC
  6797. case DYNAMIC_TYPE_ECC:
  6798. eccKey = (ecc_key*)*pKey;
  6799. ret = wc_ecc_init_ex(eccKey, ssl->heap, ssl->devId);
  6800. if (ret == 0) {
  6801. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6802. defined(WC_ASYNC_ENABLE_ECC)
  6803. nbCtx = (ecc_nb_ctx_t*)XMALLOC(sizeof(ecc_nb_ctx_t),
  6804. eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6805. if (nbCtx == NULL) {
  6806. ret = MEMORY_E;
  6807. }
  6808. else {
  6809. ret = wc_ecc_set_nonblock(eccKey, nbCtx);
  6810. if (ret != 0) {
  6811. XFREE(nbCtx, eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6812. }
  6813. }
  6814. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
  6815. WC_ASYNC_ENABLE_ECC */
  6816. }
  6817. break;
  6818. #endif /* HAVE_ECC */
  6819. #ifdef HAVE_ED25519
  6820. case DYNAMIC_TYPE_ED25519:
  6821. wc_ed25519_init_ex((ed25519_key*)*pKey, ssl->heap, ssl->devId);
  6822. ret = 0;
  6823. break;
  6824. #endif /* HAVE_CURVE25519 */
  6825. #ifdef HAVE_CURVE25519
  6826. case DYNAMIC_TYPE_CURVE25519:
  6827. wc_curve25519_init_ex((curve25519_key*)*pKey, ssl->heap, ssl->devId);
  6828. ret = 0;
  6829. break;
  6830. #endif /* HAVE_CURVE25519 */
  6831. #ifdef HAVE_ED448
  6832. case DYNAMIC_TYPE_ED448:
  6833. wc_ed448_init_ex((ed448_key*)*pKey, ssl->heap, ssl->devId);
  6834. ret = 0;
  6835. break;
  6836. #endif /* HAVE_CURVE448 */
  6837. #if defined(HAVE_PQC)
  6838. #if defined(HAVE_FALCON)
  6839. case DYNAMIC_TYPE_FALCON:
  6840. wc_falcon_init((falcon_key*)*pKey);
  6841. ret = 0;
  6842. break;
  6843. #endif /* HAVE_FALCON */
  6844. #if defined(HAVE_DILITHIUM)
  6845. case DYNAMIC_TYPE_DILITHIUM:
  6846. wc_dilithium_init((dilithium_key*)*pKey);
  6847. ret = 0;
  6848. break;
  6849. #endif /* HAVE_DILITHIUM */
  6850. #endif /* HAVE_PQC */
  6851. #ifdef HAVE_CURVE448
  6852. case DYNAMIC_TYPE_CURVE448:
  6853. wc_curve448_init((curve448_key*)*pKey);
  6854. ret = 0;
  6855. break;
  6856. #endif /* HAVE_CURVE448 */
  6857. #ifndef NO_DH
  6858. case DYNAMIC_TYPE_DH:
  6859. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  6860. break;
  6861. #endif /* !NO_DH */
  6862. default:
  6863. return BAD_FUNC_ARG;
  6864. }
  6865. /* On error free handshake key */
  6866. if (ret != 0) {
  6867. FreeKey(ssl, type, pKey);
  6868. }
  6869. return ret;
  6870. }
  6871. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  6872. defined(HAVE_CURVE25519) || defined(HAVE_ED448) || \
  6873. defined(HAVE_CURVE448) || (defined(HAVE_PQC) && defined(HAVE_FALCON)) || \
  6874. (defined(HAVE_PQC) && defined(HAVE_DILITHIUM))
  6875. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  6876. {
  6877. int ret = 0;
  6878. (void)ssl;
  6879. switch (type) {
  6880. #ifndef NO_RSA
  6881. case DYNAMIC_TYPE_RSA:
  6882. wc_FreeRsaKey((RsaKey*)pKey);
  6883. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  6884. break;
  6885. #endif /* ! NO_RSA */
  6886. #ifdef HAVE_ECC
  6887. case DYNAMIC_TYPE_ECC:
  6888. wc_ecc_free((ecc_key*)pKey);
  6889. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  6890. break;
  6891. #endif /* HAVE_ECC */
  6892. #ifdef HAVE_ED25519
  6893. case DYNAMIC_TYPE_ED25519:
  6894. wc_ed25519_free((ed25519_key*)pKey);
  6895. ret = wc_ed25519_init_ex((ed25519_key*)pKey, ssl->heap,
  6896. ssl->devId);
  6897. break;
  6898. #endif /* HAVE_CURVE25519 */
  6899. #ifdef HAVE_CURVE25519
  6900. case DYNAMIC_TYPE_CURVE25519:
  6901. wc_curve25519_free((curve25519_key*)pKey);
  6902. ret = wc_curve25519_init_ex((curve25519_key*)pKey, ssl->heap,
  6903. ssl->devId);
  6904. break;
  6905. #endif /* HAVE_CURVE25519 */
  6906. #ifdef HAVE_ED448
  6907. case DYNAMIC_TYPE_ED448:
  6908. wc_ed448_free((ed448_key*)pKey);
  6909. ret = wc_ed448_init_ex((ed448_key*)pKey, ssl->heap, ssl->devId);
  6910. break;
  6911. #endif /* HAVE_CURVE448 */
  6912. #ifdef HAVE_CURVE448
  6913. case DYNAMIC_TYPE_CURVE448:
  6914. wc_curve448_free((curve448_key*)pKey);
  6915. ret = wc_curve448_init((curve448_key*)pKey);
  6916. break;
  6917. #endif /* HAVE_CURVE448 */
  6918. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  6919. case DYNAMIC_TYPE_FALCON:
  6920. wc_falcon_free((falcon_key*)pKey);
  6921. ret = wc_falcon_init((falcon_key*)pKey);
  6922. break;
  6923. #endif /* HAVE_PQC && HAVE_FALCON */
  6924. #ifndef NO_DH
  6925. case DYNAMIC_TYPE_DH:
  6926. wc_FreeDhKey((DhKey*)pKey);
  6927. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  6928. break;
  6929. #endif /* !NO_DH */
  6930. default:
  6931. return BAD_FUNC_ARG;
  6932. }
  6933. return ret;
  6934. }
  6935. #endif
  6936. #ifdef WOLFSSL_ASYNC_IO
  6937. void FreeAsyncCtx(WOLFSSL* ssl, byte freeAsync)
  6938. {
  6939. if (ssl->async != NULL) {
  6940. if (ssl->async->freeArgs != NULL) {
  6941. ssl->async->freeArgs(ssl, ssl->async->args);
  6942. ssl->async->freeArgs = NULL;
  6943. }
  6944. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WOLFSSL_NO_TLS12)
  6945. if (ssl->options.buildArgsSet) {
  6946. FreeBuildMsgArgs(ssl, &ssl->async->buildArgs);
  6947. ssl->options.buildArgsSet = 0;
  6948. }
  6949. #endif
  6950. if (freeAsync) {
  6951. XFREE(ssl->async, ssl->heap, DYNAMIC_TYPE_ASYNC);
  6952. ssl->async = NULL;
  6953. }
  6954. }
  6955. }
  6956. #endif
  6957. void FreeKeyExchange(WOLFSSL* ssl)
  6958. {
  6959. /* Cleanup signature buffer */
  6960. if (ssl->buffers.sig.buffer) {
  6961. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  6962. ssl->buffers.sig.buffer = NULL;
  6963. ssl->buffers.sig.length = 0;
  6964. }
  6965. /* Cleanup digest buffer */
  6966. if (ssl->buffers.digest.buffer) {
  6967. /* Only free if digest buffer was not set using SetDigest */
  6968. if (!ssl->options.dontFreeDigest) {
  6969. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  6970. }
  6971. ssl->buffers.digest.buffer = NULL;
  6972. ssl->buffers.digest.length = 0;
  6973. ssl->options.dontFreeDigest = 0;
  6974. }
  6975. /* Free handshake key */
  6976. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  6977. #ifndef NO_DH
  6978. /* Free temp DH key */
  6979. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  6980. #endif
  6981. }
  6982. /* Free up all memory used by Suites structure from WOLFSSL */
  6983. void FreeSuites(WOLFSSL* ssl)
  6984. {
  6985. #ifdef OPENSSL_ALL
  6986. if (ssl->suitesStack != NULL) {
  6987. /* Enough to free stack structure since WOLFSSL_CIPHER
  6988. * isn't allocated separately. */
  6989. wolfSSL_sk_SSL_CIPHER_free(ssl->suitesStack);
  6990. ssl->suitesStack = NULL;
  6991. }
  6992. #endif
  6993. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  6994. ssl->suites = NULL;
  6995. }
  6996. /* In case holding SSL object in array and don't want to free actual ssl */
  6997. void SSL_ResourceFree(WOLFSSL* ssl)
  6998. {
  6999. /* Note: any resources used during the handshake should be released in the
  7000. * function FreeHandshakeResources(). Be careful with the special cases
  7001. * like the RNG which may optionally be kept for the whole session. (For
  7002. * example with the RNG, it isn't used beyond the handshake except when
  7003. * using stream ciphers where it is retained. */
  7004. if (ssl->options.side == WOLFSSL_SERVER_END) {
  7005. WOLFSSL_MSG("Free'ing server ssl");
  7006. }
  7007. else {
  7008. WOLFSSL_MSG("Free'ing client ssl");
  7009. }
  7010. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  7011. wolfSSL_CRYPTO_cleanup_ex_data(&ssl->ex_data);
  7012. #endif
  7013. FreeCiphers(ssl);
  7014. FreeArrays(ssl, 0);
  7015. FreeKeyExchange(ssl);
  7016. #ifdef WOLFSSL_ASYNC_IO
  7017. /* Cleanup async */
  7018. FreeAsyncCtx(ssl, 1);
  7019. #endif
  7020. if (ssl->options.weOwnRng) {
  7021. wc_FreeRng(ssl->rng);
  7022. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  7023. }
  7024. FreeSuites(ssl);
  7025. FreeHandshakeHashes(ssl);
  7026. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  7027. /* clear keys struct after session */
  7028. ForceZero(&ssl->keys, sizeof(Keys));
  7029. #ifdef WOLFSSL_TLS13
  7030. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  7031. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  7032. #if defined(HAVE_ECH)
  7033. if (ssl->options.useEch == 1) {
  7034. FreeEchConfigs(ssl->echConfigs, ssl->heap);
  7035. ssl->echConfigs = NULL;
  7036. /* free the ech specific hashes */
  7037. ssl->hsHashes = ssl->hsHashesEch;
  7038. FreeHandshakeHashes(ssl);
  7039. ssl->options.useEch = 0;
  7040. }
  7041. #endif /* HAVE_ECH */
  7042. #endif /* WOLFSSL_TLS13 */
  7043. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  7044. ForceZero(&ssl->clientFinished, TLS_FINISHED_SZ_MAX);
  7045. ForceZero(&ssl->serverFinished, TLS_FINISHED_SZ_MAX);
  7046. ssl->serverFinished_len = 0;
  7047. ssl->clientFinished_len = 0;
  7048. #endif
  7049. #ifndef NO_DH
  7050. if (ssl->buffers.serverDH_Priv.buffer != NULL) {
  7051. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  7052. ssl->buffers.serverDH_Priv.length);
  7053. }
  7054. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  7055. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7056. /* parameters (p,g) may be owned by ctx */
  7057. if (ssl->buffers.weOwnDH) {
  7058. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7059. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7060. }
  7061. #endif /* !NO_DH */
  7062. #ifndef NO_CERTS
  7063. ssl->keepCert = 0; /* make sure certificate is free'd */
  7064. wolfSSL_UnloadCertsKeys(ssl);
  7065. #endif
  7066. #ifndef NO_RSA
  7067. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  7068. ssl->peerRsaKeyPresent = 0;
  7069. #endif
  7070. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS)
  7071. XFREE(ssl->peerSceTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
  7072. Renesas_cmn_Cleanup(ssl);
  7073. #endif
  7074. if (ssl->buffers.inputBuffer.dynamicFlag)
  7075. ShrinkInputBuffer(ssl, FORCED_FREE);
  7076. if (ssl->buffers.outputBuffer.dynamicFlag)
  7077. ShrinkOutputBuffer(ssl);
  7078. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  7079. if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
  7080. ForceZero(ssl->buffers.tls13CookieSecret.buffer,
  7081. ssl->buffers.tls13CookieSecret.length);
  7082. }
  7083. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  7084. DYNAMIC_TYPE_COOKIE_PWD);
  7085. #endif
  7086. #ifdef WOLFSSL_DTLS
  7087. DtlsMsgPoolReset(ssl);
  7088. if (ssl->dtls_rx_msg_list != NULL) {
  7089. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  7090. ssl->dtls_rx_msg_list = NULL;
  7091. ssl->dtls_rx_msg_list_sz = 0;
  7092. }
  7093. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  7094. ssl->buffers.dtlsCtx.peer.sa = NULL;
  7095. #ifndef NO_WOLFSSL_SERVER
  7096. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  7097. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  7098. ssl->buffers.dtlsCookieSecret.length);
  7099. }
  7100. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  7101. DYNAMIC_TYPE_COOKIE_PWD);
  7102. #endif
  7103. #ifdef WOLFSSL_DTLS13
  7104. if (ssl->dtls13ClientHello != NULL) {
  7105. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  7106. ssl->dtls13ClientHello = NULL;
  7107. ssl->dtls13ClientHelloSz = 0;
  7108. }
  7109. #endif /* WOLFSSL_DTLS13 */
  7110. #endif /* WOLFSSL_DTLS */
  7111. #ifdef OPENSSL_EXTRA
  7112. #ifndef NO_BIO
  7113. /* Don't free if there was/is a previous element in the chain.
  7114. * This means that this BIO was part of a chain that will be
  7115. * free'd separately. */
  7116. if (ssl->biord != ssl->biowr) /* only free write if different */
  7117. if (ssl->biowr != NULL && ssl->biowr->prev == NULL)
  7118. wolfSSL_BIO_free(ssl->biowr);
  7119. if (ssl->biord != NULL && ssl->biord->prev == NULL)
  7120. wolfSSL_BIO_free(ssl->biord);
  7121. ssl->biowr = NULL;
  7122. ssl->biord = NULL;
  7123. #endif
  7124. #endif
  7125. #ifdef HAVE_LIBZ
  7126. FreeStreams(ssl);
  7127. #endif
  7128. #ifdef HAVE_ECC
  7129. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  7130. ssl->peerEccKeyPresent = 0;
  7131. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  7132. ssl->peerEccDsaKeyPresent = 0;
  7133. #endif
  7134. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
  7135. {
  7136. int dtype = 0;
  7137. #ifdef HAVE_ECC
  7138. dtype = DYNAMIC_TYPE_ECC;
  7139. #endif
  7140. #ifdef HAVE_CURVE25519
  7141. if (ssl->peerX25519KeyPresent
  7142. #ifdef HAVE_ECC
  7143. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
  7144. #endif /* HAVE_ECC */
  7145. )
  7146. {
  7147. dtype = DYNAMIC_TYPE_CURVE25519;
  7148. }
  7149. #endif /* HAVE_CURVE25519 */
  7150. #ifdef HAVE_CURVE448
  7151. if (ssl->peerX448KeyPresent
  7152. #ifdef HAVE_ECC
  7153. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
  7154. #endif /* HAVE_ECC */
  7155. )
  7156. {
  7157. dtype = DYNAMIC_TYPE_CURVE448;
  7158. }
  7159. #endif /* HAVE_CURVE448 */
  7160. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  7161. ssl->eccTempKeyPresent = 0;
  7162. }
  7163. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7164. #ifdef HAVE_CURVE25519
  7165. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  7166. ssl->peerX25519KeyPresent = 0;
  7167. #endif
  7168. #ifdef HAVE_ED25519
  7169. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  7170. ssl->peerEd25519KeyPresent = 0;
  7171. #ifdef HAVE_PK_CALLBACKS
  7172. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  7173. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  7174. DYNAMIC_TYPE_ED25519);
  7175. ssl->buffers.peerEd25519Key.buffer = NULL;
  7176. }
  7177. #endif
  7178. #endif
  7179. #ifdef HAVE_CURVE448
  7180. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  7181. ssl->peerX448KeyPresent = 0;
  7182. #endif
  7183. #ifdef HAVE_ED448
  7184. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  7185. ssl->peerEd448KeyPresent = 0;
  7186. #ifdef HAVE_PK_CALLBACKS
  7187. if (ssl->buffers.peerEd448Key.buffer != NULL) {
  7188. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
  7189. DYNAMIC_TYPE_ED448);
  7190. ssl->buffers.peerEd448Key.buffer = NULL;
  7191. }
  7192. #endif
  7193. #endif
  7194. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  7195. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  7196. ssl->peerFalconKeyPresent = 0;
  7197. #endif
  7198. #ifdef HAVE_PK_CALLBACKS
  7199. #ifdef HAVE_ECC
  7200. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  7201. #endif /* HAVE_ECC */
  7202. #ifndef NO_RSA
  7203. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  7204. #endif /* NO_RSA */
  7205. #endif /* HAVE_PK_CALLBACKS */
  7206. #ifdef HAVE_TLS_EXTENSIONS
  7207. #if !defined(NO_TLS)
  7208. TLSX_FreeAll(ssl->extensions, ssl->heap);
  7209. #endif /* !NO_TLS */
  7210. #ifdef HAVE_ALPN
  7211. if (ssl->alpn_peer_requested != NULL) {
  7212. XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
  7213. ssl->alpn_peer_requested = NULL;
  7214. ssl->alpn_peer_requested_length = 0;
  7215. }
  7216. #endif
  7217. #endif /* HAVE_TLS_EXTENSIONS */
  7218. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  7219. if (ssl->mnCtx) {
  7220. mynewt_ctx_clear(ssl->mnCtx);
  7221. ssl->mnCtx = NULL;
  7222. }
  7223. #endif
  7224. #ifdef HAVE_NETX
  7225. if (ssl->nxCtx.nxPacket)
  7226. nx_packet_release(ssl->nxCtx.nxPacket);
  7227. #endif
  7228. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  7229. if (ssl->x509_store_pt)
  7230. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  7231. #endif
  7232. #ifdef KEEP_PEER_CERT
  7233. FreeX509(&ssl->peerCert);
  7234. #endif
  7235. if (ssl->session != NULL)
  7236. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  7237. #ifdef HAVE_WRITE_DUP
  7238. if (ssl->dupWrite) {
  7239. FreeWriteDup(ssl);
  7240. }
  7241. #endif
  7242. #ifdef OPENSSL_EXTRA
  7243. if (ssl->param) {
  7244. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  7245. }
  7246. #endif
  7247. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7248. while (ssl->certReqCtx != NULL) {
  7249. CertReqCtx* curr = ssl->certReqCtx;
  7250. ssl->certReqCtx = curr->next;
  7251. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  7252. }
  7253. #endif
  7254. #ifdef WOLFSSL_STATIC_EPHEMERAL
  7255. #ifndef NO_DH
  7256. FreeDer(&ssl->staticKE.dhKey);
  7257. #endif
  7258. #ifdef HAVE_ECC
  7259. FreeDer(&ssl->staticKE.ecKey);
  7260. #endif
  7261. #ifdef HAVE_CURVE25519
  7262. FreeDer(&ssl->staticKE.x25519Key);
  7263. #endif
  7264. #ifdef HAVE_CURVE448
  7265. FreeDer(&ssl->staticKE.x448Key);
  7266. #endif
  7267. #endif
  7268. #ifdef WOLFSSL_STATIC_MEMORY
  7269. /* check if using fixed io buffers and free them */
  7270. if (ssl->heap != NULL) {
  7271. #ifdef WOLFSSL_HEAP_TEST
  7272. /* avoid dereferencing a test value */
  7273. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  7274. #endif
  7275. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  7276. WOLFSSL_HEAP* ctx_heap;
  7277. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  7278. ctx_heap = ssl_hint->memory;
  7279. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  7280. WOLFSSL_MSG("Bad memory_mutex lock");
  7281. }
  7282. ctx_heap->curIO--;
  7283. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  7284. WOLFSSL_MSG("Error freeing fixed output buffer");
  7285. }
  7286. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  7287. WOLFSSL_MSG("Error freeing fixed output buffer");
  7288. }
  7289. if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/
  7290. ctx_heap->curHa--;
  7291. }
  7292. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  7293. /* check if tracking stats */
  7294. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  7295. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  7296. }
  7297. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  7298. #ifdef WOLFSSL_HEAP_TEST
  7299. }
  7300. #endif
  7301. }
  7302. #endif /* WOLFSSL_STATIC_MEMORY */
  7303. #ifdef OPENSSL_EXTRA
  7304. /* Enough to free stack structure since WOLFSSL_CIPHER
  7305. * isn't allocated separately. */
  7306. wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
  7307. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  7308. #ifdef KEEP_OUR_CERT
  7309. wolfSSL_sk_X509_pop_free(ssl->ourCertChain, NULL);
  7310. #endif
  7311. #endif
  7312. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  7313. wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
  7314. ssl->client_ca_names = NULL;
  7315. #endif
  7316. #ifdef WOLFSSL_DTLS13
  7317. Dtls13FreeFsmResources(ssl);
  7318. #endif /* WOLFSSL_DTLS13 */
  7319. #ifdef WOLFSSL_QUIC
  7320. wolfSSL_quic_free(ssl);
  7321. #endif
  7322. }
  7323. /* Free any handshake resources no longer needed */
  7324. void FreeHandshakeResources(WOLFSSL* ssl)
  7325. {
  7326. WOLFSSL_ENTER("FreeHandshakeResources");
  7327. #ifdef WOLFSSL_DTLS
  7328. if (ssl->options.dtls) {
  7329. /* DTLS_POOL (DTLSv1.3 flushes the queue autonomously) */
  7330. if(!IsAtLeastTLSv1_3(ssl->version)) {
  7331. DtlsMsgPoolReset(ssl);
  7332. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  7333. ssl->dtls_rx_msg_list = NULL;
  7334. ssl->dtls_rx_msg_list_sz = 0;
  7335. }
  7336. #ifdef WOLFSSL_DTLS13
  7337. if (ssl->dtls13ClientHello != NULL) {
  7338. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  7339. ssl->dtls13ClientHello = NULL;
  7340. ssl->dtls13ClientHelloSz = 0;
  7341. }
  7342. #endif /* WOLFSSL_DTLS13 */
  7343. }
  7344. #endif
  7345. #ifdef HAVE_SECURE_RENEGOTIATION
  7346. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  7347. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  7348. return;
  7349. }
  7350. #endif
  7351. /* input buffer */
  7352. if (ssl->buffers.inputBuffer.dynamicFlag)
  7353. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  7354. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7355. if (!ssl->options.tls1_3)
  7356. #endif
  7357. {
  7358. #ifndef OPENSSL_EXTRA
  7359. /* free suites unless using compatibility layer */
  7360. FreeSuites(ssl);
  7361. #endif
  7362. /* hsHashes */
  7363. FreeHandshakeHashes(ssl);
  7364. }
  7365. /* RNG */
  7366. if (ssl->options.tls1_1 == 0
  7367. #ifndef WOLFSSL_AEAD_ONLY
  7368. || ssl->specs.cipher_type == stream
  7369. #endif
  7370. #if defined(WOLFSSL_TLS13)
  7371. /* Post-handshake auth requires random on client side for TLS 1.3.
  7372. * Session ticket requires random on server side.
  7373. */
  7374. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && !defined(HAVE_SESSION_TICKET)
  7375. || ssl->options.tls1_3
  7376. #elif !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && defined(HAVE_SESSION_TICKET)
  7377. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_CLIENT_END)
  7378. #elif !defined(HAVE_SESSION_TICKET)
  7379. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  7380. #endif
  7381. #endif
  7382. ) {
  7383. if (ssl->options.weOwnRng) {
  7384. wc_FreeRng(ssl->rng);
  7385. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  7386. ssl->rng = NULL;
  7387. ssl->options.weOwnRng = 0;
  7388. }
  7389. }
  7390. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  7391. defined(HAVE_SESSION_TICKET)
  7392. if (!ssl->options.tls1_3)
  7393. #endif
  7394. /* arrays */
  7395. if (ssl->options.saveArrays == 0)
  7396. FreeArrays(ssl, 1);
  7397. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7398. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  7399. #endif
  7400. {
  7401. #ifndef NO_RSA
  7402. /* peerRsaKey */
  7403. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  7404. ssl->peerRsaKeyPresent = 0;
  7405. #endif
  7406. #ifdef HAVE_ECC
  7407. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  7408. ssl->peerEccDsaKeyPresent = 0;
  7409. #endif /* HAVE_ECC */
  7410. #ifdef HAVE_ED25519
  7411. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  7412. ssl->peerEd25519KeyPresent = 0;
  7413. #endif /* HAVE_ED25519 */
  7414. #ifdef HAVE_ED448
  7415. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  7416. ssl->peerEd448KeyPresent = 0;
  7417. #endif /* HAVE_ED448 */
  7418. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  7419. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  7420. ssl->peerFalconKeyPresent = 0;
  7421. #endif /* HAVE_PQC */
  7422. }
  7423. #ifdef HAVE_ECC
  7424. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  7425. ssl->peerEccKeyPresent = 0;
  7426. #endif
  7427. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7428. {
  7429. int dtype;
  7430. #ifdef HAVE_ECC
  7431. dtype = DYNAMIC_TYPE_ECC;
  7432. #elif defined(HAVE_CURVE25519)
  7433. dtype = DYNAMIC_TYPE_CURVE25519;
  7434. #else
  7435. dtype = DYNAMIC_TYPE_CURVE448;
  7436. #endif
  7437. #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
  7438. if (ssl->peerX25519KeyPresent ||
  7439. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  7440. {
  7441. dtype = DYNAMIC_TYPE_CURVE25519;
  7442. }
  7443. #endif
  7444. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  7445. defined(HAVE_CURVE448)
  7446. if (ssl->peerX448KeyPresent ||
  7447. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
  7448. {
  7449. dtype = DYNAMIC_TYPE_CURVE448;
  7450. }
  7451. #endif
  7452. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  7453. ssl->eccTempKeyPresent = 0;
  7454. }
  7455. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7456. #ifdef HAVE_CURVE25519
  7457. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  7458. ssl->peerX25519KeyPresent = 0;
  7459. #endif
  7460. #ifdef HAVE_CURVE448
  7461. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  7462. ssl->peerX448KeyPresent = 0;
  7463. #endif
  7464. #ifndef NO_DH
  7465. if (ssl->buffers.serverDH_Priv.buffer) {
  7466. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  7467. ssl->buffers.serverDH_Priv.length);
  7468. }
  7469. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  7470. ssl->buffers.serverDH_Priv.buffer = NULL;
  7471. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7472. ssl->buffers.serverDH_Pub.buffer = NULL;
  7473. /* parameters (p,g) may be owned by ctx */
  7474. if (ssl->buffers.weOwnDH) {
  7475. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7476. ssl->buffers.serverDH_G.buffer = NULL;
  7477. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7478. ssl->buffers.serverDH_P.buffer = NULL;
  7479. }
  7480. #endif /* !NO_DH */
  7481. #ifndef NO_CERTS
  7482. wolfSSL_UnloadCertsKeys(ssl);
  7483. #endif
  7484. #ifdef HAVE_PK_CALLBACKS
  7485. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7486. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  7487. #endif
  7488. {
  7489. #ifdef HAVE_ECC
  7490. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  7491. ssl->buffers.peerEccDsaKey.buffer = NULL;
  7492. #endif /* HAVE_ECC */
  7493. #ifndef NO_RSA
  7494. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  7495. ssl->buffers.peerRsaKey.buffer = NULL;
  7496. #endif /* NO_RSA */
  7497. #ifdef HAVE_ED25519
  7498. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  7499. DYNAMIC_TYPE_ED25519);
  7500. ssl->buffers.peerEd25519Key.buffer = NULL;
  7501. #endif
  7502. #ifdef HAVE_ED448
  7503. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
  7504. ssl->buffers.peerEd448Key.buffer = NULL;
  7505. #endif
  7506. }
  7507. #endif /* HAVE_PK_CALLBACKS */
  7508. #if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \
  7509. !defined(NO_TLS) && !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  7510. !defined(WOLFSSL_DTLS_CID)
  7511. /* Some extensions need to be kept for post-handshake querying. */
  7512. TLSX_FreeAll(ssl->extensions, ssl->heap);
  7513. ssl->extensions = NULL;
  7514. #endif
  7515. #ifdef WOLFSSL_STATIC_MEMORY
  7516. /* when done with handshake decrement current handshake count */
  7517. if (ssl->heap != NULL) {
  7518. #ifdef WOLFSSL_HEAP_TEST
  7519. /* avoid dereferencing a test value */
  7520. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  7521. #endif
  7522. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  7523. WOLFSSL_HEAP* ctx_heap;
  7524. ctx_heap = ssl_hint->memory;
  7525. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  7526. WOLFSSL_MSG("Bad memory_mutex lock");
  7527. }
  7528. ctx_heap->curHa--;
  7529. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  7530. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  7531. #ifdef WOLFSSL_HEAP_TEST
  7532. }
  7533. #endif
  7534. }
  7535. #endif /* WOLFSSL_STATIC_MEMORY */
  7536. }
  7537. /* heap argument is the heap hint used when creating SSL */
  7538. void FreeSSL(WOLFSSL* ssl, void* heap)
  7539. {
  7540. WOLFSSL_CTX* ctx = ssl->ctx;
  7541. SSL_ResourceFree(ssl);
  7542. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  7543. if (ctx)
  7544. FreeSSL_Ctx(ctx); /* will decrement and free underlying CTX if 0 */
  7545. (void)heap;
  7546. #ifdef WOLFSSL_CHECK_MEM_ZERO
  7547. wc_MemZero_Check(ssl, sizeof(*ssl));
  7548. #endif
  7549. }
  7550. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  7551. !defined(WOLFSSL_NO_TLS12) || \
  7552. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || \
  7553. defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) \
  7554. && defined(HAVE_AEAD))
  7555. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  7556. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  7557. {
  7558. if (verify) {
  7559. seq[0] = ssl->keys.peer_sequence_number_hi;
  7560. seq[1] = ssl->keys.peer_sequence_number_lo++;
  7561. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  7562. /* handle rollover */
  7563. ssl->keys.peer_sequence_number_hi++;
  7564. }
  7565. }
  7566. else {
  7567. seq[0] = ssl->keys.sequence_number_hi;
  7568. seq[1] = ssl->keys.sequence_number_lo++;
  7569. if (seq[1] > ssl->keys.sequence_number_lo) {
  7570. /* handle rollover */
  7571. ssl->keys.sequence_number_hi++;
  7572. }
  7573. }
  7574. }
  7575. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  7576. #ifdef WOLFSSL_DTLS
  7577. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  7578. {
  7579. #ifdef HAVE_SECURE_RENEGOTIATION
  7580. order = DtlsCheckOrder(ssl, order);
  7581. #endif
  7582. if (order == PREV_ORDER) {
  7583. /* Previous epoch case */
  7584. if (ssl->options.haveMcast) {
  7585. #ifdef WOLFSSL_MULTICAST
  7586. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  7587. (ssl->options.mcastID << 8) |
  7588. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  7589. #endif
  7590. }
  7591. else
  7592. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  7593. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  7594. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  7595. }
  7596. else if (order == PEER_ORDER) {
  7597. if (ssl->options.haveMcast) {
  7598. #ifdef WOLFSSL_MULTICAST
  7599. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  7600. (ssl->keys.curPeerId << 8) |
  7601. (ssl->keys.curSeq_hi & 0xFF);
  7602. #endif
  7603. }
  7604. else
  7605. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  7606. (ssl->keys.curSeq_hi & 0xFFFF);
  7607. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  7608. }
  7609. else {
  7610. if (ssl->options.haveMcast) {
  7611. #ifdef WOLFSSL_MULTICAST
  7612. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  7613. (ssl->options.mcastID << 8) |
  7614. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  7615. #endif
  7616. }
  7617. else
  7618. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  7619. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  7620. seq[1] = ssl->keys.dtls_sequence_number_lo;
  7621. }
  7622. }
  7623. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  7624. {
  7625. word32 seq;
  7626. #ifdef HAVE_SECURE_RENEGOTIATION
  7627. order = DtlsCheckOrder(ssl, order);
  7628. #endif
  7629. if (order == PREV_ORDER) {
  7630. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  7631. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  7632. /* handle rollover */
  7633. ssl->keys.dtls_prev_sequence_number_hi++;
  7634. }
  7635. }
  7636. else if (order == PEER_ORDER) {
  7637. seq = ssl->keys.peer_sequence_number_lo++;
  7638. if (seq > ssl->keys.peer_sequence_number_lo) {
  7639. /* handle rollover */
  7640. ssl->keys.peer_sequence_number_hi++;
  7641. }
  7642. }
  7643. else {
  7644. seq = ssl->keys.dtls_sequence_number_lo++;
  7645. if (seq > ssl->keys.dtls_sequence_number_lo) {
  7646. /* handle rollover */
  7647. ssl->keys.dtls_sequence_number_hi++;
  7648. }
  7649. }
  7650. }
  7651. #endif /* WOLFSSL_DTLS */
  7652. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  7653. void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  7654. {
  7655. word32 seq[2] = {0, 0};
  7656. if (!ssl->options.dtls) {
  7657. GetSEQIncrement(ssl, verifyOrder, seq);
  7658. }
  7659. else {
  7660. #ifdef WOLFSSL_DTLS
  7661. DtlsGetSEQ(ssl, verifyOrder, seq);
  7662. #endif
  7663. }
  7664. c32toa(seq[0], out);
  7665. c32toa(seq[1], out + OPAQUE32_LEN);
  7666. }
  7667. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  7668. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
  7669. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_SM4_GCM ||
  7670. * WOLFSSL_SM4_CCM) && HAVE_AEAD) */
  7671. #ifdef WOLFSSL_DTLS
  7672. /* functions for managing DTLS datagram reordering */
  7673. /* Need to allocate space for the handshake message header. The hashing
  7674. * routines assume the message pointer is still within the buffer that
  7675. * has the headers, and will include those headers in the hash. The store
  7676. * routines need to take that into account as well. New will allocate
  7677. * extra space for the headers. */
  7678. DtlsMsg* DtlsMsgNew(word32 sz, byte tx, void* heap)
  7679. {
  7680. DtlsMsg* msg;
  7681. WOLFSSL_ENTER("DtlsMsgNew");
  7682. (void)heap;
  7683. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  7684. if (msg != NULL) {
  7685. XMEMSET(msg, 0, sizeof(DtlsMsg));
  7686. msg->sz = sz;
  7687. msg->type = no_shake;
  7688. if (tx) {
  7689. msg->raw = msg->fullMsg =
  7690. (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ, heap,
  7691. DYNAMIC_TYPE_DTLS_FRAG);
  7692. msg->ready = 1;
  7693. if (msg->raw == NULL) {
  7694. DtlsMsgDelete(msg, heap);
  7695. msg = NULL;
  7696. }
  7697. }
  7698. }
  7699. return msg;
  7700. }
  7701. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  7702. {
  7703. (void)heap;
  7704. WOLFSSL_ENTER("DtlsMsgDelete");
  7705. if (item != NULL) {
  7706. while (item->fragBucketList != NULL) {
  7707. DtlsFragBucket* next = item->fragBucketList->m.m.next;
  7708. DtlsMsgDestroyFragBucket(item->fragBucketList, heap);
  7709. item->fragBucketList = next;
  7710. }
  7711. if (item->raw != NULL)
  7712. XFREE(item->raw, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7713. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  7714. }
  7715. }
  7716. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  7717. {
  7718. DtlsMsg* next;
  7719. WOLFSSL_ENTER("DtlsMsgListDelete");
  7720. while (head) {
  7721. next = head->next;
  7722. DtlsMsgDelete(head, heap);
  7723. head = next;
  7724. }
  7725. }
  7726. /**
  7727. * Drop messages when they are no longer going to be retransmitted
  7728. */
  7729. void DtlsTxMsgListClean(WOLFSSL* ssl)
  7730. {
  7731. DtlsMsg* head = ssl->dtls_tx_msg_list;
  7732. DtlsMsg* next;
  7733. WOLFSSL_ENTER("DtlsTxMsgListClean");
  7734. while (head) {
  7735. next = head->next;
  7736. if (VerifyForTxDtlsMsgDelete(ssl, head))
  7737. DtlsMsgDelete(head, ssl->heap);
  7738. else
  7739. /* Stored packets should be in order so break on first failed
  7740. * verify */
  7741. break;
  7742. ssl->dtls_tx_msg_list_sz--;
  7743. head = next;
  7744. }
  7745. ssl->dtls_tx_msg_list = head;
  7746. }
  7747. static DtlsFragBucket* DtlsMsgCreateFragBucket(word32 offset, const byte* data,
  7748. word32 dataSz, void* heap)
  7749. {
  7750. DtlsFragBucket* bucket =
  7751. (DtlsFragBucket*)XMALLOC(sizeof(DtlsFragBucket) + dataSz, heap,
  7752. DYNAMIC_TYPE_DTLS_FRAG);
  7753. if (bucket != NULL) {
  7754. XMEMSET(bucket, 0, sizeof(*bucket));
  7755. bucket->m.m.next = NULL;
  7756. bucket->m.m.offset = offset;
  7757. bucket->m.m.sz = dataSz;
  7758. if (data != NULL)
  7759. XMEMCPY(bucket->buf, data, dataSz);
  7760. }
  7761. (void)heap;
  7762. return bucket;
  7763. }
  7764. void DtlsMsgDestroyFragBucket(DtlsFragBucket* fragBucket, void* heap)
  7765. {
  7766. (void)heap;
  7767. XFREE(fragBucket, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7768. }
  7769. /*
  7770. * data overlaps with cur but is before next.
  7771. * data + dataSz has to end before or inside next. next can be NULL.
  7772. */
  7773. static DtlsFragBucket* DtlsMsgCombineFragBuckets(DtlsMsg* msg,
  7774. DtlsFragBucket* cur, DtlsFragBucket* next, word32 offset,
  7775. const byte* data, word32 dataSz, void* heap)
  7776. {
  7777. word32 offsetEnd = offset + dataSz;
  7778. word32 newOffset = min(cur->m.m.offset, offset);
  7779. word32 newOffsetEnd;
  7780. word32 newSz;
  7781. word32 overlapSz = cur->m.m.sz;
  7782. DtlsFragBucket** chosenBucket;
  7783. DtlsFragBucket* newBucket;
  7784. DtlsFragBucket* otherBucket;
  7785. byte combineNext = FALSE;
  7786. if (next != NULL && offsetEnd >= next->m.m.offset)
  7787. combineNext = TRUE;
  7788. if (combineNext)
  7789. newOffsetEnd = next->m.m.offset + next->m.m.sz;
  7790. else
  7791. newOffsetEnd = max(cur->m.m.offset + cur->m.m.sz, offsetEnd);
  7792. newSz = newOffsetEnd - newOffset;
  7793. /* Expand the larger bucket if data bridges the gap between cur and next */
  7794. if (!combineNext || cur->m.m.sz >= next->m.m.sz) {
  7795. chosenBucket = &cur;
  7796. otherBucket = next;
  7797. }
  7798. else {
  7799. chosenBucket = &next;
  7800. otherBucket = cur;
  7801. }
  7802. {
  7803. #ifdef XREALLOC
  7804. DtlsFragBucket* tmp = (DtlsFragBucket*)XREALLOC(*chosenBucket,
  7805. sizeof(DtlsFragBucket) + newSz, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7806. #else
  7807. DtlsFragBucket* tmp = (DtlsFragBucket*)XMALLOC(
  7808. sizeof(DtlsFragBucket) + newSz, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7809. #endif
  7810. if (tmp == NULL)
  7811. return NULL;
  7812. #ifndef XREALLOC
  7813. XMEMCPY(tmp, *chosenBucket, sizeof(DtlsFragBucket) +
  7814. (*chosenBucket)->m.m.sz);
  7815. #endif
  7816. if (chosenBucket == &next) {
  7817. /* Update the link */
  7818. DtlsFragBucket* beforeNext = cur;
  7819. while (beforeNext->m.m.next != next)
  7820. beforeNext = beforeNext->m.m.next;
  7821. beforeNext->m.m.next = tmp;
  7822. }
  7823. #ifndef XREALLOC
  7824. XFREE(*chosenBucket, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7825. #endif
  7826. newBucket = *chosenBucket = tmp;
  7827. }
  7828. if (combineNext) {
  7829. /* Put next first since it will always be at the end. Use memmove since
  7830. * newBucket may be next. */
  7831. XMEMMOVE(newBucket->buf + (next->m.m.offset - newOffset), next->buf,
  7832. next->m.m.sz);
  7833. /* memory after newOffsetEnd is already copied. Don't do extra work. */
  7834. newOffsetEnd = next->m.m.offset;
  7835. }
  7836. if (newOffset == offset) {
  7837. /* data comes first */
  7838. if (newOffsetEnd <= offsetEnd) {
  7839. /* data encompasses cur. only copy data */
  7840. XMEMCPY(newBucket->buf, data,
  7841. min(dataSz, newOffsetEnd - newOffset));
  7842. }
  7843. else {
  7844. /* data -> cur. memcpy as much possible as its faster. */
  7845. XMEMMOVE(newBucket->buf + dataSz, cur->buf,
  7846. cur->m.m.sz - (offsetEnd - cur->m.m.offset));
  7847. XMEMCPY(newBucket->buf, data, dataSz);
  7848. }
  7849. }
  7850. else {
  7851. /* cur -> data */
  7852. word32 curOffsetEnd = cur->m.m.offset + cur->m.m.sz;
  7853. if (newBucket != cur)
  7854. XMEMCPY(newBucket->buf, cur->buf, cur->m.m.sz);
  7855. XMEMCPY(newBucket->buf + cur->m.m.sz,
  7856. data + (curOffsetEnd - offset),
  7857. newOffsetEnd - curOffsetEnd);
  7858. }
  7859. /* FINALLY the newBucket is populated correctly */
  7860. /* All buckets up to and including next (if combining) have to be free'd */
  7861. {
  7862. DtlsFragBucket* toFree = cur->m.m.next;
  7863. while (toFree != next) {
  7864. DtlsFragBucket* n = toFree->m.m.next;
  7865. overlapSz += toFree->m.m.sz;
  7866. DtlsMsgDestroyFragBucket(toFree, heap);
  7867. msg->fragBucketListCount--;
  7868. toFree = n;
  7869. }
  7870. if (combineNext) {
  7871. newBucket->m.m.next = next->m.m.next;
  7872. overlapSz += next->m.m.sz;
  7873. DtlsMsgDestroyFragBucket(otherBucket, heap);
  7874. msg->fragBucketListCount--;
  7875. }
  7876. else {
  7877. newBucket->m.m.next = next;
  7878. }
  7879. }
  7880. /* Adjust size in msg */
  7881. msg->bytesReceived += newSz - overlapSz;
  7882. newBucket->m.m.offset = newOffset;
  7883. newBucket->m.m.sz = newSz;
  7884. return newBucket;
  7885. }
  7886. static void DtlsMsgAssembleCompleteMessage(DtlsMsg* msg)
  7887. {
  7888. DtlsHandShakeHeader* dtls;
  7889. /* We have received all necessary fragments. Reconstruct the header. */
  7890. if (msg->fragBucketListCount != 1 || msg->fragBucketList->m.m.offset != 0 ||
  7891. msg->fragBucketList->m.m.sz != msg->sz) {
  7892. WOLFSSL_MSG("Major error in fragment assembly logic");
  7893. return;
  7894. }
  7895. /* Re-cycle the DtlsFragBucket as the buffer that holds the complete
  7896. * handshake message and the header. */
  7897. msg->raw = (byte*)msg->fragBucketList;
  7898. msg->fullMsg = msg->fragBucketList->buf;
  7899. msg->ready = 1;
  7900. /* frag->padding makes sure we can fit the entire DTLS handshake header
  7901. * before frag->buf */
  7902. /* note the dtls pointer needs to be computed from msg->fragBucketList, not
  7903. * from msg->fragBucketList->buf, to avoid a pointerOutOfBounds access
  7904. * detected by cppcheck.
  7905. *
  7906. * also note, the (void *) intermediate cast is necessary to avoid a
  7907. * potential -Wcast-align around alignment of DtlsHandShakeHeader exceeding
  7908. * alignment of char.
  7909. */
  7910. dtls = (DtlsHandShakeHeader*)(void *)((char *)msg->fragBucketList
  7911. + OFFSETOF(DtlsFragBucket,buf)
  7912. - DTLS_HANDSHAKE_HEADER_SZ);
  7913. msg->fragBucketList = NULL;
  7914. msg->fragBucketListCount = 0;
  7915. dtls->type = msg->type;
  7916. c32to24(msg->sz, dtls->length);
  7917. c16toa((word16)msg->seq, dtls->message_seq);
  7918. c32to24(0, dtls->fragment_offset);
  7919. c32to24(msg->sz, dtls->fragment_length);
  7920. }
  7921. int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
  7922. word32 fragOffset, word32 fragSz, void* heap, word32 totalLen)
  7923. {
  7924. word32 fragOffsetEnd = fragOffset + fragSz;
  7925. WOLFSSL_ENTER("DtlsMsgSet");
  7926. if (msg == NULL || data == NULL || msg->sz != totalLen ||
  7927. fragOffsetEnd > totalLen) {
  7928. WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
  7929. return BAD_FUNC_ARG;
  7930. }
  7931. if (msg->ready)
  7932. return 0; /* msg is already complete */
  7933. if (msg->type != no_shake) {
  7934. /* msg is already populated with the correct seq, epoch, and type */
  7935. if (msg->type != type || msg->epoch != epoch || msg->seq != seq) {
  7936. WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
  7937. return SEQUENCE_ERROR;
  7938. }
  7939. }
  7940. else {
  7941. msg->type = type;
  7942. msg->epoch = epoch;
  7943. msg->seq = seq;
  7944. }
  7945. if (msg->fragBucketList == NULL) {
  7946. /* Clean list. Create first fragment. */
  7947. msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data, fragSz, heap);
  7948. if (msg->fragBucketList != NULL) {
  7949. msg->bytesReceived = fragSz;
  7950. msg->fragBucketListCount++;
  7951. }
  7952. else {
  7953. return MEMORY_ERROR;
  7954. }
  7955. }
  7956. else {
  7957. /* See if we can expand any existing bucket to fit this new data into */
  7958. DtlsFragBucket* prev = NULL;
  7959. DtlsFragBucket* cur = msg->fragBucketList;
  7960. byte done = 0;
  7961. for (; cur != NULL; prev = cur, cur = cur->m.m.next) {
  7962. word32 curOffset = cur->m.m.offset;
  7963. word32 curEnd = cur->m.m.offset + cur->m.m.sz;
  7964. if (fragOffset >= curOffset && fragOffsetEnd <= curEnd) {
  7965. /* We already have this fragment */
  7966. done = 1;
  7967. break;
  7968. }
  7969. else if (fragOffset <= curEnd) {
  7970. /* found place to store fragment */
  7971. break;
  7972. }
  7973. }
  7974. if (!done) {
  7975. if (cur == NULL) {
  7976. /* We reached the end of the list. data is after and disjointed
  7977. * from anything we have received so far. */
  7978. if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
  7979. WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
  7980. return DTLS_TOO_MANY_FRAGMENTS_E;
  7981. }
  7982. prev->m.m.next =
  7983. DtlsMsgCreateFragBucket(fragOffset, data, fragSz, heap);
  7984. if (prev->m.m.next != NULL) {
  7985. msg->bytesReceived += fragSz;
  7986. msg->fragBucketListCount++;
  7987. }
  7988. }
  7989. else if (prev == NULL && fragOffsetEnd < cur->m.m.offset) {
  7990. /* This is the new first fragment we have received */
  7991. if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
  7992. WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
  7993. return DTLS_TOO_MANY_FRAGMENTS_E;
  7994. }
  7995. msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data,
  7996. fragSz, heap);
  7997. if (msg->fragBucketList != NULL) {
  7998. msg->fragBucketList->m.m.next = cur;
  7999. msg->bytesReceived += fragSz;
  8000. msg->fragBucketListCount++;
  8001. }
  8002. else {
  8003. /* reset on error */
  8004. msg->fragBucketList = cur;
  8005. }
  8006. }
  8007. else {
  8008. /* Find if this fragment overlaps with any more */
  8009. DtlsFragBucket* next = cur->m.m.next;
  8010. DtlsFragBucket** prev_next = prev != NULL
  8011. ? &prev->m.m.next : &msg->fragBucketList;
  8012. while (next != NULL &&
  8013. (next->m.m.offset + next->m.m.sz) <= fragOffsetEnd)
  8014. next = next->m.m.next;
  8015. /* We can combine the buckets */
  8016. *prev_next = DtlsMsgCombineFragBuckets(msg, cur, next,
  8017. fragOffset, data, fragSz, heap);
  8018. if (*prev_next == NULL) /* reset on error */
  8019. *prev_next = cur;
  8020. }
  8021. }
  8022. }
  8023. if (msg->bytesReceived == msg->sz)
  8024. DtlsMsgAssembleCompleteMessage(msg);
  8025. return 0;
  8026. }
  8027. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word16 epoch, word32 seq)
  8028. {
  8029. WOLFSSL_ENTER("DtlsMsgFind");
  8030. while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
  8031. head = head->next;
  8032. }
  8033. return head;
  8034. }
  8035. void DtlsMsgStore(WOLFSSL* ssl, word16 epoch, word32 seq, const byte* data,
  8036. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  8037. {
  8038. /* See if seq exists in the list. If it isn't in the list, make
  8039. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  8040. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  8041. * the seq is in the list and it isn't full, copy fragSz bytes from
  8042. * data to msg->msg starting at offset fragOffset, and add fragSz to
  8043. * msg->fragSz. Insertions take into account data already in the list
  8044. * in case there are overlaps in the handshake message due to retransmit
  8045. * messages. The new item should be inserted into the list in its
  8046. * proper position.
  8047. *
  8048. * 1. Find seq in list, or where seq should go in list. If seq not in
  8049. * list, create new item and insert into list. Either case, keep
  8050. * pointer to item.
  8051. * 2. Copy the data from the message to the stored message where it
  8052. * belongs without overlaps.
  8053. */
  8054. DtlsMsg* head = ssl->dtls_rx_msg_list;
  8055. WOLFSSL_ENTER("DtlsMsgStore");
  8056. if (head != NULL) {
  8057. DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
  8058. if (cur == NULL) {
  8059. cur = DtlsMsgNew(dataSz, 0, heap);
  8060. if (cur != NULL) {
  8061. if (DtlsMsgSet(cur, seq, epoch, data, type,
  8062. fragOffset, fragSz, heap, dataSz) < 0) {
  8063. DtlsMsgDelete(cur, heap);
  8064. }
  8065. else {
  8066. ssl->dtls_rx_msg_list_sz++;
  8067. head = DtlsMsgInsert(head, cur);
  8068. }
  8069. }
  8070. }
  8071. else {
  8072. /* If this fails, the data is just dropped. */
  8073. DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
  8074. fragSz, heap, dataSz);
  8075. }
  8076. }
  8077. else {
  8078. head = DtlsMsgNew(dataSz, 0, heap);
  8079. if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
  8080. fragSz, heap, dataSz) < 0) {
  8081. DtlsMsgDelete(head, heap);
  8082. head = NULL;
  8083. }
  8084. else {
  8085. ssl->dtls_rx_msg_list_sz++;
  8086. }
  8087. }
  8088. ssl->dtls_rx_msg_list = head;
  8089. }
  8090. /* DtlsMsgInsert() is an in-order insert. */
  8091. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  8092. {
  8093. WOLFSSL_ENTER("DtlsMsgInsert");
  8094. if (head == NULL || (item->epoch <= head->epoch &&
  8095. item->seq < head->seq)) {
  8096. item->next = head;
  8097. head = item;
  8098. }
  8099. else if (head->next == NULL) {
  8100. head->next = item;
  8101. }
  8102. else {
  8103. DtlsMsg* cur = head->next;
  8104. DtlsMsg* prev = head;
  8105. while (cur) {
  8106. if (item->epoch <= cur->epoch &&
  8107. item->seq < cur->seq) {
  8108. item->next = cur;
  8109. prev->next = item;
  8110. break;
  8111. }
  8112. prev = cur;
  8113. cur = cur->next;
  8114. }
  8115. if (cur == NULL) {
  8116. prev->next = item;
  8117. }
  8118. }
  8119. return head;
  8120. }
  8121. /**
  8122. * DtlsMsgPoolSave() adds the message to the end of the stored transmit
  8123. * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
  8124. * anything else that increments ssl->keys.dtls_handshake_number.
  8125. */
  8126. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
  8127. enum HandShakeType type)
  8128. {
  8129. DtlsMsg* item;
  8130. int ret = 0;
  8131. WOLFSSL_ENTER("DtlsMsgPoolSave");
  8132. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  8133. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  8134. return DTLS_POOL_SZ_E;
  8135. }
  8136. item = DtlsMsgNew(dataSz, 1, ssl->heap);
  8137. if (item != NULL) {
  8138. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  8139. XMEMCPY(item->raw, data, dataSz);
  8140. item->epoch = ssl->keys.dtls_epoch;
  8141. item->seq = ssl->keys.dtls_handshake_number;
  8142. item->type = type;
  8143. if (cur == NULL)
  8144. ssl->dtls_tx_msg_list = item;
  8145. else {
  8146. while (cur->next)
  8147. cur = cur->next;
  8148. cur->next = item;
  8149. }
  8150. ssl->dtls_tx_msg_list_sz++;
  8151. }
  8152. else
  8153. ret = MEMORY_E;
  8154. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  8155. return ret;
  8156. }
  8157. /* DtlsMsgPoolTimeout() updates the timeout time. */
  8158. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  8159. {
  8160. int result = -1;
  8161. WOLFSSL_ENTER("DtlsMsgPoolTimeout");
  8162. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  8163. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  8164. result = 0;
  8165. }
  8166. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  8167. return result;
  8168. }
  8169. /* DtlsMsgPoolReset() deletes the stored transmit list. */
  8170. void DtlsMsgPoolReset(WOLFSSL* ssl)
  8171. {
  8172. WOLFSSL_ENTER("DtlsMsgPoolReset");
  8173. if (ssl->dtls_tx_msg_list) {
  8174. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  8175. ssl->dtls_tx_msg_list = NULL;
  8176. ssl->dtls_tx_msg = NULL;
  8177. ssl->dtls_tx_msg_list_sz = 0;
  8178. }
  8179. }
  8180. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  8181. {
  8182. /**
  8183. * only the first message from previous flight should be valid
  8184. * to be used for triggering retransmission of whole DtlsMsgPool.
  8185. * change cipher suite type is not verified here
  8186. */
  8187. return ((fragOffset == 0) &&
  8188. (((ssl->options.side == WOLFSSL_SERVER_END) &&
  8189. ((type == client_hello) ||
  8190. ((ssl->options.verifyPeer) && (type == certificate)) ||
  8191. ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
  8192. ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  8193. (type == hello_request || type == server_hello))));
  8194. }
  8195. /**
  8196. * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
  8197. * depending on the current state of the handshake negotiation.
  8198. */
  8199. int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
  8200. {
  8201. WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete");
  8202. if (item->epoch < ssl->keys.dtls_epoch - 1)
  8203. /* Messages not from current or previous epoch can be deleted */
  8204. return 1;
  8205. switch (ssl->options.side) {
  8206. case WOLFSSL_CLIENT_END:
  8207. if (item->type == client_hello &&
  8208. ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
  8209. return 1; /* client can forget first client_hello if received full
  8210. * flight of packets from server */
  8211. else
  8212. return 0;
  8213. case WOLFSSL_SERVER_END:
  8214. if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
  8215. item->type == hello_request)
  8216. return 1; /* Server can forget HelloRequest if client sent a valid
  8217. * ClientHello */
  8218. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
  8219. item->type <= server_hello_done)
  8220. return 1; /* server can forget everything up to ServerHelloDone if
  8221. * a client finished message has been received and
  8222. * successfully processed */
  8223. else
  8224. return 0;
  8225. default:
  8226. return 0;
  8227. }
  8228. }
  8229. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  8230. * updated with new sequence numbers, and will be re-encrypted if needed. */
  8231. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  8232. {
  8233. int ret = 0;
  8234. DtlsMsg* pool;
  8235. WOLFSSL_ENTER("DtlsMsgPoolSend");
  8236. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  8237. if (pool != NULL) {
  8238. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  8239. !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
  8240. ssl->options.acceptState == SERVER_HELLO_DONE ||
  8241. ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
  8242. ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
  8243. (ssl->options.side == WOLFSSL_CLIENT_END &&
  8244. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  8245. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  8246. ssl->options.connectState == FINISHED_DONE ||
  8247. ssl->options.connectState == SECOND_REPLY_DONE))) {
  8248. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  8249. ssl->error = DTLS_RETX_OVER_TX;
  8250. return WOLFSSL_FATAL_ERROR;
  8251. }
  8252. while (pool != NULL) {
  8253. int epochOrder;
  8254. if (pool->epoch == 0) {
  8255. DtlsRecordLayerHeader* dtls;
  8256. dtls = (DtlsRecordLayerHeader*)pool->raw;
  8257. /* If the stored record's epoch is 0, and the currently set
  8258. * epoch is 0, use the "current order" sequence number.
  8259. * If the stored record's epoch is 0 and the currently set
  8260. * epoch is not 0, the stored record is considered a "previous
  8261. * order" sequence number. */
  8262. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  8263. CUR_ORDER : PREV_ORDER;
  8264. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  8265. DtlsSEQIncrement(ssl, epochOrder);
  8266. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  8267. WOLFSSL_ERROR(ret);
  8268. return ret;
  8269. }
  8270. XMEMCPY(GetOutputBuffer(ssl), pool->raw, pool->sz);
  8271. ssl->buffers.outputBuffer.length += pool->sz;
  8272. }
  8273. else {
  8274. /* Handle sending packets from previous epoch */
  8275. byte* input;
  8276. byte* output;
  8277. int inputSz, sendSz;
  8278. input = pool->raw;
  8279. inputSz = pool->sz;
  8280. sendSz = inputSz + cipherExtraData(ssl);
  8281. #ifdef HAVE_SECURE_RENEGOTIATION
  8282. /*
  8283. * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
  8284. * ssl->keys otherwise
  8285. * PREV_ORDER will always use ssl->keys
  8286. */
  8287. if (DtlsSCRKeysSet(ssl)) {
  8288. if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  8289. epochOrder = CUR_ORDER;
  8290. else
  8291. epochOrder = PREV_ORDER;
  8292. }
  8293. else {
  8294. epochOrder = CUR_ORDER;
  8295. }
  8296. #else
  8297. epochOrder = CUR_ORDER;
  8298. #endif
  8299. /* add back in record header space from saved pool size */
  8300. sendSz += DTLS_RECORD_HEADER_SZ;
  8301. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  8302. WOLFSSL_ERROR(ret);
  8303. return ret;
  8304. }
  8305. output = GetOutputBuffer(ssl);
  8306. if (inputSz != ENUM_LEN)
  8307. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  8308. handshake, 0, 0, 0, epochOrder);
  8309. else
  8310. /* inputSz == ENUM_LEN must mean that this is a change cipher
  8311. * spec message */
  8312. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  8313. change_cipher_spec, 0, 0, 0, epochOrder);
  8314. if (sendSz < 0) {
  8315. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  8316. return BUILD_MSG_ERROR;
  8317. }
  8318. ssl->buffers.outputBuffer.length += sendSz;
  8319. }
  8320. if (!ssl->options.groupMessages)
  8321. ret = SendBuffered(ssl);
  8322. /**
  8323. * on server side, retransmission is being triggered only by sending
  8324. * first message of given flight, in order to trigger client
  8325. * to retransmit its whole flight. Sending the whole previous flight
  8326. * could lead to retransmission of previous client flight for each
  8327. * server message from previous flight. Therefore one message should
  8328. * be enough to do the trick.
  8329. */
  8330. if (sendOnlyFirstPacket &&
  8331. ssl->options.side == WOLFSSL_SERVER_END)
  8332. pool = NULL;
  8333. else
  8334. pool = pool->next;
  8335. ssl->dtls_tx_msg = pool;
  8336. }
  8337. if (ret == 0 && ssl->options.groupMessages)
  8338. ret = SendBuffered(ssl);
  8339. }
  8340. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  8341. return ret;
  8342. }
  8343. #endif /* WOLFSSL_DTLS */
  8344. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  8345. ProtocolVersion MakeSSLv3(void)
  8346. {
  8347. ProtocolVersion pv;
  8348. pv.major = SSLv3_MAJOR;
  8349. pv.minor = SSLv3_MINOR;
  8350. return pv;
  8351. }
  8352. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  8353. #ifdef WOLFSSL_DTLS
  8354. ProtocolVersion MakeDTLSv1(void)
  8355. {
  8356. ProtocolVersion pv;
  8357. pv.major = DTLS_MAJOR;
  8358. pv.minor = DTLS_MINOR;
  8359. return pv;
  8360. }
  8361. #ifndef WOLFSSL_NO_TLS12
  8362. ProtocolVersion MakeDTLSv1_2(void)
  8363. {
  8364. ProtocolVersion pv;
  8365. pv.major = DTLS_MAJOR;
  8366. pv.minor = DTLSv1_2_MINOR;
  8367. return pv;
  8368. }
  8369. #endif /* !WOLFSSL_NO_TLS12 */
  8370. #ifdef WOLFSSL_DTLS13
  8371. ProtocolVersion MakeDTLSv1_3(void)
  8372. {
  8373. ProtocolVersion pv;
  8374. pv.major = DTLS_MAJOR;
  8375. pv.minor = DTLSv1_3_MINOR;
  8376. return pv;
  8377. }
  8378. #endif /* WOLFSSL_DTLS13 */
  8379. #endif /* WOLFSSL_DTLS */
  8380. #ifndef NO_ASN_TIME
  8381. #if defined(USER_TICKS)
  8382. #if 0
  8383. word32 LowResTimer(void)
  8384. {
  8385. /*
  8386. write your own clock tick function if don't want time(0)
  8387. needs second accuracy but doesn't have to correlated to EPOCH
  8388. */
  8389. }
  8390. #endif
  8391. #elif defined(TIME_OVERRIDES)
  8392. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  8393. /* use same asn time overrides unless user wants tick override above */
  8394. word32 LowResTimer(void)
  8395. {
  8396. return (word32) wc_Time(0);
  8397. }
  8398. #else
  8399. #ifndef HAVE_TIME_T_TYPE
  8400. typedef long time_t;
  8401. #endif
  8402. extern time_t XTIME(time_t * timer);
  8403. word32 LowResTimer(void)
  8404. {
  8405. return (word32) XTIME(0);
  8406. }
  8407. #endif
  8408. #elif defined(USE_WINDOWS_API)
  8409. word32 LowResTimer(void)
  8410. {
  8411. static int init = 0;
  8412. static LARGE_INTEGER freq;
  8413. LARGE_INTEGER count;
  8414. if (!init) {
  8415. QueryPerformanceFrequency(&freq);
  8416. init = 1;
  8417. }
  8418. QueryPerformanceCounter(&count);
  8419. return (word32)(count.QuadPart / freq.QuadPart);
  8420. }
  8421. #elif defined(HAVE_RTP_SYS)
  8422. #include "rtptime.h"
  8423. word32 LowResTimer(void)
  8424. {
  8425. return (word32)rtp_get_system_sec();
  8426. }
  8427. #elif defined(WOLFSSL_DEOS)
  8428. word32 LowResTimer(void)
  8429. {
  8430. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  8431. const volatile word32 *systemTickPtr = systemTickPointer();
  8432. return (word32) *systemTickPtr/systemTickTimeInHz;
  8433. }
  8434. #elif defined(MICRIUM)
  8435. word32 LowResTimer(void)
  8436. {
  8437. OS_TICK ticks = 0;
  8438. OS_ERR err;
  8439. ticks = OSTimeGet(&err);
  8440. return (word32) (ticks / OSCfg_TickRate_Hz);
  8441. }
  8442. #elif defined(MICROCHIP_TCPIP_V5)
  8443. word32 LowResTimer(void)
  8444. {
  8445. return (word32) (TickGet() / TICKS_PER_SECOND);
  8446. }
  8447. #elif defined(MICROCHIP_TCPIP)
  8448. #if defined(MICROCHIP_MPLAB_HARMONY)
  8449. #include <system/tmr/sys_tmr.h>
  8450. word32 LowResTimer(void)
  8451. {
  8452. return (word32) (SYS_TMR_TickCountGet() /
  8453. SYS_TMR_TickCounterFrequencyGet());
  8454. }
  8455. #else
  8456. word32 LowResTimer(void)
  8457. {
  8458. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  8459. }
  8460. #endif
  8461. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  8462. word32 LowResTimer(void)
  8463. {
  8464. TIME_STRUCT mqxTime;
  8465. _time_get_elapsed(&mqxTime);
  8466. return (word32) mqxTime.SECONDS;
  8467. }
  8468. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  8469. #include "include/task.h"
  8470. unsigned int LowResTimer(void)
  8471. {
  8472. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  8473. }
  8474. #elif defined(FREERTOS)
  8475. #include "task.h"
  8476. unsigned int LowResTimer(void)
  8477. {
  8478. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  8479. }
  8480. #elif defined(FREESCALE_KSDK_BM)
  8481. #include "lwip/sys.h" /* lwIP */
  8482. word32 LowResTimer(void)
  8483. {
  8484. return sys_now()/1000;
  8485. }
  8486. #elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2)
  8487. word32 LowResTimer(void)
  8488. {
  8489. return (word32)osKernelGetTickCount() / 1000;
  8490. }
  8491. #elif defined(WOLFSSL_TIRTOS)
  8492. word32 LowResTimer(void)
  8493. {
  8494. return (word32) Seconds_get();
  8495. }
  8496. #elif defined(WOLFSSL_XILINX)
  8497. #include "xrtcpsu.h"
  8498. word32 LowResTimer(void)
  8499. {
  8500. XRtcPsu_Config* con;
  8501. XRtcPsu rtc;
  8502. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  8503. if (con != NULL) {
  8504. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  8505. == XST_SUCCESS) {
  8506. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  8507. }
  8508. else {
  8509. WOLFSSL_MSG("Unable to initialize RTC");
  8510. }
  8511. }
  8512. return 0;
  8513. }
  8514. #elif defined(WOLFSSL_UTASKER)
  8515. word32 LowResTimer(void)
  8516. {
  8517. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  8518. }
  8519. #elif defined(WOLFSSL_NUCLEUS_1_2)
  8520. #define NU_TICKS_PER_SECOND 100
  8521. word32 LowResTimer(void)
  8522. {
  8523. /* returns number of 10ms ticks, so 100 ticks/sec */
  8524. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  8525. }
  8526. #elif defined(WOLFSSL_APACHE_MYNEWT)
  8527. #include "os/os_time.h"
  8528. word32 LowResTimer(void)
  8529. {
  8530. word32 now;
  8531. struct os_timeval tv;
  8532. os_gettimeofday(&tv, NULL);
  8533. now = (word32)tv.tv_sec;
  8534. return now;
  8535. }
  8536. #elif defined(WOLFSSL_ZEPHYR)
  8537. word32 LowResTimer(void)
  8538. {
  8539. return k_uptime_get() / 1000;
  8540. }
  8541. #elif defined(WOLFSSL_LINUXKM)
  8542. word32 LowResTimer(void)
  8543. {
  8544. return (word32)time(NULL);
  8545. }
  8546. #else
  8547. /* Posix style time */
  8548. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  8549. #include <time.h>
  8550. #endif
  8551. word32 LowResTimer(void)
  8552. {
  8553. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  8554. return (word32)wc_Time(0);
  8555. #else
  8556. return (word32)XTIME(0);
  8557. #endif
  8558. }
  8559. #endif
  8560. #else
  8561. /* user must supply timer function to return elapsed seconds:
  8562. * word32 LowResTimer(void);
  8563. */
  8564. #endif /* !NO_ASN_TIME */
  8565. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  8566. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  8567. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  8568. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  8569. /* Store the message for use with CertificateVerify using EdDSA.
  8570. *
  8571. * ssl SSL/TLS object.
  8572. * data Message to store.
  8573. * sz Size of message to store.
  8574. * returns MEMORY_E if not able to reallocate, otherwise 0.
  8575. */
  8576. static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
  8577. {
  8578. int ret = 0;
  8579. byte* msgs;
  8580. if (ssl->options.cacheMessages) {
  8581. msgs = (byte*)XMALLOC(ssl->hsHashes->length + sz, ssl->heap,
  8582. DYNAMIC_TYPE_HASHES);
  8583. if (msgs == NULL)
  8584. ret = MEMORY_E;
  8585. if ((ret == 0) && (ssl->hsHashes->messages != NULL)) {
  8586. XMEMCPY(msgs, ssl->hsHashes->messages, ssl->hsHashes->length);
  8587. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  8588. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  8589. }
  8590. if (ret == 0) {
  8591. #ifdef WOLFSSL_CHECK_MEM_ZERO
  8592. wc_MemZero_Add("Handshake messages", msgs,
  8593. ssl->hsHashes->length + sz);
  8594. #endif
  8595. ssl->hsHashes->messages = msgs;
  8596. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  8597. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  8598. ssl->hsHashes->length += sz;
  8599. }
  8600. }
  8601. return ret;
  8602. }
  8603. #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  8604. int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
  8605. {
  8606. int ret = 0;
  8607. #ifdef WOLFSSL_DEBUG_TLS
  8608. byte digest[WC_MAX_DIGEST_SIZE];
  8609. WOLFSSL_MSG("HashRaw:");
  8610. WOLFSSL_MSG("Data:");
  8611. WOLFSSL_BUFFER(data, sz);
  8612. WOLFSSL_MSG("Hashes:");
  8613. #endif
  8614. (void)data;
  8615. (void)sz;
  8616. if (ssl->hsHashes == NULL) {
  8617. return BAD_FUNC_ARG;
  8618. }
  8619. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  8620. ret = tsip_StoreMessage(ssl, data, sz);
  8621. if (ret != 0 && ret != CRYPTOCB_UNAVAILABLE) {
  8622. return ret;
  8623. }
  8624. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  8625. #ifndef NO_OLD_TLS
  8626. #ifndef NO_SHA
  8627. wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
  8628. #endif
  8629. #ifndef NO_MD5
  8630. wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
  8631. #endif
  8632. #endif /* NO_OLD_TLS */
  8633. if (IsAtLeastTLSv1_2(ssl)) {
  8634. #ifndef NO_SHA256
  8635. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
  8636. if (ret != 0)
  8637. return ret;
  8638. #ifdef WOLFSSL_DEBUG_TLS
  8639. WOLFSSL_MSG("Sha256");
  8640. wc_Sha256GetHash(&ssl->hsHashes->hashSha256, digest);
  8641. WOLFSSL_BUFFER(digest, WC_SHA256_DIGEST_SIZE);
  8642. #endif
  8643. #endif
  8644. #ifdef WOLFSSL_SHA384
  8645. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
  8646. if (ret != 0)
  8647. return ret;
  8648. #ifdef WOLFSSL_DEBUG_TLS
  8649. WOLFSSL_MSG("Sha384");
  8650. wc_Sha384GetHash(&ssl->hsHashes->hashSha384, digest);
  8651. WOLFSSL_BUFFER(digest, WC_SHA384_DIGEST_SIZE);
  8652. #endif
  8653. #endif
  8654. #ifdef WOLFSSL_SHA512
  8655. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
  8656. if (ret != 0)
  8657. return ret;
  8658. #ifdef WOLFSSL_DEBUG_TLS
  8659. WOLFSSL_MSG("Sha512");
  8660. wc_Sha512GetHash(&ssl->hsHashes->hashSha512, digest);
  8661. WOLFSSL_BUFFER(digest, WC_SHA512_DIGEST_SIZE);
  8662. #endif
  8663. #endif
  8664. #ifdef WOLFSSL_SM3
  8665. ret = wc_Sm3Update(&ssl->hsHashes->hashSm3, data, sz);
  8666. if (ret != 0)
  8667. return ret;
  8668. #ifdef WOLFSSL_DEBUG_TLS
  8669. WOLFSSL_MSG("SM3");
  8670. wc_Sm3GetHash(&ssl->hsHashes->hashSm3, digest);
  8671. WOLFSSL_BUFFER(digest, WC_SM3_DIGEST_SIZE);
  8672. #endif
  8673. #endif
  8674. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  8675. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  8676. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  8677. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  8678. ret = EdDSA_Update(ssl, data, sz);
  8679. if (ret != 0)
  8680. return ret;
  8681. #endif
  8682. }
  8683. return ret;
  8684. }
  8685. /* add output to md5 and sha handshake hashes, exclude record header */
  8686. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  8687. {
  8688. const byte* adj;
  8689. if (ssl->hsHashes == NULL)
  8690. return BAD_FUNC_ARG;
  8691. adj = output + RECORD_HEADER_SZ + ivSz;
  8692. sz -= RECORD_HEADER_SZ;
  8693. #ifdef HAVE_FUZZER
  8694. if (ssl->fuzzerCb)
  8695. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  8696. #endif
  8697. #ifdef WOLFSSL_DTLS
  8698. if (ssl->options.dtls) {
  8699. if (IsAtLeastTLSv1_3(ssl->version)) {
  8700. #ifdef WOLFSSL_DTLS13
  8701. word16 dtls_record_extra;
  8702. dtls_record_extra = Dtls13GetRlHeaderLength(ssl, (byte)IsEncryptionOn(ssl, 1));
  8703. dtls_record_extra -= RECORD_HEADER_SZ;
  8704. adj += dtls_record_extra;
  8705. sz -= dtls_record_extra;
  8706. #endif /* WOLFSSL_DTLS13 */
  8707. } else {
  8708. adj += DTLS_RECORD_EXTRA;
  8709. sz -= DTLS_RECORD_EXTRA;
  8710. }
  8711. }
  8712. #endif
  8713. return HashRaw(ssl, adj, sz);
  8714. }
  8715. /* add input to md5 and sha handshake hashes, include handshake header */
  8716. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  8717. {
  8718. const byte* adj;
  8719. if (ssl->hsHashes == NULL) {
  8720. return BAD_FUNC_ARG;
  8721. }
  8722. adj = input - HANDSHAKE_HEADER_SZ;
  8723. sz += HANDSHAKE_HEADER_SZ;
  8724. #ifdef WOLFSSL_DTLS
  8725. if (ssl->options.dtls) {
  8726. adj -= DTLS_HANDSHAKE_EXTRA;
  8727. sz += DTLS_HANDSHAKE_EXTRA;
  8728. #ifdef WOLFSSL_DTLS13
  8729. if (IsAtLeastTLSv1_3(ssl->version))
  8730. return Dtls13HashHandshake(ssl, adj, (word16)sz);
  8731. #endif /* WOLFSSL_DTLS13 */
  8732. }
  8733. #endif
  8734. return HashRaw(ssl, adj, sz);
  8735. }
  8736. /* add record layer header for message */
  8737. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
  8738. {
  8739. RecordLayerHeader* rl;
  8740. (void)epochOrder;
  8741. /* record layer header */
  8742. rl = (RecordLayerHeader*)output;
  8743. if (rl == NULL) {
  8744. return;
  8745. }
  8746. rl->type = type;
  8747. rl->pvMajor = ssl->version.major; /* type and version same in each */
  8748. #ifdef WOLFSSL_TLS13
  8749. if (IsAtLeastTLSv1_3(ssl->version)) {
  8750. rl->pvMinor = TLSv1_2_MINOR;
  8751. #ifdef WOLFSSL_DTLS
  8752. if (ssl->options.dtls)
  8753. rl->pvMinor = DTLSv1_2_MINOR;
  8754. #endif /* WOLFSSL_DTLS */
  8755. }
  8756. else
  8757. #endif
  8758. rl->pvMinor = ssl->version.minor;
  8759. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  8760. if (ssl->options.side == WOLFSSL_CLIENT_END
  8761. && ssl->options.connectState == CONNECT_BEGIN
  8762. && !ssl->options.resuming) {
  8763. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  8764. : ssl->version.minor;
  8765. }
  8766. #endif
  8767. if (!ssl->options.dtls) {
  8768. c16toa((word16)length, rl->length);
  8769. }
  8770. else {
  8771. #ifdef WOLFSSL_DTLS
  8772. DtlsRecordLayerHeader* dtls;
  8773. /* dtls record layer header extensions */
  8774. dtls = (DtlsRecordLayerHeader*)output;
  8775. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  8776. c16toa((word16)length, dtls->length);
  8777. #endif
  8778. }
  8779. }
  8780. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  8781. !defined(NO_WOLFSSL_SERVER))
  8782. /* add handshake header for message */
  8783. static void AddHandShakeHeader(byte* output, word32 length,
  8784. word32 fragOffset, word32 fragLength,
  8785. byte type, WOLFSSL* ssl)
  8786. {
  8787. HandShakeHeader* hs;
  8788. (void)fragOffset;
  8789. (void)fragLength;
  8790. (void)ssl;
  8791. /* handshake header */
  8792. hs = (HandShakeHeader*)output;
  8793. if (hs == NULL)
  8794. return;
  8795. hs->type = type;
  8796. c32to24(length, hs->length); /* type and length same for each */
  8797. #ifdef WOLFSSL_DTLS
  8798. if (ssl->options.dtls) {
  8799. DtlsHandShakeHeader* dtls;
  8800. /* dtls handshake header extensions */
  8801. dtls = (DtlsHandShakeHeader*)output;
  8802. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  8803. c32to24(fragOffset, dtls->fragment_offset);
  8804. c32to24(fragLength, dtls->fragment_length);
  8805. }
  8806. #endif
  8807. }
  8808. /* add both headers for handshake message */
  8809. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  8810. {
  8811. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  8812. word32 outputAdj = RECORD_HEADER_SZ;
  8813. #ifdef WOLFSSL_DTLS
  8814. if (ssl->options.dtls) {
  8815. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  8816. outputAdj += DTLS_RECORD_EXTRA;
  8817. }
  8818. #endif
  8819. AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
  8820. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  8821. }
  8822. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  8823. #ifndef WOLFSSL_NO_TLS12
  8824. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
  8825. !defined(WOLFSSL_NO_CLIENT_AUTH)) || \
  8826. defined(WOLFSSL_DTLS)
  8827. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  8828. word32 length, byte type, WOLFSSL* ssl)
  8829. {
  8830. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  8831. word32 outputAdj = RECORD_HEADER_SZ;
  8832. (void)fragSz;
  8833. #ifdef WOLFSSL_DTLS
  8834. if (ssl->options.dtls) {
  8835. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  8836. outputAdj += DTLS_RECORD_EXTRA;
  8837. }
  8838. #endif
  8839. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
  8840. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  8841. }
  8842. #endif /* NO_CERTS */
  8843. #if !defined(NO_WOLFSSL_SERVER) || \
  8844. (!defined(NO_WOLFSSL_CLIENT) && !defined(NO_CERTS) && \
  8845. !defined(WOLFSSL_NO_CLIENT_AUTH))
  8846. /**
  8847. * Send the handshake message. This function handles fragmenting the message
  8848. * so that it will fit into the desired MTU or the max fragment size.
  8849. * @param ssl Connection object
  8850. * @param input Input starting at the record layer header. This function
  8851. * assumes that the appropriate record and handshake headers
  8852. * are present. These headers must assume no fragmentation.
  8853. * That is handled here.
  8854. * @param inputSz Length of message excluding headers (this is the total
  8855. * length of all fragments)
  8856. * @param type Type of message being sent
  8857. * @return 0 on success and negative otherwise
  8858. */
  8859. static int SendHandshakeMsg(WOLFSSL* ssl, byte* input, word32 inputSz,
  8860. enum HandShakeType type, const char* packetName)
  8861. {
  8862. int maxFrag;
  8863. int ret = 0;
  8864. int headerSz;
  8865. WOLFSSL_ENTER("SendHandshakeMsg");
  8866. (void)type;
  8867. (void)packetName;
  8868. if (ssl == NULL || input == NULL)
  8869. return BAD_FUNC_ARG;
  8870. #ifdef WOLFSSL_DTLS
  8871. if (ssl->options.dtls)
  8872. headerSz = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  8873. else
  8874. #endif
  8875. {
  8876. /* In TLS we send one handshake header in total, not one
  8877. * per fragment like in DTLS. The handshake header should
  8878. * already be in the input buffer. */
  8879. inputSz += HANDSHAKE_HEADER_SZ;
  8880. headerSz = RECORD_HEADER_SZ;
  8881. }
  8882. maxFrag = wolfSSL_GetMaxFragSize(ssl, (int)inputSz);
  8883. /* Make sure input is not the ssl output buffer as this
  8884. * function doesn't handle that */
  8885. if (input >= ssl->buffers.outputBuffer.buffer &&
  8886. input < ssl->buffers.outputBuffer.buffer +
  8887. ssl->buffers.outputBuffer.bufferSize) {
  8888. WOLFSSL_MSG("Can't use output buffer for input in SendHandshakeMsg");
  8889. return BAD_FUNC_ARG;
  8890. }
  8891. if (!ssl->options.buildingMsg) {
  8892. /* Hash it before the loop as we modify the input with
  8893. * encryption on */
  8894. ret = HashOutput(ssl, input, headerSz + (int)inputSz, 0);
  8895. if (ret != 0)
  8896. return ret;
  8897. #ifdef WOLFSSL_DTLS
  8898. /* Decrement msg number so that we continue to use the
  8899. * same msg number for this msg */
  8900. if (ssl->options.dtls)
  8901. ssl->keys.dtls_handshake_number--;
  8902. #endif
  8903. }
  8904. while (ssl->fragOffset < inputSz) {
  8905. byte* output;
  8906. int outputSz;
  8907. byte* data = input + ssl->fragOffset + headerSz;
  8908. word32 fragSz = (word32)maxFrag;
  8909. ssl->options.buildingMsg = 1;
  8910. if (inputSz - ssl->fragOffset < fragSz)
  8911. fragSz = inputSz - ssl->fragOffset;
  8912. /* check for available size */
  8913. outputSz = headerSz + fragSz;
  8914. if (IsEncryptionOn(ssl, 1))
  8915. outputSz += cipherExtraData(ssl);
  8916. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  8917. return ret;
  8918. if (ssl->buffers.outputBuffer.buffer == NULL)
  8919. return MEMORY_E;
  8920. output = GetOutputBuffer(ssl);
  8921. if (IsEncryptionOn(ssl, 1)) {
  8922. /* First we need to add the fragment header ourselves.
  8923. * We do this in the input to minimize allocations */
  8924. int dataSz = (int)fragSz;
  8925. #ifdef WOLFSSL_DTLS
  8926. if (ssl->options.dtls) {
  8927. data -= DTLS_HANDSHAKE_HEADER_SZ;
  8928. dataSz += DTLS_HANDSHAKE_HEADER_SZ;
  8929. AddHandShakeHeader(data, inputSz, ssl->fragOffset, fragSz,
  8930. type, ssl);
  8931. ssl->keys.dtls_handshake_number--;
  8932. }
  8933. if (IsDtlsNotSctpMode(ssl) &&
  8934. (ret = DtlsMsgPoolSave(ssl, data,
  8935. fragSz + DTLS_HANDSHAKE_HEADER_SZ, type))
  8936. != 0)
  8937. return ret;
  8938. #endif
  8939. ret = BuildMessage(ssl, output, outputSz,
  8940. data, dataSz, handshake, 0, 0, 0, CUR_ORDER);
  8941. if (ret >= 0)
  8942. outputSz = ret;
  8943. else
  8944. return ret;
  8945. ret = 0;
  8946. }
  8947. else {
  8948. #ifdef WOLFSSL_DTLS
  8949. if (ssl->options.dtls)
  8950. AddFragHeaders(output, fragSz, ssl->fragOffset,
  8951. inputSz, type, ssl);
  8952. else
  8953. #endif
  8954. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  8955. XMEMCPY(output + headerSz, data, fragSz);
  8956. #ifdef WOLFSSL_DTLS
  8957. if (ssl->options.dtls) {
  8958. ssl->keys.dtls_handshake_number--;
  8959. DtlsSEQIncrement(ssl, CUR_ORDER);
  8960. }
  8961. if (IsDtlsNotSctpMode(ssl)) {
  8962. if ((ret = DtlsMsgPoolSave(ssl, output, headerSz + fragSz,
  8963. type)) != 0) {
  8964. return ret;
  8965. }
  8966. }
  8967. #endif
  8968. }
  8969. ssl->buffers.outputBuffer.length += outputSz;
  8970. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  8971. if (ssl->hsInfoOn) {
  8972. AddPacketName(ssl, packetName);
  8973. }
  8974. if (ssl->toInfoOn) {
  8975. ret = AddPacketInfo(ssl, packetName, handshake,
  8976. output, outputSz, WRITE_PROTO, 0, ssl->heap);
  8977. if (ret != 0)
  8978. return ret;
  8979. }
  8980. #endif
  8981. ssl->fragOffset += fragSz;
  8982. if (!ssl->options.groupMessages)
  8983. ret = SendBuffered(ssl);
  8984. if (ret != 0)
  8985. return ret;
  8986. }
  8987. #ifdef WOLFSSL_DTLS
  8988. /* Increment msg number once we sent all fragments */
  8989. if (ssl->options.dtls)
  8990. ssl->keys.dtls_handshake_number++;
  8991. #endif
  8992. ssl->fragOffset = 0;
  8993. ssl->options.buildingMsg = 0;
  8994. return ret;
  8995. }
  8996. #endif /* !NO_WOLFSSL_SERVER || (!NO_WOLFSSL_CLIENT && !NO_CERTS &&
  8997. * !WOLFSSL_NO_CLIENT_AUTH) */
  8998. #endif /* !WOLFSSL_NO_TLS12 */
  8999. /* return bytes received, -1 on error */
  9000. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  9001. {
  9002. int recvd;
  9003. int retryLimit = WOLFSSL_MODE_AUTO_RETRY_ATTEMPTS;
  9004. #ifdef WOLFSSL_QUIC
  9005. if (WOLFSSL_IS_QUIC(ssl)) {
  9006. /* QUIC only "reads" from data provided by the application
  9007. * via wolfSSL_provide_quic_data(). Transfer from there
  9008. * into the inputBuffer. */
  9009. return wolfSSL_quic_receive(ssl, buf, sz);
  9010. }
  9011. #endif
  9012. if (ssl->CBIORecv == NULL) {
  9013. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  9014. return -1;
  9015. }
  9016. retry:
  9017. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  9018. if (recvd < 0) {
  9019. switch (recvd) {
  9020. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  9021. #ifdef WOLFSSL_APACHE_HTTPD
  9022. #ifndef NO_BIO
  9023. if (ssl->biord) {
  9024. /* If retry and read flags are set, return WANT_READ */
  9025. if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
  9026. (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
  9027. return WANT_READ;
  9028. }
  9029. }
  9030. #endif
  9031. #endif
  9032. return -1;
  9033. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  9034. if (retryLimit > 0 && ssl->ctx->autoRetry &&
  9035. !ssl->options.handShakeDone && !ssl->options.dtls) {
  9036. retryLimit--;
  9037. goto retry;
  9038. }
  9039. return WANT_READ;
  9040. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  9041. #ifdef USE_WINDOWS_API
  9042. if (ssl->options.dtls) {
  9043. goto retry;
  9044. }
  9045. #endif
  9046. ssl->options.connReset = 1;
  9047. return -1;
  9048. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  9049. /* see if we got our timeout */
  9050. #ifdef WOLFSSL_CALLBACKS
  9051. if (ssl->toInfoOn) {
  9052. struct itimerval timeout;
  9053. getitimer(ITIMER_REAL, &timeout);
  9054. if (timeout.it_value.tv_sec == 0 &&
  9055. timeout.it_value.tv_usec == 0) {
  9056. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  9057. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  9058. ssl->timeoutInfo.timeoutName[
  9059. MAX_TIMEOUT_NAME_SZ] = '\0';
  9060. WOLFSSL_MSG("Got our timeout");
  9061. return WANT_READ;
  9062. }
  9063. }
  9064. #endif
  9065. goto retry;
  9066. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  9067. ssl->options.isClosed = 1;
  9068. return -1;
  9069. case WOLFSSL_CBIO_ERR_TIMEOUT:
  9070. #ifdef WOLFSSL_DTLS
  9071. #ifdef WOLFSSL_DTLS13
  9072. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  9073. /* TODO: support WANT_WRITE here */
  9074. if (Dtls13RtxTimeout(ssl) < 0) {
  9075. WOLFSSL_MSG(
  9076. "Error trying to retransmit DTLS buffered message");
  9077. return -1;
  9078. }
  9079. goto retry;
  9080. }
  9081. #endif /* WOLFSSL_DTLS13 */
  9082. if (IsDtlsNotSctpMode(ssl) &&
  9083. ssl->options.handShakeState != HANDSHAKE_DONE &&
  9084. DtlsMsgPoolTimeout(ssl) == 0 &&
  9085. DtlsMsgPoolSend(ssl, 0) == 0) {
  9086. /* retry read for DTLS during handshake only */
  9087. goto retry;
  9088. }
  9089. #endif
  9090. return -1;
  9091. default:
  9092. WOLFSSL_MSG("Unexpected recv return code");
  9093. return recvd;
  9094. }
  9095. }
  9096. return recvd;
  9097. }
  9098. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  9099. void ShrinkOutputBuffer(WOLFSSL* ssl)
  9100. {
  9101. WOLFSSL_MSG("Shrinking output buffer");
  9102. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  9103. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  9104. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  9105. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  9106. ssl->buffers.outputBuffer.dynamicFlag = 0;
  9107. ssl->buffers.outputBuffer.offset = 0;
  9108. /* idx and length are assumed to be 0. */
  9109. }
  9110. /* Switch dynamic input buffer back to static, keep any remaining input */
  9111. /* forced free means cleaning up */
  9112. /* Be *CAREFUL* where this function is called. ProcessReply relies on
  9113. * inputBuffer.idx *NOT* changing inside the ProcessReply function. ProcessReply
  9114. * calls ShrinkInputBuffer itself when it is safe to do so. Don't overuse it. */
  9115. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  9116. {
  9117. int usedLength = ssl->buffers.inputBuffer.length -
  9118. ssl->buffers.inputBuffer.idx;
  9119. if (!forcedFree && (usedLength > STATIC_BUFFER_LEN ||
  9120. ssl->buffers.clearOutputBuffer.length > 0))
  9121. return;
  9122. WOLFSSL_MSG("Shrinking input buffer");
  9123. if (!forcedFree && usedLength > 0) {
  9124. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  9125. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  9126. usedLength);
  9127. }
  9128. ForceZero(ssl->buffers.inputBuffer.buffer,
  9129. ssl->buffers.inputBuffer.length);
  9130. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  9131. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  9132. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  9133. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  9134. ssl->buffers.inputBuffer.dynamicFlag = 0;
  9135. ssl->buffers.inputBuffer.offset = 0;
  9136. ssl->buffers.inputBuffer.idx = 0;
  9137. ssl->buffers.inputBuffer.length = usedLength;
  9138. }
  9139. int SendBuffered(WOLFSSL* ssl)
  9140. {
  9141. if (ssl->CBIOSend == NULL && !WOLFSSL_IS_QUIC(ssl)) {
  9142. WOLFSSL_MSG("Your IO Send callback is null, please set");
  9143. return SOCKET_ERROR_E;
  9144. }
  9145. #ifdef WOLFSSL_DEBUG_TLS
  9146. if (ssl->buffers.outputBuffer.idx == 0) {
  9147. WOLFSSL_MSG("Data to send");
  9148. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  9149. ssl->buffers.outputBuffer.length);
  9150. }
  9151. #endif
  9152. #ifdef WOLFSSL_QUIC
  9153. if (WOLFSSL_IS_QUIC(ssl)) {
  9154. return wolfSSL_quic_send(ssl);
  9155. }
  9156. #endif
  9157. while (ssl->buffers.outputBuffer.length > 0) {
  9158. int sent = ssl->CBIOSend(ssl,
  9159. (char*)ssl->buffers.outputBuffer.buffer +
  9160. ssl->buffers.outputBuffer.idx,
  9161. (int)ssl->buffers.outputBuffer.length,
  9162. ssl->IOCB_WriteCtx);
  9163. if (sent < 0) {
  9164. switch (sent) {
  9165. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  9166. return WANT_WRITE;
  9167. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  9168. ssl->options.connReset = 1;
  9169. break;
  9170. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  9171. /* see if we got our timeout */
  9172. #ifdef WOLFSSL_CALLBACKS
  9173. if (ssl->toInfoOn) {
  9174. struct itimerval timeout;
  9175. getitimer(ITIMER_REAL, &timeout);
  9176. if (timeout.it_value.tv_sec == 0 &&
  9177. timeout.it_value.tv_usec == 0) {
  9178. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  9179. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  9180. ssl->timeoutInfo.timeoutName[
  9181. MAX_TIMEOUT_NAME_SZ] = '\0';
  9182. WOLFSSL_MSG("Got our timeout");
  9183. return WANT_WRITE;
  9184. }
  9185. }
  9186. #endif
  9187. continue;
  9188. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  9189. ssl->options.connReset = 1; /* treat same as reset */
  9190. break;
  9191. default:
  9192. return SOCKET_ERROR_E;
  9193. }
  9194. return SOCKET_ERROR_E;
  9195. }
  9196. if (sent > (int)ssl->buffers.outputBuffer.length) {
  9197. WOLFSSL_MSG("SendBuffered() out of bounds read");
  9198. return SEND_OOB_READ_E;
  9199. }
  9200. ssl->buffers.outputBuffer.idx += sent;
  9201. ssl->buffers.outputBuffer.length -= sent;
  9202. }
  9203. ssl->buffers.outputBuffer.idx = 0;
  9204. if (ssl->buffers.outputBuffer.dynamicFlag)
  9205. ShrinkOutputBuffer(ssl);
  9206. return 0;
  9207. }
  9208. /* returns the current location in the output buffer to start writing to */
  9209. byte* GetOutputBuffer(WOLFSSL* ssl)
  9210. {
  9211. return ssl->buffers.outputBuffer.buffer + ssl->buffers.outputBuffer.idx +
  9212. ssl->buffers.outputBuffer.length;
  9213. }
  9214. /* Grow the output buffer */
  9215. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  9216. {
  9217. byte* tmp;
  9218. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  9219. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  9220. RECORD_HEADER_SZ;
  9221. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  9222. #else
  9223. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  9224. #endif
  9225. int newSz = size + ssl->buffers.outputBuffer.idx +
  9226. ssl->buffers.outputBuffer.length;
  9227. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  9228. /* the encrypted data will be offset from the front of the buffer by
  9229. the header, if the user wants encrypted alignment they need
  9230. to define their alignment requirement */
  9231. while (align < hdrSz)
  9232. align *= 2;
  9233. #endif
  9234. tmp = (byte*)XMALLOC(newSz + align, ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  9235. WOLFSSL_MSG("growing output buffer");
  9236. if (tmp == NULL)
  9237. return MEMORY_E;
  9238. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  9239. if (align)
  9240. tmp += align - hdrSz;
  9241. #endif
  9242. #ifdef WOLFSSL_STATIC_MEMORY
  9243. /* can be from IO memory pool which does not need copy if same buffer */
  9244. if (ssl->buffers.outputBuffer.length &&
  9245. tmp == ssl->buffers.outputBuffer.buffer) {
  9246. ssl->buffers.outputBuffer.bufferSize = newSz;
  9247. return 0;
  9248. }
  9249. #endif
  9250. if (ssl->buffers.outputBuffer.length)
  9251. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  9252. ssl->buffers.outputBuffer.idx +
  9253. ssl->buffers.outputBuffer.length);
  9254. if (ssl->buffers.outputBuffer.dynamicFlag) {
  9255. XFREE(ssl->buffers.outputBuffer.buffer -
  9256. ssl->buffers.outputBuffer.offset, ssl->heap,
  9257. DYNAMIC_TYPE_OUT_BUFFER);
  9258. }
  9259. ssl->buffers.outputBuffer.dynamicFlag = 1;
  9260. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  9261. if (align)
  9262. ssl->buffers.outputBuffer.offset = align - hdrSz;
  9263. else
  9264. #endif
  9265. ssl->buffers.outputBuffer.offset = 0;
  9266. ssl->buffers.outputBuffer.buffer = tmp;
  9267. ssl->buffers.outputBuffer.bufferSize = newSz;
  9268. return 0;
  9269. }
  9270. /* Grow the input buffer, should only be to read cert or big app data */
  9271. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  9272. {
  9273. byte* tmp;
  9274. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  9275. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  9276. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  9277. #else
  9278. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  9279. #endif
  9280. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  9281. /* the encrypted data will be offset from the front of the buffer by
  9282. the dtls record header, if the user wants encrypted alignment they need
  9283. to define their alignment requirement. in tls we read record header
  9284. to get size of record and put actual data back at front, so don't need */
  9285. if (align) {
  9286. while (align < hdrSz)
  9287. align *= 2;
  9288. }
  9289. #endif
  9290. if (usedLength < 0 || size < 0) {
  9291. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  9292. return BAD_FUNC_ARG;
  9293. }
  9294. tmp = (byte*)XMALLOC(size + usedLength + align,
  9295. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  9296. WOLFSSL_MSG("growing input buffer");
  9297. if (tmp == NULL)
  9298. return MEMORY_E;
  9299. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  9300. if (align)
  9301. tmp += align - hdrSz;
  9302. #endif
  9303. #ifdef WOLFSSL_STATIC_MEMORY
  9304. /* can be from IO memory pool which does not need copy if same buffer */
  9305. if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
  9306. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  9307. ssl->buffers.inputBuffer.idx = 0;
  9308. ssl->buffers.inputBuffer.length = usedLength;
  9309. return 0;
  9310. }
  9311. #endif
  9312. if (usedLength)
  9313. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  9314. ssl->buffers.inputBuffer.idx, usedLength);
  9315. if (ssl->buffers.inputBuffer.dynamicFlag) {
  9316. if (IsEncryptionOn(ssl, 1)) {
  9317. ForceZero(ssl->buffers.inputBuffer.buffer,
  9318. ssl->buffers.inputBuffer.length);
  9319. }
  9320. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  9321. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  9322. }
  9323. ssl->buffers.inputBuffer.dynamicFlag = 1;
  9324. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  9325. if (align)
  9326. ssl->buffers.inputBuffer.offset = align - hdrSz;
  9327. else
  9328. #endif
  9329. ssl->buffers.inputBuffer.offset = 0;
  9330. ssl->buffers.inputBuffer.buffer = tmp;
  9331. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  9332. ssl->buffers.inputBuffer.idx = 0;
  9333. ssl->buffers.inputBuffer.length = usedLength;
  9334. return 0;
  9335. }
  9336. /* Check available size into output buffer, make room if needed.
  9337. * This function needs to be called before anything gets put
  9338. * into the output buffers since it flushes pending data if it
  9339. * predicts that the msg will exceed MTU. */
  9340. int CheckAvailableSize(WOLFSSL *ssl, int size)
  9341. {
  9342. if (size < 0) {
  9343. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  9344. return BAD_FUNC_ARG;
  9345. }
  9346. #ifdef WOLFSSL_DTLS
  9347. if (ssl->options.dtls) {
  9348. if (size + ssl->buffers.outputBuffer.length >
  9349. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  9350. ssl->dtlsMtuSz
  9351. #else
  9352. ssl->dtls_expected_rx
  9353. #endif
  9354. ) {
  9355. int ret;
  9356. WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
  9357. "to make room for new message");
  9358. if ((ret = SendBuffered(ssl)) != 0) {
  9359. return ret;
  9360. }
  9361. }
  9362. if (size > (int)
  9363. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  9364. ssl->dtlsMtuSz
  9365. #else
  9366. ssl->dtls_expected_rx
  9367. #endif
  9368. #ifdef WOLFSSL_DTLS13
  9369. /* DTLS1.3 uses the output buffer to store the full message and deal
  9370. with fragmentation later in dtls13HandshakeSend() */
  9371. && !IsAtLeastTLSv1_3(ssl->version)
  9372. #endif /* WOLFSSL_DTLS13 */
  9373. ) {
  9374. WOLFSSL_MSG("CheckAvailableSize() called with size greater than MTU.");
  9375. return DTLS_SIZE_ERROR;
  9376. }
  9377. }
  9378. #endif
  9379. if ((ssl->buffers.outputBuffer.bufferSize -
  9380. ssl->buffers.outputBuffer.length -
  9381. ssl->buffers.outputBuffer.idx) < (word32)size) {
  9382. if (GrowOutputBuffer(ssl, size) < 0)
  9383. return MEMORY_E;
  9384. }
  9385. return 0;
  9386. }
  9387. #ifdef WOLFSSL_DTLS13
  9388. static int GetInputData(WOLFSSL *ssl, word32 size);
  9389. static int GetDtls13RecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9390. RecordLayerHeader* rh, word16* size)
  9391. {
  9392. Dtls13UnifiedHdrInfo hdrInfo;
  9393. w64wrapper epochNumber;
  9394. byte epochBits;
  9395. int readSize;
  9396. int ret;
  9397. readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
  9398. if (readSize < DTLS_UNIFIED_HEADER_MIN_SZ)
  9399. return BUFFER_ERROR;
  9400. epochBits = *(ssl->buffers.inputBuffer.buffer + *inOutIdx) & EE_MASK;
  9401. ret = Dtls13ReconstructEpochNumber(ssl, epochBits, &epochNumber);
  9402. if (ret != 0)
  9403. return ret;
  9404. #ifdef WOLFSSL_DEBUG_TLS
  9405. WOLFSSL_MSG_EX("reconstructed epoch number: %ld",
  9406. epochNumber);
  9407. #endif /* WOLFSSL_DEBUG_TLS */
  9408. /* protected records always use unified_headers in DTLSv1.3 */
  9409. if (w64IsZero(epochNumber))
  9410. return SEQUENCE_ERROR;
  9411. if (ssl->dtls13DecryptEpoch == NULL)
  9412. return BAD_STATE_E;
  9413. #ifdef WOLFSSL_EARLY_DATA
  9414. if (w64Equal(epochNumber, w64From32(0x0, DTLS13_EPOCH_EARLYDATA)) &&
  9415. ssl->options.handShakeDone) {
  9416. WOLFSSL_MSG("discarding early data after handshake");
  9417. return SEQUENCE_ERROR;
  9418. }
  9419. #endif /* WOLFSSL_DTLS13 */
  9420. if (!w64Equal(ssl->dtls13DecryptEpoch->epochNumber, epochNumber)) {
  9421. ret = Dtls13SetEpochKeys(ssl, epochNumber, DECRYPT_SIDE_ONLY);
  9422. if (ret != 0)
  9423. return SEQUENCE_ERROR;
  9424. }
  9425. ret = Dtls13GetUnifiedHeaderSize(ssl,
  9426. *(ssl->buffers.inputBuffer.buffer+*inOutIdx), &ssl->dtls13CurRlLength);
  9427. if (ret != 0)
  9428. return ret;
  9429. if (readSize < ssl->dtls13CurRlLength + DTLS13_RN_MASK_SIZE) {
  9430. /* when using DTLS over a medium that does not guarantee that a full
  9431. * message is received in a single read, we may end up without the full
  9432. * header and minimum ciphertext to decrypt record sequence numbers */
  9433. ret = GetInputData(ssl, ssl->dtls13CurRlLength + DTLS13_RN_MASK_SIZE);
  9434. if (ret != 0)
  9435. return ret;
  9436. readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
  9437. }
  9438. ret = Dtls13ParseUnifiedRecordLayer(ssl,
  9439. ssl->buffers.inputBuffer.buffer + *inOutIdx, (word16)readSize,
  9440. &hdrInfo);
  9441. if (ret != 0)
  9442. return ret;
  9443. *size = hdrInfo.recordLength;
  9444. c16toa(*size, rh->length);
  9445. /* type is implicit */
  9446. rh->type = application_data;
  9447. /* version is implicit */
  9448. rh->pvMajor = ssl->version.major;
  9449. rh->pvMinor = DTLSv1_2_MINOR;
  9450. ssl->keys.curEpoch64 = epochNumber;
  9451. ret = Dtls13ReconstructSeqNumber(ssl, &hdrInfo, &ssl->keys.curSeq);
  9452. if (ret != 0)
  9453. return ret;
  9454. #ifdef WOLFSSL_DEBUG_TLS
  9455. WOLFSSL_MSG_EX("reconstructed seq number: %ld",
  9456. ssl->keys.curSeq);
  9457. #endif /* WOLFSSL_DEBUG_TLS */
  9458. XMEMCPY(ssl->dtls13CurRL, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9459. ssl->dtls13CurRlLength);
  9460. *inOutIdx += ssl->dtls13CurRlLength;
  9461. return 0;
  9462. }
  9463. #endif /* WOLFSSL_DTLS13 */
  9464. #ifdef WOLFSSL_DTLS
  9465. static int GetDtlsRecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9466. RecordLayerHeader* rh, word16* size)
  9467. {
  9468. #ifdef HAVE_FUZZER
  9469. if (ssl->fuzzerCb)
  9470. ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9471. DTLS_RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx);
  9472. #endif
  9473. #ifdef WOLFSSL_DTLS13
  9474. int ret;
  9475. if (Dtls13IsUnifiedHeader(*(ssl->buffers.inputBuffer.buffer + *inOutIdx))) {
  9476. /* version 1.3 already negotiated */
  9477. if (ssl->options.tls1_3) {
  9478. ret = GetDtls13RecordHeader(ssl, inOutIdx, rh, size);
  9479. if (ret == 0 || ret != SEQUENCE_ERROR || ret != DTLS_CID_ERROR)
  9480. return ret;
  9481. }
  9482. #ifndef NO_WOLFSSL_CLIENT
  9483. if (ssl->options.side == WOLFSSL_CLIENT_END
  9484. && ssl->options.serverState < SERVER_HELLO_COMPLETE
  9485. && IsAtLeastTLSv1_3(ssl->version)
  9486. && !ssl->options.handShakeDone) {
  9487. /* we may have lost ServerHello. Try to send a empty ACK to shortcut
  9488. Server retransmission timer */
  9489. ssl->dtls13Rtx.sendAcks = 1;
  9490. }
  9491. #endif
  9492. return SEQUENCE_ERROR;
  9493. }
  9494. /* not a unified header, check that we have at least
  9495. * DTLS_RECORD_HEADER_SZ */
  9496. if (ssl->buffers.inputBuffer.length - *inOutIdx < DTLS_RECORD_HEADER_SZ) {
  9497. ret = GetInputData(ssl, DTLS_RECORD_HEADER_SZ);
  9498. /* Check if Dtls13RtxTimeout(ssl) returned socket error */
  9499. if (ret == SOCKET_ERROR_E)
  9500. return ret;
  9501. if (ret != 0)
  9502. return LENGTH_ERROR;
  9503. }
  9504. #endif /* WOLFSSL_DTLS13 */
  9505. /* type and version in same spot */
  9506. XMEMCPY(rh, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9507. ENUM_LEN + VERSION_SZ);
  9508. *inOutIdx += ENUM_LEN + VERSION_SZ;
  9509. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curEpoch);
  9510. #ifdef WOLFSSL_DTLS13
  9511. /* only non protected message can use the DTLSPlaintext record header */
  9512. if (IsAtLeastTLSv1_3(ssl->version)) {
  9513. if (ssl->keys.curEpoch != 0)
  9514. return SEQUENCE_ERROR;
  9515. w64Zero(&ssl->keys.curEpoch64);
  9516. if (!w64IsZero(ssl->dtls13DecryptEpoch->epochNumber))
  9517. Dtls13SetEpochKeys(ssl, ssl->keys.curEpoch64, DECRYPT_SIDE_ONLY);
  9518. }
  9519. #endif /* WOLFSSL_DTLS13 */
  9520. *inOutIdx += OPAQUE16_LEN;
  9521. if (ssl->options.haveMcast) {
  9522. #ifdef WOLFSSL_MULTICAST
  9523. ssl->keys.curPeerId = ssl->buffers.inputBuffer.buffer[*inOutIdx];
  9524. ssl->keys.curSeq_hi = ssl->buffers.inputBuffer.buffer[*inOutIdx+1];
  9525. #endif
  9526. }
  9527. else
  9528. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curSeq_hi);
  9529. *inOutIdx += OPAQUE16_LEN;
  9530. ato32(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curSeq_lo);
  9531. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  9532. #ifdef WOLFSSL_DTLS13
  9533. /* DTLSv1.3 PlainText records use DTLSv1.2 sequence number encoding. Update
  9534. the DTLv1.3 word64 version as well */
  9535. ssl->keys.curSeq = w64From32(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo);
  9536. #endif /* WOLFSSL_DTLS13 */
  9537. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, size);
  9538. *inOutIdx += LENGTH_SZ;
  9539. return 0;
  9540. }
  9541. #endif /* WOLFSSL_DTLS */
  9542. /* do all verify and sanity checks on record header */
  9543. static int GetRecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9544. RecordLayerHeader* rh, word16 *size)
  9545. {
  9546. byte tls12minor = 0;
  9547. #ifdef OPENSSL_ALL
  9548. word32 start = *inOutIdx;
  9549. #endif
  9550. (void)tls12minor;
  9551. if (!ssl->options.dtls) {
  9552. #ifdef HAVE_FUZZER
  9553. if (ssl->fuzzerCb)
  9554. ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9555. RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx);
  9556. #endif
  9557. XMEMCPY(rh, ssl->buffers.inputBuffer.buffer + *inOutIdx, RECORD_HEADER_SZ);
  9558. *inOutIdx += RECORD_HEADER_SZ;
  9559. ato16(rh->length, size);
  9560. }
  9561. else {
  9562. #ifdef WOLFSSL_DTLS
  9563. int ret = GetDtlsRecordHeader(ssl, inOutIdx, rh, size);
  9564. if (ret != 0)
  9565. return ret;
  9566. #endif
  9567. }
  9568. #ifdef WOLFSSL_DTLS
  9569. /* DTLSv1.3 MUST check window after deprotecting to avoid timing channel
  9570. (RFC9147 Section 4.5.1) */
  9571. if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) {
  9572. if (!_DtlsCheckWindow(ssl) ||
  9573. (rh->type == application_data && ssl->keys.curEpoch == 0) ||
  9574. (rh->type == alert && ssl->options.handShakeDone &&
  9575. ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
  9576. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  9577. return SEQUENCE_ERROR;
  9578. }
  9579. }
  9580. #endif
  9581. #if defined(WOLFSSL_DTLS13) || defined(WOLFSSL_TLS13)
  9582. tls12minor = TLSv1_2_MINOR;
  9583. #endif
  9584. #ifdef WOLFSSL_DTLS13
  9585. if (ssl->options.dtls)
  9586. tls12minor = DTLSv1_2_MINOR;
  9587. #endif /* WOLFSSL_DTLS13 */
  9588. /* catch version mismatch */
  9589. #ifndef WOLFSSL_TLS13
  9590. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  9591. #else
  9592. if (rh->pvMajor != ssl->version.major ||
  9593. (rh->pvMinor != ssl->version.minor &&
  9594. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != tls12minor)
  9595. ))
  9596. #endif
  9597. {
  9598. if (ssl->options.side == WOLFSSL_SERVER_END &&
  9599. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  9600. WOLFSSL_MSG("Client attempting to connect with different version");
  9601. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  9602. ssl->options.downgrade &&
  9603. ssl->options.connectState < FIRST_REPLY_DONE)
  9604. WOLFSSL_MSG("Server attempting to accept with different version");
  9605. else if (ssl->options.dtls && rh->type == handshake)
  9606. /* Check the DTLS handshake message RH version later. */
  9607. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  9608. #ifdef WOLFSSL_DTLS13
  9609. else if (ssl->options.dtls && !ssl->options.handShakeDone) {
  9610. /* we may have lost the ServerHello and this is a unified record
  9611. before version been negotiated */
  9612. if (Dtls13IsUnifiedHeader(*ssl->buffers.inputBuffer.buffer)) {
  9613. return SEQUENCE_ERROR;
  9614. }
  9615. }
  9616. #endif /* WOLFSSL_DTLS13 */
  9617. else {
  9618. WOLFSSL_MSG("SSL version error");
  9619. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  9620. return VERSION_ERROR; /* only use requested version */
  9621. }
  9622. }
  9623. /* record layer length check */
  9624. #ifdef HAVE_MAX_FRAGMENT
  9625. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  9626. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  9627. return LENGTH_ERROR;
  9628. }
  9629. #else
  9630. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  9631. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  9632. return LENGTH_ERROR;
  9633. }
  9634. #endif
  9635. if (*size == 0 && rh->type != application_data) {
  9636. WOLFSSL_MSG("0 length, non-app data record.");
  9637. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  9638. return LENGTH_ERROR;
  9639. }
  9640. /* verify record type here as well */
  9641. switch (rh->type) {
  9642. case handshake:
  9643. case change_cipher_spec:
  9644. case application_data:
  9645. case alert:
  9646. #ifdef WOLFSSL_DTLS13
  9647. case ack:
  9648. #endif /* WOLFSSL_DTLS13 */
  9649. break;
  9650. case no_type:
  9651. default:
  9652. #ifdef OPENSSL_ALL
  9653. if (!ssl->options.dtls) {
  9654. char *method = (char*)ssl->buffers.inputBuffer.buffer + start;
  9655. /* Attempt to identify if this is a plain HTTP request.
  9656. * No size checks because this function assumes at least
  9657. * RECORD_HEADER_SZ size of data has been read which is
  9658. * also the longest string comparison in this if. */
  9659. if (XSTRNCMP(method, "GET ", XSTR_SIZEOF("GET ")) == 0 ||
  9660. XSTRNCMP(method, "POST ", XSTR_SIZEOF("POST ")) == 0 ||
  9661. XSTRNCMP(method, "HEAD ", XSTR_SIZEOF("HEAD ")) == 0 ||
  9662. XSTRNCMP(method, "PUT ", XSTR_SIZEOF("PUT ")) == 0) {
  9663. WOLFSSL_MSG("Plain HTTP request detected");
  9664. return SSL_R_HTTP_REQUEST;
  9665. }
  9666. }
  9667. #endif
  9668. WOLFSSL_MSG("Unknown Record Type");
  9669. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  9670. return UNKNOWN_RECORD_TYPE;
  9671. }
  9672. /* haven't decrypted this record yet */
  9673. ssl->keys.decryptedCur = 0;
  9674. return 0;
  9675. }
  9676. #ifndef WOLFSSL_NO_TLS12
  9677. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  9678. byte *type, word32 *size, word32 totalSz)
  9679. {
  9680. const byte *ptr = input + *inOutIdx;
  9681. (void)ssl;
  9682. *inOutIdx += HANDSHAKE_HEADER_SZ;
  9683. if (*inOutIdx > totalSz)
  9684. return BUFFER_E;
  9685. *type = ptr[0];
  9686. c24to32(&ptr[1], size);
  9687. return 0;
  9688. }
  9689. #endif
  9690. #ifdef WOLFSSL_DTLS
  9691. int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  9692. word32* inOutIdx, byte *type, word32 *size,
  9693. word32 *fragOffset, word32 *fragSz,
  9694. word32 totalSz)
  9695. {
  9696. word32 idx = *inOutIdx;
  9697. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  9698. if (*inOutIdx > totalSz) {
  9699. WOLFSSL_ERROR(BUFFER_E);
  9700. return BUFFER_E;
  9701. }
  9702. *type = input[idx++];
  9703. c24to32(input + idx, size);
  9704. idx += OPAQUE24_LEN;
  9705. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  9706. idx += DTLS_HANDSHAKE_SEQ_SZ;
  9707. c24to32(input + idx, fragOffset);
  9708. idx += DTLS_HANDSHAKE_FRAG_SZ;
  9709. c24to32(input + idx, fragSz);
  9710. if ((ssl->curRL.pvMajor != ssl->version.major) ||
  9711. (!IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != ssl->version.minor) ||
  9712. (IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != DTLSv1_2_MINOR)
  9713. ) {
  9714. if (*type != client_hello && *type != hello_verify_request && *type != server_hello) {
  9715. WOLFSSL_ERROR(VERSION_ERROR);
  9716. return VERSION_ERROR;
  9717. }
  9718. else {
  9719. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  9720. }
  9721. }
  9722. return 0;
  9723. }
  9724. #endif
  9725. #if !defined(NO_OLD_TLS) || \
  9726. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  9727. /* fill with MD5 pad size since biggest required */
  9728. static const byte PAD1[PAD_MD5] =
  9729. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9730. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9731. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9732. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9733. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9734. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  9735. };
  9736. static const byte PAD2[PAD_MD5] =
  9737. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9738. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9739. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9740. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9741. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9742. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  9743. };
  9744. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  9745. #ifndef NO_OLD_TLS
  9746. /* calculate MD5 hash for finished */
  9747. #ifdef WOLFSSL_TI_HASH
  9748. #include <wolfssl/wolfcrypt/hash.h>
  9749. #endif
  9750. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9751. {
  9752. int ret;
  9753. byte md5_result[WC_MD5_DIGEST_SIZE];
  9754. #ifdef WOLFSSL_SMALL_STACK
  9755. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9756. if (md5 == NULL)
  9757. return MEMORY_E;
  9758. #else
  9759. wc_Md5 md5[1];
  9760. #endif
  9761. /* make md5 inner */
  9762. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  9763. if (ret == 0)
  9764. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  9765. if (ret == 0)
  9766. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  9767. if (ret == 0)
  9768. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  9769. if (ret == 0)
  9770. ret = wc_Md5Final(md5, md5_result);
  9771. /* make md5 outer */
  9772. if (ret == 0) {
  9773. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  9774. if (ret == 0) {
  9775. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  9776. if (ret == 0)
  9777. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  9778. if (ret == 0)
  9779. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  9780. if (ret == 0)
  9781. ret = wc_Md5Final(md5, hashes->md5);
  9782. wc_Md5Free(md5);
  9783. }
  9784. }
  9785. #ifdef WOLFSSL_SMALL_STACK
  9786. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9787. #endif
  9788. return ret;
  9789. }
  9790. /* calculate SHA hash for finished */
  9791. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9792. {
  9793. int ret;
  9794. byte sha_result[WC_SHA_DIGEST_SIZE];
  9795. #ifdef WOLFSSL_SMALL_STACK
  9796. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9797. if (sha == NULL)
  9798. return MEMORY_E;
  9799. #else
  9800. wc_Sha sha[1];
  9801. #endif
  9802. /* make sha inner */
  9803. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  9804. if (ret == 0)
  9805. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  9806. if (ret == 0)
  9807. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  9808. if (ret == 0)
  9809. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  9810. if (ret == 0)
  9811. ret = wc_ShaFinal(sha, sha_result);
  9812. /* make sha outer */
  9813. if (ret == 0) {
  9814. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  9815. if (ret == 0) {
  9816. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  9817. if (ret == 0)
  9818. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  9819. if (ret == 0)
  9820. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  9821. if (ret == 0)
  9822. ret = wc_ShaFinal(sha, hashes->sha);
  9823. wc_ShaFree(sha);
  9824. }
  9825. }
  9826. #ifdef WOLFSSL_SMALL_STACK
  9827. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9828. #endif
  9829. return ret;
  9830. }
  9831. #endif
  9832. #ifndef WOLFSSL_NO_TLS12
  9833. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  9834. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9835. {
  9836. int ret = 0;
  9837. if (ssl == NULL)
  9838. return BAD_FUNC_ARG;
  9839. #ifndef NO_TLS
  9840. if (ssl->options.tls) {
  9841. ret = BuildTlsFinished(ssl, hashes, sender);
  9842. }
  9843. #else
  9844. (void)hashes;
  9845. (void)sender;
  9846. #endif
  9847. #ifndef NO_OLD_TLS
  9848. if (!ssl->options.tls) {
  9849. ret = BuildMD5(ssl, hashes, sender);
  9850. if (ret == 0) {
  9851. ret = BuildSHA(ssl, hashes, sender);
  9852. }
  9853. }
  9854. #endif
  9855. return ret;
  9856. }
  9857. #endif /* WOLFSSL_NO_TLS12 */
  9858. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  9859. /* cipher requirements */
  9860. enum {
  9861. REQUIRES_RSA,
  9862. REQUIRES_DHE,
  9863. REQUIRES_ECC,
  9864. REQUIRES_ECC_STATIC,
  9865. REQUIRES_PSK,
  9866. REQUIRES_RSA_SIG,
  9867. REQUIRES_AEAD
  9868. };
  9869. /* Does this cipher suite (first, second) have the requirement
  9870. an ephemeral key exchange will still require the key for signing
  9871. the key exchange so ECDHE_RSA requires an rsa key thus rsa_kea */
  9872. static int CipherRequires(byte first, byte second, int requirement)
  9873. {
  9874. (void)requirement;
  9875. #ifndef WOLFSSL_NO_TLS12
  9876. #ifdef HAVE_CHACHA
  9877. if (first == CHACHA_BYTE) {
  9878. switch (second) {
  9879. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  9880. if (requirement == REQUIRES_RSA)
  9881. return 1;
  9882. break;
  9883. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  9884. if (requirement == REQUIRES_ECC)
  9885. return 1;
  9886. break;
  9887. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  9888. if (requirement == REQUIRES_RSA)
  9889. return 1;
  9890. if (requirement == REQUIRES_DHE)
  9891. return 1;
  9892. break;
  9893. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9894. if (requirement == REQUIRES_RSA)
  9895. return 1;
  9896. break;
  9897. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9898. if (requirement == REQUIRES_ECC)
  9899. return 1;
  9900. break;
  9901. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9902. if (requirement == REQUIRES_RSA)
  9903. return 1;
  9904. if (requirement == REQUIRES_DHE)
  9905. return 1;
  9906. break;
  9907. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9908. if (requirement == REQUIRES_PSK)
  9909. return 1;
  9910. break;
  9911. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9912. if (requirement == REQUIRES_PSK)
  9913. return 1;
  9914. break;
  9915. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9916. if (requirement == REQUIRES_PSK)
  9917. return 1;
  9918. if (requirement == REQUIRES_DHE)
  9919. return 1;
  9920. break;
  9921. default:
  9922. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires CHACHA");
  9923. return 0;
  9924. }
  9925. if (requirement == REQUIRES_AEAD)
  9926. return 1;
  9927. }
  9928. #endif /* HAVE_CHACHA */
  9929. /* ECC extensions */
  9930. if (first == ECC_BYTE) {
  9931. switch (second) {
  9932. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9933. #ifndef NO_RSA
  9934. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  9935. if (requirement == REQUIRES_RSA)
  9936. return 1;
  9937. break;
  9938. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  9939. if (requirement == REQUIRES_ECC_STATIC)
  9940. return 1;
  9941. if (requirement == REQUIRES_RSA_SIG)
  9942. return 1;
  9943. break;
  9944. #ifndef NO_DES3
  9945. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  9946. if (requirement == REQUIRES_RSA)
  9947. return 1;
  9948. break;
  9949. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  9950. if (requirement == REQUIRES_ECC_STATIC)
  9951. return 1;
  9952. if (requirement == REQUIRES_RSA_SIG)
  9953. return 1;
  9954. break;
  9955. #endif /* !NO_DES3 */
  9956. #ifndef NO_RC4
  9957. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  9958. if (requirement == REQUIRES_RSA)
  9959. return 1;
  9960. break;
  9961. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  9962. if (requirement == REQUIRES_ECC_STATIC)
  9963. return 1;
  9964. if (requirement == REQUIRES_RSA_SIG)
  9965. return 1;
  9966. break;
  9967. #endif /* !NO_RC4 */
  9968. #endif /* NO_RSA */
  9969. #ifndef NO_DES3
  9970. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  9971. if (requirement == REQUIRES_ECC)
  9972. return 1;
  9973. break;
  9974. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  9975. if (requirement == REQUIRES_ECC_STATIC)
  9976. return 1;
  9977. break;
  9978. #endif /* !NO_DES3 */
  9979. #ifndef NO_RC4
  9980. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  9981. if (requirement == REQUIRES_ECC)
  9982. return 1;
  9983. break;
  9984. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  9985. if (requirement == REQUIRES_ECC_STATIC)
  9986. return 1;
  9987. break;
  9988. #endif /* !NO_RC4 */
  9989. #ifndef NO_RSA
  9990. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  9991. if (requirement == REQUIRES_RSA)
  9992. return 1;
  9993. break;
  9994. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  9995. if (requirement == REQUIRES_ECC_STATIC)
  9996. return 1;
  9997. if (requirement == REQUIRES_RSA_SIG)
  9998. return 1;
  9999. break;
  10000. #endif /* !NO_RSA */
  10001. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  10002. if (requirement == REQUIRES_ECC)
  10003. return 1;
  10004. break;
  10005. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  10006. if (requirement == REQUIRES_ECC_STATIC)
  10007. return 1;
  10008. break;
  10009. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  10010. if (requirement == REQUIRES_ECC)
  10011. return 1;
  10012. break;
  10013. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  10014. if (requirement == REQUIRES_ECC_STATIC)
  10015. return 1;
  10016. break;
  10017. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  10018. if (requirement == REQUIRES_ECC)
  10019. return 1;
  10020. if (requirement == REQUIRES_AEAD)
  10021. return 1;
  10022. break;
  10023. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  10024. if (requirement == REQUIRES_ECC)
  10025. return 1;
  10026. if (requirement == REQUIRES_AEAD)
  10027. return 1;
  10028. break;
  10029. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  10030. if (requirement == REQUIRES_ECC_STATIC)
  10031. return 1;
  10032. if (requirement == REQUIRES_AEAD)
  10033. return 1;
  10034. break;
  10035. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  10036. if (requirement == REQUIRES_ECC_STATIC)
  10037. return 1;
  10038. if (requirement == REQUIRES_AEAD)
  10039. return 1;
  10040. break;
  10041. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10042. #ifndef NO_RSA
  10043. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10044. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  10045. if (requirement == REQUIRES_RSA)
  10046. return 1;
  10047. if (requirement == REQUIRES_AEAD)
  10048. return 1;
  10049. break;
  10050. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  10051. if (requirement == REQUIRES_RSA)
  10052. return 1;
  10053. if (requirement == REQUIRES_AEAD)
  10054. return 1;
  10055. break;
  10056. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  10057. if (requirement == REQUIRES_ECC_STATIC)
  10058. return 1;
  10059. if (requirement == REQUIRES_RSA_SIG)
  10060. return 1;
  10061. if (requirement == REQUIRES_AEAD)
  10062. return 1;
  10063. break;
  10064. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  10065. if (requirement == REQUIRES_ECC_STATIC)
  10066. return 1;
  10067. if (requirement == REQUIRES_RSA_SIG)
  10068. return 1;
  10069. if (requirement == REQUIRES_AEAD)
  10070. return 1;
  10071. break;
  10072. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10073. #ifdef HAVE_AESCCM
  10074. case TLS_RSA_WITH_AES_128_CCM_8 :
  10075. case TLS_RSA_WITH_AES_256_CCM_8 :
  10076. if (requirement == REQUIRES_RSA)
  10077. return 1;
  10078. if (requirement == REQUIRES_RSA_SIG)
  10079. return 1;
  10080. if (requirement == REQUIRES_AEAD)
  10081. return 1;
  10082. break;
  10083. #endif /* HAVE_AESCCM */
  10084. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10085. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  10086. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  10087. if (requirement == REQUIRES_RSA)
  10088. return 1;
  10089. break;
  10090. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  10091. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  10092. if (requirement == REQUIRES_RSA_SIG)
  10093. return 1;
  10094. if (requirement == REQUIRES_ECC_STATIC)
  10095. return 1;
  10096. break;
  10097. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10098. #endif /* !NO_RSA */
  10099. #ifdef HAVE_ARIA
  10100. case TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 :
  10101. case TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 :
  10102. if (requirement == REQUIRES_ECC)
  10103. return 1;
  10104. break;
  10105. #endif /* HAVE_ARIA */
  10106. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10107. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  10108. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  10109. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  10110. if (requirement == REQUIRES_ECC)
  10111. return 1;
  10112. if (requirement == REQUIRES_AEAD)
  10113. return 1;
  10114. break;
  10115. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  10116. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  10117. if (requirement == REQUIRES_ECC)
  10118. return 1;
  10119. break;
  10120. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  10121. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  10122. if (requirement == REQUIRES_ECC)
  10123. return 1;
  10124. if (requirement == REQUIRES_ECC_STATIC)
  10125. return 1;
  10126. break;
  10127. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10128. #ifndef NO_PSK
  10129. case TLS_PSK_WITH_AES_128_CCM:
  10130. case TLS_PSK_WITH_AES_256_CCM:
  10131. case TLS_PSK_WITH_AES_128_CCM_8:
  10132. case TLS_PSK_WITH_AES_256_CCM_8:
  10133. if (requirement == REQUIRES_PSK)
  10134. return 1;
  10135. if (requirement == REQUIRES_AEAD)
  10136. return 1;
  10137. break;
  10138. case TLS_DHE_PSK_WITH_AES_128_CCM:
  10139. case TLS_DHE_PSK_WITH_AES_256_CCM:
  10140. if (requirement == REQUIRES_PSK)
  10141. return 1;
  10142. if (requirement == REQUIRES_DHE)
  10143. return 1;
  10144. if (requirement == REQUIRES_AEAD)
  10145. return 1;
  10146. break;
  10147. #endif /* !NO_PSK */
  10148. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10149. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  10150. if (requirement == REQUIRES_ECC)
  10151. return 1;
  10152. break;
  10153. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  10154. if (requirement == REQUIRES_PSK)
  10155. return 1;
  10156. break;
  10157. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  10158. if (requirement == REQUIRES_PSK)
  10159. return 1;
  10160. break;
  10161. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10162. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  10163. case TLS_SHA256_SHA256:
  10164. break;
  10165. case TLS_SHA384_SHA384:
  10166. break;
  10167. #endif
  10168. default:
  10169. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  10170. return 0;
  10171. } /* switch */
  10172. } /* if */
  10173. /* ECC extensions */
  10174. if (first == ECDHE_PSK_BYTE) {
  10175. switch (second) {
  10176. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10177. case TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 :
  10178. if (requirement == REQUIRES_PSK)
  10179. return 1;
  10180. break;
  10181. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10182. default:
  10183. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC PSK");
  10184. return 0;
  10185. } /* switch */
  10186. } /* if */
  10187. #endif /* !WOLFSSL_NO_TLS12 */
  10188. #ifdef WOLFSSL_TLS13
  10189. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  10190. if (first == TLS13_BYTE) {
  10191. switch (second) {
  10192. case TLS_AES_128_GCM_SHA256:
  10193. case TLS_AES_256_GCM_SHA384:
  10194. case TLS_CHACHA20_POLY1305_SHA256:
  10195. case TLS_AES_128_CCM_SHA256:
  10196. case TLS_AES_128_CCM_8_SHA256:
  10197. if (requirement == REQUIRES_AEAD)
  10198. return 1;
  10199. return 0;
  10200. default:
  10201. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  10202. "TLS v1.3");
  10203. return 0;
  10204. }
  10205. }
  10206. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && defined(WOLFSSL_SM4)
  10207. if (first == CIPHER_BYTE) {
  10208. /* Other cipher suites for TLS 1.2 below. */
  10209. switch (second) {
  10210. #if defined(WOLFSSL_SM4_GCM)
  10211. case TLS_SM4_GCM_SM3:
  10212. return 0;
  10213. break;
  10214. #endif
  10215. #if defined(WOLFSSL_SM4_CCM)
  10216. case TLS_SM4_CCM_SM3:
  10217. return 0;
  10218. break;
  10219. #endif
  10220. }
  10221. }
  10222. #endif /* WOLFSSL_SM2 && WOLFSSL_SM3 && WOLFSSL_SM4 */
  10223. #endif /* WOLFSSL_TLS13 */
  10224. #ifndef WOLFSSL_NO_TLS12
  10225. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && defined(WOLFSSL_SM4)
  10226. if (first == SM_BYTE) {
  10227. switch (second) {
  10228. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  10229. case TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3:
  10230. if (requirement == REQUIRES_ECC)
  10231. return 1;
  10232. break;
  10233. #endif
  10234. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  10235. case TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3:
  10236. if (requirement == REQUIRES_ECC)
  10237. return 1;
  10238. break;
  10239. #endif
  10240. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  10241. case TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3:
  10242. if (requirement == REQUIRES_ECC)
  10243. return 1;
  10244. break;
  10245. #endif
  10246. default:
  10247. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires SM");
  10248. return 0;
  10249. }
  10250. }
  10251. #endif
  10252. if (first == CIPHER_BYTE) {
  10253. /* normal suites */
  10254. switch (second) {
  10255. #ifndef NO_RSA
  10256. #ifndef NO_RC4
  10257. case SSL_RSA_WITH_RC4_128_SHA :
  10258. if (requirement == REQUIRES_RSA)
  10259. return 1;
  10260. break;
  10261. case SSL_RSA_WITH_RC4_128_MD5 :
  10262. if (requirement == REQUIRES_RSA)
  10263. return 1;
  10264. break;
  10265. #endif /* NO_RC4 */
  10266. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  10267. if (requirement == REQUIRES_RSA)
  10268. return 1;
  10269. break;
  10270. case TLS_RSA_WITH_AES_128_CBC_SHA :
  10271. if (requirement == REQUIRES_RSA)
  10272. return 1;
  10273. break;
  10274. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  10275. if (requirement == REQUIRES_RSA)
  10276. return 1;
  10277. break;
  10278. case TLS_RSA_WITH_AES_256_CBC_SHA :
  10279. if (requirement == REQUIRES_RSA)
  10280. return 1;
  10281. break;
  10282. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  10283. if (requirement == REQUIRES_RSA)
  10284. return 1;
  10285. break;
  10286. case TLS_RSA_WITH_NULL_MD5 :
  10287. case TLS_RSA_WITH_NULL_SHA :
  10288. case TLS_RSA_WITH_NULL_SHA256 :
  10289. if (requirement == REQUIRES_RSA)
  10290. return 1;
  10291. break;
  10292. #endif /* !NO_RSA */
  10293. #ifndef NO_PSK
  10294. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  10295. if (requirement == REQUIRES_PSK)
  10296. return 1;
  10297. if (requirement == REQUIRES_AEAD)
  10298. return 1;
  10299. break;
  10300. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  10301. if (requirement == REQUIRES_PSK)
  10302. return 1;
  10303. if (requirement == REQUIRES_AEAD)
  10304. return 1;
  10305. break;
  10306. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  10307. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  10308. case TLS_PSK_WITH_AES_128_CBC_SHA :
  10309. case TLS_PSK_WITH_AES_256_CBC_SHA :
  10310. case TLS_PSK_WITH_NULL_SHA384 :
  10311. case TLS_PSK_WITH_NULL_SHA256 :
  10312. case TLS_PSK_WITH_NULL_SHA :
  10313. if (requirement == REQUIRES_PSK)
  10314. return 1;
  10315. break;
  10316. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  10317. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  10318. if (requirement == REQUIRES_DHE)
  10319. return 1;
  10320. if (requirement == REQUIRES_PSK)
  10321. return 1;
  10322. if (requirement == REQUIRES_AEAD)
  10323. return 1;
  10324. break;
  10325. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  10326. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  10327. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  10328. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  10329. if (requirement == REQUIRES_DHE)
  10330. return 1;
  10331. if (requirement == REQUIRES_PSK)
  10332. return 1;
  10333. break;
  10334. #endif /* NO_PSK */
  10335. #ifndef NO_RSA
  10336. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  10337. if (requirement == REQUIRES_RSA)
  10338. return 1;
  10339. if (requirement == REQUIRES_DHE)
  10340. return 1;
  10341. break;
  10342. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  10343. if (requirement == REQUIRES_RSA)
  10344. return 1;
  10345. if (requirement == REQUIRES_DHE)
  10346. return 1;
  10347. break;
  10348. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  10349. if (requirement == REQUIRES_RSA)
  10350. return 1;
  10351. if (requirement == REQUIRES_DHE)
  10352. return 1;
  10353. break;
  10354. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  10355. if (requirement == REQUIRES_RSA)
  10356. return 1;
  10357. if (requirement == REQUIRES_DHE)
  10358. return 1;
  10359. break;
  10360. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  10361. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  10362. if (requirement == REQUIRES_RSA)
  10363. return 1;
  10364. if (requirement == REQUIRES_AEAD)
  10365. return 1;
  10366. break;
  10367. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  10368. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  10369. if (requirement == REQUIRES_RSA)
  10370. return 1;
  10371. if (requirement == REQUIRES_DHE)
  10372. return 1;
  10373. if (requirement == REQUIRES_AEAD)
  10374. return 1;
  10375. break;
  10376. #ifdef HAVE_CAMELLIA
  10377. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  10378. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  10379. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  10380. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  10381. if (requirement == REQUIRES_RSA)
  10382. return 1;
  10383. break;
  10384. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  10385. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  10386. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  10387. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  10388. if (requirement == REQUIRES_RSA)
  10389. return 1;
  10390. if (requirement == REQUIRES_RSA_SIG)
  10391. return 1;
  10392. if (requirement == REQUIRES_DHE)
  10393. return 1;
  10394. break;
  10395. #endif /* HAVE_CAMELLIA */
  10396. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  10397. if (requirement == REQUIRES_RSA)
  10398. return 1;
  10399. if (requirement == REQUIRES_RSA_SIG)
  10400. return 1;
  10401. if (requirement == REQUIRES_DHE)
  10402. return 1;
  10403. break;
  10404. #endif /* !NO_RSA */
  10405. #ifdef HAVE_ANON
  10406. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  10407. if (requirement == REQUIRES_DHE)
  10408. return 1;
  10409. break;
  10410. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  10411. if (requirement == REQUIRES_DHE)
  10412. return 1;
  10413. if (requirement == REQUIRES_AEAD)
  10414. return 1;
  10415. break;
  10416. #endif
  10417. #ifdef WOLFSSL_MULTICAST
  10418. case WDM_WITH_NULL_SHA256 :
  10419. break;
  10420. #endif
  10421. default:
  10422. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  10423. return 0;
  10424. } /* switch */
  10425. } /* if ECC / Normal suites else */
  10426. #endif /* !WOLFSSL_NO_TLS12 */
  10427. return 0;
  10428. }
  10429. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  10430. #ifndef NO_CERTS
  10431. /* Match names with wildcards, each wildcard can represent a single name
  10432. component or fragment but not multiple names, i.e.,
  10433. *.z.com matches y.z.com but not x.y.z.com
  10434. return 1 on success */
  10435. int MatchDomainName(const char* pattern, int len, const char* str)
  10436. {
  10437. int ret = 0;
  10438. if (pattern == NULL || str == NULL || len <= 0)
  10439. return 0;
  10440. while (len > 0) {
  10441. char p = (char)XTOLOWER((unsigned char)*pattern++);
  10442. if (p == '\0')
  10443. break;
  10444. if (p == '*') {
  10445. char s;
  10446. while (--len > 0) {
  10447. p = (char)XTOLOWER((unsigned char)*pattern);
  10448. pattern++;
  10449. if (p != '*')
  10450. break;
  10451. }
  10452. if (len == 0)
  10453. p = '\0';
  10454. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  10455. if (s == p)
  10456. break;
  10457. if (s == '.')
  10458. return 0;
  10459. str++;
  10460. }
  10461. }
  10462. else {
  10463. if (p != (char)XTOLOWER((unsigned char) *str))
  10464. return 0;
  10465. }
  10466. if (len > 0) {
  10467. str++;
  10468. len--;
  10469. }
  10470. }
  10471. if (*str == '\0' && len == 0) {
  10472. ret = 1; /* success */
  10473. }
  10474. return ret;
  10475. }
  10476. /* Check that alternative names, if they exists, match the domain.
  10477. * Fail if there are wild patterns and they didn't match.
  10478. * Check the common name if no alternative names matched.
  10479. *
  10480. * dCert Decoded cert to get the alternative names from.
  10481. * domain Domain name to compare against.
  10482. * checkCN Whether to check the common name.
  10483. * returns 1 : match was found.
  10484. * 0 : no match found.
  10485. * -1 : No matches and wild pattern match failed.
  10486. */
  10487. int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
  10488. {
  10489. int match = 0;
  10490. DNS_entry* altName = NULL;
  10491. char *buf;
  10492. word32 len;
  10493. WOLFSSL_MSG("Checking AltNames");
  10494. if (dCert)
  10495. altName = dCert->altNames;
  10496. if (checkCN != NULL) {
  10497. *checkCN = (altName == NULL) ? 1 : 0;
  10498. }
  10499. while (altName) {
  10500. WOLFSSL_MSG("\tindividual AltName check");
  10501. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  10502. if (altName->type == ASN_IP_TYPE) {
  10503. buf = altName->ipString;
  10504. len = (word32)XSTRLEN(buf);
  10505. }
  10506. else
  10507. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  10508. {
  10509. buf = altName->name;
  10510. len = altName->len;
  10511. }
  10512. if (MatchDomainName(buf, len, domain)) {
  10513. match = 1;
  10514. if (checkCN != NULL) {
  10515. *checkCN = 0;
  10516. }
  10517. WOLFSSL_MSG("\tmatch found");
  10518. break;
  10519. }
  10520. /* No matches and wild pattern match failed. */
  10521. else if (buf && (len >=1) && (buf[0] == '*')) {
  10522. match = -1;
  10523. WOLFSSL_MSG("\twildcard match failed");
  10524. }
  10525. altName = altName->next;
  10526. }
  10527. return match;
  10528. }
  10529. /* Check the domain name matches the subject alternative name or the subject
  10530. * name.
  10531. *
  10532. * dcert Decoded certificate.
  10533. * domainName The domain name.
  10534. * domainNameLen The length of the domain name.
  10535. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  10536. */
  10537. int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
  10538. {
  10539. int checkCN;
  10540. int ret = DOMAIN_NAME_MISMATCH;
  10541. /* Assume name is NUL terminated. */
  10542. (void)domainNameLen;
  10543. if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
  10544. WOLFSSL_MSG("DomainName match on alt names failed");
  10545. }
  10546. else {
  10547. ret = 0;
  10548. }
  10549. #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  10550. if (checkCN == 1) {
  10551. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  10552. domainName) == 1) {
  10553. ret = 0;
  10554. }
  10555. else {
  10556. WOLFSSL_MSG("DomainName match on common name failed");
  10557. }
  10558. }
  10559. #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
  10560. return ret;
  10561. }
  10562. int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
  10563. {
  10564. WOLFSSL_MSG("Checking IPAddr");
  10565. return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
  10566. }
  10567. #ifdef SESSION_CERTS
  10568. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  10569. byte* certBuf, word32 certSz)
  10570. {
  10571. if (chain->count < MAX_CHAIN_DEPTH &&
  10572. certSz < MAX_X509_SIZE) {
  10573. chain->certs[chain->count].length = certSz;
  10574. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  10575. chain->count++;
  10576. }
  10577. else {
  10578. WOLFSSL_MSG("Couldn't store chain cert for session");
  10579. }
  10580. }
  10581. #endif
  10582. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  10583. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10584. void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType)
  10585. {
  10586. if (nameType == SUBJECT) {
  10587. XSTRNCPY(name->name, dCert->subject, ASN_NAME_MAX);
  10588. name->name[ASN_NAME_MAX - 1] = '\0';
  10589. name->sz = (int)XSTRLEN(name->name) + 1;
  10590. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  10591. name->rawLen = min(dCert->subjectRawLen, ASN_NAME_MAX);
  10592. XMEMCPY(name->raw, dCert->subjectRaw, name->rawLen);
  10593. #endif
  10594. }
  10595. else {
  10596. XSTRNCPY(name->name, dCert->issuer, ASN_NAME_MAX);
  10597. name->name[ASN_NAME_MAX - 1] = '\0';
  10598. name->sz = (int)XSTRLEN(name->name) + 1;
  10599. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)) \
  10600. && (defined(HAVE_PKCS7) || defined(WOLFSSL_CERT_EXT))
  10601. name->rawLen = min(dCert->issuerRawLen, ASN_NAME_MAX);
  10602. if (name->rawLen) {
  10603. XMEMCPY(name->raw, dCert->issuerRaw, name->rawLen);
  10604. }
  10605. #endif
  10606. }
  10607. }
  10608. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  10609. !defined(IGNORE_NAME_CONSTRAINTS)
  10610. /* copies over additional alt names such as dirName
  10611. * returns 0 on success
  10612. */
  10613. static int CopyAdditionalAltNames(DNS_entry** to, DNS_entry* from, int type,
  10614. void* heap)
  10615. {
  10616. DNS_entry* cur = from;
  10617. if (to == NULL) {
  10618. return BAD_FUNC_ARG;
  10619. }
  10620. while (cur != NULL) {
  10621. if (cur->type == type) {
  10622. DNS_entry* dnsEntry;
  10623. int strLen = cur->len;
  10624. dnsEntry = AltNameNew(heap);
  10625. if (dnsEntry == NULL) {
  10626. WOLFSSL_MSG("\tOut of Memory");
  10627. return MEMORY_E;
  10628. }
  10629. dnsEntry->type = type;
  10630. dnsEntry->name = (char*)XMALLOC(strLen + 1, heap,
  10631. DYNAMIC_TYPE_ALTNAME);
  10632. if (dnsEntry->name == NULL) {
  10633. WOLFSSL_MSG("\tOut of Memory");
  10634. XFREE(dnsEntry, heap, DYNAMIC_TYPE_ALTNAME);
  10635. return MEMORY_E;
  10636. }
  10637. dnsEntry->len = strLen;
  10638. XMEMCPY(dnsEntry->name, cur->name, strLen);
  10639. dnsEntry->name[strLen] = '\0';
  10640. dnsEntry->next = *to;
  10641. *to = dnsEntry;
  10642. }
  10643. cur = cur->next;
  10644. }
  10645. return 0;
  10646. }
  10647. #endif /* OPENSSL_EXTRA */
  10648. #ifdef WOLFSSL_CERT_REQ
  10649. static int CopyREQAttributes(WOLFSSL_X509* x509, DecodedCert* dCert)
  10650. {
  10651. int ret = 0;
  10652. if (dCert->cPwd) {
  10653. if (dCert->cPwdLen < CTC_NAME_SIZE) {
  10654. XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
  10655. x509->challengePw[dCert->cPwdLen] = '\0';
  10656. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  10657. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10658. NID_pkcs9_challengePassword,
  10659. MBSTRING_ASC,
  10660. (const byte*)dCert->cPwd,
  10661. dCert->cPwdLen) != WOLFSSL_SUCCESS) {
  10662. ret = REQ_ATTRIBUTE_E;
  10663. WOLFSSL_ERROR_VERBOSE(ret);
  10664. }
  10665. #endif
  10666. }
  10667. else {
  10668. WOLFSSL_MSG("Challenge password too long");
  10669. ret = MEMORY_E;
  10670. }
  10671. }
  10672. if (dCert->contentType) {
  10673. if (dCert->contentTypeLen < CTC_NAME_SIZE) {
  10674. XMEMCPY(x509->contentType, dCert->contentType, dCert->contentTypeLen);
  10675. x509->contentType[dCert->contentTypeLen] = '\0';
  10676. }
  10677. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  10678. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10679. NID_pkcs9_contentType,
  10680. MBSTRING_ASC,
  10681. (const byte*)dCert->contentType,
  10682. dCert->contentTypeLen) !=
  10683. WOLFSSL_SUCCESS) {
  10684. ret = REQ_ATTRIBUTE_E;
  10685. WOLFSSL_ERROR_VERBOSE(ret);
  10686. }
  10687. #endif
  10688. }
  10689. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  10690. if (dCert->sNum) {
  10691. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10692. NID_serialNumber,
  10693. MBSTRING_ASC,
  10694. (const byte*)dCert->sNum,
  10695. dCert->sNumLen) != WOLFSSL_SUCCESS) {
  10696. ret = REQ_ATTRIBUTE_E;
  10697. WOLFSSL_ERROR_VERBOSE(ret);
  10698. }
  10699. }
  10700. if (dCert->unstructuredName) {
  10701. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10702. NID_pkcs9_unstructuredName,
  10703. MBSTRING_ASC,
  10704. (const byte*)dCert->unstructuredName,
  10705. dCert->unstructuredNameLen)
  10706. != WOLFSSL_SUCCESS) {
  10707. ret = REQ_ATTRIBUTE_E;
  10708. WOLFSSL_ERROR_VERBOSE(ret);
  10709. }
  10710. }
  10711. if (dCert->surname) {
  10712. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10713. NID_surname,
  10714. MBSTRING_ASC,
  10715. (const byte*)dCert->surname,
  10716. dCert->surnameLen) != WOLFSSL_SUCCESS) {
  10717. ret = REQ_ATTRIBUTE_E;
  10718. WOLFSSL_ERROR_VERBOSE(ret);
  10719. }
  10720. }
  10721. if (dCert->givenName) {
  10722. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10723. NID_givenName,
  10724. MBSTRING_ASC,
  10725. (const byte*)dCert->givenName,
  10726. dCert->givenNameLen) != WOLFSSL_SUCCESS) {
  10727. ret = REQ_ATTRIBUTE_E;
  10728. WOLFSSL_ERROR_VERBOSE(ret);
  10729. }
  10730. }
  10731. if (dCert->dnQualifier) {
  10732. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10733. NID_dnQualifier,
  10734. MBSTRING_ASC,
  10735. (const byte*)dCert->dnQualifier,
  10736. dCert->dnQualifierLen) != WOLFSSL_SUCCESS) {
  10737. ret = REQ_ATTRIBUTE_E;
  10738. WOLFSSL_ERROR_VERBOSE(ret);
  10739. }
  10740. }
  10741. if (dCert->initials) {
  10742. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10743. NID_initials,
  10744. MBSTRING_ASC,
  10745. (const byte*)dCert->initials,
  10746. dCert->initialsLen) != WOLFSSL_SUCCESS) {
  10747. ret = REQ_ATTRIBUTE_E;
  10748. WOLFSSL_ERROR_VERBOSE(ret);
  10749. }
  10750. }
  10751. #endif /* OPENSSL_ALL */
  10752. return ret;
  10753. }
  10754. #endif /* WOLFSSL_CERT_REQ */
  10755. /* Copy parts X509 needs from Decoded cert, 0 on success */
  10756. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  10757. * altNames pointers could be free'd by second x509 still active by first */
  10758. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  10759. {
  10760. int ret = 0;
  10761. if (x509 == NULL || dCert == NULL ||
  10762. dCert->subjectCNLen < 0)
  10763. return BAD_FUNC_ARG;
  10764. if (x509->issuer.name == NULL || x509->subject.name == NULL) {
  10765. WOLFSSL_MSG("Either init was not called on X509 or programming error");
  10766. WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
  10767. return BAD_FUNC_ARG;
  10768. }
  10769. x509->version = dCert->version + 1;
  10770. CopyDecodedName(&x509->issuer, dCert, ISSUER);
  10771. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10772. if (dCert->issuerName != NULL) {
  10773. wolfSSL_X509_set_issuer_name(x509,
  10774. (WOLFSSL_X509_NAME*)dCert->issuerName);
  10775. x509->issuer.x509 = x509;
  10776. }
  10777. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10778. CopyDecodedName(&x509->subject, dCert, SUBJECT);
  10779. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10780. if (dCert->subjectName != NULL) {
  10781. wolfSSL_X509_set_subject_name(x509,
  10782. (WOLFSSL_X509_NAME*)dCert->subjectName);
  10783. x509->subject.x509 = x509;
  10784. }
  10785. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10786. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  10787. x509->serialSz = dCert->serialSz;
  10788. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  10789. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  10790. x509->subjectCN[dCert->subjectCNLen] = '\0';
  10791. }
  10792. else
  10793. x509->subjectCN[0] = '\0';
  10794. #ifdef WOLFSSL_CERT_REQ
  10795. x509->isCSR = dCert->isCSR;
  10796. /* CSR attributes */
  10797. if (x509->isCSR) {
  10798. ret = CopyREQAttributes(x509, dCert);
  10799. }
  10800. #endif /* WOLFSSL_CERT_REQ */
  10801. #ifdef WOLFSSL_SEP
  10802. {
  10803. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  10804. if (minSz > 0) {
  10805. x509->deviceTypeSz = minSz;
  10806. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  10807. }
  10808. else
  10809. x509->deviceTypeSz = 0;
  10810. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  10811. if (minSz > 0) {
  10812. x509->hwTypeSz = minSz;
  10813. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  10814. }
  10815. else
  10816. x509->hwTypeSz = 0;
  10817. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  10818. if (minSz > 0) {
  10819. x509->hwSerialNumSz = minSz;
  10820. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  10821. }
  10822. else
  10823. x509->hwSerialNumSz = 0;
  10824. }
  10825. #endif /* WOLFSSL_SEP */
  10826. {
  10827. int minSz;
  10828. if (dCert->beforeDateLen > 0) {
  10829. minSz = min(dCert->beforeDate[1], MAX_DATE_SZ);
  10830. x509->notBefore.type = dCert->beforeDate[0];
  10831. x509->notBefore.length = minSz;
  10832. XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
  10833. }
  10834. else
  10835. x509->notBefore.length = 0;
  10836. if (dCert->afterDateLen > 0) {
  10837. minSz = min(dCert->afterDate[1], MAX_DATE_SZ);
  10838. x509->notAfter.type = dCert->afterDate[0];
  10839. x509->notAfter.length = minSz;
  10840. XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
  10841. }
  10842. else
  10843. x509->notAfter.length = 0;
  10844. }
  10845. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  10846. x509->pubKey.buffer = (byte*)XMALLOC(
  10847. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  10848. if (x509->pubKey.buffer != NULL) {
  10849. x509->pubKeyOID = dCert->keyOID;
  10850. x509->pubKey.length = dCert->pubKeySize;
  10851. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  10852. }
  10853. else
  10854. ret = MEMORY_E;
  10855. #if defined(OPENSSL_ALL)
  10856. if (ret == 0) {
  10857. x509->key.pubKeyOID = dCert->keyOID;
  10858. if (!x509->key.algor) {
  10859. x509->key.algor = wolfSSL_X509_ALGOR_new();
  10860. } else {
  10861. wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
  10862. }
  10863. if (!x509->key.algor) {
  10864. ret = MEMORY_E;
  10865. } else {
  10866. if (!(x509->key.algor->algorithm =
  10867. wolfSSL_OBJ_nid2obj(oid2nid(dCert->keyOID, oidKeyType)))) {
  10868. ret = PUBLIC_KEY_E;
  10869. WOLFSSL_ERROR_VERBOSE(ret);
  10870. }
  10871. }
  10872. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  10873. if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
  10874. &dCert->publicKey,
  10875. dCert->pubKeySize))) {
  10876. ret = PUBLIC_KEY_E;
  10877. WOLFSSL_ERROR_VERBOSE(ret);
  10878. }
  10879. }
  10880. #endif
  10881. }
  10882. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  10883. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  10884. x509->sig.buffer = (byte*)XMALLOC(
  10885. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  10886. if (x509->sig.buffer == NULL) {
  10887. ret = MEMORY_E;
  10888. }
  10889. else {
  10890. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  10891. x509->sig.length = dCert->sigLength;
  10892. x509->sigOID = dCert->signatureOID;
  10893. }
  10894. #if defined(OPENSSL_ALL)
  10895. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  10896. if (!(x509->algor.algorithm =
  10897. wolfSSL_OBJ_nid2obj(oid2nid(dCert->signatureOID, oidSigType)))) {
  10898. ret = PUBLIC_KEY_E;
  10899. WOLFSSL_ERROR_VERBOSE(ret);
  10900. }
  10901. #endif
  10902. }
  10903. /* if der contains original source buffer then store for potential
  10904. * retrieval */
  10905. if (dCert->source != NULL && dCert->maxIdx > 0) {
  10906. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap)
  10907. == 0) {
  10908. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  10909. }
  10910. else {
  10911. ret = MEMORY_E;
  10912. }
  10913. }
  10914. x509->altNames = dCert->altNames;
  10915. dCert->weOwnAltNames = 0;
  10916. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  10917. !defined(IGNORE_NAME_CONSTRAINTS)
  10918. /* add copies of email names from dCert to X509 */
  10919. if (CopyAdditionalAltNames(&x509->altNames, dCert->altEmailNames,
  10920. ASN_RFC822_TYPE, x509->heap) != 0) {
  10921. return MEMORY_E;
  10922. }
  10923. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10924. #if defined(OPENSSL_EXTRA) && !defined(IGNORE_NAME_CONSTRAINTS)
  10925. /* add copies of alternate directory names from dCert to X509 */
  10926. if (CopyAdditionalAltNames(&x509->altNames, dCert->altDirNames,
  10927. ASN_DIR_TYPE, x509->heap) != 0) {
  10928. return MEMORY_E;
  10929. }
  10930. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10931. x509->altNamesNext = x509->altNames; /* index hint */
  10932. x509->isCa = dCert->isCA;
  10933. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10934. x509->pathLength = dCert->pathLength;
  10935. x509->keyUsage = dCert->extKeyUsage;
  10936. x509->CRLdistSet = dCert->extCRLdistSet;
  10937. x509->CRLdistCrit = dCert->extCRLdistCrit;
  10938. if (dCert->extCrlInfoRaw != NULL && dCert->extCrlInfoRawSz > 0) {
  10939. x509->rawCRLInfo = (byte*)XMALLOC(dCert->extCrlInfoRawSz, x509->heap,
  10940. DYNAMIC_TYPE_X509_EXT);
  10941. if (x509->rawCRLInfo != NULL) {
  10942. XMEMCPY(x509->rawCRLInfo, dCert->extCrlInfoRaw, dCert->extCrlInfoRawSz);
  10943. x509->rawCRLInfoSz = dCert->extCrlInfoRawSz;
  10944. }
  10945. else {
  10946. ret = MEMORY_E;
  10947. }
  10948. }
  10949. if (dCert->extCrlInfo != NULL && dCert->extCrlInfoSz > 0) {
  10950. x509->CRLInfo = (byte*)XMALLOC(dCert->extCrlInfoSz, x509->heap,
  10951. DYNAMIC_TYPE_X509_EXT);
  10952. if (x509->CRLInfo != NULL) {
  10953. XMEMCPY(x509->CRLInfo, dCert->extCrlInfo, dCert->extCrlInfoSz);
  10954. x509->CRLInfoSz = dCert->extCrlInfoSz;
  10955. }
  10956. else {
  10957. ret = MEMORY_E;
  10958. }
  10959. }
  10960. x509->authInfoSet = dCert->extAuthInfoSet;
  10961. x509->authInfoCrit = dCert->extAuthInfoCrit;
  10962. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  10963. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  10964. DYNAMIC_TYPE_X509_EXT);
  10965. if (x509->authInfo != NULL) {
  10966. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  10967. x509->authInfoSz = dCert->extAuthInfoSz;
  10968. }
  10969. else {
  10970. ret = MEMORY_E;
  10971. }
  10972. }
  10973. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  10974. if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
  10975. x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
  10976. DYNAMIC_TYPE_X509_EXT);
  10977. if (x509->authInfoCaIssuer != NULL) {
  10978. XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
  10979. x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
  10980. }
  10981. else {
  10982. ret = MEMORY_E;
  10983. }
  10984. }
  10985. #endif
  10986. x509->basicConstSet = dCert->extBasicConstSet;
  10987. x509->basicConstCrit = dCert->extBasicConstCrit;
  10988. x509->basicConstPlSet = dCert->pathLengthSet;
  10989. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  10990. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  10991. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  10992. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  10993. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  10994. #ifdef WOLFSSL_AKID_NAME
  10995. if (dCert->extRawAuthKeyIdSrc != NULL &&
  10996. dCert->extAuthKeyIdSrc > dCert->extRawAuthKeyIdSrc &&
  10997. dCert->extAuthKeyIdSrc <
  10998. (dCert->extRawAuthKeyIdSrc + dCert->extRawAuthKeyIdSz)) {
  10999. /* Confirmed: extAuthKeyIdSrc points inside extRawAuthKeyIdSrc */
  11000. x509->authKeyIdSrc = (byte*)XMALLOC(dCert->extRawAuthKeyIdSz,
  11001. x509->heap, DYNAMIC_TYPE_X509_EXT);
  11002. if (x509->authKeyIdSrc != NULL) {
  11003. XMEMCPY(x509->authKeyIdSrc, dCert->extRawAuthKeyIdSrc,
  11004. dCert->extRawAuthKeyIdSz);
  11005. x509->authKeyIdSrcSz = dCert->extRawAuthKeyIdSz;
  11006. /* Set authKeyId to same offset inside authKeyIdSrc */
  11007. x509->authKeyId = x509->authKeyIdSrc +
  11008. (dCert->extAuthKeyIdSrc - dCert->extRawAuthKeyIdSrc);
  11009. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  11010. }
  11011. else
  11012. ret = MEMORY_E;
  11013. }
  11014. #else
  11015. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  11016. DYNAMIC_TYPE_X509_EXT);
  11017. if (x509->authKeyId != NULL) {
  11018. XMEMCPY(x509->authKeyId,
  11019. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  11020. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  11021. }
  11022. #endif
  11023. else
  11024. ret = MEMORY_E;
  11025. }
  11026. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  11027. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  11028. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  11029. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  11030. DYNAMIC_TYPE_X509_EXT);
  11031. if (x509->subjKeyId != NULL) {
  11032. XMEMCPY(x509->subjKeyId,
  11033. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  11034. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  11035. }
  11036. else
  11037. ret = MEMORY_E;
  11038. }
  11039. x509->keyUsageSet = dCert->extKeyUsageSet;
  11040. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  11041. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  11042. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  11043. x509->heap, DYNAMIC_TYPE_X509_EXT);
  11044. if (x509->extKeyUsageSrc != NULL) {
  11045. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  11046. dCert->extExtKeyUsageSz);
  11047. x509->extKeyUsage = dCert->extExtKeyUsage;
  11048. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  11049. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  11050. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  11051. }
  11052. else {
  11053. ret = MEMORY_E;
  11054. }
  11055. }
  11056. #ifndef IGNORE_NETSCAPE_CERT_TYPE
  11057. x509->nsCertType = dCert->nsCertType;
  11058. #endif
  11059. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  11060. x509->certPolicySet = dCert->extCertPolicySet;
  11061. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  11062. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  11063. #ifdef WOLFSSL_CERT_EXT
  11064. {
  11065. int i;
  11066. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  11067. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  11068. MAX_CERTPOL_SZ);
  11069. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  11070. }
  11071. #endif /* WOLFSSL_CERT_EXT */
  11072. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  11073. #ifdef OPENSSL_ALL
  11074. if (dCert->extSubjAltNameSrc != NULL && dCert->extSubjAltNameSz != 0) {
  11075. x509->subjAltNameSrc = (byte*)XMALLOC(dCert->extSubjAltNameSz, x509->heap,
  11076. DYNAMIC_TYPE_X509_EXT);
  11077. if (x509->subjAltNameSrc != NULL) {
  11078. XMEMCPY(x509->subjAltNameSrc,
  11079. dCert->extSubjAltNameSrc, dCert->extSubjAltNameSz);
  11080. x509->subjAltNameSz = dCert->extSubjAltNameSz;
  11081. }
  11082. else
  11083. ret = MEMORY_E;
  11084. }
  11085. #endif
  11086. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  11087. x509->pkCurveOID = dCert->pkCurveOID;
  11088. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  11089. return ret;
  11090. }
  11091. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  11092. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  11093. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  11094. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11095. word32 status_length)
  11096. {
  11097. int ret = 0;
  11098. OcspRequest* request;
  11099. #ifdef WOLFSSL_SMALL_STACK
  11100. CertStatus* status;
  11101. OcspEntry* single;
  11102. OcspResponse* response;
  11103. #else
  11104. CertStatus status[1];
  11105. OcspEntry single[1];
  11106. OcspResponse response[1];
  11107. #endif
  11108. WOLFSSL_ENTER("ProcessCSR");
  11109. do {
  11110. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  11111. if (ssl->status_request) {
  11112. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  11113. ssl->status_request = 0;
  11114. break;
  11115. }
  11116. #endif
  11117. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  11118. if (ssl->status_request_v2) {
  11119. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  11120. WOLFSSL_CSR2_OCSP, 0);
  11121. ssl->status_request_v2 = 0;
  11122. break;
  11123. }
  11124. #endif
  11125. return BUFFER_ERROR;
  11126. } while(0);
  11127. if (request == NULL)
  11128. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  11129. #ifdef WOLFSSL_SMALL_STACK
  11130. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  11131. DYNAMIC_TYPE_OCSP_STATUS);
  11132. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  11133. DYNAMIC_TYPE_OCSP_ENTRY);
  11134. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  11135. DYNAMIC_TYPE_OCSP_REQUEST);
  11136. if (status == NULL || single == NULL || response == NULL) {
  11137. if (status)
  11138. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  11139. if (single)
  11140. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  11141. if (response)
  11142. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  11143. return MEMORY_ERROR;
  11144. }
  11145. #endif
  11146. InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
  11147. if (OcspResponseDecode(response, SSL_CM(ssl), ssl->heap, 0) != 0)
  11148. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11149. else if (CompareOcspReqResp(request, response) != 0)
  11150. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11151. else if (response->responseStatus != OCSP_SUCCESSFUL)
  11152. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11153. else if (response->single->status->status == CERT_REVOKED)
  11154. ret = OCSP_CERT_REVOKED;
  11155. else if (response->single->status->status != CERT_GOOD)
  11156. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11157. else {
  11158. XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
  11159. ssl->ocspProducedDateFormat = response->producedDateFormat;
  11160. }
  11161. *inOutIdx += status_length;
  11162. FreeOcspResponse(response);
  11163. #ifdef WOLFSSL_SMALL_STACK
  11164. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  11165. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  11166. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  11167. #endif
  11168. WOLFSSL_LEAVE("ProcessCSR", ret);
  11169. return ret;
  11170. }
  11171. #endif
  11172. #ifdef HAVE_PK_CALLBACKS
  11173. #ifdef HAVE_ECC
  11174. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  11175. const unsigned char* hash, unsigned int hashSz,
  11176. const unsigned char* keyDer, unsigned int keySz,
  11177. int* result, void* ctx)
  11178. {
  11179. int ret = NOT_COMPILED_IN;
  11180. WOLFSSL* ssl = (WOLFSSL*)ctx;
  11181. if (ssl && ssl->ctx->EccVerifyCb) {
  11182. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  11183. keyDer, keySz, result, ssl->EccVerifyCtx);
  11184. }
  11185. return ret;
  11186. }
  11187. #endif
  11188. #ifndef NO_RSA
  11189. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  11190. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  11191. void* ctx)
  11192. {
  11193. int ret = NOT_COMPILED_IN;
  11194. WOLFSSL* ssl = (WOLFSSL*)ctx;
  11195. if (ssl && ssl->ctx->RsaVerifyCb) {
  11196. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  11197. ssl->RsaVerifyCtx);
  11198. }
  11199. return ret;
  11200. }
  11201. #endif
  11202. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  11203. {
  11204. if (ssl == NULL || sigCtx == NULL)
  11205. return BAD_FUNC_ARG;
  11206. /* only setup the verify callback if a PK is set */
  11207. #ifdef HAVE_ECC
  11208. #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  11209. sigCtx->pkCbEcc = Renesas_cmn_SigPkCbEccVerify;
  11210. sigCtx->pkCtxEcc = (void*)&sigCtx->CertAtt;
  11211. (void)SigPkCbEccVerify;
  11212. #else
  11213. if (ssl->ctx->EccVerifyCb) {
  11214. sigCtx->pkCbEcc = SigPkCbEccVerify;
  11215. sigCtx->pkCtxEcc = ssl;
  11216. }
  11217. #endif
  11218. #endif
  11219. #ifndef NO_RSA
  11220. /* only setup the verify callback if a PK is set */
  11221. #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  11222. sigCtx->pkCbRsa = Renesas_cmn_SigPkCbRsaVerify;
  11223. sigCtx->pkCtxRsa = (void*)&sigCtx->CertAtt;
  11224. (void)SigPkCbRsaVerify;
  11225. #else
  11226. if (ssl->ctx->RsaVerifyCb) {
  11227. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  11228. sigCtx->pkCtxRsa = ssl;
  11229. }
  11230. #endif
  11231. #endif
  11232. return 0;
  11233. }
  11234. #endif /* HAVE_PK_CALLBACKS */
  11235. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  11236. void DoCertFatalAlert(WOLFSSL* ssl, int ret)
  11237. {
  11238. int alertWhy;
  11239. if (ssl == NULL || ret == 0) {
  11240. return;
  11241. }
  11242. WOLFSSL_ERROR(ret);
  11243. /* Determine alert reason */
  11244. alertWhy = bad_certificate;
  11245. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
  11246. alertWhy = certificate_expired;
  11247. }
  11248. else if (ret == ASN_NO_SIGNER_E || ret == ASN_PATHLEN_INV_E ||
  11249. ret == ASN_PATHLEN_SIZE_E) {
  11250. alertWhy = unknown_ca;
  11251. }
  11252. #ifdef OPENSSL_EXTRA
  11253. else if (ret == CRL_CERT_REVOKED) {
  11254. alertWhy = certificate_revoked;
  11255. }
  11256. #endif
  11257. else if (ret == NO_PEER_CERT) {
  11258. #ifdef WOLFSSL_TLS13
  11259. if (ssl->options.tls1_3) {
  11260. alertWhy = certificate_required;
  11261. }
  11262. else
  11263. #endif
  11264. {
  11265. alertWhy = handshake_failure;
  11266. }
  11267. }
  11268. /* send fatal alert and mark connection closed */
  11269. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  11270. ssl->options.isClosed = 1;
  11271. }
  11272. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  11273. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  11274. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  11275. * The intermediates are done first then peer leaf cert last. Use the
  11276. * store->error_depth member to determine index (0=peer, >1 intermediates)
  11277. */
  11278. int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret,
  11279. ProcPeerCertArgs* args)
  11280. {
  11281. int verify_ok = 0, use_cb = 0;
  11282. void *heap;
  11283. if (cm == NULL) {
  11284. return BAD_FUNC_ARG;
  11285. }
  11286. heap = (ssl != NULL) ? ssl->heap : cm->heap;
  11287. /* Determine if verify was okay */
  11288. if (ret == 0) {
  11289. verify_ok = 1;
  11290. }
  11291. /* Determine if verify callback should be used */
  11292. if (ret != 0) {
  11293. if ((ssl != NULL) && (!ssl->options.verifyNone)) {
  11294. use_cb = 1; /* always report errors */
  11295. }
  11296. }
  11297. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  11298. /* always use verify callback on peer leaf cert */
  11299. if (args->certIdx == 0) {
  11300. use_cb = 1;
  11301. }
  11302. #endif
  11303. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  11304. /* perform verify callback on other intermediate certs (not just peer) */
  11305. if (args->certIdx > 0) {
  11306. use_cb = 1;
  11307. }
  11308. #endif
  11309. #if defined(OPENSSL_EXTRA)
  11310. /* Perform domain and IP check only for the leaf certificate */
  11311. if (args->certIdx == 0) {
  11312. /* perform domain name check on the peer certificate */
  11313. if (args->dCertInit && args->dCert && (ssl != NULL) &&
  11314. ssl->param && ssl->param->hostName[0]) {
  11315. /* If altNames names is present, then subject common name is ignored */
  11316. if (args->dCert->altNames != NULL) {
  11317. if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
  11318. if (ret == 0) {
  11319. ret = DOMAIN_NAME_MISMATCH;
  11320. WOLFSSL_ERROR_VERBOSE(ret);
  11321. }
  11322. }
  11323. }
  11324. #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  11325. else {
  11326. if (args->dCert->subjectCN) {
  11327. if (MatchDomainName(args->dCert->subjectCN,
  11328. args->dCert->subjectCNLen,
  11329. ssl->param->hostName) == 0) {
  11330. if (ret == 0) {
  11331. ret = DOMAIN_NAME_MISMATCH;
  11332. WOLFSSL_ERROR_VERBOSE(ret);
  11333. }
  11334. }
  11335. }
  11336. }
  11337. #else
  11338. else {
  11339. if (ret == 0) {
  11340. ret = DOMAIN_NAME_MISMATCH;
  11341. WOLFSSL_ERROR_VERBOSE(ret);
  11342. }
  11343. }
  11344. #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
  11345. }
  11346. /* perform IP address check on the peer certificate */
  11347. if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
  11348. (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
  11349. if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
  11350. if (ret == 0) {
  11351. ret = IPADDR_MISMATCH;
  11352. WOLFSSL_ERROR_VERBOSE(ret);
  11353. }
  11354. }
  11355. }
  11356. }
  11357. #endif
  11358. /* if verify callback has been set */
  11359. if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
  11360. #ifdef OPENSSL_ALL
  11361. || (ssl->ctx->verifyCertCb != NULL)
  11362. #endif
  11363. ))
  11364. #ifndef NO_WOLFSSL_CM_VERIFY
  11365. || (cm->verifyCallback != NULL)
  11366. #endif
  11367. ) {
  11368. int verifyFail = 0;
  11369. #ifdef WOLFSSL_SMALL_STACK
  11370. WOLFSSL_X509_STORE_CTX* store;
  11371. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11372. WOLFSSL_X509* x509;
  11373. #endif
  11374. char* domain = NULL;
  11375. #else
  11376. WOLFSSL_X509_STORE_CTX store[1];
  11377. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11378. WOLFSSL_X509 x509[1];
  11379. #endif
  11380. char domain[ASN_NAME_MAX];
  11381. #endif
  11382. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11383. int x509Free = 0;
  11384. #endif
  11385. #ifdef WOLFSSL_SMALL_STACK
  11386. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  11387. sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE);
  11388. if (store == NULL) {
  11389. return MEMORY_E;
  11390. }
  11391. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11392. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  11393. DYNAMIC_TYPE_X509);
  11394. if (x509 == NULL) {
  11395. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11396. return MEMORY_E;
  11397. }
  11398. #endif
  11399. domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
  11400. if (domain == NULL) {
  11401. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11402. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11403. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  11404. #endif
  11405. return MEMORY_E;
  11406. }
  11407. #endif /* WOLFSSL_SMALL_STACK */
  11408. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  11409. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11410. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  11411. #endif
  11412. domain[0] = '\0';
  11413. /* build subject CN as string to return in store */
  11414. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  11415. int subjectCNLen = args->dCert->subjectCNLen;
  11416. if (subjectCNLen > ASN_NAME_MAX-1)
  11417. subjectCNLen = ASN_NAME_MAX-1;
  11418. if (subjectCNLen > 0) {
  11419. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  11420. domain[subjectCNLen] = '\0';
  11421. }
  11422. }
  11423. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  11424. store->error = ret;
  11425. #else
  11426. store->error = GetX509Error(ret);
  11427. #endif
  11428. store->error_depth = args->certIdx;
  11429. store->discardSessionCerts = 0;
  11430. store->domain = domain;
  11431. if (ssl != NULL) {
  11432. if (ssl->verifyCbCtx != NULL) {
  11433. /* Use the WOLFSSL user context if set */
  11434. store->userCtx = ssl->verifyCbCtx;
  11435. }
  11436. else {
  11437. /* Else use the WOLFSSL_CTX user context */
  11438. store->userCtx = ssl->ctx->verifyCbCtx;
  11439. }
  11440. }
  11441. else {
  11442. store->userCtx = cm;
  11443. }
  11444. store->certs = args->certs;
  11445. store->totalCerts = args->totalCerts;
  11446. #if defined(HAVE_EX_DATA) && \
  11447. (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  11448. if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
  11449. != WOLFSSL_SUCCESS) {
  11450. WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
  11451. }
  11452. #endif
  11453. if (ssl != NULL) {
  11454. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  11455. store->store = SSL_STORE(ssl);
  11456. #if defined(OPENSSL_EXTRA)
  11457. store->depth = args->count;
  11458. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  11459. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  11460. heap, DYNAMIC_TYPE_OPENSSL);
  11461. if (store->param == NULL) {
  11462. #ifdef WOLFSSL_SMALL_STACK
  11463. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  11464. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11465. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  11466. #endif
  11467. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11468. #endif
  11469. return MEMORY_E;
  11470. }
  11471. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  11472. /* Overwrite with non-default param values in SSL */
  11473. if (ssl->param) {
  11474. if (ssl->param->check_time)
  11475. store->param->check_time = ssl->param->check_time;
  11476. if (ssl->param->flags)
  11477. store->param->flags = ssl->param->flags;
  11478. if (ssl->param->hostName[0])
  11479. XMEMCPY(store->param->hostName, ssl->param->hostName,
  11480. WOLFSSL_HOST_NAME_MAX);
  11481. }
  11482. #endif /* defined(OPENSSL_EXTRA) */
  11483. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  11484. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11485. #ifdef KEEP_PEER_CERT
  11486. if (args->certIdx == 0) {
  11487. store->current_cert = &ssl->peerCert; /* use existing X509 */
  11488. }
  11489. else
  11490. #endif
  11491. {
  11492. InitX509(x509, 0, heap);
  11493. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  11494. store->current_cert = x509;
  11495. x509Free = 1;
  11496. }
  11497. else {
  11498. FreeX509(x509);
  11499. }
  11500. }
  11501. #endif
  11502. #ifdef SESSION_CERTS
  11503. store->sesChain = &ssl->session->chain;
  11504. #endif
  11505. }
  11506. #ifndef NO_WOLFSSL_CM_VERIFY
  11507. /* non-zero return code indicates failure override */
  11508. if (cm->verifyCallback != NULL) {
  11509. store->userCtx = cm;
  11510. if (cm->verifyCallback(verify_ok, store)) {
  11511. if (ret != 0) {
  11512. WOLFSSL_MSG("Verify CM callback overriding error!");
  11513. ret = 0;
  11514. }
  11515. }
  11516. else {
  11517. verifyFail = 1;
  11518. }
  11519. }
  11520. #endif
  11521. if (ssl != NULL) {
  11522. #ifdef OPENSSL_ALL
  11523. /* non-zero return code indicates failure override */
  11524. if (ssl->ctx->verifyCertCb) {
  11525. if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
  11526. if (ret != 0) {
  11527. WOLFSSL_MSG("Verify Cert callback overriding error!");
  11528. ret = 0;
  11529. }
  11530. }
  11531. else {
  11532. verifyFail = 1;
  11533. }
  11534. }
  11535. #endif
  11536. /* non-zero return code indicates failure override */
  11537. if (ssl->verifyCallback) {
  11538. if (ssl->verifyCallback(verify_ok, store)) {
  11539. if (ret != 0) {
  11540. WOLFSSL_MSG("Verify callback overriding error!");
  11541. ret = 0;
  11542. }
  11543. }
  11544. else {
  11545. verifyFail = 1;
  11546. }
  11547. }
  11548. }
  11549. if (verifyFail) {
  11550. /* induce error if one not present */
  11551. if (ret == 0) {
  11552. ret = VERIFY_CERT_ERROR;
  11553. WOLFSSL_ERROR_VERBOSE(ret);
  11554. }
  11555. /* mark as verify error */
  11556. args->verifyErr = 1;
  11557. }
  11558. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11559. if (x509Free) {
  11560. FreeX509(x509);
  11561. }
  11562. #endif
  11563. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11564. wolfSSL_sk_X509_pop_free(store->chain, NULL);
  11565. store->chain = NULL;
  11566. #endif
  11567. #ifdef SESSION_CERTS
  11568. if ((ssl != NULL) && (store->discardSessionCerts)) {
  11569. WOLFSSL_MSG("Verify callback requested discard sess certs");
  11570. ssl->session->chain.count = 0;
  11571. #ifdef WOLFSSL_ALT_CERT_CHAINS
  11572. ssl->session->altChain.count = 0;
  11573. #endif
  11574. }
  11575. #endif /* SESSION_CERTS */
  11576. #ifdef OPENSSL_EXTRA
  11577. if ((ssl != NULL) && (store->param)) {
  11578. XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL);
  11579. }
  11580. #endif
  11581. #ifdef WOLFSSL_SMALL_STACK
  11582. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  11583. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11584. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  11585. #endif
  11586. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11587. #endif
  11588. }
  11589. (void)heap;
  11590. return ret;
  11591. }
  11592. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  11593. {
  11594. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  11595. (void)ssl;
  11596. if (args->certs) {
  11597. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  11598. args->certs = NULL;
  11599. }
  11600. #ifdef WOLFSSL_TLS13
  11601. if (args->exts) {
  11602. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  11603. args->exts = NULL;
  11604. }
  11605. #endif
  11606. if (args->dCert) {
  11607. if (args->dCertInit) {
  11608. FreeDecodedCert(args->dCert);
  11609. args->dCertInit = 0;
  11610. }
  11611. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  11612. args->dCert = NULL;
  11613. }
  11614. }
  11615. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  11616. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  11617. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11618. /* load certificate file which has the form <hash>.(r)N[0..N] */
  11619. /* in the folder. */
  11620. /* (r), in the case of CRL file */
  11621. /* @param store a pointer to X509_STORE structure */
  11622. /* @param issuer a pointer to X509_NAME that presents an issuer */
  11623. /* @param type X509_LU_X509 or X509_LU_CRL */
  11624. /* @return WOLFSSL_SUCCESS on successful, otherwise WOLFSSL_FAILURE */
  11625. int LoadCertByIssuer(WOLFSSL_X509_STORE* store, X509_NAME* issuer, int type)
  11626. {
  11627. const int MAX_SUFFIX = 10;/* The number comes from CA_TABLE_SIZE=10 */
  11628. int ret = WOLFSSL_SUCCESS;
  11629. WOLFSSL_X509_LOOKUP* lookup;
  11630. WOLFSSL_BY_DIR_entry* entry;
  11631. WOLFSSL_BY_DIR_HASH hash_tmp;
  11632. WOLFSSL_BY_DIR_HASH* ph = NULL;
  11633. WOLFSSL_X509* x509;
  11634. unsigned long hash = 0;
  11635. char* filename = NULL;
  11636. const char* post = "";
  11637. byte* pbuf = NULL;
  11638. int len, num, i, idx;
  11639. int suffix = 0;
  11640. int retHash = NOT_COMPILED_IN;
  11641. byte dgt[WC_MAX_DIGEST_SIZE];
  11642. WOLFSSL_ENTER("LoadCertByIssuer");
  11643. /* sanity check */
  11644. if (store == NULL || issuer == NULL || (type != X509_LU_X509 && type != X509_LU_CRL)) {
  11645. return WOLFSSL_FAILURE;
  11646. }
  11647. lookup = &store->lookup;
  11648. if (lookup->dirs == NULL || lookup->type != 1) {
  11649. return WOLFSSL_FAILURE;
  11650. }
  11651. len = wolfSSL_i2d_X509_NAME_canon(issuer, &pbuf);
  11652. if (len > 0) {
  11653. #ifndef NO_SHA
  11654. retHash = wc_ShaHash((const byte*)pbuf, len, dgt);
  11655. #endif
  11656. if (retHash == 0) {
  11657. /* 4 bytes in little endian as unsigned long */
  11658. hash = (((unsigned long)dgt[3] << 24) |
  11659. ((unsigned long)dgt[2] << 16) |
  11660. ((unsigned long)dgt[1] << 8) |
  11661. ((unsigned long)dgt[0]));
  11662. } else {
  11663. WOLFSSL_MSG("failed hash operation");
  11664. return WOLFSSL_FAILURE;
  11665. }
  11666. wolfSSL_OPENSSL_free(pbuf);
  11667. }
  11668. /* try to load each hashed name file in path */
  11669. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11670. if (type == X509_LU_CRL) {
  11671. post = "r";
  11672. }
  11673. num = wolfSSL_sk_BY_DIR_entry_num(lookup->dirs->dir_entry);
  11674. for (i=0; i<num; i++) {
  11675. entry = wolfSSL_sk_BY_DIR_entry_value(lookup->dirs->dir_entry, i);
  11676. if (type == X509_LU_CRL && entry->hashes != NULL &&
  11677. wolfSSL_sk_BY_DIR_HASH_num(entry->hashes) > 0) {
  11678. /* lock the list */
  11679. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  11680. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  11681. return BAD_MUTEX_E;
  11682. }
  11683. hash_tmp.hash_value = hash;
  11684. idx = wolfSSL_sk_BY_DIR_HASH_find(entry->hashes, &hash_tmp);
  11685. if (idx >= 0) {
  11686. WOLFSSL_MSG("find hashed CRL in list");
  11687. ph = wolfSSL_sk_BY_DIR_HASH_value(entry->hashes, idx);
  11688. suffix = ph->last_suffix;
  11689. } else {
  11690. ph = NULL;
  11691. suffix = 0;
  11692. }
  11693. wc_UnLockMutex(&lookup->dirs->lock);
  11694. }
  11695. /* Additional buffer length for file name memory allocation : */
  11696. /* / <hashvalue>.(r)N\0 */
  11697. /*|1| 8 |1|1|1|1| => 13 */
  11698. len = (int)XSTRLEN(entry->dir_name) + 13;
  11699. if (filename != NULL) {
  11700. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11701. }
  11702. filename = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  11703. if (filename == NULL) {
  11704. WOLFSSL_MSG("memory allocation error");
  11705. return MEMORY_E;
  11706. }
  11707. /* set as FAILURE, if successfully loading cert of CRL, this becomes */
  11708. /* WOLFSSL_SUCCESS */
  11709. ret = WOLFSSL_FAILURE;
  11710. for (; suffix < MAX_SUFFIX; suffix++) {
  11711. /* /folder-path/<hash>.(r)N[0..9] */
  11712. if (XSNPRINTF(filename, len, "%s/%08lx.%s%d", entry->dir_name,
  11713. hash, post, suffix)
  11714. >= len)
  11715. {
  11716. WOLFSSL_MSG("buffer overrun in LoadCertByIssuer");
  11717. ret = BUFFER_E;
  11718. break;
  11719. }
  11720. if(wc_FileExists(filename) == 0/*0 file exists */) {
  11721. if (type == X509_LU_X509) {
  11722. x509 = wolfSSL_X509_load_certificate_file(filename,
  11723. WOLFSSL_FILETYPE_PEM);
  11724. if (x509 != NULL) {
  11725. ret = wolfSSL_X509_STORE_add_cert(store, x509);
  11726. wolfSSL_X509_free(x509);
  11727. } else {
  11728. WOLFSSL_MSG("failed to load certificate");
  11729. ret = WOLFSSL_FAILURE;
  11730. break;
  11731. }
  11732. }
  11733. else if (type == X509_LU_CRL) {
  11734. #if defined(HAVE_CRL)
  11735. ret = wolfSSL_X509_load_crl_file(&store->lookup, filename,
  11736. entry->dir_type);
  11737. if (ret != WOLFSSL_SUCCESS) {
  11738. WOLFSSL_MSG("failed to load CRL");
  11739. break;
  11740. }
  11741. #else
  11742. WOLFSSL_MSG("CRL is not supported");
  11743. ret = WOLFSSL_FAILURE;
  11744. break;
  11745. #endif /* HAVE_CRL */
  11746. }
  11747. } else
  11748. break;
  11749. }
  11750. if (ret != WOLFSSL_SUCCESS) {
  11751. WOLFSSL_MSG("not found file");
  11752. ret = WOLFSSL_FAILURE;
  11753. } else {
  11754. if (type == X509_LU_CRL) {
  11755. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  11756. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  11757. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11758. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  11759. return BAD_MUTEX_E;
  11760. }
  11761. if (ph == NULL) {
  11762. ph = wolfSSL_BY_DIR_HASH_new();
  11763. if (ph == NULL) {
  11764. WOLFSSL_MSG("failed to allocate hash stack");
  11765. ret = WOLFSSL_FAILURE;
  11766. } else {
  11767. ph->hash_value = hash;
  11768. ph->last_suffix = suffix;
  11769. ret = wolfSSL_sk_BY_DIR_HASH_push(entry->hashes, ph);
  11770. }
  11771. }
  11772. wc_UnLockMutex(&lookup->dirs->lock);
  11773. }
  11774. }
  11775. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11776. }
  11777. #else
  11778. (void) type;
  11779. (void) ret;
  11780. (void) x509;
  11781. (void) filename;
  11782. (void) suffix;
  11783. (void) num;
  11784. (void) i;
  11785. ret = WOLFSSL_NOT_IMPLEMENTED;
  11786. #endif
  11787. WOLFSSL_LEAVE("LoadCertByIssuer", ret);
  11788. return ret;
  11789. }
  11790. #endif
  11791. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  11792. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  11793. {
  11794. int ret = 0;
  11795. buffer* cert;
  11796. byte* subjectHash = NULL;
  11797. int alreadySigner = 0;
  11798. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11799. int sigRet = 0;
  11800. #endif
  11801. if (ssl == NULL || args == NULL
  11802. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  11803. || args->dCert == NULL
  11804. #endif
  11805. ) {
  11806. return BAD_FUNC_ARG;
  11807. }
  11808. PRAGMA_GCC_DIAG_PUSH
  11809. PRAGMA_GCC("GCC diagnostic ignored \"-Wstrict-overflow\"")
  11810. /* Surrounded in gcc pragma to avoid -Werror=strict-overflow when the
  11811. * compiler optimizes out the check and assumes no underflow. Keeping the
  11812. * check in place to handle multiple build configurations and future
  11813. * changes. */
  11814. /* check to make sure certificate index is valid */
  11815. if (args->certIdx > args->count)
  11816. return BUFFER_E;
  11817. PRAGMA_GCC_DIAG_POP
  11818. /* check if returning from non-blocking OCSP */
  11819. /* skip this section because cert is already initialized and parsed */
  11820. #ifdef WOLFSSL_NONBLOCK_OCSP
  11821. if (args->lastErr == OCSP_WANT_READ) {
  11822. args->lastErr = 0; /* clear error */
  11823. return 0;
  11824. }
  11825. #endif
  11826. #ifdef WOLFSSL_TRUST_PEER_CERT
  11827. /* we have trusted peer */
  11828. if (args->haveTrustPeer) {
  11829. return 0;
  11830. }
  11831. #endif
  11832. /* get certificate buffer */
  11833. cert = &args->certs[args->certIdx];
  11834. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11835. if (verify == VERIFY) {
  11836. /* for small cert verify, release decoded cert during signature check to
  11837. reduce peak memory usage */
  11838. if (args->dCert != NULL) {
  11839. if (args->dCertInit) {
  11840. FreeDecodedCert(args->dCert);
  11841. args->dCertInit = 0;
  11842. }
  11843. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  11844. args->dCert = NULL;
  11845. }
  11846. /* perform cert parsing and signature check */
  11847. sigRet = CheckCertSignature(cert->buffer, cert->length,
  11848. ssl->heap, SSL_CM(ssl));
  11849. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  11850. /* verify name only in ParseCertRelative below, signature check done */
  11851. verify = VERIFY_NAME;
  11852. }
  11853. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  11854. /* make sure the decoded cert structure is allocated and initialized */
  11855. if (!args->dCertInit
  11856. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11857. || args->dCert == NULL
  11858. #endif
  11859. ) {
  11860. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11861. if (args->dCert == NULL) {
  11862. args->dCert = (DecodedCert*)XMALLOC(
  11863. sizeof(DecodedCert), ssl->heap,
  11864. DYNAMIC_TYPE_DCERT);
  11865. if (args->dCert == NULL) {
  11866. return MEMORY_E;
  11867. }
  11868. }
  11869. #endif
  11870. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  11871. args->dCertInit = 1;
  11872. args->dCert->sigCtx.devId = ssl->devId;
  11873. #ifdef WOLFSSL_ASYNC_CRYPT
  11874. args->dCert->sigCtx.asyncCtx = ssl;
  11875. #endif
  11876. #ifdef HAVE_PK_CALLBACKS
  11877. /* setup the PK callback context */
  11878. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  11879. if (ret != 0)
  11880. return ret;
  11881. #endif
  11882. }
  11883. /* Parse Certificate */
  11884. ret = ParseCertRelative(args->dCert, certType, verify, SSL_CM(ssl));
  11885. /* perform below checks for date failure cases */
  11886. if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) {
  11887. /* get subject and determine if already loaded */
  11888. #ifndef NO_SKID
  11889. if (args->dCert->extAuthKeyIdSet)
  11890. subjectHash = args->dCert->extSubjKeyId;
  11891. else
  11892. #endif
  11893. subjectHash = args->dCert->subjectHash;
  11894. alreadySigner = AlreadySigner(SSL_CM(ssl), subjectHash);
  11895. }
  11896. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11897. /* get signature check failures from above */
  11898. if (ret == 0)
  11899. ret = sigRet;
  11900. #endif
  11901. if (pSubjectHash)
  11902. *pSubjectHash = subjectHash;
  11903. if (pAlreadySigner)
  11904. *pAlreadySigner = alreadySigner;
  11905. #ifdef WOLFSSL_ASYNC_CRYPT
  11906. if (ret == WC_PENDING_E) {
  11907. ret = wolfSSL_AsyncPush(ssl,
  11908. args->dCert->sigCtx.asyncDev);
  11909. }
  11910. #endif
  11911. #if defined(WOLFSSL_PUBLIC_ASN) && defined(HAVE_PK_CALLBACKS)
  11912. /* This block gives the callback a chance to process the peer cert.
  11913. * If there is no callback set or it returns NOT_COMPILED_IN, then the
  11914. * original return code is returned. */
  11915. if (ssl->ctx && ssl->ctx->ProcessPeerCertCb) {
  11916. int new_ret = ssl->ctx->ProcessPeerCertCb(ssl, args->dCert);
  11917. if (new_ret != NOT_COMPILED_IN) {
  11918. ret = new_ret;
  11919. }
  11920. }
  11921. #endif /* WOLFSSL_PUBLIC_ASN && HAVE_PK_CALLBACKS */
  11922. return ret;
  11923. }
  11924. /* Check key sizes for certs. Is redundant check since
  11925. ProcessBuffer also performs this check. */
  11926. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  11927. {
  11928. int ret = 0;
  11929. if (ssl->options.verifyNone) {
  11930. return ret;
  11931. }
  11932. switch (args->dCert->keyOID) {
  11933. #ifndef NO_RSA
  11934. #ifdef WC_RSA_PSS
  11935. case RSAPSSk:
  11936. #endif
  11937. case RSAk:
  11938. if (ssl->options.minRsaKeySz < 0 ||
  11939. args->dCert->pubKeySize <
  11940. (word16)ssl->options.minRsaKeySz) {
  11941. WOLFSSL_MSG(
  11942. "RSA key size in cert chain error");
  11943. ret = RSA_KEY_SIZE_E;
  11944. WOLFSSL_ERROR_VERBOSE(ret);
  11945. }
  11946. break;
  11947. #endif /* !NO_RSA */
  11948. #ifdef HAVE_ECC
  11949. case ECDSAk:
  11950. if (ssl->options.minEccKeySz < 0 ||
  11951. args->dCert->pubKeySize <
  11952. (word16)ssl->options.minEccKeySz) {
  11953. WOLFSSL_MSG(
  11954. "ECC key size in cert chain error");
  11955. ret = ECC_KEY_SIZE_E;
  11956. WOLFSSL_ERROR_VERBOSE(ret);
  11957. }
  11958. break;
  11959. #endif /* HAVE_ECC */
  11960. #ifdef HAVE_ED25519
  11961. case ED25519k:
  11962. if (ssl->options.minEccKeySz < 0 ||
  11963. ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  11964. WOLFSSL_MSG(
  11965. "ECC key size in cert chain error");
  11966. ret = ECC_KEY_SIZE_E;
  11967. WOLFSSL_ERROR_VERBOSE(ret);
  11968. }
  11969. break;
  11970. #endif /* HAVE_ED25519 */
  11971. #ifdef HAVE_ED448
  11972. case ED448k:
  11973. if (ssl->options.minEccKeySz < 0 ||
  11974. ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  11975. WOLFSSL_MSG(
  11976. "ECC key size in cert chain error");
  11977. ret = ECC_KEY_SIZE_E;
  11978. WOLFSSL_ERROR_VERBOSE(ret);
  11979. }
  11980. break;
  11981. #endif /* HAVE_ED448 */
  11982. #if defined(HAVE_PQC)
  11983. #if defined(HAVE_FALCON)
  11984. case FALCON_LEVEL1k:
  11985. if (ssl->options.minFalconKeySz < 0 ||
  11986. FALCON_LEVEL1_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  11987. WOLFSSL_MSG("Falcon key size in cert chain error");
  11988. ret = FALCON_KEY_SIZE_E;
  11989. WOLFSSL_ERROR_VERBOSE(ret);
  11990. }
  11991. break;
  11992. case FALCON_LEVEL5k:
  11993. if (ssl->options.minFalconKeySz < 0 ||
  11994. FALCON_LEVEL5_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  11995. WOLFSSL_MSG("Falcon key size in cert chain error");
  11996. ret = FALCON_KEY_SIZE_E;
  11997. WOLFSSL_ERROR_VERBOSE(ret);
  11998. }
  11999. break;
  12000. #endif /* HAVE_FALCON */
  12001. #endif /* HAVE_PQC */
  12002. #if defined(HAVE_DILITHIUM)
  12003. case DILITHIUM_LEVEL2k:
  12004. if (ssl->options.minDilithiumKeySz < 0 ||
  12005. DILITHIUM_LEVEL2_KEY_SIZE
  12006. < (word16)ssl->options.minDilithiumKeySz) {
  12007. WOLFSSL_MSG("Dilithium key size in cert chain error");
  12008. ret = DILITHIUM_KEY_SIZE_E;
  12009. }
  12010. break;
  12011. case DILITHIUM_LEVEL3k:
  12012. if (ssl->options.minDilithiumKeySz < 0 ||
  12013. DILITHIUM_LEVEL3_KEY_SIZE
  12014. < (word16)ssl->options.minDilithiumKeySz) {
  12015. WOLFSSL_MSG( "Dilithium key size in cert chain error");
  12016. ret = DILITHIUM_KEY_SIZE_E;
  12017. }
  12018. break;
  12019. case DILITHIUM_LEVEL5k:
  12020. if (ssl->options.minDilithiumKeySz < 0 ||
  12021. DILITHIUM_LEVEL5_KEY_SIZE
  12022. < (word16)ssl->options.minDilithiumKeySz) {
  12023. WOLFSSL_MSG("Dilithium key size in cert chain error");
  12024. ret = DILITHIUM_KEY_SIZE_E;
  12025. }
  12026. break;
  12027. #endif /* HAVE_DILITHIUM */
  12028. default:
  12029. WOLFSSL_MSG("Key size not checked");
  12030. /* key not being checked for size if not in
  12031. switch */
  12032. break;
  12033. }
  12034. return ret;
  12035. }
  12036. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12037. word32 totalSz)
  12038. {
  12039. int ret = 0;
  12040. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12041. ProcPeerCertArgs* args = NULL;
  12042. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  12043. #elif defined(WOLFSSL_SMALL_STACK)
  12044. ProcPeerCertArgs* args = NULL;
  12045. #else
  12046. ProcPeerCertArgs args[1];
  12047. #endif
  12048. byte* subjectHash = NULL;
  12049. int alreadySigner = 0;
  12050. WOLFSSL_ENTER("ProcessPeerCerts");
  12051. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12052. if (ssl->async == NULL) {
  12053. ssl->async = (struct WOLFSSL_ASYNC*)
  12054. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  12055. DYNAMIC_TYPE_ASYNC);
  12056. if (ssl->async == NULL)
  12057. ERROR_OUT(MEMORY_E, exit_ppc);
  12058. }
  12059. args = (ProcPeerCertArgs*)ssl->async->args;
  12060. #ifdef WOLFSSL_ASYNC_CRYPT
  12061. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  12062. if (ret != WC_NOT_PENDING_E) {
  12063. /* Check for error */
  12064. if (ret < 0)
  12065. goto exit_ppc;
  12066. }
  12067. else
  12068. #endif /* WOLFSSL_ASYNC_CRYPT */
  12069. #ifdef WOLFSSL_NONBLOCK_OCSP
  12070. if (ssl->error == OCSP_WANT_READ) {
  12071. /* Re-entry after non-blocking OCSP */
  12072. #ifdef WOLFSSL_ASYNC_CRYPT
  12073. /* if async operationg not pending, reset error code */
  12074. if (ret == WC_NOT_PENDING_E)
  12075. ret = 0;
  12076. #endif
  12077. }
  12078. else
  12079. #endif /* WOLFSSL_NONBLOCK_OCSP */
  12080. #elif defined(WOLFSSL_SMALL_STACK)
  12081. args = (ProcPeerCertArgs*)XMALLOC(
  12082. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  12083. if (args == NULL) {
  12084. ERROR_OUT(MEMORY_E, exit_ppc);
  12085. }
  12086. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  12087. {
  12088. /* Reset state */
  12089. ret = 0;
  12090. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  12091. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  12092. args->idx = *inOutIdx;
  12093. args->begin = *inOutIdx;
  12094. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12095. ssl->async->freeArgs = FreeProcPeerCertArgs;
  12096. #endif
  12097. }
  12098. switch (ssl->options.asyncState)
  12099. {
  12100. case TLS_ASYNC_BEGIN:
  12101. {
  12102. word32 listSz;
  12103. #ifdef WOLFSSL_CALLBACKS
  12104. if (ssl->hsInfoOn)
  12105. AddPacketName(ssl, "Certificate");
  12106. if (ssl->toInfoOn)
  12107. AddLateName("Certificate", &ssl->timeoutInfo);
  12108. #endif
  12109. #ifdef WOLFSSL_TLS13
  12110. if (ssl->options.tls1_3) {
  12111. byte ctxSz;
  12112. /* Certificate Request Context */
  12113. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  12114. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12115. ctxSz = *(input + args->idx);
  12116. args->idx++;
  12117. if ((args->idx - args->begin) + ctxSz > totalSz)
  12118. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12119. #ifndef NO_WOLFSSL_CLIENT
  12120. /* Must be empty when received from server. */
  12121. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12122. if (ctxSz != 0) {
  12123. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  12124. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  12125. }
  12126. }
  12127. #endif
  12128. #ifndef NO_WOLFSSL_SERVER
  12129. /* Must contain value sent in request. */
  12130. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12131. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  12132. ctxSz != 0) {
  12133. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  12134. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  12135. }
  12136. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  12137. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  12138. CertReqCtx* curr = ssl->certReqCtx;
  12139. CertReqCtx* prev = NULL;
  12140. while (curr != NULL) {
  12141. if ((ctxSz == curr->len) &&
  12142. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  12143. == 0) {
  12144. if (prev != NULL)
  12145. prev->next = curr->next;
  12146. else
  12147. ssl->certReqCtx = curr->next;
  12148. XFREE(curr, ssl->heap,
  12149. DYNAMIC_TYPE_TMP_BUFFER);
  12150. break;
  12151. }
  12152. prev = curr;
  12153. curr = curr->next;
  12154. }
  12155. if (curr == NULL)
  12156. #endif
  12157. {
  12158. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  12159. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  12160. }
  12161. }
  12162. }
  12163. #endif
  12164. args->idx += ctxSz;
  12165. /* allocate buffer for cert extensions */
  12166. args->exts = (buffer*)XMALLOC(sizeof(buffer) *
  12167. MAX_CHAIN_DEPTH, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  12168. if (args->exts == NULL) {
  12169. ERROR_OUT(MEMORY_E, exit_ppc);
  12170. }
  12171. }
  12172. #endif
  12173. /* allocate buffer for certs */
  12174. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  12175. ssl->heap, DYNAMIC_TYPE_DER);
  12176. if (args->certs == NULL) {
  12177. ERROR_OUT(MEMORY_E, exit_ppc);
  12178. }
  12179. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  12180. /* Certificate List */
  12181. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  12182. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12183. }
  12184. c24to32(input + args->idx, &listSz);
  12185. args->idx += OPAQUE24_LEN;
  12186. if (listSz > MAX_CERTIFICATE_SZ) {
  12187. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12188. }
  12189. if ((args->idx - args->begin) + listSz != totalSz) {
  12190. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12191. }
  12192. WOLFSSL_MSG("Loading peer's cert chain");
  12193. /* first put cert chain into buffer so can verify top down
  12194. we're sent bottom up */
  12195. while (listSz) {
  12196. word32 certSz;
  12197. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12198. if (args->totalCerts >= MAX_CHAIN_DEPTH) {
  12199. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12200. ssl->peerVerifyRet =
  12201. WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
  12202. ret = MAX_CHAIN_ERROR;
  12203. WOLFSSL_ERROR_VERBOSE(ret);
  12204. WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
  12205. break; /* break out to avoid reading more certs then buffer
  12206. * can hold */
  12207. }
  12208. #else
  12209. if (args->totalCerts >= ssl->verifyDepth ||
  12210. args->totalCerts >= MAX_CHAIN_DEPTH) {
  12211. WOLFSSL_ERROR_VERBOSE(MAX_CHAIN_ERROR);
  12212. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  12213. }
  12214. #endif
  12215. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  12216. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12217. }
  12218. c24to32(input + args->idx, &certSz);
  12219. args->idx += OPAQUE24_LEN;
  12220. if ((args->idx - args->begin) + certSz > totalSz) {
  12221. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12222. }
  12223. args->certs[args->totalCerts].length = certSz;
  12224. args->certs[args->totalCerts].buffer = input + args->idx;
  12225. #ifdef SESSION_CERTS
  12226. AddSessionCertToChain(&ssl->session->chain,
  12227. input + args->idx, certSz);
  12228. #endif /* SESSION_CERTS */
  12229. args->idx += certSz;
  12230. listSz -= certSz + CERT_HEADER_SZ;
  12231. #ifdef WOLFSSL_TLS13
  12232. /* Extensions */
  12233. if (ssl->options.tls1_3) {
  12234. word16 extSz;
  12235. if (args->exts == NULL) {
  12236. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12237. }
  12238. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  12239. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12240. }
  12241. ato16(input + args->idx, &extSz);
  12242. args->idx += OPAQUE16_LEN;
  12243. if ((args->idx - args->begin) + extSz > totalSz) {
  12244. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12245. }
  12246. /* Store extension data info for later processing. */
  12247. args->exts[args->totalCerts].length = extSz;
  12248. args->exts[args->totalCerts].buffer = input + args->idx;
  12249. args->idx += extSz;
  12250. listSz -= extSz + OPAQUE16_LEN;
  12251. WOLFSSL_MSG_EX("\tParsing %d bytes of cert extensions",
  12252. args->exts[args->totalCerts].length);
  12253. #if !defined(NO_TLS)
  12254. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  12255. (word16)args->exts[args->totalCerts].length,
  12256. certificate, NULL);
  12257. #endif /* !NO_TLS */
  12258. if (ret < 0) {
  12259. WOLFSSL_ERROR_VERBOSE(ret);
  12260. ERROR_OUT(ret, exit_ppc);
  12261. }
  12262. }
  12263. #endif
  12264. args->totalCerts++;
  12265. WOLFSSL_MSG("\tPut another cert into chain");
  12266. } /* while (listSz) */
  12267. args->count = args->totalCerts;
  12268. args->certIdx = 0; /* select peer cert (first one) */
  12269. if (args->count == 0) {
  12270. /* Empty certificate message. */
  12271. if ((ssl->options.side == WOLFSSL_SERVER_END) &&
  12272. (ssl->options.mutualAuth || (ssl->options.failNoCert &&
  12273. IsAtLeastTLSv1_3(ssl->version)))) {
  12274. WOLFSSL_MSG("No peer cert from Client");
  12275. ret = NO_PEER_CERT;
  12276. WOLFSSL_ERROR_VERBOSE(ret);
  12277. DoCertFatalAlert(ssl, ret);
  12278. }
  12279. else if ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  12280. IsAtLeastTLSv1_3(ssl->version)) {
  12281. WOLFSSL_MSG("No peer cert from Server");
  12282. ret = NO_PEER_CERT;
  12283. WOLFSSL_ERROR_VERBOSE(ret);
  12284. SendAlert(ssl, alert_fatal, decode_error);
  12285. }
  12286. }
  12287. args->dCertInit = 0;
  12288. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  12289. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  12290. DYNAMIC_TYPE_DCERT);
  12291. if (args->dCert == NULL) {
  12292. ERROR_OUT(MEMORY_E, exit_ppc);
  12293. }
  12294. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  12295. #endif
  12296. /* Advance state and proceed */
  12297. ssl->options.asyncState = TLS_ASYNC_BUILD;
  12298. } /* case TLS_ASYNC_BEGIN */
  12299. FALL_THROUGH;
  12300. case TLS_ASYNC_BUILD:
  12301. {
  12302. if (args->count > 0) {
  12303. /* check for trusted peer and get untrustedDepth */
  12304. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  12305. if (args->certIdx == 0) {
  12306. #ifdef WOLFSSL_TRUST_PEER_CERT
  12307. TrustedPeerCert* tp;
  12308. #endif
  12309. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  12310. &subjectHash, &alreadySigner);
  12311. if (ret != 0)
  12312. goto exit_ppc;
  12313. #ifdef OPENSSL_EXTRA
  12314. /* Determine untrusted depth */
  12315. if (!alreadySigner && (!args->dCert ||
  12316. !args->dCertInit || !args->dCert->selfSigned)) {
  12317. args->untrustedDepth = 1;
  12318. }
  12319. #endif
  12320. #ifdef WOLFSSL_TRUST_PEER_CERT
  12321. tp = GetTrustedPeer(SSL_CM(ssl), args->dCert);
  12322. WOLFSSL_MSG("Checking for trusted peer cert");
  12323. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  12324. WOLFSSL_MSG("Found matching trusted peer cert");
  12325. args->haveTrustPeer = 1;
  12326. }
  12327. else if (tp == NULL) {
  12328. /* no trusted peer cert */
  12329. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  12330. }
  12331. else {
  12332. WOLFSSL_MSG("Trusted peer cert did not match!");
  12333. }
  12334. if (!args->haveTrustPeer)
  12335. #endif
  12336. {
  12337. /* free cert if not trusted peer */
  12338. FreeDecodedCert(args->dCert);
  12339. args->dCertInit = 0;
  12340. }
  12341. }
  12342. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  12343. /* check certificate up to peer's first */
  12344. /* do not verify chain if trusted peer cert found */
  12345. while (args->count > 1
  12346. #ifdef WOLFSSL_TRUST_PEER_CERT
  12347. && !args->haveTrustPeer
  12348. #endif /* WOLFSSL_TRUST_PEER_CERT */
  12349. ) {
  12350. int skipAddCA = 0;
  12351. /* select last certificate */
  12352. args->certIdx = args->count - 1;
  12353. ret = ProcessPeerCertParse(ssl, args, CHAIN_CERT_TYPE,
  12354. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  12355. &subjectHash, &alreadySigner);
  12356. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  12357. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  12358. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  12359. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  12360. WOLFSSL_MSG("try to load certificate if hash dir is set");
  12361. ret = LoadCertByIssuer(SSL_STORE(ssl),
  12362. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  12363. X509_LU_X509);
  12364. if (ret == WOLFSSL_SUCCESS) {
  12365. FreeDecodedCert(args->dCert);
  12366. args->dCertInit = 0;
  12367. /* once again */
  12368. ret = ProcessPeerCertParse(ssl, args, CHAIN_CERT_TYPE,
  12369. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  12370. &subjectHash, &alreadySigner);
  12371. }
  12372. else {
  12373. ret = ASN_NO_SIGNER_E;
  12374. WOLFSSL_ERROR_VERBOSE(ret);
  12375. }
  12376. }
  12377. #endif
  12378. #ifdef WOLFSSL_ASYNC_CRYPT
  12379. if (ret == WC_PENDING_E)
  12380. goto exit_ppc;
  12381. #endif
  12382. if (ret == 0) {
  12383. ret = ProcessPeerCertCheckKey(ssl, args);
  12384. }
  12385. else if (ret == ASN_PARSE_E || ret == BUFFER_E ||
  12386. ret == MEMORY_E) {
  12387. WOLFSSL_MSG(
  12388. "Got Peer cert ASN PARSE_E, BUFFER E, MEMORY_E");
  12389. ERROR_OUT(ret, exit_ppc);
  12390. }
  12391. if (ret == 0 && args->dCert->isCA == 0) {
  12392. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  12393. }
  12394. else if (ret == 0 && ssl->options.verifyNone) {
  12395. WOLFSSL_MSG("Chain cert not verified by option, "
  12396. "not adding as CA");
  12397. }
  12398. else if (ret == 0) {
  12399. #ifdef OPENSSL_EXTRA
  12400. if (args->certIdx > args->untrustedDepth) {
  12401. args->untrustedDepth = (char)args->certIdx + 1;
  12402. }
  12403. #endif
  12404. if (alreadySigner) {
  12405. WOLFSSL_MSG("Verified CA from chain and already had it");
  12406. }
  12407. }
  12408. else {
  12409. WOLFSSL_MSG("Failed to verify CA from chain");
  12410. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12411. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12412. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_INVALID_CA;
  12413. #endif
  12414. }
  12415. if (ret == 0) {
  12416. #ifdef HAVE_OCSP
  12417. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  12418. if (ssl->status_request_v2) {
  12419. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  12420. args->dCert, 0, ssl->heap);
  12421. }
  12422. else /* skips OCSP and force CRL check */
  12423. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  12424. if (SSL_CM(ssl)->ocspEnabled &&
  12425. SSL_CM(ssl)->ocspCheckAll) {
  12426. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  12427. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  12428. args->dCert, ssl);
  12429. #ifdef WOLFSSL_NONBLOCK_OCSP
  12430. if (ret == OCSP_WANT_READ) {
  12431. args->lastErr = ret;
  12432. goto exit_ppc;
  12433. }
  12434. #endif
  12435. if (ret != 0) {
  12436. WOLFSSL_ERROR_VERBOSE(ret);
  12437. WOLFSSL_MSG("\tOCSP Lookup not ok");
  12438. }
  12439. }
  12440. #endif /* HAVE_OCSP */
  12441. #ifdef HAVE_CRL
  12442. if (SSL_CM(ssl)->crlEnabled &&
  12443. SSL_CM(ssl)->crlCheckAll) {
  12444. int doCrlLookup = 1;
  12445. #ifdef HAVE_OCSP
  12446. if (SSL_CM(ssl)->ocspEnabled &&
  12447. SSL_CM(ssl)->ocspCheckAll) {
  12448. /* If the cert status is unknown to the OCSP
  12449. responder, do a CRL lookup. If any other
  12450. error, skip the CRL lookup and fail the
  12451. certificate. */
  12452. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  12453. }
  12454. #endif /* HAVE_OCSP */
  12455. if (doCrlLookup) {
  12456. WOLFSSL_MSG("Doing Non Leaf CRL check");
  12457. ret = CheckCertCRL(SSL_CM(ssl)->crl,
  12458. args->dCert);
  12459. #ifdef WOLFSSL_NONBLOCK_OCSP
  12460. /* The CRL lookup I/O callback is using the
  12461. * same WOULD_BLOCK error code as OCSP's I/O
  12462. * callback, and it is enabling it using the
  12463. * same flag. */
  12464. if (ret == OCSP_WANT_READ) {
  12465. args->lastErr = ret;
  12466. goto exit_ppc;
  12467. }
  12468. #endif
  12469. if (ret != 0) {
  12470. WOLFSSL_ERROR_VERBOSE(ret);
  12471. WOLFSSL_MSG("\tCRL check not ok");
  12472. }
  12473. }
  12474. }
  12475. #endif /* HAVE_CRL */
  12476. }
  12477. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12478. if (ret == 0 &&
  12479. /* extend the limit "+1" until reaching
  12480. * an ultimately trusted issuer.*/
  12481. args->count > (ssl->verifyDepth + 1)) {
  12482. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12483. ssl->peerVerifyRet =
  12484. WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
  12485. ret = MAX_CHAIN_ERROR;
  12486. WOLFSSL_ERROR_VERBOSE(ret);
  12487. }
  12488. #endif
  12489. #ifdef WOLFSSL_ALT_CERT_CHAINS
  12490. /* For alternate cert chain, its okay for a CA cert to fail
  12491. with ASN_NO_SIGNER_E here. The "alternate" certificate
  12492. chain mode only requires that the peer certificate
  12493. validate to a trusted CA */
  12494. if (ret != 0 && args->dCert->isCA) {
  12495. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  12496. if (!ssl->options.usingAltCertChain) {
  12497. WOLFSSL_MSG("Trying alternate cert chain");
  12498. ssl->options.usingAltCertChain = 1;
  12499. }
  12500. ret = 0; /* clear errors and continue */
  12501. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12502. ssl->peerVerifyRet = 0;
  12503. #endif
  12504. args->verifyErr = 0;
  12505. /* do not add to certificate manager */
  12506. skipAddCA = 1;
  12507. }
  12508. }
  12509. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  12510. /* Do verify callback */
  12511. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  12512. if (ssl->options.verifyNone &&
  12513. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  12514. ret == CRL_CERT_DATE_ERR)) {
  12515. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  12516. ret = ssl->error = 0;
  12517. }
  12518. #ifdef WOLFSSL_ALT_CERT_CHAINS
  12519. if (ret != 0 && args->dCert->isCA) {
  12520. /* do not add to certificate manager */
  12521. skipAddCA = 1;
  12522. }
  12523. #endif
  12524. /* If valid CA then add to Certificate Manager */
  12525. if (ret == 0 && args->dCert->isCA &&
  12526. !ssl->options.verifyNone && !skipAddCA) {
  12527. buffer* cert = &args->certs[args->certIdx];
  12528. /* Is valid CA */
  12529. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  12530. /* if using alternate chain, store the cert used */
  12531. if (ssl->options.usingAltCertChain) {
  12532. AddSessionCertToChain(&ssl->session->altChain,
  12533. cert->buffer, cert->length);
  12534. }
  12535. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  12536. if (!alreadySigner) {
  12537. DerBuffer* add = NULL;
  12538. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  12539. if (ret < 0)
  12540. goto exit_ppc;
  12541. XMEMCPY(add->buffer, cert->buffer, cert->length);
  12542. /* CA already verified above in ParseCertRelative */
  12543. WOLFSSL_MSG("Adding CA from chain");
  12544. SSL_CM_WARNING(ssl);
  12545. ret = AddCA(SSL_CM(ssl), &add, WOLFSSL_CHAIN_CA,
  12546. NO_VERIFY);
  12547. if (ret == WOLFSSL_SUCCESS) {
  12548. ret = 0;
  12549. }
  12550. }
  12551. }
  12552. /* Handle error codes */
  12553. ssl->error = ret; /* Report SSL error or clear error if
  12554. * callback overrides. */
  12555. if (ret != 0) {
  12556. if (!ssl->options.verifyNone) {
  12557. WOLFSSL_ERROR_VERBOSE(ret);
  12558. DoCertFatalAlert(ssl, ret);
  12559. args->lastErr = ret;
  12560. break; /* We sent a fatal alert.
  12561. * No point continuing. */
  12562. }
  12563. if (args->lastErr == 0) {
  12564. args->lastErr = ret; /* save error from last time */
  12565. ret = 0; /* reset error */
  12566. }
  12567. }
  12568. FreeDecodedCert(args->dCert);
  12569. args->dCertInit = 0;
  12570. args->count--;
  12571. } /* while (count > 0 && !args->haveTrustPeer) */
  12572. } /* if (count > 0) */
  12573. /* Check for error */
  12574. if (ret != 0) {
  12575. goto exit_ppc;
  12576. }
  12577. /* Advance state and proceed */
  12578. ssl->options.asyncState = TLS_ASYNC_DO;
  12579. } /* case TLS_ASYNC_BUILD */
  12580. FALL_THROUGH;
  12581. case TLS_ASYNC_DO:
  12582. {
  12583. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  12584. if (args->count > 0) {
  12585. WOLFSSL_MSG("Verifying Peer's cert");
  12586. /* select peer cert (first one) */
  12587. args->certIdx = 0;
  12588. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  12589. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  12590. &subjectHash, &alreadySigner);
  12591. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  12592. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  12593. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  12594. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  12595. int lastErr = ret; /* save error from last time */
  12596. WOLFSSL_MSG("try to load certificate if hash dir is set");
  12597. ret = LoadCertByIssuer(SSL_STORE(ssl),
  12598. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  12599. X509_LU_X509);
  12600. if (ret == WOLFSSL_SUCCESS) {
  12601. FreeDecodedCert(args->dCert);
  12602. args->dCertInit = 0;
  12603. /* once again */
  12604. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  12605. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  12606. &subjectHash, &alreadySigner);
  12607. }
  12608. else {
  12609. ret = lastErr; /* restore error */
  12610. WOLFSSL_ERROR_VERBOSE(ret);
  12611. }
  12612. }
  12613. #endif
  12614. #ifdef WOLFSSL_ASYNC_CRYPT
  12615. if (ret == WC_PENDING_E)
  12616. goto exit_ppc;
  12617. #endif
  12618. if (ret == 0) {
  12619. WOLFSSL_MSG("Verified Peer's cert");
  12620. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12621. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12622. ssl->peerVerifyRet = WOLFSSL_X509_V_OK;
  12623. #endif
  12624. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  12625. /* if using alternate chain, store the cert used */
  12626. if (ssl->options.usingAltCertChain) {
  12627. buffer* cert = &args->certs[args->certIdx];
  12628. AddSessionCertToChain(&ssl->session->altChain,
  12629. cert->buffer, cert->length);
  12630. }
  12631. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  12632. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  12633. /* Check peer's certificate version number. TLS 1.2 / 1.3
  12634. * requires the clients certificate be version 3 unless a
  12635. * different version has been negotiated using RFC 7250.
  12636. * OpenSSL doesn't appear to be performing this check.
  12637. * For TLS 1.3 see RFC8446 Section 4.4.2.3 */
  12638. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12639. if (args->dCert->version != WOLFSSL_X509_V3) {
  12640. WOLFSSL_MSG("Peers certificate was not version 3!");
  12641. args->lastErr = ASN_VERSION_E;
  12642. /* setting last error but not considering it fatal
  12643. * giving the user a chance to override */
  12644. }
  12645. }
  12646. #endif
  12647. /* check if fatal error */
  12648. if (args->verifyErr) {
  12649. args->fatal = 1;
  12650. ret = args->lastErr;
  12651. }
  12652. else {
  12653. args->fatal = 0;
  12654. }
  12655. }
  12656. else if (ret == ASN_PARSE_E || ret == BUFFER_E ||
  12657. ret == MEMORY_E) {
  12658. WOLFSSL_MSG("Got Peer cert ASN PARSE_E, BUFFER E, MEMORY_E");
  12659. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
  12660. defined(OPENSSL_EXTRA_X509_SMALL)
  12661. DoCertFatalAlert(ssl, ret);
  12662. #endif
  12663. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12664. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12665. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_REJECTED;
  12666. #endif
  12667. args->fatal = 1;
  12668. }
  12669. else {
  12670. WOLFSSL_MSG("Failed to verify Peer's cert");
  12671. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12672. if (ssl->peerVerifyRet == 0) { /* Return first cert error here */
  12673. if (ret == ASN_BEFORE_DATE_E) {
  12674. ssl->peerVerifyRet =
  12675. (unsigned long)WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID;
  12676. }
  12677. else if (ret == ASN_AFTER_DATE_E) {
  12678. ssl->peerVerifyRet =
  12679. (unsigned long)WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED;
  12680. }
  12681. else {
  12682. ssl->peerVerifyRet =
  12683. (unsigned long)
  12684. WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  12685. }
  12686. }
  12687. #endif
  12688. if (ssl->verifyCallback) {
  12689. WOLFSSL_MSG(
  12690. "\tCallback override available, will continue");
  12691. /* check if fatal error */
  12692. args->fatal = (args->verifyErr) ? 1 : 0;
  12693. if (args->fatal)
  12694. DoCertFatalAlert(ssl, ret);
  12695. }
  12696. else {
  12697. WOLFSSL_MSG("\tNo callback override available, fatal");
  12698. args->fatal = 1;
  12699. DoCertFatalAlert(ssl, ret);
  12700. }
  12701. }
  12702. #ifdef HAVE_SECURE_RENEGOTIATION
  12703. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  12704. && ssl->secure_renegotiation
  12705. && ssl->secure_renegotiation->enabled) {
  12706. if (IsEncryptionOn(ssl, 0)) {
  12707. /* compare against previous time */
  12708. if (ssl->secure_renegotiation->subject_hash_set) {
  12709. if (XMEMCMP(args->dCert->subjectHash,
  12710. ssl->secure_renegotiation->subject_hash,
  12711. KEYID_SIZE) != 0) {
  12712. WOLFSSL_MSG(
  12713. "Peer sent different cert during scr, fatal");
  12714. args->fatal = 1;
  12715. ret = SCR_DIFFERENT_CERT_E;
  12716. WOLFSSL_ERROR_VERBOSE(ret);
  12717. }
  12718. }
  12719. }
  12720. /* cache peer's hash */
  12721. if (args->fatal == 0) {
  12722. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  12723. args->dCert->subjectHash, KEYID_SIZE);
  12724. ssl->secure_renegotiation->subject_hash_set = 1;
  12725. }
  12726. }
  12727. #endif /* HAVE_SECURE_RENEGOTIATION */
  12728. } /* if (count > 0) */
  12729. /* Check for error */
  12730. if (args->fatal && ret != 0) {
  12731. goto exit_ppc;
  12732. }
  12733. /* Advance state and proceed */
  12734. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  12735. } /* case TLS_ASYNC_DO */
  12736. FALL_THROUGH;
  12737. case TLS_ASYNC_VERIFY:
  12738. {
  12739. if (args->count > 0) {
  12740. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  12741. /* only attempt to check OCSP or CRL if not previous error such
  12742. * as ASN_BEFORE_DATE_E or ASN_AFTER_DATE_E */
  12743. if (args->fatal == 0 && ret == 0) {
  12744. int doLookup = 1;
  12745. WOLFSSL_MSG("Checking if ocsp needed");
  12746. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12747. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  12748. if (ssl->status_request) {
  12749. args->fatal = (TLSX_CSR_InitRequest(ssl->extensions,
  12750. args->dCert, ssl->heap) != 0);
  12751. doLookup = 0;
  12752. WOLFSSL_MSG("\tHave status request");
  12753. #if defined(WOLFSSL_TLS13)
  12754. if (ssl->options.tls1_3) {
  12755. TLSX* ext = TLSX_Find(ssl->extensions,
  12756. TLSX_STATUS_REQUEST);
  12757. if (ext != NULL) {
  12758. word32 idx = 0;
  12759. CertificateStatusRequest* csr =
  12760. (CertificateStatusRequest*)ext->data;
  12761. ret = ProcessCSR(ssl, csr->response.buffer,
  12762. &idx, csr->response.length);
  12763. if (ret < 0) {
  12764. WOLFSSL_ERROR_VERBOSE(ret);
  12765. goto exit_ppc;
  12766. }
  12767. }
  12768. }
  12769. #endif
  12770. }
  12771. /* Ensure a stapling response was seen */
  12772. else if (ssl->options.tls1_3 &&
  12773. SSL_CM(ssl)->ocspMustStaple) {
  12774. ret = OCSP_CERT_UNKNOWN;
  12775. goto exit_ppc;
  12776. }
  12777. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  12778. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  12779. if (ssl->status_request_v2) {
  12780. args->fatal = (TLSX_CSR2_InitRequests(ssl->extensions,
  12781. args->dCert, 1, ssl->heap) != 0);
  12782. doLookup = 0;
  12783. WOLFSSL_MSG("\tHave status request v2");
  12784. }
  12785. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  12786. }
  12787. #ifdef HAVE_OCSP
  12788. if (doLookup && SSL_CM(ssl)->ocspEnabled) {
  12789. WOLFSSL_MSG("Doing Leaf OCSP check");
  12790. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  12791. args->dCert, ssl);
  12792. #ifdef WOLFSSL_NONBLOCK_OCSP
  12793. if (ret == OCSP_WANT_READ) {
  12794. goto exit_ppc;
  12795. }
  12796. #endif
  12797. doLookup = (ret == OCSP_CERT_UNKNOWN);
  12798. if (ret != 0) {
  12799. WOLFSSL_MSG("\tOCSP Lookup not ok");
  12800. args->fatal = 0;
  12801. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12802. if (ssl->peerVerifyRet == 0) {
  12803. /* Return first cert error here */
  12804. ssl->peerVerifyRet =
  12805. ret == OCSP_CERT_REVOKED
  12806. ? WOLFSSL_X509_V_ERR_CERT_REVOKED
  12807. : WOLFSSL_X509_V_ERR_CERT_REJECTED;
  12808. }
  12809. #endif
  12810. }
  12811. }
  12812. #endif /* HAVE_OCSP */
  12813. #ifdef HAVE_CRL
  12814. if (ret == 0 && doLookup && SSL_CM(ssl)->crlEnabled) {
  12815. WOLFSSL_MSG("Doing Leaf CRL check");
  12816. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  12817. #ifdef WOLFSSL_NONBLOCK_OCSP
  12818. /* The CRL lookup I/O callback is using the
  12819. * same WOULD_BLOCK error code as OCSP's I/O
  12820. * callback, and it is enabling it using the
  12821. * same flag. */
  12822. if (ret == OCSP_WANT_READ) {
  12823. goto exit_ppc;
  12824. }
  12825. #endif
  12826. if (ret != 0) {
  12827. WOLFSSL_MSG("\tCRL check not ok");
  12828. args->fatal = 0;
  12829. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12830. if (ssl->peerVerifyRet == 0) {
  12831. /* Return first cert error here */
  12832. ssl->peerVerifyRet =
  12833. ret == CRL_CERT_REVOKED
  12834. ? WOLFSSL_X509_V_ERR_CERT_REVOKED
  12835. : WOLFSSL_X509_V_ERR_CERT_REJECTED;;
  12836. }
  12837. #endif
  12838. }
  12839. }
  12840. #endif /* HAVE_CRL */
  12841. (void)doLookup;
  12842. }
  12843. #endif /* HAVE_OCSP || HAVE_CRL */
  12844. #ifdef KEEP_PEER_CERT
  12845. if (args->fatal == 0) {
  12846. int copyRet = 0;
  12847. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  12848. if (ssl->options.handShakeDone) {
  12849. FreeX509(&ssl->peerCert);
  12850. InitX509(&ssl->peerCert, 0, ssl->heap);
  12851. }
  12852. else
  12853. #endif
  12854. #ifdef HAVE_SECURE_RENEGOTIATION
  12855. if (ssl->secure_renegotiation &&
  12856. ssl->secure_renegotiation->enabled) {
  12857. /* free old peer cert */
  12858. FreeX509(&ssl->peerCert);
  12859. InitX509(&ssl->peerCert, 0, ssl->heap);
  12860. }
  12861. else
  12862. #endif
  12863. {
  12864. }
  12865. /* set X509 format for peer cert */
  12866. copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
  12867. if (copyRet == MEMORY_E) {
  12868. args->fatal = 1;
  12869. }
  12870. }
  12871. #endif /* KEEP_PEER_CERT */
  12872. #ifndef IGNORE_KEY_EXTENSIONS
  12873. #if defined(OPENSSL_EXTRA)
  12874. /* when compatibility layer is turned on and no verify is
  12875. * set then ignore the certificate key extension */
  12876. if (args->dCert->extKeyUsageSet &&
  12877. args->dCert->extKeyUsageCrit == 0 &&
  12878. ssl->options.verifyNone) {
  12879. WOLFSSL_MSG("Not verifying certificate key usage");
  12880. }
  12881. else
  12882. #endif
  12883. if (args->dCert->extKeyUsageSet) {
  12884. if ((ssl->specs.kea == rsa_kea) &&
  12885. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  12886. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  12887. ret = KEYUSE_ENCIPHER_E;
  12888. WOLFSSL_ERROR_VERBOSE(ret);
  12889. }
  12890. if ((ssl->specs.kea != rsa_kea) &&
  12891. (ssl->specs.sig_algo == rsa_sa_algo ||
  12892. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  12893. !ssl->specs.static_ecdh)) &&
  12894. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  12895. WOLFSSL_MSG("KeyUse Digital Sig not set");
  12896. ret = KEYUSE_SIGNATURE_E;
  12897. WOLFSSL_ERROR_VERBOSE(ret);
  12898. }
  12899. }
  12900. #if defined(OPENSSL_EXTRA)
  12901. /* when compatibility layer is turned on and no verify is
  12902. * set then ignore the certificate key extension */
  12903. if (args->dCert->extExtKeyUsageSet &&
  12904. args->dCert->extExtKeyUsageCrit == 0 &&
  12905. ssl->options.verifyNone) {
  12906. WOLFSSL_MSG("Not verifying certificate ext key usage");
  12907. }
  12908. else
  12909. #endif
  12910. if (args->dCert->extExtKeyUsageSet) {
  12911. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12912. if ((args->dCert->extExtKeyUsage &
  12913. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  12914. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  12915. ret = EXTKEYUSE_AUTH_E;
  12916. WOLFSSL_ERROR_VERBOSE(ret);
  12917. }
  12918. }
  12919. else {
  12920. if ((args->dCert->extExtKeyUsage &
  12921. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  12922. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  12923. ret = EXTKEYUSE_AUTH_E;
  12924. WOLFSSL_ERROR_VERBOSE(ret);
  12925. }
  12926. }
  12927. }
  12928. #endif /* IGNORE_KEY_EXTENSIONS */
  12929. if (args->fatal) {
  12930. ssl->error = ret;
  12931. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12932. SendAlert(ssl, alert_fatal, bad_certificate);
  12933. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12934. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_REJECTED;
  12935. #endif
  12936. goto exit_ppc;
  12937. }
  12938. /* Certificate validated and stored. */
  12939. ssl->options.havePeerCert = 1;
  12940. #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_RSA)
  12941. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  12942. ssl->specs.sig_algo == rsa_kea) {
  12943. /* CLIENT: No ServerKeyExchange message sent by server. */
  12944. ssl->options.peerAuthGood = 1;
  12945. }
  12946. #endif
  12947. #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_ECC)
  12948. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  12949. ssl->specs.static_ecdh) {
  12950. /* CLIENT: No ServerKeyExchange message sent by server. */
  12951. ssl->options.peerAuthGood = 1;
  12952. }
  12953. #endif
  12954. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  12955. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  12956. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  12957. * are to be bound into a certificate, the subject
  12958. * alternative name extension MUST be used." */
  12959. if (args->dCert->altNames) {
  12960. if (CheckForAltNames(args->dCert,
  12961. (char*)ssl->buffers.domainName.buffer,
  12962. NULL) != 1) {
  12963. WOLFSSL_MSG("DomainName match on alt names failed");
  12964. /* try to get peer key still */
  12965. ret = DOMAIN_NAME_MISMATCH;
  12966. WOLFSSL_ERROR_VERBOSE(ret);
  12967. }
  12968. }
  12969. else {
  12970. if (MatchDomainName(
  12971. args->dCert->subjectCN,
  12972. args->dCert->subjectCNLen,
  12973. (char*)ssl->buffers.domainName.buffer) == 0) {
  12974. WOLFSSL_MSG("DomainName match on common name failed");
  12975. ret = DOMAIN_NAME_MISMATCH;
  12976. WOLFSSL_ERROR_VERBOSE(ret);
  12977. }
  12978. }
  12979. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  12980. /* Old behavior. */
  12981. if (MatchDomainName(args->dCert->subjectCN,
  12982. args->dCert->subjectCNLen,
  12983. (char*)ssl->buffers.domainName.buffer) == 0) {
  12984. WOLFSSL_MSG("DomainName match on common name failed");
  12985. if (CheckForAltNames(args->dCert,
  12986. (char*)ssl->buffers.domainName.buffer,
  12987. NULL) != 1) {
  12988. WOLFSSL_MSG(
  12989. "DomainName match on alt names failed too");
  12990. /* try to get peer key still */
  12991. ret = DOMAIN_NAME_MISMATCH;
  12992. WOLFSSL_ERROR_VERBOSE(ret);
  12993. }
  12994. }
  12995. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  12996. }
  12997. /* decode peer key */
  12998. switch (args->dCert->keyOID) {
  12999. #ifndef NO_RSA
  13000. #ifdef WC_RSA_PSS
  13001. case RSAPSSk:
  13002. #endif
  13003. case RSAk:
  13004. {
  13005. word32 keyIdx = 0;
  13006. int keyRet = 0;
  13007. if (ssl->peerRsaKey == NULL) {
  13008. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  13009. (void**)&ssl->peerRsaKey);
  13010. } else if (ssl->peerRsaKeyPresent) {
  13011. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  13012. ssl->peerRsaKey);
  13013. ssl->peerRsaKeyPresent = 0;
  13014. }
  13015. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  13016. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  13017. args->dCert->pubKeySize) != 0) {
  13018. ret = PEER_KEY_ERROR;
  13019. WOLFSSL_ERROR_VERBOSE(ret);
  13020. }
  13021. else {
  13022. ssl->peerRsaKeyPresent = 1;
  13023. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || \
  13024. defined(WOLFSSL_RENESAS_FSPSM_TLS)
  13025. /* copy encrypted tsip key index into ssl object */
  13026. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  13027. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  13028. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  13029. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  13030. ssl->heap, DYNAMIC_TYPE_RSA);
  13031. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  13032. args->lastErr = MEMORY_E;
  13033. goto exit_ppc;
  13034. }
  13035. }
  13036. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  13037. args->dCert->sce_tsip_encRsaKeyIdx,
  13038. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  13039. }
  13040. #endif
  13041. #ifdef HAVE_PK_CALLBACKS
  13042. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  13043. defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  13044. if (ssl->buffers.peerRsaKey.buffer) {
  13045. XFREE(ssl->buffers.peerRsaKey.buffer,
  13046. ssl->heap, DYNAMIC_TYPE_RSA);
  13047. ssl->buffers.peerRsaKey.buffer = NULL;
  13048. }
  13049. #endif
  13050. ssl->buffers.peerRsaKey.buffer =
  13051. (byte*)XMALLOC(args->dCert->pubKeySize,
  13052. ssl->heap, DYNAMIC_TYPE_RSA);
  13053. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  13054. ret = MEMORY_ERROR;
  13055. }
  13056. else {
  13057. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  13058. args->dCert->publicKey,
  13059. args->dCert->pubKeySize);
  13060. ssl->buffers.peerRsaKey.length =
  13061. args->dCert->pubKeySize;
  13062. }
  13063. #endif /* HAVE_PK_CALLBACKS */
  13064. }
  13065. /* check size of peer RSA key */
  13066. if (ret == 0 && ssl->peerRsaKeyPresent &&
  13067. !ssl->options.verifyNone &&
  13068. wc_RsaEncryptSize(ssl->peerRsaKey)
  13069. < ssl->options.minRsaKeySz) {
  13070. ret = RSA_KEY_SIZE_E;
  13071. WOLFSSL_ERROR_VERBOSE(ret);
  13072. WOLFSSL_MSG("Peer RSA key is too small");
  13073. }
  13074. break;
  13075. }
  13076. #endif /* NO_RSA */
  13077. #ifdef HAVE_ECC
  13078. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  13079. case SM2k:
  13080. #endif
  13081. case ECDSAk:
  13082. {
  13083. int keyRet = 0;
  13084. word32 idx = 0;
  13085. #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || \
  13086. defined(WOLFSSL_RENESAS_TSIP_TLS)
  13087. /* copy encrypted tsip/sce key index into ssl object */
  13088. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  13089. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  13090. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  13091. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  13092. ssl->heap, DYNAMIC_TYPE_RSA);
  13093. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  13094. args->lastErr = MEMORY_E;
  13095. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  13096. }
  13097. }
  13098. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  13099. args->dCert->sce_tsip_encRsaKeyIdx,
  13100. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  13101. }
  13102. #endif
  13103. if (ssl->peerEccDsaKey == NULL) {
  13104. /* alloc/init on demand */
  13105. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  13106. (void**)&ssl->peerEccDsaKey);
  13107. } else if (ssl->peerEccDsaKeyPresent) {
  13108. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  13109. ssl->peerEccDsaKey);
  13110. ssl->peerEccDsaKeyPresent = 0;
  13111. }
  13112. if (keyRet != 0 ||
  13113. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  13114. ssl->peerEccDsaKey,
  13115. args->dCert->pubKeySize) != 0) {
  13116. ret = PEER_KEY_ERROR;
  13117. WOLFSSL_ERROR_VERBOSE(ret);
  13118. }
  13119. else {
  13120. ssl->peerEccDsaKeyPresent = 1;
  13121. #ifdef HAVE_PK_CALLBACKS
  13122. if (ssl->buffers.peerEccDsaKey.buffer)
  13123. XFREE(ssl->buffers.peerEccDsaKey.buffer,
  13124. ssl->heap, DYNAMIC_TYPE_ECC);
  13125. ssl->buffers.peerEccDsaKey.buffer =
  13126. (byte*)XMALLOC(args->dCert->pubKeySize,
  13127. ssl->heap, DYNAMIC_TYPE_ECC);
  13128. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  13129. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  13130. }
  13131. else {
  13132. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  13133. args->dCert->publicKey,
  13134. args->dCert->pubKeySize);
  13135. ssl->buffers.peerEccDsaKey.length =
  13136. args->dCert->pubKeySize;
  13137. }
  13138. #endif /* HAVE_PK_CALLBACKS */
  13139. }
  13140. /* check size of peer ECC key */
  13141. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  13142. !ssl->options.verifyNone &&
  13143. wc_ecc_size(ssl->peerEccDsaKey)
  13144. < ssl->options.minEccKeySz) {
  13145. ret = ECC_KEY_SIZE_E;
  13146. WOLFSSL_ERROR_VERBOSE(ret);
  13147. WOLFSSL_MSG("Peer ECC key is too small");
  13148. }
  13149. /* populate curve oid - if missing */
  13150. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  13151. ssl->ecdhCurveOID = args->dCert->pkCurveOID;
  13152. break;
  13153. }
  13154. #endif /* HAVE_ECC */
  13155. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  13156. case ED25519k:
  13157. {
  13158. int keyRet = 0;
  13159. if (ssl->peerEd25519Key == NULL) {
  13160. /* alloc/init on demand */
  13161. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  13162. (void**)&ssl->peerEd25519Key);
  13163. } else if (ssl->peerEd25519KeyPresent) {
  13164. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  13165. ssl->peerEd25519Key);
  13166. ssl->peerEd25519KeyPresent = 0;
  13167. }
  13168. if (keyRet != 0 ||
  13169. wc_ed25519_import_public(args->dCert->publicKey,
  13170. args->dCert->pubKeySize,
  13171. ssl->peerEd25519Key)
  13172. != 0) {
  13173. ret = PEER_KEY_ERROR;
  13174. WOLFSSL_ERROR_VERBOSE(ret);
  13175. }
  13176. else {
  13177. ssl->peerEd25519KeyPresent = 1;
  13178. #ifdef HAVE_PK_CALLBACKS
  13179. ssl->buffers.peerEd25519Key.buffer =
  13180. (byte*)XMALLOC(args->dCert->pubKeySize,
  13181. ssl->heap, DYNAMIC_TYPE_ED25519);
  13182. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  13183. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  13184. }
  13185. else {
  13186. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  13187. args->dCert->publicKey,
  13188. args->dCert->pubKeySize);
  13189. ssl->buffers.peerEd25519Key.length =
  13190. args->dCert->pubKeySize;
  13191. }
  13192. #endif /*HAVE_PK_CALLBACKS */
  13193. }
  13194. /* check size of peer ECC key */
  13195. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  13196. !ssl->options.verifyNone &&
  13197. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  13198. ret = ECC_KEY_SIZE_E;
  13199. WOLFSSL_ERROR_VERBOSE(ret);
  13200. WOLFSSL_MSG("Peer ECC key is too small");
  13201. }
  13202. /* populate curve oid - if missing */
  13203. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  13204. ssl->ecdhCurveOID = ECC_X25519_OID;
  13205. break;
  13206. }
  13207. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  13208. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  13209. case ED448k:
  13210. {
  13211. int keyRet = 0;
  13212. if (ssl->peerEd448Key == NULL) {
  13213. /* alloc/init on demand */
  13214. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
  13215. (void**)&ssl->peerEd448Key);
  13216. } else if (ssl->peerEd448KeyPresent) {
  13217. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
  13218. ssl->peerEd448Key);
  13219. ssl->peerEd448KeyPresent = 0;
  13220. }
  13221. if (keyRet != 0 ||
  13222. wc_ed448_import_public(args->dCert->publicKey,
  13223. args->dCert->pubKeySize,
  13224. ssl->peerEd448Key) != 0) {
  13225. ret = PEER_KEY_ERROR;
  13226. WOLFSSL_ERROR_VERBOSE(ret);
  13227. }
  13228. else {
  13229. ssl->peerEd448KeyPresent = 1;
  13230. #ifdef HAVE_PK_CALLBACKS
  13231. ssl->buffers.peerEd448Key.buffer =
  13232. (byte*)XMALLOC(args->dCert->pubKeySize,
  13233. ssl->heap, DYNAMIC_TYPE_ED448);
  13234. if (ssl->buffers.peerEd448Key.buffer == NULL) {
  13235. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  13236. }
  13237. else {
  13238. XMEMCPY(ssl->buffers.peerEd448Key.buffer,
  13239. args->dCert->publicKey,
  13240. args->dCert->pubKeySize);
  13241. ssl->buffers.peerEd448Key.length =
  13242. args->dCert->pubKeySize;
  13243. }
  13244. #endif /*HAVE_PK_CALLBACKS */
  13245. }
  13246. /* check size of peer ECC key */
  13247. if (ret == 0 && ssl->peerEd448KeyPresent &&
  13248. !ssl->options.verifyNone &&
  13249. ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  13250. ret = ECC_KEY_SIZE_E;
  13251. WOLFSSL_ERROR_VERBOSE(ret);
  13252. WOLFSSL_MSG("Peer ECC key is too small");
  13253. }
  13254. /* populate curve oid - if missing */
  13255. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  13256. ssl->ecdhCurveOID = ECC_X448_OID;
  13257. break;
  13258. }
  13259. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  13260. #if defined(HAVE_PQC)
  13261. #if defined(HAVE_FALCON)
  13262. case FALCON_LEVEL1k:
  13263. case FALCON_LEVEL5k:
  13264. {
  13265. int keyRet = 0;
  13266. if (ssl->peerFalconKey == NULL) {
  13267. /* alloc/init on demand */
  13268. keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON,
  13269. (void**)&ssl->peerFalconKey);
  13270. } else if (ssl->peerFalconKeyPresent) {
  13271. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_FALCON,
  13272. ssl->peerFalconKey);
  13273. ssl->peerFalconKeyPresent = 0;
  13274. }
  13275. if (keyRet == 0) {
  13276. if (args->dCert->keyOID == FALCON_LEVEL1k) {
  13277. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  13278. 1);
  13279. }
  13280. else {
  13281. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  13282. 5);
  13283. }
  13284. }
  13285. if (keyRet != 0 ||
  13286. wc_falcon_import_public(args->dCert->publicKey,
  13287. args->dCert->pubKeySize,
  13288. ssl->peerFalconKey) != 0) {
  13289. ret = PEER_KEY_ERROR;
  13290. WOLFSSL_ERROR_VERBOSE(ret);
  13291. }
  13292. else {
  13293. ssl->peerFalconKeyPresent = 1;
  13294. }
  13295. /* check size of peer Falcon key */
  13296. if (ret == 0 && ssl->peerFalconKeyPresent &&
  13297. !ssl->options.verifyNone &&
  13298. FALCON_MAX_KEY_SIZE <
  13299. ssl->options.minFalconKeySz) {
  13300. ret = FALCON_KEY_SIZE_E;
  13301. WOLFSSL_ERROR_VERBOSE(ret);
  13302. WOLFSSL_MSG("Peer Falcon key is too small");
  13303. }
  13304. break;
  13305. }
  13306. #endif /* HAVE_FALCON */
  13307. #if defined(HAVE_DILITHIUM)
  13308. case DILITHIUM_LEVEL2k:
  13309. case DILITHIUM_LEVEL3k:
  13310. case DILITHIUM_LEVEL5k:
  13311. {
  13312. int keyRet = 0;
  13313. if (ssl->peerDilithiumKey == NULL) {
  13314. /* alloc/init on demand */
  13315. keyRet = AllocKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  13316. (void**)&ssl->peerDilithiumKey);
  13317. } else if (ssl->peerDilithiumKeyPresent) {
  13318. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  13319. ssl->peerDilithiumKey);
  13320. ssl->peerDilithiumKeyPresent = 0;
  13321. }
  13322. if (keyRet == 0) {
  13323. if (args->dCert->keyOID == DILITHIUM_LEVEL2k) {
  13324. keyRet = wc_dilithium_set_level(
  13325. ssl->peerDilithiumKey, 2);
  13326. }
  13327. else if (args->dCert->keyOID == DILITHIUM_LEVEL3k) {
  13328. keyRet = wc_dilithium_set_level(
  13329. ssl->peerDilithiumKey, 3);
  13330. }
  13331. else if (args->dCert->keyOID == DILITHIUM_LEVEL5k) {
  13332. keyRet = wc_dilithium_set_level(
  13333. ssl->peerDilithiumKey, 5);
  13334. }
  13335. }
  13336. if (keyRet != 0 ||
  13337. wc_dilithium_import_public(args->dCert->publicKey,
  13338. args->dCert->pubKeySize,
  13339. ssl->peerDilithiumKey)
  13340. != 0) {
  13341. ret = PEER_KEY_ERROR;
  13342. }
  13343. else {
  13344. ssl->peerDilithiumKeyPresent = 1;
  13345. }
  13346. /* check size of peer Dilithium key */
  13347. if (ret == 0 && ssl->peerDilithiumKeyPresent &&
  13348. !ssl->options.verifyNone &&
  13349. DILITHIUM_MAX_KEY_SIZE <
  13350. ssl->options.minDilithiumKeySz) {
  13351. ret = DILITHIUM_KEY_SIZE_E;
  13352. WOLFSSL_MSG("Peer Dilithium key is too small");
  13353. }
  13354. break;
  13355. }
  13356. #endif /* HAVE_DILITHIUM */
  13357. #endif /* HAVE_PQC */
  13358. default:
  13359. break;
  13360. }
  13361. /* args->dCert free'd in function cleanup after callback */
  13362. } /* if (count > 0) */
  13363. /* Check for error */
  13364. if (args->fatal && ret != 0) {
  13365. goto exit_ppc;
  13366. }
  13367. /* Advance state and proceed */
  13368. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  13369. } /* case TLS_ASYNC_VERIFY */
  13370. FALL_THROUGH;
  13371. case TLS_ASYNC_FINALIZE:
  13372. {
  13373. /* load last error */
  13374. if (args->lastErr != 0 && ret == 0) {
  13375. ret = args->lastErr;
  13376. }
  13377. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13378. /* limit compliant with OpenSSL verify Depth + 1
  13379. * OpenSSL tries to expand the chain one longer than limit until
  13380. * reaching an ultimately trusted issuer. Becoming failure if
  13381. * we hit the limit, with WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG
  13382. */
  13383. if (args->untrustedDepth > (ssl->options.verifyDepth + 1)) {
  13384. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  13385. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
  13386. ret = MAX_CHAIN_ERROR;
  13387. WOLFSSL_ERROR_VERBOSE(ret);
  13388. }
  13389. #endif
  13390. /* Do verify callback */
  13391. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  13392. if (ssl->options.verifyNone &&
  13393. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  13394. ret == CRL_CERT_DATE_ERR)) {
  13395. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  13396. ret = ssl->error = 0;
  13397. }
  13398. if (ret != 0) {
  13399. if (!ssl->options.verifyNone) {
  13400. DoCertFatalAlert(ssl, ret);
  13401. }
  13402. ssl->error = ret; /* Report SSL error */
  13403. }
  13404. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  13405. ssl->options.serverState = SERVER_CERT_COMPLETE;
  13406. }
  13407. if (IsEncryptionOn(ssl, 0)) {
  13408. args->idx += ssl->keys.padSz;
  13409. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13410. if (ssl->options.startedETMRead)
  13411. args->idx += MacSize(ssl);
  13412. #endif
  13413. }
  13414. /* Advance state and proceed */
  13415. ssl->options.asyncState = TLS_ASYNC_END;
  13416. } /* case TLS_ASYNC_FINALIZE */
  13417. FALL_THROUGH;
  13418. case TLS_ASYNC_END:
  13419. {
  13420. /* Set final index */
  13421. *inOutIdx = args->idx;
  13422. break;
  13423. }
  13424. default:
  13425. ret = INPUT_CASE_ERROR;
  13426. break;
  13427. } /* switch(ssl->options.asyncState) */
  13428. exit_ppc:
  13429. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  13430. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13431. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  13432. /* Mark message as not received so it can process again */
  13433. ssl->msgsReceived.got_certificate = 0;
  13434. return ret;
  13435. }
  13436. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  13437. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13438. /* Cleanup async */
  13439. FreeAsyncCtx(ssl, 0);
  13440. #elif defined(WOLFSSL_SMALL_STACK)
  13441. if (args)
  13442. {
  13443. FreeProcPeerCertArgs(ssl, args);
  13444. }
  13445. #else
  13446. FreeProcPeerCertArgs(ssl, args);
  13447. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
  13448. #if !defined(WOLFSSL_ASYNC_CRYPT) && defined(WOLFSSL_SMALL_STACK)
  13449. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  13450. #endif
  13451. FreeKeyExchange(ssl);
  13452. return ret;
  13453. }
  13454. #endif
  13455. #ifndef WOLFSSL_NO_TLS12
  13456. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  13457. /* handle processing of certificate (11) */
  13458. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  13459. word32 size)
  13460. {
  13461. int ret;
  13462. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  13463. WOLFSSL_ENTER("DoCertificate");
  13464. #ifdef SESSION_CERTS
  13465. /* Reset the session cert chain count in case the session resume failed. */
  13466. ssl->session->chain.count = 0;
  13467. #ifdef WOLFSSL_ALT_CERT_CHAINS
  13468. ssl->session->altChain.count = 0;
  13469. #endif
  13470. #endif /* SESSION_CERTS */
  13471. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  13472. #ifdef OPENSSL_EXTRA
  13473. ssl->options.serverState = SERVER_CERT_COMPLETE;
  13474. #endif
  13475. WOLFSSL_LEAVE("DoCertificate", ret);
  13476. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  13477. return ret;
  13478. }
  13479. /* handle processing of certificate_status (22) */
  13480. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  13481. word32 size)
  13482. {
  13483. int ret = 0;
  13484. byte status_type;
  13485. word32 status_length;
  13486. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  13487. WOLFSSL_ENTER("DoCertificateStatus");
  13488. if (size < ENUM_LEN + OPAQUE24_LEN)
  13489. return BUFFER_ERROR;
  13490. status_type = input[(*inOutIdx)++];
  13491. c24to32(input + *inOutIdx, &status_length);
  13492. *inOutIdx += OPAQUE24_LEN;
  13493. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  13494. return BUFFER_ERROR;
  13495. switch (status_type) {
  13496. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  13497. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  13498. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  13499. case WOLFSSL_CSR2_OCSP:
  13500. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  13501. break;
  13502. #endif
  13503. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  13504. case WOLFSSL_CSR2_OCSP_MULTI: {
  13505. OcspRequest* request;
  13506. word32 list_length = status_length;
  13507. byte idx = 0;
  13508. #ifdef WOLFSSL_SMALL_STACK
  13509. CertStatus* status;
  13510. OcspEntry* single;
  13511. OcspResponse* response;
  13512. #else
  13513. CertStatus status[1];
  13514. OcspEntry single[1];
  13515. OcspResponse response[1];
  13516. #endif
  13517. do {
  13518. if (ssl->status_request_v2) {
  13519. ssl->status_request_v2 = 0;
  13520. break;
  13521. }
  13522. return BUFFER_ERROR;
  13523. } while(0);
  13524. #ifdef WOLFSSL_SMALL_STACK
  13525. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  13526. DYNAMIC_TYPE_OCSP_STATUS);
  13527. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  13528. DYNAMIC_TYPE_OCSP_ENTRY);
  13529. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  13530. DYNAMIC_TYPE_OCSP_REQUEST);
  13531. if (status == NULL || single == NULL || response == NULL) {
  13532. if (status)
  13533. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  13534. if (single)
  13535. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  13536. if (response)
  13537. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  13538. return MEMORY_ERROR;
  13539. }
  13540. #endif
  13541. while (list_length && ret == 0) {
  13542. if (OPAQUE24_LEN > list_length) {
  13543. ret = BUFFER_ERROR;
  13544. break;
  13545. }
  13546. c24to32(input + *inOutIdx, &status_length);
  13547. *inOutIdx += OPAQUE24_LEN;
  13548. list_length -= OPAQUE24_LEN;
  13549. if (status_length > list_length) {
  13550. ret = BUFFER_ERROR;
  13551. break;
  13552. }
  13553. if (status_length) {
  13554. InitOcspResponse(response, single, status, input +*inOutIdx,
  13555. status_length, ssl->heap);
  13556. if ((OcspResponseDecode(response, SSL_CM(ssl), ssl->heap,
  13557. 0) != 0)
  13558. || (response->responseStatus != OCSP_SUCCESSFUL)
  13559. || (response->single->status->status != CERT_GOOD))
  13560. ret = BAD_CERTIFICATE_STATUS_ERROR;
  13561. while (ret == 0) {
  13562. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  13563. ssl->extensions, status_type, idx++);
  13564. if (request == NULL)
  13565. ret = BAD_CERTIFICATE_STATUS_ERROR;
  13566. else if (CompareOcspReqResp(request, response) == 0)
  13567. break;
  13568. else if (idx == 1) /* server cert must be OK */
  13569. ret = BAD_CERTIFICATE_STATUS_ERROR;
  13570. }
  13571. FreeOcspResponse(response);
  13572. *inOutIdx += status_length;
  13573. list_length -= status_length;
  13574. }
  13575. }
  13576. ssl->status_request_v2 = 0;
  13577. #ifdef WOLFSSL_SMALL_STACK
  13578. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  13579. XFREE(single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
  13580. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  13581. #endif
  13582. }
  13583. break;
  13584. #endif
  13585. default:
  13586. ret = BUFFER_ERROR;
  13587. }
  13588. if (ret != 0) {
  13589. WOLFSSL_ERROR_VERBOSE(ret);
  13590. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  13591. }
  13592. if (IsEncryptionOn(ssl, 0)) {
  13593. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13594. if (ssl->options.startedETMRead) {
  13595. word32 digestSz = MacSize(ssl);
  13596. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  13597. return BUFFER_E;
  13598. *inOutIdx += ssl->keys.padSz + digestSz;
  13599. }
  13600. else
  13601. #endif
  13602. {
  13603. if (*inOutIdx + ssl->keys.padSz > size)
  13604. return BUFFER_E;
  13605. *inOutIdx += ssl->keys.padSz;
  13606. }
  13607. }
  13608. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  13609. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  13610. return ret;
  13611. }
  13612. #endif
  13613. #endif /* !WOLFSSL_NO_TLS12 */
  13614. #endif /* !NO_CERTS */
  13615. #ifndef WOLFSSL_NO_TLS12
  13616. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  13617. word32 size, word32 totalSz)
  13618. {
  13619. (void)input;
  13620. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  13621. WOLFSSL_ENTER("DoHelloRequest");
  13622. if (size) /* must be 0 */
  13623. return BUFFER_ERROR;
  13624. if (IsEncryptionOn(ssl, 0)) {
  13625. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  13626. * about padding */
  13627. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13628. if (ssl->options.startedETMRead) {
  13629. word32 digestSz = MacSize(ssl);
  13630. if (size != totalSz &&
  13631. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  13632. return BUFFER_E;
  13633. *inOutIdx += ssl->keys.padSz + digestSz;
  13634. }
  13635. else
  13636. #endif
  13637. {
  13638. /* access beyond input + size should be checked against totalSz */
  13639. if (size != totalSz &&
  13640. *inOutIdx + ssl->keys.padSz > totalSz)
  13641. return BUFFER_E;
  13642. *inOutIdx += ssl->keys.padSz;
  13643. }
  13644. }
  13645. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13646. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  13647. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  13648. return FATAL_ERROR;
  13649. }
  13650. #ifdef HAVE_SECURE_RENEGOTIATION
  13651. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  13652. ssl->secure_renegotiation->startScr = 1;
  13653. WOLFSSL_LEAVE("DoHelloRequest", 0);
  13654. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  13655. return 0;
  13656. }
  13657. #endif
  13658. else {
  13659. return SendAlert(ssl, alert_warning, no_renegotiation);
  13660. }
  13661. }
  13662. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  13663. word32 totalSz, int sniff)
  13664. {
  13665. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  13666. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  13667. WOLFSSL_ENTER("DoFinished");
  13668. if (finishedSz != size)
  13669. return BUFFER_ERROR;
  13670. /* check against totalSz
  13671. * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
  13672. * padding */
  13673. if (size != totalSz) {
  13674. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13675. if (ssl->options.startedETMRead) {
  13676. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  13677. return BUFFER_E;
  13678. }
  13679. else
  13680. #endif
  13681. {
  13682. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  13683. return BUFFER_E;
  13684. }
  13685. }
  13686. #ifdef WOLFSSL_CALLBACKS
  13687. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  13688. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  13689. #endif
  13690. if (sniff == NO_SNIFF) {
  13691. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  13692. WOLFSSL_MSG("Verify finished error on hashes");
  13693. WOLFSSL_ERROR_VERBOSE(VERIFY_FINISHED_ERROR);
  13694. return VERIFY_FINISHED_ERROR;
  13695. }
  13696. }
  13697. #ifdef HAVE_SECURE_RENEGOTIATION
  13698. if (ssl->secure_renegotiation) {
  13699. /* save peer's state */
  13700. if (ssl->options.side == WOLFSSL_CLIENT_END)
  13701. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  13702. input + *inOutIdx, TLS_FINISHED_SZ);
  13703. else
  13704. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  13705. input + *inOutIdx, TLS_FINISHED_SZ);
  13706. ssl->secure_renegotiation->verifySet = 1;
  13707. }
  13708. #endif
  13709. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  13710. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13711. XMEMCPY(ssl->serverFinished,
  13712. input + *inOutIdx, TLS_FINISHED_SZ);
  13713. ssl->serverFinished_len = TLS_FINISHED_SZ;
  13714. }
  13715. else {
  13716. XMEMCPY(ssl->clientFinished,
  13717. input + *inOutIdx, TLS_FINISHED_SZ);
  13718. ssl->clientFinished_len = TLS_FINISHED_SZ;
  13719. }
  13720. #endif
  13721. /* force input exhaustion at ProcessReply consuming padSz */
  13722. *inOutIdx += size + ssl->keys.padSz;
  13723. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13724. if (ssl->options.startedETMRead)
  13725. *inOutIdx += MacSize(ssl);
  13726. #endif
  13727. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13728. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  13729. #ifdef OPENSSL_EXTRA
  13730. ssl->cbmode = SSL_CB_MODE_WRITE;
  13731. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  13732. #endif
  13733. if (!ssl->options.resuming) {
  13734. #ifdef OPENSSL_EXTRA
  13735. if (ssl->CBIS != NULL) {
  13736. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  13737. }
  13738. #endif
  13739. ssl->options.handShakeState = HANDSHAKE_DONE;
  13740. ssl->options.handShakeDone = 1;
  13741. #ifdef HAVE_SECURE_RENEGOTIATION
  13742. ssl->options.resumed = ssl->options.resuming;
  13743. #endif
  13744. }
  13745. }
  13746. else {
  13747. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  13748. #ifdef OPENSSL_EXTRA
  13749. ssl->cbmode = SSL_CB_MODE_READ;
  13750. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  13751. #endif
  13752. if (ssl->options.resuming) {
  13753. #ifdef OPENSSL_EXTRA
  13754. if (ssl->CBIS != NULL) {
  13755. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
  13756. }
  13757. #endif
  13758. ssl->options.handShakeState = HANDSHAKE_DONE;
  13759. ssl->options.handShakeDone = 1;
  13760. #ifdef HAVE_SECURE_RENEGOTIATION
  13761. ssl->options.resumed = ssl->options.resuming;
  13762. #endif
  13763. }
  13764. }
  13765. #ifdef WOLFSSL_DTLS
  13766. if (ssl->options.dtls) {
  13767. if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
  13768. (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
  13769. DtlsMsgPoolReset(ssl);
  13770. ssl->keys.dtls_handshake_number = 0;
  13771. ssl->keys.dtls_expected_peer_handshake_number = 0;
  13772. }
  13773. }
  13774. #endif
  13775. WOLFSSL_LEAVE("DoFinished", 0);
  13776. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  13777. return 0;
  13778. }
  13779. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  13780. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  13781. {
  13782. /* verify not a duplicate, mark received, check state */
  13783. switch (type) {
  13784. #ifndef NO_WOLFSSL_CLIENT
  13785. case hello_request:
  13786. #ifndef NO_WOLFSSL_SERVER
  13787. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13788. WOLFSSL_MSG("HelloRequest received by server");
  13789. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13790. return SIDE_ERROR;
  13791. }
  13792. #endif
  13793. if (ssl->msgsReceived.got_hello_request) {
  13794. WOLFSSL_MSG("Duplicate HelloRequest received");
  13795. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13796. return DUPLICATE_MSG_E;
  13797. }
  13798. ssl->msgsReceived.got_hello_request = 1;
  13799. break;
  13800. #endif
  13801. #ifndef NO_WOLFSSL_SERVER
  13802. case client_hello:
  13803. #ifndef NO_WOLFSSL_CLIENT
  13804. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13805. WOLFSSL_MSG("ClientHello received by client");
  13806. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13807. return SIDE_ERROR;
  13808. }
  13809. #endif
  13810. if (ssl->msgsReceived.got_client_hello) {
  13811. WOLFSSL_MSG("Duplicate ClientHello received");
  13812. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13813. return DUPLICATE_MSG_E;
  13814. }
  13815. ssl->msgsReceived.got_client_hello = 1;
  13816. break;
  13817. #endif
  13818. #ifndef NO_WOLFSSL_CLIENT
  13819. case server_hello:
  13820. #ifndef NO_WOLFSSL_SERVER
  13821. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13822. WOLFSSL_MSG("ServerHello received by server");
  13823. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13824. return SIDE_ERROR;
  13825. }
  13826. #endif
  13827. if (ssl->msgsReceived.got_server_hello) {
  13828. WOLFSSL_MSG("Duplicate ServerHello received");
  13829. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13830. return DUPLICATE_MSG_E;
  13831. }
  13832. ssl->msgsReceived.got_server_hello = 1;
  13833. break;
  13834. #endif
  13835. #ifndef NO_WOLFSSL_CLIENT
  13836. case hello_verify_request:
  13837. #ifndef NO_WOLFSSL_SERVER
  13838. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13839. WOLFSSL_MSG("HelloVerifyRequest received by server");
  13840. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13841. return SIDE_ERROR;
  13842. }
  13843. #endif
  13844. if (ssl->msgsReceived.got_hello_verify_request) {
  13845. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  13846. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13847. return DUPLICATE_MSG_E;
  13848. }
  13849. ssl->msgsReceived.got_hello_verify_request = 1;
  13850. break;
  13851. #endif
  13852. #ifndef NO_WOLFSSL_CLIENT
  13853. case session_ticket:
  13854. #ifndef NO_WOLFSSL_SERVER
  13855. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13856. WOLFSSL_MSG("SessionTicket received by server");
  13857. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13858. return SIDE_ERROR;
  13859. }
  13860. #endif
  13861. if (ssl->msgsReceived.got_session_ticket) {
  13862. WOLFSSL_MSG("Duplicate SessionTicket received");
  13863. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13864. return DUPLICATE_MSG_E;
  13865. }
  13866. ssl->msgsReceived.got_session_ticket = 1;
  13867. break;
  13868. #endif
  13869. case certificate:
  13870. if (ssl->msgsReceived.got_certificate) {
  13871. WOLFSSL_MSG("Duplicate Certificate received");
  13872. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13873. return DUPLICATE_MSG_E;
  13874. }
  13875. ssl->msgsReceived.got_certificate = 1;
  13876. #ifndef NO_WOLFSSL_CLIENT
  13877. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13878. if ( ssl->msgsReceived.got_server_hello == 0) {
  13879. WOLFSSL_MSG("No ServerHello before Cert");
  13880. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13881. return OUT_OF_ORDER_E;
  13882. }
  13883. }
  13884. #endif
  13885. #ifndef NO_WOLFSSL_SERVER
  13886. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13887. if ( ssl->msgsReceived.got_client_hello == 0) {
  13888. WOLFSSL_MSG("No ClientHello before Cert");
  13889. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13890. return OUT_OF_ORDER_E;
  13891. }
  13892. }
  13893. #endif
  13894. break;
  13895. #ifndef NO_WOLFSSL_CLIENT
  13896. case certificate_status:
  13897. #ifndef NO_WOLFSSL_SERVER
  13898. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13899. WOLFSSL_MSG("CertificateStatus received by server");
  13900. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13901. return SIDE_ERROR;
  13902. }
  13903. #endif
  13904. if (ssl->msgsReceived.got_certificate_status) {
  13905. WOLFSSL_MSG("Duplicate CertificateStatus received");
  13906. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13907. return DUPLICATE_MSG_E;
  13908. }
  13909. ssl->msgsReceived.got_certificate_status = 1;
  13910. if (ssl->msgsReceived.got_certificate == 0) {
  13911. WOLFSSL_MSG("No Certificate before CertificateStatus");
  13912. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13913. return OUT_OF_ORDER_E;
  13914. }
  13915. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  13916. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  13917. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13918. return OUT_OF_ORDER_E;
  13919. }
  13920. break;
  13921. #endif
  13922. #ifndef NO_WOLFSSL_CLIENT
  13923. case server_key_exchange:
  13924. #ifndef NO_WOLFSSL_SERVER
  13925. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13926. WOLFSSL_MSG("ServerKeyExchange received by server");
  13927. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13928. return SIDE_ERROR;
  13929. }
  13930. #endif
  13931. if (ssl->msgsReceived.got_server_key_exchange) {
  13932. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  13933. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13934. return DUPLICATE_MSG_E;
  13935. }
  13936. ssl->msgsReceived.got_server_key_exchange = 1;
  13937. if (ssl->msgsReceived.got_server_hello == 0) {
  13938. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  13939. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13940. return OUT_OF_ORDER_E;
  13941. }
  13942. if (ssl->msgsReceived.got_certificate_status == 0) {
  13943. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  13944. if (ssl->status_request) {
  13945. int ret;
  13946. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  13947. if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0)
  13948. return ret;
  13949. }
  13950. #endif
  13951. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13952. if (ssl->status_request_v2) {
  13953. int ret;
  13954. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  13955. if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0)
  13956. return ret;
  13957. }
  13958. #endif
  13959. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  13960. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  13961. /* Check that a status request extension was seen as the
  13962. * CertificateStatus wasn't when an OCSP staple is required.
  13963. */
  13964. if (
  13965. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  13966. !ssl->status_request &&
  13967. #endif
  13968. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13969. !ssl->status_request_v2 &&
  13970. #endif
  13971. SSL_CM(ssl)->ocspMustStaple) {
  13972. WOLFSSL_ERROR_VERBOSE(OCSP_CERT_UNKNOWN);
  13973. return OCSP_CERT_UNKNOWN;
  13974. }
  13975. #endif
  13976. }
  13977. break;
  13978. #endif
  13979. #ifndef NO_WOLFSSL_CLIENT
  13980. case certificate_request:
  13981. #ifndef NO_WOLFSSL_SERVER
  13982. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13983. WOLFSSL_MSG("CertificateRequest received by server");
  13984. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13985. return SIDE_ERROR;
  13986. }
  13987. #endif
  13988. if (ssl->msgsReceived.got_certificate_request) {
  13989. WOLFSSL_MSG("Duplicate CertificateRequest received");
  13990. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13991. return DUPLICATE_MSG_E;
  13992. }
  13993. ssl->msgsReceived.got_certificate_request = 1;
  13994. break;
  13995. #endif
  13996. #ifndef NO_WOLFSSL_CLIENT
  13997. case server_hello_done:
  13998. #ifndef NO_WOLFSSL_SERVER
  13999. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14000. WOLFSSL_MSG("ServerHelloDone received by server");
  14001. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14002. return SIDE_ERROR;
  14003. }
  14004. #endif
  14005. if (ssl->msgsReceived.got_server_hello_done) {
  14006. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  14007. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14008. return DUPLICATE_MSG_E;
  14009. }
  14010. ssl->msgsReceived.got_server_hello_done = 1;
  14011. if (ssl->msgsReceived.got_certificate == 0) {
  14012. if (ssl->specs.kea == psk_kea ||
  14013. ssl->specs.kea == dhe_psk_kea ||
  14014. ssl->specs.kea == ecdhe_psk_kea ||
  14015. ssl->options.usingAnon_cipher) {
  14016. WOLFSSL_MSG("No Cert required");
  14017. }
  14018. else {
  14019. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  14020. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14021. return OUT_OF_ORDER_E;
  14022. }
  14023. }
  14024. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  14025. int pskNoServerHint = 0; /* not required in this case */
  14026. #ifndef NO_PSK
  14027. if (ssl->specs.kea == psk_kea &&
  14028. ssl->arrays != NULL &&
  14029. ssl->arrays->server_hint[0] == 0)
  14030. pskNoServerHint = 1;
  14031. #endif
  14032. if (ssl->specs.static_ecdh == 1 ||
  14033. ssl->specs.kea == rsa_kea ||
  14034. pskNoServerHint) {
  14035. WOLFSSL_MSG("No KeyExchange required");
  14036. }
  14037. else {
  14038. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  14039. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14040. return OUT_OF_ORDER_E;
  14041. }
  14042. }
  14043. break;
  14044. #endif
  14045. #ifndef NO_WOLFSSL_SERVER
  14046. case certificate_verify:
  14047. #ifndef NO_WOLFSSL_CLIENT
  14048. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14049. WOLFSSL_MSG("CertificateVerify received by client");
  14050. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14051. return SIDE_ERROR;
  14052. }
  14053. #endif
  14054. if (ssl->msgsReceived.got_certificate_verify) {
  14055. WOLFSSL_MSG("Duplicate CertificateVerify received");
  14056. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14057. return DUPLICATE_MSG_E;
  14058. }
  14059. ssl->msgsReceived.got_certificate_verify = 1;
  14060. if ( ssl->msgsReceived.got_certificate == 0) {
  14061. WOLFSSL_MSG("No Cert before CertVerify");
  14062. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14063. return OUT_OF_ORDER_E;
  14064. }
  14065. break;
  14066. #endif
  14067. #ifndef NO_WOLFSSL_SERVER
  14068. case client_key_exchange:
  14069. #ifndef NO_WOLFSSL_CLIENT
  14070. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14071. WOLFSSL_MSG("ClientKeyExchange received by client");
  14072. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14073. return SIDE_ERROR;
  14074. }
  14075. #endif
  14076. if (ssl->msgsReceived.got_client_key_exchange) {
  14077. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  14078. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14079. return DUPLICATE_MSG_E;
  14080. }
  14081. ssl->msgsReceived.got_client_key_exchange = 1;
  14082. if (ssl->msgsReceived.got_client_hello == 0) {
  14083. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  14084. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14085. return OUT_OF_ORDER_E;
  14086. }
  14087. break;
  14088. #endif
  14089. case finished:
  14090. if (ssl->msgsReceived.got_finished) {
  14091. WOLFSSL_MSG("Duplicate Finished received");
  14092. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14093. return DUPLICATE_MSG_E;
  14094. }
  14095. #ifdef WOLFSSL_DTLS
  14096. if (ssl->options.dtls) {
  14097. if (ssl->keys.curEpoch == 0) {
  14098. WOLFSSL_MSG("Finished received with epoch 0");
  14099. WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
  14100. return SEQUENCE_ERROR;
  14101. }
  14102. }
  14103. #endif
  14104. ssl->msgsReceived.got_finished = 1;
  14105. if (ssl->msgsReceived.got_change_cipher == 0) {
  14106. WOLFSSL_MSG("Finished received before ChangeCipher");
  14107. WOLFSSL_ERROR_VERBOSE(NO_CHANGE_CIPHER_E);
  14108. return NO_CHANGE_CIPHER_E;
  14109. }
  14110. break;
  14111. case change_cipher_hs:
  14112. if (ssl->msgsReceived.got_change_cipher) {
  14113. WOLFSSL_MSG("Duplicate ChangeCipher received");
  14114. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14115. return DUPLICATE_MSG_E;
  14116. }
  14117. /* DTLS is going to ignore the CCS message if the client key
  14118. * exchange message wasn't received yet. */
  14119. if (!ssl->options.dtls)
  14120. ssl->msgsReceived.got_change_cipher = 1;
  14121. #ifndef NO_WOLFSSL_CLIENT
  14122. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14123. if (!ssl->options.resuming) {
  14124. if (ssl->msgsReceived.got_server_hello_done == 0) {
  14125. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  14126. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14127. return OUT_OF_ORDER_E;
  14128. }
  14129. }
  14130. else {
  14131. if (ssl->msgsReceived.got_server_hello == 0) {
  14132. WOLFSSL_MSG("No ServerHello before ChangeCipher on "
  14133. "Resume");
  14134. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14135. return OUT_OF_ORDER_E;
  14136. }
  14137. }
  14138. #ifdef HAVE_SESSION_TICKET
  14139. if (ssl->expect_session_ticket) {
  14140. WOLFSSL_MSG("Expected session ticket missing");
  14141. #ifdef WOLFSSL_DTLS
  14142. if (ssl->options.dtls) {
  14143. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14144. return OUT_OF_ORDER_E;
  14145. }
  14146. #endif
  14147. WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
  14148. return SESSION_TICKET_EXPECT_E;
  14149. }
  14150. #endif
  14151. }
  14152. #endif
  14153. #ifndef NO_WOLFSSL_SERVER
  14154. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14155. if (!ssl->options.resuming &&
  14156. ssl->msgsReceived.got_client_key_exchange == 0) {
  14157. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  14158. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14159. return OUT_OF_ORDER_E;
  14160. }
  14161. #ifndef NO_CERTS
  14162. if (ssl->options.verifyPeer &&
  14163. ssl->options.havePeerCert) {
  14164. if (!ssl->options.havePeerVerify ||
  14165. !ssl->msgsReceived.got_certificate_verify) {
  14166. WOLFSSL_MSG("client didn't send cert verify");
  14167. #ifdef WOLFSSL_DTLS
  14168. if (ssl->options.dtls) {
  14169. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14170. return OUT_OF_ORDER_E;
  14171. }
  14172. #endif
  14173. WOLFSSL_ERROR_VERBOSE(NO_PEER_VERIFY);
  14174. return NO_PEER_VERIFY;
  14175. }
  14176. }
  14177. #endif
  14178. }
  14179. #endif
  14180. if (ssl->options.dtls)
  14181. ssl->msgsReceived.got_change_cipher = 1;
  14182. break;
  14183. default:
  14184. WOLFSSL_MSG("Unknown message type");
  14185. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  14186. return SANITY_MSG_E;
  14187. }
  14188. return 0;
  14189. }
  14190. static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  14191. byte type, word32 size, word32 totalSz)
  14192. {
  14193. int ret = 0;
  14194. word32 expectedIdx;
  14195. WOLFSSL_ENTER("DoHandShakeMsgType");
  14196. #ifdef WOLFSSL_TLS13
  14197. if (type == hello_retry_request) {
  14198. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  14199. totalSz);
  14200. }
  14201. #endif
  14202. /* make sure can read the message */
  14203. if (*inOutIdx + size > totalSz) {
  14204. WOLFSSL_MSG("Incomplete Data");
  14205. WOLFSSL_ERROR_VERBOSE(INCOMPLETE_DATA);
  14206. return INCOMPLETE_DATA;
  14207. }
  14208. expectedIdx = *inOutIdx + size +
  14209. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  14210. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14211. if (ssl->options.startedETMRead && ssl->keys.encryptionOn)
  14212. expectedIdx += MacSize(ssl);
  14213. #endif
  14214. #if !defined(NO_WOLFSSL_SERVER) && \
  14215. defined(HAVE_SECURE_RENEGOTIATION) && \
  14216. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  14217. if (ssl->options.handShakeDone && type == client_hello &&
  14218. ssl->secure_renegotiation &&
  14219. ssl->secure_renegotiation->enabled)
  14220. {
  14221. WOLFSSL_MSG("Reset handshake state");
  14222. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  14223. ssl->options.serverState = NULL_STATE;
  14224. ssl->options.clientState = NULL_STATE;
  14225. ssl->options.connectState = CONNECT_BEGIN;
  14226. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  14227. ssl->options.handShakeState = NULL_STATE;
  14228. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  14229. ret = InitHandshakeHashes(ssl);
  14230. if (ret != 0)
  14231. return ret;
  14232. }
  14233. #endif
  14234. /* sanity check msg received */
  14235. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  14236. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  14237. return ret;
  14238. }
  14239. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14240. /* add name later, add the handshake header part back on and record layer
  14241. * header */
  14242. if (ssl->toInfoOn) {
  14243. ret = AddPacketInfo(ssl, 0, handshake, input + *inOutIdx -
  14244. HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ, READ_PROTO,
  14245. RECORD_HEADER_SZ, ssl->heap);
  14246. if (ret != 0)
  14247. return ret;
  14248. #ifdef WOLFSSL_CALLBACKS
  14249. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  14250. #endif
  14251. }
  14252. #endif
  14253. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  14254. WOLFSSL_MSG("HandShake message after handshake complete");
  14255. SendAlert(ssl, alert_fatal, unexpected_message);
  14256. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14257. return OUT_OF_ORDER_E;
  14258. }
  14259. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  14260. ssl->options.serverState == NULL_STATE && type != server_hello &&
  14261. type != hello_request) {
  14262. WOLFSSL_MSG("First server message not server hello or "
  14263. "hello request");
  14264. SendAlert(ssl, alert_fatal, unexpected_message);
  14265. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14266. return OUT_OF_ORDER_E;
  14267. }
  14268. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  14269. type == server_hello_done &&
  14270. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  14271. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  14272. SendAlert(ssl, alert_fatal, unexpected_message);
  14273. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14274. return OUT_OF_ORDER_E;
  14275. }
  14276. if (ssl->options.side == WOLFSSL_SERVER_END &&
  14277. ssl->options.clientState == NULL_STATE && type != client_hello) {
  14278. WOLFSSL_MSG("First client message not client hello");
  14279. SendAlert(ssl, alert_fatal, unexpected_message);
  14280. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14281. return OUT_OF_ORDER_E;
  14282. }
  14283. /* above checks handshake state */
  14284. /* hello_request not hashed */
  14285. if (type != hello_request
  14286. #ifdef WOLFSSL_ASYNC_CRYPT
  14287. && ssl->error != WC_PENDING_E
  14288. #endif
  14289. #ifdef WOLFSSL_NONBLOCK_OCSP
  14290. && ssl->error != OCSP_WANT_READ
  14291. #endif
  14292. ) {
  14293. ret = HashInput(ssl, input + *inOutIdx, size);
  14294. if (ret != 0) {
  14295. WOLFSSL_MSG("Incomplete handshake hashes");
  14296. return ret;
  14297. }
  14298. }
  14299. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14300. switch (type) {
  14301. case certificate:
  14302. case server_key_exchange:
  14303. case certificate_request:
  14304. case server_hello_done:
  14305. if (ssl->options.resuming) {
  14306. /* https://www.rfc-editor.org/rfc/rfc5077.html#section-3.4
  14307. * Alternatively, the client MAY include an empty Session ID
  14308. * in the ClientHello. In this case, the client ignores the
  14309. * Session ID sent in the ServerHello and determines if the
  14310. * server is resuming a session by the subsequent handshake
  14311. * messages.
  14312. */
  14313. #ifndef WOLFSSL_WPAS
  14314. if (ssl->session->sessionIDSz != 0) {
  14315. /* Fatal error. Only try to send an alert. RFC 5246 does not
  14316. * allow for reverting back to a full handshake after the
  14317. * server has indicated the intention to do a resumption. */
  14318. (void)SendAlert(ssl, alert_fatal, unexpected_message);
  14319. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14320. return OUT_OF_ORDER_E;
  14321. }
  14322. #endif
  14323. /* This can occur when ssl->sessionSecretCb is set. EAP-FAST
  14324. * (RFC 4851) allows for detecting server session resumption
  14325. * based on the msg received after the ServerHello. */
  14326. WOLFSSL_MSG("Not resuming as thought");
  14327. ssl->options.resuming = 0;
  14328. /* No longer resuming, reset peer authentication state. */
  14329. ssl->options.peerAuthGood = 0;
  14330. }
  14331. }
  14332. }
  14333. #ifdef OPENSSL_EXTRA
  14334. if (ssl->CBIS != NULL){
  14335. ssl->cbmode = SSL_CB_MODE_READ;
  14336. ssl->cbtype = type;
  14337. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
  14338. }
  14339. #endif
  14340. switch (type) {
  14341. case hello_request:
  14342. WOLFSSL_MSG("processing hello request");
  14343. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  14344. break;
  14345. #ifndef NO_WOLFSSL_CLIENT
  14346. case hello_verify_request:
  14347. WOLFSSL_MSG("processing hello verify request");
  14348. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  14349. if (IsEncryptionOn(ssl, 0)) {
  14350. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14351. if (ssl->options.startedETMRead) {
  14352. word32 digestSz = MacSize(ssl);
  14353. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  14354. return BUFFER_E;
  14355. *inOutIdx += ssl->keys.padSz + digestSz;
  14356. }
  14357. else
  14358. #endif
  14359. {
  14360. /* access beyond input + size should be checked against totalSz
  14361. */
  14362. if (*inOutIdx + ssl->keys.padSz > totalSz)
  14363. return BUFFER_E;
  14364. *inOutIdx += ssl->keys.padSz;
  14365. }
  14366. }
  14367. break;
  14368. case server_hello:
  14369. WOLFSSL_MSG("processing server hello");
  14370. ret = DoServerHello(ssl, input, inOutIdx, size);
  14371. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  14372. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  14373. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  14374. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  14375. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  14376. IsAtLeastTLSv1_3(ssl->version)) {
  14377. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  14378. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  14379. #endif
  14380. {
  14381. ssl->options.cacheMessages = 0;
  14382. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  14383. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  14384. XFREE(ssl->hsHashes->messages, ssl->heap,
  14385. DYNAMIC_TYPE_HASHES);
  14386. ssl->hsHashes->messages = NULL;
  14387. }
  14388. }
  14389. }
  14390. #endif
  14391. break;
  14392. #ifndef NO_CERTS
  14393. case certificate_request:
  14394. WOLFSSL_MSG("processing certificate request");
  14395. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  14396. break;
  14397. #endif
  14398. case server_key_exchange:
  14399. WOLFSSL_MSG("processing server key exchange");
  14400. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  14401. break;
  14402. #ifdef HAVE_SESSION_TICKET
  14403. case session_ticket:
  14404. WOLFSSL_MSG("processing session ticket");
  14405. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  14406. break;
  14407. #endif /* HAVE_SESSION_TICKET */
  14408. #endif
  14409. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  14410. !defined(WOLFSSL_NO_CLIENT_AUTH))
  14411. case certificate:
  14412. WOLFSSL_MSG("processing certificate");
  14413. ret = DoCertificate(ssl, input, inOutIdx, size);
  14414. break;
  14415. case certificate_status:
  14416. WOLFSSL_MSG("processing certificate status");
  14417. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  14418. break;
  14419. #endif
  14420. case server_hello_done:
  14421. WOLFSSL_MSG("processing server hello done");
  14422. #ifdef WOLFSSL_CALLBACKS
  14423. if (ssl->hsInfoOn)
  14424. AddPacketName(ssl, "ServerHelloDone");
  14425. if (ssl->toInfoOn)
  14426. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  14427. #endif
  14428. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  14429. if (IsEncryptionOn(ssl, 0)) {
  14430. *inOutIdx += ssl->keys.padSz;
  14431. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14432. if (ssl->options.startedETMRead)
  14433. *inOutIdx += MacSize(ssl);
  14434. #endif
  14435. }
  14436. break;
  14437. case finished:
  14438. WOLFSSL_MSG("processing finished");
  14439. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  14440. break;
  14441. #ifndef NO_WOLFSSL_SERVER
  14442. case client_hello:
  14443. WOLFSSL_MSG("processing client hello");
  14444. ret = DoClientHello(ssl, input, inOutIdx, size);
  14445. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  14446. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  14447. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  14448. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  14449. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  14450. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  14451. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  14452. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  14453. #endif
  14454. {
  14455. ssl->options.cacheMessages = 0;
  14456. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  14457. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  14458. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  14459. ssl->hsHashes->messages = NULL;
  14460. }
  14461. }
  14462. }
  14463. #endif
  14464. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  14465. * about padding */
  14466. if (IsEncryptionOn(ssl, 0)) {
  14467. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14468. if (ssl->options.startedETMRead) {
  14469. word32 digestSz = MacSize(ssl);
  14470. if (size != totalSz &&
  14471. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  14472. return BUFFER_E;
  14473. *inOutIdx += ssl->keys.padSz + digestSz;
  14474. }
  14475. else
  14476. #endif
  14477. {
  14478. /* access beyond input + size should be checked against totalSz
  14479. */
  14480. if (size != totalSz &&
  14481. *inOutIdx + ssl->keys.padSz > totalSz)
  14482. return BUFFER_E;
  14483. *inOutIdx += ssl->keys.padSz;
  14484. }
  14485. }
  14486. break;
  14487. case client_key_exchange:
  14488. WOLFSSL_MSG("processing client key exchange");
  14489. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  14490. break;
  14491. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  14492. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  14493. case certificate_verify:
  14494. WOLFSSL_MSG("processing certificate verify");
  14495. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  14496. break;
  14497. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  14498. #endif /* !NO_WOLFSSL_SERVER */
  14499. default:
  14500. WOLFSSL_MSG("Unknown handshake message type");
  14501. ret = UNKNOWN_HANDSHAKE_TYPE;
  14502. break;
  14503. }
  14504. if (ret == 0 && expectedIdx != *inOutIdx) {
  14505. WOLFSSL_MSG("Extra data in handshake message");
  14506. if (!ssl->options.dtls)
  14507. SendAlert(ssl, alert_fatal, decode_error);
  14508. ret = DECODE_E;
  14509. WOLFSSL_ERROR_VERBOSE(ret);
  14510. }
  14511. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  14512. /* if async, offset index so this msg will be processed again */
  14513. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  14514. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  14515. #ifdef WOLFSSL_DTLS
  14516. if (ssl->options.dtls) {
  14517. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  14518. }
  14519. #endif
  14520. }
  14521. /* make sure async error is cleared */
  14522. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  14523. ssl->error = 0;
  14524. }
  14525. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  14526. #ifdef WOLFSSL_DTLS
  14527. if (ret == 0) {
  14528. if (type == client_hello) {
  14529. /* Advance expected number only if cookie exchange complete */
  14530. if (ssl->msgsReceived.got_client_hello)
  14531. ssl->keys.dtls_expected_peer_handshake_number =
  14532. ssl->keys.dtls_peer_handshake_number + 1;
  14533. }
  14534. else if (type != finished) {
  14535. ssl->keys.dtls_expected_peer_handshake_number++;
  14536. }
  14537. }
  14538. #endif
  14539. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  14540. return ret;
  14541. }
  14542. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  14543. word32 totalSz)
  14544. {
  14545. int ret = 0;
  14546. word32 inputLength;
  14547. WOLFSSL_ENTER("DoHandShakeMsg");
  14548. if (ssl->arrays == NULL) {
  14549. byte type;
  14550. word32 size;
  14551. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0) {
  14552. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  14553. return PARSE_ERROR;
  14554. }
  14555. if (size > MAX_HANDSHAKE_SZ) {
  14556. WOLFSSL_MSG("Handshake message too large");
  14557. WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
  14558. return HANDSHAKE_SIZE_ERROR;
  14559. }
  14560. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  14561. }
  14562. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  14563. /* If there is a pending fragmented handshake message,
  14564. * pending message size will be non-zero. */
  14565. if (ssl->arrays->pendingMsgSz == 0) {
  14566. byte type;
  14567. word32 size;
  14568. if (GetHandShakeHeader(ssl, input, inOutIdx, &type, &size,
  14569. totalSz) != 0) {
  14570. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  14571. return PARSE_ERROR;
  14572. }
  14573. /* Cap the maximum size of a handshake message to something reasonable.
  14574. * By default is the maximum size of a certificate message assuming
  14575. * nine 2048-bit RSA certificates in the chain. */
  14576. if (size > MAX_HANDSHAKE_SZ) {
  14577. WOLFSSL_MSG("Handshake message too large");
  14578. WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
  14579. return HANDSHAKE_SIZE_ERROR;
  14580. }
  14581. /* size is the size of the certificate message payload */
  14582. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  14583. ssl->arrays->pendingMsgType = type;
  14584. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  14585. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  14586. ssl->heap,
  14587. DYNAMIC_TYPE_ARRAYS);
  14588. if (ssl->arrays->pendingMsg == NULL)
  14589. return MEMORY_E;
  14590. XMEMCPY(ssl->arrays->pendingMsg,
  14591. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  14592. inputLength);
  14593. ssl->arrays->pendingMsgOffset = inputLength;
  14594. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  14595. return 0;
  14596. }
  14597. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  14598. }
  14599. else {
  14600. word32 pendSz =
  14601. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  14602. /* Catch the case where there may be the remainder of a fragmented
  14603. * handshake message and the next handshake message in the same
  14604. * record. */
  14605. if (inputLength > pendSz)
  14606. inputLength = pendSz;
  14607. #ifdef WOLFSSL_ASYNC_CRYPT
  14608. if (ssl->error != WC_PENDING_E)
  14609. #endif
  14610. {
  14611. /* for async this copy was already done, do not replace, since
  14612. * contents may have been changed for inline operations */
  14613. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  14614. input + *inOutIdx, inputLength);
  14615. }
  14616. ssl->arrays->pendingMsgOffset += inputLength;
  14617. *inOutIdx += inputLength;
  14618. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  14619. {
  14620. word32 idx = HANDSHAKE_HEADER_SZ;
  14621. ret = DoHandShakeMsgType(ssl,
  14622. ssl->arrays->pendingMsg,
  14623. &idx, ssl->arrays->pendingMsgType,
  14624. ssl->arrays->pendingMsgSz - idx,
  14625. ssl->arrays->pendingMsgSz);
  14626. #ifdef WOLFSSL_ASYNC_CRYPT
  14627. if (ret == WC_PENDING_E) {
  14628. /* setup to process fragment again */
  14629. ssl->arrays->pendingMsgOffset -= inputLength;
  14630. *inOutIdx -= inputLength;
  14631. }
  14632. else
  14633. #endif
  14634. {
  14635. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  14636. ssl->arrays->pendingMsg = NULL;
  14637. ssl->arrays->pendingMsgSz = 0;
  14638. }
  14639. }
  14640. }
  14641. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  14642. return ret;
  14643. }
  14644. #endif /* !WOLFSSL_NO_TLS12 */
  14645. #ifdef WOLFSSL_EXTRA_ALERTS
  14646. int SendFatalAlertOnly(WOLFSSL *ssl, int error)
  14647. {
  14648. int why;
  14649. /* already sent a more specific fatal alert */
  14650. if (ssl->alert_history.last_tx.level == alert_fatal)
  14651. return 0;
  14652. switch (error) {
  14653. /* not fatal errors */
  14654. case WANT_WRITE:
  14655. case WANT_READ:
  14656. case ZERO_RETURN:
  14657. #ifdef WOLFSSL_NONBLOCK_OCSP
  14658. case OCSP_WANT_READ:
  14659. #endif
  14660. #ifdef WOLFSSL_ASYNC_CRYPT
  14661. case WC_PENDING_E:
  14662. #endif
  14663. return 0;
  14664. /* peer already disconnected and ssl is possibly in bad state
  14665. * don't try to send an alert */
  14666. case SOCKET_ERROR_E:
  14667. return error;
  14668. case BUFFER_ERROR:
  14669. case ASN_PARSE_E:
  14670. case COMPRESSION_ERROR:
  14671. why = decode_error;
  14672. break;
  14673. case MATCH_SUITE_ERROR:
  14674. why = illegal_parameter;
  14675. break;
  14676. case VERIFY_FINISHED_ERROR:
  14677. case SIG_VERIFY_E:
  14678. why = decrypt_error;
  14679. break;
  14680. case DUPLICATE_MSG_E:
  14681. case NO_CHANGE_CIPHER_E:
  14682. case OUT_OF_ORDER_E:
  14683. why = unexpected_message;
  14684. break;
  14685. case ECC_OUT_OF_RANGE_E:
  14686. why = bad_record_mac;
  14687. break;
  14688. case VERSION_ERROR:
  14689. default:
  14690. why = handshake_failure;
  14691. break;
  14692. }
  14693. return SendAlert(ssl, alert_fatal, why);
  14694. }
  14695. #else
  14696. int SendFatalAlertOnly(WOLFSSL *ssl, int error)
  14697. {
  14698. (void)ssl;
  14699. (void)error;
  14700. /* no op */
  14701. return 0;
  14702. }
  14703. #endif /* WOLFSSL_EXTRA_ALERTS */
  14704. #ifdef WOLFSSL_DTLS
  14705. static int _DtlsCheckWindow(WOLFSSL* ssl)
  14706. {
  14707. word32* window;
  14708. word16 cur_hi, next_hi;
  14709. word32 cur_lo, next_lo, diff;
  14710. int curLT;
  14711. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  14712. if (!ssl->options.haveMcast)
  14713. peerSeq = ssl->keys.peerSeq;
  14714. else {
  14715. #ifdef WOLFSSL_MULTICAST
  14716. WOLFSSL_DTLS_PEERSEQ* p;
  14717. int i;
  14718. for (i = 0, p = ssl->keys.peerSeq;
  14719. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  14720. i++, p++) {
  14721. if (p->peerId == ssl->keys.curPeerId) {
  14722. peerSeq = p;
  14723. break;
  14724. }
  14725. }
  14726. #endif
  14727. }
  14728. if (peerSeq == NULL) {
  14729. WOLFSSL_MSG("Could not find peer sequence");
  14730. return 0;
  14731. }
  14732. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  14733. next_hi = peerSeq->nextSeq_hi;
  14734. next_lo = peerSeq->nextSeq_lo;
  14735. window = peerSeq->window;
  14736. }
  14737. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  14738. next_hi = peerSeq->prevSeq_hi;
  14739. next_lo = peerSeq->prevSeq_lo;
  14740. window = peerSeq->prevWindow;
  14741. }
  14742. else {
  14743. return 0;
  14744. }
  14745. cur_hi = ssl->keys.curSeq_hi;
  14746. cur_lo = ssl->keys.curSeq_lo;
  14747. /* If the difference between next and cur is > 2^32, way outside window. */
  14748. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  14749. WOLFSSL_MSG("Current record from way too far in the future.");
  14750. return 0;
  14751. }
  14752. if (cur_hi == next_hi) {
  14753. curLT = cur_lo < next_lo;
  14754. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  14755. }
  14756. else {
  14757. curLT = cur_hi < next_hi;
  14758. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  14759. }
  14760. /* Check to see that the next value is greater than the number of messages
  14761. * trackable in the window, and that the difference between the next
  14762. * expected sequence number and the received sequence number is inside the
  14763. * window. */
  14764. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  14765. curLT && (diff > DTLS_SEQ_BITS)) {
  14766. WOLFSSL_MSG("Current record sequence number from the past.");
  14767. return 0;
  14768. }
  14769. #ifdef WOLFSSL_DTLS_DISALLOW_FUTURE
  14770. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  14771. WOLFSSL_MSG("Rejecting message too far into the future.");
  14772. return 0;
  14773. }
  14774. #endif
  14775. else if (curLT) {
  14776. word32 idx;
  14777. word32 newDiff;
  14778. if (diff == 0) {
  14779. WOLFSSL_MSG("DTLS sanity check failed");
  14780. return 0;
  14781. }
  14782. diff--;
  14783. idx = diff / DTLS_WORD_BITS;
  14784. newDiff = diff % DTLS_WORD_BITS;
  14785. /* verify idx is valid for window array */
  14786. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  14787. WOLFSSL_MSG("Invalid DTLS windows index");
  14788. return 0;
  14789. }
  14790. if (window[idx] & (1 << newDiff)) {
  14791. WOLFSSL_MSG("Current record sequence number already received.");
  14792. return 0;
  14793. }
  14794. }
  14795. return 1;
  14796. }
  14797. #ifdef WOLFSSL_DTLS13
  14798. static WC_INLINE int Dtls13CheckWindow(WOLFSSL* ssl)
  14799. {
  14800. w64wrapper nextSeq, seq;
  14801. w64wrapper diff64;
  14802. word32 *window;
  14803. int wordOffset;
  14804. int wordIndex;
  14805. word32 diff;
  14806. if (ssl->dtls13DecryptEpoch == NULL) {
  14807. WOLFSSL_MSG("Can't find decrypting epoch");
  14808. return 0;
  14809. }
  14810. nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber;
  14811. window = ssl->dtls13DecryptEpoch->window;
  14812. seq = ssl->keys.curSeq;
  14813. if (w64GTE(seq, nextSeq))
  14814. return 1;
  14815. /* seq < nextSeq, nextSeq - seq */
  14816. diff64 = w64Sub(nextSeq, seq);
  14817. /* diff >= DTLS_SEQ_BITS, outside of the window */
  14818. if (w64GT(diff64, w64From32(0, DTLS_SEQ_BITS)))
  14819. return 0;
  14820. /* we are assuming DTLS_SEQ_BITS <= 2**32 */
  14821. diff = w64GetLow32(diff64);
  14822. /* zero based index */
  14823. diff--;
  14824. wordIndex = ((int)diff) / DTLS_WORD_BITS;
  14825. wordOffset = ((int)diff) % DTLS_WORD_BITS;
  14826. if (window[wordIndex] & (1 << wordOffset))
  14827. return 0;
  14828. return 1;
  14829. }
  14830. #endif /* WOLFSSL_DTLS13 */
  14831. #ifdef WOLFSSL_MULTICAST
  14832. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  14833. word32 second, word32 high)
  14834. {
  14835. word32 newCur = 0;
  14836. if (cur < first)
  14837. newCur = first;
  14838. else if (cur < second)
  14839. newCur = second;
  14840. else if (cur < high)
  14841. newCur = high;
  14842. return newCur;
  14843. }
  14844. #endif /* WOLFSSL_MULTICAST */
  14845. /* diff is the difference between the message sequence and the
  14846. * expected sequence number. 0 is special where it is an overflow. */
  14847. static void _DtlsUpdateWindowGTSeq(word32 diff, word32* window)
  14848. {
  14849. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  14850. if (diff == 0 || diff >= DTLS_SEQ_BITS)
  14851. XMEMSET(window, 0, DTLS_SEQ_SZ);
  14852. else {
  14853. word32 i;
  14854. word32 temp = 0;
  14855. word32 idx = diff / DTLS_WORD_BITS;
  14856. diff %= DTLS_WORD_BITS;
  14857. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  14858. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  14859. if (i < idx)
  14860. window[i] = 0;
  14861. else {
  14862. temp |= (oldWindow[i-idx] << diff);
  14863. window[i] = temp;
  14864. if (diff > 0)
  14865. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - diff);
  14866. else
  14867. temp = 0;
  14868. }
  14869. }
  14870. }
  14871. window[0] |= 1;
  14872. }
  14873. int wolfSSL_DtlsUpdateWindow(word16 cur_hi, word32 cur_lo,
  14874. word16* next_hi, word32* next_lo, word32 *window)
  14875. {
  14876. word32 diff;
  14877. int curLT;
  14878. if (cur_hi == *next_hi) {
  14879. curLT = cur_lo < *next_lo;
  14880. diff = curLT ? *next_lo - cur_lo : cur_lo - *next_lo;
  14881. }
  14882. else {
  14883. if (cur_hi > *next_hi + 1) {
  14884. /* reset window */
  14885. _DtlsUpdateWindowGTSeq(0, window);
  14886. *next_lo = cur_lo + 1;
  14887. if (*next_lo == 0)
  14888. *next_hi = cur_hi + 1;
  14889. else
  14890. *next_hi = cur_hi;
  14891. return 1;
  14892. }
  14893. else if (*next_hi > cur_hi + 1) {
  14894. return 1;
  14895. }
  14896. else {
  14897. curLT = cur_hi < *next_hi;
  14898. if (curLT) {
  14899. if (*next_lo < DTLS_SEQ_BITS &&
  14900. cur_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS)) {
  14901. /* diff here can still result in a difference that can not
  14902. * be stored in the window. The index is checked against
  14903. * WOLFSSL_DTLS_WINDOW_WORDS later. */
  14904. diff = *next_lo + ((word32)0xFFFFFFFF - cur_lo) + 1;
  14905. }
  14906. else {
  14907. /* Too far back to update */
  14908. return 1;
  14909. }
  14910. }
  14911. else {
  14912. if (*next_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS) &&
  14913. cur_lo < DTLS_SEQ_BITS) {
  14914. /* diff here can still result in a difference that can not
  14915. * be stored in the window. The index is checked against
  14916. * WOLFSSL_DTLS_WINDOW_WORDS later. */
  14917. diff = cur_lo - *next_lo;
  14918. }
  14919. else {
  14920. _DtlsUpdateWindowGTSeq(0, window);
  14921. *next_lo = cur_lo + 1;
  14922. if (*next_lo == 0)
  14923. *next_hi = cur_hi + 1;
  14924. else
  14925. *next_hi = cur_hi;
  14926. return 1;
  14927. }
  14928. }
  14929. }
  14930. }
  14931. if (curLT) {
  14932. word32 idx;
  14933. diff--;
  14934. idx = diff / DTLS_WORD_BITS;
  14935. diff %= DTLS_WORD_BITS;
  14936. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  14937. window[idx] |= (1U << diff);
  14938. }
  14939. else {
  14940. _DtlsUpdateWindowGTSeq(diff + 1, window);
  14941. *next_lo = cur_lo + 1;
  14942. if (*next_lo == 0)
  14943. *next_hi = cur_hi + 1;
  14944. else
  14945. *next_hi = cur_hi;
  14946. }
  14947. return 1;
  14948. }
  14949. static int _DtlsUpdateWindow(WOLFSSL* ssl)
  14950. {
  14951. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  14952. word16 *next_hi;
  14953. word32 *next_lo;
  14954. word32* window;
  14955. #ifdef WOLFSSL_MULTICAST
  14956. word32 cur_lo = ssl->keys.curSeq_lo;
  14957. if (ssl->options.haveMcast) {
  14958. WOLFSSL_DTLS_PEERSEQ* p;
  14959. int i;
  14960. peerSeq = NULL;
  14961. for (i = 0, p = ssl->keys.peerSeq;
  14962. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  14963. i++, p++) {
  14964. if (p->peerId == ssl->keys.curPeerId) {
  14965. peerSeq = p;
  14966. break;
  14967. }
  14968. }
  14969. if (peerSeq == NULL) {
  14970. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  14971. return 0;
  14972. }
  14973. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  14974. int cbError = 0;
  14975. if (ssl->ctx->mcastHwCb)
  14976. cbError = ssl->ctx->mcastHwCb(p->peerId,
  14977. ssl->ctx->mcastMaxSeq,
  14978. cur_lo, ssl->mcastHwCbCtx);
  14979. if (cbError) {
  14980. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  14981. return MCAST_HIGHWATER_CB_E;
  14982. }
  14983. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  14984. ssl->ctx->mcastFirstSeq,
  14985. ssl->ctx->mcastSecondSeq,
  14986. ssl->ctx->mcastMaxSeq);
  14987. }
  14988. }
  14989. #endif
  14990. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  14991. next_hi = &peerSeq->nextSeq_hi;
  14992. next_lo = &peerSeq->nextSeq_lo;
  14993. window = peerSeq->window;
  14994. }
  14995. else {
  14996. next_hi = &peerSeq->prevSeq_hi;
  14997. next_lo = &peerSeq->prevSeq_lo;
  14998. window = peerSeq->prevWindow;
  14999. }
  15000. return wolfSSL_DtlsUpdateWindow(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo,
  15001. next_hi, next_lo, window);
  15002. }
  15003. #ifdef WOLFSSL_DTLS13
  15004. static WC_INLINE int Dtls13UpdateWindow(WOLFSSL* ssl)
  15005. {
  15006. w64wrapper nextSeq, seq;
  15007. w64wrapper diff64;
  15008. word32 *window;
  15009. int wordOffset;
  15010. int wordIndex;
  15011. word32 diff;
  15012. if (ssl->dtls13DecryptEpoch == NULL) {
  15013. WOLFSSL_MSG("Can't find decrypting Epoch");
  15014. return BAD_STATE_E;
  15015. }
  15016. nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber;
  15017. window = ssl->dtls13DecryptEpoch->window;
  15018. seq = ssl->keys.curSeq;
  15019. /* seq < nextSeq */
  15020. if (w64LT(seq, nextSeq)) {
  15021. diff64 = w64Sub(nextSeq, seq);
  15022. /* zero based index */
  15023. w64Decrement(&diff64);
  15024. /* FIXME: check that diff64 < DTLS_WORDS_BITS */
  15025. diff = w64GetLow32(diff64);
  15026. wordIndex = ((int)diff) / DTLS_WORD_BITS;
  15027. wordOffset = ((int)diff) % DTLS_WORD_BITS;
  15028. if (wordIndex >= WOLFSSL_DTLS_WINDOW_WORDS) {
  15029. WOLFSSL_MSG("Invalid sequence number to Dtls13UpdateWindow");
  15030. return BAD_STATE_E;
  15031. }
  15032. window[wordIndex] |= (1 << wordOffset);
  15033. return 1;
  15034. }
  15035. /* seq >= nextSeq, seq - nextSeq */
  15036. diff64 = w64Sub(seq, nextSeq);
  15037. /* as we are considering nextSeq inside the window, we should add + 1 */
  15038. w64Increment(&diff64);
  15039. _DtlsUpdateWindowGTSeq(w64GetLow32(diff64), window);
  15040. w64Increment(&seq);
  15041. ssl->dtls13DecryptEpoch->nextPeerSeqNumber = seq;
  15042. return 1;
  15043. }
  15044. #endif /* WOLFSSL_DTLS13 */
  15045. int DtlsMsgDrain(WOLFSSL* ssl)
  15046. {
  15047. DtlsMsg* item = ssl->dtls_rx_msg_list;
  15048. int ret = 0;
  15049. WOLFSSL_ENTER("DtlsMsgDrain");
  15050. /* While there is an item in the store list, and it is the expected
  15051. * message, and it is complete, and there hasn't been an error in the
  15052. * last message... */
  15053. while (item != NULL &&
  15054. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  15055. item->ready && ret == 0) {
  15056. word32 idx = 0;
  15057. #ifdef WOLFSSL_NO_TLS12
  15058. ret = DoTls13HandShakeMsgType(ssl, item->fullMsg, &idx, item->type,
  15059. item->sz, item->sz);
  15060. #else
  15061. ret = DoHandShakeMsgType(ssl, item->fullMsg, &idx, item->type,
  15062. item->sz, item->sz);
  15063. #endif
  15064. if (ret == 0) {
  15065. DtlsTxMsgListClean(ssl);
  15066. }
  15067. else if (!IsAtLeastTLSv1_3(ssl->version)) {
  15068. if (SendFatalAlertOnly(ssl, ret) == SOCKET_ERROR_E) {
  15069. ret = SOCKET_ERROR_E;
  15070. }
  15071. }
  15072. #ifdef WOLFSSL_ASYNC_CRYPT
  15073. if (ret == WC_PENDING_E) {
  15074. break;
  15075. }
  15076. #endif
  15077. ssl->dtls_rx_msg_list = item->next;
  15078. DtlsMsgDelete(item, ssl->heap);
  15079. item = ssl->dtls_rx_msg_list;
  15080. ssl->dtls_rx_msg_list_sz--;
  15081. }
  15082. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  15083. return ret;
  15084. }
  15085. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  15086. word32 totalSz)
  15087. {
  15088. byte type;
  15089. word32 size;
  15090. word32 fragOffset, fragSz;
  15091. int ret = 0;
  15092. int ignoreFinished = 0;
  15093. WOLFSSL_ENTER("DoDtlsHandShakeMsg");
  15094. /* parse header */
  15095. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  15096. &size, &fragOffset, &fragSz, totalSz) != 0) {
  15097. WOLFSSL_ERROR(PARSE_ERROR);
  15098. return PARSE_ERROR;
  15099. }
  15100. /* Cap the maximum size of a handshake message to something reasonable.
  15101. * By default is the maximum size of a certificate message assuming
  15102. * nine 2048-bit RSA certificates in the chain. */
  15103. if (size > MAX_HANDSHAKE_SZ) {
  15104. WOLFSSL_MSG("Handshake message too large");
  15105. return HANDSHAKE_SIZE_ERROR;
  15106. }
  15107. /* check that we have complete fragment */
  15108. if (*inOutIdx + fragSz > totalSz) {
  15109. WOLFSSL_ERROR(INCOMPLETE_DATA);
  15110. return INCOMPLETE_DATA;
  15111. }
  15112. /* check that the fragment is contained in the message */
  15113. if (fragOffset + fragSz > size) {
  15114. WOLFSSL_ERROR(LENGTH_ERROR);
  15115. return LENGTH_ERROR;
  15116. }
  15117. if (type == finished && ssl->keys.dtls_peer_handshake_number >=
  15118. ssl->keys.dtls_expected_peer_handshake_number &&
  15119. ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
  15120. /* finished msg should be ignore from the current epoch
  15121. * if it comes from a previous handshake */
  15122. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  15123. ignoreFinished = ssl->options.connectState < FINISHED_DONE;
  15124. }
  15125. else {
  15126. ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
  15127. }
  15128. }
  15129. #if !defined(NO_WOLFSSL_SERVER)
  15130. if (ssl->options.side == WOLFSSL_SERVER_END &&
  15131. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE &&
  15132. type != client_hello) {
  15133. WOLFSSL_MSG("Ignoring other messages before we verify a ClientHello");
  15134. *inOutIdx = totalSz;
  15135. return 0;
  15136. }
  15137. #endif
  15138. /* Check the handshake sequence number first. If out of order,
  15139. * add the current message to the list. If the message is in order,
  15140. * but it is a fragment, add the current message to the list, then
  15141. * check the head of the list to see if it is complete, if so, pop
  15142. * it out as the current message. If the message is complete and in
  15143. * order, process it. Check the head of the list to see if it is in
  15144. * order, if so, process it. (Repeat until list exhausted.) If the
  15145. * head is out of order, return for more processing.
  15146. */
  15147. if (ssl->keys.dtls_peer_handshake_number >
  15148. ssl->keys.dtls_expected_peer_handshake_number &&
  15149. /* Only client_hello shouldn't be ignored if the handshake
  15150. * num is greater */
  15151. (type == client_hello ||
  15152. ssl->options.handShakeState != HANDSHAKE_DONE) &&
  15153. !ignoreFinished) {
  15154. /* Current message is out of order. It will get stored in the list.
  15155. * Storing also takes care of defragmentation. If the messages is a
  15156. * client hello, we need to process this out of order; the server
  15157. * is not supposed to keep state, but the second client hello will
  15158. * have a different handshake sequence number than is expected, and
  15159. * the server shouldn't be expecting any particular handshake sequence
  15160. * number. (If the cookie changes multiple times in quick succession,
  15161. * the client could be sending multiple new client hello messages
  15162. * with newer and newer cookies.) */
  15163. if (type != client_hello) {
  15164. WOLFSSL_MSG("Current message is out of order");
  15165. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  15166. WOLFSSL_MSG("Reached rx msg limit error");
  15167. return DTLS_TOO_MANY_FRAGMENTS_E;
  15168. }
  15169. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  15170. ssl->keys.dtls_peer_handshake_number,
  15171. input + *inOutIdx, size, type,
  15172. fragOffset, fragSz, ssl->heap);
  15173. *inOutIdx += fragSz;
  15174. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15175. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  15176. word32 digestSz = MacSize(ssl);
  15177. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) {
  15178. WOLFSSL_ERROR(BUFFER_E);
  15179. return BUFFER_E;
  15180. }
  15181. *inOutIdx += digestSz;
  15182. }
  15183. else
  15184. #endif
  15185. {
  15186. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  15187. WOLFSSL_ERROR(BUFFER_E);
  15188. return BUFFER_E;
  15189. }
  15190. }
  15191. *inOutIdx += ssl->keys.padSz;
  15192. ret = 0;
  15193. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  15194. /* If we receive an out of order last flight msg then retransmit */
  15195. if (type == server_hello_done || type == finished) {
  15196. ret = DtlsMsgPoolSend(ssl, 0);
  15197. }
  15198. #endif
  15199. }
  15200. else {
  15201. if (fragSz < size) {
  15202. /* a fragmented ClientHello, very probably forged or
  15203. erroneous. Even if the packet is valid, we don't want to save
  15204. state while processing a ClientHello to avoid DoS attacks */
  15205. WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
  15206. *inOutIdx = totalSz;
  15207. }
  15208. else {
  15209. #ifdef WOLFSSL_NO_TLS12
  15210. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  15211. totalSz);
  15212. #else
  15213. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size,
  15214. totalSz);
  15215. #endif
  15216. }
  15217. }
  15218. }
  15219. else if (ssl->keys.dtls_peer_handshake_number <
  15220. ssl->keys.dtls_expected_peer_handshake_number ||
  15221. /* ignore all handshake messages if we are done with the
  15222. * handshake */
  15223. (ssl->keys.dtls_peer_handshake_number >
  15224. ssl->keys.dtls_expected_peer_handshake_number &&
  15225. ssl->options.handShakeState == HANDSHAKE_DONE) ||
  15226. ignoreFinished) {
  15227. /* Already saw this message and processed it. It can be ignored. */
  15228. WOLFSSL_MSG("Already saw this message and processed it");
  15229. *inOutIdx += fragSz;
  15230. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15231. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  15232. word32 digestSz = MacSize(ssl);
  15233. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) {
  15234. WOLFSSL_ERROR(BUFFER_E);
  15235. return BUFFER_E;
  15236. }
  15237. *inOutIdx += digestSz;
  15238. }
  15239. else
  15240. #endif
  15241. {
  15242. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  15243. WOLFSSL_ERROR(BUFFER_E);
  15244. return BUFFER_E;
  15245. }
  15246. }
  15247. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  15248. if (IsDtlsNotSctpMode(ssl) &&
  15249. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  15250. ret = DtlsMsgPoolSend(ssl, 0);
  15251. }
  15252. #endif
  15253. *inOutIdx += ssl->keys.padSz;
  15254. }
  15255. else if (fragSz < size) {
  15256. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  15257. * be pointing to the message with this fragment in it. Check it to see
  15258. * if it is completed. */
  15259. WOLFSSL_MSG("Branch is in order, but fragmented");
  15260. if (type == client_hello) {
  15261. WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
  15262. *inOutIdx = totalSz;
  15263. return 0;
  15264. }
  15265. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  15266. WOLFSSL_MSG("Reached rx msg limit error");
  15267. WOLFSSL_ERROR(DTLS_TOO_MANY_FRAGMENTS_E);
  15268. return DTLS_TOO_MANY_FRAGMENTS_E;
  15269. }
  15270. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  15271. ssl->keys.dtls_peer_handshake_number,
  15272. input + *inOutIdx, size, type,
  15273. fragOffset, fragSz, ssl->heap);
  15274. *inOutIdx += fragSz;
  15275. *inOutIdx += ssl->keys.padSz;
  15276. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15277. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  15278. word32 digestSz = MacSize(ssl);
  15279. if (*inOutIdx + digestSz > totalSz) {
  15280. WOLFSSL_ERROR(BUFFER_E);
  15281. return BUFFER_E;
  15282. }
  15283. *inOutIdx += digestSz;
  15284. }
  15285. #endif
  15286. ret = 0;
  15287. if (ssl->dtls_rx_msg_list != NULL && ssl->dtls_rx_msg_list->ready)
  15288. ret = DtlsMsgDrain(ssl);
  15289. }
  15290. else {
  15291. /* This branch is in order next, and a complete message. On success
  15292. * clean the tx list. */
  15293. WOLFSSL_MSG("Branch is in order and a complete message");
  15294. #ifdef WOLFSSL_ASYNC_CRYPT
  15295. if (ssl->devId != INVALID_DEVID) {
  15296. word32 idx = *inOutIdx;
  15297. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  15298. WOLFSSL_ERROR(BUFFER_ERROR);
  15299. return BUFFER_ERROR;
  15300. }
  15301. if (idx + fragSz + ssl->keys.padSz > totalSz)
  15302. return BUFFER_E;
  15303. *inOutIdx = idx + fragSz + ssl->keys.padSz;
  15304. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15305. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  15306. word32 digestSz = MacSize(ssl);
  15307. if (*inOutIdx + digestSz > totalSz)
  15308. return BUFFER_E;
  15309. *inOutIdx += digestSz;
  15310. }
  15311. #endif
  15312. /* In async mode always store the message and process it with
  15313. * DtlsMsgDrain because in case of a WC_PENDING_E it will be
  15314. * easier this way. */
  15315. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  15316. WOLFSSL_MSG("Reached rx msg limit error");
  15317. return DTLS_TOO_MANY_FRAGMENTS_E;
  15318. }
  15319. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  15320. ssl->keys.dtls_peer_handshake_number,
  15321. input + idx, size, type,
  15322. fragOffset, fragSz, ssl->heap);
  15323. ret = DtlsMsgDrain(ssl);
  15324. }
  15325. else
  15326. #endif
  15327. {
  15328. #ifdef WOLFSSL_NO_TLS12
  15329. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  15330. totalSz);
  15331. #else
  15332. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  15333. #endif
  15334. if (ret == 0) {
  15335. DtlsTxMsgListClean(ssl);
  15336. if (ssl->dtls_rx_msg_list != NULL) {
  15337. ret = DtlsMsgDrain(ssl);
  15338. }
  15339. }
  15340. }
  15341. }
  15342. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  15343. return ret;
  15344. }
  15345. #endif /* WOLFSSL_DTLS13 */
  15346. #ifndef WOLFSSL_NO_TLS12
  15347. #ifdef HAVE_AEAD
  15348. #if (!defined(NO_PUBLIC_GCM_SET_IV) && \
  15349. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  15350. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
  15351. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
  15352. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  15353. {
  15354. int i;
  15355. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  15356. if (++ssl->keys.aead_exp_IV[i]) return;
  15357. }
  15358. }
  15359. #endif
  15360. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && !defined(NO_CHAPOL_AEAD)
  15361. /* Used for the older version of creating AEAD tags with Poly1305 */
  15362. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  15363. byte* cipher, word16 sz, byte* tag)
  15364. {
  15365. int ret = 0;
  15366. int msglen = (sz - ssl->specs.aead_mac_size);
  15367. word32 keySz = 32;
  15368. byte padding[8]; /* used to temporarily store lengths */
  15369. #ifdef CHACHA_AEAD_TEST
  15370. printf("Using old version of poly1305 input.\n");
  15371. #endif
  15372. if (msglen < 0)
  15373. return INPUT_CASE_ERROR;
  15374. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  15375. return ret;
  15376. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  15377. AEAD_AUTH_DATA_SZ)) != 0)
  15378. return ret;
  15379. /* length of additional input plus padding */
  15380. XMEMSET(padding, 0, sizeof(padding));
  15381. padding[0] = AEAD_AUTH_DATA_SZ;
  15382. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  15383. sizeof(padding))) != 0)
  15384. return ret;
  15385. /* add cipher info and then its length */
  15386. XMEMSET(padding, 0, sizeof(padding));
  15387. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  15388. return ret;
  15389. /* 32 bit size of cipher to 64 bit endian */
  15390. padding[0] = msglen & 0xff;
  15391. padding[1] = (msglen >> 8) & 0xff;
  15392. padding[2] = ((word32)msglen >> 16) & 0xff;
  15393. padding[3] = ((word32)msglen >> 24) & 0xff;
  15394. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  15395. != 0)
  15396. return ret;
  15397. /* generate tag */
  15398. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  15399. return ret;
  15400. return ret;
  15401. }
  15402. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  15403. * the implementation follows an older draft for creating the nonce and MAC.
  15404. * The flag oldPoly gets set automatically depending on what cipher suite was
  15405. * negotiated in the handshake. This is able to be done because the IDs for the
  15406. * cipher suites was updated in RFC7905 giving unique values for the older
  15407. * draft in comparison to the more recent RFC.
  15408. *
  15409. * ssl WOLFSSL structure to get cipher and TLS state from
  15410. * out output buffer to hold encrypted data
  15411. * input data to encrypt
  15412. * sz size of input
  15413. *
  15414. * Return 0 on success negative values in error case
  15415. */
  15416. int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  15417. word16 sz)
  15418. {
  15419. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  15420. int ret = 0;
  15421. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  15422. byte tag[POLY1305_AUTH_SZ];
  15423. byte add[AEAD_AUTH_DATA_SZ];
  15424. byte nonce[CHACHA20_NONCE_SZ];
  15425. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  15426. #ifdef CHACHA_AEAD_TEST
  15427. int i;
  15428. #endif
  15429. Keys* keys = &ssl->keys;
  15430. XMEMSET(tag, 0, sizeof(tag));
  15431. XMEMSET(nonce, 0, sizeof(nonce));
  15432. XMEMSET(poly, 0, sizeof(poly));
  15433. XMEMSET(add, 0, sizeof(add));
  15434. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15435. /*
  15436. * For epochs 2+:
  15437. * * use ssl->secure_renegotiation when encrypting the current epoch as it
  15438. * has the current epoch cipher material
  15439. * * use PREV_ORDER if encrypting the epoch not in
  15440. * ssl->secure_renegotiation
  15441. */
  15442. /* opaque SEQ number stored for AD */
  15443. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  15444. if (ssl->keys.dtls_epoch ==
  15445. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  15446. keys = &ssl->secure_renegotiation->tmp_keys;
  15447. WriteSEQ(ssl, CUR_ORDER, add);
  15448. }
  15449. else
  15450. WriteSEQ(ssl, PREV_ORDER, add);
  15451. }
  15452. else
  15453. #endif
  15454. WriteSEQ(ssl, CUR_ORDER, add);
  15455. if (ssl->options.oldPoly != 0) {
  15456. /* get nonce. SEQ should not be incremented again here */
  15457. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  15458. }
  15459. /* Store the type, version. Unfortunately, they are in
  15460. * the input buffer ahead of the plaintext. */
  15461. #ifdef WOLFSSL_DTLS
  15462. if (ssl->options.dtls) {
  15463. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  15464. }
  15465. #endif
  15466. /* add TLS message size to additional data */
  15467. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  15468. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  15469. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  15470. #ifdef CHACHA_AEAD_TEST
  15471. printf("Encrypt Additional : ");
  15472. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  15473. printf("%02x", add[i]);
  15474. }
  15475. printf("\n\n");
  15476. printf("input before encryption :\n");
  15477. for (i = 0; i < sz; i++) {
  15478. printf("%02x", input[i]);
  15479. if ((i + 1) % 16 == 0)
  15480. printf("\n");
  15481. }
  15482. printf("\n");
  15483. #endif
  15484. if (ssl->options.oldPoly == 0) {
  15485. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  15486. * record sequence number XORed with client_write_IV/server_write_IV */
  15487. XMEMCPY(nonce, keys->aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  15488. nonce[4] ^= add[0];
  15489. nonce[5] ^= add[1];
  15490. nonce[6] ^= add[2];
  15491. nonce[7] ^= add[3];
  15492. nonce[8] ^= add[4];
  15493. nonce[9] ^= add[5];
  15494. nonce[10] ^= add[6];
  15495. nonce[11] ^= add[7];
  15496. }
  15497. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15498. wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
  15499. #endif
  15500. /* set the nonce for chacha and get poly1305 key */
  15501. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  15502. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15503. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15504. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15505. #endif
  15506. return ret;
  15507. }
  15508. /* create Poly1305 key using chacha20 keystream */
  15509. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  15510. poly, sizeof(poly))) != 0) {
  15511. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15512. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15513. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15514. #endif
  15515. return ret;
  15516. }
  15517. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15518. wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
  15519. #endif
  15520. /* set the counter after getting poly1305 key */
  15521. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
  15522. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15523. ForceZero(poly, sizeof(poly));
  15524. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15525. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15526. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15527. #endif
  15528. return ret;
  15529. }
  15530. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  15531. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15532. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15533. #endif
  15534. /* encrypt the plain text */
  15535. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  15536. input, msgLen)) != 0) {
  15537. ForceZero(poly, sizeof(poly));
  15538. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15539. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15540. #endif
  15541. return ret;
  15542. }
  15543. /* get the poly1305 tag using either old padding scheme or more recent */
  15544. if (ssl->options.oldPoly != 0) {
  15545. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  15546. poly, sz, tag)) != 0) {
  15547. ForceZero(poly, sizeof(poly));
  15548. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15549. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15550. #endif
  15551. return ret;
  15552. }
  15553. }
  15554. else {
  15555. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  15556. sizeof(poly))) != 0) {
  15557. ForceZero(poly, sizeof(poly));
  15558. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15559. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15560. #endif
  15561. return ret;
  15562. }
  15563. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  15564. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  15565. ForceZero(poly, sizeof(poly));
  15566. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15567. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15568. #endif
  15569. return ret;
  15570. }
  15571. }
  15572. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  15573. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15574. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15575. #endif
  15576. /* append tag to ciphertext */
  15577. XMEMCPY(out + msgLen, tag, sizeof(tag));
  15578. AeadIncrementExpIV(ssl);
  15579. #ifdef CHACHA_AEAD_TEST
  15580. printf("mac tag :\n");
  15581. for (i = 0; i < 16; i++) {
  15582. printf("%02x", tag[i]);
  15583. if ((i + 1) % 16 == 0)
  15584. printf("\n");
  15585. }
  15586. printf("\n\noutput after encrypt :\n");
  15587. for (i = 0; i < sz; i++) {
  15588. printf("%02x", out[i]);
  15589. if ((i + 1) % 16 == 0)
  15590. printf("\n");
  15591. }
  15592. printf("\n");
  15593. #endif
  15594. return ret;
  15595. }
  15596. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  15597. * the implementation follows an older draft for creating the nonce and MAC.
  15598. * The flag oldPoly gets set automatically depending on what cipher suite was
  15599. * negotiated in the handshake. This is able to be done because the IDs for the
  15600. * cipher suites was updated in RFC7905 giving unique values for the older
  15601. * draft in comparison to the more recent RFC.
  15602. *
  15603. * ssl WOLFSSL structure to get cipher and TLS state from
  15604. * plain output buffer to hold decrypted data
  15605. * input data to decrypt
  15606. * sz size of input
  15607. *
  15608. * Return 0 on success negative values in error case
  15609. */
  15610. static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  15611. word16 sz)
  15612. {
  15613. byte add[AEAD_AUTH_DATA_SZ];
  15614. byte nonce[CHACHA20_NONCE_SZ];
  15615. byte tag[POLY1305_AUTH_SZ];
  15616. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  15617. int ret = 0;
  15618. int msgLen = (sz - ssl->specs.aead_mac_size);
  15619. Keys* keys = &ssl->keys;
  15620. #ifdef CHACHA_AEAD_TEST
  15621. int i;
  15622. printf("input before decrypt :\n");
  15623. for (i = 0; i < sz; i++) {
  15624. printf("%02x", input[i]);
  15625. if ((i + 1) % 16 == 0)
  15626. printf("\n");
  15627. }
  15628. printf("\n");
  15629. #endif
  15630. XMEMSET(tag, 0, sizeof(tag));
  15631. XMEMSET(poly, 0, sizeof(poly));
  15632. XMEMSET(nonce, 0, sizeof(nonce));
  15633. XMEMSET(add, 0, sizeof(add));
  15634. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15635. /*
  15636. * For epochs 2+:
  15637. * * use ssl->secure_renegotiation when decrypting the latest epoch as it
  15638. * has the latest epoch cipher material
  15639. */
  15640. if (ssl->options.dtls && DtlsSCRKeysSet(ssl) &&
  15641. ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  15642. keys = &ssl->secure_renegotiation->tmp_keys;
  15643. #endif
  15644. /* sequence number field is 64-bits */
  15645. WriteSEQ(ssl, PEER_ORDER, add);
  15646. if (ssl->options.oldPoly != 0) {
  15647. /* get nonce, SEQ should not be incremented again here */
  15648. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  15649. }
  15650. /* get AD info */
  15651. /* Store the type, version. */
  15652. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  15653. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  15654. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  15655. /* add TLS message size to additional data */
  15656. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  15657. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  15658. #ifdef CHACHA_AEAD_TEST
  15659. printf("Decrypt Additional : ");
  15660. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  15661. printf("%02x", add[i]);
  15662. }
  15663. printf("\n\n");
  15664. #endif
  15665. if (ssl->options.oldPoly == 0) {
  15666. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  15667. * record sequence number XORed with client_write_IV/server_write_IV */
  15668. XMEMCPY(nonce, keys->aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  15669. nonce[4] ^= add[0];
  15670. nonce[5] ^= add[1];
  15671. nonce[6] ^= add[2];
  15672. nonce[7] ^= add[3];
  15673. nonce[8] ^= add[4];
  15674. nonce[9] ^= add[5];
  15675. nonce[10] ^= add[6];
  15676. nonce[11] ^= add[7];
  15677. }
  15678. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15679. wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
  15680. #endif
  15681. /* set nonce and get poly1305 key */
  15682. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  15683. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15684. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15685. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15686. #endif
  15687. return ret;
  15688. }
  15689. /* use chacha20 keystream to get poly1305 key for tag */
  15690. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  15691. poly, sizeof(poly))) != 0) {
  15692. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15693. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15694. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15695. #endif
  15696. return ret;
  15697. }
  15698. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15699. wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
  15700. #endif
  15701. /* set counter after getting poly1305 key */
  15702. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
  15703. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15704. ForceZero(poly, sizeof(poly));
  15705. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15706. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15707. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15708. #endif
  15709. return ret;
  15710. }
  15711. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  15712. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15713. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15714. #endif
  15715. /* get the tag using Poly1305 */
  15716. if (ssl->options.oldPoly != 0) {
  15717. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  15718. ForceZero(poly, sizeof(poly));
  15719. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15720. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15721. #endif
  15722. return ret;
  15723. }
  15724. }
  15725. else {
  15726. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  15727. sizeof(poly))) != 0) {
  15728. ForceZero(poly, sizeof(poly));
  15729. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15730. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15731. #endif
  15732. return ret;
  15733. }
  15734. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  15735. sizeof(add), input, msgLen, tag, sizeof(tag))) != 0) {
  15736. ForceZero(poly, sizeof(poly));
  15737. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15738. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15739. #endif
  15740. return ret;
  15741. }
  15742. }
  15743. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  15744. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15745. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15746. #endif
  15747. /* check tag sent along with packet */
  15748. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  15749. WOLFSSL_MSG("MAC did not match");
  15750. if (!ssl->options.dtls)
  15751. SendAlert(ssl, alert_fatal, bad_record_mac);
  15752. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  15753. return VERIFY_MAC_ERROR;
  15754. }
  15755. /* if the tag was good decrypt message */
  15756. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  15757. input, msgLen)) != 0)
  15758. return ret;
  15759. #ifdef CHACHA_AEAD_TEST
  15760. printf("plain after decrypt :\n");
  15761. for (i = 0; i < sz; i++) {
  15762. printf("%02x", plain[i]);
  15763. if ((i + 1) % 16 == 0)
  15764. printf("\n");
  15765. }
  15766. printf("\n");
  15767. #endif
  15768. return ret;
  15769. }
  15770. #endif /* HAVE_CHACHA && HAVE_POLY1305 && !NO_CHAPOL_AEAD*/
  15771. #endif /* HAVE_AEAD */
  15772. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15773. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  15774. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  15775. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  15776. /* The following type is used to share code between AES-GCM and AES-CCM. */
  15777. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  15778. const byte* in, word32 sz,
  15779. byte* iv, word32 ivSz,
  15780. byte* authTag, word32 authTagSz,
  15781. const byte* authIn, word32 authInSz);
  15782. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  15783. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  15784. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  15785. #else
  15786. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  15787. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  15788. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  15789. #endif
  15790. #endif
  15791. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  15792. /* The following type is used to share code between SM4-GCM and SM4-CCM. */
  15793. typedef int (*Sm4AuthEncryptFunc)(wc_Sm4* sm4, byte* out, const byte* in,
  15794. word32 sz, const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz,
  15795. const byte* aad, word32 aadSz);
  15796. typedef int (*Sm4AuthDecryptFunc)(wc_Sm4* sm4, byte* out, const byte* in,
  15797. word32 sz, const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz,
  15798. const byte* aad, word32 aadSz);
  15799. #define SM4_AUTH_ENCRYPT_FUNC Sm4AuthEncryptFunc
  15800. #define SM4_AUTH_DECRYPT_FUNC Sm4AuthDecryptFunc
  15801. #define SM4_GCM_ENCRYPT_FUNC wc_Sm4GcmEncrypt
  15802. #define SM4_CCM_ENCRYPT_FUNC wc_Sm4CcmEncrypt
  15803. #define SM4_GCM_DECRYPT_FUNC wc_Sm4GcmDecrypt
  15804. #define SM4_CCM_DECRYPT_FUNC wc_Sm4CcmDecrypt
  15805. #endif
  15806. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  15807. word16 sz, int asyncOkay)
  15808. {
  15809. int ret = 0;
  15810. #ifdef WOLFSSL_ASYNC_CRYPT
  15811. WC_ASYNC_DEV* asyncDev = NULL;
  15812. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  15813. #else
  15814. (void)asyncOkay;
  15815. #endif
  15816. (void)out;
  15817. (void)input;
  15818. (void)sz;
  15819. if (input == NULL) {
  15820. return BAD_FUNC_ARG;
  15821. }
  15822. switch (ssl->specs.bulk_cipher_algorithm) {
  15823. #ifdef BUILD_ARC4
  15824. case wolfssl_rc4:
  15825. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  15826. break;
  15827. #endif
  15828. #ifdef BUILD_DES3
  15829. case wolfssl_triple_des:
  15830. #ifdef WOLFSSL_ASYNC_CRYPT
  15831. /* initialize event */
  15832. asyncDev = &ssl->encrypt.des3->asyncDev;
  15833. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  15834. if (ret != 0)
  15835. break;
  15836. #endif
  15837. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  15838. #ifdef WOLFSSL_ASYNC_CRYPT
  15839. if (ret == WC_PENDING_E && asyncOkay) {
  15840. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15841. }
  15842. #endif
  15843. break;
  15844. #endif
  15845. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  15846. case wolfssl_aes:
  15847. #ifdef WOLFSSL_ASYNC_CRYPT
  15848. /* initialize event */
  15849. asyncDev = &ssl->encrypt.aes->asyncDev;
  15850. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  15851. if (ret != 0)
  15852. break;
  15853. #endif
  15854. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  15855. #ifdef WOLFSSL_ASYNC_CRYPT
  15856. if (ret == WC_PENDING_E && asyncOkay) {
  15857. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15858. }
  15859. #endif
  15860. break;
  15861. #endif
  15862. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15863. case wolfssl_aes_gcm:
  15864. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  15865. {
  15866. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  15867. const byte* additionalSrc;
  15868. #ifdef WOLFSSL_ASYNC_CRYPT
  15869. /* initialize event */
  15870. asyncDev = &ssl->encrypt.aes->asyncDev;
  15871. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  15872. if (ret != 0)
  15873. break;
  15874. #endif
  15875. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  15876. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  15877. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  15878. #elif defined(BUILD_AESGCM)
  15879. aes_auth_fn = AES_GCM_ENCRYPT;
  15880. #else
  15881. aes_auth_fn = AES_CCM_ENCRYPT;
  15882. #endif
  15883. additionalSrc = input - 5;
  15884. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  15885. /* sequence number field is 64-bits */
  15886. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  15887. /* Store the type, version. Unfortunately, they are in
  15888. * the input buffer ahead of the plaintext. */
  15889. #ifdef WOLFSSL_DTLS
  15890. if (ssl->options.dtls) {
  15891. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  15892. }
  15893. #endif
  15894. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  15895. additionalSrc, 3);
  15896. /* Store the length of the plain text minus the explicit
  15897. * IV length minus the authentication tag size. */
  15898. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15899. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  15900. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15901. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  15902. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  15903. XMEMCPY(ssl->encrypt.nonce,
  15904. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  15905. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  15906. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  15907. #endif
  15908. #ifdef HAVE_PK_CALLBACKS
  15909. ret = NOT_COMPILED_IN;
  15910. if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
  15911. ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 1,
  15912. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  15913. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15914. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  15915. out + sz - ssl->specs.aead_mac_size,
  15916. ssl->specs.aead_mac_size,
  15917. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  15918. }
  15919. if (ret == NOT_COMPILED_IN)
  15920. #endif /* HAVE_PK_CALLBACKS */
  15921. {
  15922. ret = aes_auth_fn(ssl->encrypt.aes,
  15923. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  15924. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15925. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  15926. out + sz - ssl->specs.aead_mac_size,
  15927. ssl->specs.aead_mac_size,
  15928. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  15929. }
  15930. #ifdef WOLFSSL_ASYNC_CRYPT
  15931. if (ret == WC_PENDING_E && asyncOkay) {
  15932. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15933. }
  15934. #endif
  15935. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15936. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  15937. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  15938. XMEMCPY(out,
  15939. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  15940. #endif
  15941. }
  15942. break;
  15943. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15944. #ifdef HAVE_ARIA
  15945. case wolfssl_aria_gcm:
  15946. {
  15947. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  15948. byte *outBuf = NULL;
  15949. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  15950. /* sequence number field is 64-bits */
  15951. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  15952. /* Store the type, version. Unfortunately, they are in
  15953. * the input buffer ahead of the plaintext. */
  15954. #ifdef WOLFSSL_DTLS
  15955. if (ssl->options.dtls) {
  15956. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  15957. }
  15958. #endif
  15959. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  15960. additionalSrc, 3);
  15961. /* Store the length of the plain text minus the explicit
  15962. * IV length minus the authentication tag size. */
  15963. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15964. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  15965. XMEMCPY(ssl->encrypt.nonce,
  15966. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  15967. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  15968. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  15969. outBuf = (byte*)XMALLOC(sz - AESGCM_EXP_IV_SZ, ssl->heap,
  15970. DYNAMIC_TYPE_TMP_BUFFER);
  15971. if (outBuf == NULL) {
  15972. ret = MEMORY_ERROR;
  15973. break;
  15974. }
  15975. ret = wc_AriaEncrypt(ssl->encrypt.aria, outBuf,
  15976. (byte*) input + AESGCM_EXP_IV_SZ,
  15977. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15978. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  15979. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ,
  15980. out + sz - ssl->specs.aead_mac_size,
  15981. ssl->specs.aead_mac_size
  15982. );
  15983. if (ret != 0)
  15984. break;
  15985. XMEMCPY(out,
  15986. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  15987. XMEMCPY(out + AESGCM_EXP_IV_SZ,outBuf,sz - AESGCM_EXP_IV_SZ);
  15988. XFREE(outBuf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  15989. break;
  15990. }
  15991. #endif
  15992. #ifdef HAVE_CAMELLIA
  15993. case wolfssl_camellia:
  15994. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  15995. break;
  15996. #endif
  15997. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  15998. !defined(NO_CHAPOL_AEAD)
  15999. case wolfssl_chacha:
  16000. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  16001. break;
  16002. #endif
  16003. #ifdef WOLFSSL_SM4_CBC
  16004. case wolfssl_sm4_cbc:
  16005. #ifdef WOLFSSL_ASYNC_CRYPT
  16006. /* initialize event */
  16007. asyncDev = &ssl->encrypt.sm4->asyncDev;
  16008. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  16009. if (ret != 0)
  16010. break;
  16011. #endif
  16012. ret = wc_Sm4CbcEncrypt(ssl->encrypt.sm4, out, input, sz);
  16013. #ifdef WOLFSSL_ASYNC_CRYPT
  16014. if (ret == WC_PENDING_E && asyncOkay) {
  16015. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  16016. }
  16017. #endif
  16018. break;
  16019. #endif
  16020. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  16021. case wolfssl_sm4_gcm:
  16022. case wolfssl_sm4_ccm:/* GCM AEAD macros use same size as CCM */
  16023. {
  16024. SM4_AUTH_ENCRYPT_FUNC sm4_auth_fn;
  16025. const byte* additionalSrc;
  16026. #ifdef WOLFSSL_ASYNC_CRYPT
  16027. /* initialize event */
  16028. asyncDev = &ssl->encrypt.sm4->asyncDev;
  16029. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  16030. if (ret != 0)
  16031. break;
  16032. #endif
  16033. #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM4_CCM)
  16034. sm4_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm)
  16035. ? SM4_GCM_ENCRYPT_FUNC : SM4_CCM_ENCRYPT_FUNC;
  16036. #elif defined(WOLFSSL_SM4_GCM)
  16037. sm4_auth_fn = SM4_GCM_ENCRYPT_FUNC;
  16038. #else
  16039. sm4_auth_fn = SM4_CCM_ENCRYPT_FUNC;
  16040. #endif
  16041. additionalSrc = input - 5;
  16042. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  16043. /* sequence number field is 64-bits */
  16044. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  16045. /* Store the type, version. Unfortunately, they are in
  16046. * the input buffer ahead of the plaintext. */
  16047. #ifdef WOLFSSL_DTLS
  16048. if (ssl->options.dtls) {
  16049. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  16050. }
  16051. #endif
  16052. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  16053. additionalSrc, 3);
  16054. /* Store the length of the plain text minus the explicit
  16055. * IV length minus the authentication tag size. */
  16056. c16toa(sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16057. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  16058. XMEMCPY(ssl->encrypt.nonce,
  16059. ssl->keys.aead_enc_imp_IV, GCM_IMP_IV_SZ);
  16060. XMEMCPY(ssl->encrypt.nonce + GCM_IMP_IV_SZ,
  16061. ssl->keys.aead_exp_IV, GCM_EXP_IV_SZ);
  16062. ret = sm4_auth_fn(ssl->encrypt.sm4,
  16063. out + GCM_EXP_IV_SZ, input + GCM_EXP_IV_SZ,
  16064. sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16065. ssl->encrypt.nonce, GCM_NONCE_SZ,
  16066. out + sz - ssl->specs.aead_mac_size,
  16067. ssl->specs.aead_mac_size,
  16068. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  16069. #ifdef WOLFSSL_ASYNC_CRYPT
  16070. if (ret == WC_PENDING_E && asyncOkay) {
  16071. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  16072. }
  16073. #endif
  16074. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  16075. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  16076. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  16077. XMEMCPY(out,
  16078. ssl->encrypt.nonce + GCM_IMP_IV_SZ, GCM_EXP_IV_SZ);
  16079. #endif
  16080. }
  16081. break;
  16082. #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
  16083. #ifdef HAVE_NULL_CIPHER
  16084. case wolfssl_cipher_null:
  16085. if (input != out) {
  16086. XMEMMOVE(out, input, sz);
  16087. }
  16088. break;
  16089. #endif
  16090. default:
  16091. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  16092. ret = ENCRYPT_ERROR;
  16093. WOLFSSL_ERROR_VERBOSE(ret);
  16094. }
  16095. #ifdef WOLFSSL_ASYNC_CRYPT
  16096. /* if async is not okay, then block */
  16097. if (ret == WC_PENDING_E && !asyncOkay) {
  16098. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  16099. }
  16100. #endif
  16101. return ret;
  16102. }
  16103. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input,
  16104. word16 sz, int asyncOkay)
  16105. {
  16106. int ret = 0;
  16107. #ifdef WOLFSSL_ASYNC_CRYPT
  16108. if (ssl->error == WC_PENDING_E) {
  16109. ssl->error = 0; /* clear async */
  16110. }
  16111. #endif
  16112. switch (ssl->encrypt.state) {
  16113. case CIPHER_STATE_BEGIN:
  16114. {
  16115. if (ssl->encrypt.setup == 0) {
  16116. WOLFSSL_MSG("Encrypt ciphers not setup");
  16117. WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
  16118. return ENCRYPT_ERROR;
  16119. }
  16120. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  16121. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  16122. XMEMCPY(ssl->encrypt.sanityCheck, input,
  16123. min(sz, sizeof(ssl->encrypt.sanityCheck)));
  16124. }
  16125. #endif
  16126. #ifdef HAVE_FUZZER
  16127. if (ssl->fuzzerCb)
  16128. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  16129. #endif
  16130. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
  16131. /* make sure AES GCM/CCM memory is allocated */
  16132. /* free for these happens in FreeCiphers */
  16133. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  16134. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm ||
  16135. ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm) {
  16136. /* make sure auth iv and auth are allocated */
  16137. if (ssl->encrypt.additional == NULL)
  16138. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  16139. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16140. if (ssl->encrypt.nonce == NULL) {
  16141. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  16142. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16143. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16144. if (ssl->encrypt.nonce != NULL) {
  16145. wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce,
  16146. AESGCM_NONCE_SZ);
  16147. }
  16148. #endif
  16149. }
  16150. if (ssl->encrypt.additional == NULL ||
  16151. ssl->encrypt.nonce == NULL) {
  16152. return MEMORY_E;
  16153. }
  16154. }
  16155. #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
  16156. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  16157. /* make sure SM4 GCM/CCM memory is allocated */
  16158. /* free for these happens in FreeCiphers */
  16159. if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
  16160. ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) {
  16161. /* make sure auth iv and auth are allocated */
  16162. if (ssl->encrypt.additional == NULL)
  16163. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  16164. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16165. if (ssl->encrypt.nonce == NULL) {
  16166. ssl->encrypt.nonce = (byte*)XMALLOC(GCM_NONCE_SZ,
  16167. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16168. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16169. if (ssl->encrypt.nonce != NULL) {
  16170. wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce,
  16171. GCM_NONCE_SZ);
  16172. }
  16173. #endif
  16174. }
  16175. if (ssl->encrypt.additional == NULL ||
  16176. ssl->encrypt.nonce == NULL) {
  16177. return MEMORY_E;
  16178. }
  16179. }
  16180. #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
  16181. /* Advance state and proceed */
  16182. ssl->encrypt.state = CIPHER_STATE_DO;
  16183. }
  16184. FALL_THROUGH;
  16185. case CIPHER_STATE_DO:
  16186. {
  16187. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  16188. /* Advance state */
  16189. ssl->encrypt.state = CIPHER_STATE_END;
  16190. #ifdef WOLFSSL_ASYNC_CRYPT
  16191. /* If pending, then leave and return will resume below */
  16192. if (ret == WC_PENDING_E) {
  16193. return ret;
  16194. }
  16195. #endif
  16196. }
  16197. FALL_THROUGH;
  16198. case CIPHER_STATE_END:
  16199. {
  16200. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  16201. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null &&
  16202. XMEMCMP(out, ssl->encrypt.sanityCheck,
  16203. min(sz, sizeof(ssl->encrypt.sanityCheck))) == 0) {
  16204. WOLFSSL_MSG("Encrypt sanity check failed! Glitch?");
  16205. WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
  16206. return ENCRYPT_ERROR;
  16207. }
  16208. ForceZero(ssl->encrypt.sanityCheck,
  16209. sizeof(ssl->encrypt.sanityCheck));
  16210. #endif
  16211. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
  16212. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  16213. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm ||
  16214. ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm)
  16215. {
  16216. /* finalize authentication cipher */
  16217. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  16218. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  16219. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  16220. AeadIncrementExpIV(ssl);
  16221. #endif
  16222. if (ssl->encrypt.nonce)
  16223. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  16224. }
  16225. #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
  16226. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  16227. if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
  16228. ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm)
  16229. {
  16230. /* finalize authentication cipher */
  16231. AeadIncrementExpIV(ssl);
  16232. if (ssl->encrypt.nonce)
  16233. ForceZero(ssl->encrypt.nonce, GCM_NONCE_SZ);
  16234. }
  16235. #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
  16236. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16237. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  16238. (out != input) && (ret == 0)) {
  16239. wc_MemZero_Add("TLS Encrypt plaintext", input, sz);
  16240. }
  16241. #endif
  16242. break;
  16243. }
  16244. default:
  16245. break;
  16246. }
  16247. /* Reset state */
  16248. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  16249. return ret;
  16250. }
  16251. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  16252. word16 sz)
  16253. {
  16254. int ret = 0;
  16255. (void)plain;
  16256. (void)input;
  16257. (void)sz;
  16258. switch (ssl->specs.bulk_cipher_algorithm)
  16259. {
  16260. #ifdef BUILD_ARC4
  16261. case wolfssl_rc4:
  16262. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  16263. break;
  16264. #endif
  16265. #ifdef BUILD_DES3
  16266. case wolfssl_triple_des:
  16267. #ifdef WOLFSSL_ASYNC_CRYPT
  16268. /* initialize event */
  16269. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  16270. WC_ASYNC_FLAG_CALL_AGAIN);
  16271. if (ret != 0)
  16272. break;
  16273. #endif
  16274. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  16275. #ifdef WOLFSSL_ASYNC_CRYPT
  16276. if (ret == WC_PENDING_E) {
  16277. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  16278. }
  16279. #endif
  16280. break;
  16281. #endif
  16282. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  16283. case wolfssl_aes:
  16284. #ifdef WOLFSSL_ASYNC_CRYPT
  16285. /* initialize event */
  16286. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  16287. WC_ASYNC_FLAG_CALL_AGAIN);
  16288. if (ret != 0)
  16289. break;
  16290. #endif
  16291. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  16292. #ifdef WOLFSSL_ASYNC_CRYPT
  16293. if (ret == WC_PENDING_E) {
  16294. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  16295. }
  16296. #endif
  16297. break;
  16298. #endif
  16299. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  16300. case wolfssl_aes_gcm:
  16301. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  16302. {
  16303. wc_AesAuthDecryptFunc aes_auth_fn;
  16304. #ifdef WOLFSSL_ASYNC_CRYPT
  16305. /* initialize event */
  16306. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  16307. WC_ASYNC_FLAG_CALL_AGAIN);
  16308. if (ret != 0)
  16309. break;
  16310. #endif
  16311. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  16312. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  16313. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  16314. #elif defined(BUILD_AESGCM)
  16315. aes_auth_fn = wc_AesGcmDecrypt;
  16316. #else
  16317. aes_auth_fn = wc_AesCcmDecrypt;
  16318. #endif
  16319. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  16320. /* sequence number field is 64-bits */
  16321. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  16322. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  16323. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  16324. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  16325. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16326. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  16327. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  16328. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  16329. XMEMCPY(ssl->decrypt.nonce,
  16330. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  16331. AESGCM_IMP_IV_SZ);
  16332. else
  16333. #endif
  16334. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  16335. AESGCM_IMP_IV_SZ);
  16336. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  16337. AESGCM_EXP_IV_SZ);
  16338. #ifdef HAVE_PK_CALLBACKS
  16339. ret = NOT_COMPILED_IN;
  16340. if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
  16341. ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 0,
  16342. plain + AESGCM_EXP_IV_SZ,
  16343. input + AESGCM_EXP_IV_SZ,
  16344. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16345. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  16346. (byte *)(input + sz - ssl->specs.aead_mac_size),
  16347. ssl->specs.aead_mac_size,
  16348. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ);
  16349. }
  16350. if (ret == NOT_COMPILED_IN)
  16351. #endif /* HAVE_PK_CALLBACKS */
  16352. {
  16353. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  16354. plain + AESGCM_EXP_IV_SZ,
  16355. input + AESGCM_EXP_IV_SZ,
  16356. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16357. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  16358. input + sz - ssl->specs.aead_mac_size,
  16359. ssl->specs.aead_mac_size,
  16360. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  16361. #ifdef WOLFSSL_ASYNC_CRYPT
  16362. if (ret == WC_PENDING_E) {
  16363. ret = wolfSSL_AsyncPush(ssl,
  16364. &ssl->decrypt.aes->asyncDev);
  16365. }
  16366. #endif
  16367. }
  16368. }
  16369. }
  16370. break;
  16371. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  16372. #ifdef HAVE_ARIA
  16373. case wolfssl_aria_gcm:
  16374. {
  16375. byte *outBuf = NULL;
  16376. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  16377. /* sequence number field is 64-bits */
  16378. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  16379. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  16380. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  16381. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  16382. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16383. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  16384. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  16385. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  16386. XMEMCPY(ssl->decrypt.nonce,
  16387. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  16388. AESGCM_IMP_IV_SZ);
  16389. else
  16390. #endif
  16391. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  16392. AESGCM_IMP_IV_SZ);
  16393. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  16394. AESGCM_EXP_IV_SZ);
  16395. outBuf = (byte*)XMALLOC(sz - AESGCM_EXP_IV_SZ, ssl->heap,
  16396. DYNAMIC_TYPE_TMP_BUFFER);
  16397. if (outBuf == NULL) {
  16398. ret = MEMORY_ERROR;
  16399. break;
  16400. }
  16401. ret = wc_AriaDecrypt(ssl->decrypt.aria, outBuf,
  16402. (byte *)input + AESGCM_EXP_IV_SZ,
  16403. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16404. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  16405. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ,
  16406. (byte *)input + sz - ssl->specs.aead_mac_size,
  16407. ssl->specs.aead_mac_size
  16408. );
  16409. if (ret != 0)
  16410. break;
  16411. XMEMCPY(plain + AESGCM_EXP_IV_SZ,
  16412. outBuf,
  16413. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size);
  16414. XFREE(outBuf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  16415. break;
  16416. }
  16417. #endif /* HAVE_ARIA */
  16418. #ifdef HAVE_CAMELLIA
  16419. case wolfssl_camellia:
  16420. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  16421. break;
  16422. #endif
  16423. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  16424. !defined(NO_CHAPOL_AEAD)
  16425. case wolfssl_chacha:
  16426. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  16427. break;
  16428. #endif
  16429. #ifdef WOLFSSL_SM4_CBC
  16430. case wolfssl_sm4_cbc:
  16431. #ifdef WOLFSSL_ASYNC_CRYPT
  16432. /* initialize event */
  16433. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  16434. WC_ASYNC_FLAG_CALL_AGAIN);
  16435. if (ret != 0)
  16436. break;
  16437. #endif
  16438. ret = wc_Sm4CbcDecrypt(ssl->decrypt.sm4, plain, input, sz);
  16439. #ifdef WOLFSSL_ASYNC_CRYPT
  16440. if (ret == WC_PENDING_E) {
  16441. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  16442. }
  16443. #endif
  16444. break;
  16445. #endif
  16446. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  16447. case wolfssl_sm4_gcm:
  16448. case wolfssl_sm4_ccm: /* GCM AEAD macros use same size as CCM */
  16449. {
  16450. SM4_AUTH_DECRYPT_FUNC sm4_auth_fn;
  16451. #ifdef WOLFSSL_ASYNC_CRYPT
  16452. /* initialize event */
  16453. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.sm4->asyncDev,
  16454. WC_ASYNC_FLAG_CALL_AGAIN);
  16455. if (ret != 0)
  16456. break;
  16457. #endif
  16458. #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM4_CCM)
  16459. sm4_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm)
  16460. ? SM4_GCM_DECRYPT_FUNC : SM4_CCM_DECRYPT_FUNC;
  16461. #elif defined(WOLFSSL_SM4_GCM)
  16462. sm4_auth_fn = SM4_GCM_DECRYPT_FUNC;
  16463. #else
  16464. sm4_auth_fn = SM4_CCM_DECRYPT_FUNC;
  16465. #endif
  16466. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  16467. /* sequence number field is 64-bits */
  16468. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  16469. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  16470. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  16471. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  16472. c16toa(sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16473. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  16474. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  16475. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  16476. XMEMCPY(ssl->decrypt.nonce,
  16477. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  16478. GCM_IMP_IV_SZ);
  16479. else
  16480. #endif
  16481. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  16482. GCM_IMP_IV_SZ);
  16483. XMEMCPY(ssl->decrypt.nonce + GCM_IMP_IV_SZ, input, GCM_EXP_IV_SZ);
  16484. if ((ret = sm4_auth_fn(ssl->decrypt.sm4,
  16485. plain + GCM_EXP_IV_SZ,
  16486. input + GCM_EXP_IV_SZ,
  16487. sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16488. ssl->decrypt.nonce, GCM_NONCE_SZ,
  16489. input + sz - ssl->specs.aead_mac_size,
  16490. ssl->specs.aead_mac_size,
  16491. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  16492. #ifdef WOLFSSL_ASYNC_CRYPT
  16493. if (ret == WC_PENDING_E) {
  16494. ret = wolfSSL_AsyncPush(ssl,
  16495. &ssl->decrypt.sm4->asyncDev);
  16496. }
  16497. #endif
  16498. }
  16499. }
  16500. break;
  16501. #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
  16502. #ifdef HAVE_NULL_CIPHER
  16503. case wolfssl_cipher_null:
  16504. if (input != plain) {
  16505. XMEMMOVE(plain, input, sz);
  16506. }
  16507. break;
  16508. #endif
  16509. default:
  16510. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  16511. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  16512. ret = DECRYPT_ERROR;
  16513. }
  16514. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16515. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  16516. (ret == 0)) {
  16517. wc_MemZero_Add("Decrypted data", plain, sz);
  16518. }
  16519. #endif
  16520. return ret;
  16521. }
  16522. static int DecryptTls(WOLFSSL* ssl, byte* plain, const byte* input, word16 sz)
  16523. {
  16524. int ret = 0;
  16525. #ifdef WOLFSSL_ASYNC_CRYPT
  16526. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  16527. if (ret != WC_NOT_PENDING_E) {
  16528. /* check for still pending */
  16529. if (ret == WC_PENDING_E)
  16530. return ret;
  16531. ssl->error = 0; /* clear async */
  16532. /* let failures through so CIPHER_STATE_END logic is run */
  16533. }
  16534. else
  16535. #endif
  16536. {
  16537. /* Reset state */
  16538. ret = 0;
  16539. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  16540. }
  16541. switch (ssl->decrypt.state) {
  16542. case CIPHER_STATE_BEGIN:
  16543. {
  16544. if (ssl->decrypt.setup == 0) {
  16545. WOLFSSL_MSG("Decrypt ciphers not setup");
  16546. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  16547. return DECRYPT_ERROR;
  16548. }
  16549. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
  16550. /* make sure AES GCM/CCM memory is allocated */
  16551. /* free for these happens in FreeCiphers */
  16552. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  16553. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm ||
  16554. ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm) {
  16555. /* make sure auth iv and auth are allocated */
  16556. if (ssl->decrypt.additional == NULL)
  16557. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  16558. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16559. if (ssl->decrypt.nonce == NULL) {
  16560. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  16561. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16562. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16563. if (ssl->decrypt.nonce != NULL) {
  16564. wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce,
  16565. AESGCM_NONCE_SZ);
  16566. }
  16567. #endif
  16568. }
  16569. if (ssl->decrypt.additional == NULL ||
  16570. ssl->decrypt.nonce == NULL) {
  16571. return MEMORY_E;
  16572. }
  16573. }
  16574. #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
  16575. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  16576. /* make sure SM4 GCM/CCM memory is allocated */
  16577. /* free for these happens in FreeCiphers */
  16578. if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
  16579. ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) {
  16580. /* make sure auth iv and auth are allocated */
  16581. if (ssl->decrypt.additional == NULL)
  16582. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  16583. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16584. if (ssl->decrypt.nonce == NULL) {
  16585. ssl->decrypt.nonce = (byte*)XMALLOC(GCM_NONCE_SZ,
  16586. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16587. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16588. if (ssl->decrypt.nonce != NULL) {
  16589. wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce,
  16590. GCM_NONCE_SZ);
  16591. }
  16592. #endif
  16593. }
  16594. if (ssl->decrypt.additional == NULL ||
  16595. ssl->decrypt.nonce == NULL) {
  16596. return MEMORY_E;
  16597. }
  16598. }
  16599. #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
  16600. /* Advance state and proceed */
  16601. ssl->decrypt.state = CIPHER_STATE_DO;
  16602. }
  16603. FALL_THROUGH;
  16604. case CIPHER_STATE_DO:
  16605. {
  16606. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  16607. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  16608. /* For epochs >1 the current cipher parameters are located in
  16609. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  16610. * parameters and for epoch 1 use ssl->keys */
  16611. if (ssl->keys.curEpoch ==
  16612. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  16613. if (ssl->decrypt.src != SCR) {
  16614. ssl->secure_renegotiation->cache_status =
  16615. SCR_CACHE_NEEDED;
  16616. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  16617. break;
  16618. }
  16619. }
  16620. else {
  16621. if (ssl->decrypt.src != KEYS) {
  16622. ssl->secure_renegotiation->cache_status =
  16623. SCR_CACHE_NULL;
  16624. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  16625. break;
  16626. }
  16627. }
  16628. }
  16629. #endif
  16630. ret = DecryptDo(ssl, plain, input, sz);
  16631. /* Advance state */
  16632. ssl->decrypt.state = CIPHER_STATE_END;
  16633. #ifdef WOLFSSL_ASYNC_CRYPT
  16634. /* If pending, leave and return below */
  16635. if (ret == WC_PENDING_E) {
  16636. return ret;
  16637. }
  16638. #endif
  16639. }
  16640. FALL_THROUGH;
  16641. case CIPHER_STATE_END:
  16642. {
  16643. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
  16644. /* make sure AES GCM/CCM nonce is cleared */
  16645. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  16646. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  16647. if (ssl->decrypt.nonce)
  16648. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  16649. if (ret < 0) {
  16650. ret = VERIFY_MAC_ERROR;
  16651. WOLFSSL_ERROR_VERBOSE(ret);
  16652. }
  16653. }
  16654. #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
  16655. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  16656. /* make sure SM4 GCM/CCM nonce is cleared */
  16657. if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
  16658. ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) {
  16659. if (ssl->decrypt.nonce)
  16660. ForceZero(ssl->decrypt.nonce, GCM_NONCE_SZ);
  16661. if (ret < 0) {
  16662. ret = VERIFY_MAC_ERROR;
  16663. WOLFSSL_ERROR_VERBOSE(ret);
  16664. }
  16665. }
  16666. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  16667. break;
  16668. }
  16669. default:
  16670. break;
  16671. }
  16672. /* Reset state */
  16673. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  16674. return ret;
  16675. }
  16676. #endif /* !WOLFSSL_NO_TLS12 */
  16677. /* Check conditions for a cipher to have an explicit IV.
  16678. *
  16679. * ssl The SSL/TLS object.
  16680. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  16681. */
  16682. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  16683. {
  16684. #ifdef WOLFSSL_TLS13
  16685. if (ssl->options.tls1_3)
  16686. return 0;
  16687. #endif
  16688. return (ssl->specs.cipher_type == aead) &&
  16689. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  16690. }
  16691. /* check cipher text size for sanity */
  16692. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  16693. {
  16694. #ifdef HAVE_TRUNCATED_HMAC
  16695. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  16696. : ssl->specs.hash_size;
  16697. #else
  16698. word32 minLength = ssl->specs.hash_size; /* covers stream */
  16699. #endif
  16700. #ifndef WOLFSSL_AEAD_ONLY
  16701. if (ssl->specs.cipher_type == block) {
  16702. #ifdef HAVE_ENCRYPT_THEN_MAC
  16703. if (ssl->options.startedETMRead) {
  16704. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  16705. WOLFSSL_MSG("Block ciphertext not block size");
  16706. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  16707. return SANITY_CIPHER_E;
  16708. }
  16709. }
  16710. else
  16711. #endif
  16712. if (encryptSz % ssl->specs.block_size) {
  16713. WOLFSSL_MSG("Block ciphertext not block size");
  16714. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  16715. return SANITY_CIPHER_E;
  16716. }
  16717. minLength++; /* pad byte */
  16718. if (ssl->specs.block_size > minLength)
  16719. minLength = ssl->specs.block_size;
  16720. if (ssl->options.tls1_1)
  16721. minLength += ssl->specs.block_size; /* explicit IV */
  16722. }
  16723. else
  16724. #endif
  16725. if (ssl->specs.cipher_type == aead) {
  16726. minLength = ssl->specs.aead_mac_size; /* authTag size */
  16727. if (CipherHasExpIV(ssl))
  16728. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  16729. }
  16730. if (encryptSz < minLength) {
  16731. WOLFSSL_MSG("Ciphertext not minimum size");
  16732. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  16733. return SANITY_CIPHER_E;
  16734. }
  16735. return 0;
  16736. }
  16737. #ifndef WOLFSSL_AEAD_ONLY
  16738. #ifdef WOLSSL_OLD_TIMINGPADVERIFY
  16739. #define COMPRESS_LOWER 64
  16740. #define COMPRESS_UPPER 55
  16741. #define COMPRESS_CONSTANT 13
  16742. #ifndef NO_OLD_TLS
  16743. static WC_INLINE void Md5Rounds(int rounds, const byte* data, int sz)
  16744. {
  16745. wc_Md5 md5;
  16746. int i;
  16747. wc_InitMd5(&md5); /* no error check on purpose, dummy round */
  16748. for (i = 0; i < rounds; i++)
  16749. wc_Md5Update(&md5, data, sz);
  16750. wc_Md5Free(&md5); /* in case needed to release resources */
  16751. }
  16752. /* do a dummy sha round */
  16753. static WC_INLINE void ShaRounds(int rounds, const byte* data, int sz)
  16754. {
  16755. wc_Sha sha;
  16756. int i;
  16757. wc_InitSha(&sha); /* no error check on purpose, dummy round */
  16758. for (i = 0; i < rounds; i++)
  16759. wc_ShaUpdate(&sha, data, sz);
  16760. wc_ShaFree(&sha); /* in case needed to release resources */
  16761. }
  16762. #endif
  16763. #ifndef NO_SHA256
  16764. static WC_INLINE void Sha256Rounds(int rounds, const byte* data, int sz)
  16765. {
  16766. wc_Sha256 sha256;
  16767. int i;
  16768. wc_InitSha256(&sha256); /* no error check on purpose, dummy round */
  16769. for (i = 0; i < rounds; i++) {
  16770. wc_Sha256Update(&sha256, data, sz);
  16771. /* no error check on purpose, dummy round */
  16772. }
  16773. wc_Sha256Free(&sha256); /* in case needed to release resources */
  16774. }
  16775. #endif
  16776. #ifdef WOLFSSL_SHA384
  16777. static WC_INLINE void Sha384Rounds(int rounds, const byte* data, int sz)
  16778. {
  16779. wc_Sha384 sha384;
  16780. int i;
  16781. wc_InitSha384(&sha384); /* no error check on purpose, dummy round */
  16782. for (i = 0; i < rounds; i++) {
  16783. wc_Sha384Update(&sha384, data, sz);
  16784. /* no error check on purpose, dummy round */
  16785. }
  16786. wc_Sha384Free(&sha384); /* in case needed to release resources */
  16787. }
  16788. #endif
  16789. #ifdef WOLFSSL_SHA512
  16790. static WC_INLINE void Sha512Rounds(int rounds, const byte* data, int sz)
  16791. {
  16792. wc_Sha512 sha512;
  16793. int i;
  16794. wc_InitSha512(&sha512); /* no error check on purpose, dummy round */
  16795. for (i = 0; i < rounds; i++) {
  16796. wc_Sha512Update(&sha512, data, sz);
  16797. /* no error check on purpose, dummy round */
  16798. }
  16799. wc_Sha512Free(&sha512); /* in case needed to release resources */
  16800. }
  16801. #endif
  16802. #ifdef WOLFSSL_RIPEMD
  16803. static WC_INLINE void RmdRounds(int rounds, const byte* data, int sz)
  16804. {
  16805. RipeMd ripemd;
  16806. int i;
  16807. wc_InitRipeMd(&ripemd);
  16808. for (i = 0; i < rounds; i++)
  16809. wc_RipeMdUpdate(&ripemd, data, sz);
  16810. }
  16811. #endif
  16812. /* Do dummy rounds */
  16813. static WC_INLINE void DoRounds(int type, int rounds, const byte* data, int sz)
  16814. {
  16815. (void)rounds;
  16816. (void)data;
  16817. (void)sz;
  16818. switch (type) {
  16819. case no_mac :
  16820. break;
  16821. #ifndef NO_OLD_TLS
  16822. #ifndef NO_MD5
  16823. case md5_mac :
  16824. Md5Rounds(rounds, data, sz);
  16825. break;
  16826. #endif
  16827. #ifndef NO_SHA
  16828. case sha_mac :
  16829. ShaRounds(rounds, data, sz);
  16830. break;
  16831. #endif
  16832. #endif
  16833. #ifndef NO_SHA256
  16834. case sha256_mac :
  16835. Sha256Rounds(rounds, data, sz);
  16836. break;
  16837. #endif
  16838. #ifdef WOLFSSL_SHA384
  16839. case sha384_mac :
  16840. Sha384Rounds(rounds, data, sz);
  16841. break;
  16842. #endif
  16843. #ifdef WOLFSSL_SHA512
  16844. case sha512_mac :
  16845. Sha512Rounds(rounds, data, sz);
  16846. break;
  16847. #endif
  16848. #ifdef WOLFSSL_RIPEMD
  16849. case rmd_mac :
  16850. RmdRounds(rounds, data, sz);
  16851. break;
  16852. #endif
  16853. default:
  16854. WOLFSSL_MSG("Bad round type");
  16855. break;
  16856. }
  16857. }
  16858. /* do number of compression rounds on dummy data */
  16859. static WC_INLINE void CompressRounds(WOLFSSL* ssl, int rounds, const byte* dummy)
  16860. {
  16861. if (rounds)
  16862. DoRounds(ssl->specs.mac_algorithm, rounds, dummy, COMPRESS_LOWER);
  16863. }
  16864. /* check all length bytes for the pad value, return 0 on success */
  16865. static int PadCheck(const byte* a, byte pad, int length)
  16866. {
  16867. int i;
  16868. int compareSum = 0;
  16869. for (i = 0; i < length; i++) {
  16870. compareSum |= a[i] ^ pad;
  16871. }
  16872. return compareSum;
  16873. }
  16874. /* get compression extra rounds */
  16875. static WC_INLINE int GetRounds(int pLen, int padLen, int t)
  16876. {
  16877. int roundL1 = 1; /* round up flags */
  16878. int roundL2 = 1;
  16879. int L1 = COMPRESS_CONSTANT + pLen - t;
  16880. int L2 = COMPRESS_CONSTANT + pLen - padLen - 1 - t;
  16881. L1 -= COMPRESS_UPPER;
  16882. L2 -= COMPRESS_UPPER;
  16883. if ( (L1 % COMPRESS_LOWER) == 0)
  16884. roundL1 = 0;
  16885. if ( (L2 % COMPRESS_LOWER) == 0)
  16886. roundL2 = 0;
  16887. L1 /= COMPRESS_LOWER;
  16888. L2 /= COMPRESS_LOWER;
  16889. L1 += roundL1;
  16890. L2 += roundL2;
  16891. return L1 - L2;
  16892. }
  16893. /* timing resistant pad/verify check, return 0 on success */
  16894. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int t,
  16895. int pLen, int content)
  16896. {
  16897. byte verify[WC_MAX_DIGEST_SIZE];
  16898. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  16899. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  16900. int ret = 0;
  16901. (void)dmy;
  16902. if ( (t + padLen + 1) > pLen) {
  16903. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  16904. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE);
  16905. /* still compare */
  16906. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  16907. ConstantCompare(verify, input + pLen - t, t);
  16908. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16909. return VERIFY_MAC_ERROR;
  16910. }
  16911. if (PadCheck(input + pLen - (padLen + 1), (byte)padLen, padLen + 1) != 0) {
  16912. WOLFSSL_MSG("PadCheck failed");
  16913. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  16914. /* still compare */
  16915. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  16916. ConstantCompare(verify, input + pLen - t, t);
  16917. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16918. return VERIFY_MAC_ERROR;
  16919. }
  16920. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  16921. ret = ssl->hmac(ssl, verify, input, pLen - padLen - 1 - t, -1, content,
  16922. 1, PEER_ORDER);
  16923. CompressRounds(ssl, GetRounds(pLen, padLen, t), dummy);
  16924. if (ConstantCompare(verify, input + (pLen - padLen - 1 - t), t) != 0) {
  16925. WOLFSSL_MSG("Verify MAC compare failed");
  16926. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16927. return VERIFY_MAC_ERROR;
  16928. }
  16929. /* treat any failure as verify MAC error */
  16930. if (ret != 0) {
  16931. ret = VERIFY_MAC_ERROR;
  16932. WOLFSSL_ERROR_VERBOSE(ret);
  16933. }
  16934. return ret;
  16935. }
  16936. #else
  16937. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  16938. /* check all length bytes for the pad value, return 0 on success */
  16939. static int PadCheck(const byte* a, byte pad, int length)
  16940. {
  16941. int i;
  16942. int compareSum = 0;
  16943. for (i = 0; i < length; i++) {
  16944. compareSum |= a[i] ^ pad;
  16945. }
  16946. return compareSum;
  16947. }
  16948. /* Mask the padding bytes with the expected values.
  16949. * Constant time implementation - does maximum pad size possible.
  16950. *
  16951. * data Message data.
  16952. * sz Size of the message including MAC and padding and padding length.
  16953. * macSz Size of the MAC.
  16954. * returns 0 on success, otherwise failure.
  16955. */
  16956. static byte MaskPadding(const byte* data, int sz, int macSz)
  16957. {
  16958. int i;
  16959. int checkSz = sz - 1;
  16960. byte paddingSz = data[sz - 1];
  16961. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  16962. if (checkSz > TLS_MAX_PAD_SZ)
  16963. checkSz = TLS_MAX_PAD_SZ;
  16964. for (i = 0; i < checkSz; i++) {
  16965. byte mask = ctMaskLTE(i, paddingSz);
  16966. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  16967. }
  16968. return good;
  16969. }
  16970. /* Mask the MAC in the message with the MAC calculated.
  16971. * Constant time implementation - starts looking for MAC where maximum padding
  16972. * size has it.
  16973. *
  16974. * data Message data.
  16975. * sz Size of the message including MAC and padding and padding length.
  16976. * macSz Size of the MAC data.
  16977. * expMac Expected MAC value.
  16978. * returns 0 on success, otherwise failure.
  16979. */
  16980. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  16981. {
  16982. int i, j;
  16983. unsigned char mac[WC_MAX_DIGEST_SIZE];
  16984. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  16985. int macEnd = sz - 1 - data[sz - 1];
  16986. int macStart = macEnd - macSz;
  16987. int r = 0;
  16988. unsigned char started, notEnded;
  16989. unsigned char good = 0;
  16990. scanStart &= ctMaskIntGTE(scanStart, 0);
  16991. macStart &= ctMaskIntGTE(macStart, 0);
  16992. /* Div on Intel has different speeds depending on value.
  16993. * Use a bitwise AND or mod a specific value (converted to mul). */
  16994. if ((macSz & (macSz - 1)) == 0)
  16995. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  16996. #ifndef NO_SHA
  16997. else if (macSz == WC_SHA_DIGEST_SIZE)
  16998. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  16999. #endif
  17000. #ifdef WOLFSSL_SHA384
  17001. else if (macSz == WC_SHA384_DIGEST_SIZE)
  17002. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  17003. #endif
  17004. XMEMSET(mac, 0, macSz);
  17005. for (i = scanStart; i < sz; i += macSz) {
  17006. for (j = 0; j < macSz && j + i < sz; j++) {
  17007. started = ctMaskGTE(i + j, macStart);
  17008. notEnded = ctMaskLT(i + j, macEnd);
  17009. mac[j] |= started & notEnded & data[i + j];
  17010. }
  17011. }
  17012. if ((macSz & (macSz - 1)) == 0) {
  17013. for (i = 0; i < macSz; i++)
  17014. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  17015. }
  17016. #ifndef NO_SHA
  17017. else if (macSz == WC_SHA_DIGEST_SIZE) {
  17018. for (i = 0; i < macSz; i++)
  17019. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  17020. }
  17021. #endif
  17022. #ifdef WOLFSSL_SHA384
  17023. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  17024. for (i = 0; i < macSz; i++)
  17025. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  17026. }
  17027. #endif
  17028. return good;
  17029. }
  17030. /* timing resistant pad/verify check, return 0 on success */
  17031. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  17032. int pLen, int content)
  17033. {
  17034. byte verify[WC_MAX_DIGEST_SIZE];
  17035. byte good;
  17036. int ret = 0;
  17037. good = MaskPadding(input, pLen, macSz);
  17038. /* 4th argument has potential to underflow, ssl->hmac function should
  17039. * either increment the size by (macSz + padLen + 1) before use or check on
  17040. * the size to make sure is valid. */
  17041. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  17042. content, 1, PEER_ORDER);
  17043. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  17044. /* Non-zero on failure. */
  17045. good = (byte)~(word32)good;
  17046. good &= good >> 4;
  17047. good &= good >> 2;
  17048. good &= good >> 1;
  17049. /* Make ret negative on masking failure. */
  17050. ret -= 1 - good;
  17051. /* Treat any failure as verify MAC error. */
  17052. if (ret != 0) {
  17053. ret = VERIFY_MAC_ERROR;
  17054. WOLFSSL_ERROR_VERBOSE(ret);
  17055. }
  17056. return ret;
  17057. }
  17058. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  17059. #endif /* WOLSSL_OLD_TIMINGPADVERIFY */
  17060. #endif /* WOLFSSL_AEAD_ONLY */
  17061. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx, int sniff)
  17062. {
  17063. word32 msgSz = WOLFSSL_IS_QUIC(ssl)? ssl->curSize : ssl->keys.encryptSz;
  17064. word32 idx = *inOutIdx;
  17065. int dataSz;
  17066. int ivExtra = 0;
  17067. byte* rawData = input + idx; /* keep current for hmac */
  17068. #ifdef HAVE_LIBZ
  17069. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  17070. #endif
  17071. #ifdef WOLFSSL_EARLY_DATA
  17072. if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
  17073. int process = 0;
  17074. if (ssl->options.side == WOLFSSL_SERVER_END) {
  17075. if ((ssl->earlyData != no_early_data) &&
  17076. (ssl->options.clientState == CLIENT_HELLO_COMPLETE)) {
  17077. process = 1;
  17078. }
  17079. if (!process) {
  17080. WOLFSSL_MSG("Ignoring EarlyData!");
  17081. *inOutIdx += ssl->curSize;
  17082. if (*inOutIdx > ssl->buffers.inputBuffer.length)
  17083. return BUFFER_E;
  17084. return 0;
  17085. }
  17086. }
  17087. if (!process) {
  17088. WOLFSSL_MSG("Received App data before a handshake completed");
  17089. if (sniff == NO_SNIFF) {
  17090. SendAlert(ssl, alert_fatal, unexpected_message);
  17091. }
  17092. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  17093. return OUT_OF_ORDER_E;
  17094. }
  17095. }
  17096. else
  17097. #endif
  17098. if (ssl->options.handShakeDone == 0) {
  17099. WOLFSSL_MSG("Received App data before a handshake completed");
  17100. if (sniff == NO_SNIFF) {
  17101. SendAlert(ssl, alert_fatal, unexpected_message);
  17102. }
  17103. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  17104. return OUT_OF_ORDER_E;
  17105. }
  17106. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  17107. /* Check if we want to invalidate old epochs. If
  17108. * ssl->dtls13InvalidateBefore is set then we want to mark all old
  17109. * epochs as encrypt only. This is done when we detect too many failed
  17110. * decryptions. We do this here to confirm that the peer has updated its
  17111. * keys and we can stop using the old keys. */
  17112. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  17113. if (!w64IsZero(ssl->dtls13InvalidateBefore) &&
  17114. w64Equal(ssl->keys.curEpoch64, ssl->dtls13InvalidateBefore)) {
  17115. Dtls13SetOlderEpochSide(ssl, ssl->dtls13InvalidateBefore,
  17116. ENCRYPT_SIDE_ONLY);
  17117. w64Zero(&ssl->dtls13InvalidateBefore);
  17118. }
  17119. }
  17120. #endif
  17121. #ifndef WOLFSSL_AEAD_ONLY
  17122. if (ssl->specs.cipher_type == block) {
  17123. if (ssl->options.tls1_1)
  17124. ivExtra = ssl->specs.block_size;
  17125. }
  17126. else
  17127. #endif
  17128. if (ssl->specs.cipher_type == aead) {
  17129. if (CipherHasExpIV(ssl))
  17130. ivExtra = AESGCM_EXP_IV_SZ;
  17131. }
  17132. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  17133. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17134. if (ssl->options.startedETMRead)
  17135. dataSz -= MacSize(ssl);
  17136. #endif
  17137. if (dataSz < 0) {
  17138. WOLFSSL_MSG("App data buffer error, malicious input?");
  17139. if (sniff == NO_SNIFF) {
  17140. SendAlert(ssl, alert_fatal, unexpected_message);
  17141. }
  17142. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  17143. return BUFFER_ERROR;
  17144. }
  17145. #ifdef WOLFSSL_EARLY_DATA
  17146. if (ssl->earlyData > early_data_ext) {
  17147. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  17148. if (sniff == NO_SNIFF) {
  17149. SendAlert(ssl, alert_fatal, unexpected_message);
  17150. }
  17151. return WOLFSSL_FATAL_ERROR;
  17152. }
  17153. ssl->earlyDataSz += dataSz;
  17154. }
  17155. #endif
  17156. /* read data */
  17157. if (dataSz) {
  17158. int rawSz = dataSz; /* keep raw size for idx adjustment */
  17159. #ifdef HAVE_LIBZ
  17160. if (ssl->options.usingCompression) {
  17161. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  17162. if (dataSz < 0) return dataSz;
  17163. }
  17164. #endif
  17165. idx += rawSz;
  17166. ssl->buffers.clearOutputBuffer.buffer = rawData;
  17167. ssl->buffers.clearOutputBuffer.length = dataSz;
  17168. }
  17169. idx += ssl->keys.padSz;
  17170. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17171. if (ssl->options.startedETMRead)
  17172. idx += MacSize(ssl);
  17173. #endif
  17174. #ifdef HAVE_LIBZ
  17175. /* decompress could be bigger, overwrite after verify */
  17176. if (ssl->options.usingCompression)
  17177. XMEMMOVE(rawData, decomp, dataSz);
  17178. #endif
  17179. *inOutIdx = idx;
  17180. #ifdef HAVE_SECURE_RENEGOTIATION
  17181. if (IsSCR(ssl)) {
  17182. /* Reset the processReply state since
  17183. * we finished processing this message. */
  17184. ssl->options.processReply = doProcessInit;
  17185. /* If we are in a secure renegotiation then APP DATA is treated
  17186. * differently */
  17187. return APP_DATA_READY;
  17188. }
  17189. #endif
  17190. return 0;
  17191. }
  17192. const char* AlertTypeToString(int type)
  17193. {
  17194. switch (type) {
  17195. case close_notify:
  17196. {
  17197. static const char close_notify_str[] =
  17198. "close_notify";
  17199. return close_notify_str;
  17200. }
  17201. case unexpected_message:
  17202. {
  17203. static const char unexpected_message_str[] =
  17204. "unexpected_message";
  17205. return unexpected_message_str;
  17206. }
  17207. case bad_record_mac:
  17208. {
  17209. static const char bad_record_mac_str[] =
  17210. "bad_record_mac";
  17211. return bad_record_mac_str;
  17212. }
  17213. case record_overflow:
  17214. {
  17215. static const char record_overflow_str[] =
  17216. "record_overflow";
  17217. return record_overflow_str;
  17218. }
  17219. case decompression_failure:
  17220. {
  17221. static const char decompression_failure_str[] =
  17222. "decompression_failure";
  17223. return decompression_failure_str;
  17224. }
  17225. case handshake_failure:
  17226. {
  17227. static const char handshake_failure_str[] =
  17228. "handshake_failure";
  17229. return handshake_failure_str;
  17230. }
  17231. case no_certificate:
  17232. {
  17233. static const char no_certificate_str[] =
  17234. "no_certificate";
  17235. return no_certificate_str;
  17236. }
  17237. case bad_certificate:
  17238. {
  17239. static const char bad_certificate_str[] =
  17240. "bad_certificate";
  17241. return bad_certificate_str;
  17242. }
  17243. case unsupported_certificate:
  17244. {
  17245. static const char unsupported_certificate_str[] =
  17246. "unsupported_certificate";
  17247. return unsupported_certificate_str;
  17248. }
  17249. case certificate_revoked:
  17250. {
  17251. static const char certificate_revoked_str[] =
  17252. "certificate_revoked";
  17253. return certificate_revoked_str;
  17254. }
  17255. case certificate_expired:
  17256. {
  17257. static const char certificate_expired_str[] =
  17258. "certificate_expired";
  17259. return certificate_expired_str;
  17260. }
  17261. case certificate_unknown:
  17262. {
  17263. static const char certificate_unknown_str[] =
  17264. "certificate_unknown";
  17265. return certificate_unknown_str;
  17266. }
  17267. case illegal_parameter:
  17268. {
  17269. static const char illegal_parameter_str[] =
  17270. "illegal_parameter";
  17271. return illegal_parameter_str;
  17272. }
  17273. case unknown_ca:
  17274. {
  17275. static const char unknown_ca_str[] =
  17276. "unknown_ca";
  17277. return unknown_ca_str;
  17278. }
  17279. case access_denied:
  17280. {
  17281. static const char access_denied_str[] =
  17282. "access_denied";
  17283. return access_denied_str;
  17284. }
  17285. case decode_error:
  17286. {
  17287. static const char decode_error_str[] =
  17288. "decode_error";
  17289. return decode_error_str;
  17290. }
  17291. case decrypt_error:
  17292. {
  17293. static const char decrypt_error_str[] =
  17294. "decrypt_error";
  17295. return decrypt_error_str;
  17296. }
  17297. case wolfssl_alert_protocol_version:
  17298. {
  17299. static const char protocol_version_str[] =
  17300. "protocol_version";
  17301. return protocol_version_str;
  17302. }
  17303. case insufficient_security:
  17304. {
  17305. static const char insufficient_security_str[] =
  17306. "insufficient_security";
  17307. return insufficient_security_str;
  17308. }
  17309. case internal_error:
  17310. {
  17311. static const char internal_error_str[] =
  17312. "internal_error";
  17313. return internal_error_str;
  17314. }
  17315. case user_canceled:
  17316. {
  17317. static const char user_canceled_str[] =
  17318. "user_canceled";
  17319. return user_canceled_str;
  17320. }
  17321. case no_renegotiation:
  17322. {
  17323. static const char no_renegotiation_str[] =
  17324. "no_renegotiation";
  17325. return no_renegotiation_str;
  17326. }
  17327. case unrecognized_name:
  17328. {
  17329. static const char unrecognized_name_str[] =
  17330. "unrecognized_name";
  17331. return unrecognized_name_str;
  17332. }
  17333. case bad_certificate_status_response:
  17334. {
  17335. static const char bad_certificate_status_response_str[] =
  17336. "bad_certificate_status_response";
  17337. return bad_certificate_status_response_str;
  17338. }
  17339. case no_application_protocol:
  17340. {
  17341. static const char no_application_protocol_str[] =
  17342. "no_application_protocol";
  17343. return no_application_protocol_str;
  17344. }
  17345. default:
  17346. WOLFSSL_MSG("Unknown Alert");
  17347. return NULL;
  17348. }
  17349. }
  17350. static void LogAlert(int type)
  17351. {
  17352. #ifdef DEBUG_WOLFSSL
  17353. const char* typeStr;
  17354. typeStr = AlertTypeToString(type);
  17355. if (typeStr != NULL) {
  17356. char buff[60];
  17357. XSNPRINTF(buff, sizeof(buff), "Alert type: %s", typeStr);
  17358. WOLFSSL_MSG(buff);
  17359. }
  17360. #else
  17361. (void)type;
  17362. #endif /* DEBUG_WOLFSSL */
  17363. }
  17364. /* process alert, return level */
  17365. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
  17366. {
  17367. byte level;
  17368. byte code;
  17369. word32 dataSz = (word32)ssl->curSize;
  17370. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17371. if (ssl->hsInfoOn)
  17372. AddPacketName(ssl, "Alert");
  17373. if (ssl->toInfoOn) {
  17374. /* add record header back on to info + alert bytes level/code */
  17375. int ret = AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx,
  17376. ALERT_SIZE, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
  17377. if (ret != 0)
  17378. return ret;
  17379. #ifdef WOLFSSL_CALLBACKS
  17380. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  17381. #endif
  17382. }
  17383. #endif
  17384. if (IsEncryptionOn(ssl, 0)) {
  17385. int ivExtra = 0;
  17386. #ifndef WOLFSSL_AEAD_ONLY
  17387. if (ssl->specs.cipher_type == block) {
  17388. if (ssl->options.tls1_1)
  17389. ivExtra = ssl->specs.block_size;
  17390. }
  17391. else
  17392. #endif
  17393. if (ssl->specs.cipher_type == aead) {
  17394. if (CipherHasExpIV(ssl))
  17395. ivExtra = AESGCM_EXP_IV_SZ;
  17396. }
  17397. dataSz -= ivExtra;
  17398. dataSz -= ssl->keys.padSz;
  17399. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17400. if (ssl->options.startedETMRead)
  17401. dataSz -= MacSize(ssl);
  17402. #endif
  17403. }
  17404. /* make sure can read the message */
  17405. if (dataSz != ALERT_SIZE) {
  17406. #ifdef WOLFSSL_EXTRA_ALERTS
  17407. SendAlert(ssl, alert_fatal, unexpected_message);
  17408. #endif
  17409. return BUFFER_E;
  17410. }
  17411. level = input[(*inOutIdx)++];
  17412. code = input[(*inOutIdx)++];
  17413. ssl->alert_history.last_rx.code = code;
  17414. ssl->alert_history.last_rx.level = level;
  17415. *type = code;
  17416. if (level == alert_fatal) {
  17417. ssl->options.isClosed = 1; /* Don't send close_notify */
  17418. }
  17419. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  17420. WOLFSSL_MSG("Alert count exceeded");
  17421. #ifdef WOLFSSL_EXTRA_ALERTS
  17422. if (level != alert_warning || code != close_notify)
  17423. SendAlert(ssl, alert_fatal, unexpected_message);
  17424. #endif
  17425. WOLFSSL_ERROR_VERBOSE(ALERT_COUNT_E);
  17426. return ALERT_COUNT_E;
  17427. }
  17428. LogAlert(*type);
  17429. if (*type == close_notify) {
  17430. ssl->options.closeNotify = 1;
  17431. }
  17432. else {
  17433. /*
  17434. * A close_notify alert doesn't mean there's been an error, so we only
  17435. * add other types of alerts to the error queue
  17436. */
  17437. WOLFSSL_ERROR(*type);
  17438. }
  17439. if (IsEncryptionOn(ssl, 0)) {
  17440. *inOutIdx += ssl->keys.padSz;
  17441. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17442. if (ssl->options.startedETMRead)
  17443. *inOutIdx += MacSize(ssl);
  17444. #endif
  17445. }
  17446. return level;
  17447. }
  17448. static int GetInputData(WOLFSSL *ssl, word32 size)
  17449. {
  17450. int inSz;
  17451. int maxLength;
  17452. int usedLength;
  17453. int dtlsExtra = 0;
  17454. /* check max input length */
  17455. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  17456. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  17457. inSz = (int)(size - usedLength); /* from last partial read */
  17458. #ifdef WOLFSSL_DTLS
  17459. if (ssl->options.dtls) {
  17460. if (size < ssl->dtls_expected_rx)
  17461. dtlsExtra = (int)(ssl->dtls_expected_rx - size);
  17462. inSz = ssl->dtls_expected_rx;
  17463. }
  17464. #endif
  17465. /* check that no lengths or size values are negative */
  17466. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  17467. return BUFFER_ERROR;
  17468. }
  17469. if (inSz > maxLength) {
  17470. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  17471. return MEMORY_E;
  17472. }
  17473. /* Put buffer data at start if not there */
  17474. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  17475. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  17476. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  17477. usedLength);
  17478. /* remove processed data */
  17479. ssl->buffers.inputBuffer.idx = 0;
  17480. ssl->buffers.inputBuffer.length = usedLength;
  17481. /* read data from network */
  17482. do {
  17483. int in = wolfSSLReceive(ssl,
  17484. ssl->buffers.inputBuffer.buffer +
  17485. ssl->buffers.inputBuffer.length,
  17486. inSz);
  17487. if (in == WANT_READ)
  17488. return WANT_READ;
  17489. if (in < 0) {
  17490. WOLFSSL_ERROR_VERBOSE(SOCKET_ERROR_E);
  17491. return SOCKET_ERROR_E;
  17492. }
  17493. if (in > inSz) {
  17494. WOLFSSL_ERROR_VERBOSE(RECV_OVERFLOW_E);
  17495. return RECV_OVERFLOW_E;
  17496. }
  17497. ssl->buffers.inputBuffer.length += in;
  17498. inSz -= in;
  17499. } while (ssl->buffers.inputBuffer.length < size);
  17500. #ifdef WOLFSSL_DEBUG_TLS
  17501. if (ssl->buffers.inputBuffer.idx == 0) {
  17502. WOLFSSL_MSG("Data received");
  17503. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  17504. ssl->buffers.inputBuffer.length);
  17505. }
  17506. #endif
  17507. return 0;
  17508. }
  17509. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17510. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  17511. int content)
  17512. {
  17513. int ret;
  17514. #ifdef HAVE_TRUNCATED_HMAC
  17515. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  17516. : ssl->specs.hash_size;
  17517. #else
  17518. word32 digestSz = ssl->specs.hash_size;
  17519. #endif
  17520. byte verify[WC_MAX_DIGEST_SIZE];
  17521. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  17522. if (msgSz < digestSz) {
  17523. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17524. return VERIFY_MAC_ERROR;
  17525. }
  17526. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
  17527. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  17528. if (ret != 0) {
  17529. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17530. return VERIFY_MAC_ERROR;
  17531. }
  17532. return 0;
  17533. }
  17534. #endif
  17535. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  17536. int content, word32* padSz)
  17537. {
  17538. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  17539. int ret;
  17540. word32 pad = 0;
  17541. word32 padByte = 0;
  17542. #ifdef HAVE_TRUNCATED_HMAC
  17543. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  17544. : ssl->specs.hash_size;
  17545. #else
  17546. word32 digestSz = ssl->specs.hash_size;
  17547. #endif
  17548. byte verify[WC_MAX_DIGEST_SIZE];
  17549. if (ssl->specs.cipher_type == block) {
  17550. int ivExtra = 0;
  17551. if (ssl->options.tls1_1)
  17552. ivExtra = ssl->specs.block_size;
  17553. pad = *(input + msgSz - ivExtra - 1);
  17554. padByte = 1;
  17555. if (ssl->options.tls) {
  17556. #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
  17557. ret = PROTOCOLCB_UNAVAILABLE;
  17558. if(ssl->ctx->VerifyMacCb) {
  17559. void* ctx = wolfSSL_GetVerifyMacCtx(ssl);
  17560. ret = ssl->ctx->VerifyMacCb(ssl, input,
  17561. (msgSz - ivExtra) - digestSz - pad - 1,
  17562. digestSz, content, ctx);
  17563. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  17564. return ret;
  17565. }
  17566. }
  17567. if (!ssl->ctx->VerifyMacCb || ret == PROTOCOLCB_UNAVAILABLE)
  17568. #endif
  17569. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  17570. content);
  17571. if (ret != 0)
  17572. return ret;
  17573. }
  17574. else { /* sslv3, some implementations have bad padding, but don't
  17575. * allow bad read */
  17576. int badPadLen = 0;
  17577. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE];
  17578. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  17579. XMEMSET(dmy, 0, sizeof(dmy));
  17580. if (pad > (msgSz - digestSz - 1)) {
  17581. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  17582. pad = 0; /* no bad read */
  17583. badPadLen = 1;
  17584. }
  17585. (void)PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  17586. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
  17587. pad, content, 1, PEER_ORDER);
  17588. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  17589. digestSz) != 0) {
  17590. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17591. return VERIFY_MAC_ERROR;
  17592. }
  17593. if (ret != 0 || badPadLen) {
  17594. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17595. return VERIFY_MAC_ERROR;
  17596. }
  17597. }
  17598. }
  17599. else if (ssl->specs.cipher_type == stream) {
  17600. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
  17601. PEER_ORDER);
  17602. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0) {
  17603. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17604. return VERIFY_MAC_ERROR;
  17605. }
  17606. if (ret != 0) {
  17607. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17608. return VERIFY_MAC_ERROR;
  17609. }
  17610. }
  17611. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  17612. if (ssl->specs.cipher_type == aead) {
  17613. *padSz = ssl->specs.aead_mac_size;
  17614. }
  17615. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  17616. else {
  17617. *padSz = digestSz + pad + padByte;
  17618. }
  17619. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  17620. (void)input;
  17621. (void)msgSz;
  17622. (void)content;
  17623. return 0;
  17624. }
  17625. #ifdef WOLFSSL_DTLS
  17626. static int HandleDTLSDecryptFailed(WOLFSSL* ssl)
  17627. {
  17628. int ret = 0;
  17629. #ifdef WOLFSSL_DTLS_DROP_STATS
  17630. ssl->macDropCount++;
  17631. #endif
  17632. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  17633. /* Handle AEAD limits specified by the RFC for failed decryption */
  17634. if (IsAtLeastTLSv1_3(ssl->version))
  17635. ret = Dtls13CheckAEADFailLimit(ssl);
  17636. #endif
  17637. (void)ssl;
  17638. WOLFSSL_MSG("DTLS: Ignoring failed decryption");
  17639. return ret;
  17640. }
  17641. static int DtlsShouldDrop(WOLFSSL* ssl, int retcode)
  17642. {
  17643. if (ssl->options.handShakeDone && !IsEncryptionOn(ssl, 0)) {
  17644. WOLFSSL_MSG("Silently dropping plaintext DTLS message "
  17645. "on established connection.");
  17646. return 1;
  17647. }
  17648. if ((ssl->options.handShakeDone && retcode != 0)
  17649. || retcode == SEQUENCE_ERROR || retcode == DTLS_CID_ERROR) {
  17650. WOLFSSL_MSG_EX("Silently dropping DTLS message: %d", retcode);
  17651. return 1;
  17652. }
  17653. #ifdef WOLFSSL_DTLS13
  17654. if (IsAtLeastTLSv1_3(ssl->version) && !w64IsZero(ssl->dtls13Epoch)
  17655. && w64IsZero(ssl->keys.curEpoch64) && ssl->curRL.type != ack) {
  17656. WOLFSSL_MSG("Silently dropping plaintext DTLS message "
  17657. "during encrypted handshake.");
  17658. return 1;
  17659. }
  17660. #endif /* WOLFSSL_DTLS13 */
  17661. #ifndef NO_WOLFSSL_SERVER
  17662. if (ssl->options.side == WOLFSSL_SERVER_END
  17663. && ssl->curRL.type != handshake && !IsSCR(ssl)) {
  17664. int beforeCookieVerified = 0;
  17665. if (!IsAtLeastTLSv1_3(ssl->version)) {
  17666. beforeCookieVerified =
  17667. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE;
  17668. }
  17669. #ifdef WOLFSSL_DTLS13
  17670. else {
  17671. beforeCookieVerified =
  17672. ssl->options.acceptState < TLS13_ACCEPT_SECOND_REPLY_DONE;
  17673. }
  17674. #endif /* WOLFSSL_DTLS13 */
  17675. if (beforeCookieVerified) {
  17676. WOLFSSL_MSG("Drop non-handshake record before handshake");
  17677. return 1;
  17678. }
  17679. }
  17680. #endif /* NO_WOLFSSL_SERVER */
  17681. return 0;
  17682. }
  17683. #endif /* WOLFSSL_DTLS */
  17684. int ProcessReply(WOLFSSL* ssl)
  17685. {
  17686. return ProcessReplyEx(ssl, 0);
  17687. }
  17688. /* Process input requests. Return 0 is done, 1 is call again to complete, and
  17689. negative number is error. If allowSocketErr is set, SOCKET_ERROR_E in
  17690. ssl->error will be whitelisted. This is useful when the connection has been
  17691. closed and the endpoint wants to check for an alert sent by the other end. */
  17692. int ProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
  17693. {
  17694. int ret = 0, type = internal_error, readSz;
  17695. int atomicUser = 0;
  17696. word32 startIdx = 0;
  17697. #if defined(WOLFSSL_DTLS)
  17698. int used;
  17699. #endif
  17700. #ifdef ATOMIC_USER
  17701. if (ssl->ctx->DecryptVerifyCb)
  17702. atomicUser = 1;
  17703. #endif
  17704. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  17705. #ifdef HAVE_SECURE_RENEGOTIATION
  17706. && ssl->error != APP_DATA_READY
  17707. #endif
  17708. #ifdef WOLFSSL_ASYNC_CRYPT
  17709. && ssl->error != WC_PENDING_E
  17710. #endif
  17711. #ifdef WOLFSSL_NONBLOCK_OCSP
  17712. && ssl->error != OCSP_WANT_READ
  17713. #endif
  17714. && (allowSocketErr != 1 || ssl->error != SOCKET_ERROR_E)
  17715. ) {
  17716. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  17717. return ssl->error;
  17718. }
  17719. /* If checking alert on error (allowSocketErr == 1) do not try and
  17720. * process alerts for async or ocsp non blocking */
  17721. #if defined(WOLFSSL_CHECK_ALERT_ON_ERR) && \
  17722. (defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP))
  17723. if (allowSocketErr == 1 && \
  17724. (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  17725. return ssl->error;
  17726. }
  17727. #endif
  17728. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
  17729. /* process any pending DTLS messages - this flow can happen with async */
  17730. if (ssl->dtls_rx_msg_list != NULL) {
  17731. word32 pendingMsg = ssl->dtls_rx_msg_list_sz;
  17732. if(IsAtLeastTLSv1_3(ssl->version)) {
  17733. #ifdef WOLFSSL_DTLS13
  17734. ret = Dtls13ProcessBufferedMessages(ssl);
  17735. #else
  17736. ret = NOT_COMPILED_IN;
  17737. #endif /* WOLFSSL_DTLS13 */
  17738. }
  17739. else {
  17740. ret = DtlsMsgDrain(ssl);
  17741. }
  17742. if (ret != 0) {
  17743. WOLFSSL_ERROR(ret);
  17744. return ret;
  17745. }
  17746. /* we processed some messages, return so connect/accept can make
  17747. progress */
  17748. if (ssl->dtls_rx_msg_list_sz != pendingMsg)
  17749. return ret;
  17750. }
  17751. #endif
  17752. ret = RetrySendAlert(ssl);
  17753. if (ret != 0)
  17754. return ret;
  17755. for (;;) {
  17756. switch (ssl->options.processReply) {
  17757. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  17758. * old client hello */
  17759. case doProcessInit:
  17760. readSz = RECORD_HEADER_SZ;
  17761. #ifdef WOLFSSL_DTLS
  17762. if (ssl->options.dtls) {
  17763. readSz = DTLS_RECORD_HEADER_SZ;
  17764. #ifdef WOLFSSL_DTLS13
  17765. if (ssl->options.tls1_3) {
  17766. /* dtls1.3 unified header can be as little as 2 bytes */
  17767. readSz = DTLS_UNIFIED_HEADER_MIN_SZ;
  17768. }
  17769. #endif /* WOLFSSL_DTLS13 */
  17770. }
  17771. #endif
  17772. /* get header or return error */
  17773. if (!ssl->options.dtls) {
  17774. if ((ret = GetInputData(ssl, readSz)) < 0)
  17775. return ret;
  17776. } else {
  17777. #ifdef WOLFSSL_DTLS
  17778. /* read ahead may already have header */
  17779. used = ssl->buffers.inputBuffer.length -
  17780. ssl->buffers.inputBuffer.idx;
  17781. if (used < readSz) {
  17782. if ((ret = GetInputData(ssl, readSz)) < 0)
  17783. return ret;
  17784. }
  17785. #endif
  17786. }
  17787. #ifdef OLD_HELLO_ALLOWED
  17788. /* see if sending SSLv2 client hello */
  17789. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  17790. ssl->options.clientState == NULL_STATE &&
  17791. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  17792. != handshake) {
  17793. byte b0, b1;
  17794. ssl->options.processReply = runProcessOldClientHello;
  17795. /* sanity checks before getting size at front */
  17796. if (ssl->buffers.inputBuffer.buffer[
  17797. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  17798. WOLFSSL_MSG("Not a valid old client hello");
  17799. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  17800. return PARSE_ERROR;
  17801. }
  17802. if (ssl->buffers.inputBuffer.buffer[
  17803. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  17804. ssl->buffers.inputBuffer.buffer[
  17805. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  17806. WOLFSSL_MSG("Not a valid version in old client hello");
  17807. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  17808. return PARSE_ERROR;
  17809. }
  17810. /* how many bytes need ProcessOldClientHello */
  17811. b0 =
  17812. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  17813. b1 =
  17814. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  17815. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  17816. }
  17817. else {
  17818. ssl->options.processReply = getRecordLayerHeader;
  17819. continue;
  17820. }
  17821. FALL_THROUGH;
  17822. /* in the WOLFSSL_SERVER case, run the old client hello */
  17823. case runProcessOldClientHello:
  17824. /* get sz bytes or return error */
  17825. if (!ssl->options.dtls) {
  17826. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  17827. return ret;
  17828. } else {
  17829. #ifdef WOLFSSL_DTLS
  17830. /* read ahead may already have */
  17831. used = ssl->buffers.inputBuffer.length -
  17832. ssl->buffers.inputBuffer.idx;
  17833. if (used < ssl->curSize)
  17834. if ((ret = GetInputData(ssl, ssl->curSize - used)) < 0)
  17835. return ret;
  17836. #endif /* WOLFSSL_DTLS */
  17837. }
  17838. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  17839. &ssl->buffers.inputBuffer.idx,
  17840. ssl->buffers.inputBuffer.length -
  17841. ssl->buffers.inputBuffer.idx,
  17842. ssl->curSize);
  17843. if (ret < 0)
  17844. return ret;
  17845. else if (ssl->buffers.inputBuffer.idx ==
  17846. ssl->buffers.inputBuffer.length) {
  17847. ssl->options.processReply = doProcessInit;
  17848. return 0;
  17849. }
  17850. #endif /* OLD_HELLO_ALLOWED */
  17851. FALL_THROUGH;
  17852. /* get the record layer header */
  17853. case getRecordLayerHeader:
  17854. /* DTLSv1.3 record numbers in the header are encrypted, and AAD
  17855. * uses the unecrypted form. Because of this we need to modify the
  17856. * header, decrypting the numbers inside
  17857. * DtlsParseUnifiedRecordLayer(). This violates the const attribute
  17858. * of the buffer parameter of GetRecordHeader() used here. */
  17859. ret = GetRecordHeader(ssl, &ssl->buffers.inputBuffer.idx,
  17860. &ssl->curRL, &ssl->curSize);
  17861. #ifdef WOLFSSL_DTLS
  17862. if (ssl->options.dtls && DtlsShouldDrop(ssl, ret)) {
  17863. ssl->options.processReply = doProcessInit;
  17864. ssl->buffers.inputBuffer.length = 0;
  17865. ssl->buffers.inputBuffer.idx = 0;
  17866. #ifdef WOLFSSL_DTLS_DROP_STATS
  17867. ssl->replayDropCount++;
  17868. #endif /* WOLFSSL_DTLS_DROP_STATS */
  17869. #ifdef WOLFSSL_DTLS13
  17870. /* return to send ACKS and shortcut rtx timer */
  17871. if (IsAtLeastTLSv1_3(ssl->version)
  17872. && ssl->dtls13Rtx.sendAcks)
  17873. return 0;
  17874. #endif /* WOLFSSL_DTLS13 */
  17875. continue;
  17876. }
  17877. #endif
  17878. if (ret != 0) {
  17879. switch (ret) {
  17880. case VERSION_ERROR:
  17881. /* send alert per RFC5246 Appendix E. Backward
  17882. * Compatibility */
  17883. if (ssl->options.side == WOLFSSL_CLIENT_END)
  17884. SendAlert(ssl, alert_fatal,
  17885. wolfssl_alert_protocol_version);
  17886. break;
  17887. #ifdef HAVE_MAX_FRAGMENT
  17888. case LENGTH_ERROR:
  17889. SendAlert(ssl, alert_fatal, record_overflow);
  17890. break;
  17891. #endif /* HAVE_MAX_FRAGMENT */
  17892. default:
  17893. break;
  17894. }
  17895. return ret;
  17896. }
  17897. #ifdef WOLFSSL_TLS13
  17898. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  17899. ssl->curRL.type != application_data &&
  17900. ssl->curRL.type != change_cipher_spec) {
  17901. SendAlert(ssl, alert_fatal, unexpected_message);
  17902. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  17903. return PARSE_ERROR;
  17904. }
  17905. #endif
  17906. ssl->options.processReply = getData;
  17907. FALL_THROUGH;
  17908. /* retrieve record layer data */
  17909. case getData:
  17910. /* get sz bytes or return error */
  17911. if (!ssl->options.dtls) {
  17912. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  17913. #ifdef WOLFSSL_EXTRA_ALERTS
  17914. if (ret != WANT_READ)
  17915. SendAlert(ssl, alert_fatal, bad_record_mac);
  17916. #endif
  17917. return ret;
  17918. }
  17919. }
  17920. else {
  17921. #ifdef WOLFSSL_DTLS
  17922. /* read ahead may already have */
  17923. used = ssl->buffers.inputBuffer.length -
  17924. ssl->buffers.inputBuffer.idx;
  17925. if (used < ssl->curSize)
  17926. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  17927. return ret;
  17928. #endif
  17929. }
  17930. if (IsEncryptionOn(ssl, 0)) {
  17931. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  17932. int tooLong = 0;
  17933. #endif
  17934. #ifdef WOLFSSL_TLS13
  17935. if (IsAtLeastTLSv1_3(ssl->version)) {
  17936. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  17937. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  17938. MAX_TLS13_PLAIN_SZ;
  17939. }
  17940. #endif
  17941. #ifdef WOLFSSL_EXTRA_ALERTS
  17942. if (!IsAtLeastTLSv1_3(ssl->version))
  17943. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  17944. #endif
  17945. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  17946. if (tooLong) {
  17947. WOLFSSL_MSG("Encrypted data too long");
  17948. SendAlert(ssl, alert_fatal, record_overflow);
  17949. return BUFFER_ERROR;
  17950. }
  17951. #endif
  17952. }
  17953. ssl->keys.padSz = 0;
  17954. ssl->options.processReply = verifyEncryptedMessage;
  17955. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  17956. FALL_THROUGH;
  17957. /* verify digest of encrypted message */
  17958. case verifyEncryptedMessage:
  17959. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17960. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  17961. !atomicUser && ssl->options.startedETMRead) {
  17962. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  17963. ssl->buffers.inputBuffer.idx,
  17964. ssl->curSize, ssl->curRL.type);
  17965. #ifdef WOLFSSL_ASYNC_CRYPT
  17966. if (ret == WC_PENDING_E)
  17967. return ret;
  17968. #endif
  17969. if (ret < 0) {
  17970. WOLFSSL_MSG("VerifyMacEnc failed");
  17971. #ifdef WOLFSSL_DTLS
  17972. /* If in DTLS mode, if the decrypt fails for any
  17973. * reason, pretend the datagram never happened. */
  17974. if (ssl->options.dtls) {
  17975. ssl->options.processReply = doProcessInit;
  17976. ssl->buffers.inputBuffer.idx =
  17977. ssl->buffers.inputBuffer.length;
  17978. return HandleDTLSDecryptFailed(ssl);
  17979. }
  17980. #endif /* WOLFSSL_DTLS */
  17981. #ifdef WOLFSSL_EXTRA_ALERTS
  17982. if (!ssl->options.dtls)
  17983. SendAlert(ssl, alert_fatal, bad_record_mac);
  17984. #endif
  17985. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  17986. return DECRYPT_ERROR;
  17987. }
  17988. ssl->keys.encryptSz = ssl->curSize;
  17989. }
  17990. #endif
  17991. ssl->options.processReply = decryptMessage;
  17992. FALL_THROUGH;
  17993. /* decrypt message */
  17994. case decryptMessage:
  17995. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  17996. (!IsAtLeastTLSv1_3(ssl->version) ||
  17997. ssl->curRL.type != change_cipher_spec))
  17998. {
  17999. bufferStatic* in = &ssl->buffers.inputBuffer;
  18000. ret = SanityCheckCipherText(ssl, ssl->curSize);
  18001. if (ret < 0) {
  18002. #ifdef WOLFSSL_EXTRA_ALERTS
  18003. SendAlert(ssl, alert_fatal, bad_record_mac);
  18004. #endif
  18005. return ret;
  18006. }
  18007. if (atomicUser) {
  18008. #ifdef ATOMIC_USER
  18009. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18010. if (ssl->options.startedETMRead) {
  18011. ret = ssl->ctx->VerifyDecryptCb(ssl,
  18012. in->buffer + in->idx, in->buffer + in->idx,
  18013. ssl->curSize - MacSize(ssl),
  18014. ssl->curRL.type, 1, &ssl->keys.padSz,
  18015. ssl->DecryptVerifyCtx);
  18016. }
  18017. else
  18018. #endif
  18019. {
  18020. ret = ssl->ctx->DecryptVerifyCb(ssl,
  18021. in->buffer + in->idx,
  18022. in->buffer + in->idx,
  18023. ssl->curSize, ssl->curRL.type, 1,
  18024. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  18025. }
  18026. #endif /* ATOMIC_USER */
  18027. }
  18028. else {
  18029. if (!ssl->options.tls1_3) {
  18030. #ifndef WOLFSSL_NO_TLS12
  18031. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18032. if (ssl->options.startedETMRead) {
  18033. word32 digestSz = MacSize(ssl);
  18034. ret = DecryptTls(ssl,
  18035. in->buffer + in->idx,
  18036. in->buffer + in->idx,
  18037. ssl->curSize - (word16)digestSz);
  18038. if (ret == 0) {
  18039. byte invalid = 0;
  18040. byte padding = (byte)-1;
  18041. word32 i;
  18042. word32 off = in->idx + ssl->curSize - digestSz - 1;
  18043. /* Last of padding bytes - indicates length. */
  18044. ssl->keys.padSz = in->buffer[off];
  18045. /* Constant time checking of padding - don't leak
  18046. * the length of the data.
  18047. */
  18048. /* Compare max pad bytes or at most data + pad. */
  18049. for (i = 1; i < MAX_PAD_SIZE && off >= i; i++) {
  18050. /* Mask on indicates this is expected to be a
  18051. * padding byte.
  18052. */
  18053. padding &= ctMaskLTE(i, ssl->keys.padSz);
  18054. /* When this is a padding byte and not equal
  18055. * to length then mask is set.
  18056. */
  18057. invalid |= padding &
  18058. ctMaskNotEq(in->buffer[off - i],
  18059. ssl->keys.padSz);
  18060. }
  18061. /* If mask is set then there was an error. */
  18062. if (invalid) {
  18063. ret = DECRYPT_ERROR;
  18064. }
  18065. ssl->keys.padSz += 1;
  18066. ssl->keys.decryptedCur = 1;
  18067. }
  18068. }
  18069. else
  18070. #endif
  18071. {
  18072. ret = DecryptTls(ssl,
  18073. in->buffer + in->idx,
  18074. in->buffer + in->idx,
  18075. ssl->curSize);
  18076. }
  18077. #else
  18078. ret = DECRYPT_ERROR;
  18079. #endif
  18080. }
  18081. else
  18082. {
  18083. #ifdef WOLFSSL_TLS13
  18084. byte *aad = (byte*)&ssl->curRL;
  18085. word16 aad_size = RECORD_HEADER_SZ;
  18086. #ifdef WOLFSSL_DTLS13
  18087. if (ssl->options.dtls) {
  18088. /* aad now points to the record header */
  18089. aad = ssl->dtls13CurRL;
  18090. aad_size = ssl->dtls13CurRlLength;
  18091. }
  18092. #endif /* WOLFSSL_DTLS13 */
  18093. /* Don't send an alert for DTLS. We will just drop it
  18094. * silently later. */
  18095. ret = DecryptTls13(ssl,
  18096. in->buffer + in->idx,
  18097. in->buffer + in->idx,
  18098. ssl->curSize,
  18099. aad, aad_size);
  18100. #else
  18101. ret = DECRYPT_ERROR;
  18102. #endif /* WOLFSSL_TLS13 */
  18103. }
  18104. (void)in;
  18105. }
  18106. #ifdef WOLFSSL_ASYNC_CRYPT
  18107. if (ret == WC_PENDING_E)
  18108. return ret;
  18109. #endif
  18110. if (ret >= 0) {
  18111. #ifndef WOLFSSL_NO_TLS12
  18112. /* handle success */
  18113. #ifndef WOLFSSL_AEAD_ONLY
  18114. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  18115. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  18116. #endif
  18117. /* go past TLSv1.1 IV */
  18118. if (CipherHasExpIV(ssl))
  18119. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  18120. #endif
  18121. }
  18122. else {
  18123. WOLFSSL_MSG("Decrypt failed");
  18124. #ifdef WOLFSSL_DTLS
  18125. /* If in DTLS mode, if the decrypt fails for any
  18126. * reason, pretend the datagram never happened. */
  18127. if (ssl->options.dtls) {
  18128. ssl->options.processReply = doProcessInit;
  18129. ssl->buffers.inputBuffer.idx =
  18130. ssl->buffers.inputBuffer.length;
  18131. return HandleDTLSDecryptFailed(ssl);
  18132. }
  18133. #endif /* WOLFSSL_DTLS */
  18134. #ifdef WOLFSSL_EARLY_DATA
  18135. if (ssl->options.tls1_3) {
  18136. if (ssl->options.side == WOLFSSL_SERVER_END &&
  18137. ssl->earlyData != no_early_data &&
  18138. ssl->options.clientState <
  18139. CLIENT_FINISHED_COMPLETE) {
  18140. ssl->earlyDataSz += ssl->curSize;
  18141. if (ssl->earlyDataSz <=
  18142. ssl->options.maxEarlyDataSz) {
  18143. WOLFSSL_MSG("Ignoring EarlyData!");
  18144. if (ssl->keys.peer_sequence_number_lo-- == 0)
  18145. ssl->keys.peer_sequence_number_hi--;
  18146. ssl->options.processReply = doProcessInit;
  18147. ssl->buffers.inputBuffer.idx += ssl->curSize;
  18148. if (ssl->buffers.inputBuffer.idx >
  18149. ssl->buffers.inputBuffer.length) {
  18150. WOLFSSL_ERROR(BUFFER_E);
  18151. return BUFFER_E;
  18152. }
  18153. return 0;
  18154. }
  18155. WOLFSSL_MSG("Too much EarlyData!");
  18156. SendAlert(ssl, alert_fatal, unexpected_message);
  18157. WOLFSSL_ERROR(TOO_MUCH_EARLY_DATA);
  18158. return TOO_MUCH_EARLY_DATA;
  18159. }
  18160. }
  18161. #endif
  18162. SendAlert(ssl, alert_fatal, bad_record_mac);
  18163. /* Push error once we know that we will error out here */
  18164. WOLFSSL_ERROR(ret);
  18165. return ret;
  18166. }
  18167. }
  18168. ssl->options.processReply = verifyMessage;
  18169. FALL_THROUGH;
  18170. /* verify digest of message */
  18171. case verifyMessage:
  18172. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  18173. (!IsAtLeastTLSv1_3(ssl->version) ||
  18174. ssl->curRL.type != change_cipher_spec))
  18175. {
  18176. if (!atomicUser
  18177. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18178. && !ssl->options.startedETMRead
  18179. #endif
  18180. ) {
  18181. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  18182. ssl->buffers.inputBuffer.idx,
  18183. ssl->curSize, ssl->curRL.type,
  18184. &ssl->keys.padSz);
  18185. #ifdef WOLFSSL_ASYNC_CRYPT
  18186. if (ret == WC_PENDING_E)
  18187. return ret;
  18188. #endif
  18189. if (ret < 0) {
  18190. #ifdef WOLFSSL_DTLS
  18191. /* If in DTLS mode, if the decrypt fails for any
  18192. * reason, pretend the datagram never happened. */
  18193. if (ssl->options.dtls) {
  18194. ssl->options.processReply = doProcessInit;
  18195. ssl->buffers.inputBuffer.idx =
  18196. ssl->buffers.inputBuffer.length;
  18197. return HandleDTLSDecryptFailed(ssl);
  18198. }
  18199. #endif /* WOLFSSL_DTLS */
  18200. #ifdef WOLFSSL_EXTRA_ALERTS
  18201. if (!ssl->options.dtls)
  18202. SendAlert(ssl, alert_fatal, bad_record_mac);
  18203. #endif
  18204. WOLFSSL_MSG("VerifyMac failed");
  18205. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  18206. return DECRYPT_ERROR;
  18207. }
  18208. }
  18209. ssl->keys.encryptSz = ssl->curSize;
  18210. ssl->keys.decryptedCur = 1;
  18211. #ifdef WOLFSSL_TLS13
  18212. if (ssl->options.tls1_3) {
  18213. /* end of plaintext */
  18214. word16 i = (word16)(ssl->buffers.inputBuffer.idx +
  18215. ssl->curSize - ssl->specs.aead_mac_size);
  18216. if (i > ssl->buffers.inputBuffer.length) {
  18217. WOLFSSL_ERROR(BUFFER_ERROR);
  18218. return BUFFER_ERROR;
  18219. }
  18220. /* Remove padding from end of plain text. */
  18221. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  18222. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  18223. break;
  18224. }
  18225. /* Get the real content type from the end of the data. */
  18226. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  18227. /* consider both contentType byte and MAC as padding */
  18228. ssl->keys.padSz = ssl->buffers.inputBuffer.idx
  18229. + ssl->curSize - i;
  18230. }
  18231. #endif
  18232. }
  18233. ssl->options.processReply = runProcessingOneRecord;
  18234. FALL_THROUGH;
  18235. /* the record layer is here */
  18236. case runProcessingOneRecord:
  18237. #ifdef WOLFSSL_DTLS13
  18238. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  18239. if(!Dtls13CheckWindow(ssl)) {
  18240. /* drop packet */
  18241. WOLFSSL_MSG(
  18242. "Dropping DTLS record outside receiving window");
  18243. ssl->options.processReply = doProcessInit;
  18244. ssl->buffers.inputBuffer.idx += ssl->curSize;
  18245. if (ssl->buffers.inputBuffer.idx >
  18246. ssl->buffers.inputBuffer.length)
  18247. return BUFFER_E;
  18248. continue;
  18249. }
  18250. ret = Dtls13UpdateWindow(ssl);
  18251. if (ret != 1) {
  18252. WOLFSSL_ERROR(ret);
  18253. return ret;
  18254. }
  18255. ret = Dtls13RecordRecvd(ssl);
  18256. if (ret != 0) {
  18257. WOLFSSL_ERROR(ret);
  18258. return ret;
  18259. }
  18260. }
  18261. #endif /* WOLFSSL_DTLS13 */
  18262. ssl->options.processReply = runProcessingOneMessage;
  18263. FALL_THROUGH;
  18264. case runProcessingOneMessage:
  18265. /* can't process a message if we have no data. */
  18266. if (ssl->buffers.inputBuffer.idx
  18267. >= ssl->buffers.inputBuffer.length) {
  18268. return BUFFER_ERROR;
  18269. }
  18270. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18271. if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
  18272. /* For TLS v1.1 the block size and explicit IV are added to idx,
  18273. * so it needs to be included in this limit check */
  18274. if ((ssl->curSize - ssl->keys.padSz -
  18275. (ssl->buffers.inputBuffer.idx - startIdx) -
  18276. MacSize(ssl) > MAX_PLAINTEXT_SZ)
  18277. #ifdef WOLFSSL_ASYNC_CRYPT
  18278. && ssl->buffers.inputBuffer.length !=
  18279. ssl->buffers.inputBuffer.idx
  18280. #endif
  18281. ) {
  18282. WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
  18283. #if defined(WOLFSSL_EXTRA_ALERTS)
  18284. SendAlert(ssl, alert_fatal, record_overflow);
  18285. #endif
  18286. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  18287. return BUFFER_ERROR;
  18288. }
  18289. }
  18290. else
  18291. #endif
  18292. /* TLS13 plaintext limit is checked earlier before decryption */
  18293. /* For TLS v1.1 the block size and explicit IV are added to idx,
  18294. * so it needs to be included in this limit check */
  18295. if (!IsAtLeastTLSv1_3(ssl->version)
  18296. && ssl->curSize - ssl->keys.padSz -
  18297. (ssl->buffers.inputBuffer.idx - startIdx)
  18298. > MAX_PLAINTEXT_SZ
  18299. #ifdef WOLFSSL_ASYNC_CRYPT
  18300. && ssl->buffers.inputBuffer.length !=
  18301. ssl->buffers.inputBuffer.idx
  18302. #endif
  18303. ) {
  18304. WOLFSSL_MSG("Plaintext too long");
  18305. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  18306. SendAlert(ssl, alert_fatal, record_overflow);
  18307. #endif
  18308. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  18309. return BUFFER_ERROR;
  18310. }
  18311. #ifdef WOLFSSL_DTLS
  18312. if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) {
  18313. _DtlsUpdateWindow(ssl);
  18314. }
  18315. if (ssl->options.dtls) {
  18316. /* Reset timeout as we have received a valid DTLS message */
  18317. ssl->dtls_timeout = ssl->dtls_timeout_init;
  18318. }
  18319. #endif /* WOLFSSL_DTLS */
  18320. WOLFSSL_MSG("received record layer msg");
  18321. switch (ssl->curRL.type) {
  18322. case handshake :
  18323. WOLFSSL_MSG("got HANDSHAKE");
  18324. /* debugging in DoHandShakeMsg */
  18325. if (ssl->options.dtls) {
  18326. #ifdef WOLFSSL_DTLS
  18327. if (!IsAtLeastTLSv1_3(ssl->version)) {
  18328. ret = DoDtlsHandShakeMsg(ssl,
  18329. ssl->buffers.inputBuffer.buffer,
  18330. &ssl->buffers.inputBuffer.idx,
  18331. ssl->buffers.inputBuffer.length);
  18332. if (ret != 0) {
  18333. if (SendFatalAlertOnly(ssl, ret)
  18334. == SOCKET_ERROR_E) {
  18335. ret = SOCKET_ERROR_E;
  18336. }
  18337. }
  18338. }
  18339. #endif
  18340. #ifdef WOLFSSL_DTLS13
  18341. if (IsAtLeastTLSv1_3(ssl->version)) {
  18342. ret = Dtls13HandshakeRecv(ssl,
  18343. ssl->buffers.inputBuffer.buffer,
  18344. &ssl->buffers.inputBuffer.idx,
  18345. ssl->buffers.inputBuffer.length);
  18346. #ifdef WOLFSSL_EARLY_DATA
  18347. if (ret == 0 &&
  18348. ssl->options.side == WOLFSSL_SERVER_END &&
  18349. ssl->earlyData > early_data_ext &&
  18350. ssl->options.handShakeState == HANDSHAKE_DONE) {
  18351. /* return so wolfSSL_read_early_data can return
  18352. exit */
  18353. ssl->earlyData = no_early_data;
  18354. ssl->options.processReply = doProcessInit;
  18355. return ZERO_RETURN;
  18356. }
  18357. #endif /* WOLFSSL_EARLY_DATA */
  18358. }
  18359. #endif /* WOLFSSL_DTLS13 */
  18360. }
  18361. else if (!IsAtLeastTLSv1_3(ssl->version)
  18362. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  18363. || !TLSv1_3_Capable(ssl)
  18364. #endif
  18365. ) {
  18366. #ifndef WOLFSSL_NO_TLS12
  18367. ret = DoHandShakeMsg(ssl,
  18368. ssl->buffers.inputBuffer.buffer,
  18369. &ssl->buffers.inputBuffer.idx,
  18370. ssl->buffers.inputBuffer.length);
  18371. if (ret != 0) {
  18372. if (SendFatalAlertOnly(ssl, ret) == SOCKET_ERROR_E)
  18373. ret = SOCKET_ERROR_E;
  18374. }
  18375. #else
  18376. ret = BUFFER_ERROR;
  18377. #endif
  18378. }
  18379. else {
  18380. #ifdef WOLFSSL_TLS13
  18381. ssl->msgsReceived.got_change_cipher = 0;
  18382. ret = DoTls13HandShakeMsg(ssl,
  18383. ssl->buffers.inputBuffer.buffer,
  18384. &ssl->buffers.inputBuffer.idx,
  18385. ssl->buffers.inputBuffer.length);
  18386. #ifdef WOLFSSL_EARLY_DATA
  18387. if (ret != 0)
  18388. return ret;
  18389. if (ssl->options.side == WOLFSSL_SERVER_END &&
  18390. ssl->earlyData > early_data_ext &&
  18391. ssl->options.handShakeState == HANDSHAKE_DONE) {
  18392. ssl->earlyData = no_early_data;
  18393. ssl->options.processReply = doProcessInit;
  18394. return ZERO_RETURN;
  18395. }
  18396. #endif
  18397. #else
  18398. ret = BUFFER_ERROR;
  18399. #endif
  18400. }
  18401. if (ret != 0
  18402. /* DoDtlsHandShakeMsg can return a WANT_WRITE when
  18403. * calling DtlsMsgPoolSend. This msg is done
  18404. * processing so let's move on. */
  18405. && (!ssl->options.dtls
  18406. || ret != WANT_WRITE)
  18407. #ifdef WOLFSSL_ASYNC_CRYPT
  18408. /* In async case, on pending, move onto next message.
  18409. * Current message should have been DtlsMsgStore'ed and
  18410. * should be processed with DtlsMsgDrain */
  18411. && (!ssl->options.dtls
  18412. || ret != WC_PENDING_E)
  18413. #endif
  18414. ) {
  18415. WOLFSSL_ERROR(ret);
  18416. return ret;
  18417. }
  18418. break;
  18419. case change_cipher_spec:
  18420. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  18421. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18422. if (ssl->hsInfoOn)
  18423. AddPacketName(ssl, "ChangeCipher");
  18424. /* add record header back on info */
  18425. if (ssl->toInfoOn) {
  18426. ret = AddPacketInfo(ssl, "ChangeCipher",
  18427. change_cipher_spec,
  18428. ssl->buffers.inputBuffer.buffer +
  18429. ssl->buffers.inputBuffer.idx,
  18430. 1, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
  18431. if (ret != 0)
  18432. return ret;
  18433. #ifdef WOLFSSL_CALLBACKS
  18434. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  18435. #endif
  18436. }
  18437. #endif
  18438. #ifdef WOLFSSL_TLS13
  18439. if (IsAtLeastTLSv1_3(ssl->version)) {
  18440. word32 i = ssl->buffers.inputBuffer.idx;
  18441. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  18442. SendAlert(ssl, alert_fatal, unexpected_message);
  18443. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  18444. return UNKNOWN_RECORD_TYPE;
  18445. }
  18446. if (ssl->curSize != 1 ||
  18447. ssl->buffers.inputBuffer.buffer[i] != 1) {
  18448. SendAlert(ssl, alert_fatal, illegal_parameter);
  18449. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  18450. return UNKNOWN_RECORD_TYPE;
  18451. }
  18452. ssl->buffers.inputBuffer.idx++;
  18453. if (!ssl->msgsReceived.got_change_cipher) {
  18454. ssl->msgsReceived.got_change_cipher = 1;
  18455. }
  18456. else {
  18457. SendAlert(ssl, alert_fatal, illegal_parameter);
  18458. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  18459. return UNKNOWN_RECORD_TYPE;
  18460. }
  18461. break;
  18462. }
  18463. #endif
  18464. #ifndef WOLFSSL_NO_TLS12
  18465. if (ssl->buffers.inputBuffer.idx >=
  18466. ssl->buffers.inputBuffer.length ||
  18467. ssl->curSize < 1) {
  18468. WOLFSSL_MSG("ChangeCipher msg too short");
  18469. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  18470. return LENGTH_ERROR;
  18471. }
  18472. if (ssl->buffers.inputBuffer.buffer[
  18473. ssl->buffers.inputBuffer.idx] != 1) {
  18474. WOLFSSL_MSG("ChangeCipher msg wrong value");
  18475. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  18476. return LENGTH_ERROR;
  18477. }
  18478. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  18479. #ifdef HAVE_AEAD
  18480. if (ssl->specs.cipher_type == aead) {
  18481. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  18482. ssl->curSize -= AESGCM_EXP_IV_SZ;
  18483. ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
  18484. ssl->curSize -= ssl->specs.aead_mac_size;
  18485. }
  18486. else
  18487. #endif
  18488. {
  18489. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  18490. ssl->curSize -= (word16)ssl->keys.padSz;
  18491. ssl->curSize -= ssl->specs.iv_size;
  18492. }
  18493. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18494. if (ssl->options.startedETMRead) {
  18495. word32 digestSz = MacSize(ssl);
  18496. ssl->buffers.inputBuffer.idx += digestSz;
  18497. ssl->curSize -= (word16)digestSz;
  18498. }
  18499. #endif
  18500. }
  18501. if (ssl->curSize != 1) {
  18502. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  18503. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  18504. return LENGTH_ERROR;
  18505. }
  18506. ssl->buffers.inputBuffer.idx++;
  18507. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  18508. if (ret != 0) {
  18509. if (!ssl->options.dtls) {
  18510. return ret;
  18511. }
  18512. else {
  18513. #ifdef WOLFSSL_DTLS
  18514. /* Check for duplicate CCS message in DTLS mode.
  18515. * DTLS allows for duplicate messages, and it should be
  18516. * skipped. Also skip if out of order. */
  18517. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  18518. return ret;
  18519. /* Reset error */
  18520. ret = 0;
  18521. break;
  18522. #endif /* WOLFSSL_DTLS */
  18523. }
  18524. }
  18525. ssl->keys.encryptionOn = 1;
  18526. /* setup decrypt keys for following messages */
  18527. /* XXX This might not be what we want to do when
  18528. * receiving a CCS with multicast. We update the
  18529. * key when the application updates them. */
  18530. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  18531. return ret;
  18532. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18533. ssl->options.startedETMRead = ssl->options.encThenMac;
  18534. #endif
  18535. #ifdef WOLFSSL_DTLS
  18536. if (ssl->options.dtls) {
  18537. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  18538. #ifdef WOLFSSL_MULTICAST
  18539. if (ssl->options.haveMcast) {
  18540. peerSeq += ssl->keys.curPeerId;
  18541. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  18542. ssl->ctx->mcastFirstSeq,
  18543. ssl->ctx->mcastSecondSeq,
  18544. ssl->ctx->mcastMaxSeq);
  18545. }
  18546. #endif
  18547. peerSeq->nextEpoch++;
  18548. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  18549. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  18550. peerSeq->nextSeq_lo = 0;
  18551. peerSeq->nextSeq_hi = 0;
  18552. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  18553. DTLS_SEQ_SZ);
  18554. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  18555. }
  18556. #endif
  18557. #ifdef HAVE_LIBZ
  18558. if (ssl->options.usingCompression)
  18559. if ( (ret = InitStreams(ssl)) != 0)
  18560. return ret;
  18561. #endif
  18562. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  18563. ssl->options.side == WOLFSSL_CLIENT_END ?
  18564. kTlsServerStr : kTlsClientStr);
  18565. if (ret != 0)
  18566. return ret;
  18567. #endif /* !WOLFSSL_NO_TLS12 */
  18568. break;
  18569. case application_data:
  18570. WOLFSSL_MSG("got app DATA");
  18571. #ifdef WOLFSSL_DTLS
  18572. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  18573. #ifdef HAVE_SECURE_RENEGOTIATION
  18574. /*
  18575. * Only free HS resources when not in the process of a
  18576. * secure renegotiation and we have received APP DATA
  18577. * from the current epoch
  18578. */
  18579. if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
  18580. || !DtlsSCRKeysSet(ssl))) {
  18581. FreeHandshakeResources(ssl);
  18582. ssl->options.dtlsHsRetain = 0;
  18583. }
  18584. #else
  18585. FreeHandshakeResources(ssl);
  18586. ssl->options.dtlsHsRetain = 0;
  18587. #endif
  18588. }
  18589. #endif
  18590. #ifdef WOLFSSL_TLS13
  18591. if (ssl->keys.keyUpdateRespond) {
  18592. WOLFSSL_MSG("No KeyUpdate from peer seen");
  18593. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  18594. return SANITY_MSG_E;
  18595. }
  18596. #endif
  18597. if ((ret = DoApplicationData(ssl,
  18598. ssl->buffers.inputBuffer.buffer,
  18599. &ssl->buffers.inputBuffer.idx,
  18600. NO_SNIFF)) != 0) {
  18601. WOLFSSL_ERROR(ret);
  18602. return ret;
  18603. }
  18604. break;
  18605. case alert:
  18606. WOLFSSL_MSG("got ALERT!");
  18607. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  18608. &ssl->buffers.inputBuffer.idx, &type);
  18609. if (ret == alert_fatal)
  18610. return FATAL_ERROR;
  18611. else if (ret < 0)
  18612. return ret;
  18613. /* catch warnings that are handled as errors */
  18614. if (type == close_notify) {
  18615. ssl->buffers.inputBuffer.idx =
  18616. ssl->buffers.inputBuffer.length;
  18617. ssl->options.processReply = doProcessInit;
  18618. return ssl->error = ZERO_RETURN;
  18619. }
  18620. if (type == decrypt_error)
  18621. return FATAL_ERROR;
  18622. /* Reset error if we got an alert level in ret */
  18623. if (ret > 0)
  18624. ret = 0;
  18625. break;
  18626. #ifdef WOLFSSL_DTLS13
  18627. case ack:
  18628. WOLFSSL_MSG("got ACK");
  18629. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  18630. word32 processedSize = 0;
  18631. ret = DoDtls13Ack(ssl, ssl->buffers.inputBuffer.buffer +
  18632. ssl->buffers.inputBuffer.idx,
  18633. ssl->buffers.inputBuffer.length -
  18634. ssl->buffers.inputBuffer.idx -
  18635. ssl->keys.padSz, &processedSize);
  18636. ssl->buffers.inputBuffer.idx += processedSize;
  18637. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  18638. if (ret != 0)
  18639. return ret;
  18640. break;
  18641. }
  18642. FALL_THROUGH;
  18643. #endif /* WOLFSSL_DTLS13 */
  18644. default:
  18645. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  18646. return UNKNOWN_RECORD_TYPE;
  18647. }
  18648. ssl->options.processReply = doProcessInit;
  18649. /* input exhausted */
  18650. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
  18651. #ifdef WOLFSSL_DTLS
  18652. /* If app data was processed then return now to avoid
  18653. * dropping any app data. */
  18654. || (ssl->options.dtls && ssl->curRL.type == application_data)
  18655. #endif
  18656. ) {
  18657. /* Shrink input buffer when we successfully finish record
  18658. * processing */
  18659. if ((ret == 0) && ssl->buffers.inputBuffer.dynamicFlag)
  18660. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  18661. return ret;
  18662. }
  18663. /* more messages per record */
  18664. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  18665. WOLFSSL_MSG("More messages in record");
  18666. ssl->options.processReply = runProcessingOneMessage;
  18667. if (IsEncryptionOn(ssl, 0)) {
  18668. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  18669. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18670. if (ssl->options.startedETMRead) {
  18671. word32 digestSz = MacSize(ssl);
  18672. if (ssl->buffers.inputBuffer.idx >=
  18673. ssl->keys.padSz + digestSz) {
  18674. ssl->buffers.inputBuffer.idx -=
  18675. ssl->keys.padSz + digestSz;
  18676. }
  18677. else {
  18678. WOLFSSL_MSG("\tmiddle padding error");
  18679. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  18680. return FATAL_ERROR;
  18681. }
  18682. }
  18683. else
  18684. #endif
  18685. {
  18686. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  18687. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  18688. }
  18689. else {
  18690. WOLFSSL_MSG("\tmiddle padding error");
  18691. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  18692. return FATAL_ERROR;
  18693. }
  18694. }
  18695. }
  18696. }
  18697. /* more records */
  18698. else {
  18699. WOLFSSL_MSG("More records in input");
  18700. }
  18701. #ifdef WOLFSSL_ASYNC_CRYPT
  18702. /* We are setup to read next message/record but we had an error
  18703. * (probably WC_PENDING_E) so return that so it can be handled
  18704. * by higher layers. */
  18705. if (ret != 0)
  18706. return ret;
  18707. #endif
  18708. /* It is safe to shrink the input buffer here now. local vars will
  18709. * be reset to the new starting value. */
  18710. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag)
  18711. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  18712. continue;
  18713. default:
  18714. WOLFSSL_MSG("Bad process input state, programming error");
  18715. WOLFSSL_ERROR_VERBOSE(INPUT_CASE_ERROR);
  18716. return INPUT_CASE_ERROR;
  18717. }
  18718. }
  18719. }
  18720. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  18721. (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
  18722. int SendChangeCipher(WOLFSSL* ssl)
  18723. {
  18724. byte *output;
  18725. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  18726. int idx = RECORD_HEADER_SZ;
  18727. int ret;
  18728. #ifdef OPENSSL_EXTRA
  18729. ssl->cbmode = SSL_CB_MODE_WRITE;
  18730. if (ssl->options.side == WOLFSSL_SERVER_END){
  18731. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  18732. if (ssl->CBIS != NULL)
  18733. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
  18734. }
  18735. else{
  18736. ssl->options.clientState =
  18737. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  18738. if (ssl->CBIS != NULL)
  18739. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  18740. }
  18741. #endif
  18742. #ifdef WOLFSSL_DTLS
  18743. if (ssl->options.dtls) {
  18744. sendSz += DTLS_RECORD_EXTRA;
  18745. idx += DTLS_RECORD_EXTRA;
  18746. }
  18747. #endif
  18748. /* are we in scr */
  18749. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  18750. sendSz += MAX_MSG_EXTRA;
  18751. }
  18752. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  18753. * is not advanced yet */
  18754. ssl->options.buildingMsg = 1;
  18755. /* check for available size */
  18756. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  18757. return ret;
  18758. /* get output buffer */
  18759. output = GetOutputBuffer(ssl);
  18760. AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
  18761. output[idx] = 1; /* turn it on */
  18762. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  18763. byte input[ENUM_LEN];
  18764. int inputSz = ENUM_LEN;
  18765. input[0] = 1; /* turn it on */
  18766. #ifdef WOLFSSL_DTLS
  18767. if (IsDtlsNotSctpMode(ssl) &&
  18768. (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
  18769. return ret;
  18770. }
  18771. #endif
  18772. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  18773. change_cipher_spec, 0, 0, 0, CUR_ORDER);
  18774. if (sendSz < 0) {
  18775. return sendSz;
  18776. }
  18777. }
  18778. #ifdef WOLFSSL_DTLS
  18779. else {
  18780. if (IsDtlsNotSctpMode(ssl)) {
  18781. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
  18782. return ret;
  18783. DtlsSEQIncrement(ssl, CUR_ORDER);
  18784. }
  18785. }
  18786. #endif
  18787. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18788. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  18789. if (ssl->toInfoOn) {
  18790. ret = AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  18791. sendSz, WRITE_PROTO, 0, ssl->heap);
  18792. if (ret != 0)
  18793. return ret;
  18794. }
  18795. #endif
  18796. ssl->buffers.outputBuffer.length += sendSz;
  18797. #ifdef WOLFSSL_TLS13
  18798. if (!ssl->options.tls1_3)
  18799. #endif
  18800. {
  18801. /* setup encrypt keys */
  18802. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  18803. return ret;
  18804. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18805. ssl->options.startedETMWrite = ssl->options.encThenMac;
  18806. #endif
  18807. }
  18808. ssl->options.buildingMsg = 0;
  18809. if (ssl->options.groupMessages)
  18810. return 0;
  18811. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  18812. else if (ssl->options.dtls) {
  18813. /* If using DTLS, force the ChangeCipherSpec message to be in the
  18814. * same datagram as the finished message. */
  18815. return 0;
  18816. }
  18817. #endif
  18818. else
  18819. return SendBuffered(ssl);
  18820. }
  18821. #endif
  18822. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  18823. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  18824. int padLen, int content, int verify, int epochOrder)
  18825. {
  18826. byte result[WC_MAX_DIGEST_SIZE];
  18827. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  18828. word32 padSz = ssl->specs.pad_size;
  18829. int ret = 0;
  18830. wc_Md5 md5;
  18831. wc_Sha sha;
  18832. /* data */
  18833. byte seq[SEQ_SZ];
  18834. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  18835. const byte* macSecret = NULL;
  18836. (void)padLen;
  18837. #ifdef HAVE_FUZZER
  18838. if (ssl->fuzzerCb)
  18839. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  18840. #endif
  18841. #ifdef WOLFSSL_DTLS
  18842. if (ssl->options.dtls)
  18843. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  18844. else
  18845. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  18846. #else
  18847. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  18848. #endif
  18849. XMEMSET(seq, 0, SEQ_SZ);
  18850. conLen[0] = (byte)content;
  18851. c16toa((word16)sz, &conLen[ENUM_LEN]);
  18852. WriteSEQ(ssl, epochOrder, seq);
  18853. if (ssl->specs.mac_algorithm == md5_mac) {
  18854. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  18855. if (ret != 0)
  18856. return ret;
  18857. /* inner */
  18858. ret = wc_Md5Update(&md5, macSecret, digestSz);
  18859. ret |= wc_Md5Update(&md5, PAD1, padSz);
  18860. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  18861. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  18862. /* in buffer */
  18863. ret |= wc_Md5Update(&md5, in, sz);
  18864. if (ret != 0) {
  18865. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18866. return VERIFY_MAC_ERROR;
  18867. }
  18868. ret = wc_Md5Final(&md5, result);
  18869. #ifdef WOLFSSL_ASYNC_CRYPT
  18870. /* TODO: Make non-blocking */
  18871. if (ret == WC_PENDING_E) {
  18872. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  18873. }
  18874. #endif
  18875. if (ret != 0) {
  18876. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18877. return VERIFY_MAC_ERROR;
  18878. }
  18879. /* outer */
  18880. ret = wc_Md5Update(&md5, macSecret, digestSz);
  18881. ret |= wc_Md5Update(&md5, PAD2, padSz);
  18882. ret |= wc_Md5Update(&md5, result, digestSz);
  18883. if (ret != 0) {
  18884. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18885. return VERIFY_MAC_ERROR;
  18886. }
  18887. ret = wc_Md5Final(&md5, digest);
  18888. #ifdef WOLFSSL_ASYNC_CRYPT
  18889. /* TODO: Make non-blocking */
  18890. if (ret == WC_PENDING_E) {
  18891. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  18892. }
  18893. #endif
  18894. if (ret != 0) {
  18895. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18896. return VERIFY_MAC_ERROR;
  18897. }
  18898. wc_Md5Free(&md5);
  18899. }
  18900. else {
  18901. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  18902. if (ret != 0)
  18903. return ret;
  18904. /* inner */
  18905. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  18906. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  18907. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  18908. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  18909. /* in buffer */
  18910. ret |= wc_ShaUpdate(&sha, in, sz);
  18911. if (ret != 0) {
  18912. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18913. return VERIFY_MAC_ERROR;
  18914. }
  18915. ret = wc_ShaFinal(&sha, result);
  18916. #ifdef WOLFSSL_ASYNC_CRYPT
  18917. /* TODO: Make non-blocking */
  18918. if (ret == WC_PENDING_E) {
  18919. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  18920. }
  18921. #endif
  18922. if (ret != 0) {
  18923. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18924. return VERIFY_MAC_ERROR;
  18925. }
  18926. /* outer */
  18927. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  18928. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  18929. ret |= wc_ShaUpdate(&sha, result, digestSz);
  18930. if (ret != 0) {
  18931. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18932. return VERIFY_MAC_ERROR;
  18933. }
  18934. ret = wc_ShaFinal(&sha, digest);
  18935. #ifdef WOLFSSL_ASYNC_CRYPT
  18936. /* TODO: Make non-blocking */
  18937. if (ret == WC_PENDING_E) {
  18938. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  18939. }
  18940. #endif
  18941. if (ret != 0) {
  18942. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18943. return VERIFY_MAC_ERROR;
  18944. }
  18945. wc_ShaFree(&sha);
  18946. }
  18947. return 0;
  18948. }
  18949. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  18950. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  18951. static int BuildMD5_CertVerify(const WOLFSSL* ssl, byte* digest)
  18952. {
  18953. int ret;
  18954. byte md5_result[WC_MD5_DIGEST_SIZE];
  18955. #ifdef WOLFSSL_SMALL_STACK
  18956. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  18957. #else
  18958. wc_Md5 md5[1];
  18959. #endif
  18960. /* make md5 inner */
  18961. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  18962. if (ret == 0)
  18963. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  18964. if (ret == 0)
  18965. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  18966. if (ret == 0)
  18967. ret = wc_Md5Final(md5, md5_result);
  18968. /* make md5 outer */
  18969. if (ret == 0) {
  18970. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  18971. if (ret == 0) {
  18972. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  18973. if (ret == 0)
  18974. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  18975. if (ret == 0)
  18976. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  18977. if (ret == 0)
  18978. ret = wc_Md5Final(md5, digest);
  18979. wc_Md5Free(md5);
  18980. }
  18981. }
  18982. #ifdef WOLFSSL_SMALL_STACK
  18983. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  18984. #endif
  18985. return ret;
  18986. }
  18987. #endif /* !NO_MD5 && !NO_OLD_TLS */
  18988. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  18989. defined(WOLFSSL_ALLOW_TLS_SHA1))
  18990. static int BuildSHA_CertVerify(const WOLFSSL* ssl, byte* digest)
  18991. {
  18992. int ret;
  18993. byte sha_result[WC_SHA_DIGEST_SIZE];
  18994. #ifdef WOLFSSL_SMALL_STACK
  18995. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  18996. #else
  18997. wc_Sha sha[1];
  18998. #endif
  18999. /* make sha inner */
  19000. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  19001. if (ret == 0)
  19002. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  19003. if (ret == 0)
  19004. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  19005. if (ret == 0)
  19006. ret = wc_ShaFinal(sha, sha_result);
  19007. /* make sha outer */
  19008. if (ret == 0) {
  19009. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  19010. if (ret == 0) {
  19011. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  19012. if (ret == 0)
  19013. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  19014. if (ret == 0)
  19015. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  19016. if (ret == 0)
  19017. ret = wc_ShaFinal(sha, digest);
  19018. wc_ShaFree(sha);
  19019. }
  19020. }
  19021. #ifdef WOLFSSL_SMALL_STACK
  19022. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  19023. #endif
  19024. return ret;
  19025. }
  19026. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  19027. int BuildCertHashes(const WOLFSSL* ssl, Hashes* hashes)
  19028. {
  19029. int ret = 0;
  19030. (void)hashes;
  19031. if (ssl->options.tls) {
  19032. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  19033. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  19034. if (ret != 0)
  19035. return ret;
  19036. #endif
  19037. #if !defined(NO_SHA)
  19038. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  19039. if (ret != 0)
  19040. return ret;
  19041. #endif
  19042. if (IsAtLeastTLSv1_2(ssl)) {
  19043. #ifndef NO_SHA256
  19044. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  19045. hashes->sha256);
  19046. if (ret != 0)
  19047. return ret;
  19048. #endif
  19049. #ifdef WOLFSSL_SHA384
  19050. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  19051. hashes->sha384);
  19052. if (ret != 0)
  19053. return ret;
  19054. #endif
  19055. #ifdef WOLFSSL_SHA512
  19056. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  19057. hashes->sha512);
  19058. if (ret != 0)
  19059. return ret;
  19060. #endif
  19061. #ifdef WOLFSSL_SM3
  19062. ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3,
  19063. hashes->sm3);
  19064. if (ret != 0)
  19065. return ret;
  19066. #endif
  19067. }
  19068. }
  19069. else {
  19070. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  19071. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  19072. if (ret != 0)
  19073. return ret;
  19074. #endif
  19075. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  19076. defined(WOLFSSL_ALLOW_TLS_SHA1))
  19077. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  19078. if (ret != 0)
  19079. return ret;
  19080. #endif
  19081. }
  19082. return ret;
  19083. }
  19084. #ifndef WOLFSSL_NO_TLS12
  19085. void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
  19086. {
  19087. (void)ssl;
  19088. if (args
  19089. #ifdef WOLFSSL_ASYNC_CRYPT
  19090. && ssl->options.buildArgsSet
  19091. #endif
  19092. ) {
  19093. /* only free the IV if it was dynamically allocated */
  19094. if (args->iv && (args->iv != args->staticIvBuffer)) {
  19095. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  19096. }
  19097. }
  19098. #ifdef WOLFSSL_ASYNC_CRYPT
  19099. ssl->options.buildArgsSet = 0;
  19100. #endif
  19101. }
  19102. #endif
  19103. /* Build SSL Message, encrypted */
  19104. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  19105. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
  19106. int epochOrder)
  19107. {
  19108. #ifndef WOLFSSL_NO_TLS12
  19109. int ret;
  19110. BuildMsgArgs* args;
  19111. BuildMsgArgs lcl_args;
  19112. #endif
  19113. WOLFSSL_ENTER("BuildMessage");
  19114. if (ssl == NULL) {
  19115. return BAD_FUNC_ARG;
  19116. }
  19117. /* catch mistaken sizeOnly parameter */
  19118. if (!sizeOnly && (output == NULL || input == NULL) ) {
  19119. return BAD_FUNC_ARG;
  19120. }
  19121. if (sizeOnly && (output || input) ) {
  19122. return BAD_FUNC_ARG;
  19123. }
  19124. (void)epochOrder;
  19125. #ifndef NO_TLS
  19126. #if defined(WOLFSSL_NO_TLS12) && defined(WOLFSSL_TLS13)
  19127. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  19128. hashOutput, sizeOnly, asyncOkay);
  19129. #else
  19130. #ifdef WOLFSSL_TLS13
  19131. if (ssl->options.tls1_3) {
  19132. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  19133. hashOutput, sizeOnly, asyncOkay);
  19134. }
  19135. #endif
  19136. #ifdef WOLFSSL_ASYNC_CRYPT
  19137. ret = WC_NOT_PENDING_E;
  19138. if (asyncOkay) {
  19139. if (ssl->async == NULL) {
  19140. return BAD_FUNC_ARG;
  19141. }
  19142. args = &ssl->async->buildArgs;
  19143. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  19144. if (ret != WC_NOT_PENDING_E) {
  19145. /* Check for error */
  19146. if (ret < 0)
  19147. goto exit_buildmsg;
  19148. }
  19149. }
  19150. else
  19151. #endif
  19152. {
  19153. args = &lcl_args;
  19154. }
  19155. /* Reset state */
  19156. #ifdef WOLFSSL_ASYNC_CRYPT
  19157. if (ret == WC_NOT_PENDING_E)
  19158. #endif
  19159. {
  19160. ret = 0;
  19161. #ifdef WOLFSSL_ASYNC_CRYPT
  19162. ssl->options.buildArgsSet = 1;
  19163. #endif
  19164. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  19165. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  19166. args->sz = RECORD_HEADER_SZ + inSz;
  19167. args->idx = RECORD_HEADER_SZ;
  19168. args->headerSz = RECORD_HEADER_SZ;
  19169. }
  19170. switch (ssl->options.buildMsgState) {
  19171. case BUILD_MSG_BEGIN:
  19172. {
  19173. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  19174. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  19175. /* For epochs >1 the current cipher parameters are located in
  19176. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  19177. * parameters and for epoch 1 use ssl->keys */
  19178. switch (epochOrder) {
  19179. case PREV_ORDER:
  19180. if (ssl->encrypt.src != KEYS) {
  19181. ssl->secure_renegotiation->cache_status =
  19182. SCR_CACHE_NULL;
  19183. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  19184. ERROR_OUT(ret, exit_buildmsg);
  19185. }
  19186. break;
  19187. case CUR_ORDER:
  19188. if (ssl->keys.dtls_epoch ==
  19189. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  19190. if (ssl->encrypt.src != SCR) {
  19191. ssl->secure_renegotiation->cache_status =
  19192. SCR_CACHE_NEEDED;
  19193. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  19194. != 0)
  19195. ERROR_OUT(ret, exit_buildmsg);
  19196. }
  19197. }
  19198. else {
  19199. if (ssl->encrypt.src != KEYS) {
  19200. ssl->secure_renegotiation->cache_status =
  19201. SCR_CACHE_NULL;
  19202. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  19203. != 0)
  19204. ERROR_OUT(ret, exit_buildmsg);
  19205. }
  19206. }
  19207. break;
  19208. default:
  19209. WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
  19210. "CUR_ORDER");
  19211. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  19212. }
  19213. }
  19214. #endif
  19215. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  19216. }
  19217. FALL_THROUGH;
  19218. case BUILD_MSG_SIZE:
  19219. {
  19220. args->digestSz = ssl->specs.hash_size;
  19221. #ifdef HAVE_TRUNCATED_HMAC
  19222. if (ssl->truncated_hmac)
  19223. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  19224. #endif
  19225. args->sz += args->digestSz;
  19226. #ifdef WOLFSSL_DTLS
  19227. if (ssl->options.dtls) {
  19228. args->sz += DTLS_RECORD_EXTRA;
  19229. args->idx += DTLS_RECORD_EXTRA;
  19230. args->headerSz += DTLS_RECORD_EXTRA;
  19231. }
  19232. #endif
  19233. #ifndef WOLFSSL_AEAD_ONLY
  19234. if (ssl->specs.cipher_type == block) {
  19235. word32 blockSz = ssl->specs.block_size;
  19236. if (blockSz == 0) {
  19237. WOLFSSL_MSG("Invalid block size with block cipher type");
  19238. ERROR_OUT(BAD_STATE_E, exit_buildmsg);
  19239. }
  19240. if (ssl->options.tls1_1) {
  19241. args->ivSz = blockSz;
  19242. args->sz += args->ivSz;
  19243. if (args->ivSz > MAX_IV_SZ)
  19244. ERROR_OUT(BUFFER_E, exit_buildmsg);
  19245. }
  19246. args->sz += 1; /* pad byte */
  19247. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19248. if (ssl->options.startedETMWrite) {
  19249. args->pad = (args->sz - args->headerSz -
  19250. args->digestSz) % blockSz;
  19251. }
  19252. else
  19253. #endif
  19254. {
  19255. args->pad = (args->sz - args->headerSz) % blockSz;
  19256. }
  19257. if (args->pad != 0)
  19258. args->pad = blockSz - args->pad;
  19259. args->sz += args->pad;
  19260. }
  19261. #endif /* WOLFSSL_AEAD_ONLY */
  19262. #ifdef HAVE_AEAD
  19263. if (ssl->specs.cipher_type == aead) {
  19264. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  19265. args->ivSz = AESGCM_EXP_IV_SZ;
  19266. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  19267. }
  19268. #endif
  19269. /* done with size calculations */
  19270. if (sizeOnly)
  19271. goto exit_buildmsg;
  19272. if (args->sz > (word32)outSz) {
  19273. WOLFSSL_MSG("Oops, want to write past output buffer size");
  19274. ERROR_OUT(BUFFER_E, exit_buildmsg);
  19275. }
  19276. if (args->ivSz > 0) {
  19277. if (args->ivSz > sizeof(args->staticIvBuffer)) {
  19278. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap,
  19279. DYNAMIC_TYPE_SALT);
  19280. if (args->iv == NULL) {
  19281. ERROR_OUT(MEMORY_E, exit_buildmsg);
  19282. }
  19283. }
  19284. else {
  19285. args->iv = args->staticIvBuffer;
  19286. }
  19287. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  19288. if (ret != 0)
  19289. goto exit_buildmsg;
  19290. }
  19291. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  19292. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  19293. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  19294. defined(HAVE_AEAD))
  19295. if (ssl->specs.cipher_type == aead) {
  19296. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  19297. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  19298. }
  19299. #endif
  19300. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  19301. AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
  19302. /* write to output */
  19303. if (args->ivSz > 0) {
  19304. XMEMCPY(output + args->idx, args->iv,
  19305. min(args->ivSz, MAX_IV_SZ));
  19306. args->idx += min(args->ivSz, MAX_IV_SZ);
  19307. }
  19308. XMEMCPY(output + args->idx, input, inSz);
  19309. args->idx += inSz;
  19310. ssl->options.buildMsgState = BUILD_MSG_HASH;
  19311. }
  19312. FALL_THROUGH;
  19313. case BUILD_MSG_HASH:
  19314. {
  19315. /* done with size calculations */
  19316. if (sizeOnly)
  19317. goto exit_buildmsg;
  19318. if (type == handshake && hashOutput) {
  19319. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  19320. if (ret != 0)
  19321. goto exit_buildmsg;
  19322. }
  19323. #ifndef WOLFSSL_AEAD_ONLY
  19324. if (ssl->specs.cipher_type == block) {
  19325. word32 tmpIdx;
  19326. word32 i;
  19327. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19328. if (ssl->options.startedETMWrite)
  19329. tmpIdx = args->idx;
  19330. else
  19331. #endif
  19332. tmpIdx = args->idx + args->digestSz;
  19333. for (i = 0; i <= args->pad; i++)
  19334. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  19335. }
  19336. #endif
  19337. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  19338. }
  19339. FALL_THROUGH;
  19340. case BUILD_MSG_VERIFY_MAC:
  19341. {
  19342. /* done with size calculations */
  19343. if (sizeOnly)
  19344. goto exit_buildmsg;
  19345. /* User Record Layer Callback handling */
  19346. #ifdef ATOMIC_USER
  19347. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19348. if (ssl->options.startedETMWrite) {
  19349. if (ssl->ctx->EncryptMacCb) {
  19350. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  19351. args->pad + 1, type, 0,
  19352. output + args->headerSz,
  19353. output + args->headerSz,
  19354. args->size - args->digestSz,
  19355. ssl->MacEncryptCtx);
  19356. goto exit_buildmsg;
  19357. }
  19358. }
  19359. else
  19360. #endif
  19361. {
  19362. if (ssl->ctx->MacEncryptCb) {
  19363. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  19364. output + args->headerSz + args->ivSz, inSz,
  19365. type, 0, output + args->headerSz,
  19366. output + args->headerSz, args->size,
  19367. ssl->MacEncryptCtx);
  19368. goto exit_buildmsg;
  19369. }
  19370. }
  19371. #endif
  19372. #ifndef WOLFSSL_AEAD_ONLY
  19373. if (ssl->specs.cipher_type != aead
  19374. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19375. && !ssl->options.startedETMWrite
  19376. #endif
  19377. ) {
  19378. #ifdef HAVE_TRUNCATED_HMAC
  19379. if (ssl->truncated_hmac &&
  19380. ssl->specs.hash_size > args->digestSz) {
  19381. #ifdef WOLFSSL_SMALL_STACK
  19382. byte* hmac;
  19383. #else
  19384. byte hmac[WC_MAX_DIGEST_SIZE];
  19385. #endif
  19386. #ifdef WOLFSSL_SMALL_STACK
  19387. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  19388. DYNAMIC_TYPE_DIGEST);
  19389. if (hmac == NULL)
  19390. ERROR_OUT(MEMORY_E, exit_buildmsg);
  19391. #endif
  19392. ret = ssl->hmac(ssl, hmac,
  19393. output + args->headerSz + args->ivSz, inSz,
  19394. -1, type, 0, epochOrder);
  19395. XMEMCPY(output + args->idx, hmac, args->digestSz);
  19396. #ifdef WOLFSSL_SMALL_STACK
  19397. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  19398. #endif
  19399. }
  19400. else
  19401. #endif
  19402. {
  19403. ret = ssl->hmac(ssl, output + args->idx, output +
  19404. args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
  19405. }
  19406. }
  19407. #endif /* WOLFSSL_AEAD_ONLY */
  19408. if (ret != 0)
  19409. goto exit_buildmsg;
  19410. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  19411. }
  19412. FALL_THROUGH;
  19413. case BUILD_MSG_ENCRYPT:
  19414. {
  19415. /* done with size calculations */
  19416. if (sizeOnly)
  19417. goto exit_buildmsg;
  19418. {
  19419. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  19420. /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
  19421. * for all encryption algos that use it for encryption parameters */
  19422. word16 dtls_epoch = 0;
  19423. word16 dtls_sequence_number_hi = 0;
  19424. word32 dtls_sequence_number_lo = 0;
  19425. int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
  19426. DtlsUseSCRKeys(ssl);
  19427. if (swap_seq) {
  19428. dtls_epoch = ssl->keys.dtls_epoch;
  19429. dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
  19430. dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
  19431. ssl->keys.dtls_epoch--;
  19432. ssl->keys.dtls_sequence_number_hi =
  19433. ssl->keys.dtls_prev_sequence_number_hi;
  19434. ssl->keys.dtls_sequence_number_lo =
  19435. ssl->keys.dtls_prev_sequence_number_lo;
  19436. }
  19437. #endif
  19438. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19439. if (ssl->options.startedETMWrite) {
  19440. ret = Encrypt(ssl, output + args->headerSz,
  19441. output + args->headerSz,
  19442. (word16)(args->size - args->digestSz),
  19443. asyncOkay);
  19444. }
  19445. else
  19446. #endif
  19447. {
  19448. ret = Encrypt(ssl, output + args->headerSz,
  19449. output + args->headerSz, args->size, asyncOkay);
  19450. }
  19451. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  19452. /* Restore sequence numbers */
  19453. if (swap_seq) {
  19454. ssl->keys.dtls_epoch = dtls_epoch;
  19455. ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
  19456. ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
  19457. }
  19458. #endif
  19459. }
  19460. if (ret != 0) {
  19461. #ifdef WOLFSSL_ASYNC_CRYPT
  19462. if (ret != WC_PENDING_E)
  19463. #endif
  19464. {
  19465. /* Zeroize plaintext. */
  19466. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19467. if (ssl->options.startedETMWrite) {
  19468. ForceZero(output + args->headerSz,
  19469. (word16)(args->size - args->digestSz));
  19470. }
  19471. else
  19472. #endif
  19473. {
  19474. ForceZero(output + args->headerSz, (word16)args->size);
  19475. }
  19476. }
  19477. goto exit_buildmsg;
  19478. }
  19479. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  19480. }
  19481. FALL_THROUGH;
  19482. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  19483. {
  19484. /* done with size calculations */
  19485. if (sizeOnly)
  19486. goto exit_buildmsg;
  19487. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19488. if (ssl->options.startedETMWrite) {
  19489. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  19490. #ifdef HAVE_TRUNCATED_HMAC
  19491. if (ssl->truncated_hmac &&
  19492. ssl->specs.hash_size > args->digestSz) {
  19493. #ifdef WOLFSSL_SMALL_STACK
  19494. byte* hmac = NULL;
  19495. #else
  19496. byte hmac[WC_MAX_DIGEST_SIZE];
  19497. #endif
  19498. #ifdef WOLFSSL_SMALL_STACK
  19499. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  19500. DYNAMIC_TYPE_DIGEST);
  19501. if (hmac == NULL)
  19502. ERROR_OUT(MEMORY_E, exit_buildmsg);
  19503. #endif
  19504. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  19505. args->ivSz + inSz + args->pad + 1, -1, type,
  19506. 0, epochOrder);
  19507. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  19508. args->digestSz);
  19509. #ifdef WOLFSSL_SMALL_STACK
  19510. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  19511. #endif
  19512. }
  19513. else
  19514. #endif
  19515. {
  19516. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  19517. output + args->headerSz,
  19518. args->ivSz + inSz + args->pad + 1, -1, type,
  19519. 0, epochOrder);
  19520. }
  19521. }
  19522. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  19523. }
  19524. FALL_THROUGH;
  19525. default:
  19526. break;
  19527. }
  19528. exit_buildmsg:
  19529. WOLFSSL_LEAVE("BuildMessage", ret);
  19530. #ifdef WOLFSSL_ASYNC_CRYPT
  19531. if (ret == WC_PENDING_E) {
  19532. return ret;
  19533. }
  19534. #endif
  19535. /* make sure build message state is reset */
  19536. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  19537. #ifdef WOLFSSL_DTLS
  19538. if (ret == 0 && ssl->options.dtls && !sizeOnly)
  19539. DtlsSEQIncrement(ssl, epochOrder);
  19540. #endif
  19541. /* return sz on success */
  19542. if (ret == 0) {
  19543. ret = args->sz;
  19544. }
  19545. else {
  19546. WOLFSSL_ERROR_VERBOSE(ret);
  19547. }
  19548. /* Final cleanup */
  19549. FreeBuildMsgArgs(ssl, args);
  19550. return ret;
  19551. #endif /* !WOLFSSL_NO_TLS12 */
  19552. #else
  19553. (void)outSz;
  19554. (void)inSz;
  19555. (void)type;
  19556. (void)hashOutput;
  19557. (void)asyncOkay;
  19558. return NOT_COMPILED_IN;
  19559. #endif /* NO_TLS */
  19560. }
  19561. #ifndef WOLFSSL_NO_TLS12
  19562. int SendFinished(WOLFSSL* ssl)
  19563. {
  19564. int sendSz,
  19565. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  19566. FINISHED_SZ;
  19567. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  19568. byte *output;
  19569. Hashes* hashes;
  19570. int ret;
  19571. int headerSz = HANDSHAKE_HEADER_SZ;
  19572. int outputSz;
  19573. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  19574. WOLFSSL_ENTER("SendFinished");
  19575. /* check for available size */
  19576. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  19577. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  19578. * is not advanced yet */
  19579. ssl->options.buildingMsg = 1;
  19580. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  19581. return ret;
  19582. #ifdef WOLFSSL_DTLS
  19583. if (ssl->options.dtls) {
  19584. headerSz += DTLS_HANDSHAKE_EXTRA;
  19585. ssl->keys.dtls_epoch++;
  19586. ssl->keys.dtls_prev_sequence_number_hi =
  19587. ssl->keys.dtls_sequence_number_hi;
  19588. ssl->keys.dtls_prev_sequence_number_lo =
  19589. ssl->keys.dtls_sequence_number_lo;
  19590. ssl->keys.dtls_sequence_number_hi = 0;
  19591. ssl->keys.dtls_sequence_number_lo = 0;
  19592. }
  19593. #endif
  19594. /* get output buffer */
  19595. output = GetOutputBuffer(ssl);
  19596. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  19597. /* make finished hashes */
  19598. hashes = (Hashes*)&input[headerSz];
  19599. ret = BuildFinished(ssl, hashes, ssl->options.side == WOLFSSL_CLIENT_END ?
  19600. kTlsClientStr : kTlsServerStr);
  19601. if (ret != 0) return ret;
  19602. #ifdef HAVE_SECURE_RENEGOTIATION
  19603. if (ssl->secure_renegotiation) {
  19604. if (ssl->options.side == WOLFSSL_CLIENT_END)
  19605. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  19606. TLS_FINISHED_SZ);
  19607. else
  19608. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  19609. TLS_FINISHED_SZ);
  19610. }
  19611. #endif
  19612. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  19613. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  19614. XMEMCPY(ssl->clientFinished,
  19615. hashes, TLS_FINISHED_SZ);
  19616. ssl->clientFinished_len = TLS_FINISHED_SZ;
  19617. }
  19618. else {
  19619. XMEMCPY(ssl->serverFinished,
  19620. hashes, TLS_FINISHED_SZ);
  19621. ssl->serverFinished_len = TLS_FINISHED_SZ;
  19622. }
  19623. #endif
  19624. #ifdef WOLFSSL_DTLS
  19625. if (IsDtlsNotSctpMode(ssl)) {
  19626. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz,
  19627. finished)) != 0) {
  19628. return ret;
  19629. }
  19630. }
  19631. #endif
  19632. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  19633. handshake, 1, 0, 0, CUR_ORDER);
  19634. if (sendSz < 0)
  19635. return BUILD_MSG_ERROR;
  19636. if (!ssl->options.resuming) {
  19637. SetupSession(ssl);
  19638. #ifndef NO_SESSION_CACHE
  19639. AddSession(ssl);
  19640. #endif
  19641. if (ssl->options.side == WOLFSSL_SERVER_END) {
  19642. #ifdef OPENSSL_EXTRA
  19643. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  19644. ssl->cbmode = SSL_CB_MODE_WRITE;
  19645. if (ssl->CBIS != NULL)
  19646. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, WOLFSSL_SUCCESS);
  19647. #endif
  19648. ssl->options.handShakeState = HANDSHAKE_DONE;
  19649. ssl->options.handShakeDone = 1;
  19650. #ifdef HAVE_SECURE_RENEGOTIATION
  19651. ssl->options.resumed = ssl->options.resuming;
  19652. #endif
  19653. }
  19654. }
  19655. else {
  19656. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  19657. #ifdef OPENSSL_EXTRA
  19658. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  19659. ssl->cbmode = SSL_CB_MODE_WRITE;
  19660. if (ssl->CBIS != NULL)
  19661. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, WOLFSSL_SUCCESS);
  19662. #endif
  19663. ssl->options.handShakeState = HANDSHAKE_DONE;
  19664. ssl->options.handShakeDone = 1;
  19665. #ifdef HAVE_SECURE_RENEGOTIATION
  19666. ssl->options.resumed = ssl->options.resuming;
  19667. #endif
  19668. }
  19669. }
  19670. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19671. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  19672. if (ssl->toInfoOn) {
  19673. ret = AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  19674. WRITE_PROTO, 0, ssl->heap);
  19675. if (ret != 0)
  19676. return ret;
  19677. }
  19678. #endif
  19679. ssl->buffers.outputBuffer.length += sendSz;
  19680. ret = SendBuffered(ssl);
  19681. ssl->options.buildingMsg = 0;
  19682. #ifdef WOLFSSL_DTLS
  19683. if ((!ssl->options.resuming &&
  19684. ssl->options.side == WOLFSSL_SERVER_END) ||
  19685. (ssl->options.resuming &&
  19686. ssl->options.side == WOLFSSL_CLIENT_END)) {
  19687. ssl->keys.dtls_handshake_number = 0;
  19688. ssl->keys.dtls_expected_peer_handshake_number = 0;
  19689. }
  19690. #endif
  19691. WOLFSSL_LEAVE("SendFinished", ret);
  19692. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  19693. return ret;
  19694. }
  19695. #endif /* WOLFSSL_NO_TLS12 */
  19696. #ifndef NO_WOLFSSL_SERVER
  19697. #if (!defined(WOLFSSL_NO_TLS12) && \
  19698. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  19699. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  19700. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  19701. /* Parses and decodes the certificate then initializes "request". In the case
  19702. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  19703. *
  19704. * Returns 0 on success
  19705. */
  19706. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  19707. DecodedCert* cert, byte* certData, word32 length)
  19708. {
  19709. int ret;
  19710. if (request != NULL)
  19711. XMEMSET(request, 0, sizeof(OcspRequest));
  19712. InitDecodedCert(cert, certData, length, ssl->heap);
  19713. /* TODO: Setup async support here */
  19714. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl));
  19715. if (ret != 0) {
  19716. WOLFSSL_MSG("ParseCert failed");
  19717. }
  19718. if (ret == 0)
  19719. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  19720. if (ret == 0) {
  19721. /* make sure ctx OCSP request is updated */
  19722. if (!ssl->buffers.weOwnCert) {
  19723. wolfSSL_Mutex* ocspLock = &SSL_CM(ssl)->ocsp_stapling->ocspLock;
  19724. if (wc_LockMutex(ocspLock) == 0) {
  19725. if (ssl->ctx->certOcspRequest == NULL)
  19726. ssl->ctx->certOcspRequest = request;
  19727. wc_UnLockMutex(ocspLock);
  19728. }
  19729. }
  19730. }
  19731. FreeDecodedCert(cert);
  19732. return ret;
  19733. }
  19734. /* Creates OCSP response and places it in variable "response". Memory
  19735. * management for "buffer* response" is up to the caller.
  19736. *
  19737. * Also creates an OcspRequest in the case that ocspRequest is null or that
  19738. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  19739. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  19740. * be set to point to "ocspRequest" and it then should not be free'd since
  19741. * wolfSSL_CTX_free will take care of it.
  19742. *
  19743. * Returns 0 on success
  19744. */
  19745. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  19746. buffer* response)
  19747. {
  19748. int ret = 0;
  19749. OcspRequest* request = NULL;
  19750. byte createdRequest = 0;
  19751. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  19752. return BAD_FUNC_ARG;
  19753. XMEMSET(response, 0, sizeof(*response));
  19754. request = *ocspRequest;
  19755. /* unable to fetch status. skip. */
  19756. if (SSL_CM(ssl) == NULL || SSL_CM(ssl)->ocspStaplingEnabled == 0)
  19757. return 0;
  19758. if (request == NULL || ssl->buffers.weOwnCert) {
  19759. DerBuffer* der = ssl->buffers.certificate;
  19760. #ifdef WOLFSSL_SMALL_STACK
  19761. DecodedCert* cert = NULL;
  19762. #else
  19763. DecodedCert cert[1];
  19764. #endif
  19765. /* unable to fetch status. skip. */
  19766. if (der->buffer == NULL || der->length == 0)
  19767. return 0;
  19768. #ifdef WOLFSSL_SMALL_STACK
  19769. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  19770. DYNAMIC_TYPE_DCERT);
  19771. if (cert == NULL)
  19772. return MEMORY_E;
  19773. #endif
  19774. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  19775. DYNAMIC_TYPE_OCSP_REQUEST);
  19776. if (request == NULL)
  19777. ret = MEMORY_E;
  19778. createdRequest = 1;
  19779. if (ret == 0) {
  19780. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  19781. der->length);
  19782. }
  19783. if (ret != 0) {
  19784. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19785. request = NULL;
  19786. }
  19787. #ifdef WOLFSSL_SMALL_STACK
  19788. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  19789. #endif
  19790. }
  19791. if (ret == 0) {
  19792. request->ssl = ssl;
  19793. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, request, response,
  19794. ssl->heap);
  19795. /* Suppressing, not critical */
  19796. if (ret == OCSP_CERT_REVOKED ||
  19797. ret == OCSP_CERT_UNKNOWN ||
  19798. ret == OCSP_LOOKUP_FAIL) {
  19799. ret = 0;
  19800. }
  19801. }
  19802. /* free request up if error case found otherwise return it */
  19803. if (ret != 0 && createdRequest) {
  19804. FreeOcspRequest(request);
  19805. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19806. }
  19807. if (ret == 0)
  19808. *ocspRequest = request;
  19809. return ret;
  19810. }
  19811. #endif
  19812. #endif /* !NO_WOLFSSL_SERVER */
  19813. int cipherExtraData(WOLFSSL* ssl)
  19814. {
  19815. int cipherExtra;
  19816. /* Cipher data that may be added by BuildMessage */
  19817. /* There is always an IV (expect for chacha). For AEAD ciphers,
  19818. * there is the authentication tag (aead_mac_size). For block
  19819. * ciphers we have the hash_size MAC on the message, and one
  19820. * block size for possible padding. */
  19821. if (ssl->specs.cipher_type == aead) {
  19822. cipherExtra = ssl->specs.aead_mac_size;
  19823. /* CHACHA does not have an explicit IV. */
  19824. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) {
  19825. cipherExtra += AESGCM_EXP_IV_SZ;
  19826. }
  19827. }
  19828. else {
  19829. cipherExtra = ssl->specs.iv_size + ssl->specs.block_size +
  19830. ssl->specs.hash_size;
  19831. }
  19832. /* Sanity check so we don't ever return negative. */
  19833. return cipherExtra > 0 ? cipherExtra : 0;
  19834. }
  19835. #ifndef WOLFSSL_NO_TLS12
  19836. #ifndef NO_CERTS
  19837. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  19838. /* handle generation of certificate (11) */
  19839. int SendCertificate(WOLFSSL* ssl)
  19840. {
  19841. int ret = 0;
  19842. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  19843. word32 length, maxFragment;
  19844. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  19845. WOLFSSL_ENTER("SendCertificate");
  19846. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher) {
  19847. WOLFSSL_MSG("Not sending certificate msg. Using PSK or ANON cipher.");
  19848. return 0; /* not needed */
  19849. }
  19850. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  19851. #ifdef OPENSSL_EXTRA
  19852. if (ssl->version.major == SSLv3_MAJOR
  19853. && ssl->version.minor == SSLv3_MINOR){
  19854. return SendAlert(ssl, alert_warning, no_certificate);
  19855. } else {
  19856. #endif
  19857. certSz = 0;
  19858. certChainSz = 0;
  19859. headerSz = CERT_HEADER_SZ;
  19860. length = CERT_HEADER_SZ;
  19861. listSz = 0;
  19862. #ifdef OPENSSL_EXTRA
  19863. }
  19864. #endif
  19865. }
  19866. else {
  19867. if (!ssl->buffers.certificate) {
  19868. WOLFSSL_MSG("Send Cert missing certificate buffer");
  19869. return BUFFER_ERROR;
  19870. }
  19871. certSz = ssl->buffers.certificate->length;
  19872. headerSz = 2 * CERT_HEADER_SZ;
  19873. /* list + cert size */
  19874. length = certSz + headerSz;
  19875. listSz = certSz + CERT_HEADER_SZ;
  19876. /* may need to send rest of chain, already has leading size(s) */
  19877. if (certSz && ssl->buffers.certChain) {
  19878. certChainSz = ssl->buffers.certChain->length;
  19879. length += certChainSz;
  19880. listSz += certChainSz;
  19881. }
  19882. else
  19883. certChainSz = 0;
  19884. }
  19885. payloadSz = length;
  19886. if (ssl->fragOffset != 0)
  19887. length -= (ssl->fragOffset + headerSz);
  19888. maxFragment = MAX_RECORD_SIZE;
  19889. maxFragment = wolfSSL_GetMaxFragSize(ssl, maxFragment);
  19890. while (length > 0 && ret == 0) {
  19891. byte* output = NULL;
  19892. word32 fragSz = 0;
  19893. word32 i = RECORD_HEADER_SZ;
  19894. int sendSz = RECORD_HEADER_SZ;
  19895. ssl->options.buildingMsg = 1;
  19896. if (!ssl->options.dtls) {
  19897. if (ssl->fragOffset == 0) {
  19898. if (headerSz + certSz + certChainSz <=
  19899. maxFragment - HANDSHAKE_HEADER_SZ) {
  19900. fragSz = headerSz + certSz + certChainSz;
  19901. }
  19902. else {
  19903. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  19904. }
  19905. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  19906. i += HANDSHAKE_HEADER_SZ;
  19907. }
  19908. else {
  19909. fragSz = min(length, maxFragment);
  19910. sendSz += fragSz;
  19911. }
  19912. if (IsEncryptionOn(ssl, 1))
  19913. sendSz += MAX_MSG_EXTRA;
  19914. }
  19915. else {
  19916. #ifdef WOLFSSL_DTLS
  19917. fragSz = min(length, maxFragment);
  19918. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  19919. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  19920. #endif
  19921. }
  19922. if (IsEncryptionOn(ssl, 1))
  19923. sendSz += cipherExtraData(ssl);
  19924. /* check for available size */
  19925. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  19926. return ret;
  19927. /* get output buffer */
  19928. output = GetOutputBuffer(ssl);
  19929. /* Safe to use ssl->fragOffset since it will be incremented immediately
  19930. * after this block. This block needs to be entered only once to not
  19931. * hash the cert msg twice. */
  19932. if (ssl->fragOffset == 0) {
  19933. if (!ssl->options.dtls) {
  19934. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  19935. if (!IsEncryptionOn(ssl, 1))
  19936. HashRaw(ssl, output + RECORD_HEADER_SZ,
  19937. HANDSHAKE_HEADER_SZ);
  19938. }
  19939. else {
  19940. #ifdef WOLFSSL_DTLS
  19941. AddHeaders(output, payloadSz, certificate, ssl);
  19942. HashRaw(ssl,
  19943. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  19944. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  19945. /* Adding the headers increments these, decrement them for
  19946. * actual message header. */
  19947. ssl->keys.dtls_handshake_number--;
  19948. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  19949. ssl->keys.dtls_handshake_number--;
  19950. #endif /* WOLFSSL_DTLS */
  19951. }
  19952. /* list total */
  19953. c32to24(listSz, output + i);
  19954. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  19955. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  19956. i += CERT_HEADER_SZ;
  19957. length -= CERT_HEADER_SZ;
  19958. fragSz -= CERT_HEADER_SZ;
  19959. if (certSz) {
  19960. c32to24(certSz, output + i);
  19961. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  19962. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  19963. i += CERT_HEADER_SZ;
  19964. length -= CERT_HEADER_SZ;
  19965. fragSz -= CERT_HEADER_SZ;
  19966. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
  19967. HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  19968. if (certChainSz)
  19969. HashRaw(ssl, ssl->buffers.certChain->buffer,
  19970. certChainSz);
  19971. }
  19972. }
  19973. }
  19974. else {
  19975. if (!ssl->options.dtls) {
  19976. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  19977. }
  19978. else {
  19979. #ifdef WOLFSSL_DTLS
  19980. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  19981. payloadSz, certificate, ssl);
  19982. ssl->keys.dtls_handshake_number--;
  19983. #endif /* WOLFSSL_DTLS */
  19984. }
  19985. }
  19986. /* member */
  19987. if (certSz && ssl->fragOffset < certSz) {
  19988. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  19989. XMEMCPY(output + i,
  19990. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  19991. i += copySz;
  19992. ssl->fragOffset += copySz;
  19993. length -= copySz;
  19994. fragSz -= copySz;
  19995. }
  19996. if (certChainSz && fragSz) {
  19997. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  19998. XMEMCPY(output + i,
  19999. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  20000. copySz);
  20001. i += copySz;
  20002. ssl->fragOffset += copySz;
  20003. length -= copySz;
  20004. }
  20005. if (IsEncryptionOn(ssl, 1)) {
  20006. byte* input = NULL;
  20007. int inputSz = i; /* build msg adds rec hdr */
  20008. int recordHeaderSz = RECORD_HEADER_SZ;
  20009. if (ssl->options.dtls)
  20010. recordHeaderSz += DTLS_RECORD_EXTRA;
  20011. inputSz -= recordHeaderSz;
  20012. if (inputSz < 0) {
  20013. WOLFSSL_MSG("Send Cert bad inputSz");
  20014. return BUFFER_E;
  20015. }
  20016. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  20017. input = (byte*)XMALLOC(inputSz, ssl->heap,
  20018. DYNAMIC_TYPE_IN_BUFFER);
  20019. if (input == NULL)
  20020. return MEMORY_E;
  20021. XMEMCPY(input, output + recordHeaderSz, inputSz);
  20022. }
  20023. #ifndef WOLFSSL_DTLS
  20024. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  20025. handshake, 1, 0, 0, CUR_ORDER);
  20026. #else
  20027. if (!ssl->options.dtls)
  20028. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  20029. handshake, 1, 0, 0, CUR_ORDER);
  20030. else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
  20031. * calculate the hash ourselves above */ {
  20032. if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
  20033. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20034. return ret;
  20035. }
  20036. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  20037. handshake, 0, 0, 0, CUR_ORDER);
  20038. }
  20039. #endif
  20040. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20041. if (sendSz < 0)
  20042. return sendSz;
  20043. }
  20044. else {
  20045. sendSz = i;
  20046. #ifdef WOLFSSL_DTLS
  20047. if (IsDtlsNotSctpMode(ssl)) {
  20048. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
  20049. return ret;
  20050. }
  20051. if (ssl->options.dtls)
  20052. DtlsSEQIncrement(ssl, CUR_ORDER);
  20053. #endif
  20054. }
  20055. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20056. if (ssl->hsInfoOn)
  20057. AddPacketName(ssl, "Certificate");
  20058. if (ssl->toInfoOn) {
  20059. ret = AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  20060. WRITE_PROTO, 0, ssl->heap);
  20061. if (ret != 0)
  20062. return ret;
  20063. }
  20064. #endif
  20065. ssl->buffers.outputBuffer.length += sendSz;
  20066. if (!ssl->options.groupMessages)
  20067. ret = SendBuffered(ssl);
  20068. }
  20069. if (ret != WANT_WRITE) {
  20070. /* Clean up the fragment offset. */
  20071. ssl->options.buildingMsg = 0;
  20072. ssl->fragOffset = 0;
  20073. #ifdef WOLFSSL_DTLS
  20074. if (ssl->options.dtls)
  20075. ssl->keys.dtls_handshake_number++;
  20076. #endif
  20077. if (ssl->options.side == WOLFSSL_SERVER_END){
  20078. ssl->options.serverState = SERVER_CERT_COMPLETE;
  20079. }
  20080. }
  20081. WOLFSSL_LEAVE("SendCertificate", ret);
  20082. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  20083. return ret;
  20084. }
  20085. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  20086. /* handle generation of certificate_request (13) */
  20087. int SendCertificateRequest(WOLFSSL* ssl)
  20088. {
  20089. byte *output;
  20090. int ret;
  20091. int sendSz;
  20092. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  20093. word32 dnLen = 0;
  20094. #ifndef WOLFSSL_NO_CA_NAMES
  20095. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  20096. #endif
  20097. const Suites* suites = WOLFSSL_SUITES(ssl);
  20098. int typeTotal = 1; /* only 1 for now */
  20099. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  20100. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  20101. WOLFSSL_ENTER("SendCertificateRequest");
  20102. if (IsAtLeastTLSv1_2(ssl))
  20103. reqSz += LENGTH_SZ + suites->hashSigAlgoSz;
  20104. #ifndef WOLFSSL_NO_CA_NAMES
  20105. /* Certificate Authorities */
  20106. names = SSL_CA_NAMES(ssl);
  20107. while (names != NULL) {
  20108. byte seq[MAX_SEQ_SZ];
  20109. WOLFSSL_X509_NAME* name = names->data.name;
  20110. if (name != NULL) {
  20111. /* 16-bit length | SEQ | Len | DER of name */
  20112. dnLen += OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
  20113. name->rawLen;
  20114. }
  20115. names = names->next;
  20116. }
  20117. reqSz += dnLen;
  20118. #endif
  20119. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  20120. return 0; /* not needed */
  20121. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  20122. if (!ssl->options.dtls) {
  20123. if (IsEncryptionOn(ssl, 1))
  20124. sendSz += MAX_MSG_EXTRA;
  20125. }
  20126. else {
  20127. #ifdef WOLFSSL_DTLS
  20128. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  20129. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  20130. #endif
  20131. }
  20132. if (IsEncryptionOn(ssl, 1))
  20133. sendSz += cipherExtraData(ssl);
  20134. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  20135. * is not advanced yet */
  20136. ssl->options.buildingMsg = 1;
  20137. /* check for available size */
  20138. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  20139. return ret;
  20140. /* get output buffer */
  20141. output = GetOutputBuffer(ssl);
  20142. AddHeaders(output, reqSz, certificate_request, ssl);
  20143. /* write to output */
  20144. output[i++] = (byte)typeTotal; /* # of types */
  20145. #ifdef HAVE_ECC
  20146. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  20147. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  20148. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  20149. output[i++] = ecdsa_sign;
  20150. }
  20151. else
  20152. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \
  20153. (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \
  20154. defined(WOLFSSL_SM4_CCM))
  20155. if (ssl->options.cipherSuite0 == SM_BYTE && (0
  20156. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  20157. || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  20158. #endif
  20159. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  20160. || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  20161. #endif
  20162. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  20163. || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  20164. #endif
  20165. )) {
  20166. output[i++] = ecdsa_sign;
  20167. }
  20168. else
  20169. #endif
  20170. #endif /* HAVE_ECC */
  20171. {
  20172. output[i++] = rsa_sign;
  20173. }
  20174. /* supported hash/sig */
  20175. if (IsAtLeastTLSv1_2(ssl)) {
  20176. c16toa(suites->hashSigAlgoSz, &output[i]);
  20177. i += OPAQUE16_LEN;
  20178. XMEMCPY(&output[i], suites->hashSigAlgo, suites->hashSigAlgoSz);
  20179. i += suites->hashSigAlgoSz;
  20180. }
  20181. /* Certificate Authorities */
  20182. c16toa((word16)dnLen, &output[i]); /* auth's */
  20183. i += REQ_HEADER_SZ;
  20184. #ifndef WOLFSSL_NO_CA_NAMES
  20185. names = SSL_CA_NAMES(ssl);
  20186. while (names != NULL) {
  20187. byte seq[MAX_SEQ_SZ];
  20188. WOLFSSL_X509_NAME* name = names->data.name;
  20189. if (name != NULL) {
  20190. c16toa((word16)name->rawLen +
  20191. (word16)SetSequence(name->rawLen, seq), &output[i]);
  20192. i += OPAQUE16_LEN;
  20193. i += SetSequence(name->rawLen, output + i);
  20194. XMEMCPY(output + i, name->raw, name->rawLen);
  20195. i += name->rawLen;
  20196. }
  20197. names = names->next;
  20198. }
  20199. #endif
  20200. (void)i;
  20201. if (IsEncryptionOn(ssl, 1)) {
  20202. byte* input = NULL;
  20203. int inputSz = i; /* build msg adds rec hdr */
  20204. int recordHeaderSz = RECORD_HEADER_SZ;
  20205. if (ssl->options.dtls)
  20206. recordHeaderSz += DTLS_RECORD_EXTRA;
  20207. inputSz -= recordHeaderSz;
  20208. if (inputSz <= 0) {
  20209. WOLFSSL_MSG("Send Cert Req bad inputSz");
  20210. return BUFFER_E;
  20211. }
  20212. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20213. if (input == NULL)
  20214. return MEMORY_E;
  20215. XMEMCPY(input, output + recordHeaderSz, inputSz);
  20216. #ifdef WOLFSSL_DTLS
  20217. if (IsDtlsNotSctpMode(ssl) &&
  20218. (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
  20219. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20220. return ret;
  20221. }
  20222. #endif
  20223. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  20224. handshake, 1, 0, 0, CUR_ORDER);
  20225. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20226. if (sendSz < 0)
  20227. return sendSz;
  20228. } else {
  20229. sendSz = i;
  20230. #ifdef WOLFSSL_DTLS
  20231. if (IsDtlsNotSctpMode(ssl)) {
  20232. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
  20233. return ret;
  20234. }
  20235. if (ssl->options.dtls)
  20236. DtlsSEQIncrement(ssl, CUR_ORDER);
  20237. #endif
  20238. ret = HashOutput(ssl, output, sendSz, 0);
  20239. if (ret != 0)
  20240. return ret;
  20241. }
  20242. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20243. if (ssl->hsInfoOn)
  20244. AddPacketName(ssl, "CertificateRequest");
  20245. if (ssl->toInfoOn) {
  20246. ret = AddPacketInfo(ssl, "CertificateRequest", handshake, output,
  20247. sendSz, WRITE_PROTO, 0, ssl->heap);
  20248. if (ret != 0)
  20249. return ret;
  20250. }
  20251. #endif
  20252. ssl->buffers.outputBuffer.length += sendSz;
  20253. if (ssl->options.groupMessages)
  20254. ret = 0;
  20255. else
  20256. ret = SendBuffered(ssl);
  20257. ssl->options.buildingMsg = 0;
  20258. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  20259. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  20260. return ret;
  20261. }
  20262. #ifndef NO_WOLFSSL_SERVER
  20263. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  20264. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  20265. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  20266. byte count)
  20267. {
  20268. byte* output = NULL;
  20269. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  20270. word32 length = ENUM_LEN;
  20271. int sendSz = 0;
  20272. int ret = 0;
  20273. int i = 0;
  20274. WOLFSSL_ENTER("BuildCertificateStatus");
  20275. switch (type) {
  20276. case WOLFSSL_CSR2_OCSP_MULTI:
  20277. length += OPAQUE24_LEN;
  20278. FALL_THROUGH; /* followed by */
  20279. case WOLFSSL_CSR2_OCSP:
  20280. for (i = 0; i < count; i++)
  20281. length += OPAQUE24_LEN + status[i].length;
  20282. break;
  20283. default:
  20284. return 0;
  20285. }
  20286. sendSz = idx + length;
  20287. if (ssl->keys.encryptionOn)
  20288. sendSz += MAX_MSG_EXTRA;
  20289. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  20290. * is not advanced yet */
  20291. ssl->options.buildingMsg = 1;
  20292. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  20293. output = GetOutputBuffer(ssl);
  20294. AddHeaders(output, length, certificate_status, ssl);
  20295. output[idx++] = type;
  20296. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  20297. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  20298. idx += OPAQUE24_LEN;
  20299. }
  20300. for (i = 0; i < count; i++) {
  20301. c32to24(status[i].length, output + idx);
  20302. idx += OPAQUE24_LEN;
  20303. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  20304. idx += status[i].length;
  20305. }
  20306. if (IsEncryptionOn(ssl, 1)) {
  20307. byte* input;
  20308. int inputSz = idx; /* build msg adds rec hdr */
  20309. int recordHeaderSz = RECORD_HEADER_SZ;
  20310. if (ssl->options.dtls)
  20311. recordHeaderSz += DTLS_RECORD_EXTRA;
  20312. inputSz -= recordHeaderSz;
  20313. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20314. if (input == NULL)
  20315. return MEMORY_E;
  20316. XMEMCPY(input, output + recordHeaderSz, inputSz);
  20317. #ifdef WOLFSSL_DTLS
  20318. ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
  20319. #endif
  20320. if (ret == 0)
  20321. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  20322. handshake, 1, 0, 0, CUR_ORDER);
  20323. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20324. if (sendSz < 0)
  20325. ret = sendSz;
  20326. }
  20327. else {
  20328. #ifdef WOLFSSL_DTLS
  20329. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  20330. ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
  20331. if (ret == 0 && ssl->options.dtls)
  20332. DtlsSEQIncrement(ssl, CUR_ORDER);
  20333. #endif
  20334. ret = HashOutput(ssl, output, sendSz, 0);
  20335. }
  20336. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20337. if (ret == 0 && ssl->hsInfoOn)
  20338. AddPacketName(ssl, "CertificateStatus");
  20339. if (ret == 0 && ssl->toInfoOn) {
  20340. ret = AddPacketInfo(ssl, "CertificateStatus", handshake, output,
  20341. sendSz, WRITE_PROTO, 0, ssl->heap);
  20342. if (ret != 0)
  20343. return ret;
  20344. }
  20345. #endif
  20346. if (ret == 0) {
  20347. ssl->options.buildingMsg = 0;
  20348. ssl->buffers.outputBuffer.length += sendSz;
  20349. if (!ssl->options.groupMessages)
  20350. ret = SendBuffered(ssl);
  20351. }
  20352. }
  20353. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  20354. return ret;
  20355. }
  20356. #endif
  20357. #endif /* NO_WOLFSSL_SERVER */
  20358. /* handle generation of certificate_status (22) */
  20359. int SendCertificateStatus(WOLFSSL* ssl)
  20360. {
  20361. int ret = 0;
  20362. byte status_type = 0;
  20363. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  20364. WOLFSSL_ENTER("SendCertificateStatus");
  20365. (void) ssl;
  20366. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  20367. status_type = ssl->status_request;
  20368. #endif
  20369. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  20370. status_type = status_type ? status_type : ssl->status_request_v2;
  20371. #endif
  20372. switch (status_type) {
  20373. #ifndef NO_WOLFSSL_SERVER
  20374. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  20375. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  20376. /* case WOLFSSL_CSR_OCSP: */
  20377. case WOLFSSL_CSR2_OCSP:
  20378. {
  20379. OcspRequest* request = ssl->ctx->certOcspRequest;
  20380. buffer response;
  20381. ret = CreateOcspResponse(ssl, &request, &response);
  20382. /* if a request was successfully created and not stored in
  20383. * ssl->ctx then free it */
  20384. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  20385. FreeOcspRequest(request);
  20386. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  20387. request = NULL;
  20388. }
  20389. if (ret == 0 && response.buffer) {
  20390. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  20391. }
  20392. if (response.buffer) {
  20393. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  20394. response.buffer = NULL;
  20395. }
  20396. break;
  20397. }
  20398. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  20399. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  20400. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  20401. case WOLFSSL_CSR2_OCSP_MULTI:
  20402. {
  20403. OcspRequest* request = ssl->ctx->certOcspRequest;
  20404. buffer responses[1 + MAX_CHAIN_DEPTH];
  20405. int i = 0;
  20406. XMEMSET(responses, 0, sizeof(responses));
  20407. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  20408. /* if a request was successfully created and not stored in
  20409. * ssl->ctx then free it */
  20410. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  20411. FreeOcspRequest(request);
  20412. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  20413. request = NULL;
  20414. }
  20415. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  20416. || ssl->buffers.weOwnCertChain)) {
  20417. buffer der;
  20418. word32 idx = 0;
  20419. #ifdef WOLFSSL_SMALL_STACK
  20420. DecodedCert* cert;
  20421. #else
  20422. DecodedCert cert[1];
  20423. #endif
  20424. DerBuffer* chain;
  20425. #ifdef WOLFSSL_SMALL_STACK
  20426. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  20427. DYNAMIC_TYPE_DCERT);
  20428. if (cert == NULL)
  20429. return MEMORY_E;
  20430. #endif
  20431. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  20432. DYNAMIC_TYPE_OCSP_REQUEST);
  20433. if (request == NULL) {
  20434. #ifdef WOLFSSL_SMALL_STACK
  20435. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  20436. #endif
  20437. return MEMORY_E;
  20438. }
  20439. /* use certChain if available, otherwise use peer certificate */
  20440. chain = ssl->buffers.certChain;
  20441. if (chain == NULL) {
  20442. chain = ssl->buffers.certificate;
  20443. }
  20444. if (chain && chain->buffer) {
  20445. while (idx + OPAQUE24_LEN < chain->length) {
  20446. c24to32(chain->buffer + idx, &der.length);
  20447. idx += OPAQUE24_LEN;
  20448. der.buffer = chain->buffer + idx;
  20449. idx += der.length;
  20450. if (idx > chain->length)
  20451. break;
  20452. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  20453. der.length);
  20454. if (ret == 0) {
  20455. request->ssl = ssl;
  20456. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  20457. request, &responses[i + 1], ssl->heap);
  20458. /* Suppressing, not critical */
  20459. if (ret == OCSP_CERT_REVOKED ||
  20460. ret == OCSP_CERT_UNKNOWN ||
  20461. ret == OCSP_LOOKUP_FAIL) {
  20462. ret = 0;
  20463. }
  20464. i++;
  20465. FreeOcspRequest(request);
  20466. }
  20467. }
  20468. }
  20469. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  20470. #ifdef WOLFSSL_SMALL_STACK
  20471. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  20472. #endif
  20473. }
  20474. else {
  20475. while (ret == 0 &&
  20476. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  20477. request->ssl = ssl;
  20478. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  20479. request, &responses[++i], ssl->heap);
  20480. /* Suppressing, not critical */
  20481. if (ret == OCSP_CERT_REVOKED ||
  20482. ret == OCSP_CERT_UNKNOWN ||
  20483. ret == OCSP_LOOKUP_FAIL) {
  20484. ret = 0;
  20485. }
  20486. }
  20487. }
  20488. if (responses[0].buffer) {
  20489. if (ret == 0) {
  20490. ret = BuildCertificateStatus(ssl, status_type, responses,
  20491. (byte)i + 1);
  20492. }
  20493. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  20494. if (responses[i].buffer) {
  20495. XFREE(responses[i].buffer, ssl->heap,
  20496. DYNAMIC_TYPE_OCSP_REQUEST);
  20497. }
  20498. }
  20499. }
  20500. break;
  20501. }
  20502. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  20503. #endif /* NO_WOLFSSL_SERVER */
  20504. default:
  20505. break;
  20506. }
  20507. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  20508. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  20509. return ret;
  20510. }
  20511. #endif /* !NO_CERTS */
  20512. #endif /* WOLFSSL_NO_TLS12 */
  20513. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  20514. /**
  20515. * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
  20516. */
  20517. int DtlsSCRKeysSet(WOLFSSL* ssl)
  20518. {
  20519. return ssl->secure_renegotiation &&
  20520. ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
  20521. }
  20522. /**
  20523. * ssl->keys contains the current cipher parameters only for epoch 1. For
  20524. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  20525. * cipher parameters. This function checks if the message currently being
  20526. * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  20527. */
  20528. int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
  20529. {
  20530. return DtlsSCRKeysSet(ssl) &&
  20531. ssl->keys.curEpoch ==
  20532. ssl->secure_renegotiation->tmp_keys.dtls_epoch;
  20533. }
  20534. /**
  20535. * ssl->keys contains the current cipher parameters only for epoch 1. For
  20536. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  20537. * cipher parameters. This function checks if the message currently being
  20538. * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  20539. */
  20540. int DtlsUseSCRKeys(WOLFSSL* ssl)
  20541. {
  20542. return DtlsSCRKeysSet(ssl) &&
  20543. ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
  20544. ssl->keys.dtls_epoch;
  20545. }
  20546. /**
  20547. * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
  20548. * then PREV_ORDER refers to the current epoch.
  20549. * */
  20550. int DtlsCheckOrder(WOLFSSL* ssl, int order)
  20551. {
  20552. if (order == PREV_ORDER && ssl->secure_renegotiation &&
  20553. ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
  20554. return CUR_ORDER;
  20555. }
  20556. else {
  20557. return order;
  20558. }
  20559. }
  20560. #endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
  20561. /* If secure renegotiation is disabled, this will always return false.
  20562. * Otherwise it checks to see if we are currently renegotiating. */
  20563. int IsSCR(WOLFSSL* ssl)
  20564. {
  20565. #ifndef HAVE_SECURE_RENEGOTIATION
  20566. (void)ssl;
  20567. #else /* HAVE_SECURE_RENEGOTIATION */
  20568. if (ssl->secure_renegotiation &&
  20569. ssl->secure_renegotiation->enabled && /* Is SCR enabled? */
  20570. ssl->options.handShakeDone && /* At least one handshake done? */
  20571. ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
  20572. return 1;
  20573. #endif /* HAVE_SECURE_RENEGOTIATION */
  20574. return 0;
  20575. }
  20576. #ifdef WOLFSSL_DTLS
  20577. static int ModifyForMTU(WOLFSSL* ssl, int buffSz, int outputSz, int mtuSz)
  20578. {
  20579. int recordExtra = outputSz - buffSz;
  20580. (void)ssl;
  20581. if (recordExtra > 0 && outputSz > mtuSz) {
  20582. buffSz = mtuSz - recordExtra;
  20583. #ifndef WOLFSSL_AEAD_ONLY
  20584. /* Subtract a block size to be certain that returned fragment
  20585. * size won't get more padding. */
  20586. if (ssl->specs.cipher_type == block)
  20587. buffSz -= ssl->specs.block_size;
  20588. #endif
  20589. }
  20590. return buffSz;
  20591. }
  20592. #endif /* WOLFSSL_DTLS */
  20593. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  20594. /*
  20595. * Enforce limits specified in
  20596. * https://www.rfc-editor.org/rfc/rfc8446#section-5.5
  20597. */
  20598. static int CheckTLS13AEADSendLimit(WOLFSSL* ssl)
  20599. {
  20600. w64wrapper seq;
  20601. w64wrapper limit;
  20602. switch (ssl->specs.bulk_cipher_algorithm) {
  20603. #ifdef BUILD_AESGCM
  20604. case wolfssl_aes_gcm:
  20605. /* Limit is 2^24.5 */
  20606. limit = AEAD_AES_LIMIT;
  20607. break;
  20608. #endif
  20609. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  20610. case wolfssl_chacha:
  20611. /* For ChaCha20/Poly1305, the record sequence number would wrap
  20612. * before the safety limit is reached. */
  20613. return 0;
  20614. #endif
  20615. #ifdef HAVE_AESCCM
  20616. case wolfssl_aes_ccm:
  20617. /* Use the limits calculated in the DTLS 1.3 spec
  20618. * https://www.rfc-editor.org/rfc/rfc9147.html#name-analysis-of-limits-on-ccm-u */
  20619. #ifdef WOLFSSL_DTLS13
  20620. if (ssl->options.dtls)
  20621. limit = DTLS_AEAD_AES_CCM_LIMIT; /* Limit is 2^23 */
  20622. else
  20623. #endif
  20624. limit = AEAD_AES_LIMIT; /* Limit is 2^24.5 */
  20625. break;
  20626. #endif
  20627. #ifdef WOLFSSL_SM4_GCM
  20628. case wolfssl_sm4_gcm:
  20629. /* Limit is 2^22 - 1 */
  20630. limit = AEAD_SM4_GCM_LIMIT;
  20631. break;
  20632. #endif
  20633. #ifdef WOLFSSL_SM4_CCM
  20634. case wolfssl_sm4_ccm:
  20635. /* Limit is 2^10 - 1 */
  20636. limit = AEAD_SM4_CCM_LIMIT;
  20637. break;
  20638. #endif
  20639. case wolfssl_cipher_null:
  20640. /* No encryption being done */
  20641. return 0;
  20642. default:
  20643. WOLFSSL_MSG("Unrecognized ciphersuite for AEAD limit check");
  20644. return BAD_STATE_E;
  20645. }
  20646. #ifdef WOLFSSL_DTLS13
  20647. if (ssl->options.dtls) {
  20648. seq = ssl->dtls13EncryptEpoch->nextSeqNumber;
  20649. }
  20650. else
  20651. #endif
  20652. {
  20653. seq = w64From32(ssl->keys.sequence_number_hi,
  20654. ssl->keys.sequence_number_lo);
  20655. }
  20656. if (w64GTE(seq, limit))
  20657. return Tls13UpdateKeys(ssl); /* Need to generate new keys */
  20658. return 0;
  20659. }
  20660. #endif /* WOLFSSL_TLS13 && !WOLFSSL_TLS13_IGNORE_AEAD_LIMITS */
  20661. int SendData(WOLFSSL* ssl, const void* data, int sz)
  20662. {
  20663. int sent = 0, /* plainText size */
  20664. sendSz,
  20665. ret;
  20666. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  20667. int groupMsgs = 0;
  20668. #endif
  20669. if (ssl->error == WANT_WRITE
  20670. #ifdef WOLFSSL_ASYNC_CRYPT
  20671. || ssl->error == WC_PENDING_E
  20672. #endif
  20673. ) {
  20674. ssl->error = 0;
  20675. }
  20676. /* don't allow write after decrypt or mac error */
  20677. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  20678. /* For DTLS allow these possible errors and allow the session
  20679. to continue despite them */
  20680. if (ssl->options.dtls) {
  20681. ssl->error = 0;
  20682. }
  20683. else {
  20684. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  20685. return WOLFSSL_FATAL_ERROR;
  20686. }
  20687. }
  20688. #ifdef WOLFSSL_EARLY_DATA
  20689. if (ssl->earlyData != no_early_data) {
  20690. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  20691. WOLFSSL_MSG("handshake complete, trying to send early data");
  20692. ssl->error = BUILD_MSG_ERROR;
  20693. return WOLFSSL_FATAL_ERROR;
  20694. }
  20695. #ifdef WOLFSSL_EARLY_DATA_GROUP
  20696. groupMsgs = 1;
  20697. #endif
  20698. }
  20699. else
  20700. #endif
  20701. if (ssl->options.handShakeState != HANDSHAKE_DONE && !IsSCR(ssl)) {
  20702. int err;
  20703. WOLFSSL_MSG("handshake not complete, trying to finish");
  20704. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  20705. #ifdef WOLFSSL_ASYNC_CRYPT
  20706. /* if async would block return WANT_WRITE */
  20707. if (ssl->error == WC_PENDING_E) {
  20708. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  20709. }
  20710. #endif
  20711. return err;
  20712. }
  20713. }
  20714. /* last time system socket output buffer was full, try again to send */
  20715. if (ssl->buffers.outputBuffer.length > 0
  20716. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  20717. && !groupMsgs
  20718. #endif
  20719. ) {
  20720. WOLFSSL_MSG("output buffer was full, trying to send again");
  20721. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  20722. WOLFSSL_ERROR(ssl->error);
  20723. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  20724. ssl->options.isClosed)) {
  20725. ssl->error = SOCKET_PEER_CLOSED_E;
  20726. WOLFSSL_ERROR(ssl->error);
  20727. return 0; /* peer reset or closed */
  20728. }
  20729. return ssl->error;
  20730. }
  20731. else {
  20732. /* advance sent to previous sent + plain size just sent */
  20733. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  20734. WOLFSSL_MSG("sent write buffered data");
  20735. if (sent > sz) {
  20736. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  20737. return ssl->error = BAD_FUNC_ARG;
  20738. }
  20739. }
  20740. }
  20741. ret = RetrySendAlert(ssl);
  20742. if (ret != 0) {
  20743. ssl->error = ret;
  20744. return WOLFSSL_FATAL_ERROR;
  20745. }
  20746. for (;;) {
  20747. byte* out;
  20748. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  20749. int buffSz; /* may switch on comp */
  20750. int outputSz;
  20751. #ifdef HAVE_LIBZ
  20752. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  20753. #endif
  20754. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  20755. if (IsAtLeastTLSv1_3(ssl->version)) {
  20756. ret = CheckTLS13AEADSendLimit(ssl);
  20757. if (ret != 0) {
  20758. ssl->error = ret;
  20759. return WOLFSSL_FATAL_ERROR;
  20760. }
  20761. }
  20762. #endif
  20763. #ifdef WOLFSSL_DTLS13
  20764. if (ssl->options.dtls && ssl->options.tls1_3) {
  20765. byte isEarlyData = 0;
  20766. if (ssl->dtls13EncryptEpoch == NULL)
  20767. return ssl->error = BAD_STATE_E;
  20768. #ifdef WOLFSSL_EARLY_DATA
  20769. isEarlyData = ssl->earlyData != no_early_data;
  20770. #endif
  20771. if (isEarlyData) {
  20772. #ifdef WOLFSSL_EARLY_DATA
  20773. ret = Dtls13SetEpochKeys(ssl,
  20774. w64From32(0x0, DTLS13_EPOCH_EARLYDATA), ENCRYPT_SIDE_ONLY);
  20775. if (ret != 0) {
  20776. WOLFSSL_MSG(
  20777. "trying to send early data without epoch 1");
  20778. ssl->error = BUILD_MSG_ERROR;
  20779. return WOLFSSL_FATAL_ERROR;
  20780. }
  20781. #endif /* WOLFSSL_EARLY_DATA */
  20782. }
  20783. else if (!w64Equal(
  20784. ssl->dtls13EncryptEpoch->epochNumber,
  20785. ssl->dtls13Epoch)) {
  20786. ret = Dtls13SetEpochKeys(
  20787. ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
  20788. if (ret != 0) {
  20789. ssl->error = BUILD_MSG_ERROR;
  20790. return WOLFSSL_FATAL_ERROR;
  20791. }
  20792. }
  20793. }
  20794. #endif /* WOLFSSL_DTLS13 */
  20795. #ifdef WOLFSSL_DTLS
  20796. if (ssl->options.dtls) {
  20797. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  20798. }
  20799. else
  20800. #endif
  20801. {
  20802. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  20803. }
  20804. if (sent == sz) break;
  20805. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
  20806. if (ssl->options.dtls && (buffSz < sz - sent)) {
  20807. ssl->error = DTLS_SIZE_ERROR;
  20808. WOLFSSL_ERROR(ssl->error);
  20809. return ssl->error;
  20810. }
  20811. #endif
  20812. outputSz = buffSz + COMP_EXTRA + DTLS_RECORD_HEADER_SZ;
  20813. if (IsEncryptionOn(ssl, 1) || ssl->options.tls1_3)
  20814. outputSz += cipherExtraData(ssl);
  20815. /* check for available size */
  20816. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  20817. return ssl->error = ret;
  20818. /* get output buffer */
  20819. out = GetOutputBuffer(ssl);
  20820. #ifdef HAVE_LIBZ
  20821. if (ssl->options.usingCompression) {
  20822. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  20823. if (buffSz < 0) {
  20824. return buffSz;
  20825. }
  20826. sendBuffer = comp;
  20827. }
  20828. #endif
  20829. if (!ssl->options.tls1_3) {
  20830. #ifdef WOLFSSL_ASYNC_CRYPT
  20831. if (ssl->async == NULL) {
  20832. ssl->async = (struct WOLFSSL_ASYNC*)
  20833. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  20834. DYNAMIC_TYPE_ASYNC);
  20835. if (ssl->async == NULL)
  20836. return MEMORY_E;
  20837. ssl->async->freeArgs = NULL;
  20838. }
  20839. #endif
  20840. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  20841. application_data, 0, 0, 1, CUR_ORDER);
  20842. }
  20843. else {
  20844. #ifdef WOLFSSL_TLS13
  20845. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  20846. application_data, 0, 0, 1);
  20847. #else
  20848. sendSz = BUFFER_ERROR;
  20849. #endif
  20850. }
  20851. if (sendSz < 0) {
  20852. #ifdef WOLFSSL_ASYNC_CRYPT
  20853. if (sendSz == WC_PENDING_E)
  20854. ssl->error = sendSz;
  20855. #endif
  20856. return BUILD_MSG_ERROR;
  20857. }
  20858. #ifdef WOLFSSL_ASYNC_CRYPT
  20859. FreeAsyncCtx(ssl, 0);
  20860. #endif
  20861. ssl->buffers.outputBuffer.length += sendSz;
  20862. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  20863. WOLFSSL_ERROR(ssl->error);
  20864. /* store for next call if WANT_WRITE or user embedSend() that
  20865. doesn't present like WANT_WRITE */
  20866. ssl->buffers.plainSz = buffSz;
  20867. ssl->buffers.prevSent = sent;
  20868. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  20869. ssl->options.isClosed)) {
  20870. ssl->error = SOCKET_PEER_CLOSED_E;
  20871. WOLFSSL_ERROR(ssl->error);
  20872. return 0; /* peer reset or closed */
  20873. }
  20874. return ssl->error;
  20875. }
  20876. sent += buffSz;
  20877. /* only one message per attempt */
  20878. if (ssl->options.partialWrite == 1) {
  20879. WOLFSSL_MSG("Partial Write on, only sending one record");
  20880. break;
  20881. }
  20882. }
  20883. return sent;
  20884. }
  20885. /* process input data */
  20886. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  20887. {
  20888. int size;
  20889. WOLFSSL_ENTER("ReceiveData");
  20890. /* reset error state */
  20891. if (ssl->error == WANT_READ || ssl->error == WOLFSSL_ERROR_WANT_READ) {
  20892. ssl->error = 0;
  20893. }
  20894. #ifdef WOLFSSL_DTLS
  20895. if (ssl->options.dtls) {
  20896. /* In DTLS mode, we forgive some errors and allow the session
  20897. * to continue despite them. */
  20898. if (ssl->error == VERIFY_MAC_ERROR ||
  20899. ssl->error == DECRYPT_ERROR ||
  20900. ssl->error == DTLS_SIZE_ERROR) {
  20901. ssl->error = 0;
  20902. }
  20903. }
  20904. #endif /* WOLFSSL_DTLS */
  20905. if (ssl->error != 0 && ssl->error != WANT_WRITE
  20906. #ifdef WOLFSSL_ASYNC_CRYPT
  20907. && ssl->error != WC_PENDING_E
  20908. #endif
  20909. #ifdef HAVE_SECURE_RENEGOTIATION
  20910. && ssl->error != APP_DATA_READY
  20911. #endif
  20912. ) {
  20913. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  20914. return ssl->error;
  20915. }
  20916. #ifdef WOLFSSL_EARLY_DATA
  20917. if (ssl->earlyData != no_early_data) {
  20918. }
  20919. else
  20920. #endif
  20921. {
  20922. int negotiate = 0;
  20923. #ifdef HAVE_SECURE_RENEGOTIATION
  20924. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  20925. if (ssl->options.handShakeState != HANDSHAKE_DONE
  20926. && ssl->buffers.clearOutputBuffer.length == 0)
  20927. negotiate = 1;
  20928. }
  20929. else
  20930. #endif
  20931. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  20932. negotiate = 1;
  20933. if (negotiate) {
  20934. int err;
  20935. WOLFSSL_MSG("Handshake not complete, trying to finish");
  20936. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  20937. #ifdef WOLFSSL_ASYNC_CRYPT
  20938. /* if async would block return WANT_WRITE */
  20939. if (ssl->error == WC_PENDING_E) {
  20940. return WOLFSSL_CBIO_ERR_WANT_READ;
  20941. }
  20942. #endif
  20943. return err;
  20944. }
  20945. }
  20946. }
  20947. #ifdef HAVE_SECURE_RENEGOTIATION
  20948. startScr:
  20949. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  20950. int ret;
  20951. WOLFSSL_MSG("Need to start scr, server requested");
  20952. ret = wolfSSL_Rehandshake(ssl);
  20953. ssl->secure_renegotiation->startScr = 0; /* only start once */
  20954. if (ret != WOLFSSL_SUCCESS)
  20955. return ret;
  20956. }
  20957. #endif
  20958. while (ssl->buffers.clearOutputBuffer.length == 0) {
  20959. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  20960. if (ssl->error == ZERO_RETURN) {
  20961. WOLFSSL_MSG("Zero return, no more data coming");
  20962. return 0; /* no more data coming */
  20963. }
  20964. if (ssl->error == SOCKET_ERROR_E) {
  20965. if (ssl->options.connReset || ssl->options.isClosed) {
  20966. WOLFSSL_MSG("Peer reset or closed, connection done");
  20967. ssl->error = SOCKET_PEER_CLOSED_E;
  20968. WOLFSSL_ERROR(ssl->error);
  20969. return 0; /* peer reset or closed */
  20970. }
  20971. }
  20972. WOLFSSL_ERROR(ssl->error);
  20973. return ssl->error;
  20974. }
  20975. #ifdef WOLFSSL_DTLS13
  20976. if (ssl->options.dtls) {
  20977. /* Dtls13DoScheduledWork(ssl) may return WANT_WRITE */
  20978. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  20979. WOLFSSL_ERROR(ssl->error);
  20980. return ssl->error;
  20981. }
  20982. }
  20983. #endif /* WOLFSSL_DTLS13 */
  20984. #ifdef HAVE_SECURE_RENEGOTIATION
  20985. if (ssl->secure_renegotiation &&
  20986. ssl->secure_renegotiation->startScr) {
  20987. goto startScr;
  20988. }
  20989. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  20990. ssl->options.handShakeState != HANDSHAKE_DONE
  20991. && ssl->buffers.clearOutputBuffer.length == 0) {
  20992. /* ProcessReply processed a handshake packet and not any APP DATA
  20993. * so let's move the handshake along */
  20994. int err;
  20995. WOLFSSL_MSG("Handshake not complete, trying to finish");
  20996. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  20997. #ifdef WOLFSSL_ASYNC_CRYPT
  20998. /* if async would block return WANT_WRITE */
  20999. if (ssl->error == WC_PENDING_E) {
  21000. return WOLFSSL_CBIO_ERR_WANT_READ;
  21001. }
  21002. #endif
  21003. return err;
  21004. }
  21005. }
  21006. #endif
  21007. #ifdef WOLFSSL_DTLS13
  21008. /* if wolfSSL_Peek() is invoked with sz == 0 it will not block (but
  21009. * it processes pending non-application records) */
  21010. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version) && peek &&
  21011. sz == 0 && ssl->buffers.inputBuffer.idx
  21012. - ssl->buffers.inputBuffer.length == 0) {
  21013. return 0;
  21014. }
  21015. #endif /* WOLFSSL_DTLS13 */
  21016. #ifndef WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
  21017. #ifdef WOLFSSL_TLS13
  21018. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
  21019. ssl->curRL.type == handshake && peek) {
  21020. WOLFSSL_MSG("Got Handshake Message in APP data");
  21021. if (ssl->buffers.inputBuffer.length == 0) {
  21022. ssl->error = WOLFSSL_ERROR_WANT_READ;
  21023. return 0;
  21024. }
  21025. }
  21026. #endif
  21027. #endif
  21028. }
  21029. size = min(sz, (int)ssl->buffers.clearOutputBuffer.length);
  21030. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  21031. if (peek == 0) {
  21032. ssl->buffers.clearOutputBuffer.length -= size;
  21033. ssl->buffers.clearOutputBuffer.buffer += size;
  21034. }
  21035. if (ssl->buffers.inputBuffer.dynamicFlag)
  21036. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  21037. WOLFSSL_LEAVE("ReceiveData()", size);
  21038. return size;
  21039. }
  21040. static int SendAlert_ex(WOLFSSL* ssl, int severity, int type)
  21041. {
  21042. byte input[ALERT_SIZE];
  21043. byte *output;
  21044. int sendSz;
  21045. int ret;
  21046. int outputSz;
  21047. int dtlsExtra = 0;
  21048. WOLFSSL_ENTER("SendAlert");
  21049. WOLFSSL_MSG_EX("SendAlert: %d %s", type, AlertTypeToString(type));
  21050. #ifdef WOLFSSL_QUIC
  21051. if (WOLFSSL_IS_QUIC(ssl)) {
  21052. ret = !ssl->quic.method->send_alert(ssl, ssl->quic.enc_level_write, (uint8_t)type);
  21053. if (ret) {
  21054. WOLFSSL_MSG("QUIC send_alert callback error");
  21055. }
  21056. return ret;
  21057. }
  21058. #endif
  21059. #ifdef HAVE_WRITE_DUP
  21060. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  21061. int notifyErr = 0;
  21062. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  21063. if (type == close_notify) {
  21064. notifyErr = ZERO_RETURN;
  21065. } else if (severity == alert_fatal) {
  21066. notifyErr = FATAL_ERROR;
  21067. }
  21068. if (notifyErr != 0) {
  21069. return NotifyWriteSide(ssl, notifyErr);
  21070. }
  21071. return 0;
  21072. }
  21073. #endif
  21074. ssl->pendingAlert.code = type;
  21075. ssl->pendingAlert.level = severity;
  21076. #ifdef OPENSSL_EXTRA
  21077. if (ssl->CBIS != NULL) {
  21078. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  21079. }
  21080. #endif
  21081. #ifdef WOLFSSL_DTLS
  21082. if (ssl->options.dtls)
  21083. dtlsExtra = DTLS_RECORD_EXTRA;
  21084. #endif
  21085. /* check for available size */
  21086. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  21087. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  21088. #ifdef WOLFSSL_DTLS
  21089. /* If CheckAvailableSize returned WANT_WRITE due to a blocking write
  21090. * then discard pending output and just send the alert. */
  21091. if (ssl->options.dtls) {
  21092. if (ret != WANT_WRITE || severity != alert_fatal)
  21093. return ret;
  21094. ShrinkOutputBuffer(ssl);
  21095. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  21096. return ret;
  21097. }
  21098. }
  21099. else {
  21100. return ret;
  21101. }
  21102. #else
  21103. return ret;
  21104. #endif
  21105. }
  21106. /* Check output buffer */
  21107. if (ssl->buffers.outputBuffer.buffer == NULL)
  21108. return BUFFER_E;
  21109. /* get output buffer */
  21110. output = GetOutputBuffer(ssl);
  21111. input[0] = (byte)severity;
  21112. input[1] = (byte)type;
  21113. ssl->alert_history.last_tx.code = type;
  21114. ssl->alert_history.last_tx.level = severity;
  21115. if (severity == alert_fatal) {
  21116. #ifdef WOLFSSL_DTLS
  21117. /* Mark as closed in dtls only once we enter stateful mode. */
  21118. if (!ssl->options.dtls || ssl->options.dtlsStateful)
  21119. #endif
  21120. ssl->options.isClosed = 1; /* Don't send close_notify */
  21121. }
  21122. /* send encrypted alert if encryption is on - can be a rehandshake over
  21123. * an existing encrypted channel.
  21124. * TLS 1.3 encrypts handshake packets after the ServerHello
  21125. */
  21126. if (IsEncryptionOn(ssl, 1)) {
  21127. #ifdef WOLFSSL_DTLS13
  21128. if (ssl->options.dtls
  21129. && IsAtLeastTLSv1_3(ssl->version)
  21130. && !w64Equal(ssl->dtls13EncryptEpoch->epochNumber, ssl->dtls13Epoch)) {
  21131. ret = Dtls13SetEpochKeys(ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
  21132. if (ret != 0)
  21133. return ret;
  21134. }
  21135. #endif /* WOLFSSL_DTLS13 */
  21136. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  21137. 0, 0, 0, CUR_ORDER);
  21138. }
  21139. else {
  21140. #ifdef WOLFSSL_DTLS13
  21141. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  21142. ret = Dtls13RlAddPlaintextHeader(ssl, output, alert, ALERT_SIZE);
  21143. if (ret != 0)
  21144. return ret;
  21145. }
  21146. else
  21147. #endif /* WOLFSSL_DTLS13 */
  21148. {
  21149. AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
  21150. }
  21151. output += RECORD_HEADER_SZ;
  21152. #ifdef WOLFSSL_DTLS
  21153. if (ssl->options.dtls)
  21154. output += DTLS_RECORD_EXTRA;
  21155. #endif
  21156. XMEMCPY(output, input, ALERT_SIZE);
  21157. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  21158. #ifdef WOLFSSL_DTLS
  21159. if (ssl->options.dtls)
  21160. sendSz += DTLS_RECORD_EXTRA;
  21161. #endif
  21162. }
  21163. if (sendSz < 0)
  21164. return BUILD_MSG_ERROR;
  21165. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  21166. if (ssl->hsInfoOn)
  21167. AddPacketName(ssl, "Alert");
  21168. if (ssl->toInfoOn) {
  21169. ret = AddPacketInfo(ssl, "Alert", alert, output, sendSz,
  21170. WRITE_PROTO, 0, ssl->heap);
  21171. if (ret != 0)
  21172. return ret;
  21173. }
  21174. #endif
  21175. ssl->buffers.outputBuffer.length += sendSz;
  21176. ret = SendBuffered(ssl);
  21177. ssl->pendingAlert.code = 0;
  21178. ssl->pendingAlert.level = alert_none;
  21179. WOLFSSL_LEAVE("SendAlert", ret);
  21180. return ret;
  21181. }
  21182. int RetrySendAlert(WOLFSSL* ssl)
  21183. {
  21184. int type = ssl->pendingAlert.code;
  21185. int severity = ssl->pendingAlert.level;
  21186. if (severity == alert_none)
  21187. return 0;
  21188. ssl->pendingAlert.code = 0;
  21189. ssl->pendingAlert.level = alert_none;
  21190. return SendAlert_ex(ssl, severity, type);
  21191. }
  21192. /* send alert message */
  21193. int SendAlert(WOLFSSL* ssl, int severity, int type)
  21194. {
  21195. if (ssl->pendingAlert.level != alert_none) {
  21196. int ret = RetrySendAlert(ssl);
  21197. if (ret != 0) {
  21198. if (ssl->pendingAlert.level == alert_none ||
  21199. (ssl->pendingAlert.level != alert_fatal &&
  21200. severity == alert_fatal)) {
  21201. /* Store current alert if pendingAlert is empty or if current
  21202. * is fatal and previous was not */
  21203. ssl->pendingAlert.code = type;
  21204. ssl->pendingAlert.level = severity;
  21205. }
  21206. return ret;
  21207. }
  21208. }
  21209. return SendAlert_ex(ssl, severity, type);
  21210. }
  21211. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  21212. {
  21213. #ifdef NO_ERROR_STRINGS
  21214. (void)e;
  21215. return "no support for error strings built in";
  21216. #else
  21217. int error = (int)e;
  21218. /* OpenSSL uses positive error codes */
  21219. if (error > 0) {
  21220. error = -error;
  21221. }
  21222. /* pass to wolfCrypt */
  21223. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  21224. return wc_GetErrorString(error);
  21225. }
  21226. switch (error) {
  21227. #ifdef OPENSSL_EXTRA
  21228. case 0 :
  21229. return "ok";
  21230. #endif
  21231. case UNSUPPORTED_SUITE :
  21232. return "unsupported cipher suite";
  21233. case INPUT_CASE_ERROR :
  21234. return "input state error";
  21235. case PREFIX_ERROR :
  21236. return "bad index to key rounds";
  21237. case MEMORY_ERROR :
  21238. return "out of memory";
  21239. case VERIFY_FINISHED_ERROR :
  21240. return "verify problem on finished";
  21241. case VERIFY_MAC_ERROR :
  21242. return "verify mac problem";
  21243. case PARSE_ERROR :
  21244. return "parse error on header";
  21245. case SIDE_ERROR :
  21246. return "wrong client/server type";
  21247. case NO_PEER_CERT : /* OpenSSL compatibility expects this exact text */
  21248. return "peer did not return a certificate";
  21249. case UNKNOWN_HANDSHAKE_TYPE :
  21250. return "weird handshake type";
  21251. case SOCKET_ERROR_E :
  21252. return "error state on socket";
  21253. case SOCKET_NODATA :
  21254. return "expected data, not there";
  21255. case INCOMPLETE_DATA :
  21256. return "don't have enough data to complete task";
  21257. case UNKNOWN_RECORD_TYPE :
  21258. return "unknown type in record hdr";
  21259. case DECRYPT_ERROR :
  21260. return "error during decryption";
  21261. case FATAL_ERROR :
  21262. return "received alert fatal error";
  21263. case ENCRYPT_ERROR :
  21264. return "error during encryption";
  21265. case FREAD_ERROR :
  21266. return "fread problem";
  21267. case NO_PEER_KEY :
  21268. return "need peer's key";
  21269. case NO_PRIVATE_KEY :
  21270. return "need the private key";
  21271. case NO_DH_PARAMS :
  21272. return "server missing DH params";
  21273. case RSA_PRIVATE_ERROR :
  21274. return "error during rsa priv op";
  21275. case MATCH_SUITE_ERROR :
  21276. return "can't match cipher suite";
  21277. case COMPRESSION_ERROR :
  21278. return "compression mismatch error";
  21279. case BUILD_MSG_ERROR :
  21280. return "build message failure";
  21281. case BAD_HELLO :
  21282. return "client hello malformed";
  21283. case DOMAIN_NAME_MISMATCH :
  21284. return "peer subject name mismatch";
  21285. case IPADDR_MISMATCH :
  21286. return "peer ip address mismatch";
  21287. case WANT_READ :
  21288. case -WOLFSSL_ERROR_WANT_READ :
  21289. return "non-blocking socket wants data to be read";
  21290. case NOT_READY_ERROR :
  21291. return "handshake layer not ready yet, complete first";
  21292. case VERSION_ERROR :
  21293. return "record layer version error";
  21294. case WANT_WRITE :
  21295. case -WOLFSSL_ERROR_WANT_WRITE :
  21296. return "non-blocking socket write buffer full";
  21297. case -WOLFSSL_ERROR_WANT_CONNECT:
  21298. case -WOLFSSL_ERROR_WANT_ACCEPT:
  21299. return "The underlying BIO was not yet connected";
  21300. case -WOLFSSL_ERROR_SYSCALL:
  21301. return "fatal I/O error in TLS layer";
  21302. case -WOLFSSL_ERROR_WANT_X509_LOOKUP:
  21303. return "application client cert callback asked to be called again";
  21304. case -WOLFSSL_ERROR_SSL:
  21305. return "fatal TLS protocol error";
  21306. case BUFFER_ERROR :
  21307. return "malformed buffer input error";
  21308. case VERIFY_CERT_ERROR :
  21309. return "verify problem on certificate";
  21310. case VERIFY_SIGN_ERROR :
  21311. return "verify problem based on signature";
  21312. case CLIENT_ID_ERROR :
  21313. return "psk client identity error";
  21314. case SERVER_HINT_ERROR:
  21315. return "psk server hint error";
  21316. case PSK_KEY_ERROR:
  21317. return "psk key callback error";
  21318. case GETTIME_ERROR:
  21319. return "gettimeofday() error";
  21320. case GETITIMER_ERROR:
  21321. return "getitimer() error";
  21322. case SIGACT_ERROR:
  21323. return "sigaction() error";
  21324. case SETITIMER_ERROR:
  21325. return "setitimer() error";
  21326. case LENGTH_ERROR:
  21327. return "record layer length error";
  21328. case PEER_KEY_ERROR:
  21329. return "can't decode peer key";
  21330. case ZERO_RETURN:
  21331. case -WOLFSSL_ERROR_ZERO_RETURN:
  21332. return "peer sent close notify alert";
  21333. case ECC_CURVETYPE_ERROR:
  21334. return "Bad ECC Curve Type or unsupported";
  21335. case ECC_CURVE_ERROR:
  21336. return "Bad ECC Curve or unsupported";
  21337. case ECC_PEERKEY_ERROR:
  21338. return "Bad ECC Peer Key";
  21339. case ECC_MAKEKEY_ERROR:
  21340. return "ECC Make Key failure";
  21341. case ECC_EXPORT_ERROR:
  21342. return "ECC Export Key failure";
  21343. case ECC_SHARED_ERROR:
  21344. return "ECC DHE shared failure";
  21345. case NOT_CA_ERROR:
  21346. return "Not a CA by basic constraint error";
  21347. case BAD_CERT_MANAGER_ERROR:
  21348. return "Bad Cert Manager error";
  21349. case OCSP_CERT_REVOKED:
  21350. return "OCSP Cert revoked";
  21351. case CRL_CERT_REVOKED:
  21352. #ifdef OPENSSL_EXTRA
  21353. return "certificate revoked";
  21354. #else
  21355. return "CRL Cert revoked";
  21356. #endif
  21357. case CRL_MISSING:
  21358. return "CRL missing, not loaded";
  21359. case MONITOR_SETUP_E:
  21360. return "CRL monitor setup error";
  21361. case THREAD_CREATE_E:
  21362. return "Thread creation problem";
  21363. case OCSP_NEED_URL:
  21364. return "OCSP need URL";
  21365. case OCSP_CERT_UNKNOWN:
  21366. return "OCSP Cert unknown";
  21367. case OCSP_LOOKUP_FAIL:
  21368. return "OCSP Responder lookup fail";
  21369. case MAX_CHAIN_ERROR:
  21370. return "Maximum Chain Depth Exceeded";
  21371. case COOKIE_ERROR:
  21372. return "DTLS Cookie Error";
  21373. case SEQUENCE_ERROR:
  21374. return "DTLS Sequence Error";
  21375. case SUITES_ERROR:
  21376. return "Suites Pointer Error";
  21377. case OUT_OF_ORDER_E:
  21378. return "Out of order message, fatal";
  21379. case BAD_KEA_TYPE_E:
  21380. return "Bad KEA type found";
  21381. case SANITY_CIPHER_E:
  21382. return "Sanity check on ciphertext failed";
  21383. case RECV_OVERFLOW_E:
  21384. return "Receive callback returned more than requested";
  21385. case GEN_COOKIE_E:
  21386. return "Generate Cookie Error";
  21387. case NO_PEER_VERIFY:
  21388. return "Need peer certificate verify Error";
  21389. case FWRITE_ERROR:
  21390. return "fwrite Error";
  21391. case CACHE_MATCH_ERROR:
  21392. return "Cache restore header match Error";
  21393. case UNKNOWN_SNI_HOST_NAME_E:
  21394. return "Unrecognized host name Error";
  21395. case UNKNOWN_MAX_FRAG_LEN_E:
  21396. return "Unrecognized max frag len Error";
  21397. case KEYUSE_SIGNATURE_E:
  21398. return "Key Use digitalSignature not set Error";
  21399. case KEYUSE_ENCIPHER_E:
  21400. return "Key Use keyEncipherment not set Error";
  21401. case EXTKEYUSE_AUTH_E:
  21402. return "Ext Key Use server/client auth not set Error";
  21403. case SEND_OOB_READ_E:
  21404. return "Send Callback Out of Bounds Read Error";
  21405. case SECURE_RENEGOTIATION_E:
  21406. return "Invalid Renegotiation Error";
  21407. case SESSION_TICKET_LEN_E:
  21408. return "Session Ticket Too Long Error";
  21409. case SESSION_TICKET_EXPECT_E:
  21410. return "Session Ticket Error";
  21411. case SESSION_SECRET_CB_E:
  21412. return "Session Secret Callback Error";
  21413. case NO_CHANGE_CIPHER_E:
  21414. return "Finished received from peer before Change Cipher Error";
  21415. case SANITY_MSG_E:
  21416. return "Sanity Check on message order Error";
  21417. case DUPLICATE_MSG_E:
  21418. return "Duplicate HandShake message Error";
  21419. case SNI_UNSUPPORTED:
  21420. return "Protocol version does not support SNI Error";
  21421. case SOCKET_PEER_CLOSED_E:
  21422. return "Peer closed underlying transport Error";
  21423. case BAD_TICKET_KEY_CB_SZ:
  21424. return "Bad user session ticket key callback Size Error";
  21425. case BAD_TICKET_MSG_SZ:
  21426. return "Bad session ticket message Size Error";
  21427. case BAD_TICKET_ENCRYPT:
  21428. return "Bad user ticket callback encrypt Error";
  21429. case DH_KEY_SIZE_E:
  21430. return "DH key too small Error";
  21431. case SNI_ABSENT_ERROR:
  21432. return "No Server Name Indication extension Error";
  21433. case RSA_SIGN_FAULT:
  21434. return "RSA Signature Fault Error";
  21435. case HANDSHAKE_SIZE_ERROR:
  21436. return "Handshake message too large Error";
  21437. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  21438. return "Unrecognized protocol name Error";
  21439. case BAD_CERTIFICATE_STATUS_ERROR:
  21440. return "Bad Certificate Status Message Error";
  21441. case OCSP_INVALID_STATUS:
  21442. return "Invalid OCSP Status Error";
  21443. case OCSP_WANT_READ:
  21444. return "OCSP nonblock wants read";
  21445. case RSA_KEY_SIZE_E:
  21446. return "RSA key too small";
  21447. case ECC_KEY_SIZE_E:
  21448. return "ECC key too small";
  21449. case DTLS_EXPORT_VER_E:
  21450. return "Version needs updated after code change or version mismatch";
  21451. case INPUT_SIZE_E:
  21452. return "Input size too large Error";
  21453. case CTX_INIT_MUTEX_E:
  21454. return "Initialize ctx mutex error";
  21455. case EXT_MASTER_SECRET_NEEDED_E:
  21456. return "Extended Master Secret must be enabled to resume EMS session";
  21457. case DTLS_POOL_SZ_E:
  21458. return "Maximum DTLS pool size exceeded";
  21459. case DECODE_E:
  21460. return "Decode handshake message error";
  21461. case WRITE_DUP_READ_E:
  21462. return "Write dup write side can't read error";
  21463. case WRITE_DUP_WRITE_E:
  21464. return "Write dup read side can't write error";
  21465. case INVALID_CERT_CTX_E:
  21466. return "Certificate context does not match request or not empty";
  21467. case BAD_KEY_SHARE_DATA:
  21468. return "The Key Share data contains group that wasn't in Client Hello";
  21469. case MISSING_HANDSHAKE_DATA:
  21470. return "The handshake message is missing required data";
  21471. case BAD_BINDER: /* OpenSSL compatibility expects this exact text */
  21472. return "binder does not verify";
  21473. case EXT_NOT_ALLOWED:
  21474. return "Extension type not allowed in handshake message type";
  21475. case INVALID_PARAMETER:
  21476. return "The security parameter is invalid";
  21477. case UNSUPPORTED_EXTENSION:
  21478. return "TLS Extension not requested by the client";
  21479. case PRF_MISSING:
  21480. return "Pseudo-random function is not enabled";
  21481. case KEY_SHARE_ERROR:
  21482. return "Key share extension did not contain a valid named group";
  21483. case POST_HAND_AUTH_ERROR:
  21484. return "Client will not do post handshake authentication";
  21485. case HRR_COOKIE_ERROR:
  21486. return "Cookie does not match one sent in HelloRetryRequest";
  21487. case MCAST_HIGHWATER_CB_E:
  21488. return "Multicast highwater callback returned error";
  21489. case ALERT_COUNT_E:
  21490. return "Alert Count exceeded error";
  21491. case EXT_MISSING:
  21492. return "Required TLS extension missing";
  21493. case DTLS_RETX_OVER_TX:
  21494. return "DTLS interrupting flight transmit with retransmit";
  21495. case DH_PARAMS_NOT_FFDHE_E:
  21496. return "Server DH parameters were not from the FFDHE set as required";
  21497. case TCA_INVALID_ID_TYPE:
  21498. return "TLS Extension Trusted CA ID type invalid";
  21499. case TCA_ABSENT_ERROR:
  21500. return "TLS Extension Trusted CA ID response absent";
  21501. case TSIP_MAC_DIGSZ_E:
  21502. return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
  21503. case CLIENT_CERT_CB_ERROR:
  21504. return "Error importing client cert or key from callback";
  21505. case SSL_SHUTDOWN_ALREADY_DONE_E:
  21506. return "Shutdown has already occurred";
  21507. case TLS13_SECRET_CB_E:
  21508. return "TLS1.3 Secret Callback Error";
  21509. case DTLS_SIZE_ERROR:
  21510. return "DTLS trying to send too much in single datagram error";
  21511. case NO_CERT_ERROR:
  21512. return "TLS1.3 No Certificate Set Error";
  21513. case APP_DATA_READY:
  21514. return "Application data is available for reading";
  21515. case TOO_MUCH_EARLY_DATA:
  21516. return "Too much early data";
  21517. case SOCKET_FILTERED_E:
  21518. return "Session stopped by network filter";
  21519. #ifdef HAVE_HTTP_CLIENT
  21520. case HTTP_TIMEOUT:
  21521. return "HTTP timeout for OCSP or CRL req";
  21522. case HTTP_RECV_ERR:
  21523. return "HTTP Receive error";
  21524. case HTTP_HEADER_ERR:
  21525. return "HTTP Header error";
  21526. case HTTP_PROTO_ERR:
  21527. return "HTTP Protocol error";
  21528. case HTTP_STATUS_ERR:
  21529. return "HTTP Status error";
  21530. case HTTP_VERSION_ERR:
  21531. return "HTTP Version error";
  21532. case HTTP_APPSTR_ERR:
  21533. return "HTTP Application string error";
  21534. #endif
  21535. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  21536. /* TODO: -WOLFSSL_X509_V_ERR_CERT_SIGNATURE_FAILURE. Conflicts with
  21537. * -WOLFSSL_ERROR_WANT_CONNECT. */
  21538. case -WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID:
  21539. return "certificate not yet valid";
  21540. case -WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED:
  21541. return "certificate has expired";
  21542. case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
  21543. return "certificate signature failure";
  21544. case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
  21545. return "format error in certificate's notAfter field";
  21546. case -WOLFSSL_X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
  21547. return "self-signed certificate in certificate chain";
  21548. case -WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
  21549. return "unable to get local issuer certificate";
  21550. case -WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
  21551. return "unable to verify the first certificate";
  21552. case -WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG:
  21553. return "certificate chain too long";
  21554. case -WOLFSSL_X509_V_ERR_CERT_REVOKED:
  21555. return "certificate revoked";
  21556. case -WOLFSSL_X509_V_ERR_INVALID_CA:
  21557. return "invalid CA certificate";
  21558. case -WOLFSSL_X509_V_ERR_PATH_LENGTH_EXCEEDED:
  21559. return "path length constraint exceeded";
  21560. case -WOLFSSL_X509_V_ERR_CERT_REJECTED:
  21561. return "certificate rejected";
  21562. case -WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH:
  21563. return "subject issuer mismatch";
  21564. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || HAVE_WEBSERVER */
  21565. case UNSUPPORTED_PROTO_VERSION:
  21566. #ifdef OPENSSL_EXTRA
  21567. return "WRONG_SSL_VERSION";
  21568. #else
  21569. return "bad/unsupported protocol version";
  21570. #endif
  21571. case FALCON_KEY_SIZE_E:
  21572. return "Wrong key size for Falcon.";
  21573. case DILITHIUM_KEY_SIZE_E:
  21574. return "Wrong key size for Dilithium.";
  21575. #ifdef WOLFSSL_QUIC
  21576. case QUIC_TP_MISSING_E:
  21577. return "QUIC transport parameter not set";
  21578. case QUIC_WRONG_ENC_LEVEL:
  21579. return "QUIC data received at wrong encryption level";
  21580. #endif
  21581. case DTLS_CID_ERROR:
  21582. return "DTLS ConnectionID mismatch or missing";
  21583. case DTLS_TOO_MANY_FRAGMENTS_E:
  21584. return "Received too many fragmented messages from peer error";
  21585. case DUPLICATE_TLS_EXT_E:
  21586. return "Duplicate TLS extension in message.";
  21587. default :
  21588. return "unknown error number";
  21589. }
  21590. #endif /* NO_ERROR_STRINGS */
  21591. }
  21592. const char* wolfSSL_ERR_func_error_string(unsigned long e)
  21593. {
  21594. (void)e;
  21595. WOLFSSL_MSG("wolfSSL_ERR_func_error_string does not return the name of "
  21596. "the function that failed. Please inspect the wolfSSL debug "
  21597. "logs to determine where the error occurred.");
  21598. return "";
  21599. }
  21600. /* return library name
  21601. * @param e error code
  21602. * @return text library name,
  21603. * if there is no suitable library found, returns empty string
  21604. */
  21605. const char* wolfSSL_ERR_lib_error_string(unsigned long e)
  21606. {
  21607. int libe = 0;
  21608. (void)libe;
  21609. (void)e;
  21610. #if defined(OPENSSL_EXTRA)
  21611. libe = wolfSSL_ERR_GET_LIB(e);
  21612. switch (libe) {
  21613. case ERR_LIB_PEM:
  21614. return "wolfSSL PEM routines";
  21615. case ERR_LIB_EVP:
  21616. return "wolfSSL digital envelope routines";
  21617. default:
  21618. return "";
  21619. }
  21620. #else
  21621. return "";
  21622. #endif
  21623. }
  21624. void SetErrorString(int error, char* str)
  21625. {
  21626. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  21627. str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
  21628. }
  21629. #ifdef NO_CIPHER_SUITE_ALIASES
  21630. #ifndef NO_ERROR_STRINGS
  21631. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  21632. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  21633. #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
  21634. #else
  21635. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  21636. #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
  21637. #endif
  21638. #else
  21639. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  21640. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  21641. #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
  21642. #else
  21643. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  21644. #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
  21645. #endif
  21646. #endif
  21647. #else /* !NO_CIPHER_SUITE_ALIASES */
  21648. /* note that the comma is included at the end of the SUITE_ALIAS() macro
  21649. * definitions, to allow aliases to be gated out by the above null macros
  21650. * in the NO_CIPHER_SUITE_ALIASES section.
  21651. */
  21652. #ifndef NO_ERROR_STRINGS
  21653. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  21654. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  21655. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  21656. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  21657. #else
  21658. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  21659. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  21660. #endif
  21661. #else
  21662. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  21663. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  21664. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  21665. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  21666. #else
  21667. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  21668. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  21669. #endif
  21670. #endif
  21671. #endif /* NO_CIPHER_SUITE_ALIASES */
  21672. static const CipherSuiteInfo cipher_names[] =
  21673. {
  21674. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  21675. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  21676. #endif
  21677. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  21678. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
  21679. #endif
  21680. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  21681. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  21682. #endif
  21683. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  21684. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  21685. #endif
  21686. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  21687. 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),
  21688. SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
  21689. #endif
  21690. #ifdef BUILD_TLS_SM4_GCM_SM3
  21691. SUITE_INFO("TLS13-SM4-GCM-SM3","TLS_SM4_GCM_SM3",CIPHER_BYTE,TLS_SM4_GCM_SM3, TLSv1_3_MINOR, SSLv3_MAJOR),
  21692. #endif
  21693. #ifdef BUILD_TLS_SM4_CCM_SM3
  21694. SUITE_INFO("TLS13-SM4-CCM-SM3","TLS_SM4_CCM_SM3",CIPHER_BYTE,TLS_SM4_CCM_SM3, TLSv1_3_MINOR, SSLv3_MAJOR),
  21695. #endif
  21696. #ifdef BUILD_TLS_SHA256_SHA256
  21697. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  21698. #endif
  21699. #ifdef BUILD_TLS_SHA384_SHA384
  21700. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
  21701. #endif
  21702. #ifndef WOLFSSL_NO_TLS12
  21703. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  21704. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  21705. #endif
  21706. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  21707. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  21708. #endif
  21709. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  21710. 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),
  21711. #endif
  21712. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  21713. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  21714. #endif
  21715. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  21716. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  21717. #endif
  21718. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  21719. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  21720. #endif
  21721. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  21722. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  21723. #endif
  21724. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  21725. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  21726. #endif
  21727. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  21728. 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),
  21729. #endif
  21730. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  21731. 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),
  21732. #endif
  21733. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  21734. 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),
  21735. #endif
  21736. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  21737. 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),
  21738. #endif
  21739. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  21740. 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),
  21741. #endif
  21742. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  21743. 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),
  21744. #endif
  21745. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  21746. 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),
  21747. #endif
  21748. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  21749. 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),
  21750. #endif
  21751. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  21752. 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),
  21753. #endif
  21754. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  21755. 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),
  21756. #endif
  21757. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  21758. 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),
  21759. #endif
  21760. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  21761. 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),
  21762. #endif
  21763. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  21764. 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),
  21765. #endif
  21766. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  21767. 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),
  21768. #endif
  21769. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  21770. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  21771. #endif
  21772. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  21773. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  21774. #endif
  21775. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  21776. 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),
  21777. SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  21778. #endif
  21779. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  21780. 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),
  21781. SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  21782. #endif
  21783. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  21784. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  21785. #endif
  21786. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  21787. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21788. #endif
  21789. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  21790. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  21791. #endif
  21792. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  21793. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21794. #endif
  21795. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  21796. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  21797. #endif
  21798. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  21799. 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),
  21800. SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  21801. #endif
  21802. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  21803. 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),
  21804. SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  21805. #endif
  21806. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  21807. 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),
  21808. #endif
  21809. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  21810. 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),
  21811. SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  21812. #endif
  21813. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  21814. 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),
  21815. SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  21816. #endif
  21817. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  21818. 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),
  21819. #endif
  21820. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  21821. 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),
  21822. #endif
  21823. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  21824. 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),
  21825. #endif
  21826. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  21827. 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),
  21828. #endif
  21829. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  21830. 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),
  21831. #endif
  21832. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  21833. 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),
  21834. #endif
  21835. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  21836. 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),
  21837. #endif
  21838. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  21839. 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),
  21840. #endif
  21841. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  21842. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
  21843. #endif
  21844. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  21845. 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),
  21846. #endif
  21847. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  21848. 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),
  21849. #endif
  21850. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  21851. 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),
  21852. #endif
  21853. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  21854. 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),
  21855. #endif
  21856. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  21857. 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),
  21858. #endif
  21859. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  21860. 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),
  21861. #endif
  21862. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  21863. 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),
  21864. #endif
  21865. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  21866. 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),
  21867. #endif
  21868. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  21869. 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),
  21870. #endif
  21871. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  21872. 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),
  21873. #endif
  21874. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  21875. 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),
  21876. #endif
  21877. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  21878. 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),
  21879. #endif
  21880. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  21881. 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),
  21882. #endif
  21883. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  21884. 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),
  21885. #endif
  21886. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  21887. 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),
  21888. #endif
  21889. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  21890. 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),
  21891. #endif
  21892. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  21893. 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),
  21894. #endif
  21895. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  21896. 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),
  21897. #endif
  21898. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  21899. 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),
  21900. #endif
  21901. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  21902. 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),
  21903. #endif
  21904. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  21905. 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),
  21906. #endif
  21907. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  21908. 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),
  21909. #endif
  21910. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  21911. 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),
  21912. #endif
  21913. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  21914. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  21915. #endif
  21916. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  21917. 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),
  21918. #endif
  21919. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  21920. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  21921. #endif
  21922. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  21923. 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),
  21924. #endif
  21925. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  21926. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21927. #endif
  21928. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  21929. 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),
  21930. #endif
  21931. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  21932. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  21933. #endif
  21934. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  21935. 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),
  21936. #endif
  21937. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  21938. 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),
  21939. #endif
  21940. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  21941. 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),
  21942. #endif
  21943. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  21944. 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),
  21945. #endif
  21946. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  21947. 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),
  21948. #endif
  21949. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  21950. 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),
  21951. #endif
  21952. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  21953. 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),
  21954. #endif
  21955. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  21956. 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),
  21957. #endif
  21958. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  21959. 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),
  21960. #endif
  21961. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  21962. 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),
  21963. #endif
  21964. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  21965. 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),
  21966. #endif
  21967. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  21968. 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),
  21969. #endif
  21970. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  21971. 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),
  21972. #endif
  21973. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  21974. 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),
  21975. #endif
  21976. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  21977. 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),
  21978. #endif
  21979. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  21980. SUITE_INFO("ECDHE-ECDSA-SM4-CBC-SM3","TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3",SM_BYTE,TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3, TLSv1_2_MINOR, SSLv3_MAJOR),
  21981. #endif
  21982. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  21983. SUITE_INFO("ECDHE-ECDSA-SM4-GCM-SM3","TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3",SM_BYTE,TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3, TLSv1_2_MINOR, SSLv3_MAJOR),
  21984. #endif
  21985. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  21986. SUITE_INFO("ECDHE-ECDSA-SM4-CCM-SM3","TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3",SM_BYTE,TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3, TLSv1_2_MINOR, SSLv3_MAJOR),
  21987. #endif
  21988. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  21989. 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),
  21990. #endif
  21991. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  21992. 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),
  21993. #endif
  21994. #ifdef HAVE_RENEGOTIATION_INDICATION
  21995. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
  21996. #endif
  21997. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  21998. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  21999. #endif
  22000. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  22001. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  22002. #endif
  22003. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  22004. 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),
  22005. #endif
  22006. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
  22007. 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),
  22008. #endif
  22009. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  22010. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  22011. #endif
  22012. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  22013. 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),
  22014. #endif
  22015. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  22016. 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),
  22017. #endif
  22018. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  22019. 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),
  22020. #endif
  22021. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
  22022. SUITE_INFO("ECDHE-ECDSA-ARIA128-GCM-SHA256","TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR),
  22023. #endif
  22024. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
  22025. SUITE_INFO("ECDHE-ECDSA-ARIA256-GCM-SHA384","TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR),
  22026. #endif
  22027. #ifdef BUILD_WDM_WITH_NULL_SHA256
  22028. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
  22029. #endif
  22030. #endif /* WOLFSSL_NO_TLS12 */
  22031. };
  22032. /* returns the cipher_names array */
  22033. const CipherSuiteInfo* GetCipherNames(void)
  22034. {
  22035. return cipher_names;
  22036. }
  22037. /* returns the number of elements in the cipher_names array */
  22038. int GetCipherNamesSize(void)
  22039. {
  22040. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  22041. }
  22042. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  22043. {
  22044. int i;
  22045. const char* nameInternal = "None";
  22046. for (i = 0; i < GetCipherNamesSize(); i++) {
  22047. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  22048. (cipher_names[i].cipherSuite == cipherSuite)
  22049. #ifndef NO_CIPHER_SUITE_ALIASES
  22050. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  22051. #endif
  22052. ) {
  22053. nameInternal = cipher_names[i].name;
  22054. break;
  22055. }
  22056. }
  22057. return nameInternal;
  22058. }
  22059. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  22060. /* Segment cipher name into n[n0,n1,n2,n4]
  22061. * @param cipher a pointer to WOLFSSL_CIPHER
  22062. * @param n return segment cipher name
  22063. * return cipher name if cipher is in the list,
  22064. * otherwise NULL
  22065. */
  22066. const char* GetCipherSegment(const WOLFSSL_CIPHER* cipher, char n[][MAX_SEGMENT_SZ])
  22067. {
  22068. int i,j,k;
  22069. int strLen;
  22070. unsigned long offset;
  22071. const char* name;
  22072. /* sanity check */
  22073. if (cipher == NULL || n == NULL)
  22074. return NULL;
  22075. offset = cipher->offset;
  22076. if (offset >= (unsigned long)GetCipherNamesSize())
  22077. return NULL;
  22078. name = cipher_names[offset].name;
  22079. if (name == NULL)
  22080. return NULL;
  22081. /* Segment cipher name into n[n0,n1,n2,n4]
  22082. * These are used later for comparisons to create:
  22083. * keaStr, authStr, encStr, macStr
  22084. *
  22085. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  22086. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  22087. * and n = [n0,n1,n2,n3,0]
  22088. */
  22089. strLen = (int)XSTRLEN(name);
  22090. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  22091. if (k >= MAX_SEGMENTS || j >= MAX_SEGMENT_SZ)
  22092. break;
  22093. if (name[i] != '-' && name[i] != '\0') {
  22094. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  22095. j++;
  22096. }
  22097. else {
  22098. n[k][j] = '\0';
  22099. j = 0;
  22100. k++;
  22101. }
  22102. }
  22103. return name;
  22104. }
  22105. /* gcc-12 and later, building with ASAN at -O2 and higher, generate spurious
  22106. * stringop-overread warnings on some (but not all...) reads of n[1] in
  22107. * GetCipherKeaStr().
  22108. */
  22109. #if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
  22110. PRAGMA_GCC_DIAG_PUSH
  22111. PRAGMA_GCC("GCC diagnostic ignored \"-Wstringop-overread\"")
  22112. #endif
  22113. const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
  22114. const char* keaStr = NULL;
  22115. if (XSTRCMP(n[0],"ECDHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  22116. keaStr = "ECDHEPSK";
  22117. else if ((XSTRCMP(n[0],"ECDH") == 0) || (XSTRCMP(n[0],"ECDHE") == 0))
  22118. keaStr = "ECDH";
  22119. else if (XSTRCMP(n[0],"DHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  22120. keaStr = "DHEPSK";
  22121. else if (XSTRCMP(n[0],"DHE") == 0)
  22122. keaStr = "DH";
  22123. else if (XSTRCMP(n[0],"RSA") == 0 && XSTRCMP(n[1],"PSK") == 0)
  22124. keaStr = "RSAPSK";
  22125. else if (XSTRCMP(n[0],"SRP") == 0)
  22126. keaStr = "SRP";
  22127. else if (XSTRCMP(n[0],"PSK") == 0)
  22128. keaStr = "PSK";
  22129. else if (XSTRCMP(n[0],"EDH") == 0)
  22130. keaStr = "EDH";
  22131. else if ((XSTRNCMP(n[1],"SHA", 3) == 0) || (XSTRNCMP(n[2],"SHA", 3) == 0) ||
  22132. (XSTRNCMP(n[3],"SHA", 3) == 0) || (XSTRNCMP(n[4],"SHA", 3) == 0) ||
  22133. (XSTRCMP(n[2],"RSA") == 0) || (XSTRCMP(n[0],"AES128") == 0) ||
  22134. (XSTRCMP(n[0],"AES256") == 0) || (XSTRCMP(n[1],"MD5") == 0))
  22135. keaStr = "RSA";
  22136. else if (XSTRCMP(n[0],"NULL") == 0)
  22137. keaStr = "None";
  22138. else
  22139. keaStr = "unknown";
  22140. return keaStr;
  22141. }
  22142. #if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
  22143. PRAGMA_GCC_DIAG_POP
  22144. #endif
  22145. const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
  22146. const char* authStr = NULL;
  22147. if ((XSTRCMP(n[0],"AES128") == 0) || (XSTRCMP(n[0],"AES256") == 0) ||
  22148. ((XSTRCMP(n[0],"TLS13") == 0) && ((XSTRCMP(n[1],"AES128") == 0) ||
  22149. (XSTRCMP(n[1],"AES256") == 0) || (XSTRCMP(n[1],"CHACHA20") == 0))) ||
  22150. (XSTRCMP(n[0],"RSA") == 0) || (XSTRCMP(n[1],"RSA") == 0) ||
  22151. (XSTRNCMP(n[1],"SHA", 3) == 0) || (XSTRNCMP(n[2],"SHA", 3) == 0) ||
  22152. (XSTRCMP(n[1],"MD5") == 0))
  22153. authStr = "RSA";
  22154. else if (XSTRCMP(n[0],"PSK") == 0 || XSTRCMP(n[1],"PSK") == 0)
  22155. authStr = "PSK";
  22156. else if (XSTRCMP(n[0],"SRP") == 0 && XSTRCMP(n[1],"AES") == 0)
  22157. authStr = "SRP";
  22158. else if (XSTRCMP(n[1],"ECDSA") == 0)
  22159. authStr = "ECDSA";
  22160. else if (XSTRCMP(n[0],"ADH") == 0 || XSTRCMP(n[0],"NULL") == 0)
  22161. authStr = "None";
  22162. else
  22163. authStr = "unknown";
  22164. return authStr;
  22165. }
  22166. const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
  22167. const char* encStr = NULL;
  22168. if ((XSTRCMP(n[0],"AES256") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  22169. (XSTRCMP(n[1],"AES256") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  22170. (XSTRCMP(n[2],"AES256") == 0 && XSTRCMP(n[3],"GCM") == 0))
  22171. encStr = "AESGCM(256)";
  22172. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  22173. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  22174. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"GCM") == 0))
  22175. encStr = "AESGCM(128)";
  22176. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"CCM") == 0) ||
  22177. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"CCM") == 0) ||
  22178. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"CCM") == 0))
  22179. encStr = "AESCCM(128)";
  22180. else if ((XSTRCMP(n[0],"AES128") == 0) ||
  22181. (XSTRCMP(n[1],"AES128") == 0) ||
  22182. (XSTRCMP(n[2],"AES128") == 0) ||
  22183. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"128") == 0) ||
  22184. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"128") == 0))
  22185. encStr = "AES(128)";
  22186. else if ((XSTRCMP(n[0],"AES256") == 0) ||
  22187. (XSTRCMP(n[1],"AES256") == 0) ||
  22188. (XSTRCMP(n[2],"AES256") == 0) ||
  22189. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"256") == 0) ||
  22190. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"256") == 0))
  22191. encStr = "AES(256)";
  22192. #ifdef HAVE_ARIA
  22193. else if ((XSTRCMP(n[0],"ARIA256") == 0) ||
  22194. (XSTRCMP(n[2],"ARIA256") == 0))
  22195. encStr = "ARIA(256)";
  22196. else if ((XSTRCMP(n[0],"ARIA128") == 0) ||
  22197. (XSTRCMP(n[2],"ARIA128") == 0))
  22198. encStr = "ARIA(128)";
  22199. #endif
  22200. else if ((XSTRCMP(n[0],"CAMELLIA256") == 0) ||
  22201. (XSTRCMP(n[2],"CAMELLIA256") == 0))
  22202. encStr = "CAMELLIA(256)";
  22203. else if ((XSTRCMP(n[0],"CAMELLIA128") == 0) ||
  22204. (XSTRCMP(n[2],"CAMELLIA128") == 0))
  22205. encStr = "CAMELLIA(128)";
  22206. #ifdef WOLFSSL_SM4_GCM
  22207. else if ((XSTRCMP(n[0],"SM4") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  22208. (XSTRCMP(n[1],"SM4") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  22209. (XSTRCMP(n[2],"SM4") == 0 && XSTRCMP(n[3],"GCM") == 0))
  22210. encStr = "SM4-GCM";
  22211. #endif
  22212. #ifdef WOLFSSL_SM4_CCM
  22213. else if ((XSTRCMP(n[0],"SM4") == 0 && XSTRCMP(n[1],"CCM") == 0) ||
  22214. (XSTRCMP(n[1],"SM4") == 0 && XSTRCMP(n[2],"CCM") == 0) ||
  22215. (XSTRCMP(n[2],"SM4") == 0 && XSTRCMP(n[3],"CCM") == 0))
  22216. encStr = "SM4-CCM";
  22217. #endif
  22218. #ifdef WOLFSSL_SM4_CBC
  22219. else if ((XSTRCMP(n[0],"SM4") == 0) ||
  22220. (XSTRCMP(n[2],"SM4") == 0))
  22221. encStr = "SM4";
  22222. #endif
  22223. else if ((XSTRCMP(n[0],"RC4") == 0) || (XSTRCMP(n[1],"RC4") == 0) ||
  22224. (XSTRCMP(n[2],"RC4") == 0))
  22225. encStr = "RC4";
  22226. else if (((XSTRCMP(n[0],"DES") == 0) || (XSTRCMP(n[1],"DES") == 0) ||
  22227. (XSTRCMP(n[2],"DES") == 0)) &&
  22228. ((XSTRCMP(n[1],"CBC3") == 0) || (XSTRCMP(n[2],"CBC3") == 0) ||
  22229. (XSTRCMP(n[3],"CBC3") == 0)))
  22230. encStr = "3DES";
  22231. else if ((XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  22232. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  22233. encStr = "CHACHA20/POLY1305(256)";
  22234. else if ((XSTRCMP(n[0],"NULL") == 0) || (XSTRCMP(n[1],"NULL") == 0) ||
  22235. (XSTRCMP(n[2],"NULL") == 0) ||
  22236. ((XSTRCMP(n[0],"TLS13") == 0) && (XSTRCMP(n[3],"") == 0)))
  22237. encStr = "None";
  22238. else
  22239. encStr = "unknown";
  22240. return encStr;
  22241. }
  22242. /* Check if a cipher is AEAD
  22243. * @param n return segment cipher name
  22244. * return 1 if the cipher is AEAD, otherwise 0
  22245. */
  22246. int IsCipherAEAD(char n[][MAX_SEGMENT_SZ])
  22247. {
  22248. WOLFSSL_ENTER("IsCipherAEAD");
  22249. if (n == NULL) {
  22250. WOLFSSL_MSG("bad function argument. n is NULL.");
  22251. return 0;
  22252. }
  22253. if ((XSTRCMP(n[2],"GCM") == 0) || (XSTRCMP(n[3],"GCM") == 0) ||
  22254. (XSTRCMP(n[1],"CCM") == 0) ||
  22255. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  22256. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  22257. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  22258. return 1;
  22259. return 0;
  22260. }
  22261. /* Returns the MAC string of a cipher or "unknown" on failure */
  22262. const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
  22263. const char* macStr = NULL;
  22264. if ((XSTRCMP(n[4],"SHA256") == 0) || (XSTRCMP(n[3],"SHA256") == 0) ||
  22265. (XSTRCMP(n[2],"SHA256") == 0) || (XSTRCMP(n[1],"SHA256") == 0))
  22266. macStr = "SHA256";
  22267. else if ((XSTRCMP(n[4],"SHA384") == 0) ||
  22268. (XSTRCMP(n[3],"SHA384") == 0) ||
  22269. (XSTRCMP(n[2],"SHA384") == 0) ||
  22270. (XSTRCMP(n[1],"SHA384") == 0))
  22271. macStr = "SHA384";
  22272. #ifdef WOLFSSL_SM3
  22273. else if ((XSTRCMP(n[4],"SM3") == 0) ||
  22274. (XSTRCMP(n[3],"SM3") == 0) ||
  22275. (XSTRCMP(n[2],"SM3") == 0) ||
  22276. (XSTRCMP(n[1],"SM3") == 0))
  22277. macStr = "SM3";
  22278. #endif
  22279. else if ((XSTRCMP(n[4],"SHA") == 0) || (XSTRCMP(n[3],"SHA") == 0) ||
  22280. (XSTRCMP(n[2],"SHA") == 0) || (XSTRCMP(n[1],"SHA") == 0) ||
  22281. (XSTRCMP(n[1],"MD5") == 0))
  22282. macStr = "SHA1";
  22283. else if ((XSTRCMP(n[3],"GCM") == 0) ||
  22284. (XSTRCMP(n[1],"CCM") == 0) ||
  22285. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  22286. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  22287. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  22288. macStr = "AEAD";
  22289. else
  22290. macStr = "unknown";
  22291. return macStr;
  22292. }
  22293. /* Returns the number of bits based on the cipher enc string, or 0 on failure */
  22294. int SetCipherBits(const char* enc) {
  22295. int ret = WOLFSSL_FAILURE;
  22296. if ((XSTRCMP(enc,"AESGCM(256)") == 0) ||
  22297. (XSTRCMP(enc,"AES(256)") == 0) ||
  22298. (XSTRCMP(enc,"CAMELLIA(256)") == 0) ||
  22299. (XSTRCMP(enc,"CHACHA20/POLY1305(256)") == 0))
  22300. ret = 256;
  22301. else if
  22302. ((XSTRCMP(enc,"3DES") == 0))
  22303. ret = 168;
  22304. else if
  22305. ((XSTRCMP(enc,"AESGCM(128)") == 0) ||
  22306. (XSTRCMP(enc,"AES(128)") == 0) ||
  22307. (XSTRCMP(enc,"CAMELLIA(128)") == 0) ||
  22308. (XSTRCMP(enc,"RC4") == 0))
  22309. ret = 128;
  22310. else if
  22311. ((XSTRCMP(enc,"DES") == 0))
  22312. ret = 56;
  22313. return ret;
  22314. }
  22315. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  22316. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  22317. {
  22318. #ifndef NO_ERROR_STRINGS
  22319. int i;
  22320. const char* nameIana = "NONE";
  22321. for (i = 0; i < GetCipherNamesSize(); i++) {
  22322. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  22323. (cipher_names[i].cipherSuite == cipherSuite)
  22324. #ifndef NO_CIPHER_SUITE_ALIASES
  22325. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  22326. #endif
  22327. ) {
  22328. nameIana = cipher_names[i].name_iana;
  22329. break;
  22330. }
  22331. }
  22332. return nameIana;
  22333. #else
  22334. (void)cipherSuite0;
  22335. (void)cipherSuite;
  22336. return NULL;
  22337. #endif
  22338. }
  22339. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  22340. {
  22341. if (ssl == NULL) {
  22342. return NULL;
  22343. }
  22344. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  22345. }
  22346. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  22347. {
  22348. if (ssl == NULL) {
  22349. return NULL;
  22350. }
  22351. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  22352. }
  22353. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  22354. byte* cipherSuite, int* flags)
  22355. {
  22356. int ret = BAD_FUNC_ARG;
  22357. int i;
  22358. unsigned long len;
  22359. const char* nameDelim;
  22360. /* Support trailing : */
  22361. nameDelim = XSTRSTR(name, ":");
  22362. if (nameDelim)
  22363. len = (unsigned long)(nameDelim - name);
  22364. else
  22365. len = (unsigned long)XSTRLEN(name);
  22366. for (i = 0; i < GetCipherNamesSize(); i++) {
  22367. int found = (XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
  22368. (cipher_names[i].name[len] == 0);
  22369. #ifndef NO_ERROR_STRINGS
  22370. if (!found)
  22371. found = (XSTRNCMP(name, cipher_names[i].name_iana, len) == 0) &&
  22372. (cipher_names[i].name_iana[len] == 0);
  22373. #endif
  22374. if (found) {
  22375. *cipherSuite0 = cipher_names[i].cipherSuite0;
  22376. *cipherSuite = cipher_names[i].cipherSuite;
  22377. *flags = cipher_names[i].flags;
  22378. ret = 0;
  22379. break;
  22380. }
  22381. }
  22382. return ret;
  22383. }
  22384. /**
  22385. Set the enabled cipher suites.
  22386. With OPENSSL_EXTRA we attempt to understand some of the available "bulk"
  22387. ciphersuites. We can not perfectly filter ciphersuites based on the "bulk"
  22388. names but we do what we can. Ciphersuites named explicitly take precedence to
  22389. ciphersuites introduced through the "bulk" ciphersuites.
  22390. @param [out] suites Suites structure.
  22391. @param [in] list List of cipher suites, only supports full name from
  22392. cipher_names[] delimited by ':'.
  22393. @return true on success, else false.
  22394. */
  22395. int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list)
  22396. {
  22397. int ret = 0;
  22398. int idx = 0;
  22399. int haveSig = 0;
  22400. word16 haveRSA = 0;
  22401. #ifdef OPENSSL_EXTRA
  22402. word16 haveDH = 0;
  22403. word16 haveECC = 0;
  22404. word16 haveStaticRSA = 1; /* allowed by default if compiled in */
  22405. word16 haveStaticECC = 0;
  22406. word16 haveNull = 1; /* allowed by default if compiled in */
  22407. int callInitSuites = 0;
  22408. word16 havePSK = 0;
  22409. #endif
  22410. const int suiteSz = GetCipherNamesSize();
  22411. const char* next = list;
  22412. if (suites == NULL || list == NULL) {
  22413. WOLFSSL_MSG("SetCipherList parameter error");
  22414. return 0;
  22415. }
  22416. if (next[0] == 0 || XSTRCMP(next, "ALL") == 0 ||
  22417. XSTRCMP(next, "DEFAULT") == 0 || XSTRCMP(next, "HIGH") == 0) {
  22418. /* Add all ciphersuites except anonymous and null ciphers. Prefer RSA */
  22419. #ifndef NO_RSA
  22420. haveRSA = 1;
  22421. #endif
  22422. InitSuites(suites, ctx->method->version,
  22423. #ifndef NO_CERTS
  22424. ctx->privateKeySz,
  22425. #else
  22426. 0,
  22427. #endif
  22428. haveRSA, 1, 1, !haveRSA, 1, haveRSA, !haveRSA, 1, 1, 0, 0,
  22429. ctx->method->side);
  22430. return 1; /* wolfSSL default */
  22431. }
  22432. do {
  22433. const char* current = next;
  22434. char name[MAX_SUITE_NAME + 1];
  22435. int i;
  22436. word32 length;
  22437. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  22438. word16 allowing = 1;
  22439. #endif
  22440. next = XSTRSTR(next, ":");
  22441. length = MAX_SUITE_NAME;
  22442. if (next != NULL) {
  22443. word32 currLen = (word32)(next - current);
  22444. if (length > currLen) {
  22445. length = currLen;
  22446. }
  22447. }
  22448. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  22449. if (length > 1) {
  22450. if (*current == '!') {
  22451. allowing = 0;
  22452. current++;
  22453. length--;
  22454. }
  22455. }
  22456. #endif
  22457. XSTRNCPY(name, current, length);
  22458. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  22459. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  22460. if (length > 1) {
  22461. char* substr = NULL;
  22462. char* substrCurrent = name;
  22463. /* extract first public key type from a string like ECDHE+AESGCM */
  22464. substr = XSTRSTR(substrCurrent, "+");
  22465. if (substr != NULL) {
  22466. do {
  22467. if (substr) {
  22468. length = (word32)(substr - substrCurrent);
  22469. substrCurrent[length] = '\0';
  22470. }
  22471. else {
  22472. length = (int)XSTRLEN(substrCurrent);
  22473. }
  22474. /* check if is a public key type */
  22475. if (XSTRCMP(substrCurrent, "ECDHE") == 0 ||
  22476. XSTRCMP(substrCurrent, "RSA") == 0 ||
  22477. XSTRCMP(substrCurrent, "DHE") == 0) {
  22478. if (name != substrCurrent)
  22479. XMEMMOVE(name, substrCurrent, length);
  22480. name[length] = '\0';
  22481. break;
  22482. }
  22483. substrCurrent = substr;
  22484. if (substr) {
  22485. substrCurrent = substrCurrent + 1; /* +1 to skip over '+' */
  22486. substr = XSTRSTR(substrCurrent, "+");
  22487. }
  22488. } while (substrCurrent != NULL);
  22489. }
  22490. }
  22491. if (XSTRCMP(name, "DEFAULT") == 0 || XSTRCMP(name, "ALL") == 0) {
  22492. if (XSTRCMP(name, "ALL") == 0)
  22493. haveSig |= SIG_ANON;
  22494. else
  22495. haveSig &= ~SIG_ANON;
  22496. #ifdef HAVE_ANON
  22497. ctx->haveAnon = (haveSig & SIG_ANON) == SIG_ANON;
  22498. #endif
  22499. haveRSA = 1;
  22500. haveDH = 1;
  22501. haveECC = 1;
  22502. /* having static ECC will disable all RSA use, do not set
  22503. * static ECC suites here
  22504. * haveStaticECC = 1; */
  22505. haveStaticRSA = 1;
  22506. haveSig |= SIG_RSA;
  22507. havePSK = 1;
  22508. haveNull = 0;
  22509. callInitSuites = 1;
  22510. ret = 1;
  22511. continue;
  22512. }
  22513. /* We don't have a way to disallow high bit sizes. Only disable unsafe
  22514. * ciphersuites. */
  22515. if (XSTRCMP(name, "HIGH") == 0 && allowing) {
  22516. /* Disable static, anonymous, and null ciphers */
  22517. haveSig &= ~SIG_ANON;
  22518. #ifdef HAVE_ANON
  22519. ctx->haveAnon = 0;
  22520. #endif
  22521. haveRSA = 1;
  22522. haveDH = 1;
  22523. haveECC = 1;
  22524. haveStaticECC = 0;
  22525. haveStaticRSA = 0;
  22526. haveSig |= SIG_RSA;
  22527. havePSK = 1;
  22528. haveNull = 0;
  22529. callInitSuites = 1;
  22530. ret = 1;
  22531. continue;
  22532. }
  22533. if (XSTRCMP(name, "aNULL") == 0) {
  22534. if (allowing)
  22535. haveSig |= SIG_ANON;
  22536. else
  22537. haveSig &= ~SIG_ANON;
  22538. #ifdef HAVE_ANON
  22539. ctx->haveAnon = allowing;
  22540. #endif
  22541. if (allowing) {
  22542. /* Allow RSA by default. */
  22543. if (!haveECC)
  22544. haveRSA = 1;
  22545. if ((haveSig & SIG_ECDSA) == 0)
  22546. haveSig |= SIG_RSA;
  22547. callInitSuites = 1;
  22548. ret = 1;
  22549. }
  22550. continue;
  22551. }
  22552. if (XSTRCMP(name, "eNULL") == 0 || XSTRCMP(name, "NULL") == 0) {
  22553. haveNull = allowing;
  22554. if (allowing) {
  22555. /* Allow RSA by default. */
  22556. if (!haveECC)
  22557. haveRSA = 1;
  22558. if ((haveSig & SIG_ECDSA) == 0)
  22559. haveSig |= SIG_RSA;
  22560. callInitSuites = 1;
  22561. ret = 1;
  22562. }
  22563. continue;
  22564. }
  22565. if (XSTRCMP(name, "kDH") == 0) {
  22566. if (allowing) {
  22567. haveDH = 1;
  22568. callInitSuites = 1;
  22569. ret = 1;
  22570. }
  22571. continue;
  22572. }
  22573. if (XSTRCMP(name, "DHE") == 0 || XSTRCMP(name, "EDH") == 0) {
  22574. if (allowing) {
  22575. haveDH = 1;
  22576. callInitSuites = 1;
  22577. ret = 1;
  22578. }
  22579. continue;
  22580. }
  22581. if (XSTRCMP(name, "ECDHE") == 0 || XSTRCMP(name, "EECDH") == 0) {
  22582. if (allowing) {
  22583. haveECC = 1;
  22584. haveSig |= SIG_ECDSA;
  22585. callInitSuites = 1;
  22586. ret = 1;
  22587. }
  22588. continue;
  22589. }
  22590. if (XSTRCMP(name, "kRSA") == 0 || XSTRCMP(name, "RSA") == 0) {
  22591. haveStaticRSA = allowing;
  22592. if (allowing) {
  22593. haveRSA = 1;
  22594. haveSig |= SIG_RSA;
  22595. callInitSuites = 1;
  22596. ret = 1;
  22597. }
  22598. continue;
  22599. }
  22600. if (XSTRCMP(name, "PSK") == 0) {
  22601. havePSK = allowing;
  22602. haveSig |= SIG_RSA;
  22603. if (allowing) {
  22604. /* Allow RSA by default. */
  22605. if (!haveECC)
  22606. haveRSA = 1;
  22607. if ((haveSig & SIG_ECDSA) == 0)
  22608. haveSig |= SIG_RSA;
  22609. callInitSuites = 1;
  22610. ret = 1;
  22611. }
  22612. continue;
  22613. }
  22614. if (XSTRCMP(name, "LOW") == 0 || XSTRCMP(name, "MEDIUM") == 0) {
  22615. /* No way to limit or allow low bit sizes */
  22616. if (allowing) {
  22617. /* Allow RSA by default */
  22618. haveRSA = 1;
  22619. haveSig |= SIG_RSA;
  22620. callInitSuites = 1;
  22621. ret = 1;
  22622. }
  22623. continue;
  22624. }
  22625. if (XSTRCMP(name, "DSS") == 0) {
  22626. /* No support for DSA ciphersuites */
  22627. continue;
  22628. }
  22629. if (XSTRCMP(name, "EXP") == 0 || XSTRCMP(name, "EXPORT") == 0) {
  22630. /* wolfSSL doesn't support "export" ciphers. We can skip this */
  22631. continue;
  22632. }
  22633. #endif /* OPENSSL_EXTRA */
  22634. for (i = 0; i < suiteSz; i++) {
  22635. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  22636. #ifndef NO_ERROR_STRINGS
  22637. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  22638. #endif
  22639. ) {
  22640. int j;
  22641. #ifdef WOLFSSL_DTLS
  22642. /* don't allow stream ciphers with DTLS */
  22643. if (ctx->method->version.major == DTLS_MAJOR) {
  22644. if (XSTRSTR(name, "RC4"))
  22645. {
  22646. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  22647. continue;
  22648. }
  22649. }
  22650. #endif /* WOLFSSL_DTLS */
  22651. for (j = 0; j < idx; j += 2) {
  22652. if ((suites->suites[j+0] == cipher_names[i].cipherSuite0) &&
  22653. (suites->suites[j+1] == cipher_names[i].cipherSuite)) {
  22654. break;
  22655. }
  22656. }
  22657. /* Silently drop duplicates from list. */
  22658. if (j != idx) {
  22659. break;
  22660. }
  22661. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  22662. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  22663. return 0; /* suites buffer not large enough, error out */
  22664. }
  22665. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  22666. suites->suites[idx++] = cipher_names[i].cipherSuite;
  22667. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  22668. * suites don't necessarily have RSA in the name. */
  22669. #ifdef WOLFSSL_TLS13
  22670. if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
  22671. (cipher_names[i].cipherSuite0 == ECC_BYTE &&
  22672. (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
  22673. cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
  22674. #ifndef NO_RSA
  22675. haveSig |= SIG_RSA;
  22676. #endif
  22677. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  22678. defined(HAVE_ED448)
  22679. haveSig |= SIG_ECDSA;
  22680. #endif
  22681. #if defined(HAVE_PQC)
  22682. #ifdef HAVE_FALCON
  22683. haveSig |= SIG_FALCON;
  22684. #endif /* HAVE_FALCON */
  22685. #ifdef HAVE_DILITHIUM
  22686. haveSig |= SIG_DILITHIUM;
  22687. #endif /* HAVE_DILITHIUM */
  22688. #endif /* HAVE_PQC */
  22689. }
  22690. else
  22691. #ifdef BUILD_TLS_SM4_GCM_SM3
  22692. if ((cipher_names[i].cipherSuite0 == CIPHER_BYTE) &&
  22693. (cipher_names[i].cipherSuite == TLS_SM4_GCM_SM3)) {
  22694. haveSig |= SIG_SM2;
  22695. }
  22696. else
  22697. #endif
  22698. #ifdef BUILD_TLS_SM4_CCM_SM3
  22699. if ((cipher_names[i].cipherSuite0 == CIPHER_BYTE) &&
  22700. (cipher_names[i].cipherSuite == TLS_SM4_CCM_SM3)) {
  22701. haveSig |= SIG_SM2;
  22702. }
  22703. else
  22704. #endif
  22705. #endif /* WOLFSSL_TLS13 */
  22706. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \
  22707. (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \
  22708. defined(WOLFSSL_SM4_CCM))
  22709. if ((cipher_names[i].cipherSuite0 == SM_BYTE) && (0
  22710. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  22711. || (cipher_names[i].cipherSuite ==
  22712. TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3)
  22713. #endif
  22714. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  22715. || (cipher_names[i].cipherSuite ==
  22716. TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3)
  22717. #endif
  22718. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  22719. || (cipher_names[i].cipherSuite ==
  22720. TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3)
  22721. #endif
  22722. )) {
  22723. haveSig |= SIG_SM2;
  22724. }
  22725. else
  22726. #endif
  22727. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  22728. defined(HAVE_ED448)
  22729. if (((haveSig && SIG_ECDSA) == 0) && XSTRSTR(name, "ECDSA"))
  22730. haveSig |= SIG_ECDSA;
  22731. else
  22732. #endif
  22733. #ifdef HAVE_ANON
  22734. if (XSTRSTR(name, "ADH"))
  22735. haveSig |= SIG_ANON;
  22736. else
  22737. #endif
  22738. if (((haveSig & SIG_RSA) == 0)
  22739. #ifndef NO_PSK
  22740. && (XSTRSTR(name, "PSK") == NULL)
  22741. #endif
  22742. ) {
  22743. haveSig |= SIG_RSA;
  22744. }
  22745. ret = 1; /* found at least one */
  22746. break;
  22747. }
  22748. }
  22749. }
  22750. while (next++); /* ++ needed to skip ':' */
  22751. if (ret) {
  22752. int keySz = 0;
  22753. #ifndef NO_CERTS
  22754. keySz = ctx->privateKeySz;
  22755. #endif
  22756. #ifdef OPENSSL_EXTRA
  22757. if (callInitSuites) {
  22758. byte tmp[WOLFSSL_MAX_SUITE_SZ];
  22759. XMEMCPY(tmp, suites->suites, idx); /* Store copy */
  22760. suites->setSuites = 0; /* Force InitSuites */
  22761. suites->hashSigAlgoSz = 0; /* Force InitSuitesHashSigAlgo call
  22762. * inside InitSuites */
  22763. InitSuites(suites, ctx->method->version, keySz, (word16)haveRSA,
  22764. (word16)havePSK, (word16)haveDH,
  22765. (word16)((haveSig & SIG_ECDSA) != 0),
  22766. (word16)haveECC, (word16)haveStaticRSA,
  22767. (word16)haveStaticECC,
  22768. (word16)((haveSig & SIG_FALCON) != 0),
  22769. (word16)((haveSig & SIG_DILITHIUM) != 0),
  22770. (word16)((haveSig & SIG_ANON) != 0),
  22771. (word16)haveNull, ctx->method->side);
  22772. /* Restore user ciphers ahead of defaults */
  22773. XMEMMOVE(suites->suites + idx, suites->suites,
  22774. min(suites->suiteSz, WOLFSSL_MAX_SUITE_SZ-idx));
  22775. suites->suiteSz += (word16)idx;
  22776. }
  22777. else
  22778. #endif
  22779. {
  22780. suites->suiteSz = (word16)idx;
  22781. InitSuitesHashSigAlgo_ex2(suites->hashSigAlgo, haveSig, 1, keySz,
  22782. &suites->hashSigAlgoSz);
  22783. }
  22784. suites->setSuites = 1;
  22785. }
  22786. (void)ctx;
  22787. return ret;
  22788. }
  22789. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
  22790. int SetCipherListFromBytes(WOLFSSL_CTX* ctx, Suites* suites, const byte* list,
  22791. const int listSz)
  22792. {
  22793. int ret = 0;
  22794. int idx = 0;
  22795. int i;
  22796. int haveRSAsig = 0;
  22797. int haveECDSAsig = 0;
  22798. int haveFalconSig = 0;
  22799. int haveDilithiumSig = 0;
  22800. int haveAnon = 0;
  22801. if (suites == NULL || list == NULL) {
  22802. WOLFSSL_MSG("SetCipherListFromBytes parameter error");
  22803. return 0;
  22804. }
  22805. if ((listSz % 2) != 0) {
  22806. return 0;
  22807. }
  22808. for (i = 0; (i + 1) < listSz; i += 2) {
  22809. const byte firstByte = list[i];
  22810. const byte secondByte = list[i + 1];
  22811. const char* name = NULL;
  22812. int j;
  22813. name = GetCipherNameInternal(firstByte, secondByte);
  22814. if (XSTRCMP(name, "None") == 0) {
  22815. /* bytes don't match any known cipher */
  22816. continue;
  22817. }
  22818. #ifdef WOLFSSL_DTLS
  22819. /* don't allow stream ciphers with DTLS */
  22820. if (ctx->method->version.major == DTLS_MAJOR) {
  22821. if (XSTRSTR(name, "RC4")) {
  22822. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  22823. continue;
  22824. }
  22825. }
  22826. #endif /* WOLFSSL_DTLS */
  22827. for (j = 0; j < idx; j += 2) {
  22828. if ((suites->suites[j+0] == firstByte) &&
  22829. (suites->suites[j+1] == secondByte)) {
  22830. break;
  22831. }
  22832. }
  22833. /* Silently drop duplicates from list. */
  22834. if (j != idx) {
  22835. continue;
  22836. }
  22837. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  22838. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  22839. return 0; /* suites buffer not large enough, error out */
  22840. }
  22841. suites->suites[idx++] = firstByte;
  22842. suites->suites[idx++] = secondByte;
  22843. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  22844. * suites don't necessarily have RSA in the name. */
  22845. #ifdef WOLFSSL_TLS13
  22846. if (firstByte == TLS13_BYTE || (firstByte == ECC_BYTE &&
  22847. (secondByte == TLS_SHA256_SHA256 ||
  22848. secondByte == TLS_SHA384_SHA384)) ||
  22849. (firstByte == CIPHER_BYTE && (secondByte == TLS_SM4_GCM_SM3 ||
  22850. secondByte == TLS_SM4_CCM_SM3))) {
  22851. #ifndef NO_RSA
  22852. haveRSAsig = 1;
  22853. #endif
  22854. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  22855. haveECDSAsig = 1;
  22856. #endif
  22857. #if defined(HAVE_PQC)
  22858. #ifdef HAVE_FALCON
  22859. haveFalconSig = 1;
  22860. #endif /* HAVE_FALCON */
  22861. #ifdef HAVE_DILITHIUM
  22862. haveDilithiumSig = 1;
  22863. #endif /* HAVE_DILITHIUM */
  22864. #endif /* HAVE_PQC */
  22865. }
  22866. else
  22867. #endif /* WOLFSSL_TLS13 */
  22868. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  22869. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  22870. haveECDSAsig = 1;
  22871. else
  22872. #endif
  22873. #ifdef HAVE_ANON
  22874. if (XSTRSTR(name, "ADH"))
  22875. haveAnon = 1;
  22876. else
  22877. #endif
  22878. if (haveRSAsig == 0
  22879. #ifndef NO_PSK
  22880. && (XSTRSTR(name, "PSK") == NULL)
  22881. #endif
  22882. ) {
  22883. haveRSAsig = 1;
  22884. }
  22885. ret = 1; /* found at least one */
  22886. }
  22887. if (ret) {
  22888. int keySz = 0;
  22889. int haveSig = 0;
  22890. #ifndef NO_CERTS
  22891. keySz = ctx->privateKeySz;
  22892. #endif
  22893. suites->suiteSz = (word16)idx;
  22894. haveSig |= haveECDSAsig ? SIG_ECDSA : 0;
  22895. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  22896. haveSig |= haveECDSAsig ? SIG_SM2 : 0;
  22897. #endif
  22898. haveSig |= haveRSAsig ? SIG_RSA : 0;
  22899. haveSig |= haveFalconSig ? SIG_FALCON : 0;
  22900. haveSig |= haveDilithiumSig ? SIG_DILITHIUM : 0;
  22901. haveSig |= haveAnon ? SIG_ANON : 0;
  22902. InitSuitesHashSigAlgo_ex2(suites->hashSigAlgo, haveSig, 1, keySz,
  22903. &suites->hashSigAlgoSz);
  22904. suites->setSuites = 1;
  22905. }
  22906. (void)ctx;
  22907. return ret;
  22908. }
  22909. #endif /* OPENSSL_EXTRA */
  22910. #ifdef OPENSSL_EXTRA
  22911. struct mac_algs {
  22912. byte alg;
  22913. const char* name;
  22914. } mac_names[] = {
  22915. #ifndef NO_SHA256
  22916. { sha256_mac, "SHA256" },
  22917. #endif
  22918. #ifdef WOLFSSL_SHA384
  22919. { sha384_mac, "SHA384" },
  22920. #endif
  22921. #ifdef WOLFSSL_SHA512
  22922. { sha512_mac, "SHA512" },
  22923. #endif
  22924. #ifdef WOLFSSL_SHA224
  22925. { sha224_mac, "SHA224" },
  22926. #endif
  22927. #ifdef WOLFSSL_SM3
  22928. { sm3_mac, "SM3" },
  22929. #endif
  22930. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  22931. defined(WOLFSSL_ALLOW_TLS_SHA1))
  22932. { sha_mac, "SHA1" },
  22933. #endif
  22934. };
  22935. #define MAC_NAMES_SZ (int)(sizeof(mac_names)/sizeof(*mac_names))
  22936. /* Convert the hash algorithm string to a TLS MAC algorithm num. */
  22937. static byte GetMacAlgFromName(const char* name, int len)
  22938. {
  22939. byte alg = no_mac;
  22940. int i;
  22941. for (i = 0; i < MAC_NAMES_SZ; i++) {
  22942. if (((int)XSTRLEN(mac_names[i].name) == len) &&
  22943. (XMEMCMP(mac_names[i].name, name, len) == 0)) {
  22944. alg = mac_names[i].alg;
  22945. break;
  22946. }
  22947. }
  22948. return alg;
  22949. }
  22950. struct sig_algs {
  22951. byte alg;
  22952. const char* name;
  22953. } sig_names[] = {
  22954. #ifndef NO_RSA
  22955. { rsa_sa_algo, "RSA" },
  22956. #ifdef WC_RSA_PSS
  22957. { rsa_pss_sa_algo, "RSA-PSS" },
  22958. { rsa_pss_sa_algo, "PSS" },
  22959. #endif
  22960. #endif
  22961. #ifdef HAVE_ECC
  22962. { ecc_dsa_sa_algo, "ECDSA" },
  22963. #endif
  22964. #ifdef HAVE_ED25519
  22965. { ed25519_sa_algo, "ED25519" },
  22966. #endif
  22967. #ifdef HAVE_ED448
  22968. { ed448_sa_algo, "ED448" },
  22969. #endif
  22970. #ifndef NO_DSA
  22971. { dsa_sa_algo, "DSA" },
  22972. #endif
  22973. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  22974. { sm2_sa_algo, "SM2" },
  22975. #endif
  22976. };
  22977. #define SIG_NAMES_SZ (int)(sizeof(sig_names)/sizeof(*sig_names))
  22978. /* Convert the signature algorithm string to a TLS signature algorithm num. */
  22979. static byte GetSigAlgFromName(const char* name, int len)
  22980. {
  22981. byte alg = anonymous_sa_algo;
  22982. int i;
  22983. for (i = 0; i < SIG_NAMES_SZ; i++) {
  22984. if (((int)XSTRLEN(sig_names[i].name) == len) &&
  22985. (XMEMCMP(sig_names[i].name, name, len) == 0)) {
  22986. alg = sig_names[i].alg;
  22987. break;
  22988. }
  22989. }
  22990. return alg;
  22991. }
  22992. /* Set the hash/signature algorithms that are supported for certificate signing.
  22993. *
  22994. * suites [in,out] Cipher suites and signature algorithms.
  22995. * list [in] String representing hash/signature algorithms to set.
  22996. * returns 0 on failure.
  22997. * 1 on success.
  22998. */
  22999. int SetSuitesHashSigAlgo(Suites* suites, const char* list)
  23000. {
  23001. int ret = 1;
  23002. word16 idx = 0;
  23003. const char* s = list;
  23004. byte sig_alg = 0;
  23005. byte mac_alg = no_mac;
  23006. /* Setting is destructive on error. */
  23007. suites->hashSigAlgoSz = 0;
  23008. do {
  23009. if (*list == '+') {
  23010. if (mac_alg != 0) {
  23011. ret = 0;
  23012. break;
  23013. }
  23014. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  23015. if (sig_alg == 0) {
  23016. ret = 0;
  23017. break;
  23018. }
  23019. s = list + 1;
  23020. }
  23021. else if (*list == ':' || *list == '\0') {
  23022. if (sig_alg == 0) {
  23023. /* No signature algorithm set yet.
  23024. * Ed25519 and Ed448 have implied MAC algorithm.
  23025. */
  23026. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  23027. if (sig_alg != ed25519_sa_algo && sig_alg != ed448_sa_algo) {
  23028. ret = 0;
  23029. break;
  23030. }
  23031. }
  23032. else {
  23033. mac_alg = GetMacAlgFromName(s, (int)(list - s));
  23034. if (mac_alg == 0) {
  23035. ret = 0;
  23036. break;
  23037. }
  23038. }
  23039. AddSuiteHashSigAlgo(suites->hashSigAlgo, mac_alg, sig_alg, 0, &idx);
  23040. sig_alg = 0;
  23041. mac_alg = no_mac;
  23042. s = list + 1;
  23043. }
  23044. list++;
  23045. }
  23046. while (*(list-1) != '\0');
  23047. if (s != list && (sig_alg != 0 || mac_alg != 0)) {
  23048. ret = 0;
  23049. }
  23050. else {
  23051. suites->hashSigAlgoSz = idx;
  23052. }
  23053. return ret;
  23054. }
  23055. #endif /* OPENSSL_EXTRA */
  23056. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  23057. static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
  23058. {
  23059. #ifdef HAVE_ED25519
  23060. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  23061. /* Certificate has Ed25519 key, only match with Ed25519 sig alg */
  23062. return sigAlgo == ed25519_sa_algo;
  23063. }
  23064. #endif
  23065. #ifdef HAVE_ED448
  23066. if (ssl->pkCurveOID == ECC_ED448_OID) {
  23067. /* Certificate has Ed448 key, only match with Ed448 sig alg */
  23068. return sigAlgo == ed448_sa_algo;
  23069. }
  23070. #endif
  23071. #ifdef HAVE_PQC
  23072. #ifdef HAVE_FALCON
  23073. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1) {
  23074. /* Certificate has Falcon level 1 key, only match with Falcon level 1
  23075. * sig alg */
  23076. return sigAlgo == falcon_level1_sa_algo;
  23077. }
  23078. if (ssl->pkCurveOID == CTC_FALCON_LEVEL5) {
  23079. /* Certificate has Falcon level 5 key, only match with Falcon level 5
  23080. * sig alg */
  23081. return sigAlgo == falcon_level5_sa_algo;
  23082. }
  23083. #endif /* HAVE_FALCON */
  23084. #ifdef HAVE_DILITHIUM
  23085. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2) {
  23086. /* Certificate has Dilithium level 2 key, only match with it. */
  23087. return sigAlgo == dilithium_level2_sa_algo;
  23088. }
  23089. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3) {
  23090. /* Certificate has Dilithium level 3 key, only match with it. */
  23091. return sigAlgo == dilithium_level3_sa_algo;
  23092. }
  23093. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5) {
  23094. /* Certificate has Dilithium level 5 key, only match with it. */
  23095. return sigAlgo == dilithium_level5_sa_algo;
  23096. }
  23097. #endif /* HAVE_DILITHIUM */
  23098. #endif /* HAVE_PQC */
  23099. #ifdef WC_RSA_PSS
  23100. /* RSA certificate and PSS sig alg. */
  23101. if (ssl->options.sigAlgo == rsa_sa_algo) {
  23102. #if defined(WOLFSSL_TLS13)
  23103. /* TLS 1.3 only supports RSA-PSS. */
  23104. if (IsAtLeastTLSv1_3(ssl->version))
  23105. return sigAlgo == rsa_pss_sa_algo;
  23106. #endif
  23107. /* TLS 1.2 and below - RSA-PSS allowed. */
  23108. if (sigAlgo == rsa_pss_sa_algo)
  23109. return 1;
  23110. }
  23111. #endif
  23112. /* Signature algorithm matches certificate. */
  23113. return sigAlgo == ssl->options.sigAlgo;
  23114. }
  23115. #if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
  23116. defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  23117. static int CmpEccStrength(int hashAlgo, int curveSz)
  23118. {
  23119. int dgstSz = GetMacDigestSize((byte)hashAlgo);
  23120. if (dgstSz <= 0)
  23121. return -1;
  23122. return dgstSz - (curveSz & (~0x3));
  23123. }
  23124. #endif
  23125. static byte MinHashAlgo(WOLFSSL* ssl)
  23126. {
  23127. #ifdef WOLFSSL_TLS13
  23128. #ifndef NO_SHA256
  23129. if (IsAtLeastTLSv1_3(ssl->version)) {
  23130. return sha256_mac;
  23131. }
  23132. #elif defined(WOLFSSL_SM3)
  23133. if (IsAtLeastTLSv1_3(ssl->version)) {
  23134. return sm3_mac;
  23135. }
  23136. #endif
  23137. #endif
  23138. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
  23139. if (IsAtLeastTLSv1_2(ssl)) {
  23140. return sha256_mac;
  23141. }
  23142. #endif /* WOLFSSL_NO_TLS12 */
  23143. (void)ssl;
  23144. return sha_mac;
  23145. }
  23146. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  23147. {
  23148. word32 i;
  23149. int ret = MATCH_SUITE_ERROR;
  23150. byte minHash;
  23151. /* set defaults */
  23152. if (IsAtLeastTLSv1_3(ssl->version)) {
  23153. #ifndef NO_CERTS
  23154. /* TLS 1.3 cipher suites don't have public key algorithms in them.
  23155. * Using the one in the certificate - if any.
  23156. */
  23157. ssl->options.sigAlgo = ssl->buffers.keyType;
  23158. #endif
  23159. }
  23160. else {
  23161. ssl->options.sigAlgo = ssl->specs.sig_algo;
  23162. }
  23163. if (ssl->options.sigAlgo == anonymous_sa_algo) {
  23164. /* PSK ciphersuite - get digest to use from cipher suite */
  23165. ssl->options.hashAlgo = ssl->specs.mac_algorithm;
  23166. return 0;
  23167. }
  23168. ssl->options.hashAlgo = minHash = MinHashAlgo(ssl);
  23169. /* No list means go with the defaults. */
  23170. if (hashSigAlgoSz == 0)
  23171. return 0;
  23172. /* i+1 since two bytes used to describe hash and signature algorithm */
  23173. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  23174. byte hashAlgo = 0, sigAlgo = 0;
  23175. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  23176. /* Keep looking if hash algorithm not strong enough. */
  23177. if (hashAlgo < minHash)
  23178. continue;
  23179. /* Keep looking if signature algorithm isn't supported by cert. */
  23180. if (!MatchSigAlgo(ssl, sigAlgo))
  23181. continue;
  23182. #ifdef HAVE_ED25519
  23183. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  23184. /* Matched Ed25519 - set chosen and finished. */
  23185. ssl->options.sigAlgo = sigAlgo;
  23186. ssl->options.hashAlgo = hashAlgo;
  23187. ret = 0;
  23188. break;
  23189. }
  23190. #endif
  23191. #ifdef HAVE_ED448
  23192. if (ssl->pkCurveOID == ECC_ED448_OID) {
  23193. /* Matched Ed448 - set chosen and finished. */
  23194. ssl->options.sigAlgo = sigAlgo;
  23195. ssl->options.hashAlgo = hashAlgo;
  23196. ret = 0;
  23197. break;
  23198. }
  23199. #endif
  23200. #if defined(HAVE_PQC)
  23201. #if defined(HAVE_FALCON)
  23202. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1 ||
  23203. ssl->pkCurveOID == CTC_FALCON_LEVEL5 ) {
  23204. /* Matched Falcon - set chosen and finished. */
  23205. ssl->options.sigAlgo = sigAlgo;
  23206. ssl->options.hashAlgo = hashAlgo;
  23207. ret = 0;
  23208. break;
  23209. }
  23210. #endif /* HAVE_FALCON */
  23211. #if defined(HAVE_DILITHIUM)
  23212. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2 ||
  23213. ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3 ||
  23214. ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5) {
  23215. /* Matched Dilithium - set chosen and finished. */
  23216. ssl->options.sigAlgo = sigAlgo;
  23217. ssl->options.hashAlgo = hashAlgo;
  23218. ret = 0;
  23219. break;
  23220. }
  23221. #endif /* HAVE_DILITHIUM */
  23222. #endif /* HAVE_PQC */
  23223. #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  23224. #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
  23225. "be used together"
  23226. #endif
  23227. #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
  23228. defined(WOLFSSL_ECDSA_MATCH_HASH))
  23229. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  23230. if (sigAlgo == sm2_sa_algo && hashAlgo == sm3_mac
  23231. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  23232. && IsAtLeastTLSv1_3(ssl->version)
  23233. #endif
  23234. ) {
  23235. /* Must be exact match. */
  23236. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  23237. continue;
  23238. /* Matched SM2-SM3 - set chosen and finished. */
  23239. ssl->options.sigAlgo = sigAlgo;
  23240. ssl->options.hashAlgo = hashAlgo;
  23241. ret = 0;
  23242. break;
  23243. }
  23244. else
  23245. #endif
  23246. if (sigAlgo == ecc_dsa_sa_algo
  23247. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  23248. && IsAtLeastTLSv1_3(ssl->version)
  23249. #endif
  23250. ) {
  23251. /* Must be exact match. */
  23252. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  23253. continue;
  23254. /* Matched ECDSA exactly - set chosen and finished. */
  23255. ssl->options.hashAlgo = hashAlgo;
  23256. ssl->options.sigAlgo = sigAlgo;
  23257. ret = 0;
  23258. break;
  23259. }
  23260. #endif
  23261. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  23262. * algorithm that matches the ephemeral ECDHE key size or the next highest
  23263. * available. This workaround resolves issue with some peer's that do not
  23264. * properly support scenarios such as a P-256 key hashed with SHA512.
  23265. */
  23266. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  23267. if (sigAlgo == ecc_dsa_sa_algo) {
  23268. int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
  23269. /* Keep looking if digest not strong enough. */
  23270. if (cmp < 0)
  23271. continue;
  23272. /* Looking for exact match or next highest. */
  23273. if (ret != 0 || hashAlgo <= ssl->options.hashAlgo) {
  23274. ssl->options.hashAlgo = hashAlgo;
  23275. ssl->options.sigAlgo = sigAlgo;
  23276. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  23277. ssl->namedGroup = 0;
  23278. #endif
  23279. ret = 0;
  23280. }
  23281. /* Continue looking if not the same strength. */
  23282. if (cmp > 0)
  23283. continue;
  23284. /* Exact match - finished. */
  23285. break;
  23286. }
  23287. #endif
  23288. switch (hashAlgo) {
  23289. #ifndef NO_SHA
  23290. case sha_mac:
  23291. #endif
  23292. #ifdef WOLFSSL_SHA224
  23293. case sha224_mac:
  23294. #endif
  23295. #ifndef NO_SHA256
  23296. case sha256_mac:
  23297. #endif
  23298. #ifdef WOLFSSL_SHA384
  23299. case sha384_mac:
  23300. #endif
  23301. #ifdef WOLFSSL_SHA512
  23302. case sha512_mac:
  23303. #endif
  23304. #ifdef WOLFSSL_SM3
  23305. case sm3_mac:
  23306. #endif
  23307. #ifdef WOLFSSL_STRONGEST_HASH_SIG
  23308. /* Is hash algorithm weaker than chosen/min? */
  23309. if (hashAlgo < ssl->options.hashAlgo)
  23310. break;
  23311. #else
  23312. /* Is hash algorithm stronger than last chosen? */
  23313. if (ret == 0 && hashAlgo > ssl->options.hashAlgo)
  23314. break;
  23315. #endif
  23316. if (IsAtLeastTLSv1_2(ssl) && !IsAtLeastTLSv1_3(ssl->version) &&
  23317. (ssl->options.side == WOLFSSL_CLIENT_END)) {
  23318. /* TLS 1.2 client deciding hash algorithm for
  23319. * CertificateVerify. Hash must be one of the handshake
  23320. * hashes being maintained. */
  23321. if (1
  23322. #ifndef NO_SHA
  23323. && (hashAlgo != sha_mac)
  23324. #endif
  23325. #ifndef NO_SHA256
  23326. && (hashAlgo != sha256_mac)
  23327. #endif
  23328. #ifdef WOLFSSL_SHA384
  23329. && (hashAlgo != sha384_mac)
  23330. #endif
  23331. #ifdef WOLFSSL_SHA512
  23332. && (hashAlgo != sha512_mac)
  23333. #endif
  23334. #ifdef WOLFSSL_SM3
  23335. && (hashAlgo != sm3_mac)
  23336. #endif
  23337. )
  23338. {
  23339. break;
  23340. }
  23341. }
  23342. /* The chosen one - but keep looking. */
  23343. ssl->options.hashAlgo = hashAlgo;
  23344. ssl->options.sigAlgo = sigAlgo;
  23345. ret = 0;
  23346. break;
  23347. default:
  23348. /* Support for hash algorithm not compiled in. */
  23349. break;
  23350. }
  23351. }
  23352. return ret;
  23353. }
  23354. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  23355. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  23356. /* Initialize HandShakeInfo */
  23357. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  23358. {
  23359. int i;
  23360. info->ssl = ssl;
  23361. info->cipherName[0] = 0;
  23362. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  23363. info->packetNames[i][0] = 0;
  23364. info->numberPackets = 0;
  23365. info->negotiationError = 0;
  23366. }
  23367. /* Set Final HandShakeInfo parameters */
  23368. void FinishHandShakeInfo(HandShakeInfo* info)
  23369. {
  23370. int i;
  23371. int sz = GetCipherNamesSize();
  23372. for (i = 0; i < sz; i++) {
  23373. #ifndef NO_CIPHER_SUITE_ALIASES
  23374. if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  23375. continue;
  23376. #endif
  23377. if (info->ssl->options.cipherSuite ==
  23378. (byte)cipher_names[i].cipherSuite) {
  23379. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  23380. continue; /* ECC suites at end */
  23381. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  23382. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  23383. break;
  23384. }
  23385. }
  23386. /* error max and min are negative numbers */
  23387. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  23388. info->negotiationError = info->ssl->error;
  23389. }
  23390. /* Add name to info packet names, increase packet name count */
  23391. void AddPacketName(WOLFSSL* ssl, const char* name)
  23392. {
  23393. #ifdef WOLFSSL_CALLBACKS
  23394. HandShakeInfo* info = &ssl->handShakeInfo;
  23395. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  23396. char* packetName = info->packetNames[info->numberPackets];
  23397. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  23398. packetName[MAX_PACKETNAME_SZ] = '\0';
  23399. info->numberPackets++;
  23400. }
  23401. #endif
  23402. (void)ssl;
  23403. (void)name;
  23404. }
  23405. #ifdef WOLFSSL_CALLBACKS
  23406. /* Initialize TimeoutInfo */
  23407. void InitTimeoutInfo(TimeoutInfo* info)
  23408. {
  23409. XMEMSET(info, 0, sizeof(TimeoutInfo));
  23410. }
  23411. /* Free TimeoutInfo */
  23412. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  23413. {
  23414. int i;
  23415. (void)heap;
  23416. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  23417. if (info->packets[i].bufferValue) {
  23418. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  23419. info->packets[i].bufferValue = NULL;
  23420. }
  23421. }
  23422. }
  23423. /* Add packet name to previously added packet info */
  23424. void AddLateName(const char* name, TimeoutInfo* info)
  23425. {
  23426. /* make sure we have a valid previous one */
  23427. if (info->numberPackets > 0 && info->numberPackets <
  23428. MAX_PACKETS_HANDSHAKE) {
  23429. char* packetName = info->packets[info->numberPackets-1].packetName;
  23430. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  23431. packetName[MAX_PACKETNAME_SZ] = '\0';
  23432. }
  23433. }
  23434. /* Add record header to previously added packet info */
  23435. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  23436. {
  23437. /* make sure we have a valid previous one */
  23438. if (info->numberPackets > 0 && info->numberPackets <
  23439. MAX_PACKETS_HANDSHAKE) {
  23440. if (info->packets[info->numberPackets - 1].bufferValue)
  23441. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  23442. RECORD_HEADER_SZ);
  23443. else
  23444. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  23445. RECORD_HEADER_SZ);
  23446. }
  23447. }
  23448. #endif /* WOLFSSL_CALLBACKS */
  23449. /* Add PacketInfo to TimeoutInfo
  23450. *
  23451. * ssl WOLFSSL structure sending or receiving packet
  23452. * name name of packet being sent
  23453. * type type of packet being sent
  23454. * data data bing sent with packet
  23455. * sz size of data buffer
  23456. * lateRL save space for record layer in TimoutInfo struct
  23457. * written 1 if this packet is being written to wire, 0 if being read
  23458. * heap custom heap to use for mallocs/frees
  23459. */
  23460. int AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  23461. const byte* data, int sz, int written, int lateRL, void* heap)
  23462. {
  23463. #ifdef WOLFSSL_CALLBACKS
  23464. TimeoutInfo* info = &ssl->timeoutInfo;
  23465. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  23466. WOLFSSL_TIMEVAL currTime;
  23467. int totalSz;
  23468. /* add in space for post record layer */
  23469. totalSz = sz + lateRL;
  23470. /* may add name after */
  23471. if (name) {
  23472. char* packetName = info->packets[info->numberPackets].packetName;
  23473. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  23474. packetName[MAX_PACKETNAME_SZ] = '\0';
  23475. }
  23476. /* add data, put in buffer if bigger than static buffer */
  23477. info->packets[info->numberPackets].valueSz = totalSz;
  23478. if (totalSz < MAX_VALUE_SZ) {
  23479. XMEMCPY(info->packets[info->numberPackets].value, data + lateRL,
  23480. sz);
  23481. }
  23482. else {
  23483. info->packets[info->numberPackets].bufferValue =
  23484. (byte*)XMALLOC(totalSz, heap, DYNAMIC_TYPE_INFO);
  23485. if (!info->packets[info->numberPackets].bufferValue) {
  23486. /* let next alloc catch, just don't fill, not fatal here */
  23487. info->packets[info->numberPackets].valueSz = 0;
  23488. }
  23489. else {
  23490. /* copy over data (which has the handshake header), leaving
  23491. * room for post record layer header if set */
  23492. XMEMCPY(info->packets[info->numberPackets].bufferValue +
  23493. lateRL, data, sz);
  23494. }
  23495. }
  23496. if (gettimeofday(&currTime, 0) < 0)
  23497. return SYSLIB_FAILED_E;
  23498. info->packets[info->numberPackets].timestamp.tv_sec =
  23499. currTime.tv_sec;
  23500. info->packets[info->numberPackets].timestamp.tv_usec =
  23501. currTime.tv_usec;
  23502. info->numberPackets++;
  23503. }
  23504. #endif /* WOLFSSL_CALLBACKS */
  23505. #ifdef OPENSSL_EXTRA
  23506. if ((ssl->protoMsgCb != NULL) && (sz > 0) &&
  23507. (ssl->keys.encryptionOn != 1)) {
  23508. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  23509. 4096 from 16^3 */
  23510. int version = (ssl->version.minor & 0x0F) +
  23511. ((ssl->version.minor & 0xF0) << 4) +
  23512. ((ssl->version.major & 0x0F) << 8) +
  23513. ((ssl->version.major & 0xF0) << 12);
  23514. ssl->protoMsgCb(written, version, type,
  23515. (const void *)data, (size_t)sz,
  23516. ssl, ssl->protoMsgCtx);
  23517. }
  23518. #endif /* OPENSSL_EXTRA */
  23519. (void)written;
  23520. (void)name;
  23521. (void)heap;
  23522. (void)type;
  23523. (void)ssl;
  23524. (void)lateRL;
  23525. return 0;
  23526. }
  23527. #endif /* WOLFSSL_CALLBACKS */
  23528. #if !defined(NO_CERTS)
  23529. #if defined(WOLF_PRIVATE_KEY_ID) && !defined(NO_CHECK_PRIVATE_KEY)
  23530. /* Create a private key for a device.
  23531. *
  23532. * pkey Key object.
  23533. * data Data to identify key.
  23534. * length Length of data.
  23535. * hsType Type of the key to create.
  23536. * heap Custom heap to use for mallocs/frees
  23537. * devId Id for device.
  23538. * return 0 on success.
  23539. * return NOT_COMPILED_IN if algorithm type not supported.
  23540. * return MEMORY_E on memory allocation failure.
  23541. * return other internal error
  23542. */
  23543. int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
  23544. int label, int id, void* heap, int devId)
  23545. {
  23546. int ret = NOT_COMPILED_IN;
  23547. if (hsType == DYNAMIC_TYPE_RSA) {
  23548. #ifndef NO_RSA
  23549. RsaKey* rsaKey;
  23550. rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  23551. if (rsaKey == NULL) {
  23552. return MEMORY_E;
  23553. }
  23554. if (label) {
  23555. ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
  23556. }
  23557. else if (id) {
  23558. ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId);
  23559. }
  23560. if (ret == 0) {
  23561. *pkey = (void*)rsaKey;
  23562. }
  23563. else {
  23564. XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
  23565. }
  23566. #endif
  23567. }
  23568. else if (hsType == DYNAMIC_TYPE_ECC) {
  23569. #ifdef HAVE_ECC
  23570. ecc_key* ecKey;
  23571. ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  23572. if (ecKey == NULL) {
  23573. return MEMORY_E;
  23574. }
  23575. if (label) {
  23576. ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
  23577. }
  23578. else if (id) {
  23579. ret = wc_ecc_init_id(ecKey, data, length, heap, devId);
  23580. }
  23581. if (ret == 0) {
  23582. *pkey = (void*)ecKey;
  23583. }
  23584. else {
  23585. XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
  23586. }
  23587. #endif
  23588. }
  23589. return ret;
  23590. }
  23591. #endif /* WOLF_PRIVATE_KEY_ID && !NO_CHECK_PRIVATE_KEY */
  23592. /* Decode the private key - RSA/ECC/Ed25519/Ed448/Falcon/Dilithium - and
  23593. * creates a key object.
  23594. *
  23595. * The signature type is set as well.
  23596. * The maximum length of a signature is returned.
  23597. *
  23598. * ssl The SSL/TLS object.
  23599. * length The length of a signature.
  23600. * returns 0 on success, otherwise failure.
  23601. */
  23602. int DecodePrivateKey(WOLFSSL *ssl, word16* length)
  23603. {
  23604. int ret = BAD_FUNC_ARG;
  23605. int keySz;
  23606. word32 idx;
  23607. /* make sure private key exists */
  23608. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  23609. /* allow no private key if using external */
  23610. #ifdef WOLF_PRIVATE_KEY_ID
  23611. if (ssl->devId != INVALID_DEVID
  23612. #ifdef HAVE_PK_CALLBACKS
  23613. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  23614. #endif
  23615. ) {
  23616. *length = GetPrivateKeySigSize(ssl);
  23617. return 0;
  23618. }
  23619. else
  23620. #endif
  23621. {
  23622. WOLFSSL_MSG("Private key missing!");
  23623. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  23624. }
  23625. }
  23626. #ifdef WOLF_PRIVATE_KEY_ID
  23627. if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
  23628. ssl->buffers.keyLabel)) {
  23629. if (ssl->buffers.keyType == rsa_sa_algo)
  23630. ssl->hsType = DYNAMIC_TYPE_RSA;
  23631. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  23632. ssl->hsType = DYNAMIC_TYPE_ECC;
  23633. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  23634. if (ret != 0) {
  23635. goto exit_dpk;
  23636. }
  23637. if (ssl->buffers.keyType == rsa_sa_algo) {
  23638. #ifndef NO_RSA
  23639. if (ssl->buffers.keyLabel) {
  23640. ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
  23641. (char*)ssl->buffers.key->buffer,
  23642. ssl->heap, ssl->buffers.keyDevId);
  23643. }
  23644. else if (ssl->buffers.keyId) {
  23645. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  23646. ssl->buffers.key->buffer,
  23647. ssl->buffers.key->length, ssl->heap,
  23648. ssl->buffers.keyDevId);
  23649. }
  23650. if (ret == 0) {
  23651. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  23652. WOLFSSL_MSG("RSA key size too small");
  23653. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  23654. }
  23655. /* Return the maximum signature length. */
  23656. *length = (word16)ssl->buffers.keySz;
  23657. }
  23658. #else
  23659. ret = NOT_COMPILED_IN;
  23660. #endif
  23661. }
  23662. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  23663. #ifdef HAVE_ECC
  23664. if (ssl->buffers.keyLabel) {
  23665. ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
  23666. (char*)ssl->buffers.key->buffer,
  23667. ssl->heap, ssl->buffers.keyDevId);
  23668. }
  23669. else if (ssl->buffers.keyId) {
  23670. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
  23671. ssl->buffers.key->buffer,
  23672. ssl->buffers.key->length, ssl->heap,
  23673. ssl->buffers.keyDevId);
  23674. }
  23675. if (ret == 0) {
  23676. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  23677. WOLFSSL_MSG("ECC key size too small");
  23678. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  23679. }
  23680. /* Return the maximum signature length. */
  23681. *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz);
  23682. }
  23683. #else
  23684. ret = NOT_COMPILED_IN;
  23685. #endif
  23686. }
  23687. goto exit_dpk;
  23688. }
  23689. #endif /* WOLF_PRIVATE_KEY_ID */
  23690. #ifndef NO_RSA
  23691. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  23692. ssl->hsType = DYNAMIC_TYPE_RSA;
  23693. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  23694. if (ret != 0) {
  23695. goto exit_dpk;
  23696. }
  23697. WOLFSSL_MSG("Trying RSA private key");
  23698. /* Set start of data to beginning of buffer. */
  23699. idx = 0;
  23700. /* Decode the key assuming it is an RSA private key. */
  23701. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  23702. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  23703. #ifdef WOLF_PRIVATE_KEY_ID
  23704. /* if using external key then allow using a public key */
  23705. if (ret != 0 && (ssl->devId != INVALID_DEVID
  23706. #ifdef HAVE_PK_CALLBACKS
  23707. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  23708. #endif
  23709. )) {
  23710. WOLFSSL_MSG("Trying RSA public key with crypto callbacks");
  23711. idx = 0;
  23712. ret = wc_RsaPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  23713. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  23714. }
  23715. #endif
  23716. if (ret == 0) {
  23717. WOLFSSL_MSG("Using RSA private key");
  23718. /* It worked so check it meets minimum key size requirements. */
  23719. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  23720. if (keySz < 0) { /* check if keySz has error case */
  23721. ERROR_OUT(keySz, exit_dpk);
  23722. }
  23723. if (keySz < ssl->options.minRsaKeySz) {
  23724. WOLFSSL_MSG("RSA key size too small");
  23725. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  23726. }
  23727. /* Return the maximum signature length. */
  23728. *length = (word16)keySz;
  23729. goto exit_dpk;
  23730. }
  23731. }
  23732. #endif /* !NO_RSA */
  23733. #ifdef HAVE_ECC
  23734. #ifndef NO_RSA
  23735. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  23736. #endif /* !NO_RSA */
  23737. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0
  23738. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  23739. || ssl->buffers.keyType == sm2_sa_algo
  23740. #endif
  23741. ) {
  23742. ssl->hsType = DYNAMIC_TYPE_ECC;
  23743. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  23744. if (ret != 0) {
  23745. goto exit_dpk;
  23746. }
  23747. #ifndef NO_RSA
  23748. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  23749. #else
  23750. WOLFSSL_MSG("Trying ECC private key");
  23751. #endif
  23752. /* Set start of data to beginning of buffer. */
  23753. idx = 0;
  23754. /* Decode the key assuming it is an ECC private key. */
  23755. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  23756. (ecc_key*)ssl->hsKey,
  23757. ssl->buffers.key->length);
  23758. #ifdef WOLF_PRIVATE_KEY_ID
  23759. /* if using external key then allow using a public key */
  23760. if (ret != 0 && (ssl->devId != INVALID_DEVID
  23761. #ifdef HAVE_PK_CALLBACKS
  23762. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  23763. #endif
  23764. )) {
  23765. WOLFSSL_MSG("Trying ECC public key with crypto callbacks");
  23766. idx = 0;
  23767. ret = wc_EccPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  23768. (ecc_key*)ssl->hsKey,
  23769. ssl->buffers.key->length);
  23770. }
  23771. #endif
  23772. if (ret == 0) {
  23773. WOLFSSL_MSG("Using ECC private key");
  23774. /* Check it meets the minimum ECC key size requirements. */
  23775. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  23776. if (keySz < ssl->options.minEccKeySz) {
  23777. WOLFSSL_MSG("ECC key size too small");
  23778. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  23779. }
  23780. /* Return the maximum signature length. */
  23781. *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  23782. goto exit_dpk;
  23783. }
  23784. }
  23785. #endif
  23786. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  23787. #if !defined(NO_RSA) || defined(HAVE_ECC)
  23788. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  23789. #endif
  23790. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  23791. ssl->hsType = DYNAMIC_TYPE_ED25519;
  23792. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  23793. if (ret != 0) {
  23794. goto exit_dpk;
  23795. }
  23796. #ifdef HAVE_ECC
  23797. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  23798. #elif !defined(NO_RSA)
  23799. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  23800. #else
  23801. WOLFSSL_MSG("Trying ED25519 private key");
  23802. #endif
  23803. /* Set start of data to beginning of buffer. */
  23804. idx = 0;
  23805. /* Decode the key assuming it is an ED25519 private key. */
  23806. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  23807. (ed25519_key*)ssl->hsKey,
  23808. ssl->buffers.key->length);
  23809. #ifdef WOLF_PRIVATE_KEY_ID
  23810. /* if using external key then allow using a public key */
  23811. if (ret != 0 && (ssl->devId != INVALID_DEVID
  23812. #ifdef HAVE_PK_CALLBACKS
  23813. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  23814. #endif
  23815. )) {
  23816. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  23817. idx = 0;
  23818. ret = wc_Ed25519PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  23819. (ed25519_key*)ssl->hsKey,
  23820. ssl->buffers.key->length);
  23821. }
  23822. #endif
  23823. if (ret == 0) {
  23824. WOLFSSL_MSG("Using ED25519 private key");
  23825. /* Check it meets the minimum ECC key size requirements. */
  23826. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  23827. WOLFSSL_MSG("ED25519 key size too small");
  23828. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  23829. }
  23830. /* Return the maximum signature length. */
  23831. *length = ED25519_SIG_SIZE;
  23832. goto exit_dpk;
  23833. }
  23834. }
  23835. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  23836. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  23837. #if !defined(NO_RSA) || defined(HAVE_ECC)
  23838. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  23839. #endif
  23840. if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
  23841. ssl->hsType = DYNAMIC_TYPE_ED448;
  23842. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  23843. if (ret != 0) {
  23844. goto exit_dpk;
  23845. }
  23846. #ifdef HAVE_ED25519
  23847. WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
  23848. #elif defined(HAVE_ECC)
  23849. WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
  23850. #elif !defined(NO_RSA)
  23851. WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
  23852. #else
  23853. WOLFSSL_MSG("Trying ED448 private key");
  23854. #endif
  23855. /* Set start of data to beginning of buffer. */
  23856. idx = 0;
  23857. /* Decode the key assuming it is an ED448 private key. */
  23858. ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  23859. (ed448_key*)ssl->hsKey,
  23860. ssl->buffers.key->length);
  23861. #ifdef WOLF_PRIVATE_KEY_ID
  23862. /* if using external key then allow using a public key */
  23863. if (ret != 0 && (ssl->devId != INVALID_DEVID
  23864. #ifdef HAVE_PK_CALLBACKS
  23865. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  23866. #endif
  23867. )) {
  23868. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  23869. idx = 0;
  23870. ret = wc_Ed448PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  23871. (ed448_key*)ssl->hsKey,
  23872. ssl->buffers.key->length);
  23873. }
  23874. #endif
  23875. if (ret == 0) {
  23876. WOLFSSL_MSG("Using ED448 private key");
  23877. /* Check it meets the minimum ECC key size requirements. */
  23878. if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  23879. WOLFSSL_MSG("ED448 key size too small");
  23880. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  23881. }
  23882. /* Return the maximum signature length. */
  23883. *length = ED448_SIG_SIZE;
  23884. goto exit_dpk;
  23885. }
  23886. }
  23887. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  23888. #if defined(HAVE_PQC)
  23889. #if defined(HAVE_FALCON)
  23890. if (ssl->buffers.keyType == falcon_level1_sa_algo ||
  23891. ssl->buffers.keyType == falcon_level5_sa_algo ||
  23892. ssl->buffers.keyType == 0) {
  23893. ssl->hsType = DYNAMIC_TYPE_FALCON;
  23894. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  23895. if (ret != 0) {
  23896. goto exit_dpk;
  23897. }
  23898. if (ssl->buffers.keyType == falcon_level1_sa_algo) {
  23899. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 1);
  23900. }
  23901. else if (ssl->buffers.keyType == falcon_level5_sa_algo) {
  23902. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 5);
  23903. }
  23904. else {
  23905. /* What if ssl->buffers.keyType is 0? We might want to do something
  23906. * more graceful here. */
  23907. ret = ALGO_ID_E;
  23908. }
  23909. if (ret != 0) {
  23910. goto exit_dpk;
  23911. }
  23912. #if defined(HAVE_ED448)
  23913. WOLFSSL_MSG("Trying Falcon private key, ED448 didn't work");
  23914. #elif defined(HAVE_ED25519)
  23915. WOLFSSL_MSG("Trying Falcon private key, ED25519 didn't work");
  23916. #elif defined(HAVE_ECC)
  23917. WOLFSSL_MSG("Trying Falcon private key, ECC didn't work");
  23918. #elif !defined(NO_RSA)
  23919. WOLFSSL_MSG("Trying Falcon private key, RSA didn't work");
  23920. #else
  23921. WOLFSSL_MSG("Trying Falcon private key");
  23922. #endif
  23923. /* Set start of data to beginning of buffer. */
  23924. idx = 0;
  23925. /* Decode the key assuming it is a Falcon private key. */
  23926. ret = wc_falcon_import_private_only(ssl->buffers.key->buffer,
  23927. ssl->buffers.key->length,
  23928. (falcon_key*)ssl->hsKey);
  23929. if (ret == 0) {
  23930. WOLFSSL_MSG("Using Falcon private key");
  23931. /* Check it meets the minimum Falcon key size requirements. */
  23932. if (FALCON_MAX_KEY_SIZE < ssl->options.minFalconKeySz) {
  23933. WOLFSSL_MSG("Falcon key size too small");
  23934. ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk);
  23935. }
  23936. /* Return the maximum signature length. */
  23937. *length = FALCON_MAX_SIG_SIZE;
  23938. goto exit_dpk;
  23939. }
  23940. }
  23941. #endif /* HAVE_FALCON */
  23942. #if defined(HAVE_DILITHIUM)
  23943. if (ssl->buffers.keyType == dilithium_level2_sa_algo ||
  23944. ssl->buffers.keyType == dilithium_level3_sa_algo ||
  23945. ssl->buffers.keyType == dilithium_level5_sa_algo ||
  23946. ssl->buffers.keyType == 0) {
  23947. ssl->hsType = DYNAMIC_TYPE_DILITHIUM;
  23948. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  23949. if (ret != 0) {
  23950. goto exit_dpk;
  23951. }
  23952. if (ssl->buffers.keyType == dilithium_level2_sa_algo) {
  23953. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 2);
  23954. }
  23955. else if (ssl->buffers.keyType == dilithium_level3_sa_algo) {
  23956. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 3);
  23957. }
  23958. else if (ssl->buffers.keyType == dilithium_level5_sa_algo) {
  23959. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 5);
  23960. }
  23961. else {
  23962. /* What if ssl->buffers.keyType is 0? We might want to do something
  23963. * more graceful here. */
  23964. ret = ALGO_ID_E;
  23965. }
  23966. if (ret != 0) {
  23967. goto exit_dpk;
  23968. }
  23969. #if defined(HAVE_ED448)
  23970. WOLFSSL_MSG("Trying Dilithium private key, ED448 didn't work");
  23971. #elif defined(HAVE_ED25519)
  23972. WOLFSSL_MSG("Trying Dilithium private key, ED25519 didn't work");
  23973. #elif defined(HAVE_ECC)
  23974. WOLFSSL_MSG("Trying Dilithium private key, ECC didn't work");
  23975. #elif !defined(NO_RSA)
  23976. WOLFSSL_MSG("Trying Dilithium private key, RSA didn't work");
  23977. #elif defined(HAVE_FALCON)
  23978. WOLFSSL_MSG("Trying Dilithium private key, Falcon didn't work");
  23979. #else
  23980. WOLFSSL_MSG("Trying Dilithium private key");
  23981. #endif
  23982. /* Set start of data to beginning of buffer. */
  23983. idx = 0;
  23984. /* Decode the key assuming it is a Dilithium private key. */
  23985. ret = wc_dilithium_import_private_only(ssl->buffers.key->buffer,
  23986. ssl->buffers.key->length,
  23987. (dilithium_key*)ssl->hsKey);
  23988. if (ret == 0) {
  23989. WOLFSSL_MSG("Using Dilithium private key");
  23990. /* Check it meets the minimum Dilithium key size requirements. */
  23991. if (DILITHIUM_MAX_KEY_SIZE < ssl->options.minDilithiumKeySz) {
  23992. WOLFSSL_MSG("Dilithium key size too small");
  23993. ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk);
  23994. }
  23995. /* Return the maximum signature length. */
  23996. *length = DILITHIUM_MAX_SIG_SIZE;
  23997. goto exit_dpk;
  23998. }
  23999. }
  24000. #endif /* HAVE_DILITHIUM */
  24001. #endif /* HAVE_PQC */
  24002. (void)idx;
  24003. (void)keySz;
  24004. (void)length;
  24005. exit_dpk:
  24006. if (ret != 0) {
  24007. WOLFSSL_ERROR_VERBOSE(ret);
  24008. }
  24009. return ret;
  24010. }
  24011. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  24012. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  24013. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  24014. int TLSv1_3_Capable(WOLFSSL* ssl)
  24015. {
  24016. #ifndef WOLFSSL_TLS13
  24017. return 0;
  24018. #else
  24019. int ret = 0;
  24020. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  24021. ret = 1;
  24022. }
  24023. if ((wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_3)) {
  24024. /* option set at run time to disable TLS 1.3 */
  24025. ret = 0;
  24026. }
  24027. return ret;
  24028. #endif
  24029. }
  24030. #endif /* WOLFSSL_TLS13 */
  24031. #ifndef WOLFSSL_NO_TLS12
  24032. #if (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC) || \
  24033. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))) || \
  24034. (!defined(NO_WOLFSSL_SERVER) && (defined(HAVE_ECC) || \
  24035. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  24036. (defined(HAVE_ED25519) || defined(HAVE_ED448) || !defined(NO_RSA)))) || \
  24037. (!defined(NO_DH) && (!defined(NO_RSA) || defined(HAVE_ANON))))
  24038. /* Returns whether the signature algorithm requires caching of messages.
  24039. *
  24040. * @param [in] sigAlgo Signature algorithm.
  24041. * @return 1 when caching required.
  24042. * @return 0 when caching not required.
  24043. */
  24044. static int SigAlgoCachesMsgs(int sigAlgo)
  24045. {
  24046. int ret;
  24047. (void)sigAlgo;
  24048. #ifdef HAVE_ED25519
  24049. if (sigAlgo == ed25519_sa_algo) {
  24050. ret = 1;
  24051. }
  24052. else
  24053. #endif
  24054. #ifdef HAVE_ED448
  24055. if (sigAlgo == ed448_sa_algo) {
  24056. ret = 1;
  24057. }
  24058. else
  24059. #endif
  24060. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  24061. if (sigAlgo == sm2_sa_algo) {
  24062. ret = 1;
  24063. }
  24064. else
  24065. #endif
  24066. {
  24067. ret = 0;
  24068. }
  24069. return ret;
  24070. }
  24071. static int HashSkeData(WOLFSSL* ssl, enum wc_HashType hashType,
  24072. const byte* data, int sz, byte sigAlgo)
  24073. {
  24074. int ret = 0;
  24075. int digest_sz = wc_HashGetDigestSize(hashType);
  24076. if (digest_sz <= 0) {
  24077. ret = BUFFER_ERROR;
  24078. }
  24079. if (ret == 0) {
  24080. /* buffer for signature */
  24081. ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + sz, ssl->heap,
  24082. DYNAMIC_TYPE_SIGNATURE);
  24083. if (ssl->buffers.sig.buffer == NULL) {
  24084. ret = MEMORY_E;
  24085. }
  24086. }
  24087. if (ret == 0) {
  24088. ssl->buffers.sig.length = SEED_LEN + sz;
  24089. /* build message to hash */
  24090. XMEMCPY(ssl->buffers.sig.buffer, ssl->arrays->clientRandom, RAN_LEN);
  24091. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN], ssl->arrays->serverRandom,
  24092. RAN_LEN);
  24093. /* message */
  24094. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2], data, sz);
  24095. }
  24096. if (ret == 0 && !SigAlgoCachesMsgs(sigAlgo)) {
  24097. ssl->buffers.digest.length = (unsigned int)digest_sz;
  24098. /* buffer for hash */
  24099. if (!ssl->buffers.digest.buffer) {
  24100. if (!ssl->options.dontFreeDigest) {
  24101. XFREE(ssl->buffers.digest.buffer, ssl->heap,
  24102. DYNAMIC_TYPE_DIGEST);
  24103. }
  24104. }
  24105. ssl->options.dontFreeDigest = 0;
  24106. ssl->buffers.digest.buffer = (byte*)XMALLOC(ssl->buffers.digest.length,
  24107. ssl->heap, DYNAMIC_TYPE_DIGEST);
  24108. if (ssl->buffers.digest.buffer == NULL) {
  24109. ret = MEMORY_E;
  24110. }
  24111. }
  24112. if (ret == 0 && !SigAlgoCachesMsgs(sigAlgo)) {
  24113. /* Perform hash. Only wc_Hash supports MD5_SHA1. */
  24114. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  24115. ssl->buffers.sig.length,
  24116. ssl->buffers.digest.buffer,
  24117. ssl->buffers.digest.length);
  24118. #ifdef HAVE_PK_CALLBACKS
  24119. if (ssl->ctx->ProcessServerSigKexCb == NULL)
  24120. #endif
  24121. {
  24122. /* No further processing will be done. It can be freed. */
  24123. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24124. ssl->buffers.sig.buffer = NULL;
  24125. }
  24126. }
  24127. return ret;
  24128. }
  24129. #endif
  24130. #endif /* !WOLFSSL_NO_TLS12 */
  24131. /* client only parts */
  24132. #ifndef NO_WOLFSSL_CLIENT
  24133. #ifndef WOLFSSL_NO_TLS12
  24134. /* handle generation of client_hello (1) */
  24135. int SendClientHello(WOLFSSL* ssl)
  24136. {
  24137. byte *output;
  24138. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  24139. int sendSz;
  24140. int idSz;
  24141. int ret;
  24142. word16 extSz = 0;
  24143. const Suites* suites;
  24144. if (ssl == NULL) {
  24145. return BAD_FUNC_ARG;
  24146. }
  24147. #ifdef WOLFSSL_TLS13
  24148. if (IsAtLeastTLSv1_3(ssl->version))
  24149. return SendTls13ClientHello(ssl);
  24150. #endif
  24151. #ifdef HAVE_SECURE_RENEGOTIATION
  24152. /* We don't want to resume in SCR */
  24153. if (IsSCR(ssl))
  24154. ssl->options.resuming = 0;
  24155. #endif
  24156. idSz = ssl->options.resuming ? ssl->session->sessionIDSz : 0;
  24157. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  24158. WOLFSSL_ENTER("SendClientHello");
  24159. suites = WOLFSSL_SUITES(ssl);
  24160. if (suites == NULL) {
  24161. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  24162. return SUITES_ERROR;
  24163. }
  24164. #ifdef HAVE_SESSION_TICKET
  24165. if (ssl->options.resuming && ssl->session->ticketLen > 0) {
  24166. SessionTicket* ticket;
  24167. ticket = TLSX_SessionTicket_Create(0, ssl->session->ticket,
  24168. ssl->session->ticketLen, ssl->heap);
  24169. if (ticket == NULL) return MEMORY_E;
  24170. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  24171. if (ret != WOLFSSL_SUCCESS) {
  24172. TLSX_SessionTicket_Free(ticket, ssl->heap);
  24173. return ret;
  24174. }
  24175. idSz = 0;
  24176. }
  24177. #endif
  24178. length = VERSION_SZ + RAN_LEN
  24179. + idSz + ENUM_LEN
  24180. + SUITE_LEN
  24181. + COMP_LEN + ENUM_LEN;
  24182. #ifndef NO_FORCE_SCR_SAME_SUITE
  24183. if (IsSCR(ssl))
  24184. length += SUITE_LEN;
  24185. else
  24186. #endif
  24187. length += suites->suiteSz;
  24188. #ifdef HAVE_TLS_EXTENSIONS
  24189. /* auto populate extensions supported unless user defined */
  24190. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  24191. return ret;
  24192. extSz = 0;
  24193. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  24194. if (ret != 0)
  24195. return ret;
  24196. length += extSz;
  24197. #else
  24198. if (IsAtLeastTLSv1_2(ssl) && suites->hashSigAlgoSz)
  24199. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  24200. + suites->hashSigAlgoSz;
  24201. #ifdef HAVE_EXTENDED_MASTER
  24202. if (ssl->options.haveEMS)
  24203. extSz += HELLO_EXT_SZ;
  24204. #endif
  24205. if (extSz != 0)
  24206. length += extSz + HELLO_EXT_SZ_SZ;
  24207. #endif
  24208. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  24209. if (ssl->arrays == NULL) {
  24210. return BAD_FUNC_ARG;
  24211. }
  24212. #ifdef WOLFSSL_DTLS
  24213. if (ssl->options.dtls) {
  24214. length += ENUM_LEN; /* cookie */
  24215. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  24216. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  24217. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  24218. }
  24219. #endif
  24220. if (IsEncryptionOn(ssl, 1))
  24221. sendSz += MAX_MSG_EXTRA;
  24222. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  24223. * is not advanced yet */
  24224. ssl->options.buildingMsg = 1;
  24225. /* check for available size */
  24226. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  24227. return ret;
  24228. /* get output buffer */
  24229. output = GetOutputBuffer(ssl);
  24230. AddHeaders(output, length, client_hello, ssl);
  24231. /* client hello, first version */
  24232. output[idx++] = ssl->version.major;
  24233. output[idx++] = ssl->version.minor;
  24234. ssl->chVersion = ssl->version; /* store in case changed */
  24235. /* then random */
  24236. if (ssl->options.connectState == CONNECT_BEGIN) {
  24237. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  24238. if (ret != 0)
  24239. return ret;
  24240. /* store random */
  24241. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  24242. } else {
  24243. #ifdef WOLFSSL_DTLS
  24244. /* send same random on hello again */
  24245. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  24246. #endif
  24247. }
  24248. idx += RAN_LEN;
  24249. /* then session id */
  24250. output[idx++] = (byte)idSz;
  24251. if (idSz) {
  24252. XMEMCPY(output + idx, ssl->session->sessionID,
  24253. ssl->session->sessionIDSz);
  24254. idx += ssl->session->sessionIDSz;
  24255. }
  24256. /* then DTLS cookie */
  24257. #ifdef WOLFSSL_DTLS
  24258. if (ssl->options.dtls) {
  24259. byte cookieSz = ssl->arrays->cookieSz;
  24260. output[idx++] = cookieSz;
  24261. if (cookieSz) {
  24262. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  24263. idx += cookieSz;
  24264. }
  24265. }
  24266. #endif
  24267. #ifndef NO_FORCE_SCR_SAME_SUITE
  24268. if (IsSCR(ssl)) {
  24269. c16toa(SUITE_LEN, output + idx);
  24270. idx += OPAQUE16_LEN;
  24271. output[idx++] = ssl->options.cipherSuite0;
  24272. output[idx++] = ssl->options.cipherSuite;
  24273. }
  24274. else
  24275. #endif
  24276. {
  24277. /* then cipher suites */
  24278. c16toa(suites->suiteSz, output + idx);
  24279. idx += OPAQUE16_LEN;
  24280. XMEMCPY(output + idx, &suites->suites, suites->suiteSz);
  24281. idx += suites->suiteSz;
  24282. }
  24283. /* last, compression */
  24284. output[idx++] = COMP_LEN;
  24285. if (ssl->options.usingCompression)
  24286. output[idx++] = ZLIB_COMPRESSION;
  24287. else
  24288. output[idx++] = NO_COMPRESSION;
  24289. #ifdef HAVE_TLS_EXTENSIONS
  24290. extSz = 0;
  24291. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  24292. if (ret != 0)
  24293. return ret;
  24294. idx += extSz;
  24295. (void)idx; /* suppress analyzer warning, keep idx current */
  24296. #else
  24297. if (extSz != 0) {
  24298. c16toa(extSz, output + idx);
  24299. idx += HELLO_EXT_SZ_SZ;
  24300. if (IsAtLeastTLSv1_2(ssl)) {
  24301. if (suites->hashSigAlgoSz) {
  24302. word16 i;
  24303. /* extension type */
  24304. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  24305. idx += HELLO_EXT_TYPE_SZ;
  24306. /* extension data length */
  24307. c16toa(HELLO_EXT_SIGALGO_SZ + suites->hashSigAlgoSz,
  24308. output + idx);
  24309. idx += HELLO_EXT_SZ_SZ;
  24310. /* sig algos length */
  24311. c16toa(suites->hashSigAlgoSz, output + idx);
  24312. idx += HELLO_EXT_SIGALGO_SZ;
  24313. for (i=0; i < suites->hashSigAlgoSz; i++, idx++) {
  24314. output[idx] = suites->hashSigAlgo[i];
  24315. }
  24316. }
  24317. }
  24318. #ifdef HAVE_EXTENDED_MASTER
  24319. if (ssl->options.haveEMS) {
  24320. c16toa(HELLO_EXT_EXTMS, output + idx);
  24321. idx += HELLO_EXT_TYPE_SZ;
  24322. c16toa(0, output + idx);
  24323. idx += HELLO_EXT_SZ_SZ;
  24324. }
  24325. #endif
  24326. }
  24327. #endif
  24328. if (IsEncryptionOn(ssl, 1)) {
  24329. byte* input;
  24330. int inputSz = idx; /* build msg adds rec hdr */
  24331. int recordHeaderSz = RECORD_HEADER_SZ;
  24332. if (ssl->options.dtls)
  24333. recordHeaderSz += DTLS_RECORD_EXTRA;
  24334. inputSz -= recordHeaderSz;
  24335. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24336. if (input == NULL)
  24337. return MEMORY_E;
  24338. XMEMCPY(input, output + recordHeaderSz, inputSz);
  24339. #ifdef WOLFSSL_DTLS
  24340. if (IsDtlsNotSctpMode(ssl) &&
  24341. (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
  24342. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24343. return ret;
  24344. }
  24345. #endif
  24346. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  24347. handshake, 1, 0, 0, CUR_ORDER);
  24348. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24349. if (sendSz < 0)
  24350. return sendSz;
  24351. } else {
  24352. #ifdef WOLFSSL_DTLS
  24353. if (IsDtlsNotSctpMode(ssl)) {
  24354. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
  24355. return ret;
  24356. }
  24357. if (ssl->options.dtls)
  24358. DtlsSEQIncrement(ssl, CUR_ORDER);
  24359. #endif
  24360. ret = HashOutput(ssl, output, sendSz, 0);
  24361. if (ret != 0)
  24362. return ret;
  24363. }
  24364. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  24365. #ifdef OPENSSL_EXTRA
  24366. ssl->cbmode = SSL_CB_MODE_WRITE;
  24367. if (ssl->CBIS != NULL)
  24368. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  24369. #endif
  24370. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  24371. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  24372. if (ssl->toInfoOn) {
  24373. ret = AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  24374. WRITE_PROTO, 0, ssl->heap);
  24375. if (ret != 0)
  24376. return ret;
  24377. }
  24378. #endif
  24379. ssl->options.buildingMsg = 0;
  24380. ssl->buffers.outputBuffer.length += sendSz;
  24381. ret = SendBuffered(ssl);
  24382. WOLFSSL_LEAVE("SendClientHello", ret);
  24383. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  24384. return ret;
  24385. }
  24386. /* handle processing of DTLS hello_verify_request (3) */
  24387. int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  24388. word32 size)
  24389. {
  24390. ProtocolVersion pv;
  24391. byte cookieSz;
  24392. word32 begin = *inOutIdx;
  24393. #ifdef WOLFSSL_CALLBACKS
  24394. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  24395. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  24396. #endif
  24397. #ifdef WOLFSSL_DTLS
  24398. if (ssl->options.dtls) {
  24399. DtlsMsgPoolReset(ssl);
  24400. }
  24401. #endif
  24402. if (OPAQUE16_LEN + OPAQUE8_LEN > size)
  24403. return BUFFER_ERROR;
  24404. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  24405. *inOutIdx += OPAQUE16_LEN;
  24406. if (pv.major != DTLS_MAJOR ||
  24407. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  24408. return VERSION_ERROR;
  24409. cookieSz = input[(*inOutIdx)++];
  24410. if (cookieSz) {
  24411. if ((*inOutIdx - begin) + cookieSz > size)
  24412. return BUFFER_ERROR;
  24413. #ifdef WOLFSSL_DTLS
  24414. if (cookieSz <= MAX_COOKIE_LEN) {
  24415. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  24416. ssl->arrays->cookieSz = cookieSz;
  24417. }
  24418. #endif
  24419. *inOutIdx += cookieSz;
  24420. }
  24421. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13)
  24422. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.dtls) {
  24423. /* we sent a TLSv1.3 ClientHello but received a
  24424. * HELLO_VERIFY_REQUEST. We only check if DTLSv1_3_MINOR is the
  24425. * min downgrade option as per the server_version field comments in
  24426. * https://www.rfc-editor.org/rfc/rfc6347#section-4.2.1 */
  24427. if (!ssl->options.downgrade ||
  24428. ssl->options.minDowngrade <= DTLSv1_3_MINOR)
  24429. return VERSION_ERROR;
  24430. }
  24431. #endif /* defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13) */
  24432. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  24433. return 0;
  24434. }
  24435. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  24436. {
  24437. int ret = 0;
  24438. #ifdef HAVE_SECRET_CALLBACK
  24439. /* If a session secret callback exists, we are using that
  24440. * key instead of the saved session key. Requires a ticket. */
  24441. ret = ret || (ssl->sessionSecretCb != NULL
  24442. #ifdef HAVE_SESSION_TICKET
  24443. && ssl->session->ticketLen > 0
  24444. #endif
  24445. );
  24446. #endif
  24447. #ifdef HAVE_SESSION_TICKET
  24448. /* server may send blank ticket which may not be expected to indicate
  24449. * existing one ok but will also be sending a new one */
  24450. ret = ret || (ssl->session->ticketLen > 0);
  24451. #endif
  24452. ret = ret ||
  24453. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  24454. ssl->session->sessionID, ID_LEN) == 0);
  24455. return ret;
  24456. }
  24457. /* Check the version in the received message is valid and set protocol
  24458. * version to use.
  24459. *
  24460. * ssl The SSL/TLS object.
  24461. * pv The protocol version from the packet.
  24462. * returns 0 on success, otherwise failure.
  24463. */
  24464. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  24465. {
  24466. byte lowerVersion, higherVersion;
  24467. #ifdef WOLFSSL_TLS13_DRAFT
  24468. if (pv.major == TLS_DRAFT_MAJOR) {
  24469. pv.major = SSLv3_MAJOR;
  24470. pv.minor = TLSv1_3_MINOR;
  24471. }
  24472. #endif
  24473. #ifdef OPENSSL_EXTRA
  24474. if (ssl->CBIS != NULL) {
  24475. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, WOLFSSL_SUCCESS);
  24476. }
  24477. #endif
  24478. if (ssl->options.dtls) {
  24479. if (pv.major != DTLS_MAJOR || pv.minor == DTLS_BOGUS_MINOR) {
  24480. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24481. return VERSION_ERROR;
  24482. }
  24483. lowerVersion = pv.minor > ssl->version.minor;
  24484. higherVersion = pv.minor < ssl->version.minor;
  24485. }
  24486. else {
  24487. if (pv.major != SSLv3_MAJOR) {
  24488. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24489. return VERSION_ERROR;
  24490. }
  24491. lowerVersion = pv.minor < ssl->version.minor;
  24492. higherVersion = pv.minor > ssl->version.minor;
  24493. }
  24494. if (higherVersion) {
  24495. WOLFSSL_MSG("Server using higher version, fatal error");
  24496. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24497. return VERSION_ERROR;
  24498. }
  24499. if (lowerVersion) {
  24500. WOLFSSL_MSG("server using lower version");
  24501. /* Check for downgrade attack. */
  24502. if (!ssl->options.downgrade) {
  24503. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  24504. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24505. return VERSION_ERROR;
  24506. }
  24507. if ((!ssl->options.dtls && pv.minor < ssl->options.minDowngrade) ||
  24508. (ssl->options.dtls && pv.minor > ssl->options.minDowngrade)) {
  24509. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  24510. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24511. return VERSION_ERROR;
  24512. }
  24513. #ifdef HAVE_SECURE_RENEGOTIATION
  24514. if (ssl->secure_renegotiation &&
  24515. ssl->secure_renegotiation->enabled &&
  24516. ssl->options.handShakeDone) {
  24517. WOLFSSL_MSG("Server changed version during scr");
  24518. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24519. return VERSION_ERROR;
  24520. }
  24521. #endif
  24522. /* Checks made - OK to downgrade. */
  24523. ssl->version.minor = pv.minor;
  24524. switch(pv.minor) {
  24525. case SSLv3_MINOR:
  24526. /* turn off tls */
  24527. WOLFSSL_MSG("\tdowngrading to SSLv3");
  24528. ssl->options.tls = 0;
  24529. ssl->options.tls1_1 = 0;
  24530. break;
  24531. case TLSv1_MINOR:
  24532. /* turn off tls 1.1+ */
  24533. WOLFSSL_MSG("\tdowngrading to TLSv1");
  24534. ssl->options.tls1_1 = 0;
  24535. break;
  24536. case TLSv1_1_MINOR:
  24537. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  24538. break;
  24539. case DTLS_MINOR:
  24540. WOLFSSL_MSG("\tdowngrading to DTLSv1.1");
  24541. break;
  24542. case TLSv1_2_MINOR:
  24543. WOLFSSL_MSG("\tdowngrading to TLSv1.2");
  24544. break;
  24545. case DTLSv1_2_MINOR:
  24546. WOLFSSL_MSG("\tdowngrading to DTLSv1.2");
  24547. break;
  24548. default:
  24549. WOLFSSL_MSG("\tbad minor version");
  24550. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24551. return VERSION_ERROR;
  24552. }
  24553. }
  24554. /* check if option is set to not allow the current version
  24555. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  24556. if (!ssl->options.dtls && ssl->options.downgrade &&
  24557. ssl->options.mask > 0) {
  24558. if (ssl->version.minor == TLSv1_2_MINOR &&
  24559. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
  24560. WOLFSSL_OP_NO_TLSv1_2) {
  24561. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  24562. ssl->version.minor = TLSv1_1_MINOR;
  24563. }
  24564. if (ssl->version.minor == TLSv1_1_MINOR &&
  24565. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
  24566. WOLFSSL_OP_NO_TLSv1_1) {
  24567. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  24568. ssl->options.tls1_1 = 0;
  24569. ssl->version.minor = TLSv1_MINOR;
  24570. }
  24571. if (ssl->version.minor == TLSv1_MINOR &&
  24572. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
  24573. WOLFSSL_OP_NO_TLSv1) {
  24574. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  24575. ssl->options.tls = 0;
  24576. ssl->options.tls1_1 = 0;
  24577. ssl->version.minor = SSLv3_MINOR;
  24578. }
  24579. if (ssl->version.minor == SSLv3_MINOR &&
  24580. (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
  24581. WOLFSSL_OP_NO_SSLv3) {
  24582. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  24583. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24584. return VERSION_ERROR;
  24585. }
  24586. if (ssl->version.minor < ssl->options.minDowngrade) {
  24587. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  24588. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24589. return VERSION_ERROR;
  24590. }
  24591. }
  24592. return 0;
  24593. }
  24594. /* handle processing of server_hello (2) */
  24595. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  24596. word32 helloSz)
  24597. {
  24598. byte cs0; /* cipher suite bytes 0, 1 */
  24599. byte cs1;
  24600. ProtocolVersion pv;
  24601. byte compression;
  24602. word32 i = *inOutIdx;
  24603. word32 begin = i;
  24604. int ret;
  24605. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  24606. WOLFSSL_ENTER("DoServerHello");
  24607. #ifdef WOLFSSL_CALLBACKS
  24608. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  24609. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  24610. #endif
  24611. /* protocol version, random and session id length check */
  24612. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  24613. return BUFFER_ERROR;
  24614. /* protocol version */
  24615. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  24616. i += OPAQUE16_LEN;
  24617. ret = CheckVersion(ssl, pv);
  24618. if (ret != 0) {
  24619. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  24620. return ret;
  24621. }
  24622. #ifdef WOLFSSL_TLS13
  24623. if (IsAtLeastTLSv1_3(pv)) {
  24624. byte type = server_hello;
  24625. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  24626. }
  24627. #endif
  24628. /* random */
  24629. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  24630. i += RAN_LEN;
  24631. /* session id */
  24632. ssl->arrays->sessionIDSz = input[i++];
  24633. if (ssl->arrays->sessionIDSz > ID_LEN) {
  24634. WOLFSSL_MSG("Invalid session ID size");
  24635. ssl->arrays->sessionIDSz = 0;
  24636. return BUFFER_ERROR;
  24637. }
  24638. else if (ssl->arrays->sessionIDSz) {
  24639. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  24640. return BUFFER_ERROR;
  24641. XMEMCPY(ssl->arrays->sessionID, input + i,
  24642. ssl->arrays->sessionIDSz);
  24643. i += ssl->arrays->sessionIDSz;
  24644. ssl->options.haveSessionId = 1;
  24645. }
  24646. /* suite and compression */
  24647. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  24648. return BUFFER_ERROR;
  24649. cs0 = input[i++];
  24650. cs1 = input[i++];
  24651. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  24652. #if defined(HAVE_SECURE_RENEGOTIATION) && !defined(NO_FORCE_SCR_SAME_SUITE)
  24653. if (IsSCR(ssl)) {
  24654. if (ssl->options.cipherSuite0 != cs0 ||
  24655. ssl->options.cipherSuite != cs1) {
  24656. WOLFSSL_MSG("Server changed cipher suite during scr");
  24657. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  24658. return MATCH_SUITE_ERROR;
  24659. }
  24660. }
  24661. else
  24662. #endif
  24663. {
  24664. word32 idx, found = 0;
  24665. const Suites* suites = WOLFSSL_SUITES(ssl);
  24666. /* confirm server_hello cipher suite is one sent in client_hello */
  24667. for (idx = 0; idx < suites->suiteSz; idx += 2) {
  24668. if (suites->suites[idx] == cs0 &&
  24669. suites->suites[idx+1] == cs1) {
  24670. found = 1;
  24671. break;
  24672. }
  24673. }
  24674. if (!found) {
  24675. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  24676. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  24677. return MATCH_SUITE_ERROR;
  24678. }
  24679. }
  24680. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  24681. ssl->options.cipherSuite0 = cs0;
  24682. ssl->options.cipherSuite = cs1;
  24683. #ifdef WOLFSSL_DEBUG_TLS
  24684. WOLFSSL_MSG("Chosen cipher suite:");
  24685. WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
  24686. ssl->options.cipherSuite));
  24687. #endif
  24688. compression = input[i++];
  24689. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  24690. WOLFSSL_MSG("Server forcing compression w/o support");
  24691. WOLFSSL_ERROR_VERBOSE(COMPRESSION_ERROR);
  24692. return COMPRESSION_ERROR;
  24693. }
  24694. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  24695. WOLFSSL_MSG("Server refused compression, turning off");
  24696. ssl->options.usingCompression = 0; /* turn off if server refused */
  24697. }
  24698. *inOutIdx = i;
  24699. #ifdef HAVE_TLS_EXTENSIONS
  24700. if ( (i - begin) < helloSz) {
  24701. if (TLSX_SupportExtensions(ssl)) {
  24702. word16 totalExtSz;
  24703. if ((i - begin) + OPAQUE16_LEN > helloSz)
  24704. return BUFFER_ERROR;
  24705. ato16(&input[i], &totalExtSz);
  24706. i += OPAQUE16_LEN;
  24707. if ((i - begin) + totalExtSz > helloSz)
  24708. return BUFFER_ERROR;
  24709. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  24710. server_hello, NULL)))
  24711. return ret;
  24712. i += totalExtSz;
  24713. *inOutIdx = i;
  24714. }
  24715. else
  24716. *inOutIdx = begin + helloSz; /* skip extensions */
  24717. }
  24718. else
  24719. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  24720. #else
  24721. {
  24722. byte pendingEMS = 0;
  24723. if ( (i - begin) < helloSz) {
  24724. int allowExt = 0;
  24725. if (ssl->version.major == SSLv3_MAJOR &&
  24726. ssl->version.minor >= TLSv1_MINOR) {
  24727. allowExt = 1;
  24728. }
  24729. #ifdef WOLFSSL_DTLS
  24730. if (ssl->version.major == DTLS_MAJOR)
  24731. allowExt = 1;
  24732. #endif
  24733. if (allowExt) {
  24734. word16 totalExtSz;
  24735. if ((i - begin) + OPAQUE16_LEN > helloSz)
  24736. return BUFFER_ERROR;
  24737. ato16(&input[i], &totalExtSz);
  24738. i += OPAQUE16_LEN;
  24739. if ((i - begin) + totalExtSz > helloSz)
  24740. return BUFFER_ERROR;
  24741. while (totalExtSz) {
  24742. word16 extId, extSz;
  24743. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  24744. return BUFFER_ERROR;
  24745. ato16(&input[i], &extId);
  24746. i += OPAQUE16_LEN;
  24747. ato16(&input[i], &extSz);
  24748. i += OPAQUE16_LEN;
  24749. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  24750. return BUFFER_ERROR;
  24751. if (extId == HELLO_EXT_EXTMS)
  24752. pendingEMS = 1;
  24753. else
  24754. i += extSz;
  24755. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  24756. }
  24757. *inOutIdx = i;
  24758. }
  24759. else
  24760. *inOutIdx = begin + helloSz; /* skip extensions */
  24761. }
  24762. if (!pendingEMS && ssl->options.haveEMS)
  24763. ssl->options.haveEMS = 0;
  24764. }
  24765. #endif
  24766. #if defined(WOLFSSL_HARDEN_TLS) && !defined(WOLFSSL_HARDEN_TLS_NO_SCR_CHECK)
  24767. if (ssl->secure_renegotiation == NULL ||
  24768. !ssl->secure_renegotiation->enabled) {
  24769. /* If the server does not acknowledge the extension, the client
  24770. * MUST generate a fatal handshake_failure alert prior to
  24771. * terminating the connection.
  24772. * https://www.rfc-editor.org/rfc/rfc9325#name-renegotiation-in-tls-12 */
  24773. WOLFSSL_MSG("ServerHello did not contain SCR extension");
  24774. return SECURE_RENEGOTIATION_E;
  24775. }
  24776. #endif
  24777. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  24778. if (IsEncryptionOn(ssl, 0)) {
  24779. *inOutIdx += ssl->keys.padSz;
  24780. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  24781. if (ssl->options.startedETMWrite &&
  24782. ssl->specs.cipher_type == block) {
  24783. *inOutIdx += MacSize(ssl);
  24784. }
  24785. #endif
  24786. }
  24787. #ifdef HAVE_SECRET_CALLBACK
  24788. if (ssl->sessionSecretCb != NULL
  24789. #ifdef HAVE_SESSION_TICKET
  24790. && ssl->session->ticketLen > 0
  24791. #endif
  24792. ) {
  24793. int secretSz = SECRET_LEN;
  24794. ret = ssl->sessionSecretCb(ssl, ssl->session->masterSecret,
  24795. &secretSz, ssl->sessionSecretCtx);
  24796. if (ret != 0 || secretSz != SECRET_LEN) {
  24797. WOLFSSL_ERROR_VERBOSE(SESSION_SECRET_CB_E);
  24798. return SESSION_SECRET_CB_E;
  24799. }
  24800. }
  24801. #endif /* HAVE_SECRET_CALLBACK */
  24802. ret = CompleteServerHello(ssl);
  24803. WOLFSSL_LEAVE("DoServerHello", ret);
  24804. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  24805. return ret;
  24806. }
  24807. int CompleteServerHello(WOLFSSL* ssl)
  24808. {
  24809. int ret;
  24810. if (!ssl->options.resuming) {
  24811. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  24812. TLS13_DOWNGRADE_SZ - 1;
  24813. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  24814. #ifdef WOLFSSL_TLS13
  24815. if (TLSv1_3_Capable(ssl)) {
  24816. /* TLS v1.3 capable client not allowed to downgrade when
  24817. * connecting to TLS v1.3 capable server unless cipher suite
  24818. * demands it.
  24819. */
  24820. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  24821. (vers == 0 || vers == 1)) {
  24822. SendAlert(ssl, alert_fatal, illegal_parameter);
  24823. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24824. return VERSION_ERROR;
  24825. }
  24826. }
  24827. else
  24828. #endif
  24829. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  24830. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  24831. (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0) {
  24832. /* TLS v1.2 capable client not allowed to downgrade when
  24833. * connecting to TLS v1.2 capable server.
  24834. */
  24835. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  24836. vers == 0) {
  24837. SendAlert(ssl, alert_fatal, illegal_parameter);
  24838. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  24839. return VERSION_ERROR;
  24840. }
  24841. }
  24842. }
  24843. else {
  24844. if (DSH_CheckSessionId(ssl)) {
  24845. if (SetCipherSpecs(ssl) == 0) {
  24846. XMEMCPY(ssl->arrays->masterSecret,
  24847. ssl->session->masterSecret, SECRET_LEN);
  24848. #ifdef NO_OLD_TLS
  24849. ret = DeriveTlsKeys(ssl);
  24850. #else
  24851. ret = -1; /* default value */
  24852. #ifndef NO_TLS
  24853. if (ssl->options.tls)
  24854. ret = DeriveTlsKeys(ssl);
  24855. #endif
  24856. if (!ssl->options.tls)
  24857. ret = DeriveKeys(ssl);
  24858. #endif /* NO_OLD_TLS */
  24859. /* SERVER: peer auth based on session secret. */
  24860. ssl->options.peerAuthGood = (ret == 0);
  24861. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  24862. return ret;
  24863. }
  24864. else {
  24865. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  24866. WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_SUITE);
  24867. return UNSUPPORTED_SUITE;
  24868. }
  24869. }
  24870. else {
  24871. WOLFSSL_MSG("Server denied resumption attempt");
  24872. ssl->options.resuming = 0; /* server denied resumption try */
  24873. }
  24874. }
  24875. return SetCipherSpecs(ssl);
  24876. }
  24877. #endif /* !WOLFSSL_NO_TLS12 */
  24878. /* Make sure client setup is valid for this suite, true on success */
  24879. int VerifyClientSuite(word16 havePSK, byte cipherSuite0, byte cipherSuite)
  24880. {
  24881. (void)havePSK;
  24882. WOLFSSL_ENTER("VerifyClientSuite");
  24883. if (CipherRequires(cipherSuite0, cipherSuite, REQUIRES_PSK)) {
  24884. WOLFSSL_MSG("Requires PSK");
  24885. #ifndef NO_PSK
  24886. if (havePSK == 0)
  24887. #endif
  24888. {
  24889. WOLFSSL_MSG("Don't have PSK");
  24890. return 0;
  24891. }
  24892. }
  24893. return 1; /* success */
  24894. }
  24895. #ifndef WOLFSSL_NO_TLS12
  24896. #ifndef NO_CERTS
  24897. /* handle processing of certificate_request (13) */
  24898. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  24899. inOutIdx, word32 size)
  24900. {
  24901. word16 len;
  24902. word32 begin = *inOutIdx;
  24903. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
  24904. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  24905. int ret;
  24906. #endif
  24907. #ifdef OPENSSL_EXTRA
  24908. WOLFSSL_X509* x509 = NULL;
  24909. WOLFSSL_EVP_PKEY* pkey = NULL;
  24910. #endif
  24911. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  24912. WOLFSSL_ENTER("DoCertificateRequest");
  24913. #ifdef WOLFSSL_CALLBACKS
  24914. if (ssl->hsInfoOn)
  24915. AddPacketName(ssl, "CertificateRequest");
  24916. if (ssl->toInfoOn)
  24917. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  24918. #endif
  24919. if (OPAQUE8_LEN > size)
  24920. return BUFFER_ERROR;
  24921. len = input[(*inOutIdx)++];
  24922. if ((*inOutIdx - begin) + len > size)
  24923. return BUFFER_ERROR;
  24924. /* types, read in here */
  24925. *inOutIdx += len;
  24926. /* signature and hash signature algorithm */
  24927. if (IsAtLeastTLSv1_2(ssl)) {
  24928. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  24929. return BUFFER_ERROR;
  24930. ato16(input + *inOutIdx, &len);
  24931. *inOutIdx += OPAQUE16_LEN;
  24932. if ((len > size) || ((*inOutIdx - begin) + len > size))
  24933. return BUFFER_ERROR;
  24934. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  24935. ssl->buffers.certificate &&
  24936. ssl->buffers.certificate->buffer) {
  24937. #ifdef HAVE_PK_CALLBACKS
  24938. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  24939. WOLFSSL_MSG("Using PK for client private key");
  24940. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  24941. return INVALID_PARAMETER;
  24942. }
  24943. #endif
  24944. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  24945. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  24946. return INVALID_PARAMETER;
  24947. }
  24948. }
  24949. *inOutIdx += len;
  24950. #ifdef WC_RSA_PSS
  24951. ssl->pssAlgo = 0;
  24952. if (ssl->options.sigAlgo == rsa_pss_sa_algo)
  24953. ssl->pssAlgo |= 1 << ssl->options.hashAlgo;
  24954. #endif
  24955. }
  24956. /* authorities */
  24957. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  24958. return BUFFER_ERROR;
  24959. /* DN seq length */
  24960. ato16(input + *inOutIdx, &len);
  24961. *inOutIdx += OPAQUE16_LEN;
  24962. if ((*inOutIdx - begin) + len > size)
  24963. return BUFFER_ERROR;
  24964. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  24965. if (ssl->client_ca_names != ssl->ctx->client_ca_names)
  24966. wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
  24967. ssl->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  24968. if (ssl->client_ca_names == NULL) {
  24969. return MEMORY_ERROR;
  24970. }
  24971. #endif
  24972. while (len) {
  24973. word16 dnSz;
  24974. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  24975. return BUFFER_ERROR;
  24976. ato16(input + *inOutIdx, &dnSz);
  24977. *inOutIdx += OPAQUE16_LEN;
  24978. if ((*inOutIdx - begin) + dnSz > size)
  24979. return BUFFER_ERROR;
  24980. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  24981. {
  24982. WOLFSSL_X509_NAME* name = NULL;
  24983. /* Use a DecodedCert struct to get access to GetName to
  24984. * parse DN name */
  24985. #ifdef WOLFSSL_SMALL_STACK
  24986. DecodedCert *cert = (DecodedCert *)XMALLOC(
  24987. sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
  24988. if (cert == NULL)
  24989. return MEMORY_ERROR;
  24990. #else
  24991. DecodedCert cert[1];
  24992. #endif
  24993. InitDecodedCert(cert, input + *inOutIdx, dnSz, ssl->heap);
  24994. ret = GetName(cert, SUBJECT, dnSz);
  24995. if (ret == 0) {
  24996. if ((name = wolfSSL_X509_NAME_new_ex(cert->heap)) == NULL)
  24997. ret = MEMORY_ERROR;
  24998. }
  24999. if (ret == 0) {
  25000. CopyDecodedName(name, cert, SUBJECT);
  25001. }
  25002. if (ret == 0) {
  25003. if (wolfSSL_sk_X509_NAME_push(ssl->client_ca_names, name)
  25004. == WOLFSSL_FAILURE)
  25005. {
  25006. ret = MEMORY_ERROR;
  25007. }
  25008. }
  25009. FreeDecodedCert(cert);
  25010. #ifdef WOLFSSL_SMALL_STACK
  25011. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  25012. #endif
  25013. if (ret != 0) {
  25014. if (name != NULL)
  25015. wolfSSL_X509_NAME_free(name);
  25016. return ret;
  25017. }
  25018. }
  25019. #endif
  25020. *inOutIdx += dnSz;
  25021. len -= OPAQUE16_LEN + dnSz;
  25022. }
  25023. #ifdef OPENSSL_EXTRA
  25024. /* call client cert callback if no cert has been loaded */
  25025. if ((ssl->ctx->CBClientCert != NULL) &&
  25026. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  25027. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  25028. if (ret == 1) {
  25029. if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
  25030. (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
  25031. WOLFSSL_ERROR_VERBOSE(CLIENT_CERT_CB_ERROR);
  25032. return CLIENT_CERT_CB_ERROR;
  25033. }
  25034. wolfSSL_X509_free(x509);
  25035. wolfSSL_EVP_PKEY_free(pkey);
  25036. }
  25037. else if (ret < 0) {
  25038. return WOLFSSL_ERROR_WANT_X509_LOOKUP;
  25039. }
  25040. }
  25041. if ((ret = CertSetupCbWrapper(ssl)) != 0)
  25042. return ret;
  25043. #endif
  25044. /* don't send client cert or cert verify if user hasn't provided
  25045. cert and private key */
  25046. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  25047. #ifdef HAVE_PK_CALLBACKS
  25048. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  25049. WOLFSSL_MSG("Using PK for client private key");
  25050. ssl->options.sendVerify = SEND_CERT;
  25051. }
  25052. #endif
  25053. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  25054. ssl->options.sendVerify = SEND_CERT;
  25055. }
  25056. }
  25057. #ifdef OPENSSL_EXTRA
  25058. else
  25059. #else
  25060. else if (IsTLS(ssl) || ssl->options.dtls)
  25061. #endif
  25062. {
  25063. ssl->options.sendVerify = SEND_BLANK_CERT;
  25064. }
  25065. if (IsEncryptionOn(ssl, 0)) {
  25066. *inOutIdx += ssl->keys.padSz;
  25067. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  25068. if (ssl->options.startedETMRead)
  25069. *inOutIdx += MacSize(ssl);
  25070. #endif
  25071. }
  25072. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  25073. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  25074. return 0;
  25075. }
  25076. #endif /* !NO_CERTS */
  25077. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  25078. static int CheckCurveId(int tlsCurveId)
  25079. {
  25080. int ret = ECC_CURVE_ERROR;
  25081. switch (tlsCurveId) {
  25082. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  25083. #ifndef NO_ECC_SECP
  25084. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  25085. #endif /* !NO_ECC_SECP */
  25086. #ifdef HAVE_ECC_SECPR2
  25087. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  25088. #endif /* HAVE_ECC_SECPR2 */
  25089. #ifdef HAVE_ECC_KOBLITZ
  25090. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  25091. #endif /* HAVE_ECC_KOBLITZ */
  25092. #endif
  25093. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  25094. #ifndef NO_ECC_SECP
  25095. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  25096. #endif /* !NO_ECC_SECP */
  25097. #ifdef HAVE_ECC_KOBLITZ
  25098. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  25099. #endif /* HAVE_ECC_KOBLITZ */
  25100. #endif
  25101. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  25102. #ifndef NO_ECC_SECP
  25103. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  25104. #endif /* !NO_ECC_SECP */
  25105. #ifdef HAVE_ECC_KOBLITZ
  25106. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  25107. #endif /* HAVE_ECC_KOBLITZ */
  25108. #endif
  25109. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  25110. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  25111. #endif
  25112. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  25113. #ifndef NO_ECC_SECP
  25114. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  25115. #endif /* !NO_ECC_SECP */
  25116. #ifdef HAVE_ECC_KOBLITZ
  25117. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  25118. #endif /* HAVE_ECC_KOBLITZ */
  25119. #ifdef HAVE_ECC_BRAINPOOL
  25120. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  25121. #endif /* HAVE_ECC_BRAINPOOL */
  25122. #ifdef WOLFSSL_SM2
  25123. case WOLFSSL_ECC_SM2P256V1: return ECC_SM2P256V1_OID;
  25124. #endif /* WOLFSSL_SM2 */
  25125. #endif
  25126. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  25127. case WOLFSSL_ECC_X448: return ECC_X448_OID;
  25128. #endif
  25129. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  25130. #ifndef NO_ECC_SECP
  25131. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  25132. #endif /* !NO_ECC_SECP */
  25133. #ifdef HAVE_ECC_BRAINPOOL
  25134. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  25135. #endif /* HAVE_ECC_BRAINPOOL */
  25136. #endif
  25137. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  25138. #ifdef HAVE_ECC_BRAINPOOL
  25139. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  25140. #endif /* HAVE_ECC_BRAINPOOL */
  25141. #endif
  25142. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  25143. #ifndef NO_ECC_SECP
  25144. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  25145. #endif /* !NO_ECC_SECP */
  25146. #endif
  25147. default: break;
  25148. }
  25149. return ret;
  25150. }
  25151. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25152. /* Persistable DoServerKeyExchange arguments */
  25153. typedef struct DskeArgs {
  25154. byte* output; /* not allocated */
  25155. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25156. defined(HAVE_CURVE448)
  25157. byte* verifySig;
  25158. #endif
  25159. word32 idx;
  25160. word32 begin;
  25161. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25162. defined(HAVE_CURVE448)
  25163. word16 verifySigSz;
  25164. #endif
  25165. word16 sigSz;
  25166. byte sigAlgo;
  25167. byte hashAlgo;
  25168. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  25169. int bits;
  25170. #endif
  25171. } DskeArgs;
  25172. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  25173. {
  25174. DskeArgs* args = (DskeArgs*)pArgs;
  25175. (void)ssl;
  25176. (void)args;
  25177. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25178. defined(HAVE_CURVE448)
  25179. if (args->verifySig) {
  25180. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25181. args->verifySig = NULL;
  25182. }
  25183. #endif
  25184. }
  25185. #ifndef NO_DH
  25186. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  25187. DskeArgs* args)
  25188. {
  25189. int ret = 0;
  25190. word16 length;
  25191. #ifdef HAVE_FFDHE
  25192. #ifdef HAVE_PUBLIC_FFDHE
  25193. const DhParams* params = NULL;
  25194. #endif
  25195. word16 group = 0;
  25196. #endif
  25197. if (ssl->buffers.weOwnDH) {
  25198. if (ssl->buffers.serverDH_P.buffer) {
  25199. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  25200. DYNAMIC_TYPE_PUBLIC_KEY);
  25201. ssl->buffers.serverDH_P.buffer = NULL;
  25202. }
  25203. if (ssl->buffers.serverDH_G.buffer) {
  25204. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  25205. DYNAMIC_TYPE_PUBLIC_KEY);
  25206. ssl->buffers.serverDH_G.buffer = NULL;
  25207. }
  25208. }
  25209. if (ssl->buffers.serverDH_Pub.buffer) {
  25210. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
  25211. DYNAMIC_TYPE_PUBLIC_KEY);
  25212. ssl->buffers.serverDH_Pub.buffer = NULL;
  25213. }
  25214. /* p */
  25215. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25216. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  25217. }
  25218. ato16(input + args->idx, &length);
  25219. args->idx += OPAQUE16_LEN;
  25220. if ((args->idx - args->begin) + length > size) {
  25221. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  25222. }
  25223. if (length < ssl->options.minDhKeySz) {
  25224. WOLFSSL_MSG("Server using a DH key that is too small");
  25225. SendAlert(ssl, alert_fatal, handshake_failure);
  25226. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  25227. }
  25228. if (length > ssl->options.maxDhKeySz) {
  25229. WOLFSSL_MSG("Server using a DH key that is too big");
  25230. SendAlert(ssl, alert_fatal, handshake_failure);
  25231. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  25232. }
  25233. ssl->buffers.serverDH_P.buffer =
  25234. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  25235. if (ssl->buffers.serverDH_P.buffer) {
  25236. ssl->buffers.serverDH_P.length = length;
  25237. }
  25238. else {
  25239. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  25240. }
  25241. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  25242. length);
  25243. args->idx += length;
  25244. ssl->options.dhKeySz = length;
  25245. /* g */
  25246. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25247. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  25248. DYNAMIC_TYPE_PUBLIC_KEY);
  25249. ssl->buffers.serverDH_P.buffer = NULL;
  25250. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  25251. }
  25252. ato16(input + args->idx, &length);
  25253. args->idx += OPAQUE16_LEN;
  25254. if ((args->idx - args->begin) + length > size) {
  25255. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  25256. DYNAMIC_TYPE_PUBLIC_KEY);
  25257. ssl->buffers.serverDH_P.buffer = NULL;
  25258. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  25259. }
  25260. if (length > ssl->options.maxDhKeySz) {
  25261. WOLFSSL_MSG("Server using a DH key generator that is too big");
  25262. SendAlert(ssl, alert_fatal, handshake_failure);
  25263. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  25264. DYNAMIC_TYPE_PUBLIC_KEY);
  25265. ssl->buffers.serverDH_P.buffer = NULL;
  25266. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  25267. }
  25268. ssl->buffers.serverDH_G.buffer =
  25269. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  25270. if (ssl->buffers.serverDH_G.buffer) {
  25271. ssl->buffers.serverDH_G.length = length;
  25272. }
  25273. else {
  25274. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  25275. DYNAMIC_TYPE_PUBLIC_KEY);
  25276. ssl->buffers.serverDH_P.buffer = NULL;
  25277. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  25278. }
  25279. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  25280. length);
  25281. args->idx += length;
  25282. /* pub */
  25283. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25284. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  25285. DYNAMIC_TYPE_PUBLIC_KEY);
  25286. ssl->buffers.serverDH_P.buffer = NULL;
  25287. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  25288. DYNAMIC_TYPE_PUBLIC_KEY);
  25289. ssl->buffers.serverDH_G.buffer = NULL;
  25290. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  25291. }
  25292. ato16(input + args->idx, &length);
  25293. args->idx += OPAQUE16_LEN;
  25294. if ((args->idx - args->begin) + length > size) {
  25295. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  25296. DYNAMIC_TYPE_PUBLIC_KEY);
  25297. ssl->buffers.serverDH_P.buffer = NULL;
  25298. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  25299. DYNAMIC_TYPE_PUBLIC_KEY);
  25300. ssl->buffers.serverDH_G.buffer = NULL;
  25301. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  25302. }
  25303. if (length > ssl->options.maxDhKeySz) {
  25304. WOLFSSL_MSG("Server using a public DH key that is too big");
  25305. SendAlert(ssl, alert_fatal, handshake_failure);
  25306. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  25307. DYNAMIC_TYPE_PUBLIC_KEY);
  25308. ssl->buffers.serverDH_P.buffer = NULL;
  25309. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  25310. DYNAMIC_TYPE_PUBLIC_KEY);
  25311. ssl->buffers.serverDH_G.buffer = NULL;
  25312. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  25313. }
  25314. ssl->buffers.serverDH_Pub.buffer =
  25315. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  25316. if (ssl->buffers.serverDH_Pub.buffer) {
  25317. ssl->buffers.serverDH_Pub.length = length;
  25318. }
  25319. else {
  25320. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  25321. DYNAMIC_TYPE_PUBLIC_KEY);
  25322. ssl->buffers.serverDH_P.buffer = NULL;
  25323. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  25324. DYNAMIC_TYPE_PUBLIC_KEY);
  25325. ssl->buffers.serverDH_G.buffer = NULL;
  25326. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  25327. }
  25328. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  25329. length);
  25330. ssl->buffers.weOwnDH = 1;
  25331. args->idx += length;
  25332. #ifdef HAVE_FFDHE
  25333. switch (ssl->options.dhKeySz) {
  25334. #ifdef HAVE_FFDHE_2048
  25335. case 2048/8:
  25336. #ifdef HAVE_PUBLIC_FFDHE
  25337. params = wc_Dh_ffdhe2048_Get();
  25338. #endif
  25339. group = WOLFSSL_FFDHE_2048;
  25340. break;
  25341. #endif
  25342. #ifdef HAVE_FFDHE_3072
  25343. case 3072/8:
  25344. #ifdef HAVE_PUBLIC_FFDHE
  25345. params = wc_Dh_ffdhe3072_Get();
  25346. #endif
  25347. group = WOLFSSL_FFDHE_3072;
  25348. break;
  25349. #endif
  25350. #ifdef HAVE_FFDHE_4096
  25351. case 4096/8:
  25352. #ifdef HAVE_PUBLIC_FFDHE
  25353. params = wc_Dh_ffdhe4096_Get();
  25354. #endif
  25355. group = WOLFSSL_FFDHE_4096;
  25356. break;
  25357. #endif
  25358. #ifdef HAVE_FFDHE_6144
  25359. case 6144/8:
  25360. #ifdef HAVE_PUBLIC_FFDHE
  25361. params = wc_Dh_ffdhe6144_Get();
  25362. #endif
  25363. group = WOLFSSL_FFDHE_6144;
  25364. break;
  25365. #endif
  25366. #ifdef HAVE_FFDHE_8192
  25367. case 8192/8:
  25368. #ifdef HAVE_PUBLIC_FFDHE
  25369. params = wc_Dh_ffdhe8192_Get();
  25370. #endif
  25371. group = WOLFSSL_FFDHE_8192;
  25372. break;
  25373. #endif
  25374. default:
  25375. break;
  25376. }
  25377. #ifdef HAVE_PUBLIC_FFDHE
  25378. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  25379. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  25380. params->g_len) != 0) ||
  25381. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  25382. params->p_len) != 0))
  25383. #else
  25384. if (!wc_DhCmpNamedKey(group, 1,
  25385. ssl->buffers.serverDH_P.buffer, ssl->buffers.serverDH_P.length,
  25386. ssl->buffers.serverDH_G.buffer, ssl->buffers.serverDH_G.length,
  25387. NULL, 0))
  25388. #endif
  25389. {
  25390. WOLFSSL_MSG("Server not using FFDHE parameters");
  25391. #ifdef WOLFSSL_REQUIRE_FFDHE
  25392. SendAlert(ssl, alert_fatal, handshake_failure);
  25393. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  25394. #endif
  25395. }
  25396. else {
  25397. ssl->namedGroup = group;
  25398. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  25399. !defined(HAVE_SELFTEST)
  25400. ssl->options.dhDoKeyTest = 0;
  25401. #endif
  25402. }
  25403. #endif /* HAVE_FFDHE */
  25404. exit_gdpk:
  25405. if (ret != 0) {
  25406. WOLFSSL_ERROR_VERBOSE(ret);
  25407. }
  25408. return ret;
  25409. }
  25410. #endif
  25411. /* handle processing of server_key_exchange (12) */
  25412. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  25413. word32* inOutIdx, word32 size)
  25414. {
  25415. int ret = 0;
  25416. #ifdef WOLFSSL_ASYNC_CRYPT
  25417. DskeArgs* args = NULL;
  25418. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  25419. #else
  25420. DskeArgs args[1];
  25421. #endif
  25422. (void)input;
  25423. (void)size;
  25424. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  25425. WOLFSSL_ENTER("DoServerKeyExchange");
  25426. #ifdef WOLFSSL_ASYNC_CRYPT
  25427. if (ssl->async == NULL) {
  25428. ssl->async = (struct WOLFSSL_ASYNC*)
  25429. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  25430. DYNAMIC_TYPE_ASYNC);
  25431. if (ssl->async == NULL)
  25432. ERROR_OUT(MEMORY_E, exit_dske);
  25433. }
  25434. args = (DskeArgs*)ssl->async->args;
  25435. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  25436. if (ret != WC_NOT_PENDING_E) {
  25437. /* Check for error */
  25438. if (ret < 0)
  25439. goto exit_dske;
  25440. }
  25441. else
  25442. #endif
  25443. {
  25444. /* Reset state */
  25445. ret = 0;
  25446. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  25447. XMEMSET(args, 0, sizeof(DskeArgs));
  25448. args->idx = *inOutIdx;
  25449. args->begin = *inOutIdx;
  25450. args->sigAlgo = ssl->specs.sig_algo;
  25451. args->hashAlgo = sha_mac;
  25452. #ifdef WOLFSSL_ASYNC_CRYPT
  25453. ssl->async->freeArgs = FreeDskeArgs;
  25454. #endif
  25455. }
  25456. switch(ssl->options.asyncState)
  25457. {
  25458. case TLS_ASYNC_BEGIN:
  25459. {
  25460. #ifdef WOLFSSL_CALLBACKS
  25461. if (ssl->hsInfoOn)
  25462. AddPacketName(ssl, "ServerKeyExchange");
  25463. if (ssl->toInfoOn)
  25464. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  25465. #endif
  25466. switch(ssl->specs.kea)
  25467. {
  25468. #ifndef NO_PSK
  25469. case psk_kea:
  25470. {
  25471. int srvHintLen;
  25472. word16 length;
  25473. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25474. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25475. }
  25476. ato16(input + args->idx, &length);
  25477. args->idx += OPAQUE16_LEN;
  25478. if ((args->idx - args->begin) + length > size) {
  25479. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25480. }
  25481. /* get PSK server hint from the wire */
  25482. srvHintLen = min(length, MAX_PSK_ID_LEN);
  25483. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  25484. srvHintLen);
  25485. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  25486. args->idx += length;
  25487. break;
  25488. }
  25489. #endif /* !NO_PSK */
  25490. #ifndef NO_DH
  25491. case diffie_hellman_kea:
  25492. {
  25493. ret = GetDhPublicKey(ssl, input, size, args);
  25494. if (ret != 0)
  25495. goto exit_dske;
  25496. break;
  25497. }
  25498. #endif /* !NO_DH */
  25499. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25500. defined(HAVE_CURVE448)
  25501. case ecc_diffie_hellman_kea:
  25502. {
  25503. byte b;
  25504. #ifdef HAVE_ECC
  25505. int curveId;
  25506. #endif
  25507. int curveOid;
  25508. word16 length;
  25509. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  25510. OPAQUE8_LEN > size) {
  25511. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25512. }
  25513. b = input[args->idx++];
  25514. if (b != named_curve) {
  25515. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  25516. }
  25517. args->idx += 1; /* curve type, eat leading 0 */
  25518. b = input[args->idx++];
  25519. if ((curveOid = CheckCurveId(b)) < 0) {
  25520. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  25521. }
  25522. ssl->ecdhCurveOID = curveOid;
  25523. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  25524. ssl->namedGroup = 0;
  25525. #endif
  25526. length = input[args->idx++];
  25527. if ((args->idx - args->begin) + length > size) {
  25528. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25529. }
  25530. #ifdef HAVE_CURVE25519
  25531. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25532. if (ssl->peerX25519Key == NULL) {
  25533. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25534. (void**)&ssl->peerX25519Key);
  25535. if (ret != 0) {
  25536. goto exit_dske;
  25537. }
  25538. } else if (ssl->peerX25519KeyPresent) {
  25539. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25540. ssl->peerX25519Key);
  25541. ssl->peerX25519KeyPresent = 0;
  25542. if (ret != 0) {
  25543. goto exit_dske;
  25544. }
  25545. }
  25546. if ((ret = wc_curve25519_check_public(
  25547. input + args->idx, length,
  25548. EC25519_LITTLE_ENDIAN)) != 0) {
  25549. #ifdef WOLFSSL_EXTRA_ALERTS
  25550. if (ret == BUFFER_E)
  25551. SendAlert(ssl, alert_fatal, decode_error);
  25552. else if (ret == ECC_OUT_OF_RANGE_E)
  25553. SendAlert(ssl, alert_fatal, bad_record_mac);
  25554. else {
  25555. SendAlert(ssl, alert_fatal, illegal_parameter);
  25556. }
  25557. #endif
  25558. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  25559. }
  25560. if (wc_curve25519_import_public_ex(input + args->idx,
  25561. length, ssl->peerX25519Key,
  25562. EC25519_LITTLE_ENDIAN) != 0) {
  25563. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  25564. }
  25565. args->idx += length;
  25566. ssl->peerX25519KeyPresent = 1;
  25567. break;
  25568. }
  25569. #endif
  25570. #ifdef HAVE_CURVE448
  25571. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25572. if (ssl->peerX448Key == NULL) {
  25573. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  25574. (void**)&ssl->peerX448Key);
  25575. if (ret != 0) {
  25576. goto exit_dske;
  25577. }
  25578. } else if (ssl->peerX448KeyPresent) {
  25579. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  25580. ssl->peerX448Key);
  25581. ssl->peerX448KeyPresent = 0;
  25582. if (ret != 0) {
  25583. goto exit_dske;
  25584. }
  25585. }
  25586. if ((ret = wc_curve448_check_public(
  25587. input + args->idx, length,
  25588. EC448_LITTLE_ENDIAN)) != 0) {
  25589. #ifdef WOLFSSL_EXTRA_ALERTS
  25590. if (ret == BUFFER_E)
  25591. SendAlert(ssl, alert_fatal, decode_error);
  25592. else if (ret == ECC_OUT_OF_RANGE_E)
  25593. SendAlert(ssl, alert_fatal, bad_record_mac);
  25594. else {
  25595. SendAlert(ssl, alert_fatal, illegal_parameter);
  25596. }
  25597. #endif
  25598. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  25599. }
  25600. if (wc_curve448_import_public_ex(input + args->idx,
  25601. length, ssl->peerX448Key,
  25602. EC448_LITTLE_ENDIAN) != 0) {
  25603. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  25604. }
  25605. args->idx += length;
  25606. ssl->peerX448KeyPresent = 1;
  25607. break;
  25608. }
  25609. #endif
  25610. #ifdef HAVE_ECC
  25611. if (ssl->peerEccKey == NULL) {
  25612. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  25613. (void**)&ssl->peerEccKey);
  25614. if (ret != 0) {
  25615. goto exit_dske;
  25616. }
  25617. } else if (ssl->peerEccKeyPresent) {
  25618. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  25619. ssl->peerEccKeyPresent = 0;
  25620. if (ret != 0) {
  25621. goto exit_dske;
  25622. }
  25623. }
  25624. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  25625. if (wc_ecc_import_x963_ex(input + args->idx, length,
  25626. ssl->peerEccKey, curveId) != 0) {
  25627. #ifdef WOLFSSL_EXTRA_ALERTS
  25628. SendAlert(ssl, alert_fatal, illegal_parameter);
  25629. #endif
  25630. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  25631. }
  25632. args->idx += length;
  25633. ssl->peerEccKeyPresent = 1;
  25634. #endif
  25635. break;
  25636. }
  25637. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25638. #if !defined(NO_DH) && !defined(NO_PSK)
  25639. case dhe_psk_kea:
  25640. {
  25641. int srvHintLen;
  25642. word16 length;
  25643. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25644. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25645. }
  25646. ato16(input + args->idx, &length);
  25647. args->idx += OPAQUE16_LEN;
  25648. if ((args->idx - args->begin) + length > size) {
  25649. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25650. }
  25651. /* get PSK server hint from the wire */
  25652. srvHintLen = min(length, MAX_PSK_ID_LEN);
  25653. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  25654. srvHintLen);
  25655. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  25656. args->idx += length;
  25657. ret = GetDhPublicKey(ssl, input, size, args);
  25658. if (ret != 0)
  25659. goto exit_dske;
  25660. break;
  25661. }
  25662. #endif /* !NO_DH && !NO_PSK */
  25663. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25664. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25665. case ecdhe_psk_kea:
  25666. {
  25667. byte b;
  25668. int curveOid, curveId;
  25669. int srvHintLen;
  25670. word16 length;
  25671. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25672. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25673. }
  25674. ato16(input + args->idx, &length);
  25675. args->idx += OPAQUE16_LEN;
  25676. if ((args->idx - args->begin) + length > size) {
  25677. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25678. }
  25679. /* get PSK server hint from the wire */
  25680. srvHintLen = min(length, MAX_PSK_ID_LEN);
  25681. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  25682. srvHintLen);
  25683. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  25684. args->idx += length;
  25685. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  25686. OPAQUE8_LEN > size) {
  25687. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25688. }
  25689. /* Check curve name and ID */
  25690. b = input[args->idx++];
  25691. if (b != named_curve) {
  25692. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  25693. }
  25694. args->idx += 1; /* curve type, eat leading 0 */
  25695. b = input[args->idx++];
  25696. if ((curveOid = CheckCurveId(b)) < 0) {
  25697. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  25698. }
  25699. length = input[args->idx++];
  25700. if ((args->idx - args->begin) + length > size) {
  25701. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25702. }
  25703. #ifdef HAVE_CURVE25519
  25704. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25705. if (ssl->peerX25519Key == NULL) {
  25706. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25707. (void**)&ssl->peerX25519Key);
  25708. if (ret != 0) {
  25709. goto exit_dske;
  25710. }
  25711. } else if (ssl->peerEccKeyPresent) {
  25712. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25713. ssl->peerX25519Key);
  25714. ssl->peerX25519KeyPresent = 0;
  25715. if (ret != 0) {
  25716. goto exit_dske;
  25717. }
  25718. }
  25719. if ((ret = wc_curve25519_check_public(
  25720. input + args->idx, length,
  25721. EC25519_LITTLE_ENDIAN)) != 0) {
  25722. #ifdef WOLFSSL_EXTRA_ALERTS
  25723. if (ret == BUFFER_E)
  25724. SendAlert(ssl, alert_fatal, decode_error);
  25725. else if (ret == ECC_OUT_OF_RANGE_E)
  25726. SendAlert(ssl, alert_fatal, bad_record_mac);
  25727. else {
  25728. SendAlert(ssl, alert_fatal, illegal_parameter);
  25729. }
  25730. #endif
  25731. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  25732. }
  25733. if (wc_curve25519_import_public_ex(input + args->idx,
  25734. length, ssl->peerX25519Key,
  25735. EC25519_LITTLE_ENDIAN) != 0) {
  25736. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  25737. }
  25738. args->idx += length;
  25739. ssl->peerX25519KeyPresent = 1;
  25740. break;
  25741. }
  25742. #endif
  25743. #ifdef HAVE_CURVE448
  25744. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25745. if (ssl->peerX448Key == NULL) {
  25746. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  25747. (void**)&ssl->peerX448Key);
  25748. if (ret != 0) {
  25749. goto exit_dske;
  25750. }
  25751. } else if (ssl->peerEccKeyPresent) {
  25752. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  25753. ssl->peerX448Key);
  25754. ssl->peerX448KeyPresent = 0;
  25755. if (ret != 0) {
  25756. goto exit_dske;
  25757. }
  25758. }
  25759. if ((ret = wc_curve448_check_public(
  25760. input + args->idx, length,
  25761. EC448_LITTLE_ENDIAN)) != 0) {
  25762. #ifdef WOLFSSL_EXTRA_ALERTS
  25763. if (ret == BUFFER_E)
  25764. SendAlert(ssl, alert_fatal, decode_error);
  25765. else if (ret == ECC_OUT_OF_RANGE_E)
  25766. SendAlert(ssl, alert_fatal, bad_record_mac);
  25767. else {
  25768. SendAlert(ssl, alert_fatal, illegal_parameter);
  25769. }
  25770. #endif
  25771. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  25772. }
  25773. if (wc_curve448_import_public_ex(input + args->idx,
  25774. length, ssl->peerX448Key,
  25775. EC448_LITTLE_ENDIAN) != 0) {
  25776. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  25777. }
  25778. args->idx += length;
  25779. ssl->peerX448KeyPresent = 1;
  25780. break;
  25781. }
  25782. #endif
  25783. if (ssl->peerEccKey == NULL) {
  25784. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  25785. (void**)&ssl->peerEccKey);
  25786. if (ret != 0) {
  25787. goto exit_dske;
  25788. }
  25789. } else if (ssl->peerEccKeyPresent) {
  25790. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  25791. ssl->peerEccKeyPresent = 0;
  25792. if (ret != 0) {
  25793. goto exit_dske;
  25794. }
  25795. }
  25796. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  25797. if (wc_ecc_import_x963_ex(input + args->idx, length,
  25798. ssl->peerEccKey, curveId) != 0) {
  25799. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  25800. }
  25801. args->idx += length;
  25802. ssl->peerEccKeyPresent = 1;
  25803. break;
  25804. }
  25805. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  25806. default:
  25807. ret = BAD_KEA_TYPE_E;
  25808. } /* switch(ssl->specs.kea) */
  25809. /* Check for error */
  25810. if (ret != 0) {
  25811. goto exit_dske;
  25812. }
  25813. /* Advance state and proceed */
  25814. ssl->options.asyncState = TLS_ASYNC_BUILD;
  25815. } /* case TLS_ASYNC_BEGIN */
  25816. FALL_THROUGH;
  25817. case TLS_ASYNC_BUILD:
  25818. {
  25819. switch(ssl->specs.kea)
  25820. {
  25821. case psk_kea:
  25822. case dhe_psk_kea:
  25823. case ecdhe_psk_kea:
  25824. {
  25825. /* Nothing to do in this sub-state */
  25826. break;
  25827. }
  25828. case diffie_hellman_kea:
  25829. case ecc_diffie_hellman_kea:
  25830. {
  25831. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  25832. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  25833. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  25834. #else
  25835. enum wc_HashType hashType;
  25836. word16 verifySz;
  25837. byte sigAlgo;
  25838. if (ssl->options.usingAnon_cipher) {
  25839. break;
  25840. }
  25841. verifySz = (word16)(args->idx - args->begin);
  25842. if (verifySz > MAX_DH_SZ) {
  25843. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25844. }
  25845. if (IsAtLeastTLSv1_2(ssl)) {
  25846. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  25847. size) {
  25848. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25849. }
  25850. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  25851. &sigAlgo);
  25852. #ifndef NO_RSA
  25853. if (sigAlgo == rsa_pss_sa_algo &&
  25854. args->sigAlgo == rsa_sa_algo) {
  25855. args->sigAlgo = sigAlgo;
  25856. }
  25857. else
  25858. #endif
  25859. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  25860. if (sigAlgo == sm2_sa_algo &&
  25861. args->sigAlgo == ecc_dsa_sa_algo) {
  25862. args->sigAlgo = sigAlgo;
  25863. }
  25864. else
  25865. #endif
  25866. #ifdef HAVE_ED25519
  25867. if (sigAlgo == ed25519_sa_algo &&
  25868. args->sigAlgo == ecc_dsa_sa_algo) {
  25869. args->sigAlgo = sigAlgo;
  25870. }
  25871. else
  25872. #endif
  25873. #ifdef HAVE_ED448
  25874. if (sigAlgo == ed448_sa_algo &&
  25875. args->sigAlgo == ecc_dsa_sa_algo) {
  25876. args->sigAlgo = sigAlgo;
  25877. }
  25878. else
  25879. #endif
  25880. /* Signature algorithm from message must match signature
  25881. * algorithm in cipher suite. */
  25882. if (sigAlgo != args->sigAlgo) {
  25883. ERROR_OUT(ALGO_ID_E, exit_dske);
  25884. }
  25885. args->idx += 2;
  25886. hashType = HashAlgoToType(args->hashAlgo);
  25887. if (hashType == WC_HASH_TYPE_NONE) {
  25888. ERROR_OUT(ALGO_ID_E, exit_dske);
  25889. }
  25890. } else {
  25891. /* only using sha and md5 for rsa */
  25892. #ifndef NO_OLD_TLS
  25893. hashType = WC_HASH_TYPE_SHA;
  25894. if (args->sigAlgo == rsa_sa_algo) {
  25895. hashType = WC_HASH_TYPE_MD5_SHA;
  25896. }
  25897. #else
  25898. ERROR_OUT(ALGO_ID_E, exit_dske);
  25899. #endif
  25900. }
  25901. /* signature */
  25902. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  25903. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25904. }
  25905. ato16(input + args->idx, &args->verifySigSz);
  25906. args->idx += OPAQUE16_LEN;
  25907. if ((args->idx - args->begin) + args->verifySigSz > size) {
  25908. ERROR_OUT(BUFFER_ERROR, exit_dske);
  25909. }
  25910. ret = HashSkeData(ssl, hashType, input + args->begin,
  25911. verifySz, args->sigAlgo);
  25912. if (ret != 0) {
  25913. goto exit_dske;
  25914. }
  25915. switch (args->sigAlgo)
  25916. {
  25917. #ifndef NO_RSA
  25918. #ifdef WC_RSA_PSS
  25919. case rsa_pss_sa_algo:
  25920. #endif
  25921. case rsa_sa_algo:
  25922. {
  25923. if (ssl->peerRsaKey == NULL ||
  25924. !ssl->peerRsaKeyPresent) {
  25925. ERROR_OUT(NO_PEER_KEY, exit_dske);
  25926. }
  25927. break;
  25928. }
  25929. #endif /* !NO_RSA */
  25930. #ifdef HAVE_ECC
  25931. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  25932. case sm2_sa_algo:
  25933. #endif
  25934. case ecc_dsa_sa_algo:
  25935. {
  25936. if (!ssl->peerEccDsaKeyPresent) {
  25937. ERROR_OUT(NO_PEER_KEY, exit_dske);
  25938. }
  25939. break;
  25940. }
  25941. #endif /* HAVE_ECC */
  25942. #if defined(HAVE_ED25519)
  25943. case ed25519_sa_algo:
  25944. {
  25945. if (!ssl->peerEd25519KeyPresent) {
  25946. ERROR_OUT(NO_PEER_KEY, exit_dske);
  25947. }
  25948. break;
  25949. }
  25950. #endif /* HAVE_ED25519 */
  25951. #if defined(HAVE_ED448)
  25952. case ed448_sa_algo:
  25953. {
  25954. if (!ssl->peerEd448KeyPresent) {
  25955. ERROR_OUT(NO_PEER_KEY, exit_dske);
  25956. }
  25957. break;
  25958. }
  25959. #endif /* HAVE_ED448 */
  25960. default:
  25961. ret = ALGO_ID_E;
  25962. } /* switch (args->sigAlgo) */
  25963. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  25964. break;
  25965. }
  25966. default:
  25967. ret = BAD_KEA_TYPE_E;
  25968. } /* switch(ssl->specs.kea) */
  25969. /* Check for error */
  25970. if (ret != 0) {
  25971. goto exit_dske;
  25972. }
  25973. /* Advance state and proceed */
  25974. ssl->options.asyncState = TLS_ASYNC_DO;
  25975. } /* case TLS_ASYNC_BUILD */
  25976. FALL_THROUGH;
  25977. case TLS_ASYNC_DO:
  25978. {
  25979. switch(ssl->specs.kea)
  25980. {
  25981. case psk_kea:
  25982. case dhe_psk_kea:
  25983. case ecdhe_psk_kea:
  25984. {
  25985. /* Nothing to do in this sub-state */
  25986. break;
  25987. }
  25988. case diffie_hellman_kea:
  25989. case ecc_diffie_hellman_kea:
  25990. {
  25991. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  25992. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  25993. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  25994. #else
  25995. if (ssl->options.usingAnon_cipher) {
  25996. break;
  25997. }
  25998. if (args->verifySig == NULL) {
  25999. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  26000. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26001. if (args->verifySig == NULL) {
  26002. ERROR_OUT(MEMORY_E, exit_dske);
  26003. }
  26004. XMEMCPY(args->verifySig, input + args->idx,
  26005. args->verifySigSz);
  26006. }
  26007. switch (args->sigAlgo)
  26008. {
  26009. #ifndef NO_RSA
  26010. #ifdef WC_RSA_PSS
  26011. case rsa_pss_sa_algo:
  26012. #endif
  26013. case rsa_sa_algo:
  26014. {
  26015. ret = RsaVerify(ssl,
  26016. args->verifySig, args->verifySigSz,
  26017. &args->output,
  26018. args->sigAlgo, args->hashAlgo,
  26019. ssl->peerRsaKey,
  26020. #ifdef HAVE_PK_CALLBACKS
  26021. &ssl->buffers.peerRsaKey
  26022. #else
  26023. NULL
  26024. #endif
  26025. );
  26026. if (ret >= 0) {
  26027. args->sigSz = (word16)ret;
  26028. #ifdef WC_RSA_PSS
  26029. args->bits = mp_count_bits(&ssl->peerRsaKey->n);
  26030. #endif
  26031. ret = 0;
  26032. }
  26033. #ifdef WOLFSSL_ASYNC_CRYPT
  26034. if (ret != WC_PENDING_E)
  26035. #endif
  26036. {
  26037. /* peerRsaKey */
  26038. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  26039. (void**)&ssl->peerRsaKey);
  26040. ssl->peerRsaKeyPresent = 0;
  26041. }
  26042. break;
  26043. }
  26044. #endif /* !NO_RSA */
  26045. #ifdef HAVE_ECC
  26046. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  26047. case sm2_sa_algo:
  26048. #endif
  26049. case ecc_dsa_sa_algo:
  26050. {
  26051. ret = NOT_COMPILED_IN;
  26052. #ifdef HAVE_PK_CALLBACKS
  26053. if (ssl->ctx && ssl->ctx->ProcessServerSigKexCb) {
  26054. ret = ssl->ctx->ProcessServerSigKexCb(ssl,
  26055. args->sigAlgo,
  26056. args->verifySig, args->verifySigSz,
  26057. ssl->buffers.sig.buffer, SEED_LEN,
  26058. &ssl->buffers.sig.buffer[SEED_LEN],
  26059. (ssl->buffers.sig.length - SEED_LEN));
  26060. }
  26061. #endif /* HAVE_PK_CALLBACKS */
  26062. if (ret == NOT_COMPILED_IN) {
  26063. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  26064. if (args->sigAlgo == sm2_sa_algo) {
  26065. ret = Sm2wSm3Verify(ssl,
  26066. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  26067. args->verifySig, args->verifySigSz,
  26068. ssl->buffers.sig.buffer,
  26069. ssl->buffers.sig.length,
  26070. ssl->peerEccDsaKey,
  26071. #ifdef HAVE_PK_CALLBACKS
  26072. &ssl->buffers.peerEccDsaKey
  26073. #else
  26074. NULL
  26075. #endif
  26076. );
  26077. }
  26078. else
  26079. #endif
  26080. {
  26081. ret = EccVerify(ssl,
  26082. args->verifySig, args->verifySigSz,
  26083. ssl->buffers.digest.buffer,
  26084. ssl->buffers.digest.length,
  26085. ssl->peerEccDsaKey,
  26086. #ifdef HAVE_PK_CALLBACKS
  26087. &ssl->buffers.peerEccDsaKey
  26088. #else
  26089. NULL
  26090. #endif
  26091. );
  26092. }
  26093. }
  26094. #ifdef WOLFSSL_ASYNC_CRYPT
  26095. if (ret != WC_PENDING_E)
  26096. #endif
  26097. {
  26098. /* peerEccDsaKey */
  26099. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  26100. (void**)&ssl->peerEccDsaKey);
  26101. ssl->peerEccDsaKeyPresent = 0;
  26102. }
  26103. /* CLIENT: Data verified with cert's public key. */
  26104. ssl->options.peerAuthGood =
  26105. ssl->options.havePeerCert && (ret == 0);
  26106. break;
  26107. }
  26108. #endif /* HAVE_ECC */
  26109. #if defined(HAVE_ED25519)
  26110. case ed25519_sa_algo:
  26111. {
  26112. ret = Ed25519Verify(ssl,
  26113. args->verifySig, args->verifySigSz,
  26114. ssl->buffers.sig.buffer,
  26115. ssl->buffers.sig.length,
  26116. ssl->peerEd25519Key,
  26117. #ifdef HAVE_PK_CALLBACKS
  26118. &ssl->buffers.peerEd25519Key
  26119. #else
  26120. NULL
  26121. #endif
  26122. );
  26123. #ifdef WOLFSSL_ASYNC_CRYPT
  26124. if (ret != WC_PENDING_E)
  26125. #endif
  26126. {
  26127. /* peerEccDsaKey */
  26128. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  26129. (void**)&ssl->peerEd25519Key);
  26130. ssl->peerEd25519KeyPresent = 0;
  26131. }
  26132. /* CLIENT: Data verified with cert's public key. */
  26133. ssl->options.peerAuthGood =
  26134. ssl->options.havePeerCert && (ret == 0);
  26135. break;
  26136. }
  26137. #endif /* HAVE_ED25519 */
  26138. #if defined(HAVE_ED448)
  26139. case ed448_sa_algo:
  26140. {
  26141. ret = Ed448Verify(ssl,
  26142. args->verifySig, args->verifySigSz,
  26143. ssl->buffers.sig.buffer,
  26144. ssl->buffers.sig.length,
  26145. ssl->peerEd448Key,
  26146. #ifdef HAVE_PK_CALLBACKS
  26147. &ssl->buffers.peerEd448Key
  26148. #else
  26149. NULL
  26150. #endif
  26151. );
  26152. #ifdef WOLFSSL_ASYNC_CRYPT
  26153. if (ret != WC_PENDING_E)
  26154. #endif
  26155. {
  26156. /* peerEccDsaKey */
  26157. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  26158. (void**)&ssl->peerEd448Key);
  26159. ssl->peerEd448KeyPresent = 0;
  26160. }
  26161. /* CLIENT: Data verified with cert's public key. */
  26162. ssl->options.peerAuthGood =
  26163. ssl->options.havePeerCert && (ret == 0);
  26164. break;
  26165. }
  26166. #endif /* HAVE_ED448 */
  26167. default:
  26168. ret = ALGO_ID_E;
  26169. } /* switch (sigAlgo) */
  26170. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  26171. break;
  26172. }
  26173. default:
  26174. ret = BAD_KEA_TYPE_E;
  26175. } /* switch(ssl->specs.kea) */
  26176. /* Check for error */
  26177. if (ret != 0) {
  26178. goto exit_dske;
  26179. }
  26180. /* Advance state and proceed */
  26181. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  26182. } /* case TLS_ASYNC_DO */
  26183. FALL_THROUGH;
  26184. case TLS_ASYNC_VERIFY:
  26185. {
  26186. switch(ssl->specs.kea)
  26187. {
  26188. case psk_kea:
  26189. case dhe_psk_kea:
  26190. case ecdhe_psk_kea:
  26191. {
  26192. /* Nothing to do in this sub-state */
  26193. break;
  26194. }
  26195. case diffie_hellman_kea:
  26196. case ecc_diffie_hellman_kea:
  26197. {
  26198. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  26199. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  26200. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  26201. #else
  26202. if (ssl->options.usingAnon_cipher) {
  26203. break;
  26204. }
  26205. /* increment index after verify is done */
  26206. args->idx += args->verifySigSz;
  26207. switch(args->sigAlgo)
  26208. {
  26209. #ifndef NO_RSA
  26210. #ifdef WC_RSA_PSS
  26211. case rsa_pss_sa_algo:
  26212. #ifdef HAVE_SELFTEST
  26213. ret = wc_RsaPSS_CheckPadding(
  26214. ssl->buffers.digest.buffer,
  26215. ssl->buffers.digest.length,
  26216. args->output, args->sigSz,
  26217. HashAlgoToType(args->hashAlgo));
  26218. #else
  26219. ret = wc_RsaPSS_CheckPadding_ex(
  26220. ssl->buffers.digest.buffer,
  26221. ssl->buffers.digest.length,
  26222. args->output, args->sigSz,
  26223. HashAlgoToType(args->hashAlgo),
  26224. -1, args->bits);
  26225. #endif
  26226. if (ret != 0)
  26227. goto exit_dske;
  26228. /* CLIENT: Data verified with cert's public key. */
  26229. ssl->options.peerAuthGood =
  26230. ssl->options.havePeerCert;
  26231. break;
  26232. #endif
  26233. case rsa_sa_algo:
  26234. {
  26235. #if (defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  26236. defined(WOLFSSL_RENESAS_FSPSM_ECC)) || \
  26237. defined(WOLFSSL_RENESAS_TSIP_TLS)
  26238. /* already checked signature result by SCE */
  26239. /* skip the sign checks below */
  26240. if (Renesas_cmn_usable(ssl, 0)) {
  26241. break;
  26242. }
  26243. #endif
  26244. if (IsAtLeastTLSv1_2(ssl)) {
  26245. #ifdef WOLFSSL_SMALL_STACK
  26246. byte* encodedSig;
  26247. #else
  26248. byte encodedSig[MAX_ENCODED_SIG_SZ];
  26249. #endif
  26250. word32 encSigSz;
  26251. #ifdef WOLFSSL_SMALL_STACK
  26252. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  26253. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26254. if (encodedSig == NULL) {
  26255. ERROR_OUT(MEMORY_E, exit_dske);
  26256. }
  26257. #endif
  26258. encSigSz = wc_EncodeSignature(encodedSig,
  26259. ssl->buffers.digest.buffer,
  26260. ssl->buffers.digest.length,
  26261. TypeHash(args->hashAlgo));
  26262. if (encSigSz != args->sigSz || !args->output ||
  26263. XMEMCMP(args->output, encodedSig,
  26264. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  26265. ret = VERIFY_SIGN_ERROR;
  26266. }
  26267. #ifdef WOLFSSL_SMALL_STACK
  26268. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26269. #endif
  26270. if (ret != 0) {
  26271. goto exit_dske;
  26272. }
  26273. }
  26274. else if (args->sigSz != FINISHED_SZ ||
  26275. !args->output ||
  26276. XMEMCMP(args->output,
  26277. ssl->buffers.digest.buffer,
  26278. FINISHED_SZ) != 0) {
  26279. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  26280. }
  26281. /* CLIENT: Data verified with cert's public key. */
  26282. ssl->options.peerAuthGood =
  26283. ssl->options.havePeerCert;
  26284. break;
  26285. }
  26286. #endif /* !NO_RSA */
  26287. #ifdef HAVE_ECC
  26288. case ecc_dsa_sa_algo:
  26289. /* Nothing to do in this algo */
  26290. break;
  26291. #endif /* HAVE_ECC */
  26292. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  26293. case sm2_sa_algo:
  26294. /* Nothing to do in this algo */
  26295. break;
  26296. #endif /* WOLFSSL_SM2 && WOLFSSL_SM3 */
  26297. #if defined(HAVE_ED25519)
  26298. case ed25519_sa_algo:
  26299. /* Nothing to do in this algo */
  26300. break;
  26301. #endif /* HAVE_ED25519 */
  26302. #if defined(HAVE_ED448)
  26303. case ed448_sa_algo:
  26304. /* Nothing to do in this algo */
  26305. break;
  26306. #endif /* HAVE_ED448 */
  26307. default:
  26308. ret = ALGO_ID_E;
  26309. } /* switch (sigAlgo) */
  26310. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  26311. break;
  26312. }
  26313. default:
  26314. ret = BAD_KEA_TYPE_E;
  26315. } /* switch(ssl->specs.kea) */
  26316. /* Check for error */
  26317. if (ret != 0) {
  26318. goto exit_dske;
  26319. }
  26320. /* Advance state and proceed */
  26321. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  26322. } /* case TLS_ASYNC_VERIFY */
  26323. FALL_THROUGH;
  26324. case TLS_ASYNC_FINALIZE:
  26325. {
  26326. if (IsEncryptionOn(ssl, 0)) {
  26327. args->idx += ssl->keys.padSz;
  26328. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  26329. if (ssl->options.startedETMRead)
  26330. args->idx += MacSize(ssl);
  26331. #endif
  26332. }
  26333. /* Advance state and proceed */
  26334. ssl->options.asyncState = TLS_ASYNC_END;
  26335. } /* case TLS_ASYNC_FINALIZE */
  26336. FALL_THROUGH;
  26337. case TLS_ASYNC_END:
  26338. {
  26339. /* return index */
  26340. *inOutIdx = args->idx;
  26341. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  26342. break;
  26343. }
  26344. default:
  26345. ret = INPUT_CASE_ERROR;
  26346. } /* switch(ssl->options.asyncState) */
  26347. exit_dske:
  26348. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  26349. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  26350. #ifdef WOLFSSL_ASYNC_CRYPT
  26351. /* Handle async operation */
  26352. if (ret == WC_PENDING_E) {
  26353. /* Mark message as not received so it can process again */
  26354. ssl->msgsReceived.got_server_key_exchange = 0;
  26355. return ret;
  26356. }
  26357. /* Cleanup async */
  26358. FreeAsyncCtx(ssl, 0);
  26359. #else
  26360. FreeDskeArgs(ssl, args);
  26361. #endif /* WOLFSSL_ASYNC_CRYPT */
  26362. /* Final cleanup */
  26363. FreeKeyExchange(ssl);
  26364. if (ret != 0) {
  26365. WOLFSSL_ERROR_VERBOSE(ret);
  26366. }
  26367. return ret;
  26368. }
  26369. typedef struct SckeArgs {
  26370. byte* output; /* not allocated */
  26371. byte* encSecret;
  26372. byte* input;
  26373. word32 encSz;
  26374. word32 length;
  26375. int sendSz;
  26376. int inputSz;
  26377. } SckeArgs;
  26378. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  26379. {
  26380. SckeArgs* args = (SckeArgs*)pArgs;
  26381. (void)ssl;
  26382. if (args->encSecret) {
  26383. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  26384. args->encSecret = NULL;
  26385. }
  26386. if (args->input) {
  26387. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26388. args->input = NULL;
  26389. }
  26390. }
  26391. /* handle generation client_key_exchange (16) */
  26392. int SendClientKeyExchange(WOLFSSL* ssl)
  26393. {
  26394. int ret = 0;
  26395. #ifdef WOLFSSL_ASYNC_IO
  26396. SckeArgs* args = NULL;
  26397. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  26398. #else
  26399. SckeArgs args[1];
  26400. #endif
  26401. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  26402. WOLFSSL_ENTER("SendClientKeyExchange");
  26403. #ifdef OPENSSL_EXTRA
  26404. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  26405. ssl->cbmode = SSL_CB_MODE_WRITE;
  26406. if (ssl->CBIS != NULL)
  26407. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  26408. #endif
  26409. #ifdef WOLFSSL_ASYNC_IO
  26410. if (ssl->async == NULL) {
  26411. ssl->async = (struct WOLFSSL_ASYNC*)
  26412. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  26413. DYNAMIC_TYPE_ASYNC);
  26414. if (ssl->async == NULL)
  26415. ERROR_OUT(MEMORY_E, exit_scke);
  26416. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  26417. }
  26418. args = (SckeArgs*)ssl->async->args;
  26419. #ifdef WOLFSSL_ASYNC_CRYPT
  26420. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  26421. if (ret != WC_NOT_PENDING_E) {
  26422. /* Check for error */
  26423. if (ret < 0)
  26424. goto exit_scke;
  26425. }
  26426. else
  26427. #endif
  26428. if (ssl->options.buildingMsg) {
  26429. /* Continue building the message */
  26430. }
  26431. else
  26432. #endif
  26433. {
  26434. /* Reset state */
  26435. ret = 0;
  26436. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  26437. XMEMSET(args, 0, sizeof(SckeArgs));
  26438. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  26439. * is not advanced yet */
  26440. ssl->options.buildingMsg = 1;
  26441. #ifdef WOLFSSL_ASYNC_IO
  26442. ssl->async->freeArgs = FreeSckeArgs;
  26443. #endif
  26444. }
  26445. switch(ssl->options.asyncState)
  26446. {
  26447. case TLS_ASYNC_BEGIN:
  26448. {
  26449. switch (ssl->specs.kea) {
  26450. #ifndef NO_RSA
  26451. case rsa_kea:
  26452. if (ssl->peerRsaKey == NULL ||
  26453. ssl->peerRsaKeyPresent == 0) {
  26454. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26455. }
  26456. break;
  26457. #endif
  26458. #ifndef NO_DH
  26459. case diffie_hellman_kea:
  26460. if (ssl->buffers.serverDH_P.buffer == NULL ||
  26461. ssl->buffers.serverDH_G.buffer == NULL ||
  26462. ssl->buffers.serverDH_Pub.buffer == NULL) {
  26463. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26464. }
  26465. break;
  26466. #endif /* NO_DH */
  26467. #ifndef NO_PSK
  26468. case psk_kea:
  26469. /* sanity check that PSK client callback has been set */
  26470. if (ssl->options.client_psk_cb == NULL) {
  26471. WOLFSSL_MSG("No client PSK callback set");
  26472. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  26473. }
  26474. break;
  26475. #endif /* NO_PSK */
  26476. #if !defined(NO_DH) && !defined(NO_PSK)
  26477. case dhe_psk_kea:
  26478. if (ssl->buffers.serverDH_P.buffer == NULL ||
  26479. ssl->buffers.serverDH_G.buffer == NULL ||
  26480. ssl->buffers.serverDH_Pub.buffer == NULL) {
  26481. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26482. }
  26483. /* sanity check that PSK client callback has been set */
  26484. if (ssl->options.client_psk_cb == NULL) {
  26485. WOLFSSL_MSG("No client PSK callback set");
  26486. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  26487. }
  26488. break;
  26489. #endif /* !NO_DH && !NO_PSK */
  26490. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26491. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26492. case ecdhe_psk_kea:
  26493. /* sanity check that PSK client callback has been set */
  26494. if (ssl->options.client_psk_cb == NULL) {
  26495. WOLFSSL_MSG("No client PSK callback set");
  26496. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  26497. }
  26498. #ifdef HAVE_CURVE25519
  26499. if (ssl->peerX25519KeyPresent) {
  26500. /* Check client ECC public key */
  26501. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  26502. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26503. }
  26504. #ifdef HAVE_PK_CALLBACKS
  26505. /* if callback then use it for shared secret */
  26506. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  26507. break;
  26508. }
  26509. #endif
  26510. /* create private key */
  26511. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  26512. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  26513. if (ret != 0) {
  26514. goto exit_scke;
  26515. }
  26516. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  26517. ssl->peerX25519Key);
  26518. break;
  26519. }
  26520. #endif
  26521. #ifdef HAVE_CURVE448
  26522. if (ssl->peerX448KeyPresent) {
  26523. /* Check client ECC public key */
  26524. if (!ssl->peerX448Key) {
  26525. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26526. }
  26527. #ifdef HAVE_PK_CALLBACKS
  26528. /* if callback then use it for shared secret */
  26529. if (ssl->ctx->X448SharedSecretCb != NULL) {
  26530. break;
  26531. }
  26532. #endif
  26533. /* create private key */
  26534. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  26535. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  26536. if (ret != 0) {
  26537. goto exit_scke;
  26538. }
  26539. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  26540. ssl->peerX448Key);
  26541. break;
  26542. }
  26543. #endif
  26544. /* Check client ECC public key */
  26545. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  26546. !ssl->peerEccKey->dp) {
  26547. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26548. }
  26549. #ifdef HAVE_PK_CALLBACKS
  26550. /* if callback then use it for shared secret */
  26551. if (ssl->ctx->EccSharedSecretCb != NULL) {
  26552. break;
  26553. }
  26554. #endif
  26555. /* create ephemeral private key */
  26556. ssl->hsType = DYNAMIC_TYPE_ECC;
  26557. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  26558. if (ret != 0) {
  26559. goto exit_scke;
  26560. }
  26561. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  26562. break;
  26563. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  26564. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26565. defined(HAVE_CURVE448)
  26566. case ecc_diffie_hellman_kea:
  26567. {
  26568. #ifdef HAVE_ECC
  26569. ecc_key* peerKey;
  26570. #endif
  26571. #ifdef HAVE_PK_CALLBACKS
  26572. /* if callback then use it for shared secret */
  26573. #ifdef HAVE_CURVE25519
  26574. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26575. if (ssl->ctx->X25519SharedSecretCb != NULL)
  26576. break;
  26577. }
  26578. else
  26579. #endif
  26580. #ifdef HAVE_CURVE448
  26581. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  26582. if (ssl->ctx->X448SharedSecretCb != NULL)
  26583. break;
  26584. }
  26585. else
  26586. #endif
  26587. #ifdef HAVE_ECC
  26588. if (ssl->ctx->EccSharedSecretCb != NULL) {
  26589. break;
  26590. }
  26591. else
  26592. #endif
  26593. {
  26594. }
  26595. #endif /* HAVE_PK_CALLBACKS */
  26596. #ifdef HAVE_CURVE25519
  26597. if (ssl->peerX25519KeyPresent) {
  26598. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  26599. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26600. }
  26601. /* create private key */
  26602. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  26603. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  26604. if (ret != 0) {
  26605. goto exit_scke;
  26606. }
  26607. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  26608. ssl->peerX25519Key);
  26609. break;
  26610. }
  26611. #endif
  26612. #ifdef HAVE_CURVE448
  26613. if (ssl->peerX448KeyPresent) {
  26614. if (!ssl->peerX448Key) {
  26615. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26616. }
  26617. /* create private key */
  26618. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  26619. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  26620. if (ret != 0) {
  26621. goto exit_scke;
  26622. }
  26623. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  26624. ssl->peerX448Key);
  26625. break;
  26626. }
  26627. #endif
  26628. #ifdef HAVE_ECC
  26629. if (ssl->specs.static_ecdh) {
  26630. /* Note: EccDsa is really fixed Ecc key here */
  26631. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
  26632. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26633. }
  26634. peerKey = ssl->peerEccDsaKey;
  26635. }
  26636. else {
  26637. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
  26638. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26639. }
  26640. peerKey = ssl->peerEccKey;
  26641. }
  26642. if (peerKey == NULL) {
  26643. ERROR_OUT(NO_PEER_KEY, exit_scke);
  26644. }
  26645. /* create ephemeral private key */
  26646. ssl->hsType = DYNAMIC_TYPE_ECC;
  26647. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  26648. if (ret != 0) {
  26649. goto exit_scke;
  26650. }
  26651. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  26652. #endif /* HAVE_ECC */
  26653. break;
  26654. }
  26655. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26656. default:
  26657. ret = BAD_KEA_TYPE_E;
  26658. } /* switch(ssl->specs.kea) */
  26659. /* Check for error */
  26660. if (ret != 0) {
  26661. goto exit_scke;
  26662. }
  26663. /* Advance state and proceed */
  26664. ssl->options.asyncState = TLS_ASYNC_BUILD;
  26665. } /* case TLS_ASYNC_BEGIN */
  26666. FALL_THROUGH;
  26667. case TLS_ASYNC_BUILD:
  26668. {
  26669. args->encSz = MAX_ENCRYPT_SZ;
  26670. args->encSecret = (byte*)XMALLOC(MAX_ENCRYPT_SZ, ssl->heap,
  26671. DYNAMIC_TYPE_SECRET);
  26672. if (args->encSecret == NULL) {
  26673. ERROR_OUT(MEMORY_E, exit_scke);
  26674. }
  26675. if (ssl->arrays->preMasterSecret == NULL) {
  26676. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  26677. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  26678. ssl->heap, DYNAMIC_TYPE_SECRET);
  26679. if (ssl->arrays->preMasterSecret == NULL) {
  26680. ERROR_OUT(MEMORY_E, exit_scke);
  26681. }
  26682. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  26683. }
  26684. switch(ssl->specs.kea)
  26685. {
  26686. #ifndef NO_RSA
  26687. case rsa_kea:
  26688. {
  26689. #ifdef HAVE_PK_CALLBACKS
  26690. if (ssl->ctx->GenPreMasterCb) {
  26691. void* ctx = wolfSSL_GetGenPreMasterCtx(ssl);
  26692. ret = ssl->ctx->GenPreMasterCb(ssl,
  26693. ssl->arrays->preMasterSecret, ENCRYPT_LEN, ctx);
  26694. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  26695. goto exit_scke;
  26696. }
  26697. }
  26698. if (!ssl->ctx->GenPreMasterCb || ret == PROTOCOLCB_UNAVAILABLE)
  26699. #endif
  26700. {
  26701. /* build PreMasterSecret with RNG data */
  26702. ret = wc_RNG_GenerateBlock(ssl->rng,
  26703. &ssl->arrays->preMasterSecret[VERSION_SZ],
  26704. SECRET_LEN - VERSION_SZ);
  26705. if (ret != 0) {
  26706. goto exit_scke;
  26707. }
  26708. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  26709. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  26710. ssl->arrays->preMasterSz = SECRET_LEN;
  26711. }
  26712. break;
  26713. }
  26714. #endif /* !NO_RSA */
  26715. #ifndef NO_DH
  26716. case diffie_hellman_kea:
  26717. {
  26718. ssl->buffers.sig.length = ENCRYPT_LEN;
  26719. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  26720. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26721. if (ssl->buffers.sig.buffer == NULL) {
  26722. ERROR_OUT(MEMORY_E, exit_scke);
  26723. }
  26724. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  26725. (void**)&ssl->buffers.serverDH_Key);
  26726. if (ret != 0) {
  26727. goto exit_scke;
  26728. }
  26729. #if defined(HAVE_FFDHE) && !defined(HAVE_PUBLIC_FFDHE)
  26730. if (ssl->namedGroup) {
  26731. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  26732. ssl->namedGroup);
  26733. if (ret != 0) {
  26734. goto exit_scke;
  26735. }
  26736. ssl->buffers.sig.length =
  26737. wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  26738. }
  26739. else
  26740. #endif
  26741. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  26742. !defined(WOLFSSL_OLD_PRIME_CHECK)
  26743. if (ssl->options.dhDoKeyTest &&
  26744. !ssl->options.dhKeyTested)
  26745. {
  26746. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  26747. ssl->buffers.serverDH_P.buffer,
  26748. ssl->buffers.serverDH_P.length,
  26749. ssl->buffers.serverDH_G.buffer,
  26750. ssl->buffers.serverDH_G.length,
  26751. NULL, 0, 0, ssl->rng);
  26752. if (ret != 0) {
  26753. goto exit_scke;
  26754. }
  26755. ssl->options.dhKeyTested = 1;
  26756. }
  26757. else
  26758. #endif
  26759. {
  26760. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  26761. ssl->buffers.serverDH_P.buffer,
  26762. ssl->buffers.serverDH_P.length,
  26763. ssl->buffers.serverDH_G.buffer,
  26764. ssl->buffers.serverDH_G.length);
  26765. if (ret != 0) {
  26766. goto exit_scke;
  26767. }
  26768. }
  26769. /* for DH, encSecret is Yc, agree is pre-master */
  26770. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  26771. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  26772. args->encSecret, &args->encSz);
  26773. /* set the max agree result size */
  26774. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  26775. break;
  26776. }
  26777. #endif /* !NO_DH */
  26778. #ifndef NO_PSK
  26779. case psk_kea:
  26780. {
  26781. byte* pms = ssl->arrays->preMasterSecret;
  26782. int cbret = (int)ssl->options.client_psk_cb(ssl,
  26783. ssl->arrays->server_hint, ssl->arrays->client_identity,
  26784. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  26785. if (cbret == 0 || cbret > MAX_PSK_KEY_LEN) {
  26786. if (cbret != USE_HW_PSK) {
  26787. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  26788. }
  26789. }
  26790. if (cbret == USE_HW_PSK) {
  26791. /* USE_HW_PSK indicates that the hardware has the PSK
  26792. * and generates the premaster secret. */
  26793. ssl->arrays->psk_keySz = 0;
  26794. }
  26795. else {
  26796. ssl->arrays->psk_keySz = (word32)cbret;
  26797. }
  26798. /* Ensure the buffer is null-terminated. */
  26799. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
  26800. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  26801. if (args->encSz > MAX_PSK_ID_LEN) {
  26802. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  26803. }
  26804. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  26805. args->encSz);
  26806. ssl->options.peerAuthGood = 1;
  26807. if (cbret != USE_HW_PSK) {
  26808. /* CLIENT: Pre-shared Key for peer authentication. */
  26809. /* make psk pre master secret */
  26810. /* length of key + length 0s + length of key + key */
  26811. c16toa((word16)ssl->arrays->psk_keySz, pms);
  26812. pms += OPAQUE16_LEN;
  26813. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  26814. pms += ssl->arrays->psk_keySz;
  26815. c16toa((word16)ssl->arrays->psk_keySz, pms);
  26816. pms += OPAQUE16_LEN;
  26817. XMEMCPY(pms, ssl->arrays->psk_key,
  26818. ssl->arrays->psk_keySz);
  26819. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2)
  26820. + (2 * OPAQUE16_LEN);
  26821. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  26822. ssl->arrays->psk_keySz = 0; /* No further need */
  26823. }
  26824. break;
  26825. }
  26826. #endif /* !NO_PSK */
  26827. #if !defined(NO_DH) && !defined(NO_PSK)
  26828. case dhe_psk_kea:
  26829. {
  26830. word32 esSz = 0;
  26831. args->output = args->encSecret;
  26832. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  26833. ssl->arrays->server_hint, ssl->arrays->client_identity,
  26834. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  26835. if (ssl->arrays->psk_keySz == 0 ||
  26836. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  26837. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  26838. }
  26839. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  26840. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  26841. if (esSz > MAX_PSK_ID_LEN) {
  26842. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  26843. }
  26844. /* CLIENT: Pre-shared Key for peer authentication. */
  26845. ssl->options.peerAuthGood = 1;
  26846. ssl->buffers.sig.length = ENCRYPT_LEN;
  26847. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  26848. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26849. if (ssl->buffers.sig.buffer == NULL) {
  26850. ERROR_OUT(MEMORY_E, exit_scke);
  26851. }
  26852. c16toa((word16)esSz, args->output);
  26853. args->output += OPAQUE16_LEN;
  26854. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  26855. args->output += esSz;
  26856. args->length = args->encSz - esSz - OPAQUE16_LEN;
  26857. args->encSz = esSz + OPAQUE16_LEN;
  26858. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  26859. (void**)&ssl->buffers.serverDH_Key);
  26860. if (ret != 0) {
  26861. goto exit_scke;
  26862. }
  26863. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  26864. !defined(WOLFSSL_OLD_PRIME_CHECK)
  26865. if (ssl->options.dhDoKeyTest &&
  26866. !ssl->options.dhKeyTested)
  26867. {
  26868. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  26869. ssl->buffers.serverDH_P.buffer,
  26870. ssl->buffers.serverDH_P.length,
  26871. ssl->buffers.serverDH_G.buffer,
  26872. ssl->buffers.serverDH_G.length,
  26873. NULL, 0, 0, ssl->rng);
  26874. if (ret != 0) {
  26875. goto exit_scke;
  26876. }
  26877. ssl->options.dhKeyTested = 1;
  26878. }
  26879. else
  26880. #endif
  26881. {
  26882. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  26883. ssl->buffers.serverDH_P.buffer,
  26884. ssl->buffers.serverDH_P.length,
  26885. ssl->buffers.serverDH_G.buffer,
  26886. ssl->buffers.serverDH_G.length);
  26887. if (ret != 0) {
  26888. goto exit_scke;
  26889. }
  26890. }
  26891. /* for DH, encSecret is Yc, agree is pre-master */
  26892. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  26893. ssl->buffers.sig.buffer,
  26894. (word32*)&ssl->buffers.sig.length,
  26895. args->output + OPAQUE16_LEN, &args->length);
  26896. break;
  26897. }
  26898. #endif /* !NO_DH && !NO_PSK */
  26899. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26900. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26901. case ecdhe_psk_kea:
  26902. {
  26903. word32 esSz = 0;
  26904. args->output = args->encSecret;
  26905. /* Send PSK client identity */
  26906. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  26907. ssl->arrays->server_hint, ssl->arrays->client_identity,
  26908. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  26909. if (ssl->arrays->psk_keySz == 0 ||
  26910. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  26911. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  26912. }
  26913. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  26914. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  26915. if (esSz > MAX_PSK_ID_LEN) {
  26916. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  26917. }
  26918. /* CLIENT: Pre-shared Key for peer authentication. */
  26919. ssl->options.peerAuthGood = 1;
  26920. /* place size and identity in output buffer sz:identity */
  26921. c16toa((word16)esSz, args->output);
  26922. args->output += OPAQUE16_LEN;
  26923. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  26924. args->output += esSz;
  26925. args->encSz = esSz + OPAQUE16_LEN;
  26926. /* length is used for public key size */
  26927. args->length = MAX_ENCRYPT_SZ;
  26928. /* Create shared ECC key leaving room at the beginning
  26929. of buffer for size of shared key. */
  26930. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  26931. #ifdef HAVE_CURVE25519
  26932. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26933. #ifdef HAVE_PK_CALLBACKS
  26934. /* if callback then use it for shared secret */
  26935. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  26936. break;
  26937. }
  26938. #endif
  26939. ret = wc_curve25519_export_public_ex(
  26940. (curve25519_key*)ssl->hsKey,
  26941. args->output + OPAQUE8_LEN, &args->length,
  26942. EC25519_LITTLE_ENDIAN);
  26943. if (ret != 0) {
  26944. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  26945. }
  26946. break;
  26947. }
  26948. #endif
  26949. #ifdef HAVE_CURVE448
  26950. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  26951. #ifdef HAVE_PK_CALLBACKS
  26952. /* if callback then use it for shared secret */
  26953. if (ssl->ctx->X448SharedSecretCb != NULL) {
  26954. break;
  26955. }
  26956. #endif
  26957. ret = wc_curve448_export_public_ex(
  26958. (curve448_key*)ssl->hsKey,
  26959. args->output + OPAQUE8_LEN, &args->length,
  26960. EC448_LITTLE_ENDIAN);
  26961. if (ret != 0) {
  26962. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  26963. }
  26964. break;
  26965. }
  26966. #endif
  26967. #ifdef HAVE_PK_CALLBACKS
  26968. /* if callback then use it for shared secret */
  26969. if (ssl->ctx->EccSharedSecretCb != NULL) {
  26970. break;
  26971. }
  26972. #endif
  26973. /* Place ECC key in output buffer, leaving room for size */
  26974. PRIVATE_KEY_UNLOCK();
  26975. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  26976. args->output + OPAQUE8_LEN, &args->length);
  26977. PRIVATE_KEY_LOCK();
  26978. if (ret != 0) {
  26979. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  26980. }
  26981. break;
  26982. }
  26983. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  26984. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26985. defined(HAVE_CURVE448)
  26986. case ecc_diffie_hellman_kea:
  26987. {
  26988. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  26989. #ifdef HAVE_CURVE25519
  26990. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  26991. #ifdef HAVE_PK_CALLBACKS
  26992. /* if callback then use it for shared secret */
  26993. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  26994. break;
  26995. }
  26996. #endif
  26997. ret = wc_curve25519_export_public_ex(
  26998. (curve25519_key*)ssl->hsKey,
  26999. args->encSecret + OPAQUE8_LEN, &args->encSz,
  27000. EC25519_LITTLE_ENDIAN);
  27001. if (ret != 0) {
  27002. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  27003. }
  27004. break;
  27005. }
  27006. #endif
  27007. #ifdef HAVE_CURVE448
  27008. if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
  27009. #ifdef HAVE_PK_CALLBACKS
  27010. /* if callback then use it for shared secret */
  27011. if (ssl->ctx->X448SharedSecretCb != NULL) {
  27012. break;
  27013. }
  27014. #endif
  27015. ret = wc_curve448_export_public_ex(
  27016. (curve448_key*)ssl->hsKey,
  27017. args->encSecret + OPAQUE8_LEN, &args->encSz,
  27018. EC448_LITTLE_ENDIAN);
  27019. if (ret != 0) {
  27020. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  27021. }
  27022. break;
  27023. }
  27024. #endif
  27025. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  27026. #ifdef HAVE_PK_CALLBACKS
  27027. /* if callback then use it for shared secret */
  27028. if (ssl->ctx->EccSharedSecretCb != NULL) {
  27029. break;
  27030. }
  27031. #endif
  27032. /* Place ECC key in buffer, leaving room for size */
  27033. PRIVATE_KEY_UNLOCK();
  27034. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  27035. args->encSecret + OPAQUE8_LEN, &args->encSz);
  27036. PRIVATE_KEY_LOCK();
  27037. if (ret != 0) {
  27038. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  27039. }
  27040. #endif /* HAVE_ECC */
  27041. break;
  27042. }
  27043. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27044. default:
  27045. ret = BAD_KEA_TYPE_E;
  27046. } /* switch(ssl->specs.kea) */
  27047. /* Check for error */
  27048. if (ret != 0) {
  27049. goto exit_scke;
  27050. }
  27051. /* Advance state and proceed */
  27052. ssl->options.asyncState = TLS_ASYNC_DO;
  27053. } /* case TLS_ASYNC_BUILD */
  27054. FALL_THROUGH;
  27055. case TLS_ASYNC_DO:
  27056. {
  27057. switch(ssl->specs.kea)
  27058. {
  27059. #ifndef NO_RSA
  27060. case rsa_kea:
  27061. {
  27062. ret = RsaEnc(ssl,
  27063. ssl->arrays->preMasterSecret, SECRET_LEN,
  27064. args->encSecret, &args->encSz,
  27065. ssl->peerRsaKey,
  27066. #if defined(HAVE_PK_CALLBACKS)
  27067. &ssl->buffers.peerRsaKey
  27068. #else
  27069. NULL
  27070. #endif
  27071. );
  27072. break;
  27073. }
  27074. #endif /* !NO_RSA */
  27075. #ifndef NO_DH
  27076. case diffie_hellman_kea:
  27077. {
  27078. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  27079. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  27080. ssl->buffers.serverDH_Pub.buffer,
  27081. ssl->buffers.serverDH_Pub.length,
  27082. ssl->arrays->preMasterSecret,
  27083. &ssl->arrays->preMasterSz,
  27084. ssl->buffers.serverDH_P.buffer,
  27085. ssl->buffers.serverDH_P.length);
  27086. break;
  27087. }
  27088. #endif /* !NO_DH */
  27089. #ifndef NO_PSK
  27090. case psk_kea:
  27091. {
  27092. break;
  27093. }
  27094. #endif /* !NO_PSK */
  27095. #if !defined(NO_DH) && !defined(NO_PSK)
  27096. case dhe_psk_kea:
  27097. {
  27098. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  27099. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  27100. ssl->buffers.serverDH_Pub.buffer,
  27101. ssl->buffers.serverDH_Pub.length,
  27102. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  27103. &ssl->arrays->preMasterSz,
  27104. ssl->buffers.serverDH_P.buffer,
  27105. ssl->buffers.serverDH_P.length);
  27106. break;
  27107. }
  27108. #endif /* !NO_DH && !NO_PSK */
  27109. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27110. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27111. case ecdhe_psk_kea:
  27112. {
  27113. #ifdef HAVE_CURVE25519
  27114. if (ssl->peerX25519KeyPresent) {
  27115. ret = X25519SharedSecret(ssl,
  27116. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  27117. args->output + OPAQUE8_LEN, &args->length,
  27118. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  27119. &ssl->arrays->preMasterSz,
  27120. WOLFSSL_CLIENT_END
  27121. );
  27122. if (!ssl->specs.static_ecdh
  27123. #ifdef WOLFSSL_ASYNC_CRYPT
  27124. && ret != WC_PENDING_E
  27125. #endif
  27126. ) {
  27127. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27128. (void**)&ssl->peerX25519Key);
  27129. ssl->peerX25519KeyPresent = 0;
  27130. }
  27131. break;
  27132. }
  27133. #endif
  27134. #ifdef HAVE_CURVE448
  27135. if (ssl->peerX448KeyPresent) {
  27136. ret = X448SharedSecret(ssl,
  27137. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  27138. args->output + OPAQUE8_LEN, &args->length,
  27139. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  27140. &ssl->arrays->preMasterSz,
  27141. WOLFSSL_CLIENT_END
  27142. );
  27143. if (!ssl->specs.static_ecdh
  27144. #ifdef WOLFSSL_ASYNC_CRYPT
  27145. && ret != WC_PENDING_E
  27146. #endif
  27147. ) {
  27148. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  27149. (void**)&ssl->peerX448Key);
  27150. ssl->peerX448KeyPresent = 0;
  27151. }
  27152. break;
  27153. }
  27154. #endif
  27155. ret = EccSharedSecret(ssl,
  27156. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  27157. args->output + OPAQUE8_LEN, &args->length,
  27158. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  27159. &ssl->arrays->preMasterSz,
  27160. WOLFSSL_CLIENT_END
  27161. );
  27162. #ifdef WOLFSSL_ASYNC_CRYPT
  27163. if (ret != WC_PENDING_E)
  27164. #endif
  27165. {
  27166. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  27167. (void**)&ssl->peerEccKey);
  27168. ssl->peerEccKeyPresent = 0;
  27169. }
  27170. break;
  27171. }
  27172. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  27173. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27174. defined(HAVE_CURVE448)
  27175. case ecc_diffie_hellman_kea:
  27176. {
  27177. #ifdef HAVE_ECC
  27178. ecc_key* peerKey;
  27179. #endif
  27180. #ifdef HAVE_CURVE25519
  27181. if (ssl->peerX25519KeyPresent) {
  27182. ret = X25519SharedSecret(ssl,
  27183. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  27184. args->encSecret + OPAQUE8_LEN, &args->encSz,
  27185. ssl->arrays->preMasterSecret,
  27186. &ssl->arrays->preMasterSz,
  27187. WOLFSSL_CLIENT_END
  27188. );
  27189. if (!ssl->specs.static_ecdh
  27190. #ifdef WOLFSSL_ASYNC_CRYPT
  27191. && ret != WC_PENDING_E
  27192. #endif
  27193. ) {
  27194. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27195. (void**)&ssl->peerX25519Key);
  27196. ssl->peerX25519KeyPresent = 0;
  27197. }
  27198. break;
  27199. }
  27200. #endif
  27201. #ifdef HAVE_CURVE448
  27202. if (ssl->peerX448KeyPresent) {
  27203. ret = X448SharedSecret(ssl,
  27204. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  27205. args->encSecret + OPAQUE8_LEN, &args->encSz,
  27206. ssl->arrays->preMasterSecret,
  27207. &ssl->arrays->preMasterSz,
  27208. WOLFSSL_CLIENT_END
  27209. );
  27210. if (!ssl->specs.static_ecdh
  27211. #ifdef WOLFSSL_ASYNC_CRYPT
  27212. && ret != WC_PENDING_E
  27213. #endif
  27214. ) {
  27215. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  27216. (void**)&ssl->peerX448Key);
  27217. ssl->peerX448KeyPresent = 0;
  27218. }
  27219. break;
  27220. }
  27221. #endif
  27222. #ifdef HAVE_ECC
  27223. peerKey = (ssl->specs.static_ecdh) ?
  27224. ssl->peerEccDsaKey : ssl->peerEccKey;
  27225. ret = EccSharedSecret(ssl,
  27226. (ecc_key*)ssl->hsKey, peerKey,
  27227. args->encSecret + OPAQUE8_LEN, &args->encSz,
  27228. ssl->arrays->preMasterSecret,
  27229. &ssl->arrays->preMasterSz,
  27230. WOLFSSL_CLIENT_END);
  27231. if (!ssl->specs.static_ecdh
  27232. #ifdef WOLFSSL_ASYNC_CRYPT
  27233. && ret != WC_PENDING_E
  27234. #endif
  27235. && !ssl->options.keepResources) {
  27236. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  27237. (void**)&ssl->peerEccKey);
  27238. ssl->peerEccKeyPresent = 0;
  27239. }
  27240. #endif
  27241. break;
  27242. }
  27243. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27244. default:
  27245. ret = BAD_KEA_TYPE_E;
  27246. } /* switch(ssl->specs.kea) */
  27247. /* Check for error */
  27248. if (ret != 0) {
  27249. goto exit_scke;
  27250. }
  27251. /* Advance state and proceed */
  27252. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  27253. } /* case TLS_ASYNC_DO */
  27254. FALL_THROUGH;
  27255. case TLS_ASYNC_VERIFY:
  27256. {
  27257. switch(ssl->specs.kea)
  27258. {
  27259. #ifndef NO_RSA
  27260. case rsa_kea:
  27261. {
  27262. break;
  27263. }
  27264. #endif /* !NO_RSA */
  27265. #ifndef NO_DH
  27266. case diffie_hellman_kea:
  27267. {
  27268. break;
  27269. }
  27270. #endif /* !NO_DH */
  27271. #ifndef NO_PSK
  27272. case psk_kea:
  27273. {
  27274. break;
  27275. }
  27276. #endif /* !NO_PSK */
  27277. #if !defined(NO_DH) && !defined(NO_PSK)
  27278. case dhe_psk_kea:
  27279. {
  27280. byte* pms = ssl->arrays->preMasterSecret;
  27281. /* validate args */
  27282. if (args->output == NULL || args->length == 0) {
  27283. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  27284. }
  27285. c16toa((word16)args->length, args->output);
  27286. args->encSz += args->length + OPAQUE16_LEN;
  27287. c16toa((word16)ssl->arrays->preMasterSz, pms);
  27288. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  27289. pms += ssl->arrays->preMasterSz;
  27290. /* make psk pre master secret */
  27291. /* length of key + length 0s + length of key + key */
  27292. c16toa((word16)ssl->arrays->psk_keySz, pms);
  27293. pms += OPAQUE16_LEN;
  27294. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  27295. ssl->arrays->preMasterSz +=
  27296. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  27297. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  27298. ssl->arrays->psk_keySz = 0; /* No further need */
  27299. break;
  27300. }
  27301. #endif /* !NO_DH && !NO_PSK */
  27302. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27303. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27304. case ecdhe_psk_kea:
  27305. {
  27306. byte* pms = ssl->arrays->preMasterSecret;
  27307. /* validate args */
  27308. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  27309. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  27310. }
  27311. /* place size of public key in output buffer */
  27312. *args->output = (byte)args->length;
  27313. args->encSz += args->length + OPAQUE8_LEN;
  27314. /* Create pre master secret is the concatenation of
  27315. eccSize + eccSharedKey + pskSize + pskKey */
  27316. c16toa((word16)ssl->arrays->preMasterSz, pms);
  27317. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  27318. pms += ssl->arrays->preMasterSz;
  27319. c16toa((word16)ssl->arrays->psk_keySz, pms);
  27320. pms += OPAQUE16_LEN;
  27321. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  27322. ssl->arrays->preMasterSz +=
  27323. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  27324. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  27325. ssl->arrays->psk_keySz = 0; /* No further need */
  27326. break;
  27327. }
  27328. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  27329. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27330. defined(HAVE_CURVE448)
  27331. case ecc_diffie_hellman_kea:
  27332. {
  27333. if (args->encSecret == NULL) {
  27334. ret = BAD_STATE_E;
  27335. goto exit_scke;
  27336. }
  27337. else {
  27338. /* place size of public key in buffer */
  27339. *args->encSecret = (byte)args->encSz;
  27340. args->encSz += OPAQUE8_LEN;
  27341. }
  27342. break;
  27343. }
  27344. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27345. default:
  27346. ret = BAD_KEA_TYPE_E;
  27347. } /* switch(ssl->specs.kea) */
  27348. /* Check for error */
  27349. if (ret != 0) {
  27350. goto exit_scke;
  27351. }
  27352. /* Advance state and proceed */
  27353. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  27354. } /* case TLS_ASYNC_VERIFY */
  27355. FALL_THROUGH;
  27356. case TLS_ASYNC_FINALIZE:
  27357. {
  27358. word32 tlsSz = 0;
  27359. word32 idx = 0;
  27360. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  27361. tlsSz = 2;
  27362. }
  27363. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  27364. ssl->specs.kea == dhe_psk_kea ||
  27365. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  27366. tlsSz = 0;
  27367. }
  27368. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  27369. args->sendSz = args->encSz + tlsSz + idx;
  27370. #ifdef WOLFSSL_DTLS
  27371. if (ssl->options.dtls) {
  27372. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  27373. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  27374. }
  27375. #endif
  27376. if (IsEncryptionOn(ssl, 1)) {
  27377. args->sendSz += MAX_MSG_EXTRA;
  27378. }
  27379. /* check for available size */
  27380. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0)
  27381. goto exit_scke;
  27382. /* get output buffer */
  27383. args->output = GetOutputBuffer(ssl);
  27384. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  27385. if (tlsSz) {
  27386. c16toa((word16)args->encSz, &args->output[idx]);
  27387. idx += OPAQUE16_LEN;
  27388. }
  27389. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  27390. idx += args->encSz;
  27391. if (IsEncryptionOn(ssl, 1)) {
  27392. int recordHeaderSz = RECORD_HEADER_SZ;
  27393. if (ssl->options.dtls)
  27394. recordHeaderSz += DTLS_RECORD_EXTRA;
  27395. args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
  27396. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  27397. DYNAMIC_TYPE_IN_BUFFER);
  27398. if (args->input == NULL) {
  27399. ERROR_OUT(MEMORY_E, exit_scke);
  27400. }
  27401. XMEMCPY(args->input, args->output + recordHeaderSz,
  27402. args->inputSz);
  27403. }
  27404. /* Advance state and proceed */
  27405. ssl->options.asyncState = TLS_ASYNC_END;
  27406. } /* case TLS_ASYNC_FINALIZE */
  27407. FALL_THROUGH;
  27408. case TLS_ASYNC_END:
  27409. {
  27410. if (IsEncryptionOn(ssl, 1)) {
  27411. #ifdef WOLFSSL_DTLS
  27412. if (IsDtlsNotSctpMode(ssl) &&
  27413. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
  27414. goto exit_scke;
  27415. }
  27416. #endif
  27417. ret = BuildMessage(ssl, args->output, args->sendSz,
  27418. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  27419. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27420. args->input = NULL; /* make sure its not double free'd on cleanup */
  27421. if (ret >= 0) {
  27422. args->sendSz = ret;
  27423. ret = 0;
  27424. }
  27425. }
  27426. else {
  27427. #ifdef WOLFSSL_DTLS
  27428. if (IsDtlsNotSctpMode(ssl)) {
  27429. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
  27430. goto exit_scke;
  27431. }
  27432. }
  27433. if (ssl->options.dtls)
  27434. DtlsSEQIncrement(ssl, CUR_ORDER);
  27435. #endif
  27436. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  27437. }
  27438. if (ret != 0) {
  27439. goto exit_scke;
  27440. }
  27441. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  27442. if (ssl->hsInfoOn)
  27443. AddPacketName(ssl, "ClientKeyExchange");
  27444. if (ssl->toInfoOn) {
  27445. ret = AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  27446. args->output, args->sendSz, WRITE_PROTO, 0, ssl->heap);
  27447. if (ret != 0) {
  27448. goto exit_scke;
  27449. }
  27450. }
  27451. #endif
  27452. ssl->buffers.outputBuffer.length += args->sendSz;
  27453. if (!ssl->options.groupMessages) {
  27454. ret = SendBuffered(ssl);
  27455. }
  27456. if (ret == 0 || ret == WANT_WRITE) {
  27457. int tmpRet = MakeMasterSecret(ssl);
  27458. if (tmpRet != 0) {
  27459. ret = tmpRet; /* save WANT_WRITE unless more serious */
  27460. }
  27461. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  27462. ssl->options.buildingMsg = 0;
  27463. }
  27464. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  27465. if (ssl->keyLogCb != NULL) {
  27466. int secretSz = SECRET_LEN;
  27467. ret = ssl->keyLogCb(ssl, ssl->arrays->masterSecret, &secretSz,
  27468. NULL);
  27469. if (ret != 0 || secretSz != SECRET_LEN)
  27470. return SESSION_SECRET_CB_E;
  27471. }
  27472. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  27473. break;
  27474. }
  27475. default:
  27476. ret = INPUT_CASE_ERROR;
  27477. } /* switch(ssl->options.asyncState) */
  27478. exit_scke:
  27479. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  27480. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  27481. #ifdef WOLFSSL_ASYNC_IO
  27482. /* Handle async operation */
  27483. if (ret == WC_PENDING_E || ret == WANT_WRITE) {
  27484. if (ssl->options.buildingMsg)
  27485. return ret;
  27486. /* If we have completed all states then we will not enter this function
  27487. * again. We need to do clean up now. */
  27488. }
  27489. #endif
  27490. /* No further need for PMS */
  27491. if (ssl->arrays->preMasterSecret != NULL) {
  27492. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  27493. }
  27494. ssl->arrays->preMasterSz = 0;
  27495. /* Final cleanup */
  27496. #ifdef WOLFSSL_ASYNC_IO
  27497. /* Cleanup async */
  27498. FreeAsyncCtx(ssl, 0);
  27499. #else
  27500. FreeSckeArgs(ssl, args);
  27501. #endif
  27502. FreeKeyExchange(ssl);
  27503. if (ret != 0) {
  27504. WOLFSSL_ERROR_VERBOSE(ret);
  27505. }
  27506. return ret;
  27507. }
  27508. #endif /* !WOLFSSL_NO_TLS12 */
  27509. #ifndef NO_CERTS
  27510. #ifndef WOLFSSL_NO_TLS12
  27511. #ifndef WOLFSSL_NO_CLIENT_AUTH
  27512. typedef struct ScvArgs {
  27513. byte* output; /* not allocated */
  27514. #ifndef NO_RSA
  27515. byte* verifySig;
  27516. #endif
  27517. byte* verify; /* not allocated */
  27518. byte* input;
  27519. word32 idx;
  27520. word32 extraSz;
  27521. word32 sigSz;
  27522. int sendSz;
  27523. int inputSz;
  27524. word16 length;
  27525. byte sigAlgo;
  27526. } ScvArgs;
  27527. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  27528. {
  27529. ScvArgs* args = (ScvArgs*)pArgs;
  27530. (void)ssl;
  27531. #ifndef NO_RSA
  27532. if (args->verifySig) {
  27533. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  27534. args->verifySig = NULL;
  27535. }
  27536. #endif
  27537. if (args->input) {
  27538. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27539. args->input = NULL;
  27540. }
  27541. }
  27542. /* handle generation of certificate_verify (15) */
  27543. int SendCertificateVerify(WOLFSSL* ssl)
  27544. {
  27545. int ret = 0;
  27546. #ifdef WOLFSSL_ASYNC_IO
  27547. ScvArgs* args = NULL;
  27548. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  27549. #else
  27550. ScvArgs args[1];
  27551. #endif
  27552. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  27553. WOLFSSL_ENTER("SendCertificateVerify");
  27554. #ifdef WOLFSSL_ASYNC_IO
  27555. if (ssl->async == NULL) {
  27556. ssl->async = (struct WOLFSSL_ASYNC*)
  27557. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  27558. DYNAMIC_TYPE_ASYNC);
  27559. if (ssl->async == NULL)
  27560. ERROR_OUT(MEMORY_E, exit_scv);
  27561. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  27562. }
  27563. args = (ScvArgs*)ssl->async->args;
  27564. #ifdef WOLFSSL_ASYNC_CRYPT
  27565. /* BuildMessage does its own Pop */
  27566. if (ssl->error != WC_PENDING_E ||
  27567. ssl->options.asyncState != TLS_ASYNC_END)
  27568. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  27569. if (ret != WC_NOT_PENDING_E) {
  27570. /* Check for error */
  27571. if (ret < 0)
  27572. goto exit_scv;
  27573. }
  27574. else
  27575. #endif
  27576. if (ssl->options.buildingMsg) {
  27577. /* We should be in the sending state. */
  27578. if (ssl->options.asyncState != TLS_ASYNC_END) {
  27579. ret = BAD_STATE_E;
  27580. goto exit_scv;
  27581. }
  27582. }
  27583. else
  27584. #endif
  27585. {
  27586. /* Reset state */
  27587. ret = 0;
  27588. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  27589. XMEMSET(args, 0, sizeof(ScvArgs));
  27590. #ifdef WOLFSSL_ASYNC_IO
  27591. ssl->async->freeArgs = FreeScvArgs;
  27592. #endif
  27593. }
  27594. switch(ssl->options.asyncState)
  27595. {
  27596. case TLS_ASYNC_BEGIN:
  27597. {
  27598. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  27599. return 0; /* sent blank cert, can't verify */
  27600. }
  27601. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  27602. if (IsEncryptionOn(ssl, 1)) {
  27603. args->sendSz += MAX_MSG_EXTRA;
  27604. }
  27605. /* Use tmp buffer */
  27606. args->input = (byte*)XMALLOC(args->sendSz,
  27607. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27608. if (args->input == NULL)
  27609. ERROR_OUT(MEMORY_E, exit_scv);
  27610. args->output = args->input;
  27611. /* Advance state and proceed */
  27612. ssl->options.asyncState = TLS_ASYNC_BUILD;
  27613. } /* case TLS_ASYNC_BEGIN */
  27614. FALL_THROUGH;
  27615. case TLS_ASYNC_BUILD:
  27616. {
  27617. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  27618. if (ret != 0) {
  27619. goto exit_scv;
  27620. }
  27621. if (ssl->buffers.key == NULL) {
  27622. #ifdef HAVE_PK_CALLBACKS
  27623. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  27624. args->length = GetPrivateKeySigSize(ssl);
  27625. else
  27626. #endif
  27627. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  27628. }
  27629. else {
  27630. /* Decode private key. */
  27631. ret = DecodePrivateKey(ssl, &args->length);
  27632. if (ret != 0) {
  27633. goto exit_scv;
  27634. }
  27635. }
  27636. if (args->length == 0) {
  27637. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  27638. }
  27639. /* idx is used to track verify pointer offset to output */
  27640. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27641. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  27642. args->extraSz = 0; /* tls 1.2 hash/sig */
  27643. /* build encoded signature buffer */
  27644. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  27645. ssl->buffers.sig.buffer = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  27646. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  27647. if (ssl->buffers.sig.buffer == NULL) {
  27648. ERROR_OUT(MEMORY_E, exit_scv);
  27649. }
  27650. #ifdef WOLFSSL_DTLS
  27651. if (ssl->options.dtls) {
  27652. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27653. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27654. }
  27655. #endif
  27656. if (!IsAtLeastTLSv1_2(ssl)) {
  27657. #ifndef NO_OLD_TLS
  27658. #ifndef NO_SHA
  27659. /* old tls default */
  27660. SetDigest(ssl, sha_mac);
  27661. #endif
  27662. #else
  27663. #ifndef NO_SHA256
  27664. /* new tls default */
  27665. SetDigest(ssl, sha256_mac);
  27666. #endif
  27667. #endif /* !NO_OLD_TLS */
  27668. }
  27669. else {
  27670. SetDigest(ssl, ssl->options.hashAlgo);
  27671. }
  27672. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  27673. #ifdef WC_RSA_PSS
  27674. if (IsAtLeastTLSv1_2(ssl) &&
  27675. (ssl->pssAlgo & (1 << ssl->options.hashAlgo))) {
  27676. args->sigAlgo = rsa_pss_sa_algo;
  27677. }
  27678. else
  27679. #endif
  27680. args->sigAlgo = rsa_sa_algo;
  27681. }
  27682. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  27683. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  27684. if (ssl->buffers.keyType == sm2_sa_algo) {
  27685. args->sigAlgo = sm2_sa_algo;
  27686. }
  27687. else
  27688. #endif
  27689. {
  27690. args->sigAlgo = ecc_dsa_sa_algo;
  27691. }
  27692. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  27693. args->sigAlgo = ed25519_sa_algo;
  27694. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  27695. args->sigAlgo = ed448_sa_algo;
  27696. if (IsAtLeastTLSv1_2(ssl)) {
  27697. EncodeSigAlg(ssl->options.hashAlgo, args->sigAlgo,
  27698. args->verify);
  27699. args->extraSz = HASH_SIG_SIZE;
  27700. SetDigest(ssl, ssl->options.hashAlgo);
  27701. }
  27702. #ifndef NO_OLD_TLS
  27703. else {
  27704. /* if old TLS load MD5 and SHA hash as value to sign
  27705. * MD5 and SHA must be first two buffers in structure */
  27706. XMEMCPY(ssl->buffers.sig.buffer,
  27707. (byte*)&ssl->hsHashes->certHashes, FINISHED_SZ);
  27708. }
  27709. #endif
  27710. #ifndef NO_RSA
  27711. if (args->sigAlgo == rsa_sa_algo) {
  27712. ssl->buffers.sig.length = FINISHED_SZ;
  27713. args->sigSz = ENCRYPT_LEN;
  27714. if (IsAtLeastTLSv1_2(ssl)) {
  27715. ssl->buffers.sig.length = wc_EncodeSignature(
  27716. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  27717. ssl->buffers.digest.length,
  27718. TypeHash(ssl->options.hashAlgo));
  27719. }
  27720. /* prepend hdr */
  27721. c16toa(args->length, args->verify + args->extraSz);
  27722. }
  27723. #ifdef WC_RSA_PSS
  27724. else if (args->sigAlgo == rsa_pss_sa_algo) {
  27725. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  27726. ssl->buffers.digest.length);
  27727. ssl->buffers.sig.length = ssl->buffers.digest.length;
  27728. args->sigSz = ENCRYPT_LEN;
  27729. /* prepend hdr */
  27730. c16toa(args->length, args->verify + args->extraSz);
  27731. }
  27732. #endif
  27733. #endif /* !NO_RSA */
  27734. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  27735. if (args->sigAlgo == ed25519_sa_algo) {
  27736. ret = Ed25519CheckPubKey(ssl);
  27737. if (ret != 0)
  27738. goto exit_scv;
  27739. }
  27740. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  27741. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  27742. if (args->sigAlgo == ed448_sa_algo) {
  27743. ret = Ed448CheckPubKey(ssl);
  27744. if (ret != 0)
  27745. goto exit_scv;
  27746. }
  27747. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  27748. /* Advance state and proceed */
  27749. ssl->options.asyncState = TLS_ASYNC_DO;
  27750. } /* case TLS_ASYNC_BUILD */
  27751. FALL_THROUGH;
  27752. case TLS_ASYNC_DO:
  27753. {
  27754. #ifdef HAVE_ECC
  27755. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  27756. ecc_key* key = (ecc_key*)ssl->hsKey;
  27757. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  27758. if (args->sigAlgo == sm2_sa_algo) {
  27759. ret = Sm2wSm3Sign(ssl,
  27760. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  27761. ssl->hsHashes->messages, ssl->hsHashes->length,
  27762. ssl->buffers.sig.buffer,
  27763. (word32*)&ssl->buffers.sig.length,
  27764. key,
  27765. #ifdef HAVE_PK_CALLBACKS
  27766. ssl->buffers.key
  27767. #else
  27768. NULL
  27769. #endif
  27770. );
  27771. }
  27772. else
  27773. #endif
  27774. {
  27775. ret = EccSign(ssl,
  27776. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  27777. ssl->buffers.sig.buffer,
  27778. (word32*)&ssl->buffers.sig.length,
  27779. key,
  27780. #ifdef HAVE_PK_CALLBACKS
  27781. ssl->buffers.key
  27782. #else
  27783. NULL
  27784. #endif
  27785. );
  27786. }
  27787. }
  27788. #endif /* HAVE_ECC */
  27789. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  27790. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  27791. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  27792. ret = Ed25519Sign(ssl,
  27793. ssl->hsHashes->messages, ssl->hsHashes->length,
  27794. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  27795. key,
  27796. #ifdef HAVE_PK_CALLBACKS
  27797. ssl->buffers.key
  27798. #else
  27799. NULL
  27800. #endif
  27801. );
  27802. }
  27803. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  27804. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  27805. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  27806. ed448_key* key = (ed448_key*)ssl->hsKey;
  27807. ret = Ed448Sign(ssl,
  27808. ssl->hsHashes->messages, ssl->hsHashes->length,
  27809. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  27810. key,
  27811. #ifdef HAVE_PK_CALLBACKS
  27812. ssl->buffers.key
  27813. #else
  27814. NULL
  27815. #endif
  27816. );
  27817. }
  27818. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  27819. #ifndef NO_RSA
  27820. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  27821. RsaKey* key = (RsaKey*)ssl->hsKey;
  27822. /* restore verify pointer */
  27823. args->verify = &args->output[args->idx];
  27824. ret = RsaSign(ssl,
  27825. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  27826. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  27827. args->sigAlgo, ssl->options.hashAlgo, key,
  27828. ssl->buffers.key
  27829. );
  27830. }
  27831. #endif /* !NO_RSA */
  27832. /* Check for error */
  27833. if (ret != 0) {
  27834. goto exit_scv;
  27835. }
  27836. /* Advance state and proceed */
  27837. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  27838. } /* case TLS_ASYNC_DO */
  27839. FALL_THROUGH;
  27840. case TLS_ASYNC_VERIFY:
  27841. {
  27842. /* restore verify pointer */
  27843. args->verify = &args->output[args->idx];
  27844. switch (ssl->hsType) {
  27845. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  27846. #ifdef HAVE_ECC
  27847. case DYNAMIC_TYPE_ECC:
  27848. #ifdef WOLFSSL_CHECK_SIG_FAULTS
  27849. {
  27850. ecc_key* key = (ecc_key*)ssl->hsKey;
  27851. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  27852. if (ssl->buffers.keyType == sm2_sa_algo) {
  27853. ret = Sm3wSm2Verify(ssl,
  27854. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  27855. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  27856. ssl->buffers.digest.buffer,
  27857. ssl->buffers.digest.length, key,
  27858. #ifdef HAVE_PK_CALLBACKS
  27859. ssl->buffers.key
  27860. #else
  27861. NULL
  27862. #endif
  27863. );
  27864. }
  27865. else
  27866. #endif
  27867. {
  27868. ret = EccVerify(ssl,
  27869. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  27870. ssl->buffers.digest.buffer,
  27871. ssl->buffers.digest.length, key,
  27872. #ifdef HAVE_PK_CALLBACKS
  27873. ssl->buffers.key
  27874. #else
  27875. NULL
  27876. #endif
  27877. );
  27878. }
  27879. if (ret != 0) {
  27880. WOLFSSL_MSG("Failed to verify ECC signature");
  27881. goto exit_scv;
  27882. }
  27883. }
  27884. #if defined(HAVE_ED25519) || defined(HAVE_ED448)
  27885. FALL_THROUGH;
  27886. #endif
  27887. #endif /* WOLFSSL_CHECK_SIG_FAULTS */
  27888. #endif /* HAVE_ECC */
  27889. #ifdef HAVE_ED25519
  27890. case DYNAMIC_TYPE_ED25519:
  27891. #endif
  27892. #ifdef HAVE_ED448
  27893. case DYNAMIC_TYPE_ED448:
  27894. #endif
  27895. args->length = (word16)ssl->buffers.sig.length;
  27896. /* prepend hdr */
  27897. c16toa(args->length, args->verify + args->extraSz);
  27898. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  27899. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  27900. break;
  27901. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  27902. #ifndef NO_RSA
  27903. case DYNAMIC_TYPE_RSA:
  27904. {
  27905. RsaKey* key = (RsaKey*)ssl->hsKey;
  27906. if (args->verifySig == NULL) {
  27907. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  27908. DYNAMIC_TYPE_SIGNATURE);
  27909. if (args->verifySig == NULL) {
  27910. ERROR_OUT(MEMORY_E, exit_scv);
  27911. }
  27912. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  27913. VERIFY_HEADER, args->sigSz);
  27914. }
  27915. /* check for signature faults */
  27916. ret = VerifyRsaSign(ssl,
  27917. args->verifySig, args->sigSz,
  27918. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  27919. args->sigAlgo, ssl->options.hashAlgo, key,
  27920. ssl->buffers.key
  27921. );
  27922. /* free temporary buffer now */
  27923. if (ret != WC_PENDING_E) {
  27924. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  27925. args->verifySig = NULL;
  27926. }
  27927. break;
  27928. }
  27929. #endif /* !NO_RSA */
  27930. default:
  27931. break;
  27932. }
  27933. /* Check for error */
  27934. if (ret != 0) {
  27935. goto exit_scv;
  27936. }
  27937. /* Advance state and proceed */
  27938. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  27939. } /* case TLS_ASYNC_VERIFY */
  27940. FALL_THROUGH;
  27941. case TLS_ASYNC_FINALIZE:
  27942. {
  27943. if (args->output == NULL) {
  27944. ERROR_OUT(BUFFER_ERROR, exit_scv);
  27945. }
  27946. AddHeaders(args->output, (word32)args->length + args->extraSz +
  27947. VERIFY_HEADER, certificate_verify, ssl);
  27948. /* Advance state and proceed */
  27949. ssl->options.asyncState = TLS_ASYNC_END;
  27950. } /* case TLS_ASYNC_FINALIZE */
  27951. FALL_THROUGH;
  27952. case TLS_ASYNC_END:
  27953. {
  27954. ret = SendHandshakeMsg(ssl, args->output,
  27955. (word32)args->length + args->extraSz + VERIFY_HEADER,
  27956. certificate_verify, "CertificateVerify");
  27957. if (ret != 0)
  27958. goto exit_scv;
  27959. break;
  27960. }
  27961. default:
  27962. ret = INPUT_CASE_ERROR;
  27963. } /* switch(ssl->options.asyncState) */
  27964. exit_scv:
  27965. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  27966. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  27967. #ifdef WOLFSSL_ASYNC_IO
  27968. /* Handle async operation */
  27969. if (ret == WANT_WRITE
  27970. #ifdef WOLFSSL_ASYNC_CRYPT
  27971. || ret == WC_PENDING_E
  27972. #endif
  27973. )
  27974. return ret;
  27975. #endif /* WOLFSSL_ASYNC_IO */
  27976. /* Digest is not allocated, so do this to prevent free */
  27977. if(ssl->buffers.digest.buffer) {
  27978. if (!ssl->options.dontFreeDigest) {
  27979. /*This should not happen*/
  27980. XFREE(ssl->buffers.digest.buffer,
  27981. ssl->heap, DYNAMIC_TYPE_DIGEST);
  27982. }
  27983. }
  27984. ssl->buffers.digest.buffer = NULL;
  27985. ssl->buffers.digest.length = 0;
  27986. ssl->options.dontFreeDigest = 0;
  27987. /* Final cleanup */
  27988. #ifdef WOLFSSL_ASYNC_IO
  27989. /* Cleanup async */
  27990. FreeAsyncCtx(ssl, 0);
  27991. #else
  27992. FreeScvArgs(ssl, args);
  27993. #endif
  27994. FreeKeyExchange(ssl);
  27995. if (ret != 0) {
  27996. WOLFSSL_ERROR_VERBOSE(ret);
  27997. }
  27998. return ret;
  27999. }
  28000. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  28001. #endif /* WOLFSSL_NO_TLS12 */
  28002. #endif /* NO_CERTS */
  28003. #ifdef HAVE_SESSION_TICKET
  28004. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  28005. {
  28006. /* Free old dynamic ticket if we already had one */
  28007. if (ssl->session->ticketLenAlloc > 0) {
  28008. XFREE(ssl->session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  28009. ssl->session->ticket = ssl->session->staticTicket;
  28010. ssl->session->ticketLenAlloc = 0;
  28011. }
  28012. if (length > sizeof(ssl->session->staticTicket)) {
  28013. byte* sessionTicket =
  28014. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  28015. if (sessionTicket == NULL)
  28016. return MEMORY_E;
  28017. ssl->session->ticket = sessionTicket;
  28018. ssl->session->ticketLenAlloc = (word16)length;
  28019. }
  28020. ssl->session->ticketLen = (word16)length;
  28021. if (length > 0) {
  28022. XMEMCPY(ssl->session->ticket, ticket, length);
  28023. if (ssl->session_ticket_cb != NULL) {
  28024. ssl->session_ticket_cb(ssl,
  28025. ssl->session->ticket, ssl->session->ticketLen,
  28026. ssl->session_ticket_ctx);
  28027. }
  28028. /* Create a fake sessionID based on the ticket, this will
  28029. * supersede the existing session cache info. */
  28030. ssl->options.haveSessionId = 1;
  28031. #ifdef WOLFSSL_TLS13
  28032. if (ssl->options.tls1_3) {
  28033. XMEMCPY(ssl->session->sessionID,
  28034. ssl->session->ticket + length - ID_LEN, ID_LEN);
  28035. ssl->session->sessionIDSz = ID_LEN;
  28036. }
  28037. else
  28038. #endif
  28039. {
  28040. XMEMCPY(ssl->arrays->sessionID,
  28041. ssl->session->ticket + length - ID_LEN, ID_LEN);
  28042. ssl->arrays->sessionIDSz = ID_LEN;
  28043. }
  28044. }
  28045. return 0;
  28046. }
  28047. #ifndef WOLFSSL_NO_TLS12
  28048. /* handle processing of session_ticket (4) */
  28049. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  28050. word32 size)
  28051. {
  28052. word32 begin = *inOutIdx;
  28053. word32 lifetime;
  28054. word16 length;
  28055. int ret;
  28056. if (ssl->expect_session_ticket == 0) {
  28057. WOLFSSL_MSG("Unexpected session ticket");
  28058. WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
  28059. return SESSION_TICKET_EXPECT_E;
  28060. }
  28061. if (OPAQUE32_LEN > size)
  28062. return BUFFER_ERROR;
  28063. ato32(input + *inOutIdx, &lifetime);
  28064. *inOutIdx += OPAQUE32_LEN;
  28065. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  28066. return BUFFER_ERROR;
  28067. ato16(input + *inOutIdx, &length);
  28068. *inOutIdx += OPAQUE16_LEN;
  28069. if ((*inOutIdx - begin) + length > size)
  28070. return BUFFER_ERROR;
  28071. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  28072. return ret;
  28073. *inOutIdx += length;
  28074. if (length > 0) {
  28075. ssl->timeout = lifetime;
  28076. SetupSession(ssl);
  28077. #ifndef NO_SESSION_CACHE
  28078. AddSession(ssl);
  28079. #endif
  28080. }
  28081. if (IsEncryptionOn(ssl, 0)) {
  28082. *inOutIdx += ssl->keys.padSz;
  28083. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  28084. if (ssl->options.startedETMRead)
  28085. *inOutIdx += MacSize(ssl);
  28086. #endif
  28087. }
  28088. ssl->expect_session_ticket = 0;
  28089. return 0;
  28090. }
  28091. #endif /* !WOLFSSL_NO_TLS12 */
  28092. #endif /* HAVE_SESSION_TICKET */
  28093. #endif /* NO_WOLFSSL_CLIENT */
  28094. #ifndef NO_CERTS
  28095. #ifdef WOLF_PRIVATE_KEY_ID
  28096. int GetPrivateKeySigSize(WOLFSSL* ssl)
  28097. {
  28098. int sigSz = 0;
  28099. if (ssl == NULL)
  28100. return 0;
  28101. switch (ssl->buffers.keyType) {
  28102. #ifndef NO_RSA
  28103. #ifdef WC_RSA_PSS
  28104. case rsa_pss_sa_algo:
  28105. #endif
  28106. case rsa_sa_algo:
  28107. sigSz = ssl->buffers.keySz;
  28108. ssl->hsType = DYNAMIC_TYPE_RSA;
  28109. break;
  28110. #endif
  28111. #ifdef HAVE_ECC
  28112. case ecc_dsa_sa_algo:
  28113. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  28114. ssl->hsType = DYNAMIC_TYPE_ECC;
  28115. break;
  28116. #endif
  28117. #ifdef HAVE_ED25519
  28118. case ed25519_sa_algo:
  28119. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  28120. ssl->hsType = DYNAMIC_TYPE_ED25519;
  28121. break;
  28122. #endif
  28123. #ifdef HAVE_ED448
  28124. case ed448_sa_algo:
  28125. sigSz = ED448_SIG_SIZE; /* fixed known value */
  28126. ssl->hsType = DYNAMIC_TYPE_ED448;
  28127. break;
  28128. #endif
  28129. default:
  28130. break;
  28131. }
  28132. return sigSz;
  28133. }
  28134. #endif /* HAVE_PK_CALLBACKS */
  28135. #endif /* NO_CERTS */
  28136. #ifdef HAVE_ECC
  28137. /* returns the WOLFSSL_* version of the curve from the OID sum */
  28138. word16 GetCurveByOID(int oidSum) {
  28139. switch(oidSum) {
  28140. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  28141. #ifndef NO_ECC_SECP
  28142. case ECC_SECP160R1_OID:
  28143. return WOLFSSL_ECC_SECP160R1;
  28144. #endif /* !NO_ECC_SECP */
  28145. #ifdef HAVE_ECC_SECPR2
  28146. case ECC_SECP160R2_OID:
  28147. return WOLFSSL_ECC_SECP160R2;
  28148. #endif /* HAVE_ECC_SECPR2 */
  28149. #ifdef HAVE_ECC_KOBLITZ
  28150. case ECC_SECP160K1_OID:
  28151. return WOLFSSL_ECC_SECP160K1;
  28152. #endif /* HAVE_ECC_KOBLITZ */
  28153. #endif
  28154. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  28155. #ifndef NO_ECC_SECP
  28156. case ECC_SECP192R1_OID:
  28157. return WOLFSSL_ECC_SECP192R1;
  28158. #endif /* !NO_ECC_SECP */
  28159. #ifdef HAVE_ECC_KOBLITZ
  28160. case ECC_SECP192K1_OID:
  28161. return WOLFSSL_ECC_SECP192K1;
  28162. #endif /* HAVE_ECC_KOBLITZ */
  28163. #endif
  28164. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  28165. #ifndef NO_ECC_SECP
  28166. case ECC_SECP224R1_OID:
  28167. return WOLFSSL_ECC_SECP224R1;
  28168. #endif /* !NO_ECC_SECP */
  28169. #ifdef HAVE_ECC_KOBLITZ
  28170. case ECC_SECP224K1_OID:
  28171. return WOLFSSL_ECC_SECP224K1;
  28172. #endif /* HAVE_ECC_KOBLITZ */
  28173. #endif
  28174. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  28175. #ifndef NO_ECC_SECP
  28176. case ECC_SECP256R1_OID:
  28177. return WOLFSSL_ECC_SECP256R1;
  28178. #endif /* !NO_ECC_SECP */
  28179. #ifdef HAVE_ECC_KOBLITZ
  28180. case ECC_SECP256K1_OID:
  28181. return WOLFSSL_ECC_SECP256K1;
  28182. #endif /* HAVE_ECC_KOBLITZ */
  28183. #ifdef HAVE_ECC_BRAINPOOL
  28184. case ECC_BRAINPOOLP256R1_OID:
  28185. return WOLFSSL_ECC_BRAINPOOLP256R1;
  28186. #endif /* HAVE_ECC_BRAINPOOL */
  28187. #ifdef WOLFSSL_SM2
  28188. case ECC_SM2P256V1_OID:
  28189. return WOLFSSL_ECC_SM2P256V1;
  28190. #endif /* WOLFSSL_SM2 */
  28191. #endif
  28192. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  28193. #ifndef NO_ECC_SECP
  28194. case ECC_SECP384R1_OID:
  28195. return WOLFSSL_ECC_SECP384R1;
  28196. #endif /* !NO_ECC_SECP */
  28197. #ifdef HAVE_ECC_BRAINPOOL
  28198. case ECC_BRAINPOOLP384R1_OID:
  28199. return WOLFSSL_ECC_BRAINPOOLP384R1;
  28200. #endif /* HAVE_ECC_BRAINPOOL */
  28201. #endif
  28202. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  28203. #ifdef HAVE_ECC_BRAINPOOL
  28204. case ECC_BRAINPOOLP512R1_OID:
  28205. return WOLFSSL_ECC_BRAINPOOLP512R1;
  28206. #endif /* HAVE_ECC_BRAINPOOL */
  28207. #endif
  28208. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  28209. #ifndef NO_ECC_SECP
  28210. case ECC_SECP521R1_OID:
  28211. return WOLFSSL_ECC_SECP521R1;
  28212. #endif /* !NO_ECC_SECP */
  28213. #endif
  28214. default:
  28215. WOLFSSL_MSG("Curve OID not compiled in or implemented");
  28216. return 0;
  28217. }
  28218. }
  28219. #endif /* HAVE_ECC */
  28220. int TranslateErrorToAlert(int err)
  28221. {
  28222. switch (err) {
  28223. case BUFFER_ERROR:
  28224. return decode_error;
  28225. case EXT_NOT_ALLOWED:
  28226. case PEER_KEY_ERROR:
  28227. case ECC_PEERKEY_ERROR:
  28228. case BAD_KEY_SHARE_DATA:
  28229. case PSK_KEY_ERROR:
  28230. case INVALID_PARAMETER:
  28231. case HRR_COOKIE_ERROR:
  28232. return illegal_parameter;
  28233. case INCOMPLETE_DATA:
  28234. return missing_extension;
  28235. case MATCH_SUITE_ERROR:
  28236. case MISSING_HANDSHAKE_DATA:
  28237. return handshake_failure;
  28238. case VERSION_ERROR:
  28239. return wolfssl_alert_protocol_version;
  28240. default:
  28241. return invalid_alert;
  28242. }
  28243. }
  28244. #ifndef NO_WOLFSSL_SERVER
  28245. #ifndef WOLFSSL_NO_TLS12
  28246. /* handle generation of server_hello (2) */
  28247. int SendServerHello(WOLFSSL* ssl)
  28248. {
  28249. int ret;
  28250. byte *output;
  28251. word16 length;
  28252. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  28253. int sendSz;
  28254. byte sessIdSz = ID_LEN;
  28255. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  28256. byte echoId = 0; /* ticket echo id flag */
  28257. #endif
  28258. byte cacheOff = 0; /* session cache off flag */
  28259. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  28260. WOLFSSL_ENTER("SendServerHello");
  28261. length = VERSION_SZ + RAN_LEN
  28262. + ID_LEN + ENUM_LEN
  28263. + SUITE_LEN
  28264. + ENUM_LEN;
  28265. #ifdef HAVE_TLS_EXTENSIONS
  28266. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  28267. if (ret != 0)
  28268. return ret;
  28269. #ifdef HAVE_SESSION_TICKET
  28270. if (ssl->options.useTicket) {
  28271. /* echo session id sz can be 0,32 or bogus len in between */
  28272. sessIdSz = ssl->arrays->sessionIDSz;
  28273. if (sessIdSz > ID_LEN) {
  28274. WOLFSSL_MSG("Bad bogus session id len");
  28275. return BUFFER_ERROR;
  28276. }
  28277. if (!IsAtLeastTLSv1_3(ssl->version))
  28278. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  28279. echoId = 1;
  28280. }
  28281. #endif /* HAVE_SESSION_TICKET */
  28282. #else
  28283. if (ssl->options.haveEMS) {
  28284. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  28285. }
  28286. #endif
  28287. /* is the session cache off at build or runtime */
  28288. #ifdef NO_SESSION_CACHE
  28289. cacheOff = 1;
  28290. #else
  28291. if (ssl->options.sessionCacheOff == 1) {
  28292. cacheOff = 1;
  28293. }
  28294. #endif
  28295. /* if no session cache don't send a session ID unless we're echoing
  28296. * an ID as part of session tickets */
  28297. if (cacheOff == 1
  28298. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  28299. && echoId == 0
  28300. #endif
  28301. ) {
  28302. length -= ID_LEN; /* adjust ID_LEN assumption */
  28303. sessIdSz = 0;
  28304. }
  28305. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  28306. #ifdef WOLFSSL_DTLS
  28307. if (ssl->options.dtls) {
  28308. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28309. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28310. }
  28311. #endif /* WOLFSSL_DTLS */
  28312. if (IsEncryptionOn(ssl, 1))
  28313. sendSz += MAX_MSG_EXTRA;
  28314. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  28315. * is not advanced yet */
  28316. ssl->options.buildingMsg = 1;
  28317. /* check for available size */
  28318. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  28319. return ret;
  28320. /* get output buffer */
  28321. output = GetOutputBuffer(ssl);
  28322. AddHeaders(output, length, server_hello, ssl);
  28323. /* now write to output */
  28324. /* first version */
  28325. output[idx++] = (byte)ssl->version.major;
  28326. output[idx++] = (byte)ssl->version.minor;
  28327. /* then random and session id */
  28328. if (!ssl->options.resuming) {
  28329. /* generate random part and session id */
  28330. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  28331. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  28332. if (ret != 0)
  28333. return ret;
  28334. #ifdef WOLFSSL_TLS13
  28335. if (TLSv1_3_Capable(ssl)) {
  28336. /* TLS v1.3 capable server downgraded. */
  28337. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  28338. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  28339. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  28340. }
  28341. else
  28342. #endif
  28343. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  28344. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  28345. (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0 &&
  28346. !IsAtLeastTLSv1_2(ssl)) {
  28347. /* TLS v1.2 capable server downgraded. */
  28348. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  28349. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  28350. output[idx + RAN_LEN - 1] = 0;
  28351. }
  28352. /* store info in SSL for later */
  28353. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  28354. idx += RAN_LEN;
  28355. output[idx++] = sessIdSz;
  28356. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  28357. ssl->arrays->sessionIDSz = sessIdSz;
  28358. }
  28359. else {
  28360. /* If resuming, use info from SSL */
  28361. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  28362. idx += RAN_LEN;
  28363. output[idx++] = sessIdSz;
  28364. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  28365. }
  28366. idx += sessIdSz;
  28367. #ifdef SHOW_SECRETS
  28368. {
  28369. int j;
  28370. printf("server random: ");
  28371. for (j = 0; j < RAN_LEN; j++)
  28372. printf("%02x", ssl->arrays->serverRandom[j]);
  28373. printf("\n");
  28374. }
  28375. #endif
  28376. /* then cipher suite */
  28377. output[idx++] = ssl->options.cipherSuite0;
  28378. output[idx++] = ssl->options.cipherSuite;
  28379. /* then compression */
  28380. if (ssl->options.usingCompression)
  28381. output[idx++] = ZLIB_COMPRESSION;
  28382. else
  28383. output[idx++] = NO_COMPRESSION;
  28384. /* last, extensions */
  28385. #ifdef HAVE_TLS_EXTENSIONS
  28386. {
  28387. word16 offset = 0;
  28388. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  28389. if (ret != 0)
  28390. return ret;
  28391. idx += offset;
  28392. }
  28393. #else
  28394. #ifdef HAVE_EXTENDED_MASTER
  28395. if (ssl->options.haveEMS) {
  28396. c16toa(HELLO_EXT_SZ, output + idx);
  28397. idx += HELLO_EXT_SZ_SZ;
  28398. c16toa(HELLO_EXT_EXTMS, output + idx);
  28399. idx += HELLO_EXT_TYPE_SZ;
  28400. c16toa(0, output + idx);
  28401. /*idx += HELLO_EXT_SZ_SZ;*/
  28402. /* idx is not used after this point. uncomment the line above
  28403. * if adding any more extensions in the future. */
  28404. }
  28405. #endif
  28406. #endif
  28407. if (IsEncryptionOn(ssl, 1)) {
  28408. byte* input;
  28409. int inputSz = idx; /* build msg adds rec hdr */
  28410. int recordHeaderSz = RECORD_HEADER_SZ;
  28411. if (ssl->options.dtls)
  28412. recordHeaderSz += DTLS_RECORD_EXTRA;
  28413. inputSz -= recordHeaderSz;
  28414. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28415. if (input == NULL)
  28416. return MEMORY_E;
  28417. XMEMCPY(input, output + recordHeaderSz, inputSz);
  28418. #ifdef WOLFSSL_DTLS
  28419. if (IsDtlsNotSctpMode(ssl) &&
  28420. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
  28421. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28422. return ret;
  28423. }
  28424. #endif
  28425. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  28426. handshake, 1, 0, 0, CUR_ORDER);
  28427. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28428. if (sendSz < 0)
  28429. return sendSz;
  28430. } else {
  28431. #ifdef WOLFSSL_DTLS
  28432. if (IsDtlsNotSctpMode(ssl)) {
  28433. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
  28434. return ret;
  28435. }
  28436. if (ssl->options.dtls)
  28437. DtlsSEQIncrement(ssl, CUR_ORDER);
  28438. #endif
  28439. ret = HashOutput(ssl, output, sendSz, 0);
  28440. if (ret != 0)
  28441. return ret;
  28442. }
  28443. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  28444. if (ssl->hsInfoOn)
  28445. AddPacketName(ssl, "ServerHello");
  28446. if (ssl->toInfoOn) {
  28447. ret = AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  28448. WRITE_PROTO, 0, ssl->heap);
  28449. if (ret != 0)
  28450. return ret;
  28451. }
  28452. #endif
  28453. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  28454. ssl->options.buildingMsg = 0;
  28455. ssl->buffers.outputBuffer.length += sendSz;
  28456. if (ssl->options.groupMessages)
  28457. ret = 0;
  28458. else
  28459. ret = SendBuffered(ssl);
  28460. WOLFSSL_LEAVE("SendServerHello", ret);
  28461. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  28462. return ret;
  28463. }
  28464. #if defined(HAVE_ECC)
  28465. static byte SetCurveId(ecc_key* key)
  28466. {
  28467. if (key == NULL || key->dp == NULL) {
  28468. WOLFSSL_MSG("SetCurveId: Invalid key!");
  28469. return 0;
  28470. }
  28471. return (byte)GetCurveByOID(key->dp->oidSum);
  28472. }
  28473. #endif /* HAVE_ECC */
  28474. typedef struct SskeArgs {
  28475. byte* output; /* not allocated */
  28476. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  28477. byte* exportBuf;
  28478. #endif
  28479. #ifndef NO_RSA
  28480. byte* verifySig;
  28481. #endif
  28482. byte* input;
  28483. word32 idx;
  28484. word32 tmpSigSz;
  28485. word32 length;
  28486. word32 sigSz;
  28487. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  28488. !defined(NO_RSA)
  28489. word32 sigDataSz;
  28490. #endif
  28491. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  28492. word32 exportSz;
  28493. #endif
  28494. int sendSz;
  28495. int inputSz;
  28496. } SskeArgs;
  28497. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  28498. {
  28499. SskeArgs* args = (SskeArgs*)pArgs;
  28500. (void)ssl;
  28501. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  28502. if (args->exportBuf) {
  28503. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  28504. args->exportBuf = NULL;
  28505. }
  28506. #endif
  28507. #ifndef NO_RSA
  28508. if (args->verifySig) {
  28509. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  28510. args->verifySig = NULL;
  28511. }
  28512. #endif
  28513. (void)args;
  28514. }
  28515. /* handle generation of server_key_exchange (12) */
  28516. int SendServerKeyExchange(WOLFSSL* ssl)
  28517. {
  28518. int ret = 0;
  28519. #ifdef WOLFSSL_ASYNC_IO
  28520. SskeArgs* args = NULL;
  28521. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  28522. #else
  28523. SskeArgs args[1];
  28524. #endif
  28525. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  28526. WOLFSSL_ENTER("SendServerKeyExchange");
  28527. #ifdef WOLFSSL_ASYNC_IO
  28528. if (ssl->async == NULL) {
  28529. ssl->async = (struct WOLFSSL_ASYNC*)
  28530. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  28531. DYNAMIC_TYPE_ASYNC);
  28532. if (ssl->async == NULL)
  28533. ERROR_OUT(MEMORY_E, exit_sske);
  28534. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  28535. }
  28536. args = (SskeArgs*)ssl->async->args;
  28537. #ifdef WOLFSSL_ASYNC_CRYPT
  28538. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  28539. if (ret != WC_NOT_PENDING_E) {
  28540. /* Check for error */
  28541. if (ret < 0)
  28542. goto exit_sske;
  28543. }
  28544. else
  28545. #endif
  28546. if (ssl->options.buildingMsg) {
  28547. /* We should be in the sending state. */
  28548. if (ssl->options.asyncState != TLS_ASYNC_END) {
  28549. ret = BAD_STATE_E;
  28550. goto exit_sske;
  28551. }
  28552. }
  28553. else
  28554. #endif
  28555. {
  28556. /* Reset state */
  28557. ret = 0;
  28558. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  28559. XMEMSET(args, 0, sizeof(SskeArgs));
  28560. #ifdef WOLFSSL_ASYNC_IO
  28561. ssl->async->freeArgs = FreeSskeArgs;
  28562. #endif
  28563. }
  28564. switch(ssl->options.asyncState)
  28565. {
  28566. case TLS_ASYNC_BEGIN:
  28567. {
  28568. /* Do some checks / debug msgs */
  28569. switch(ssl->specs.kea)
  28570. {
  28571. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28572. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28573. case ecdhe_psk_kea:
  28574. {
  28575. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  28576. break;
  28577. }
  28578. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  28579. #if defined(HAVE_ECC)
  28580. case ecc_diffie_hellman_kea:
  28581. {
  28582. if (ssl->specs.static_ecdh) {
  28583. WOLFSSL_MSG("Using Static ECDH, not sending "
  28584. "ServerKeyExchange");
  28585. ERROR_OUT(0, exit_sske);
  28586. }
  28587. WOLFSSL_MSG("Using ephemeral ECDH");
  28588. break;
  28589. }
  28590. #endif /* HAVE_ECC */
  28591. }
  28592. /* Preparing keys */
  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) || !defined(NO_RSA) \
  28603. || (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  28604. #if !defined(NO_PSK)
  28605. case dhe_psk_kea:
  28606. #endif
  28607. #if !defined(NO_RSA) || (defined(HAVE_ANON) && \
  28608. !defined(WOLFSSL_NO_TLS12))
  28609. case diffie_hellman_kea:
  28610. #endif
  28611. #if (defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)) && !defined(HAVE_PUBLIC_FFDHE)
  28612. if (ssl->namedGroup) {
  28613. word32 pSz = 0;
  28614. ret = wc_DhGetNamedKeyParamSize(ssl->namedGroup, &pSz,
  28615. NULL, NULL);
  28616. if (ret != 0)
  28617. goto exit_sske;
  28618. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  28619. /* Free'd in SSL_ResourceFree and
  28620. * FreeHandshakeResources */
  28621. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  28622. pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  28623. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  28624. ERROR_OUT(MEMORY_E, exit_sske);
  28625. }
  28626. ssl->buffers.serverDH_Pub.length = pSz;
  28627. }
  28628. ssl->options.dhKeySz =(word16)pSz;
  28629. pSz = wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  28630. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  28631. /* Free'd in SSL_ResourceFree and
  28632. * FreeHandshakeResources */
  28633. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  28634. pSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  28635. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  28636. ERROR_OUT(MEMORY_E, exit_sske);
  28637. }
  28638. ssl->buffers.serverDH_Priv.length = pSz;
  28639. }
  28640. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  28641. (void**)&ssl->buffers.serverDH_Key);
  28642. if (ret != 0) {
  28643. goto exit_sske;
  28644. }
  28645. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  28646. ssl->namedGroup);
  28647. if (ret != 0) {
  28648. goto exit_sske;
  28649. }
  28650. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  28651. !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  28652. ssl->options.dhKeyTested = 1;
  28653. #endif
  28654. #ifdef HAVE_SECURE_RENEGOTIATION
  28655. /* Check that the DH public key buffer is large
  28656. * enough to hold the key. This may occur on a
  28657. * renegotiation when the key generated in the
  28658. * initial handshake is shorter than the key
  28659. * generated in the renegotiation. */
  28660. if (ssl->buffers.serverDH_Pub.length <
  28661. ssl->buffers.serverDH_P.length) {
  28662. byte* tmp = (byte*)XREALLOC(
  28663. ssl->buffers.serverDH_Pub.buffer,
  28664. ssl->buffers.serverDH_P.length +
  28665. OPAQUE16_LEN,
  28666. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  28667. if (tmp == NULL)
  28668. ERROR_OUT(MEMORY_E, exit_sske);
  28669. ssl->buffers.serverDH_Pub.buffer = tmp;
  28670. ssl->buffers.serverDH_Pub.length =
  28671. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  28672. }
  28673. #endif
  28674. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  28675. ssl->buffers.serverDH_Priv.buffer,
  28676. (word32*)&ssl->buffers.serverDH_Priv.length,
  28677. ssl->buffers.serverDH_Pub.buffer,
  28678. (word32*)&ssl->buffers.serverDH_Pub.length);
  28679. #ifdef WOLFSSL_CHECK_MEM_ZERO
  28680. wc_MemZero_Add("DH private key buffer",
  28681. ssl->buffers.serverDH_Priv.buffer,
  28682. ssl->buffers.serverDH_Priv.length);
  28683. #endif
  28684. break;
  28685. }
  28686. else
  28687. #endif
  28688. {
  28689. /* Allocate DH key buffers and generate key */
  28690. if (ssl->buffers.serverDH_P.buffer == NULL ||
  28691. ssl->buffers.serverDH_G.buffer == NULL) {
  28692. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  28693. }
  28694. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  28695. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  28696. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  28697. ssl->buffers.serverDH_P.length,
  28698. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  28699. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  28700. ERROR_OUT(MEMORY_E, exit_sske);
  28701. }
  28702. ssl->buffers.serverDH_Pub.length =
  28703. ssl->buffers.serverDH_P.length;
  28704. }
  28705. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  28706. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  28707. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  28708. ssl->buffers.serverDH_P.length,
  28709. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  28710. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  28711. ERROR_OUT(MEMORY_E, exit_sske);
  28712. }
  28713. ssl->buffers.serverDH_Priv.length =
  28714. ssl->buffers.serverDH_P.length;
  28715. }
  28716. ssl->options.dhKeySz =
  28717. (word16)ssl->buffers.serverDH_P.length;
  28718. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  28719. (void**)&ssl->buffers.serverDH_Key);
  28720. if (ret != 0) {
  28721. goto exit_sske;
  28722. }
  28723. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  28724. !defined(HAVE_FIPS) && \
  28725. !defined(HAVE_SELFTEST)
  28726. if (ssl->options.dhDoKeyTest &&
  28727. !ssl->options.dhKeyTested)
  28728. {
  28729. ret = wc_DhSetCheckKey(
  28730. ssl->buffers.serverDH_Key,
  28731. ssl->buffers.serverDH_P.buffer,
  28732. ssl->buffers.serverDH_P.length,
  28733. ssl->buffers.serverDH_G.buffer,
  28734. ssl->buffers.serverDH_G.length,
  28735. NULL, 0, 0, ssl->rng);
  28736. if (ret != 0) {
  28737. goto exit_sske;
  28738. }
  28739. ssl->options.dhKeyTested = 1;
  28740. }
  28741. else
  28742. #endif
  28743. {
  28744. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  28745. ssl->buffers.serverDH_P.buffer,
  28746. ssl->buffers.serverDH_P.length,
  28747. ssl->buffers.serverDH_G.buffer,
  28748. ssl->buffers.serverDH_G.length);
  28749. if (ret != 0) {
  28750. goto exit_sske;
  28751. }
  28752. }
  28753. #ifdef HAVE_SECURE_RENEGOTIATION
  28754. /* Check that the DH public key buffer is large
  28755. * enough to hold the key. This may occur on a
  28756. * renegotiation when the key generated in the
  28757. * initial handshake is shorter than the key
  28758. * generated in the renegotiation. */
  28759. if (ssl->buffers.serverDH_Pub.length <
  28760. ssl->buffers.serverDH_P.length) {
  28761. byte* tmp = (byte*)XREALLOC(
  28762. ssl->buffers.serverDH_Pub.buffer,
  28763. ssl->buffers.serverDH_P.length +
  28764. OPAQUE16_LEN,
  28765. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  28766. if (tmp == NULL)
  28767. ERROR_OUT(MEMORY_E, exit_sske);
  28768. ssl->buffers.serverDH_Pub.buffer = tmp;
  28769. ssl->buffers.serverDH_Pub.length =
  28770. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  28771. }
  28772. #endif
  28773. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  28774. ssl->buffers.serverDH_Priv.buffer,
  28775. (word32*)&ssl->buffers.serverDH_Priv.length,
  28776. ssl->buffers.serverDH_Pub.buffer,
  28777. (word32*)&ssl->buffers.serverDH_Pub.length);
  28778. #ifdef WOLFSSL_CHECK_MEM_ZERO
  28779. wc_MemZero_Add("DH private key buffer",
  28780. ssl->buffers.serverDH_Priv.buffer,
  28781. ssl->buffers.serverDH_Priv.length);
  28782. #endif
  28783. break;
  28784. }
  28785. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  28786. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28787. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28788. case ecdhe_psk_kea:
  28789. /* Fall through to create temp ECC key */
  28790. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  28791. #if defined(HAVE_ECC) || \
  28792. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  28793. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  28794. !defined(NO_RSA)))
  28795. case ecc_diffie_hellman_kea:
  28796. {
  28797. #ifdef HAVE_CURVE25519
  28798. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  28799. /* need ephemeral key now, create it if missing */
  28800. if (ssl->eccTempKey == NULL) {
  28801. /* alloc/init on demand */
  28802. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  28803. (void**)&ssl->eccTempKey);
  28804. if (ret != 0) {
  28805. goto exit_sske;
  28806. }
  28807. }
  28808. if (ssl->eccTempKeyPresent == 0) {
  28809. ret = X25519MakeKey(ssl,
  28810. (curve25519_key*)ssl->eccTempKey, NULL);
  28811. if (ret == 0 || ret == WC_PENDING_E) {
  28812. ssl->eccTempKeyPresent =
  28813. DYNAMIC_TYPE_CURVE25519;
  28814. }
  28815. }
  28816. break;
  28817. }
  28818. #endif
  28819. #ifdef HAVE_CURVE448
  28820. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  28821. /* need ephemeral key now, create it if missing */
  28822. if (ssl->eccTempKey == NULL) {
  28823. /* alloc/init on demand */
  28824. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  28825. (void**)&ssl->eccTempKey);
  28826. if (ret != 0) {
  28827. goto exit_sske;
  28828. }
  28829. }
  28830. if (ssl->eccTempKeyPresent == 0) {
  28831. ret = X448MakeKey(ssl,
  28832. (curve448_key*)ssl->eccTempKey, NULL);
  28833. if (ret == 0 || ret == WC_PENDING_E) {
  28834. ssl->eccTempKeyPresent =
  28835. DYNAMIC_TYPE_CURVE448;
  28836. }
  28837. }
  28838. break;
  28839. }
  28840. #endif
  28841. #ifdef HAVE_ECC
  28842. /* need ephemeral key now, create it if missing */
  28843. if (ssl->eccTempKey == NULL) {
  28844. /* alloc/init on demand */
  28845. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  28846. (void**)&ssl->eccTempKey);
  28847. if (ret != 0) {
  28848. goto exit_sske;
  28849. }
  28850. }
  28851. if (ssl->eccTempKeyPresent == 0) {
  28852. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  28853. if (ret == 0 || ret == WC_PENDING_E) {
  28854. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  28855. }
  28856. }
  28857. #endif
  28858. break;
  28859. }
  28860. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28861. default:
  28862. /* Skip ServerKeyExchange */
  28863. goto exit_sske;
  28864. } /* switch(ssl->specs.kea) */
  28865. /* Check for error */
  28866. if (ret != 0) {
  28867. goto exit_sske;
  28868. }
  28869. /* Advance state and proceed */
  28870. ssl->options.asyncState = TLS_ASYNC_BUILD;
  28871. } /* case TLS_ASYNC_BEGIN */
  28872. FALL_THROUGH;
  28873. case TLS_ASYNC_BUILD:
  28874. {
  28875. switch(ssl->specs.kea)
  28876. {
  28877. #ifndef NO_PSK
  28878. case psk_kea:
  28879. {
  28880. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  28881. if (ssl->arrays->server_hint[0] == 0) {
  28882. ERROR_OUT(0, exit_sske); /* don't send */
  28883. }
  28884. /* include size part */
  28885. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  28886. if (args->length > MAX_PSK_ID_LEN) {
  28887. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  28888. }
  28889. args->length += HINT_LEN_SZ;
  28890. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  28891. RECORD_HEADER_SZ;
  28892. #ifdef WOLFSSL_DTLS
  28893. if (ssl->options.dtls) {
  28894. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28895. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28896. }
  28897. #endif
  28898. if (IsEncryptionOn(ssl, 1)) {
  28899. args->sendSz += MAX_MSG_EXTRA;
  28900. }
  28901. /* Use tmp buffer */
  28902. args->input = (byte*)XMALLOC(args->sendSz,
  28903. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28904. if (args->input == NULL)
  28905. ERROR_OUT(MEMORY_E, exit_sske);
  28906. args->output = args->input;
  28907. AddHeaders(args->output, args->length,
  28908. server_key_exchange, ssl);
  28909. /* key data */
  28910. c16toa((word16)(args->length - HINT_LEN_SZ),
  28911. args->output + args->idx);
  28912. args->idx += HINT_LEN_SZ;
  28913. XMEMCPY(args->output + args->idx,
  28914. ssl->arrays->server_hint,
  28915. args->length - HINT_LEN_SZ);
  28916. break;
  28917. }
  28918. #endif /* !NO_PSK */
  28919. #if !defined(NO_DH) && !defined(NO_PSK)
  28920. case dhe_psk_kea:
  28921. {
  28922. word32 hintLen;
  28923. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  28924. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  28925. ssl->buffers.serverDH_P.length +
  28926. ssl->buffers.serverDH_G.length +
  28927. ssl->buffers.serverDH_Pub.length;
  28928. /* include size part */
  28929. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  28930. if (hintLen > MAX_PSK_ID_LEN) {
  28931. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  28932. }
  28933. args->length += hintLen + HINT_LEN_SZ;
  28934. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  28935. RECORD_HEADER_SZ;
  28936. #ifdef WOLFSSL_DTLS
  28937. if (ssl->options.dtls) {
  28938. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28939. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28940. }
  28941. #endif
  28942. if (IsEncryptionOn(ssl, 1)) {
  28943. args->sendSz += MAX_MSG_EXTRA;
  28944. }
  28945. /* Use tmp buffer */
  28946. args->input = (byte*)XMALLOC(args->sendSz,
  28947. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28948. if (args->input == NULL)
  28949. ERROR_OUT(MEMORY_E, exit_sske);
  28950. args->output = args->input;
  28951. AddHeaders(args->output, args->length,
  28952. server_key_exchange, ssl);
  28953. /* key data */
  28954. c16toa((word16)hintLen, args->output + args->idx);
  28955. args->idx += HINT_LEN_SZ;
  28956. XMEMCPY(args->output + args->idx,
  28957. ssl->arrays->server_hint, hintLen);
  28958. args->idx += hintLen;
  28959. /* add p, g, pub */
  28960. c16toa((word16)ssl->buffers.serverDH_P.length,
  28961. args->output + args->idx);
  28962. args->idx += LENGTH_SZ;
  28963. XMEMCPY(args->output + args->idx,
  28964. ssl->buffers.serverDH_P.buffer,
  28965. ssl->buffers.serverDH_P.length);
  28966. args->idx += ssl->buffers.serverDH_P.length;
  28967. /* g */
  28968. c16toa((word16)ssl->buffers.serverDH_G.length,
  28969. args->output + args->idx);
  28970. args->idx += LENGTH_SZ;
  28971. XMEMCPY(args->output + args->idx,
  28972. ssl->buffers.serverDH_G.buffer,
  28973. ssl->buffers.serverDH_G.length);
  28974. args->idx += ssl->buffers.serverDH_G.length;
  28975. /* pub */
  28976. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  28977. args->output + args->idx);
  28978. args->idx += LENGTH_SZ;
  28979. XMEMCPY(args->output + args->idx,
  28980. ssl->buffers.serverDH_Pub.buffer,
  28981. ssl->buffers.serverDH_Pub.length);
  28982. /* No need to update idx, since sizes are already set */
  28983. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  28984. break;
  28985. }
  28986. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  28987. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28988. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28989. case ecdhe_psk_kea:
  28990. {
  28991. word32 hintLen;
  28992. /* curve type, named curve, length(1) */
  28993. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  28994. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  28995. args->exportSz = MAX_EXPORT_ECC_SZ;
  28996. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  28997. ssl->heap, DYNAMIC_TYPE_DER);
  28998. if (args->exportBuf == NULL) {
  28999. ERROR_OUT(MEMORY_E, exit_sske);
  29000. }
  29001. #ifdef HAVE_CURVE25519
  29002. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  29003. if (wc_curve25519_export_public_ex(
  29004. (curve25519_key*)ssl->eccTempKey,
  29005. args->exportBuf, &args->exportSz,
  29006. EC25519_LITTLE_ENDIAN) != 0) {
  29007. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  29008. }
  29009. }
  29010. else
  29011. #endif
  29012. #ifdef HAVE_CURVE448
  29013. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  29014. if (wc_curve448_export_public_ex(
  29015. (curve448_key*)ssl->eccTempKey,
  29016. args->exportBuf, &args->exportSz,
  29017. EC448_LITTLE_ENDIAN) != 0) {
  29018. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  29019. }
  29020. }
  29021. else
  29022. #endif
  29023. {
  29024. PRIVATE_KEY_UNLOCK();
  29025. ret = wc_ecc_export_x963(ssl->eccTempKey,
  29026. args->exportBuf, &args->exportSz);
  29027. PRIVATE_KEY_LOCK();
  29028. if (ret != 0) {
  29029. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  29030. }
  29031. }
  29032. args->length += args->exportSz;
  29033. /* include size part */
  29034. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  29035. if (hintLen > MAX_PSK_ID_LEN) {
  29036. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  29037. }
  29038. args->length += hintLen + HINT_LEN_SZ;
  29039. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  29040. #ifdef WOLFSSL_DTLS
  29041. if (ssl->options.dtls) {
  29042. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29043. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29044. }
  29045. #endif
  29046. if (IsEncryptionOn(ssl, 1)) {
  29047. args->sendSz += MAX_MSG_EXTRA;
  29048. }
  29049. /* Use tmp buffer */
  29050. args->input = (byte*)XMALLOC(args->sendSz,
  29051. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29052. if (args->input == NULL)
  29053. ERROR_OUT(MEMORY_E, exit_sske);
  29054. args->output = args->input;
  29055. /* key data */
  29056. c16toa((word16)hintLen, args->output + args->idx);
  29057. args->idx += HINT_LEN_SZ;
  29058. XMEMCPY(args->output + args->idx,
  29059. ssl->arrays->server_hint, hintLen);
  29060. args->idx += hintLen;
  29061. /* ECC key exchange data */
  29062. args->output[args->idx++] = named_curve;
  29063. args->output[args->idx++] = 0x00; /* leading zero */
  29064. #ifdef HAVE_CURVE25519
  29065. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  29066. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  29067. else
  29068. #endif
  29069. #ifdef HAVE_CURVE448
  29070. if (ssl->ecdhCurveOID == ECC_X448_OID)
  29071. args->output[args->idx++] = WOLFSSL_ECC_X448;
  29072. else
  29073. #endif
  29074. {
  29075. #ifdef HAVE_ECC
  29076. args->output[args->idx++] =
  29077. SetCurveId(ssl->eccTempKey);
  29078. #endif
  29079. }
  29080. args->output[args->idx++] = (byte)args->exportSz;
  29081. XMEMCPY(args->output + args->idx, args->exportBuf,
  29082. args->exportSz);
  29083. break;
  29084. }
  29085. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  29086. #if defined(HAVE_ECC) || \
  29087. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  29088. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  29089. !defined(NO_RSA)))
  29090. case ecc_diffie_hellman_kea:
  29091. {
  29092. enum wc_HashType hashType;
  29093. word32 preSigSz, preSigIdx;
  29094. /* curve type, named curve, length(1) */
  29095. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  29096. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  29097. /* Export temp ECC key and add to length */
  29098. args->exportSz = MAX_EXPORT_ECC_SZ;
  29099. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  29100. ssl->heap, DYNAMIC_TYPE_DER);
  29101. if (args->exportBuf == NULL) {
  29102. ERROR_OUT(MEMORY_E, exit_sske);
  29103. }
  29104. #ifdef HAVE_CURVE25519
  29105. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  29106. if (wc_curve25519_export_public_ex(
  29107. (curve25519_key*)ssl->eccTempKey,
  29108. args->exportBuf, &args->exportSz,
  29109. EC25519_LITTLE_ENDIAN) != 0) {
  29110. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  29111. }
  29112. }
  29113. else
  29114. #endif
  29115. #ifdef HAVE_CURVE448
  29116. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  29117. if (wc_curve448_export_public_ex(
  29118. (curve448_key*)ssl->eccTempKey,
  29119. args->exportBuf, &args->exportSz,
  29120. EC448_LITTLE_ENDIAN) != 0) {
  29121. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  29122. }
  29123. }
  29124. else
  29125. #endif
  29126. {
  29127. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  29128. PRIVATE_KEY_UNLOCK();
  29129. ret = wc_ecc_export_x963(ssl->eccTempKey,
  29130. args->exportBuf, &args->exportSz);
  29131. PRIVATE_KEY_LOCK();
  29132. if (ret != 0) {
  29133. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  29134. }
  29135. #endif
  29136. }
  29137. args->length += args->exportSz;
  29138. preSigSz = args->length;
  29139. preSigIdx = args->idx;
  29140. if (ssl->buffers.key == NULL) {
  29141. #ifdef HAVE_PK_CALLBACKS
  29142. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  29143. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  29144. if (args->tmpSigSz == 0) {
  29145. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  29146. }
  29147. }
  29148. else
  29149. #endif
  29150. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  29151. }
  29152. else {
  29153. switch(ssl->options.sigAlgo) {
  29154. #ifndef NO_RSA
  29155. #ifdef WC_RSA_PSS
  29156. case rsa_pss_sa_algo:
  29157. #endif
  29158. case rsa_sa_algo:
  29159. {
  29160. word16 keySz;
  29161. ssl->buffers.keyType = rsa_sa_algo;
  29162. ret = DecodePrivateKey(ssl, &keySz);
  29163. if (ret != 0) {
  29164. goto exit_sske;
  29165. }
  29166. args->tmpSigSz = (word32)keySz;
  29167. break;
  29168. }
  29169. #endif /* !NO_RSA */
  29170. #ifdef HAVE_ECC
  29171. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  29172. case sm2_sa_algo:
  29173. #endif
  29174. case ecc_dsa_sa_algo:
  29175. {
  29176. word16 keySz;
  29177. ssl->buffers.keyType = ecc_dsa_sa_algo;
  29178. ret = DecodePrivateKey(ssl, &keySz);
  29179. if (ret != 0) {
  29180. goto exit_sske;
  29181. }
  29182. /* worst case estimate */
  29183. args->tmpSigSz = keySz;
  29184. break;
  29185. }
  29186. #endif
  29187. #ifdef HAVE_ED25519
  29188. case ed25519_sa_algo:
  29189. {
  29190. word16 keySz;
  29191. ssl->buffers.keyType = ed25519_sa_algo;
  29192. ret = DecodePrivateKey(ssl, &keySz);
  29193. if (ret != 0) {
  29194. goto exit_sske;
  29195. }
  29196. /* worst case estimate */
  29197. args->tmpSigSz = ED25519_SIG_SIZE;
  29198. break;
  29199. }
  29200. #endif /* HAVE_ED25519 */
  29201. #ifdef HAVE_ED448
  29202. case ed448_sa_algo:
  29203. {
  29204. word16 keySz;
  29205. ssl->buffers.keyType = ed448_sa_algo;
  29206. ret = DecodePrivateKey(ssl, &keySz);
  29207. if (ret != 0) {
  29208. goto exit_sske;
  29209. }
  29210. /* worst case estimate */
  29211. args->tmpSigSz = ED448_SIG_SIZE;
  29212. break;
  29213. }
  29214. #endif /* HAVE_ED448 */
  29215. default:
  29216. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  29217. } /* switch(ssl->specs.sig_algo) */
  29218. }
  29219. /* sig length */
  29220. args->length += LENGTH_SZ;
  29221. args->length += args->tmpSigSz;
  29222. if (IsAtLeastTLSv1_2(ssl)) {
  29223. args->length += HASH_SIG_SIZE;
  29224. }
  29225. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  29226. #ifdef WOLFSSL_DTLS
  29227. if (ssl->options.dtls) {
  29228. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29229. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29230. preSigIdx = args->idx;
  29231. }
  29232. #endif
  29233. if (IsEncryptionOn(ssl, 1)) {
  29234. args->sendSz += MAX_MSG_EXTRA;
  29235. }
  29236. /* Use tmp buffer */
  29237. args->input = (byte*)XMALLOC(args->sendSz,
  29238. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29239. if (args->input == NULL)
  29240. ERROR_OUT(MEMORY_E, exit_sske);
  29241. args->output = args->input;
  29242. /* record and message headers will be added below, when we're sure
  29243. of the sig length */
  29244. /* key exchange data */
  29245. args->output[args->idx++] = named_curve;
  29246. args->output[args->idx++] = 0x00; /* leading zero */
  29247. #ifdef HAVE_CURVE25519
  29248. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  29249. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  29250. else
  29251. #endif
  29252. #ifdef HAVE_CURVE448
  29253. if (ssl->ecdhCurveOID == ECC_X448_OID)
  29254. args->output[args->idx++] = WOLFSSL_ECC_X448;
  29255. else
  29256. #endif
  29257. {
  29258. #ifdef HAVE_ECC
  29259. args->output[args->idx++] =
  29260. SetCurveId(ssl->eccTempKey);
  29261. #endif
  29262. }
  29263. args->output[args->idx++] = (byte)args->exportSz;
  29264. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  29265. args->idx += args->exportSz;
  29266. /* Determine hash type */
  29267. if (IsAtLeastTLSv1_2(ssl)) {
  29268. EncodeSigAlg(ssl->options.hashAlgo,
  29269. ssl->options.sigAlgo,
  29270. &args->output[args->idx]);
  29271. args->idx += 2;
  29272. hashType = HashAlgoToType(ssl->options.hashAlgo);
  29273. if (hashType == WC_HASH_TYPE_NONE) {
  29274. ERROR_OUT(ALGO_ID_E, exit_sske);
  29275. }
  29276. } else {
  29277. /* only using sha and md5 for rsa */
  29278. #ifndef NO_OLD_TLS
  29279. hashType = WC_HASH_TYPE_SHA;
  29280. if (ssl->options.sigAlgo == rsa_sa_algo) {
  29281. hashType = WC_HASH_TYPE_MD5_SHA;
  29282. }
  29283. #else
  29284. ERROR_OUT(ALGO_ID_E, exit_sske);
  29285. #endif
  29286. }
  29287. /* Signature length will be written later, when we're sure what it is */
  29288. #ifdef HAVE_FUZZER
  29289. if (ssl->fuzzerCb) {
  29290. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  29291. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  29292. }
  29293. #endif
  29294. ret = HashSkeData(ssl, hashType,
  29295. args->output + preSigIdx, preSigSz,
  29296. ssl->options.sigAlgo);
  29297. if (ret != 0) {
  29298. goto exit_sske;
  29299. }
  29300. args->sigSz = args->tmpSigSz;
  29301. /* Sign hash to create signature */
  29302. switch (ssl->options.sigAlgo)
  29303. {
  29304. #ifndef NO_RSA
  29305. case rsa_sa_algo:
  29306. {
  29307. /* For TLS 1.2 re-encode signature */
  29308. if (IsAtLeastTLSv1_2(ssl)) {
  29309. byte* encodedSig = (byte*)XMALLOC(
  29310. MAX_ENCODED_SIG_SZ, ssl->heap,
  29311. DYNAMIC_TYPE_DIGEST);
  29312. if (encodedSig == NULL) {
  29313. ERROR_OUT(MEMORY_E, exit_sske);
  29314. }
  29315. ssl->buffers.digest.length =
  29316. wc_EncodeSignature(encodedSig,
  29317. ssl->buffers.digest.buffer,
  29318. ssl->buffers.digest.length,
  29319. TypeHash(ssl->options.hashAlgo));
  29320. /* Replace sig buffer with new one */
  29321. if (!ssl->options.dontFreeDigest) {
  29322. XFREE(ssl->buffers.digest.buffer,
  29323. ssl->heap, DYNAMIC_TYPE_DIGEST);
  29324. }
  29325. ssl->options.dontFreeDigest = 0;
  29326. ssl->buffers.digest.buffer = encodedSig;
  29327. }
  29328. /* write sig size here */
  29329. c16toa((word16)args->sigSz,
  29330. args->output + args->idx);
  29331. args->idx += LENGTH_SZ;
  29332. break;
  29333. }
  29334. #ifdef WC_RSA_PSS
  29335. case rsa_pss_sa_algo:
  29336. /* write sig size here */
  29337. c16toa((word16)args->sigSz,
  29338. args->output + args->idx);
  29339. args->idx += LENGTH_SZ;
  29340. break;
  29341. #endif
  29342. #endif /* !NO_RSA */
  29343. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  29344. case sm2_sa_algo:
  29345. #endif
  29346. case ecc_dsa_sa_algo:
  29347. {
  29348. break;
  29349. }
  29350. #ifdef HAVE_ED25519
  29351. case ed25519_sa_algo:
  29352. ret = Ed25519CheckPubKey(ssl);
  29353. if (ret != 0)
  29354. goto exit_sske;
  29355. break;
  29356. #endif /* HAVE_ED25519 */
  29357. #ifdef HAVE_ED448
  29358. case ed448_sa_algo:
  29359. ret = Ed448CheckPubKey(ssl);
  29360. if (ret != 0)
  29361. goto exit_sske;
  29362. break;
  29363. #endif /* HAVE_ED448 */
  29364. default:
  29365. break;
  29366. } /* switch(ssl->specs.sig_algo) */
  29367. break;
  29368. }
  29369. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  29370. #if !defined(NO_DH) && (!defined(NO_RSA) || \
  29371. (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  29372. case diffie_hellman_kea:
  29373. {
  29374. enum wc_HashType hashType;
  29375. word32 preSigSz, preSigIdx;
  29376. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  29377. args->length = LENGTH_SZ * 3; /* p, g, pub */
  29378. args->length += ssl->buffers.serverDH_P.length +
  29379. ssl->buffers.serverDH_G.length +
  29380. ssl->buffers.serverDH_Pub.length;
  29381. preSigIdx = args->idx;
  29382. preSigSz = args->length;
  29383. if (!ssl->options.usingAnon_cipher) {
  29384. word16 keySz = 0;
  29385. /* sig length */
  29386. args->length += LENGTH_SZ;
  29387. if (ssl->buffers.key == NULL) {
  29388. #ifdef HAVE_PK_CALLBACKS
  29389. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  29390. keySz = (word32)GetPrivateKeySigSize(ssl);
  29391. else
  29392. #endif
  29393. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  29394. }
  29395. else
  29396. {
  29397. if (ssl->buffers.keyType == 0)
  29398. ssl->buffers.keyType = rsa_sa_algo;
  29399. ret = DecodePrivateKey(ssl, &keySz);
  29400. if (ret != 0) {
  29401. goto exit_sske;
  29402. }
  29403. }
  29404. /* test if keySz has error */
  29405. if (keySz == 0) {
  29406. ERROR_OUT(keySz, exit_sske);
  29407. }
  29408. args->tmpSigSz = (word32)keySz;
  29409. args->length += args->tmpSigSz;
  29410. if (IsAtLeastTLSv1_2(ssl)) {
  29411. args->length += HASH_SIG_SIZE;
  29412. }
  29413. }
  29414. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  29415. RECORD_HEADER_SZ;
  29416. #ifdef WOLFSSL_DTLS
  29417. if (ssl->options.dtls) {
  29418. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29419. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29420. preSigIdx = args->idx;
  29421. }
  29422. #endif
  29423. if (IsEncryptionOn(ssl, 1)) {
  29424. args->sendSz += MAX_MSG_EXTRA;
  29425. }
  29426. /* Use tmp buffer */
  29427. args->input = (byte*)XMALLOC(args->sendSz,
  29428. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29429. if (args->input == NULL)
  29430. ERROR_OUT(MEMORY_E, exit_sske);
  29431. args->output = args->input;
  29432. AddHeaders(args->output, args->length,
  29433. server_key_exchange, ssl);
  29434. /* add p, g, pub */
  29435. c16toa((word16)ssl->buffers.serverDH_P.length,
  29436. args->output + args->idx);
  29437. args->idx += LENGTH_SZ;
  29438. XMEMCPY(args->output + args->idx,
  29439. ssl->buffers.serverDH_P.buffer,
  29440. ssl->buffers.serverDH_P.length);
  29441. args->idx += ssl->buffers.serverDH_P.length;
  29442. /* g */
  29443. c16toa((word16)ssl->buffers.serverDH_G.length,
  29444. args->output + args->idx);
  29445. args->idx += LENGTH_SZ;
  29446. XMEMCPY(args->output + args->idx,
  29447. ssl->buffers.serverDH_G.buffer,
  29448. ssl->buffers.serverDH_G.length);
  29449. args->idx += ssl->buffers.serverDH_G.length;
  29450. /* pub */
  29451. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  29452. args->output + args->idx);
  29453. args->idx += LENGTH_SZ;
  29454. XMEMCPY(args->output + args->idx,
  29455. ssl->buffers.serverDH_Pub.buffer,
  29456. ssl->buffers.serverDH_Pub.length);
  29457. args->idx += ssl->buffers.serverDH_Pub.length;
  29458. #ifdef HAVE_FUZZER
  29459. if (ssl->fuzzerCb) {
  29460. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  29461. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  29462. }
  29463. #endif
  29464. if (ssl->options.usingAnon_cipher) {
  29465. break;
  29466. }
  29467. /* Determine hash type */
  29468. if (IsAtLeastTLSv1_2(ssl)) {
  29469. EncodeSigAlg(ssl->options.hashAlgo,
  29470. ssl->options.sigAlgo,
  29471. &args->output[args->idx]);
  29472. args->idx += 2;
  29473. hashType = HashAlgoToType(ssl->options.hashAlgo);
  29474. if (hashType == WC_HASH_TYPE_NONE) {
  29475. ERROR_OUT(ALGO_ID_E, exit_sske);
  29476. }
  29477. } else {
  29478. /* only using sha and md5 for rsa */
  29479. #ifndef NO_OLD_TLS
  29480. hashType = WC_HASH_TYPE_SHA;
  29481. if (ssl->options.sigAlgo == rsa_sa_algo) {
  29482. hashType = WC_HASH_TYPE_MD5_SHA;
  29483. }
  29484. #else
  29485. ERROR_OUT(ALGO_ID_E, exit_sske);
  29486. #endif
  29487. }
  29488. /* signature size */
  29489. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  29490. args->idx += LENGTH_SZ;
  29491. ret = HashSkeData(ssl, hashType,
  29492. args->output + preSigIdx, preSigSz,
  29493. ssl->options.sigAlgo);
  29494. if (ret != 0) {
  29495. goto exit_sske;
  29496. }
  29497. args->sigSz = args->tmpSigSz;
  29498. /* Sign hash to create signature */
  29499. switch (ssl->options.sigAlgo)
  29500. {
  29501. #ifndef NO_RSA
  29502. case rsa_sa_algo:
  29503. {
  29504. /* For TLS 1.2 re-encode signature */
  29505. if (IsAtLeastTLSv1_2(ssl)) {
  29506. byte* encodedSig = (byte*)XMALLOC(
  29507. MAX_ENCODED_SIG_SZ, ssl->heap,
  29508. DYNAMIC_TYPE_DIGEST);
  29509. if (encodedSig == NULL) {
  29510. ERROR_OUT(MEMORY_E, exit_sske);
  29511. }
  29512. ssl->buffers.digest.length =
  29513. wc_EncodeSignature(encodedSig,
  29514. ssl->buffers.digest.buffer,
  29515. ssl->buffers.digest.length,
  29516. TypeHash(ssl->options.hashAlgo));
  29517. /* Replace sig buffer with new one */
  29518. if (!ssl->options.dontFreeDigest) {
  29519. XFREE(ssl->buffers.digest.buffer,
  29520. ssl->heap, DYNAMIC_TYPE_DIGEST);
  29521. }
  29522. ssl->options.dontFreeDigest = 0;
  29523. ssl->buffers.digest.buffer = encodedSig;
  29524. }
  29525. break;
  29526. }
  29527. #endif /* NO_RSA */
  29528. default:
  29529. break;
  29530. } /* switch (ssl->options.sigAlgo) */
  29531. break;
  29532. }
  29533. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  29534. default:
  29535. break;
  29536. } /* switch(ssl->specs.kea) */
  29537. /* Check for error */
  29538. if (ret != 0) {
  29539. goto exit_sske;
  29540. }
  29541. /* Advance state and proceed */
  29542. ssl->options.asyncState = TLS_ASYNC_DO;
  29543. } /* case TLS_ASYNC_BUILD */
  29544. FALL_THROUGH;
  29545. case TLS_ASYNC_DO:
  29546. {
  29547. switch(ssl->specs.kea)
  29548. {
  29549. #ifndef NO_PSK
  29550. case psk_kea:
  29551. {
  29552. break;
  29553. }
  29554. #endif /* !NO_PSK */
  29555. #if !defined(NO_DH) && !defined(NO_PSK)
  29556. case dhe_psk_kea:
  29557. {
  29558. break;
  29559. }
  29560. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  29561. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  29562. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  29563. case ecdhe_psk_kea:
  29564. {
  29565. break;
  29566. }
  29567. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  29568. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  29569. defined(HAVE_CURVE448)
  29570. case ecc_diffie_hellman_kea:
  29571. {
  29572. /* Sign hash to create signature */
  29573. switch (ssl->options.sigAlgo)
  29574. {
  29575. #ifndef NO_RSA
  29576. #ifdef WC_RSA_PSS
  29577. case rsa_pss_sa_algo:
  29578. #endif
  29579. case rsa_sa_algo:
  29580. {
  29581. RsaKey* key = (RsaKey*)ssl->hsKey;
  29582. ret = RsaSign(ssl,
  29583. ssl->buffers.digest.buffer,
  29584. ssl->buffers.digest.length,
  29585. args->output + args->idx,
  29586. &args->sigSz,
  29587. ssl->options.sigAlgo, ssl->options.hashAlgo,
  29588. key,
  29589. ssl->buffers.key
  29590. );
  29591. break;
  29592. }
  29593. #endif /* !NO_RSA */
  29594. #ifdef HAVE_ECC
  29595. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  29596. case sm2_sa_algo:
  29597. {
  29598. ecc_key* key = (ecc_key*)ssl->hsKey;
  29599. ret = Sm2wSm3Sign(ssl,
  29600. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  29601. ssl->buffers.sig.buffer,
  29602. ssl->buffers.sig.length,
  29603. args->output + LENGTH_SZ + args->idx,
  29604. &args->sigSz,
  29605. key,
  29606. #ifdef HAVE_PK_CALLBACKS
  29607. ssl->buffers.key
  29608. #else
  29609. NULL
  29610. #endif
  29611. );
  29612. break;
  29613. }
  29614. #endif
  29615. case ecc_dsa_sa_algo:
  29616. {
  29617. ecc_key* key = (ecc_key*)ssl->hsKey;
  29618. ret = EccSign(ssl,
  29619. ssl->buffers.digest.buffer,
  29620. ssl->buffers.digest.length,
  29621. args->output + LENGTH_SZ + args->idx,
  29622. &args->sigSz,
  29623. key,
  29624. #ifdef HAVE_PK_CALLBACKS
  29625. ssl->buffers.key
  29626. #else
  29627. NULL
  29628. #endif
  29629. );
  29630. break;
  29631. }
  29632. #endif /* HAVE_ECC */
  29633. #ifdef HAVE_ED25519
  29634. case ed25519_sa_algo:
  29635. {
  29636. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  29637. ret = Ed25519Sign(ssl,
  29638. ssl->buffers.sig.buffer,
  29639. ssl->buffers.sig.length,
  29640. args->output + LENGTH_SZ + args->idx,
  29641. &args->sigSz,
  29642. key,
  29643. #ifdef HAVE_PK_CALLBACKS
  29644. ssl->buffers.key
  29645. #else
  29646. NULL
  29647. #endif
  29648. );
  29649. break;
  29650. }
  29651. #endif
  29652. #ifdef HAVE_ED448
  29653. case ed448_sa_algo:
  29654. {
  29655. ed448_key* key = (ed448_key*)ssl->hsKey;
  29656. ret = Ed448Sign(ssl,
  29657. ssl->buffers.sig.buffer,
  29658. ssl->buffers.sig.length,
  29659. args->output + LENGTH_SZ + args->idx,
  29660. &args->sigSz,
  29661. key,
  29662. #ifdef HAVE_PK_CALLBACKS
  29663. ssl->buffers.key
  29664. #else
  29665. NULL
  29666. #endif
  29667. );
  29668. break;
  29669. }
  29670. #endif
  29671. default:
  29672. ERROR_OUT(ALGO_ID_E, exit_sske);
  29673. } /* switch(ssl->specs.sig_algo) */
  29674. break;
  29675. }
  29676. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  29677. #if !defined(NO_DH) && !defined(NO_RSA)
  29678. case diffie_hellman_kea:
  29679. {
  29680. /* Sign hash to create signature */
  29681. switch (ssl->options.sigAlgo)
  29682. {
  29683. #ifndef NO_RSA
  29684. #ifdef WC_RSA_PSS
  29685. case rsa_pss_sa_algo:
  29686. #endif
  29687. case rsa_sa_algo:
  29688. {
  29689. RsaKey* key = (RsaKey*)ssl->hsKey;
  29690. if (ssl->options.usingAnon_cipher) {
  29691. break;
  29692. }
  29693. ret = RsaSign(ssl,
  29694. ssl->buffers.digest.buffer,
  29695. ssl->buffers.digest.length,
  29696. args->output + args->idx,
  29697. &args->sigSz,
  29698. ssl->options.sigAlgo, ssl->options.hashAlgo,
  29699. key,
  29700. ssl->buffers.key
  29701. );
  29702. break;
  29703. }
  29704. #endif /* NO_RSA */
  29705. default:
  29706. break;
  29707. } /* switch (ssl->options.sigAlgo) */
  29708. break;
  29709. }
  29710. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  29711. default:
  29712. break;
  29713. } /* switch(ssl->specs.kea) */
  29714. /* Check for error */
  29715. if (ret != 0) {
  29716. goto exit_sske;
  29717. }
  29718. /* Advance state and proceed */
  29719. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  29720. } /* case TLS_ASYNC_DO */
  29721. FALL_THROUGH;
  29722. case TLS_ASYNC_VERIFY:
  29723. {
  29724. switch(ssl->specs.kea)
  29725. {
  29726. #ifndef NO_PSK
  29727. case psk_kea:
  29728. {
  29729. /* Nothing to do in this sub-state */
  29730. break;
  29731. }
  29732. #endif /* !NO_PSK */
  29733. #if !defined(NO_DH) && !defined(NO_PSK)
  29734. case dhe_psk_kea:
  29735. {
  29736. /* Nothing to do in this sub-state */
  29737. break;
  29738. }
  29739. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  29740. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  29741. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  29742. case ecdhe_psk_kea:
  29743. {
  29744. /* Nothing to do in this sub-state */
  29745. break;
  29746. }
  29747. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  29748. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  29749. defined(HAVE_CURVE448)
  29750. case ecc_diffie_hellman_kea:
  29751. {
  29752. switch(ssl->options.sigAlgo)
  29753. {
  29754. #ifndef NO_RSA
  29755. #ifdef WC_RSA_PSS
  29756. case rsa_pss_sa_algo:
  29757. #endif
  29758. case rsa_sa_algo:
  29759. {
  29760. RsaKey* key = (RsaKey*)ssl->hsKey;
  29761. if (args->verifySig == NULL) {
  29762. if (args->sigSz == 0) {
  29763. ERROR_OUT(BAD_COND_E, exit_sske);
  29764. }
  29765. args->verifySig = (byte*)XMALLOC(
  29766. args->sigSz, ssl->heap,
  29767. DYNAMIC_TYPE_SIGNATURE);
  29768. if (!args->verifySig) {
  29769. ERROR_OUT(MEMORY_E, exit_sske);
  29770. }
  29771. XMEMCPY(args->verifySig,
  29772. args->output + args->idx, args->sigSz);
  29773. }
  29774. /* check for signature faults */
  29775. ret = VerifyRsaSign(ssl,
  29776. args->verifySig, args->sigSz,
  29777. ssl->buffers.digest.buffer,
  29778. ssl->buffers.digest.length,
  29779. ssl->options.sigAlgo, ssl->options.hashAlgo,
  29780. key, ssl->buffers.key
  29781. );
  29782. break;
  29783. }
  29784. #endif
  29785. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  29786. case sm2_sa_algo:
  29787. #endif /* WOLFSSL_SM2 */
  29788. case ecc_dsa_sa_algo:
  29789. #ifdef WOLFSSL_CHECK_SIG_FAULTS
  29790. {
  29791. ecc_key* key = (ecc_key*)ssl->hsKey;
  29792. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  29793. if (ssl->options.sigAlgo == sm2_sa_algo) {
  29794. ret = Sm2wSm3Verify(ssl,
  29795. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  29796. args->output + LENGTH_SZ + args->idx,
  29797. args->sigSz,
  29798. ssl->buffers.sig.buffer,
  29799. ssl->buffers.sig.length,
  29800. key,
  29801. #ifdef HAVE_PK_CALLBACKS
  29802. ssl->buffers.key
  29803. #else
  29804. NULL
  29805. #endif
  29806. );
  29807. }
  29808. else
  29809. #endif /* WOLFSSL_SM2 */
  29810. {
  29811. ret = EccVerify(ssl,
  29812. args->output + LENGTH_SZ + args->idx,
  29813. args->sigSz,
  29814. ssl->buffers.digest.buffer,
  29815. ssl->buffers.digest.length,
  29816. key,
  29817. #ifdef HAVE_PK_CALLBACKS
  29818. ssl->buffers.key
  29819. #else
  29820. NULL
  29821. #endif
  29822. );
  29823. }
  29824. if (ret != 0) {
  29825. WOLFSSL_MSG(
  29826. "Failed to verify ECC signature");
  29827. goto exit_sske;
  29828. }
  29829. }
  29830. #if defined(HAVE_E25519) || defined(HAVE_ED448)
  29831. FALL_THROUGH;
  29832. #endif
  29833. #endif /* WOLFSSL_CHECK_SIG_FAULTS */
  29834. #ifdef HAVE_ED25519
  29835. case ed25519_sa_algo:
  29836. #endif
  29837. #ifdef HAVE_ED448
  29838. case ed448_sa_algo:
  29839. #endif
  29840. {
  29841. /* Now that we know the real sig size, write it. */
  29842. c16toa((word16)args->sigSz,
  29843. args->output + args->idx);
  29844. /* And adjust length and sendSz from estimates */
  29845. args->length += args->sigSz - args->tmpSigSz;
  29846. args->sendSz += args->sigSz - args->tmpSigSz;
  29847. break;
  29848. }
  29849. default:
  29850. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  29851. } /* switch(ssl->specs.sig_algo) */
  29852. break;
  29853. }
  29854. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  29855. #if !defined(NO_DH) && !defined(NO_RSA)
  29856. case diffie_hellman_kea:
  29857. {
  29858. switch (ssl->options.sigAlgo)
  29859. {
  29860. #ifndef NO_RSA
  29861. #ifndef WC_RSA_PSS
  29862. case rsa_pss_sa_algo:
  29863. #endif
  29864. case rsa_sa_algo:
  29865. {
  29866. RsaKey* key = (RsaKey*)ssl->hsKey;
  29867. if (ssl->options.usingAnon_cipher) {
  29868. break;
  29869. }
  29870. if (args->verifySig == NULL) {
  29871. if (args->sigSz == 0) {
  29872. ERROR_OUT(BAD_COND_E, exit_sske);
  29873. }
  29874. args->verifySig = (byte*)XMALLOC(
  29875. args->sigSz, ssl->heap,
  29876. DYNAMIC_TYPE_SIGNATURE);
  29877. if (!args->verifySig) {
  29878. ERROR_OUT(MEMORY_E, exit_sske);
  29879. }
  29880. XMEMCPY(args->verifySig,
  29881. args->output + args->idx, args->sigSz);
  29882. }
  29883. /* check for signature faults */
  29884. ret = VerifyRsaSign(ssl,
  29885. args->verifySig, args->sigSz,
  29886. ssl->buffers.digest.buffer,
  29887. ssl->buffers.digest.length,
  29888. ssl->options.sigAlgo, ssl->options.hashAlgo,
  29889. key, ssl->buffers.key
  29890. );
  29891. break;
  29892. }
  29893. #endif
  29894. } /* switch (ssl->options.sigAlgo) */
  29895. break;
  29896. }
  29897. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  29898. default:
  29899. break;
  29900. } /* switch(ssl->specs.kea) */
  29901. /* Check for error */
  29902. if (ret != 0) {
  29903. goto exit_sske;
  29904. }
  29905. /* Advance state and proceed */
  29906. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  29907. } /* case TLS_ASYNC_VERIFY */
  29908. FALL_THROUGH;
  29909. case TLS_ASYNC_FINALIZE:
  29910. {
  29911. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  29912. defined(HAVE_CURVE448)
  29913. if (ssl->specs.kea == ecdhe_psk_kea ||
  29914. ssl->specs.kea == ecc_diffie_hellman_kea) {
  29915. /* Check output to make sure it was set */
  29916. if (args->output) {
  29917. AddHeaders(args->output, args->length,
  29918. server_key_exchange, ssl);
  29919. }
  29920. else {
  29921. ERROR_OUT(BUFFER_ERROR, exit_sske);
  29922. }
  29923. }
  29924. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  29925. /* Advance state and proceed */
  29926. ssl->options.asyncState = TLS_ASYNC_END;
  29927. } /* case TLS_ASYNC_FINALIZE */
  29928. FALL_THROUGH;
  29929. case TLS_ASYNC_END:
  29930. {
  29931. ret = SendHandshakeMsg(ssl, args->output, args->length,
  29932. server_key_exchange, "ServerKeyExchange");
  29933. if (ret != 0)
  29934. goto exit_sske;
  29935. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  29936. break;
  29937. }
  29938. default:
  29939. ret = INPUT_CASE_ERROR;
  29940. } /* switch(ssl->options.asyncState) */
  29941. exit_sske:
  29942. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  29943. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  29944. #ifdef WOLFSSL_ASYNC_IO
  29945. /* Handle async operation */
  29946. if (ret == WANT_WRITE
  29947. #ifdef WOLFSSL_ASYNC_CRYPT
  29948. || ret == WC_PENDING_E
  29949. #endif
  29950. )
  29951. return ret;
  29952. #endif /* WOLFSSL_ASYNC_IO */
  29953. /* Final cleanup */
  29954. if (
  29955. #ifdef WOLFSSL_ASYNC_IO
  29956. args != NULL &&
  29957. #endif
  29958. args->input != NULL) {
  29959. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29960. args->input = NULL;
  29961. }
  29962. #ifdef WOLFSSL_ASYNC_IO
  29963. /* Cleanup async */
  29964. FreeAsyncCtx(ssl, 0);
  29965. #else
  29966. FreeSskeArgs(ssl, args);
  29967. #endif
  29968. FreeKeyExchange(ssl);
  29969. if (ret != 0) {
  29970. WOLFSSL_ERROR_VERBOSE(ret);
  29971. }
  29972. return ret;
  29973. }
  29974. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  29975. defined(OPENSSL_ALL)
  29976. /* search suites for specific one, idx on success, negative on error */
  29977. static int FindSuite(Suites* suites, byte first, byte second)
  29978. {
  29979. int i;
  29980. if (suites == NULL || suites->suiteSz == 0) {
  29981. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  29982. return SUITES_ERROR;
  29983. }
  29984. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  29985. if (suites->suites[i] == first &&
  29986. suites->suites[i+1] == second )
  29987. return i;
  29988. }
  29989. return MATCH_SUITE_ERROR;
  29990. }
  29991. #endif
  29992. #endif /* !WOLFSSL_NO_TLS12 */
  29993. /* Make sure server cert/key are valid for this suite, true on success
  29994. * Returns 1 for valid server suite or 0 if not found
  29995. * For asynchronous this can return WC_PENDING_E
  29996. */
  29997. static int VerifyServerSuite(const WOLFSSL* ssl, const Suites* suites,
  29998. word16 idx, CipherSuite* cs, TLSX* extensions)
  29999. {
  30000. #ifndef NO_PSK
  30001. int havePSK = ssl->options.havePSK;
  30002. #endif
  30003. byte first;
  30004. byte second;
  30005. (void)cs;
  30006. (void)extensions;
  30007. WOLFSSL_ENTER("VerifyServerSuite");
  30008. if (suites == NULL) {
  30009. WOLFSSL_MSG("Suites pointer error");
  30010. return 0;
  30011. }
  30012. first = suites->suites[idx];
  30013. second = suites->suites[idx+1];
  30014. if (CipherRequires(first, second, REQUIRES_RSA)) {
  30015. WOLFSSL_MSG("Requires RSA");
  30016. if (ssl->options.haveRSA == 0) {
  30017. WOLFSSL_MSG("Don't have RSA");
  30018. return 0;
  30019. }
  30020. }
  30021. if (CipherRequires(first, second, REQUIRES_DHE)) {
  30022. WOLFSSL_MSG("Requires DHE");
  30023. if (ssl->options.haveDH == 0) {
  30024. WOLFSSL_MSG("Don't have DHE");
  30025. return 0;
  30026. }
  30027. }
  30028. if (CipherRequires(first, second, REQUIRES_ECC)) {
  30029. WOLFSSL_MSG("Requires ECC");
  30030. if (ssl->options.haveECC == 0) {
  30031. WOLFSSL_MSG("Don't have ECC");
  30032. return 0;
  30033. }
  30034. }
  30035. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  30036. WOLFSSL_MSG("Requires static ECC");
  30037. if (ssl->options.haveStaticECC == 0) {
  30038. WOLFSSL_MSG("Don't have static ECC");
  30039. return 0;
  30040. }
  30041. }
  30042. if (CipherRequires(first, second, REQUIRES_PSK)) {
  30043. WOLFSSL_MSG("Requires PSK");
  30044. #ifndef NO_PSK
  30045. if (havePSK == 0)
  30046. #endif
  30047. {
  30048. WOLFSSL_MSG("Don't have PSK");
  30049. return 0;
  30050. }
  30051. }
  30052. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  30053. WOLFSSL_MSG("Requires RSA Signature");
  30054. if (ssl->options.side == WOLFSSL_SERVER_END &&
  30055. ssl->options.haveECDSAsig == 1) {
  30056. WOLFSSL_MSG("Don't have RSA Signature");
  30057. return 0;
  30058. }
  30059. }
  30060. #if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
  30061. if (CipherRequires(first, second, REQUIRES_AEAD)) {
  30062. WOLFSSL_MSG("Requires AEAD");
  30063. if (ssl->version.major == SSLv3_MAJOR &&
  30064. ssl->version.minor < TLSv1_2_MINOR) {
  30065. WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
  30066. return 0;
  30067. }
  30068. }
  30069. #endif
  30070. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  30071. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  30072. if (!TLSX_ValidateSupportedCurves(ssl, first, second,
  30073. &cs->ecdhCurveOID)) {
  30074. WOLFSSL_MSG("Don't have matching curves");
  30075. return 0;
  30076. }
  30077. #endif
  30078. #ifdef WOLFSSL_TLS13
  30079. if (IsAtLeastTLSv1_3(ssl->version) &&
  30080. ssl->options.side == WOLFSSL_SERVER_END) {
  30081. #ifdef HAVE_SUPPORTED_CURVES
  30082. byte searched = 0;
  30083. int ret = TLSX_KeyShare_Choose(ssl, extensions, first, second,
  30084. &cs->clientKSE, &searched);
  30085. if (ret == MEMORY_E) {
  30086. WOLFSSL_MSG("TLSX_KeyShare_Choose() failed in "
  30087. "VerifyServerSuite() with MEMORY_E");
  30088. return 0;
  30089. }
  30090. if (cs->clientKSE == NULL && searched)
  30091. cs->doHelloRetry = 1;
  30092. #ifdef WOLFSSL_ASYNC_CRYPT
  30093. if (ret == WC_PENDING_E)
  30094. return ret;
  30095. #endif
  30096. if (!cs->doHelloRetry && ret != 0)
  30097. return 0; /* not found */
  30098. #endif /* HAVE_SUPPORTED_CURVES */
  30099. }
  30100. else if ((first == TLS13_BYTE) || ((first == ECC_BYTE) &&
  30101. ((second == TLS_SHA256_SHA256) ||
  30102. (second == TLS_SHA384_SHA384))) ||
  30103. ((first == CIPHER_BYTE) && ((second == TLS_SM4_GCM_SM3) ||
  30104. (second == TLS_SM4_CCM_SM3)))) {
  30105. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  30106. * version. */
  30107. return 0;
  30108. }
  30109. #endif /* WOLFSSL_TLS13 */
  30110. return 1;
  30111. }
  30112. static int CompareSuites(const WOLFSSL* ssl, const Suites* suites,
  30113. Suites* peerSuites, word16 i, word16 j,
  30114. CipherSuite* cs, TLSX* extensions)
  30115. {
  30116. if (suites->suites[i] == peerSuites->suites[j] &&
  30117. suites->suites[i+1] == peerSuites->suites[j+1] ) {
  30118. int ret = VerifyServerSuite(ssl, suites, i, cs, extensions);
  30119. if (ret < 0) {
  30120. return ret;
  30121. }
  30122. if (ret) {
  30123. WOLFSSL_MSG("Verified suite validity");
  30124. cs->cipherSuite0 = suites->suites[i];
  30125. cs->cipherSuite = suites->suites[i+1];
  30126. return 0;
  30127. }
  30128. else {
  30129. WOLFSSL_MSG("Could not verify suite validity, continue");
  30130. }
  30131. }
  30132. return MATCH_SUITE_ERROR;
  30133. }
  30134. int MatchSuite_ex(const WOLFSSL* ssl, Suites* peerSuites, CipherSuite* cs,
  30135. TLSX* extensions)
  30136. {
  30137. int ret;
  30138. word16 i, j;
  30139. const Suites* suites = WOLFSSL_SUITES(ssl);
  30140. WOLFSSL_ENTER("MatchSuite");
  30141. /* & 0x1 equivalent % 2 */
  30142. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  30143. return BUFFER_ERROR;
  30144. if (suites == NULL)
  30145. return SUITES_ERROR;
  30146. if (!ssl->options.useClientOrder) {
  30147. /* Server order */
  30148. for (i = 0; i < suites->suiteSz; i += 2) {
  30149. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  30150. ret = CompareSuites(ssl, suites, peerSuites, i, j, cs, extensions);
  30151. if (ret != MATCH_SUITE_ERROR)
  30152. return ret;
  30153. }
  30154. }
  30155. }
  30156. else {
  30157. /* Client order */
  30158. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  30159. for (i = 0; i < suites->suiteSz; i += 2) {
  30160. ret = CompareSuites(ssl, suites, peerSuites, i, j, cs, extensions);
  30161. if (ret != MATCH_SUITE_ERROR)
  30162. return ret;
  30163. }
  30164. }
  30165. }
  30166. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  30167. return MATCH_SUITE_ERROR;
  30168. }
  30169. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  30170. {
  30171. int ret;
  30172. CipherSuite cs;
  30173. XMEMSET(&cs, 0, sizeof(cs));
  30174. ret = MatchSuite_ex(ssl, peerSuites, &cs,
  30175. #ifdef HAVE_TLS_EXTENSIONS
  30176. ssl->extensions
  30177. #else
  30178. NULL
  30179. #endif
  30180. );
  30181. if (ret != 0)
  30182. return ret;
  30183. ssl->options.cipherSuite0 = cs.cipherSuite0;
  30184. ssl->options.cipherSuite = cs.cipherSuite;
  30185. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_CURVE25519) || \
  30186. defined(HAVE_ED448) || defined(HAVE_CURVE448)
  30187. ssl->ecdhCurveOID = cs.ecdhCurveOID;
  30188. #endif
  30189. ret = SetCipherSpecs(ssl);
  30190. if (ret != 0)
  30191. return ret;
  30192. ret = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  30193. peerSuites->hashSigAlgoSz);
  30194. if (ret != 0)
  30195. return ret;
  30196. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  30197. if (cs.doHelloRetry) {
  30198. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  30199. return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
  30200. }
  30201. #endif
  30202. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  30203. if (IsAtLeastTLSv1_3(ssl->version) &&
  30204. ssl->options.side == WOLFSSL_SERVER_END) {
  30205. ret = TLSX_KeyShare_Setup(ssl, cs.clientKSE);
  30206. if (ret != 0)
  30207. return ret;
  30208. }
  30209. #endif
  30210. return ret;
  30211. }
  30212. #ifdef OLD_HELLO_ALLOWED
  30213. /* process old style client hello, deprecate? */
  30214. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  30215. word32 inSz, word16 sz)
  30216. {
  30217. word32 idx = *inOutIdx;
  30218. word16 sessionSz;
  30219. word16 randomSz;
  30220. word16 i, j;
  30221. ProtocolVersion pv;
  30222. Suites clSuites;
  30223. int ret = -1;
  30224. (void)inSz;
  30225. WOLFSSL_MSG("Got old format client hello");
  30226. #ifdef WOLFSSL_CALLBACKS
  30227. if (ssl->hsInfoOn)
  30228. AddPacketName(ssl, "ClientHello");
  30229. if (ssl->toInfoOn)
  30230. AddLateName("ClientHello", &ssl->timeoutInfo);
  30231. #endif
  30232. /* manually hash input since different format */
  30233. #ifndef NO_OLD_TLS
  30234. #ifndef NO_MD5
  30235. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  30236. #endif
  30237. #ifndef NO_SHA
  30238. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  30239. #endif
  30240. #endif
  30241. #ifndef NO_SHA256
  30242. if (IsAtLeastTLSv1_2(ssl)) {
  30243. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  30244. input + idx, sz);
  30245. if (shaRet != 0)
  30246. return shaRet;
  30247. }
  30248. #endif
  30249. /* does this value mean client_hello? */
  30250. idx++;
  30251. /* version */
  30252. pv.major = input[idx++];
  30253. pv.minor = input[idx++];
  30254. ssl->chVersion = pv; /* store */
  30255. if (ssl->version.minor > pv.minor) {
  30256. byte haveRSA = 0;
  30257. byte havePSK = 0;
  30258. int keySz = 0;
  30259. if (!ssl->options.downgrade) {
  30260. WOLFSSL_MSG("Client trying to connect with lesser version");
  30261. return VERSION_ERROR;
  30262. }
  30263. if (pv.minor < ssl->options.minDowngrade) {
  30264. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  30265. return VERSION_ERROR;
  30266. }
  30267. if (pv.minor == SSLv3_MINOR) {
  30268. /* turn off tls */
  30269. WOLFSSL_MSG("\tdowngrading to SSLv3");
  30270. ssl->options.tls = 0;
  30271. ssl->options.tls1_1 = 0;
  30272. ssl->version.minor = SSLv3_MINOR;
  30273. }
  30274. else if (pv.minor == TLSv1_MINOR) {
  30275. WOLFSSL_MSG("\tdowngrading to TLSv1");
  30276. /* turn off tls 1.1+ */
  30277. ssl->options.tls1_1 = 0;
  30278. ssl->version.minor = TLSv1_MINOR;
  30279. }
  30280. else if (pv.minor == TLSv1_1_MINOR) {
  30281. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  30282. ssl->version.minor = TLSv1_1_MINOR;
  30283. }
  30284. else if (pv.minor == TLSv1_2_MINOR) {
  30285. WOLFSSL_MSG(" downgrading to TLSv1.2");
  30286. ssl->version.minor = TLSv1_2_MINOR;
  30287. }
  30288. #ifndef NO_RSA
  30289. haveRSA = 1;
  30290. #endif
  30291. #ifndef NO_PSK
  30292. havePSK = ssl->options.havePSK;
  30293. #endif
  30294. #ifndef NO_CERTS
  30295. keySz = ssl->buffers.keySz;
  30296. #endif
  30297. ret = AllocateSuites(ssl);
  30298. if (ret != 0)
  30299. return ret;
  30300. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  30301. ssl->options.haveDH, ssl->options.haveECDSAsig,
  30302. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  30303. ssl->options.haveFalconSig,
  30304. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  30305. TRUE, ssl->options.side);
  30306. }
  30307. /* suite size */
  30308. ato16(&input[idx], &clSuites.suiteSz);
  30309. idx += OPAQUE16_LEN;
  30310. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  30311. return BUFFER_ERROR;
  30312. /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
  30313. if (clSuites.suiteSz % 3 != 0)
  30314. return BUFFER_ERROR;
  30315. clSuites.hashSigAlgoSz = 0;
  30316. /* session size */
  30317. ato16(&input[idx], &sessionSz);
  30318. idx += OPAQUE16_LEN;
  30319. if (sessionSz > ID_LEN)
  30320. return BUFFER_ERROR;
  30321. /* random size */
  30322. ato16(&input[idx], &randomSz);
  30323. idx += OPAQUE16_LEN;
  30324. if (randomSz > RAN_LEN)
  30325. return BUFFER_ERROR;
  30326. /* suites */
  30327. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  30328. byte first = input[idx++];
  30329. if (!first) { /* implicit: skip sslv2 type */
  30330. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  30331. j += SUITE_LEN;
  30332. }
  30333. idx += SUITE_LEN;
  30334. }
  30335. clSuites.suiteSz = j;
  30336. /* session id */
  30337. if (sessionSz) {
  30338. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  30339. ssl->arrays->sessionIDSz = (byte)sessionSz;
  30340. idx += sessionSz;
  30341. ssl->options.resuming = 1;
  30342. }
  30343. /* random */
  30344. if (randomSz < RAN_LEN)
  30345. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  30346. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  30347. randomSz);
  30348. idx += randomSz;
  30349. if (ssl->options.usingCompression)
  30350. ssl->options.usingCompression = 0; /* turn off */
  30351. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  30352. ssl->cbmode = SSL_CB_MODE_WRITE;
  30353. *inOutIdx = idx;
  30354. ssl->options.haveSessionId = 1;
  30355. /* DoClientHello uses same resume code */
  30356. if (ssl->options.resuming) { /* let's try */
  30357. WOLFSSL_SESSION* session;
  30358. #ifdef HAVE_SESSION_TICKET
  30359. if (ssl->options.useTicket == 1) {
  30360. session = ssl->session;
  30361. }
  30362. else
  30363. #endif
  30364. {
  30365. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  30366. }
  30367. if (!session) {
  30368. WOLFSSL_MSG("Session lookup for resume failed");
  30369. ssl->options.resuming = 0;
  30370. } else {
  30371. if (MatchSuite(ssl, &clSuites) < 0) {
  30372. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  30373. return UNSUPPORTED_SUITE;
  30374. }
  30375. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  30376. RAN_LEN);
  30377. if (ret != 0)
  30378. return ret;
  30379. #ifdef NO_OLD_TLS
  30380. ret = DeriveTlsKeys(ssl);
  30381. #else
  30382. #ifndef NO_TLS
  30383. if (ssl->options.tls)
  30384. ret = DeriveTlsKeys(ssl);
  30385. #endif
  30386. if (!ssl->options.tls)
  30387. ret = DeriveKeys(ssl);
  30388. #endif
  30389. /* SERVER: peer auth based on session secret. */
  30390. ssl->options.peerAuthGood = (ret == 0);
  30391. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  30392. return ret;
  30393. }
  30394. }
  30395. ret = MatchSuite(ssl, &clSuites);
  30396. if (ret != 0)return ret;
  30397. return SanityCheckMsgReceived(ssl, client_hello);
  30398. }
  30399. #endif /* OLD_HELLO_ALLOWED */
  30400. #ifndef WOLFSSL_NO_TLS12
  30401. /**
  30402. * Handles session resumption.
  30403. * Session tickets are checked for validity based on the time each ticket
  30404. * was created, timeout value and the current time. If the tickets are
  30405. * judged expired, falls back to full-handshake. If you want disable this
  30406. * session ticket validation check in TLS1.2 and below, define
  30407. * WOLFSSL_NO_TICKET_EXPIRE.
  30408. */
  30409. int HandleTlsResumption(WOLFSSL* ssl, Suites* clSuites)
  30410. {
  30411. int ret = 0;
  30412. WOLFSSL_SESSION* session;
  30413. #ifdef HAVE_SESSION_TICKET
  30414. if (ssl->options.useTicket == 1) {
  30415. session = ssl->session;
  30416. }
  30417. else
  30418. #endif
  30419. {
  30420. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  30421. }
  30422. if (!session) {
  30423. WOLFSSL_MSG("Session lookup for resume failed");
  30424. ssl->options.resuming = 0;
  30425. return ret;
  30426. }
  30427. #if !defined(WOLFSSL_NO_TICKET_EXPIRE) && !defined(NO_ASN_TIME)
  30428. /* check if the ticket is valid */
  30429. if (LowResTimer() > session->bornOn + ssl->timeout) {
  30430. WOLFSSL_MSG("Expired session, fall back to full handshake.");
  30431. ssl->options.resuming = 0;
  30432. }
  30433. #endif /* !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
  30434. else if (session->haveEMS != ssl->options.haveEMS) {
  30435. /* RFC 7627, 5.3, server-side */
  30436. /* if old sess didn't have EMS, but new does, full handshake */
  30437. if (!session->haveEMS && ssl->options.haveEMS) {
  30438. WOLFSSL_MSG("Attempting to resume a session that didn't "
  30439. "use EMS with a new session with EMS. Do full "
  30440. "handshake.");
  30441. ssl->options.resuming = 0;
  30442. }
  30443. /* if old sess used EMS, but new doesn't, MUST abort */
  30444. else if (session->haveEMS && !ssl->options.haveEMS) {
  30445. WOLFSSL_MSG("Trying to resume a session with EMS without "
  30446. "using EMS");
  30447. #ifdef WOLFSSL_EXTRA_ALERTS
  30448. SendAlert(ssl, alert_fatal, handshake_failure);
  30449. #endif
  30450. ret = EXT_MASTER_SECRET_NEEDED_E;
  30451. WOLFSSL_ERROR_VERBOSE(ret);
  30452. }
  30453. }
  30454. else {
  30455. #ifndef NO_RESUME_SUITE_CHECK
  30456. int j;
  30457. /* Check client suites include the one in session */
  30458. for (j = 0; j < clSuites->suiteSz; j += 2) {
  30459. if (clSuites->suites[j] == session->cipherSuite0 &&
  30460. clSuites->suites[j+1] == session->cipherSuite) {
  30461. break;
  30462. }
  30463. }
  30464. if (j == clSuites->suiteSz) {
  30465. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  30466. #ifdef WOLFSSL_EXTRA_ALERTS
  30467. SendAlert(ssl, alert_fatal, illegal_parameter);
  30468. #endif
  30469. ret = UNSUPPORTED_SUITE;
  30470. WOLFSSL_ERROR_VERBOSE(ret);
  30471. }
  30472. #endif
  30473. if (ret == 0 && ssl->options.resuming) {
  30474. /* for resumption use the cipher suite from session */
  30475. ssl->options.cipherSuite0 = session->cipherSuite0;
  30476. ssl->options.cipherSuite = session->cipherSuite;
  30477. ret = SetCipherSpecs(ssl);
  30478. if (ret == 0) {
  30479. ret = PickHashSigAlgo(ssl, clSuites->hashSigAlgo,
  30480. clSuites->hashSigAlgoSz);
  30481. }
  30482. }
  30483. else if (ret == 0) {
  30484. if (MatchSuite(ssl, clSuites) < 0) {
  30485. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  30486. ret = UNSUPPORTED_SUITE;
  30487. WOLFSSL_ERROR_VERBOSE(ret);
  30488. }
  30489. }
  30490. if (ret == 0) {
  30491. ret = wc_RNG_GenerateBlock(ssl->rng,
  30492. ssl->arrays->serverRandom, RAN_LEN);
  30493. }
  30494. if (ret == 0) {
  30495. #ifdef NO_OLD_TLS
  30496. ret = DeriveTlsKeys(ssl);
  30497. #else
  30498. #ifndef NO_TLS
  30499. if (ssl->options.tls)
  30500. ret = DeriveTlsKeys(ssl);
  30501. #endif
  30502. if (!ssl->options.tls)
  30503. ret = DeriveKeys(ssl);
  30504. #endif
  30505. /* SERVER: peer auth based on session secret. */
  30506. ssl->options.peerAuthGood = (ret == 0);
  30507. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  30508. }
  30509. }
  30510. return ret;
  30511. }
  30512. /* handle processing of client_hello (1) */
  30513. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  30514. word32 helloSz)
  30515. {
  30516. byte b;
  30517. ProtocolVersion pv;
  30518. #ifdef WOLFSSL_SMALL_STACK
  30519. Suites* clSuites = NULL;
  30520. #else
  30521. Suites clSuites[1];
  30522. #endif
  30523. word32 i = *inOutIdx;
  30524. word32 begin = i;
  30525. int ret = 0;
  30526. byte lesserVersion;
  30527. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  30528. WOLFSSL_ENTER("DoClientHello");
  30529. #ifdef WOLFSSL_CALLBACKS
  30530. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  30531. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  30532. #endif
  30533. /* do not change state in the SSL object before the next region of code
  30534. * to be able to statelessly compute a DTLS cookie */
  30535. #ifdef WOLFSSL_DTLS
  30536. /* Update the ssl->options.dtlsStateful setting `if` statement in
  30537. * wolfSSL_accept when changing this one. */
  30538. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  30539. DtlsSetSeqNumForReply(ssl);
  30540. ret = DoClientHelloStateless(ssl, input, inOutIdx, helloSz);
  30541. if (ret != 0 || !ssl->options.dtlsStateful) {
  30542. int alertType = TranslateErrorToAlert(ret);
  30543. if (alertType != invalid_alert) {
  30544. int err;
  30545. /* propagate socket errors to avoid re-calling send alert */
  30546. err = SendAlert(ssl, alert_fatal, alertType);
  30547. if (err == SOCKET_ERROR_E)
  30548. ret = SOCKET_ERROR_E;
  30549. }
  30550. *inOutIdx += helloSz;
  30551. DtlsResetState(ssl);
  30552. if (DtlsIgnoreError(ret))
  30553. ret = 0;
  30554. return ret;
  30555. }
  30556. }
  30557. ssl->options.dtlsStateful = 1;
  30558. #endif /* WOLFSSL_DTLS */
  30559. /* Reset to sane value for SCR */
  30560. ssl->options.resuming = 0;
  30561. ssl->arrays->sessionIDSz = 0;
  30562. /* protocol version, random and session id length check */
  30563. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  30564. return BUFFER_ERROR;
  30565. /* protocol version */
  30566. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  30567. ssl->chVersion = pv; /* store */
  30568. i += OPAQUE16_LEN;
  30569. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  30570. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  30571. pv.minor = TLSv1_2_MINOR;
  30572. lesserVersion = !ssl->options.dtls && ssl->version.minor > pv.minor;
  30573. lesserVersion |= ssl->options.dtls && ssl->version.minor < pv.minor;
  30574. if (lesserVersion) {
  30575. byte belowMinDowngrade;
  30576. word16 haveRSA = 0;
  30577. word16 havePSK = 0;
  30578. int keySz = 0;
  30579. if (!ssl->options.downgrade) {
  30580. WOLFSSL_MSG("Client trying to connect with lesser version");
  30581. ret = VERSION_ERROR;
  30582. goto out;
  30583. }
  30584. belowMinDowngrade = pv.minor < ssl->options.minDowngrade;
  30585. /* DTLS versions increase backwards (-1,-2,-3) ecc */
  30586. if (ssl->options.dtls)
  30587. belowMinDowngrade = ssl->options.dtls
  30588. && pv.minor > ssl->options.minDowngrade;
  30589. if (belowMinDowngrade) {
  30590. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  30591. ret = VERSION_ERROR;
  30592. goto out;
  30593. }
  30594. if (!ssl->options.dtls) {
  30595. if (pv.minor == SSLv3_MINOR) {
  30596. /* turn off tls */
  30597. WOLFSSL_MSG("\tdowngrading to SSLv3");
  30598. ssl->options.tls = 0;
  30599. ssl->options.tls1_1 = 0;
  30600. ssl->version.minor = SSLv3_MINOR;
  30601. }
  30602. else if (pv.minor == TLSv1_MINOR) {
  30603. /* turn off tls 1.1+ */
  30604. WOLFSSL_MSG("\tdowngrading to TLSv1");
  30605. ssl->options.tls1_1 = 0;
  30606. ssl->version.minor = TLSv1_MINOR;
  30607. }
  30608. else if (pv.minor == TLSv1_1_MINOR) {
  30609. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  30610. ssl->version.minor = TLSv1_1_MINOR;
  30611. }
  30612. else if (pv.minor == TLSv1_2_MINOR) {
  30613. WOLFSSL_MSG(" downgrading to TLSv1.2");
  30614. ssl->version.minor = TLSv1_2_MINOR;
  30615. }
  30616. }
  30617. else {
  30618. if (pv.minor == DTLSv1_2_MINOR) {
  30619. WOLFSSL_MSG("\tDowngrading to DTLSv1.2");
  30620. ssl->options.tls1_3 = 0;
  30621. ssl->version.minor = DTLSv1_2_MINOR;
  30622. }
  30623. else if (pv.minor == DTLS_MINOR) {
  30624. WOLFSSL_MSG("\tDowngrading to DTLSv1.0");
  30625. ssl->options.tls1_3 = 0;
  30626. ssl->version.minor = DTLS_MINOR;
  30627. }
  30628. }
  30629. #ifndef NO_RSA
  30630. haveRSA = 1;
  30631. #endif
  30632. #ifndef NO_PSK
  30633. havePSK = ssl->options.havePSK;
  30634. #endif
  30635. #ifndef NO_CERTS
  30636. keySz = ssl->buffers.keySz;
  30637. #endif
  30638. ret = AllocateSuites(ssl);
  30639. if (ret != 0)
  30640. goto out;
  30641. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  30642. ssl->options.haveDH, ssl->options.haveECDSAsig,
  30643. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  30644. ssl->options.haveFalconSig,
  30645. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  30646. TRUE, ssl->options.side);
  30647. }
  30648. /* check if option is set to not allow the current version
  30649. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  30650. if (!ssl->options.dtls && ssl->options.downgrade &&
  30651. ssl->options.mask > 0) {
  30652. int reset = 0;
  30653. if (ssl->version.minor == TLSv1_2_MINOR &&
  30654. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
  30655. WOLFSSL_OP_NO_TLSv1_2) {
  30656. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  30657. ssl->version.minor = TLSv1_1_MINOR;
  30658. reset = 1;
  30659. }
  30660. if (ssl->version.minor == TLSv1_1_MINOR &&
  30661. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
  30662. WOLFSSL_OP_NO_TLSv1_1) {
  30663. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  30664. ssl->options.tls1_1 = 0;
  30665. ssl->version.minor = TLSv1_MINOR;
  30666. reset = 1;
  30667. }
  30668. if (ssl->version.minor == TLSv1_MINOR &&
  30669. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
  30670. WOLFSSL_OP_NO_TLSv1) {
  30671. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  30672. ssl->options.tls = 0;
  30673. ssl->options.tls1_1 = 0;
  30674. ssl->version.minor = SSLv3_MINOR;
  30675. reset = 1;
  30676. }
  30677. if (ssl->version.minor == SSLv3_MINOR &&
  30678. (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
  30679. WOLFSSL_OP_NO_SSLv3) {
  30680. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  30681. ret = VERSION_ERROR;
  30682. #ifdef WOLFSSL_EXTRA_ALERTS
  30683. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  30684. #endif
  30685. goto out;
  30686. }
  30687. if (ssl->version.minor < ssl->options.minDowngrade) {
  30688. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  30689. ret = VERSION_ERROR;
  30690. goto out;
  30691. }
  30692. if (reset) {
  30693. word16 haveRSA = 0;
  30694. word16 havePSK = 0;
  30695. int keySz = 0;
  30696. #ifndef NO_RSA
  30697. haveRSA = 1;
  30698. #endif
  30699. #ifndef NO_PSK
  30700. havePSK = ssl->options.havePSK;
  30701. #endif
  30702. #ifndef NO_CERTS
  30703. keySz = ssl->buffers.keySz;
  30704. #endif
  30705. ret = AllocateSuites(ssl);
  30706. if (ret != 0)
  30707. goto out;
  30708. /* reset cipher suites to account for TLS version change */
  30709. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  30710. ssl->options.haveDH, ssl->options.haveECDSAsig,
  30711. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  30712. ssl->options.haveFalconSig,
  30713. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  30714. TRUE, ssl->options.side);
  30715. }
  30716. }
  30717. /* random */
  30718. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  30719. i += RAN_LEN;
  30720. #ifdef SHOW_SECRETS
  30721. {
  30722. int j;
  30723. printf("client random: ");
  30724. for (j = 0; j < RAN_LEN; j++)
  30725. printf("%02x", ssl->arrays->clientRandom[j]);
  30726. printf("\n");
  30727. }
  30728. #endif
  30729. /* session id */
  30730. b = input[i++];
  30731. if (b > ID_LEN) {
  30732. WOLFSSL_MSG("Invalid session ID size");
  30733. ret = BUFFER_ERROR; /* session ID greater than 32 bytes long */
  30734. goto out;
  30735. }
  30736. else if (b > 0 && !IsSCR(ssl)) {
  30737. if ((i - begin) + b > helloSz) {
  30738. ret = BUFFER_ERROR;
  30739. goto out;
  30740. }
  30741. /* Always save session ID in case we want to echo it. */
  30742. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  30743. ssl->arrays->sessionIDSz = b;
  30744. if (b == ID_LEN)
  30745. ssl->options.resuming = 1; /* client wants to resume */
  30746. WOLFSSL_MSG("Client wants to resume session");
  30747. }
  30748. i += b;
  30749. #ifdef WOLFSSL_DTLS
  30750. /* cookie */
  30751. if (ssl->options.dtls) {
  30752. word8 peerCookieSz;
  30753. if ((i - begin) + OPAQUE8_LEN > helloSz) {
  30754. ret = BUFFER_ERROR;
  30755. goto out;
  30756. }
  30757. peerCookieSz = input[i++];
  30758. if (peerCookieSz) {
  30759. if (peerCookieSz > MAX_COOKIE_LEN) {
  30760. ret = BUFFER_ERROR;
  30761. goto out;
  30762. }
  30763. if ((i - begin) + peerCookieSz > helloSz) {
  30764. ret = BUFFER_ERROR;
  30765. goto out;
  30766. }
  30767. i += peerCookieSz;
  30768. }
  30769. }
  30770. #endif /* WOLFSSL_DTLS */
  30771. /* suites */
  30772. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  30773. ret = BUFFER_ERROR;
  30774. goto out;
  30775. }
  30776. #ifdef WOLFSSL_SMALL_STACK
  30777. clSuites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  30778. DYNAMIC_TYPE_SUITES);
  30779. if (clSuites == NULL) {
  30780. ret = MEMORY_E;
  30781. goto out;
  30782. }
  30783. #endif
  30784. XMEMSET(clSuites, 0, sizeof(Suites));
  30785. ato16(&input[i], &clSuites->suiteSz);
  30786. i += OPAQUE16_LEN;
  30787. /* Cipher suite lists are always multiples of two in length. */
  30788. if (clSuites->suiteSz % 2 != 0) {
  30789. ret = BUFFER_ERROR;
  30790. goto out;
  30791. }
  30792. /* suites and compression length check */
  30793. if ((i - begin) + clSuites->suiteSz + OPAQUE8_LEN > helloSz) {
  30794. ret = BUFFER_ERROR;
  30795. goto out;
  30796. }
  30797. if (clSuites->suiteSz > WOLFSSL_MAX_SUITE_SZ) {
  30798. ret = BUFFER_ERROR;
  30799. goto out;
  30800. }
  30801. XMEMCPY(clSuites->suites, input + i, clSuites->suiteSz);
  30802. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  30803. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  30804. if (FindSuite(clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  30805. TLSX* extension;
  30806. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  30807. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  30808. if (ret != WOLFSSL_SUCCESS)
  30809. goto out;
  30810. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  30811. if (extension) {
  30812. ssl->secure_renegotiation =
  30813. (SecureRenegotiation*)extension->data;
  30814. ssl->secure_renegotiation->enabled = 1;
  30815. }
  30816. }
  30817. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  30818. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  30819. /* check for TLS_FALLBACK_SCSV suite */
  30820. if (FindSuite(clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  30821. WOLFSSL_MSG("Found Fallback SCSV");
  30822. if (ssl->ctx->method->version.minor > pv.minor) {
  30823. WOLFSSL_MSG("Client trying to connect with lesser version");
  30824. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  30825. ret = VERSION_ERROR;
  30826. goto out;
  30827. }
  30828. }
  30829. #endif
  30830. i += clSuites->suiteSz;
  30831. clSuites->hashSigAlgoSz = 0;
  30832. /* compression length */
  30833. b = input[i++];
  30834. if ((i - begin) + b > helloSz) {
  30835. ret = BUFFER_ERROR;
  30836. goto out;
  30837. }
  30838. if (b == 0) {
  30839. WOLFSSL_MSG("No compression types in list");
  30840. #ifdef WOLFSSL_EXTRA_ALERTS
  30841. SendAlert(ssl, alert_fatal, decode_error);
  30842. #endif
  30843. ret = COMPRESSION_ERROR;
  30844. goto out;
  30845. }
  30846. {
  30847. /* compression match types */
  30848. int matchNo = 0;
  30849. int matchZlib = 0;
  30850. while (b--) {
  30851. byte comp = input[i++];
  30852. if (comp == NO_COMPRESSION) {
  30853. matchNo = 1;
  30854. }
  30855. if (comp == ZLIB_COMPRESSION) {
  30856. matchZlib = 1;
  30857. }
  30858. }
  30859. if (ssl->options.usingCompression == 0 && matchNo) {
  30860. WOLFSSL_MSG("Matched No Compression");
  30861. } else if (ssl->options.usingCompression && matchZlib) {
  30862. WOLFSSL_MSG("Matched zlib Compression");
  30863. } else if (ssl->options.usingCompression && matchNo) {
  30864. WOLFSSL_MSG("Could only match no compression, turning off");
  30865. ssl->options.usingCompression = 0; /* turn off */
  30866. } else {
  30867. WOLFSSL_MSG("Could not match compression");
  30868. #ifdef WOLFSSL_EXTRA_ALERTS
  30869. SendAlert(ssl, alert_fatal, illegal_parameter);
  30870. #endif
  30871. ret = COMPRESSION_ERROR;
  30872. goto out;
  30873. }
  30874. }
  30875. *inOutIdx = i;
  30876. /* tls extensions */
  30877. if ((i - begin) < helloSz) {
  30878. #ifdef HAVE_TLS_EXTENSIONS
  30879. if (TLSX_SupportExtensions(ssl))
  30880. #else
  30881. if (IsAtLeastTLSv1_2(ssl))
  30882. #endif
  30883. {
  30884. /* Process the hello extension. Skip unsupported. */
  30885. word16 totalExtSz;
  30886. #ifdef HAVE_TLS_EXTENSIONS
  30887. /* auto populate extensions supported unless user defined */
  30888. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  30889. goto out;
  30890. #endif
  30891. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  30892. ret = BUFFER_ERROR;
  30893. goto out;
  30894. }
  30895. ato16(&input[i], &totalExtSz);
  30896. i += OPAQUE16_LEN;
  30897. if ((i - begin) + totalExtSz > helloSz) {
  30898. ret = BUFFER_ERROR;
  30899. goto out;
  30900. }
  30901. #ifdef HAVE_TLS_EXTENSIONS
  30902. /* tls extensions */
  30903. if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, client_hello,
  30904. clSuites)))
  30905. goto out;
  30906. #ifdef WOLFSSL_TLS13
  30907. if (TLSX_Find(ssl->extensions,
  30908. TLSX_SUPPORTED_VERSIONS) != NULL) {
  30909. WOLFSSL_MSG(
  30910. "Client attempting to connect with higher version");
  30911. ret = VERSION_ERROR;
  30912. goto out;
  30913. }
  30914. #endif
  30915. #ifdef HAVE_SNI
  30916. if((ret=SNI_Callback(ssl)))
  30917. goto out;
  30918. #endif
  30919. #ifdef HAVE_ALPN
  30920. if((ret=ALPN_Select(ssl)))
  30921. goto out;
  30922. #endif
  30923. i += totalExtSz;
  30924. #else
  30925. while (totalExtSz) {
  30926. word16 extId, extSz;
  30927. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
  30928. ret = BUFFER_ERROR;
  30929. goto out;
  30930. }
  30931. ato16(&input[i], &extId);
  30932. i += OPAQUE16_LEN;
  30933. ato16(&input[i], &extSz);
  30934. i += OPAQUE16_LEN;
  30935. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
  30936. ret = BUFFER_ERROR;
  30937. goto out;
  30938. }
  30939. if (extId == HELLO_EXT_SIG_ALGO) {
  30940. word16 hashSigAlgoSz;
  30941. ato16(&input[i], &hashSigAlgoSz);
  30942. i += OPAQUE16_LEN;
  30943. if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
  30944. ret = BUFFER_ERROR;
  30945. goto out;
  30946. }
  30947. if (hashSigAlgoSz % 2 != 0) {
  30948. ret = BUFFER_ERROR;
  30949. goto out;
  30950. }
  30951. clSuites->hashSigAlgoSz = hashSigAlgoSz;
  30952. if (clSuites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  30953. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  30954. "truncating");
  30955. clSuites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  30956. }
  30957. XMEMCPY(clSuites->hashSigAlgo, &input[i],
  30958. clSuites->hashSigAlgoSz);
  30959. i += hashSigAlgoSz;
  30960. }
  30961. #ifdef HAVE_EXTENDED_MASTER
  30962. else if (extId == HELLO_EXT_EXTMS)
  30963. ssl->options.haveEMS = 1;
  30964. #endif
  30965. else
  30966. i += extSz;
  30967. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  30968. }
  30969. #endif
  30970. *inOutIdx = i;
  30971. }
  30972. else
  30973. *inOutIdx = begin + helloSz; /* skip extensions */
  30974. }
  30975. #ifdef WOLFSSL_DTLS_CID
  30976. if (ssl->options.useDtlsCID)
  30977. DtlsCIDOnExtensionsParsed(ssl);
  30978. #endif /* WOLFSSL_DTLS_CID */
  30979. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  30980. ssl->options.haveSessionId = 1;
  30981. /* ProcessOld uses same resume code */
  30982. if (ssl->options.resuming) {
  30983. ret = HandleTlsResumption(ssl, clSuites);
  30984. if (ret != 0)
  30985. goto out;
  30986. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  30987. !defined(WOLFSSL_AEAD_ONLY)
  30988. if (ssl->options.encThenMac && ssl->specs.cipher_type == block) {
  30989. ret = TLSX_EncryptThenMac_Respond(ssl);
  30990. if (ret != 0)
  30991. goto out;
  30992. }
  30993. else
  30994. ssl->options.encThenMac = 0;
  30995. #endif
  30996. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  30997. WOLFSSL_LEAVE("DoClientHello", ret);
  30998. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  30999. goto out;
  31000. }
  31001. }
  31002. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
  31003. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  31004. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  31005. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  31006. * present and no matches in the server's list. */
  31007. ret = TLSX_SupportedFFDHE_Set(ssl);
  31008. if (ret != 0)
  31009. goto out;
  31010. }
  31011. #endif
  31012. #endif
  31013. #ifdef OPENSSL_EXTRA
  31014. /* Give user last chance to provide a cert for cipher selection */
  31015. if (ret == 0 && ssl->ctx->certSetupCb != NULL)
  31016. ret = CertSetupCbWrapper(ssl);
  31017. #endif
  31018. if (ret == 0)
  31019. ret = MatchSuite(ssl, clSuites);
  31020. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  31021. !defined(WOLFSSL_AEAD_ONLY)
  31022. if (ret == 0 && ssl->options.encThenMac &&
  31023. ssl->specs.cipher_type == block) {
  31024. ret = TLSX_EncryptThenMac_Respond(ssl);
  31025. }
  31026. else
  31027. ssl->options.encThenMac = 0;
  31028. #endif
  31029. #ifdef WOLFSSL_DTLS
  31030. if (ret == 0 && ssl->options.dtls)
  31031. DtlsMsgPoolReset(ssl);
  31032. #endif
  31033. out:
  31034. #ifdef WOLFSSL_SMALL_STACK
  31035. if (clSuites != NULL)
  31036. XFREE(clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
  31037. #endif
  31038. WOLFSSL_LEAVE("DoClientHello", ret);
  31039. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  31040. if (ret != 0) {
  31041. WOLFSSL_ERROR_VERBOSE(ret);
  31042. }
  31043. return ret;
  31044. }
  31045. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  31046. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  31047. typedef struct DcvArgs {
  31048. byte* output; /* not allocated */
  31049. word32 sendSz;
  31050. word16 sz;
  31051. word32 sigSz;
  31052. word32 idx;
  31053. word32 begin;
  31054. byte hashAlgo;
  31055. byte sigAlgo;
  31056. } DcvArgs;
  31057. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  31058. {
  31059. DcvArgs* args = (DcvArgs*)pArgs;
  31060. (void)ssl;
  31061. (void)args;
  31062. }
  31063. /* handle processing of certificate_verify (15) */
  31064. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  31065. word32* inOutIdx, word32 size)
  31066. {
  31067. int ret = 0;
  31068. #ifdef WOLFSSL_ASYNC_CRYPT
  31069. DcvArgs* args = NULL;
  31070. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  31071. #else
  31072. DcvArgs args[1];
  31073. #endif
  31074. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  31075. WOLFSSL_ENTER("DoCertificateVerify");
  31076. #ifdef WOLFSSL_ASYNC_CRYPT
  31077. if (ssl->async == NULL) {
  31078. ssl->async = (struct WOLFSSL_ASYNC*)
  31079. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  31080. DYNAMIC_TYPE_ASYNC);
  31081. if (ssl->async == NULL)
  31082. ERROR_OUT(MEMORY_E, exit_dcv);
  31083. }
  31084. args = (DcvArgs*)ssl->async->args;
  31085. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  31086. if (ret != WC_NOT_PENDING_E) {
  31087. /* Check for error */
  31088. if (ret < 0)
  31089. goto exit_dcv;
  31090. }
  31091. else
  31092. #endif
  31093. {
  31094. /* Reset state */
  31095. ret = 0;
  31096. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  31097. XMEMSET(args, 0, sizeof(DcvArgs));
  31098. args->hashAlgo = sha_mac;
  31099. args->sigAlgo = anonymous_sa_algo;
  31100. args->idx = *inOutIdx;
  31101. args->begin = *inOutIdx;
  31102. #ifdef WOLFSSL_ASYNC_CRYPT
  31103. ssl->async->freeArgs = FreeDcvArgs;
  31104. #endif
  31105. }
  31106. switch(ssl->options.asyncState)
  31107. {
  31108. case TLS_ASYNC_BEGIN:
  31109. {
  31110. #ifdef WOLFSSL_CALLBACKS
  31111. if (ssl->hsInfoOn)
  31112. AddPacketName(ssl, "CertificateVerify");
  31113. if (ssl->toInfoOn)
  31114. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  31115. #endif
  31116. /* Advance state and proceed */
  31117. ssl->options.asyncState = TLS_ASYNC_BUILD;
  31118. } /* case TLS_ASYNC_BEGIN */
  31119. FALL_THROUGH;
  31120. case TLS_ASYNC_BUILD:
  31121. {
  31122. if (IsAtLeastTLSv1_2(ssl)) {
  31123. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  31124. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  31125. }
  31126. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  31127. &args->sigAlgo);
  31128. args->idx += 2;
  31129. }
  31130. #ifndef NO_RSA
  31131. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  31132. args->sigAlgo = rsa_sa_algo;
  31133. #endif
  31134. #ifdef HAVE_ECC
  31135. else if (ssl->peerEccDsaKeyPresent) {
  31136. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  31137. if (ssl->peerEccDsaKey->dp->id == ECC_SM2P256V1) {
  31138. args->sigAlgo = sm2_sa_algo;
  31139. }
  31140. else
  31141. #endif
  31142. {
  31143. args->sigAlgo = ecc_dsa_sa_algo;
  31144. }
  31145. }
  31146. #endif
  31147. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  31148. else if (ssl->peerEd25519KeyPresent)
  31149. args->sigAlgo = ed25519_sa_algo;
  31150. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  31151. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  31152. else if (ssl->peerEd448KeyPresent)
  31153. args->sigAlgo = ed448_sa_algo;
  31154. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  31155. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  31156. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  31157. }
  31158. ato16(input + args->idx, &args->sz);
  31159. args->idx += OPAQUE16_LEN;
  31160. if ((args->idx - args->begin) + args->sz > size ||
  31161. args->sz > ENCRYPT_LEN) {
  31162. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  31163. }
  31164. #ifdef HAVE_ECC
  31165. if (ssl->peerEccDsaKeyPresent) {
  31166. WOLFSSL_MSG("Doing ECC peer cert verify");
  31167. /* make sure a default is defined */
  31168. #if !defined(NO_SHA)
  31169. SetDigest(ssl, sha_mac);
  31170. #elif !defined(NO_SHA256)
  31171. SetDigest(ssl, sha256_mac);
  31172. #elif defined(WOLFSSL_SM3)
  31173. SetDigest(ssl, sm3_mac);
  31174. #elif defined(WOLFSSL_SHA384)
  31175. SetDigest(ssl, sha384_mac);
  31176. #elif defined(WOLFSSL_SHA512)
  31177. SetDigest(ssl, sha512_mac);
  31178. #else
  31179. #error No digest enabled for ECC sig verify
  31180. #endif
  31181. if (IsAtLeastTLSv1_2(ssl)) {
  31182. if (args->sigAlgo != ecc_dsa_sa_algo
  31183. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  31184. && args->sigAlgo != sm2_sa_algo
  31185. #endif
  31186. ) {
  31187. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  31188. }
  31189. SetDigest(ssl, args->hashAlgo);
  31190. }
  31191. }
  31192. #endif /* HAVE_ECC */
  31193. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  31194. if (ssl->peerEd25519KeyPresent) {
  31195. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  31196. if (IsAtLeastTLSv1_2(ssl) &&
  31197. args->sigAlgo != ed25519_sa_algo) {
  31198. WOLFSSL_MSG(
  31199. "Oops, peer sent ED25519 key but not in verify");
  31200. }
  31201. }
  31202. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  31203. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  31204. if (ssl->peerEd448KeyPresent) {
  31205. WOLFSSL_MSG("Doing ED448 peer cert verify");
  31206. if (IsAtLeastTLSv1_2(ssl) &&
  31207. args->sigAlgo != ed448_sa_algo) {
  31208. WOLFSSL_MSG(
  31209. "Oops, peer sent ED448 key but not in verify");
  31210. }
  31211. }
  31212. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  31213. /* Advance state and proceed */
  31214. ssl->options.asyncState = TLS_ASYNC_DO;
  31215. } /* case TLS_ASYNC_BUILD */
  31216. FALL_THROUGH;
  31217. case TLS_ASYNC_DO:
  31218. {
  31219. #ifndef NO_RSA
  31220. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  31221. WOLFSSL_MSG("Doing RSA peer cert verify");
  31222. ret = RsaVerify(ssl,
  31223. input + args->idx,
  31224. args->sz,
  31225. &args->output,
  31226. args->sigAlgo, args->hashAlgo,
  31227. ssl->peerRsaKey,
  31228. #ifdef HAVE_PK_CALLBACKS
  31229. &ssl->buffers.peerRsaKey
  31230. #else
  31231. NULL
  31232. #endif
  31233. );
  31234. if (ret >= 0) {
  31235. if (args->sigAlgo == rsa_sa_algo)
  31236. args->sendSz = ret;
  31237. else {
  31238. args->sigSz = ret;
  31239. args->sendSz = ssl->buffers.digest.length;
  31240. }
  31241. ret = 0;
  31242. }
  31243. }
  31244. #endif /* !NO_RSA */
  31245. #ifdef HAVE_ECC
  31246. if (ssl->peerEccDsaKeyPresent) {
  31247. WOLFSSL_MSG("Doing ECC peer cert verify");
  31248. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  31249. if (args->sigAlgo == sm2_sa_algo) {
  31250. ret = Sm2wSm3Verify(ssl,
  31251. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  31252. input + args->idx, args->sz,
  31253. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  31254. ssl->peerEccDsaKey,
  31255. #ifdef HAVE_PK_CALLBACKS
  31256. &ssl->buffers.peerEccDsaKey
  31257. #else
  31258. NULL
  31259. #endif
  31260. );
  31261. }
  31262. else
  31263. #endif
  31264. {
  31265. ret = EccVerify(ssl,
  31266. input + args->idx, args->sz,
  31267. ssl->buffers.digest.buffer,
  31268. ssl->buffers.digest.length,
  31269. ssl->peerEccDsaKey,
  31270. #ifdef HAVE_PK_CALLBACKS
  31271. &ssl->buffers.peerEccDsaKey
  31272. #else
  31273. NULL
  31274. #endif
  31275. );
  31276. }
  31277. /* SERVER: Data verified with certificate's public key. */
  31278. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  31279. (ret == 0);
  31280. }
  31281. #endif /* HAVE_ECC */
  31282. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  31283. if (ssl->peerEd25519KeyPresent) {
  31284. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  31285. ret = Ed25519Verify(ssl,
  31286. input + args->idx, args->sz,
  31287. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  31288. ssl->peerEd25519Key,
  31289. #ifdef HAVE_PK_CALLBACKS
  31290. &ssl->buffers.peerEd25519Key
  31291. #else
  31292. NULL
  31293. #endif
  31294. );
  31295. /* SERVER: Data verified with certificate's public key. */
  31296. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  31297. (ret == 0);
  31298. }
  31299. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  31300. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  31301. if (ssl->peerEd448KeyPresent) {
  31302. WOLFSSL_MSG("Doing Ed448 peer cert verify");
  31303. ret = Ed448Verify(ssl,
  31304. input + args->idx, args->sz,
  31305. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  31306. ssl->peerEd448Key,
  31307. #ifdef HAVE_PK_CALLBACKS
  31308. &ssl->buffers.peerEd448Key
  31309. #else
  31310. NULL
  31311. #endif
  31312. );
  31313. /* SERVER: Data verified with certificate's public key. */
  31314. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  31315. (ret == 0);
  31316. }
  31317. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  31318. #ifdef WOLFSSL_ASYNC_CRYPT
  31319. /* handle async pending */
  31320. if (ret == WC_PENDING_E)
  31321. goto exit_dcv;
  31322. #endif
  31323. /* Check for error */
  31324. if (ret != 0) {
  31325. ret = SIG_VERIFY_E;
  31326. goto exit_dcv;
  31327. }
  31328. /* Advance state and proceed */
  31329. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  31330. } /* case TLS_ASYNC_DO */
  31331. FALL_THROUGH;
  31332. case TLS_ASYNC_VERIFY:
  31333. {
  31334. #ifndef NO_RSA
  31335. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  31336. if (IsAtLeastTLSv1_2(ssl)) {
  31337. #ifdef WC_RSA_PSS
  31338. if (args->sigAlgo == rsa_pss_sa_algo) {
  31339. SetDigest(ssl, args->hashAlgo);
  31340. #ifdef HAVE_SELFTEST
  31341. ret = wc_RsaPSS_CheckPadding(
  31342. ssl->buffers.digest.buffer,
  31343. ssl->buffers.digest.length,
  31344. args->output, args->sigSz,
  31345. HashAlgoToType(args->hashAlgo));
  31346. #else
  31347. ret = wc_RsaPSS_CheckPadding_ex(
  31348. ssl->buffers.digest.buffer,
  31349. ssl->buffers.digest.length,
  31350. args->output, args->sigSz,
  31351. HashAlgoToType(args->hashAlgo), -1,
  31352. mp_count_bits(&ssl->peerRsaKey->n));
  31353. #endif
  31354. if (ret != 0) {
  31355. ret = SIG_VERIFY_E;
  31356. goto exit_dcv;
  31357. }
  31358. }
  31359. else
  31360. #endif
  31361. {
  31362. #ifndef WOLFSSL_SMALL_STACK
  31363. byte encodedSig[MAX_ENCODED_SIG_SZ];
  31364. #else
  31365. byte* encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  31366. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  31367. if (encodedSig == NULL) {
  31368. ERROR_OUT(MEMORY_E, exit_dcv);
  31369. }
  31370. #endif
  31371. if (args->sigAlgo != rsa_sa_algo) {
  31372. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  31373. "in verify");
  31374. }
  31375. SetDigest(ssl, args->hashAlgo);
  31376. args->sigSz = wc_EncodeSignature(encodedSig,
  31377. ssl->buffers.digest.buffer,
  31378. ssl->buffers.digest.length,
  31379. TypeHash(args->hashAlgo));
  31380. if (args->sendSz != args->sigSz || !args->output ||
  31381. XMEMCMP(args->output, encodedSig,
  31382. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  31383. ret = VERIFY_CERT_ERROR;
  31384. }
  31385. #ifdef WOLFSSL_SMALL_STACK
  31386. XFREE(encodedSig, ssl->heap,
  31387. DYNAMIC_TYPE_SIGNATURE);
  31388. #endif
  31389. }
  31390. }
  31391. else {
  31392. if (args->sendSz != FINISHED_SZ || !args->output ||
  31393. XMEMCMP(args->output,
  31394. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  31395. ret = VERIFY_CERT_ERROR;
  31396. }
  31397. }
  31398. if (ret == 0) {
  31399. /* SERVER: Data verified with cert's public key. */
  31400. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  31401. (ret == 0);
  31402. }
  31403. }
  31404. #endif /* !NO_RSA */
  31405. if (ret != 0)
  31406. break;
  31407. /* Advance state and proceed */
  31408. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  31409. } /* case TLS_ASYNC_VERIFY */
  31410. FALL_THROUGH;
  31411. case TLS_ASYNC_FINALIZE:
  31412. {
  31413. if (IsEncryptionOn(ssl, 0)) {
  31414. args->idx += ssl->keys.padSz;
  31415. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  31416. if (ssl->options.startedETMRead)
  31417. args->idx += MacSize(ssl);
  31418. #endif
  31419. }
  31420. ssl->options.havePeerVerify = 1;
  31421. /* Set final index */
  31422. args->idx += args->sz;
  31423. *inOutIdx = args->idx;
  31424. /* Advance state and proceed */
  31425. ssl->options.asyncState = TLS_ASYNC_END;
  31426. } /* case TLS_ASYNC_FINALIZE */
  31427. FALL_THROUGH;
  31428. case TLS_ASYNC_END:
  31429. {
  31430. break;
  31431. }
  31432. default:
  31433. ret = INPUT_CASE_ERROR;
  31434. } /* switch(ssl->options.asyncState) */
  31435. exit_dcv:
  31436. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  31437. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  31438. #ifdef WOLFSSL_ASYNC_CRYPT
  31439. /* Handle async operation */
  31440. if (ret == WC_PENDING_E) {
  31441. /* Mark message as not received so it can process again */
  31442. ssl->msgsReceived.got_certificate_verify = 0;
  31443. return ret;
  31444. }
  31445. #endif /* WOLFSSL_ASYNC_CRYPT */
  31446. #ifdef WOLFSSL_EXTRA_ALERTS
  31447. if (ret == BUFFER_ERROR)
  31448. SendAlert(ssl, alert_fatal, decode_error);
  31449. else if (ret == SIG_VERIFY_E)
  31450. SendAlert(ssl, alert_fatal, decrypt_error);
  31451. else if (ret != 0)
  31452. SendAlert(ssl, alert_fatal, bad_certificate);
  31453. #endif
  31454. /* Digest is not allocated, so do this to prevent free */
  31455. if(ssl->buffers.digest.buffer) {
  31456. if (!ssl->options.dontFreeDigest) {
  31457. /*This should not happen*/
  31458. XFREE(ssl->buffers.digest.buffer,
  31459. ssl->heap, DYNAMIC_TYPE_DIGEST);
  31460. }
  31461. }
  31462. ssl->buffers.digest.buffer = NULL;
  31463. ssl->buffers.digest.length = 0;
  31464. ssl->options.dontFreeDigest = 0;
  31465. #ifdef WOLFSSL_ASYNC_CRYPT
  31466. /* Cleanup async */
  31467. FreeAsyncCtx(ssl, 0);
  31468. #else
  31469. FreeDcvArgs(ssl, args);
  31470. #endif
  31471. /* Final cleanup */
  31472. FreeKeyExchange(ssl);
  31473. if (ret != 0) {
  31474. WOLFSSL_ERROR_VERBOSE(ret);
  31475. }
  31476. return ret;
  31477. }
  31478. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  31479. /* handle generation of server_hello_done (14) */
  31480. int SendServerHelloDone(WOLFSSL* ssl)
  31481. {
  31482. byte* output;
  31483. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  31484. int ret;
  31485. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  31486. WOLFSSL_ENTER("SendServerHelloDone");
  31487. #ifdef WOLFSSL_DTLS
  31488. if (ssl->options.dtls)
  31489. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  31490. #endif
  31491. if (IsEncryptionOn(ssl, 1))
  31492. sendSz += MAX_MSG_EXTRA;
  31493. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  31494. * is not advanced yet */
  31495. ssl->options.buildingMsg = 1;
  31496. /* check for available size */
  31497. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  31498. return ret;
  31499. /* get output buffer */
  31500. output = GetOutputBuffer(ssl);
  31501. AddHeaders(output, 0, server_hello_done, ssl);
  31502. if (IsEncryptionOn(ssl, 1)) {
  31503. byte* input;
  31504. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  31505. int recordHeaderSz = RECORD_HEADER_SZ;
  31506. if (ssl->options.dtls) {
  31507. recordHeaderSz += DTLS_RECORD_EXTRA;
  31508. inputSz += DTLS_HANDSHAKE_EXTRA;
  31509. }
  31510. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31511. if (input == NULL)
  31512. return MEMORY_E;
  31513. XMEMCPY(input, output + recordHeaderSz, inputSz);
  31514. #ifdef WOLFSSL_DTLS
  31515. if (IsDtlsNotSctpMode(ssl) &&
  31516. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
  31517. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31518. return ret;
  31519. }
  31520. #endif
  31521. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  31522. handshake, 1, 0, 0, CUR_ORDER);
  31523. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31524. if (sendSz < 0)
  31525. return sendSz;
  31526. } else {
  31527. #ifdef WOLFSSL_DTLS
  31528. if (IsDtlsNotSctpMode(ssl)) {
  31529. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
  31530. return ret;
  31531. }
  31532. if (ssl->options.dtls)
  31533. DtlsSEQIncrement(ssl, CUR_ORDER);
  31534. #endif
  31535. ret = HashOutput(ssl, output, sendSz, 0);
  31536. if (ret != 0)
  31537. return ret;
  31538. }
  31539. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  31540. if (ssl->hsInfoOn)
  31541. AddPacketName(ssl, "ServerHelloDone");
  31542. if (ssl->toInfoOn) {
  31543. ret = AddPacketInfo(ssl, "ServerHelloDone", handshake, output,
  31544. sendSz, WRITE_PROTO, 0, ssl->heap);
  31545. if (ret != 0)
  31546. return ret;
  31547. }
  31548. #endif
  31549. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  31550. ssl->options.buildingMsg = 0;
  31551. ssl->buffers.outputBuffer.length += sendSz;
  31552. ret = SendBuffered(ssl);
  31553. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  31554. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  31555. return ret;
  31556. }
  31557. #endif /* !WOLFSSL_NO_TLS12 */
  31558. #ifdef HAVE_SESSION_TICKET
  31559. #ifdef WOLFSSL_TICKET_HAVE_ID
  31560. static void GetRealSessionID(WOLFSSL* ssl, const byte** id, byte* idSz)
  31561. {
  31562. if (ssl->session->haveAltSessionID) {
  31563. *id = ssl->session->altSessionID;
  31564. *idSz = ID_LEN;
  31565. }
  31566. else if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
  31567. *id = ssl->arrays->sessionID;
  31568. *idSz = ssl->arrays->sessionIDSz;
  31569. }
  31570. else {
  31571. *id = ssl->session->sessionID;
  31572. *idSz = ssl->session->sessionIDSz;
  31573. }
  31574. }
  31575. #endif
  31576. int SetupTicket(WOLFSSL* ssl)
  31577. {
  31578. int ret = 0;
  31579. (void)ssl;
  31580. #ifdef WOLFSSL_TLS13
  31581. {
  31582. /* Client adds to ticket age to obfuscate. */
  31583. byte ageAdd[AGEADD_LEN]; /* Obfuscation of age */
  31584. ret = wc_RNG_GenerateBlock(ssl->rng, ageAdd, AGEADD_LEN);
  31585. if (ret != 0)
  31586. return ret;
  31587. ato32(ageAdd, &ssl->session->ticketAdd);
  31588. }
  31589. #endif
  31590. #ifdef WOLFSSL_TICKET_HAVE_ID
  31591. {
  31592. const byte* id = NULL;
  31593. byte idSz = 0;
  31594. GetRealSessionID(ssl, &id, &idSz);
  31595. if (idSz == 0) {
  31596. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID,
  31597. ID_LEN);
  31598. if (ret != 0)
  31599. return ret;
  31600. ssl->session->haveAltSessionID = 1;
  31601. }
  31602. }
  31603. #endif
  31604. return ret;
  31605. }
  31606. /* create a new session ticket, 0 on success
  31607. * Do any kind of setup in SetupTicket */
  31608. int CreateTicket(WOLFSSL* ssl)
  31609. {
  31610. InternalTicket* it;
  31611. ExternalTicket* et;
  31612. int encLen;
  31613. int ret;
  31614. int error;
  31615. word32 itHash = 0;
  31616. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  31617. WOLFSSL_ASSERT_SIZEOF_GE(ssl->session->staticTicket, *et);
  31618. WOLFSSL_ASSERT_SIZEOF_GE(et->enc_ticket, *it);
  31619. if (ssl->session->ticket != ssl->session->staticTicket) {
  31620. /* Always use the static ticket buffer */
  31621. XFREE(ssl->session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  31622. ssl->session->ticket = ssl->session->staticTicket;
  31623. ssl->session->ticketLenAlloc = 0;
  31624. }
  31625. et = (ExternalTicket*)ssl->session->ticket;
  31626. it = (InternalTicket*)et->enc_ticket;
  31627. #ifdef WOLFSSL_ASYNC_CRYPT
  31628. if (ssl->error != WC_PENDING_E)
  31629. #endif
  31630. {
  31631. XMEMSET(et, 0, sizeof(*et));
  31632. }
  31633. /* build internal */
  31634. it->pv.major = ssl->version.major;
  31635. it->pv.minor = ssl->version.minor;
  31636. it->suite[0] = ssl->options.cipherSuite0;
  31637. it->suite[1] = ssl->options.cipherSuite;
  31638. #ifdef WOLFSSL_EARLY_DATA
  31639. c32toa(ssl->options.maxEarlyDataSz, it->maxEarlyDataSz);
  31640. #endif
  31641. if (!ssl->options.tls1_3) {
  31642. if (ssl->arrays == NULL) {
  31643. WOLFSSL_MSG("CreateTicket called with null arrays");
  31644. ret = BAD_FUNC_ARG;
  31645. goto error;
  31646. }
  31647. XMEMCPY(it->msecret, ssl->arrays->masterSecret, SECRET_LEN);
  31648. #ifndef NO_ASN_TIME
  31649. c32toa(LowResTimer(), it->timestamp);
  31650. #endif
  31651. it->haveEMS = (byte) ssl->options.haveEMS;
  31652. }
  31653. else {
  31654. #ifdef WOLFSSL_TLS13
  31655. #ifdef WOLFSSL_32BIT_MILLI_TIME
  31656. word32 now = TimeNowInMilliseconds();
  31657. #else
  31658. sword64 now = TimeNowInMilliseconds();
  31659. #endif
  31660. if (now == 0) {
  31661. ret = GETTIME_ERROR;
  31662. goto error;
  31663. }
  31664. c32toa(ssl->session->ticketAdd, it->ageAdd);
  31665. c16toa(ssl->session->namedGroup, it->namedGroup);
  31666. #ifdef WOLFSSL_32BIT_MILLI_TIME
  31667. c32toa(now, it->timestamp);
  31668. #else
  31669. c32toa((word32)(now >> 32), it->timestamp);
  31670. c32toa((word32)now , it->timestamp + OPAQUE32_LEN);
  31671. #endif
  31672. /* Resumption master secret. */
  31673. XMEMCPY(it->msecret, ssl->session->masterSecret, SECRET_LEN);
  31674. if (ssl->session->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ) {
  31675. WOLFSSL_MSG("Bad ticket nonce value");
  31676. ret = BAD_TICKET_MSG_SZ;
  31677. goto error;
  31678. }
  31679. XMEMCPY(it->ticketNonce, ssl->session->ticketNonce.data,
  31680. ssl->session->ticketNonce.len);
  31681. it->ticketNonceLen = ssl->session->ticketNonce.len;
  31682. #endif
  31683. }
  31684. #ifdef OPENSSL_EXTRA
  31685. it->sessionCtxSz = ssl->sessionCtxSz;
  31686. XMEMCPY(it->sessionCtx, ssl->sessionCtx, ID_LEN);
  31687. #endif
  31688. #ifdef WOLFSSL_TICKET_HAVE_ID
  31689. {
  31690. const byte* id = NULL;
  31691. byte idSz = 0;
  31692. GetRealSessionID(ssl, &id, &idSz);
  31693. /* make sure idSz is not larger than ID_LEN */
  31694. if (idSz > ID_LEN)
  31695. idSz = ID_LEN;
  31696. XMEMCPY(it->id, id, idSz);
  31697. }
  31698. #endif
  31699. /* encrypt */
  31700. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  31701. if (ssl->ctx->ticketEncCb == NULL
  31702. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  31703. ||
  31704. /* SSL_OP_NO_TICKET turns off tickets in <= 1.2. Forces
  31705. * "stateful" tickets for 1.3 so just use the regular
  31706. * stateless ones. */
  31707. (!IsAtLeastTLSv1_3(ssl->version) &&
  31708. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  31709. #endif
  31710. ) {
  31711. /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
  31712. ret = BAD_TICKET_ENCRYPT;
  31713. }
  31714. else {
  31715. itHash = HashObject((byte*)it, sizeof(*it), &error);
  31716. if (error == 0) {
  31717. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac,
  31718. 1, et->enc_ticket, sizeof(InternalTicket), &encLen,
  31719. SSL_TICKET_CTX(ssl));
  31720. }
  31721. else {
  31722. ret = WOLFSSL_TICKET_RET_FATAL;
  31723. }
  31724. }
  31725. if (ret != WOLFSSL_TICKET_RET_OK) {
  31726. #ifdef WOLFSSL_ASYNC_CRYPT
  31727. if (ret == WC_PENDING_E) {
  31728. return ret;
  31729. }
  31730. #endif
  31731. goto error;
  31732. }
  31733. if (encLen < (int)sizeof(InternalTicket) ||
  31734. encLen > (int)WOLFSSL_TICKET_ENC_SZ) {
  31735. WOLFSSL_MSG("Bad user ticket encrypt size");
  31736. ret = BAD_TICKET_KEY_CB_SZ;
  31737. }
  31738. /* sanity checks on encrypt callback */
  31739. /* internal ticket can't be the same if encrypted */
  31740. if (itHash == HashObject((byte*)it, sizeof(*it), &error) || error != 0)
  31741. {
  31742. WOLFSSL_MSG("User ticket encrypt didn't encrypt or hash failed");
  31743. ret = BAD_TICKET_ENCRYPT;
  31744. goto error;
  31745. }
  31746. XMEMSET(zeros, 0, sizeof(zeros));
  31747. /* name */
  31748. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  31749. WOLFSSL_MSG("User ticket encrypt didn't set name");
  31750. ret = BAD_TICKET_ENCRYPT;
  31751. goto error;
  31752. }
  31753. /* iv */
  31754. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  31755. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  31756. ret = BAD_TICKET_ENCRYPT;
  31757. goto error;
  31758. }
  31759. /* mac */
  31760. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  31761. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  31762. ret = BAD_TICKET_ENCRYPT;
  31763. goto error;
  31764. }
  31765. /* set size */
  31766. c16toa((word16)encLen, et->enc_len);
  31767. if (encLen < (int)WOLFSSL_TICKET_ENC_SZ) {
  31768. /* move mac up since whole enc buffer not used */
  31769. XMEMMOVE(et->enc_ticket + encLen, et->mac,
  31770. WOLFSSL_TICKET_MAC_SZ);
  31771. }
  31772. ssl->session->ticketLen =
  31773. (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  31774. return ret;
  31775. error:
  31776. #ifdef WOLFSSL_CHECK_MEM_ZERO
  31777. /* Ticket has sensitive data in it now. */
  31778. wc_MemZero_Add("Create Ticket internal", it, sizeof(InternalTicket));
  31779. #endif
  31780. ForceZero(it, sizeof(*it));
  31781. #ifdef WOLFSSL_CHECK_MEM_ZERO
  31782. wc_MemZero_Check(it, sizeof(InternalTicket));
  31783. #endif
  31784. WOLFSSL_ERROR_VERBOSE(ret);
  31785. return ret;
  31786. }
  31787. int DoDecryptTicket(const WOLFSSL* ssl, const byte* input, word32 len,
  31788. InternalTicket **it)
  31789. {
  31790. ExternalTicket* et;
  31791. int ret;
  31792. int outLen;
  31793. word16 inLen;
  31794. WOLFSSL_START(WC_FUNC_TICKET_DO);
  31795. WOLFSSL_ENTER("DoDecryptTicket");
  31796. if (len > SESSION_TICKET_LEN ||
  31797. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  31798. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
  31799. return WOLFSSL_TICKET_RET_REJECT;
  31800. }
  31801. et = (ExternalTicket*)input;
  31802. /* decrypt */
  31803. ato16(et->enc_len, &inLen);
  31804. if (inLen > WOLFSSL_TICKET_ENC_SZ) {
  31805. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
  31806. return WOLFSSL_TICKET_RET_REJECT;
  31807. }
  31808. outLen = (int)inLen; /* may be reduced by user padding */
  31809. if (ssl->ctx->ticketEncCb == NULL
  31810. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  31811. ||
  31812. /* SSL_OP_NO_TICKET turns off tickets in < 1.2. Forces
  31813. * "stateful" tickets for 1.3 so just use the regular
  31814. * stateless ones. */
  31815. (!IsAtLeastTLSv1_3(ssl->version) &&
  31816. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  31817. #endif
  31818. ) {
  31819. /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
  31820. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_ENCRYPT);
  31821. ret = WOLFSSL_TICKET_RET_REJECT;
  31822. }
  31823. else {
  31824. /* Callback uses ssl without const but for DTLS, it really shouldn't
  31825. * modify its state. */
  31826. ret = ssl->ctx->ticketEncCb((WOLFSSL*)ssl, et->key_name, et->iv,
  31827. et->enc_ticket + inLen, 0,
  31828. et->enc_ticket, inLen, &outLen,
  31829. SSL_TICKET_CTX(ssl));
  31830. }
  31831. if (ret != WOLFSSL_TICKET_RET_OK) {
  31832. #ifdef WOLFSSL_ASYNC_CRYPT
  31833. if (ret == WC_PENDING_E) {
  31834. return ret;
  31835. }
  31836. #endif /* WOLFSSL_ASYNC_CRYPT */
  31837. if (ret != WOLFSSL_TICKET_RET_CREATE) {
  31838. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
  31839. return WOLFSSL_TICKET_RET_REJECT;
  31840. }
  31841. }
  31842. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  31843. WOLFSSL_MSG("Bad user ticket decrypt len");
  31844. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
  31845. return BAD_TICKET_KEY_CB_SZ;
  31846. }
  31847. *it = (InternalTicket*)et->enc_ticket;
  31848. return ret;
  31849. }
  31850. static int DoClientTicketCheckVersion(const WOLFSSL* ssl,
  31851. InternalTicket* it)
  31852. {
  31853. if (ssl->version.minor < it->pv.minor) {
  31854. WOLFSSL_MSG("Ticket has greater version");
  31855. return VERSION_ERROR;
  31856. }
  31857. else if (ssl->version.minor > it->pv.minor) {
  31858. if (IsAtLeastTLSv1_3(it->pv) != IsAtLeastTLSv1_3(ssl->version)) {
  31859. WOLFSSL_MSG("Tickets cannot be shared between "
  31860. "TLS 1.3 and TLS 1.2 and lower");
  31861. return VERSION_ERROR;
  31862. }
  31863. if (!ssl->options.downgrade) {
  31864. WOLFSSL_MSG("Ticket has lesser version");
  31865. return VERSION_ERROR;
  31866. }
  31867. WOLFSSL_MSG("Downgrading protocol due to ticket");
  31868. if (it->pv.minor < ssl->options.minDowngrade) {
  31869. WOLFSSL_MSG("Ticket has lesser version than allowed");
  31870. return VERSION_ERROR;
  31871. }
  31872. }
  31873. #ifdef WOLFSSL_TLS13
  31874. /* Check resumption master secret. */
  31875. if (IsAtLeastTLSv1_3(it->pv) &&
  31876. it->ticketNonceLen > MAX_TICKET_NONCE_STATIC_SZ) {
  31877. WOLFSSL_MSG("Unsupported ticketNonce len in ticket");
  31878. return BAD_TICKET_ENCRYPT;
  31879. }
  31880. #endif
  31881. return 0;
  31882. }
  31883. #if defined(WOLFSSL_TLS13)
  31884. /* Return 0 when check successful. <0 on failure. */
  31885. int DoClientTicketCheck(const WOLFSSL* ssl, const PreSharedKey* psk,
  31886. sword64 timeout, const byte* suite)
  31887. {
  31888. word32 ticketAdd;
  31889. #ifdef WOLFSSL_32BIT_MILLI_TIME
  31890. word32 now;
  31891. sword64 diff;
  31892. word32 ticketSeen; /* Time ticket seen (ms) */
  31893. ato32(psk->it->timestamp, &ticketSeen);
  31894. now = TimeNowInMilliseconds();
  31895. if (now == 0)
  31896. return GETTIME_ERROR;
  31897. /* Difference between now and time ticket constructed
  31898. * (from decrypted ticket). */
  31899. diff = now;
  31900. diff -= ticketSeen;
  31901. if (diff > timeout * 1000 ||
  31902. diff > (sword64)TLS13_MAX_TICKET_AGE * 1000)
  31903. return -1;
  31904. #else
  31905. sword64 diff;
  31906. sword64 ticketSeen; /* Time ticket seen (ms) */
  31907. word32 seenHi, seenLo;
  31908. ato32(psk->it->timestamp , &seenHi);
  31909. ato32(psk->it->timestamp + OPAQUE32_LEN, &seenLo);
  31910. ticketSeen = ((sword64)seenHi << 32) + seenLo;
  31911. diff = TimeNowInMilliseconds();
  31912. if (diff == 0)
  31913. return GETTIME_ERROR;
  31914. /* Difference between now and time ticket constructed
  31915. * (from decrypted ticket). */
  31916. diff -= ticketSeen;
  31917. if (diff > timeout * 1000 ||
  31918. diff > (sword64)TLS13_MAX_TICKET_AGE * 1000)
  31919. return -1;
  31920. #endif
  31921. ato32(psk->it->ageAdd, &ticketAdd);
  31922. /* Subtract client's ticket age and unobfuscate. */
  31923. diff -= psk->ticketAge;
  31924. diff += ticketAdd;
  31925. /* Check session and ticket age timeout.
  31926. * Allow +/- 1000 milliseconds on ticket age.
  31927. */
  31928. if (diff < -1000 || diff - MAX_TICKET_AGE_DIFF * 1000 > 1000)
  31929. return -1;
  31930. #if !defined(WOLFSSL_PSK_ONE_ID) && !defined(WOLFSSL_PRIORITIZE_PSK)
  31931. /* Check whether resumption is possible based on suites in SSL and
  31932. * ciphersuite in ticket.
  31933. */
  31934. (void)ssl;
  31935. if (XMEMCMP(suite, psk->it->suite, SUITE_LEN) != 0)
  31936. return -1;
  31937. #else
  31938. (void)suite;
  31939. if (!FindSuiteSSL(ssl, psk->it->suite))
  31940. return -1;
  31941. #endif
  31942. #ifdef OPENSSL_EXTRA
  31943. if (ssl->sessionCtxSz > 0 &&
  31944. (psk->it->sessionCtxSz != ssl->sessionCtxSz ||
  31945. XMEMCMP(psk->it->sessionCtx, ssl->sessionCtx,
  31946. ssl->sessionCtxSz) != 0))
  31947. return -1;
  31948. #endif
  31949. return 0;
  31950. }
  31951. #endif /* WOLFSSL_SLT13 */
  31952. void DoClientTicketFinalize(WOLFSSL* ssl, InternalTicket* it,
  31953. const WOLFSSL_SESSION* sess)
  31954. {
  31955. #ifdef WOLFSSL_TICKET_HAVE_ID
  31956. ssl->session->haveAltSessionID = 1;
  31957. XMEMCPY(ssl->session->altSessionID, it->id, ID_LEN);
  31958. #endif
  31959. if (sess != NULL) {
  31960. byte bogusID[ID_LEN];
  31961. byte bogusIDSz = ssl->session->sessionIDSz;
  31962. XMEMCPY(bogusID, ssl->session->sessionID, ID_LEN);
  31963. /* Failure here should not interrupt the resumption. We already have
  31964. * all the cipher material we need in `it` */
  31965. WOLFSSL_MSG("Copying in session from passed in arg");
  31966. (void)wolfSSL_DupSession(sess, ssl->session, 1);
  31967. /* Restore the fake ID */
  31968. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  31969. ssl->session->sessionIDSz= bogusIDSz;
  31970. }
  31971. #ifdef WOLFSSL_TICKET_HAVE_ID
  31972. else {
  31973. if (wolfSSL_GetSession(ssl, NULL, 1) != NULL) {
  31974. WOLFSSL_MSG("Found session matching the session id"
  31975. " found in the ticket");
  31976. }
  31977. else {
  31978. WOLFSSL_MSG("Can't find session matching the session id"
  31979. " found in the ticket");
  31980. }
  31981. }
  31982. #endif
  31983. if (!IsAtLeastTLSv1_3(ssl->version)) {
  31984. XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN);
  31985. /* Copy the haveExtendedMasterSecret property from the ticket to
  31986. * the saved session, so the property may be checked later. */
  31987. ssl->session->haveEMS = it->haveEMS;
  31988. ato32((const byte*)&it->timestamp, &ssl->session->bornOn);
  31989. #ifndef NO_RESUME_SUITE_CHECK
  31990. ssl->session->cipherSuite0 = it->suite[0];
  31991. ssl->session->cipherSuite = it->suite[1];
  31992. #endif
  31993. }
  31994. else {
  31995. #ifdef WOLFSSL_TLS13
  31996. /* This should have been already checked in
  31997. * DoClientTicketCheckVersion */
  31998. if (it->ticketNonceLen > MAX_TICKET_NONCE_STATIC_SZ) {
  31999. WOLFSSL_MSG("Unsupported ticketNonce len in ticket");
  32000. return;
  32001. }
  32002. /* Restore information to renegotiate. */
  32003. #ifdef WOLFSSL_32BIT_MILLI_TIME
  32004. ato32(it->timestamp, &ssl->session->ticketSeen);
  32005. #else
  32006. {
  32007. word32 seenHi, seenLo;
  32008. ato32(it->timestamp , &seenHi);
  32009. ato32(it->timestamp + OPAQUE32_LEN, &seenLo);
  32010. ssl->session->ticketSeen = ((sword64)seenHi << 32) + seenLo;
  32011. }
  32012. #endif
  32013. ato32(it->ageAdd, &ssl->session->ticketAdd);
  32014. ssl->session->cipherSuite0 = it->suite[0];
  32015. ssl->session->cipherSuite = it->suite[1];
  32016. #ifdef WOLFSSL_EARLY_DATA
  32017. ato32(it->maxEarlyDataSz, &ssl->session->maxEarlyDataSz);
  32018. #endif
  32019. /* Resumption master secret. */
  32020. XMEMCPY(ssl->session->masterSecret, it->msecret, SECRET_LEN);
  32021. #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  32022. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  32023. if (ssl->session->ticketNonce.data
  32024. != ssl->session->ticketNonce.dataStatic) {
  32025. XFREE(ssl->session->ticketNonce.data, ssl->heap,
  32026. DYNAMIC_TYPE_SESSION_TICK);
  32027. ssl->session->ticketNonce.data =
  32028. ssl->session->ticketNonce.dataStatic;
  32029. }
  32030. #endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
  32031. XMEMCPY(ssl->session->ticketNonce.data, it->ticketNonce,
  32032. it->ticketNonceLen);
  32033. ssl->session->ticketNonce.len = it->ticketNonceLen;
  32034. ato16(it->namedGroup, &ssl->session->namedGroup);
  32035. #endif
  32036. }
  32037. ssl->version.minor = it->pv.minor;
  32038. }
  32039. #if defined(WOLFSSL_TLS13)
  32040. static void PopulateInternalTicketFromSession(const WOLFSSL_SESSION* sess,
  32041. InternalTicket* it)
  32042. {
  32043. #ifdef WOLFSSL_32BIT_MILLI_TIME
  32044. word32 milliBornOn = sess->bornOn;
  32045. #else
  32046. sword64 milliBornOn = (sword64)sess->bornOn;
  32047. #endif
  32048. /* Convert to milliseconds */
  32049. milliBornOn *= 1000;
  32050. it->pv = sess->version;
  32051. it->suite[0] = sess->cipherSuite0;
  32052. it->suite[1] = sess->cipherSuite;
  32053. XMEMCPY(it->msecret, sess->masterSecret, SECRET_LEN);
  32054. #ifdef WOLFSSL_32BIT_MILLI_TIME
  32055. c32toa(milliBornOn, it->timestamp);
  32056. #else
  32057. c32toa((word32)(milliBornOn >> 32), it->timestamp);
  32058. c32toa((word32)milliBornOn , it->timestamp + OPAQUE32_LEN);
  32059. #endif
  32060. it->haveEMS = (byte)sess->haveEMS;
  32061. c32toa(sess->ticketAdd, it->ageAdd);
  32062. c16toa(sess->namedGroup, it->namedGroup);
  32063. if (sess->ticketNonce.len <= MAX_TICKET_NONCE_STATIC_SZ) {
  32064. it->ticketNonceLen = sess->ticketNonce.len;
  32065. XMEMCPY(it->ticketNonce, sess->ticketNonce.data,
  32066. sess->ticketNonce.len);
  32067. }
  32068. #ifdef WOLFSSL_EARLY_DATA
  32069. c32toa(sess->maxEarlyDataSz, it->maxEarlyDataSz);
  32070. #endif
  32071. #ifdef WOLFSSL_TICKET_HAVE_ID
  32072. if (sess->haveAltSessionID)
  32073. XMEMCPY(it->id, sess->altSessionID, ID_LEN);
  32074. else
  32075. XMEMCPY(it->id, sess->sessionID, ID_LEN);
  32076. #endif
  32077. #ifdef OPENSSL_EXTRA
  32078. it->sessionCtxSz = sess->sessionCtxSz;
  32079. XMEMCPY(it->sessionCtx, sess->sessionCtx, sess->sessionCtxSz);
  32080. #endif
  32081. }
  32082. static const WOLFSSL_SESSION* GetSesionFromCacheOrExt(const WOLFSSL* ssl,
  32083. const byte* id, psk_sess_free_cb_ctx* freeCtx)
  32084. {
  32085. const WOLFSSL_SESSION* sess = NULL;
  32086. int ret;
  32087. XMEMSET(freeCtx, 0, sizeof(*freeCtx));
  32088. #ifdef HAVE_EXT_CACHE
  32089. if (ssl->ctx->get_sess_cb != NULL) {
  32090. int copy = 0;
  32091. sess = ssl->ctx->get_sess_cb((WOLFSSL*)ssl,
  32092. id, ID_LEN, &copy);
  32093. if (sess != NULL) {
  32094. freeCtx->extCache = 1;
  32095. /* If copy not set then free immediately */
  32096. if (!copy)
  32097. freeCtx->freeSess = 1;
  32098. }
  32099. }
  32100. #endif
  32101. if (sess == NULL) {
  32102. ret = TlsSessionCacheGetAndRdLock(id, &sess, &freeCtx->row,
  32103. ssl->options.side);
  32104. if (ret != 0)
  32105. sess = NULL;
  32106. }
  32107. return sess;
  32108. }
  32109. static void FreeSessionFromCacheOrExt(const WOLFSSL* ssl,
  32110. const WOLFSSL_SESSION* sess, psk_sess_free_cb_ctx* freeCtx)
  32111. {
  32112. (void)ssl;
  32113. (void)sess;
  32114. #ifdef HAVE_EXT_CACHE
  32115. if (freeCtx->extCache) {
  32116. if (freeCtx->freeSess)
  32117. /* In this case sess is not longer const and the external cache
  32118. * wants us to free it. */
  32119. wolfSSL_FreeSession(ssl->ctx, (WOLFSSL_SESSION*)sess);
  32120. }
  32121. else
  32122. #endif
  32123. TlsSessionCacheUnlockRow(freeCtx->row);
  32124. }
  32125. /* Parse ticket sent by client, returns callback return value. Doesn't
  32126. * modify ssl and stores the InternalTicket inside psk */
  32127. int DoClientTicket_ex(const WOLFSSL* ssl, PreSharedKey* psk, int retainSess)
  32128. {
  32129. int ret;
  32130. int decryptRet = WOLFSSL_TICKET_RET_REJECT;
  32131. WOLFSSL_START(WC_FUNC_TICKET_DO);
  32132. WOLFSSL_ENTER("DoClientTicket_ex");
  32133. if (psk->identityLen == ID_LEN && IsAtLeastTLSv1_3(ssl->version)) {
  32134. /* This is a stateful ticket. We can be sure about this because
  32135. * stateless tickets are much longer. */
  32136. const WOLFSSL_SESSION* sess = NULL;
  32137. sess = GetSesionFromCacheOrExt(ssl, psk->identity,
  32138. &psk->sess_free_cb_ctx);
  32139. if (sess != NULL) {
  32140. /* Session found in cache. Copy in relevant info to psk */
  32141. byte* tmp;
  32142. WOLFSSL_MSG("Found session matching the session id"
  32143. " found in the ticket");
  32144. /* Allocate and populate an InternalTicket */
  32145. tmp = (byte*)XREALLOC(psk->identity, sizeof(InternalTicket),
  32146. ssl->heap, DYNAMIC_TYPE_TLSX);
  32147. if (tmp != NULL) {
  32148. XMEMSET(tmp, 0, sizeof(InternalTicket));
  32149. psk->identity = tmp;
  32150. psk->identityLen = sizeof(InternalTicket);
  32151. psk->it = (InternalTicket*)tmp;
  32152. PopulateInternalTicketFromSession(sess, psk->it);
  32153. decryptRet = WOLFSSL_TICKET_RET_OK;
  32154. if (retainSess) {
  32155. psk->sess = sess;
  32156. psk->sess_free_cb = FreeSessionFromCacheOrExt;
  32157. }
  32158. }
  32159. if (psk->sess == NULL) {
  32160. FreeSessionFromCacheOrExt(ssl, sess,
  32161. &psk->sess_free_cb_ctx);
  32162. XMEMSET(&psk->sess_free_cb_ctx, 0,
  32163. sizeof(psk_sess_free_cb_ctx));
  32164. }
  32165. }
  32166. }
  32167. else {
  32168. decryptRet = DoDecryptTicket(ssl, psk->identity, psk->identityLen,
  32169. &psk->it);
  32170. }
  32171. switch (decryptRet) {
  32172. case WOLFSSL_TICKET_RET_OK:
  32173. psk->decryptRet = PSK_DECRYPT_OK;
  32174. break;
  32175. case WOLFSSL_TICKET_RET_CREATE:
  32176. psk->decryptRet = PSK_DECRYPT_CREATE;
  32177. break;
  32178. default:
  32179. psk->decryptRet = PSK_DECRYPT_FAIL;
  32180. WOLFSSL_LEAVE("DoClientTicket_ex", decryptRet);
  32181. return decryptRet;
  32182. }
  32183. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32184. /* Internal ticket successfully decrypted. */
  32185. wc_MemZero_Add("Do Client Ticket internal", psk->it,
  32186. sizeof(InternalTicket));
  32187. #endif
  32188. ret = DoClientTicketCheckVersion(ssl, psk->it);
  32189. if (ret != 0) {
  32190. psk->decryptRet = PSK_DECRYPT_FAIL;
  32191. ForceZero(psk->identity, psk->identityLen);
  32192. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32193. wc_MemZero_Check(psk->it, sizeof(InternalTicket));
  32194. #endif
  32195. WOLFSSL_LEAVE("DoClientTicket_ex", ret);
  32196. return ret;
  32197. }
  32198. WOLFSSL_LEAVE("DoClientTicket_ex", decryptRet);
  32199. return decryptRet;
  32200. }
  32201. #endif /* WOLFSL_TLS13 */
  32202. /* Parse ticket sent by client, returns callback return value */
  32203. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  32204. {
  32205. int decryptRet = WOLFSSL_TICKET_RET_REJECT;
  32206. int ret;
  32207. InternalTicket* it;
  32208. #ifdef WOLFSSL_TLS13
  32209. InternalTicket staticIt;
  32210. const WOLFSSL_SESSION* sess = NULL;
  32211. psk_sess_free_cb_ctx freeCtx;
  32212. XMEMSET(&freeCtx, 0, sizeof(psk_sess_free_cb_ctx));
  32213. #endif
  32214. WOLFSSL_START(WC_FUNC_TICKET_DO);
  32215. WOLFSSL_ENTER("DoClientTicket");
  32216. #ifdef WOLFSSL_TLS13
  32217. if (len == ID_LEN && IsAtLeastTLSv1_3(ssl->version)) {
  32218. /* This is a stateful ticket. We can be sure about this because
  32219. * stateless tickets are much longer. */
  32220. sess = GetSesionFromCacheOrExt(ssl, input, &freeCtx);
  32221. if (sess != NULL) {
  32222. it = &staticIt;
  32223. XMEMSET(it, 0, sizeof(InternalTicket));
  32224. PopulateInternalTicketFromSession(sess, it);
  32225. decryptRet = WOLFSSL_TICKET_RET_OK;
  32226. }
  32227. }
  32228. else
  32229. #endif
  32230. decryptRet = DoDecryptTicket(ssl, input, len, &it);
  32231. if (decryptRet != WOLFSSL_TICKET_RET_OK &&
  32232. decryptRet != WOLFSSL_TICKET_RET_CREATE) {
  32233. it = NULL;
  32234. goto cleanup;
  32235. }
  32236. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32237. /* Internal ticket successfully decrypted. */
  32238. wc_MemZero_Add("Do Client Ticket internal", it, sizeof(InternalTicket));
  32239. #endif
  32240. ret = DoClientTicketCheckVersion(ssl, it);
  32241. if (ret != 0) {
  32242. decryptRet = ret;
  32243. goto cleanup;
  32244. }
  32245. DoClientTicketFinalize(ssl, it, NULL);
  32246. cleanup:
  32247. if (it != NULL) {
  32248. ForceZero(it, sizeof(*it));
  32249. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32250. wc_MemZero_Check(it, sizeof(InternalTicket));
  32251. #endif
  32252. }
  32253. #ifdef WOLFSSL_TLS13
  32254. if (sess != NULL)
  32255. FreeSessionFromCacheOrExt(ssl, sess, &freeCtx);
  32256. #endif
  32257. return decryptRet;
  32258. }
  32259. #ifdef WOLFSSL_TLS13
  32260. void CleanupClientTickets(PreSharedKey* psk)
  32261. {
  32262. for (; psk != NULL; psk = psk->next) {
  32263. if (psk->decryptRet == PSK_DECRYPT_OK ||
  32264. psk->decryptRet == PSK_DECRYPT_CREATE) {
  32265. psk->decryptRet = PSK_DECRYPT_NONE;
  32266. ForceZero(psk->identity, psk->identityLen);
  32267. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32268. /* We want to check the InternalTicket area since that is what
  32269. * we registered in DoClientTicket_ex */
  32270. wc_MemZero_Check((((ExternalTicket*)psk->identity)->enc_ticket),
  32271. sizeof(InternalTicket));
  32272. #endif
  32273. }
  32274. }
  32275. }
  32276. #endif /* WOLFSSL_TLS13 */
  32277. /* send Session Ticket */
  32278. int SendTicket(WOLFSSL* ssl)
  32279. {
  32280. byte* output;
  32281. int ret;
  32282. int sendSz;
  32283. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  32284. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  32285. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  32286. WOLFSSL_ENTER("SendTicket");
  32287. if (ssl->options.createTicket) {
  32288. ret = SetupTicket(ssl);
  32289. if (ret != 0)
  32290. return ret;
  32291. ret = CreateTicket(ssl);
  32292. if (ret != 0)
  32293. return ret;
  32294. }
  32295. length += ssl->session->ticketLen;
  32296. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  32297. if (!ssl->options.dtls) {
  32298. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  32299. sendSz += MAX_MSG_EXTRA;
  32300. }
  32301. else {
  32302. #ifdef WOLFSSL_DTLS
  32303. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  32304. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  32305. #endif
  32306. }
  32307. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  32308. sendSz += cipherExtraData(ssl);
  32309. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  32310. * is not advanced yet */
  32311. ssl->options.buildingMsg = 1;
  32312. /* check for available size */
  32313. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  32314. return ret;
  32315. /* get output buffer */
  32316. output = GetOutputBuffer(ssl);
  32317. AddHeaders(output, length, session_ticket, ssl);
  32318. /* hint */
  32319. c32toa(ssl->ctx->ticketHint, output + idx);
  32320. idx += SESSION_HINT_SZ;
  32321. /* length */
  32322. c16toa(ssl->session->ticketLen, output + idx);
  32323. idx += LENGTH_SZ;
  32324. /* ticket */
  32325. XMEMCPY(output + idx, ssl->session->ticket, ssl->session->ticketLen);
  32326. idx += ssl->session->ticketLen;
  32327. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  32328. byte* input;
  32329. int inputSz = idx; /* build msg adds rec hdr */
  32330. int recordHeaderSz = RECORD_HEADER_SZ;
  32331. if (ssl->options.dtls)
  32332. recordHeaderSz += DTLS_RECORD_EXTRA;
  32333. inputSz -= recordHeaderSz;
  32334. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  32335. if (input == NULL)
  32336. return MEMORY_E;
  32337. XMEMCPY(input, output + recordHeaderSz, inputSz);
  32338. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  32339. handshake, 1, 0, 0, CUR_ORDER);
  32340. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  32341. if (sendSz < 0)
  32342. return sendSz;
  32343. }
  32344. else {
  32345. #ifdef WOLFSSL_DTLS
  32346. if (ssl->options.dtls) {
  32347. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
  32348. return ret;
  32349. DtlsSEQIncrement(ssl, CUR_ORDER);
  32350. }
  32351. #endif
  32352. ret = HashOutput(ssl, output, sendSz, 0);
  32353. if (ret != 0)
  32354. return ret;
  32355. }
  32356. ssl->buffers.outputBuffer.length += sendSz;
  32357. ssl->options.buildingMsg = 0;
  32358. if (!ssl->options.groupMessages)
  32359. ret = SendBuffered(ssl);
  32360. WOLFSSL_LEAVE("SendTicket", ret);
  32361. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  32362. return ret;
  32363. }
  32364. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  32365. /* Initialize the context for session ticket encryption.
  32366. *
  32367. * @param [in] ctx SSL context.
  32368. * @param [in] keyCtx Context for session ticket encryption.
  32369. * @return 0 on success.
  32370. * @return BAD_MUTEX_E when initializing mutex fails.
  32371. */
  32372. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
  32373. {
  32374. int ret = 0;
  32375. XMEMSET(keyCtx, 0, sizeof(*keyCtx));
  32376. keyCtx->ctx = ctx;
  32377. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32378. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->name", keyCtx->name,
  32379. sizeof(keyCtx->name));
  32380. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[0]", keyCtx->key[0],
  32381. sizeof(keyCtx->key[0]));
  32382. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[1]", keyCtx->key[1],
  32383. sizeof(keyCtx->key[1]));
  32384. #endif
  32385. #ifndef SINGLE_THREADED
  32386. ret = wc_InitMutex(&keyCtx->mutex);
  32387. #endif
  32388. return ret;
  32389. }
  32390. /* Setup the session ticket encryption context for this.
  32391. *
  32392. * Initialize RNG, generate name, generate primary key and set primary key
  32393. * expirary.
  32394. *
  32395. * @param [in] keyCtx Context for session ticket encryption.
  32396. * @param [in] heap Dynamic memory allocation hint.
  32397. * @param [in] devId Device identifier.
  32398. * @return 0 on success.
  32399. * @return Other value when random number generator fails.
  32400. */
  32401. static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
  32402. {
  32403. int ret;
  32404. #ifndef SINGLE_THREADED
  32405. ret = 0;
  32406. /* Check that key wasn't set up while waiting. */
  32407. if (keyCtx->expirary[0] == 0)
  32408. #endif
  32409. {
  32410. ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
  32411. if (ret == 0) {
  32412. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
  32413. sizeof(keyCtx->name));
  32414. }
  32415. if (ret == 0) {
  32416. /* Mask of the bottom bit - used for index of key. */
  32417. keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
  32418. /* Generate initial primary key. */
  32419. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
  32420. WOLFSSL_TICKET_KEY_SZ);
  32421. }
  32422. if (ret == 0) {
  32423. keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
  32424. }
  32425. }
  32426. return ret;
  32427. }
  32428. /* Free the context for session ticket encryption.
  32429. *
  32430. * Zeroize keys and name.
  32431. *
  32432. * @param [in] keyCtx Context for session ticket encryption.
  32433. */
  32434. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
  32435. {
  32436. /* Zeroize sensitive data. */
  32437. ForceZero(keyCtx->name, sizeof(keyCtx->name));
  32438. ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
  32439. ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
  32440. #ifdef WOLFSSL_CHECK_MEM_ZERO
  32441. wc_MemZero_Check(keyCtx->name, sizeof(keyCtx->name));
  32442. wc_MemZero_Check(keyCtx->key[0], sizeof(keyCtx->key[0]));
  32443. wc_MemZero_Check(keyCtx->key[1], sizeof(keyCtx->key[1]));
  32444. #endif
  32445. #ifndef SINGLE_THREADED
  32446. wc_FreeMutex(&keyCtx->mutex);
  32447. #endif
  32448. wc_FreeRng(&keyCtx->rng);
  32449. }
  32450. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  32451. !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
  32452. !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
  32453. /* Ticket encryption/decryption implementation.
  32454. *
  32455. * @param [in] key Key for encryption/decryption.
  32456. * @param [in] keyLen Length of key in bytes.
  32457. * @param [in] iv IV/Nonce for encryption/decryption.
  32458. * @param [in] aad Additional authentication data.
  32459. * @param [in] aadSz Length of additional authentication data.
  32460. * @param [in] in Data to encrypt/decrypt.
  32461. * @param [in] inLen Length of encrypted data.
  32462. * @param [out] out Resulting data from encrypt/decrypt.
  32463. * @param [out] outLen Size of resulting data.
  32464. * @param [in] tag Authentication tag for encrypted data.
  32465. * @param [in] heap Dynamic memory allocation data hint.
  32466. * @param [in] enc 1 when encrypting, 0 when decrypting.
  32467. * @return 0 on success.
  32468. * @return Other value when encryption/decryption fails.
  32469. */
  32470. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  32471. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  32472. void* heap, int enc)
  32473. {
  32474. int ret;
  32475. (void)keyLen;
  32476. (void)heap;
  32477. if (enc) {
  32478. ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
  32479. tag);
  32480. }
  32481. else {
  32482. ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
  32483. out);
  32484. }
  32485. *outLen = inLen;
  32486. return ret;
  32487. }
  32488. #elif defined(HAVE_AESGCM)
  32489. /* Ticket encryption/decryption implementation.
  32490. *
  32491. * @param [in] key Key for encryption/decryption.
  32492. * @param [in] keyLen Length of key in bytes.
  32493. * @param [in] iv IV/Nonce for encryption/decryption.
  32494. * @param [in] aad Additional authentication data.
  32495. * @param [in] aadSz Length of additional authentication data.
  32496. * @param [in] in Data to encrypt/decrypt.
  32497. * @param [in] inLen Length of encrypted data.
  32498. * @param [out] out Resulting data from encrypt/decrypt.
  32499. * @param [out] outLen Size of resulting data.
  32500. * @param [in] tag Authentication tag for encrypted data.
  32501. * @param [in] heap Dynamic memory allocation data hint.
  32502. * @param [in] enc 1 when encrypting, 0 when decrypting.
  32503. * @return 0 on success.
  32504. * @return MEMORY_E when dynamic memory allocation fails.
  32505. * @return Other value when encryption/decryption fails.
  32506. */
  32507. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  32508. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  32509. void* heap, int enc)
  32510. {
  32511. int ret;
  32512. #ifdef WOLFSSL_SMALL_STACK
  32513. Aes* aes;
  32514. #else
  32515. Aes aes[1];
  32516. #endif
  32517. (void)heap;
  32518. #ifdef WOLFSSL_SMALL_STACK
  32519. aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
  32520. if (aes == NULL)
  32521. return MEMORY_E;
  32522. #endif
  32523. if (enc) {
  32524. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  32525. if (ret == 0) {
  32526. ret = wc_AesGcmSetKey(aes, key, keyLen);
  32527. }
  32528. if (ret == 0) {
  32529. ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  32530. tag, AES_BLOCK_SIZE, aad, aadSz);
  32531. }
  32532. wc_AesFree(aes);
  32533. }
  32534. else {
  32535. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  32536. if (ret == 0) {
  32537. ret = wc_AesGcmSetKey(aes, key, keyLen);
  32538. }
  32539. if (ret == 0) {
  32540. ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  32541. tag, AES_BLOCK_SIZE, aad, aadSz);
  32542. }
  32543. wc_AesFree(aes);
  32544. }
  32545. #ifdef WOLFSSL_SMALL_STACK
  32546. XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
  32547. #endif
  32548. *outLen = inLen;
  32549. return ret;
  32550. }
  32551. #elif defined(WOLFSSL_SM4_GCM)
  32552. /* Ticket encryption/decryption implementation.
  32553. *
  32554. * @param [in] key Key for encryption/decryption.
  32555. * @param [in] keyLen Length of key in bytes.
  32556. * @param [in] iv IV/Nonce for encryption/decryption.
  32557. * @param [in] aad Additional authentication data.
  32558. * @param [in] aadSz Length of additional authentication data.
  32559. * @param [in] in Data to encrypt/decrypt.
  32560. * @param [in] inLen Length of encrypted data.
  32561. * @param [out] out Resulting data from encrypt/decrypt.
  32562. * @param [out] outLen Size of resulting data.
  32563. * @param [in] tag Authentication tag for encrypted data.
  32564. * @param [in] heap Dynamic memory allocation data hint.
  32565. * @param [in] enc 1 when encrypting, 0 when decrypting.
  32566. * @return 0 on success.
  32567. * @return MEMORY_E when dynamic memory allocation fails.
  32568. * @return Other value when encryption/decryption fails.
  32569. */
  32570. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  32571. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  32572. void* heap, int enc)
  32573. {
  32574. int ret;
  32575. #ifdef WOLFSSL_SMALL_STACK
  32576. wc_Sm4* sm4;
  32577. #else
  32578. wc_Sm4 sm4[1];
  32579. #endif
  32580. (void)heap;
  32581. #ifdef WOLFSSL_SMALL_STACK
  32582. sm4 = (wc_Sm4*)XMALLOC(sizeof(wc_Sm4), heap, DYNAMIC_TYPE_TMP_BUFFER);
  32583. if (sm4 == NULL)
  32584. return MEMORY_E;
  32585. #endif
  32586. if (enc) {
  32587. ret = wc_Sm4Init(sm4, NULL, INVALID_DEVID);
  32588. if (ret == 0) {
  32589. ret = wc_Sm4GcmSetKey(sm4, key, keyLen);
  32590. }
  32591. if (ret == 0) {
  32592. ret = wc_Sm4GcmEncrypt(sm4, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  32593. tag, SM4_BLOCK_SIZE, aad, aadSz);
  32594. }
  32595. wc_Sm4Free(sm4);
  32596. }
  32597. else {
  32598. ret = wc_Sm4Init(sm4, NULL, INVALID_DEVID);
  32599. if (ret == 0) {
  32600. ret = wc_Sm4GcmSetKey(sm4, key, keyLen);
  32601. }
  32602. if (ret == 0) {
  32603. ret = wc_Sm4GcmDecrypt(sm4, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  32604. tag, SM$_BLOCK_SIZE, aad, aadSz);
  32605. }
  32606. wc_Sm4Free(sm4);
  32607. }
  32608. #ifdef WOLFSSL_SMALL_STACK
  32609. XFREE(sm4, heap, DYNAMIC_TYPE_TMP_BUFFER);
  32610. #endif
  32611. *outLen = inLen;
  32612. return ret;
  32613. }
  32614. #else
  32615. #error "No encryption algorithm available for default ticket encryption."
  32616. #endif
  32617. /* Choose a key to use for encryption.
  32618. *
  32619. * Generate a new key if the current ones are expired.
  32620. * If the secondary key has not been used and the primary key has expired then
  32621. * generate a new primary key.
  32622. *
  32623. * @param [in] Ticket encryption callback context.
  32624. * @param [in] Session ticket lifetime.
  32625. * @param [out] Index of key to use for encryption.
  32626. * @return 0 on success.
  32627. * @return Other value when random number generation fails.
  32628. */
  32629. static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
  32630. int* keyIdx)
  32631. {
  32632. int ret = 0;
  32633. /* Get new current time as lock may have taken some time. */
  32634. word32 now = LowResTimer();
  32635. /* Check expirary of primary key for encrypt. */
  32636. if (keyCtx->expirary[0] >= now + ticketHint) {
  32637. *keyIdx = 0;
  32638. }
  32639. /* Check expirary of primary key for encrypt. */
  32640. else if (keyCtx->expirary[1] >= now + ticketHint) {
  32641. *keyIdx = 1;
  32642. }
  32643. /* No key available to use. */
  32644. else {
  32645. int genKey;
  32646. /* Generate which ever key is expired for decrypt - primary first. */
  32647. if (keyCtx->expirary[0] < now) {
  32648. genKey = 0;
  32649. }
  32650. else if (keyCtx->expirary[1] < now) {
  32651. genKey = 1;
  32652. }
  32653. /* Timeouts and expirary should not allow this to happen. */
  32654. else {
  32655. return BAD_STATE_E;
  32656. }
  32657. /* Generate the required key */
  32658. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
  32659. WOLFSSL_TICKET_KEY_SZ);
  32660. if (ret == 0) {
  32661. keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
  32662. *keyIdx = genKey;
  32663. }
  32664. }
  32665. return ret;
  32666. }
  32667. /* Default Session Ticket encryption/decryption callback.
  32668. *
  32669. * Use ChaCha20-Poly1305, AES-GCM or SM4-GCM to encrypt/decrypt the ticket.
  32670. * Two keys are used:
  32671. * - When the first expires for encryption, then use the other.
  32672. * - Don't encrypt with key if the ticket lifetime will go beyond expirary.
  32673. * - Generate a new primary key when primary key expired for decrypt and
  32674. * no secondary key is activate for encryption.
  32675. * - Generate a new secondary key when expired and needed.
  32676. * - Calculate expirary starting from first encrypted ticket.
  32677. * - Key name has last bit set to indicate index of key.
  32678. * Keys expire for decryption after ticket key lifetime from the first encrypted
  32679. * ticket.
  32680. * Keys can only be use for encryption while the ticket hint does not exceed
  32681. * the key lifetime.
  32682. * Lifetime of a key must be greater than the lifetime of a ticket. This means
  32683. * that if one ticket is only valid for decryption, then the other will be
  32684. * valid for encryption.
  32685. * AAD = key_name | iv | ticket len (16-bits network order)
  32686. *
  32687. * @param [in] ssl SSL connection.
  32688. * @param [in,out] key_name Name of key from client.
  32689. * Encrypt: name of key returned.
  32690. * Decrypt: name from ticket message to check.
  32691. * @param [in] iv IV to use in encryption/decryption.
  32692. * @param [in] mac MAC for authentication of encrypted data.
  32693. * @param [in] enc 1 when encrypting ticket, 0 when decrypting.
  32694. * @param [in,out] ticket Encrypted/decrypted session ticket bytes.
  32695. * @param [in] inLen Length of incoming ticket.
  32696. * @param [out] outLen Length of outgoing ticket.
  32697. * @param [in] userCtx Context for encryption/decryption of ticket.
  32698. * @return WOLFSSL_TICKET_RET_OK when successful.
  32699. * @return WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
  32700. * be created for TLS 1.2 and below.
  32701. * @return WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
  32702. * decrypted ticket.
  32703. * @return WOLFSSL_TICKET_RET_FATAL when key name does not match.
  32704. */
  32705. static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
  32706. byte iv[WOLFSSL_TICKET_IV_SZ],
  32707. byte mac[WOLFSSL_TICKET_MAC_SZ],
  32708. int enc, byte* ticket, int inLen, int* outLen,
  32709. void* userCtx)
  32710. {
  32711. int ret;
  32712. TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
  32713. WOLFSSL_CTX* ctx = keyCtx->ctx;
  32714. word16 sLen = XHTONS((word16)inLen);
  32715. byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
  32716. int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
  32717. byte* p = aad;
  32718. int keyIdx = 0;
  32719. WOLFSSL_ENTER("DefTicketEncCb");
  32720. /* Check we have setup the RNG, name and primary key. */
  32721. if (keyCtx->expirary[0] == 0) {
  32722. #ifndef SINGLE_THREADED
  32723. /* Lock around access to expirary and key - stop initial key being
  32724. * generated twice at the same time. */
  32725. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  32726. WOLFSSL_MSG("Couldn't lock key context mutex");
  32727. return WOLFSSL_TICKET_RET_REJECT;
  32728. }
  32729. #endif
  32730. /* Sets expirary of primary key in setup. */
  32731. ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
  32732. #ifndef SINGLE_THREADED
  32733. wc_UnLockMutex(&keyCtx->mutex);
  32734. #endif
  32735. if (ret != 0)
  32736. return ret;
  32737. }
  32738. if (enc) {
  32739. /* Return the name of the key - missing key index. */
  32740. XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  32741. /* Generate a new IV into buffer to be returned.
  32742. * Don't use the RNG in keyCtx as it's for generating private data. */
  32743. ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
  32744. if (ret != 0) {
  32745. return WOLFSSL_TICKET_RET_REJECT;
  32746. }
  32747. }
  32748. else {
  32749. /* Mask of last bit that is the key index. */
  32750. byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
  32751. /* For decryption, see if we know this key - check all but last byte. */
  32752. if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
  32753. return WOLFSSL_TICKET_RET_FATAL;
  32754. }
  32755. /* Ensure last byte without index bit matches too. */
  32756. if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
  32757. return WOLFSSL_TICKET_RET_FATAL;
  32758. }
  32759. }
  32760. /* Build AAD from: key name, iv, and length of ticket. */
  32761. XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  32762. p += WOLFSSL_TICKET_NAME_SZ;
  32763. XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
  32764. p += WOLFSSL_TICKET_IV_SZ;
  32765. XMEMCPY(p, &sLen, sizeof(sLen));
  32766. /* Encrypt ticket. */
  32767. if (enc) {
  32768. word32 now;
  32769. now = LowResTimer();
  32770. /* As long as encryption expirary isn't imminent - no lock. */
  32771. if (keyCtx->expirary[0] > now + ctx->ticketHint) {
  32772. keyIdx = 0;
  32773. }
  32774. else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
  32775. keyIdx = 1;
  32776. }
  32777. else {
  32778. #ifndef SINGLE_THREADED
  32779. /* Lock around access to expirary and key - stop key being generated
  32780. * twice at the same time. */
  32781. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  32782. WOLFSSL_MSG("Couldn't lock key context mutex");
  32783. return WOLFSSL_TICKET_RET_REJECT;
  32784. }
  32785. #endif
  32786. ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
  32787. #ifndef SINGLE_THREADED
  32788. wc_UnLockMutex(&keyCtx->mutex);
  32789. #endif
  32790. if (ret != 0) {
  32791. return WOLFSSL_TICKET_RET_REJECT;
  32792. }
  32793. }
  32794. /* Set the name of the key to the index chosen. */
  32795. key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  32796. /* Update AAD too. */
  32797. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  32798. /* Encrypt ticket data. */
  32799. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  32800. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  32801. 1);
  32802. if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
  32803. }
  32804. /* Decrypt ticket. */
  32805. else {
  32806. /* Get index of key from name. */
  32807. keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
  32808. /* Update AAD with index. */
  32809. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  32810. /* Check expirary */
  32811. if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
  32812. return WOLFSSL_TICKET_RET_REJECT;
  32813. }
  32814. /* Decrypt ticket data. */
  32815. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  32816. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  32817. 0);
  32818. if (ret != 0) {
  32819. return WOLFSSL_TICKET_RET_REJECT;
  32820. }
  32821. }
  32822. #ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
  32823. if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
  32824. return WOLFSSL_TICKET_RET_CREATE;
  32825. #endif
  32826. return WOLFSSL_TICKET_RET_OK;
  32827. }
  32828. #endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
  32829. #endif /* HAVE_SESSION_TICKET */
  32830. #ifndef WOLFSSL_NO_TLS12
  32831. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  32832. !defined(NO_WOLFSSL_SERVER)
  32833. /* handle generation of server's hello_request (0) */
  32834. int SendHelloRequest(WOLFSSL* ssl)
  32835. {
  32836. byte* output;
  32837. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  32838. int ret;
  32839. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  32840. WOLFSSL_ENTER("SendHelloRequest");
  32841. if (IsEncryptionOn(ssl, 1))
  32842. sendSz += MAX_MSG_EXTRA;
  32843. if (ssl->options.dtls)
  32844. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  32845. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  32846. * is not advanced yet */
  32847. ssl->options.buildingMsg = 1;
  32848. /* check for available size */
  32849. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  32850. return ret;
  32851. /* get output buffer */
  32852. output = GetOutputBuffer(ssl);
  32853. AddHeaders(output, 0, hello_request, ssl);
  32854. if (IsEncryptionOn(ssl, 1)) {
  32855. byte* input;
  32856. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  32857. int recordHeaderSz = RECORD_HEADER_SZ;
  32858. if (ssl->options.dtls) {
  32859. recordHeaderSz += DTLS_RECORD_EXTRA;
  32860. inputSz += DTLS_HANDSHAKE_EXTRA;
  32861. }
  32862. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  32863. if (input == NULL)
  32864. return MEMORY_E;
  32865. XMEMCPY(input, output + recordHeaderSz, inputSz);
  32866. #ifdef WOLFSSL_DTLS
  32867. if (IsDtlsNotSctpMode(ssl) &&
  32868. (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
  32869. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  32870. return ret;
  32871. }
  32872. #endif
  32873. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  32874. handshake, 0, 0, 0, CUR_ORDER);
  32875. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  32876. if (sendSz < 0)
  32877. return sendSz;
  32878. }
  32879. ssl->buffers.outputBuffer.length += sendSz;
  32880. ssl->options.buildingMsg = 0;
  32881. ret = SendBuffered(ssl);
  32882. WOLFSSL_LEAVE("SendHelloRequest", ret);
  32883. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  32884. return ret;
  32885. }
  32886. #endif /* HAVE_SECURE_RENEGOTIATION && !NO_WOLFSSL_SERVER */
  32887. #ifdef WOLFSSL_DTLS
  32888. /* handle generation of DTLS hello_verify_request (3) */
  32889. int SendHelloVerifyRequest(WOLFSSL* ssl,
  32890. const byte* cookie, byte cookieSz)
  32891. {
  32892. byte* output;
  32893. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  32894. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  32895. int sendSz = length + idx;
  32896. int ret;
  32897. /* are we in scr */
  32898. if (IsEncryptionOn(ssl, 1)) {
  32899. sendSz += MAX_MSG_EXTRA;
  32900. }
  32901. /* reset hashes */
  32902. ret = InitHandshakeHashes(ssl);
  32903. if (ret != 0)
  32904. return ret;
  32905. /* check for available size */
  32906. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  32907. return ret;
  32908. /* get output buffer */
  32909. output = GetOutputBuffer(ssl);
  32910. /* Hello Verify Request should use the same sequence number
  32911. * as the Client Hello unless we are in renegotiation then
  32912. * don't change numbers */
  32913. #ifdef HAVE_SECURE_RENEGOTIATION
  32914. if (!IsSCR(ssl))
  32915. #endif
  32916. {
  32917. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  32918. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  32919. }
  32920. AddHeaders(output, length, hello_verify_request, ssl);
  32921. output[idx++] = DTLS_MAJOR;
  32922. output[idx++] = DTLS_MINOR;
  32923. output[idx++] = cookieSz;
  32924. if (cookie == NULL || cookieSz == 0)
  32925. return COOKIE_ERROR;
  32926. XMEMCPY(output + idx, cookie, cookieSz);
  32927. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  32928. if (ssl->hsInfoOn)
  32929. AddPacketName(ssl, "HelloVerifyRequest");
  32930. if (ssl->toInfoOn) {
  32931. ret = AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  32932. sendSz, WRITE_PROTO, 0, ssl->heap);
  32933. if (ret != 0)
  32934. return ret;
  32935. }
  32936. #endif
  32937. /* are we in scr */
  32938. if (IsEncryptionOn(ssl, 1)) {
  32939. byte* input;
  32940. int inputSz = DTLS_HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
  32941. int recordHeaderSz = DTLS_RECORD_HEADER_SZ;
  32942. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  32943. if (input == NULL)
  32944. return MEMORY_E;
  32945. XMEMCPY(input, output + recordHeaderSz, inputSz);
  32946. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  32947. handshake, 0, 0, 0, CUR_ORDER);
  32948. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  32949. if (sendSz < 0)
  32950. return sendSz;
  32951. }
  32952. ssl->buffers.outputBuffer.length += sendSz;
  32953. return SendBuffered(ssl);
  32954. }
  32955. #endif /* WOLFSSL_DTLS */
  32956. typedef struct DckeArgs {
  32957. byte* output; /* not allocated */
  32958. word32 length;
  32959. word32 idx;
  32960. word32 begin;
  32961. word32 sigSz;
  32962. #ifndef NO_RSA
  32963. int lastErr;
  32964. #endif
  32965. } DckeArgs;
  32966. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  32967. {
  32968. DckeArgs* args = (DckeArgs*)pArgs;
  32969. (void)ssl;
  32970. (void)args;
  32971. }
  32972. /* handle processing client_key_exchange (16) */
  32973. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  32974. word32 size)
  32975. {
  32976. int ret;
  32977. #ifdef WOLFSSL_ASYNC_CRYPT
  32978. DckeArgs* args = NULL;
  32979. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  32980. #else
  32981. DckeArgs args[1];
  32982. #endif
  32983. (void)size;
  32984. (void)input;
  32985. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  32986. WOLFSSL_ENTER("DoClientKeyExchange");
  32987. #ifdef WOLFSSL_ASYNC_CRYPT
  32988. if (ssl->async == NULL) {
  32989. ssl->async = (struct WOLFSSL_ASYNC*)
  32990. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  32991. DYNAMIC_TYPE_ASYNC);
  32992. if (ssl->async == NULL)
  32993. ERROR_OUT(MEMORY_E, exit_dcke);
  32994. }
  32995. args = (DckeArgs*)ssl->async->args;
  32996. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  32997. if (ret != WC_NOT_PENDING_E) {
  32998. /* Check for error */
  32999. if (ret < 0)
  33000. goto exit_dcke;
  33001. }
  33002. else
  33003. #endif /* WOLFSSL_ASYNC_CRYPT */
  33004. {
  33005. /* Reset state */
  33006. ret = 0;
  33007. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  33008. XMEMSET(args, 0, sizeof(DckeArgs));
  33009. args->idx = *inOutIdx;
  33010. args->begin = *inOutIdx;
  33011. #ifdef WOLFSSL_ASYNC_CRYPT
  33012. ssl->async->freeArgs = FreeDckeArgs;
  33013. #endif
  33014. }
  33015. /* Do Client Key Exchange State Machine */
  33016. switch(ssl->options.asyncState)
  33017. {
  33018. case TLS_ASYNC_BEGIN:
  33019. {
  33020. /* Sanity checks */
  33021. /* server side checked in SanityCheckMsgReceived */
  33022. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  33023. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  33024. SendAlert(ssl, alert_fatal, unexpected_message);
  33025. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  33026. }
  33027. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  33028. if (ssl->options.verifyPeer &&
  33029. (ssl->options.mutualAuth || ssl->options.failNoCert)) {
  33030. if (!ssl->options.havePeerCert) {
  33031. WOLFSSL_MSG("client didn't present peer cert");
  33032. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  33033. }
  33034. }
  33035. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  33036. if (!ssl->options.havePeerCert &&
  33037. !ssl->options.usingPSK_cipher) {
  33038. WOLFSSL_MSG("client didn't present peer cert");
  33039. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  33040. }
  33041. }
  33042. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  33043. #if defined(WOLFSSL_CALLBACKS)
  33044. if (ssl->hsInfoOn) {
  33045. AddPacketName(ssl, "ClientKeyExchange");
  33046. }
  33047. if (ssl->toInfoOn) {
  33048. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  33049. }
  33050. #endif
  33051. if (ssl->arrays->preMasterSecret == NULL) {
  33052. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  33053. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  33054. ssl->heap, DYNAMIC_TYPE_SECRET);
  33055. if (ssl->arrays->preMasterSecret == NULL) {
  33056. ERROR_OUT(MEMORY_E, exit_dcke);
  33057. }
  33058. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  33059. }
  33060. switch (ssl->specs.kea) {
  33061. #ifndef NO_RSA
  33062. case rsa_kea:
  33063. {
  33064. break;
  33065. } /* rsa_kea */
  33066. #endif /* !NO_RSA */
  33067. #ifndef NO_PSK
  33068. case psk_kea:
  33069. {
  33070. /* sanity check that PSK server callback has been set */
  33071. if (ssl->options.server_psk_cb == NULL) {
  33072. WOLFSSL_MSG("No server PSK callback set");
  33073. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  33074. }
  33075. break;
  33076. }
  33077. #endif /* !NO_PSK */
  33078. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  33079. defined(HAVE_CURVE448)
  33080. case ecc_diffie_hellman_kea:
  33081. {
  33082. break;
  33083. }
  33084. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  33085. #ifndef NO_DH
  33086. case diffie_hellman_kea:
  33087. {
  33088. break;
  33089. }
  33090. #endif /* !NO_DH */
  33091. #if !defined(NO_DH) && !defined(NO_PSK)
  33092. case dhe_psk_kea:
  33093. {
  33094. /* sanity check that PSK server callback has been set */
  33095. if (ssl->options.server_psk_cb == NULL) {
  33096. WOLFSSL_MSG("No server PSK callback set");
  33097. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  33098. }
  33099. break;
  33100. }
  33101. #endif /* !NO_DH && !NO_PSK */
  33102. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  33103. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  33104. case ecdhe_psk_kea:
  33105. {
  33106. /* sanity check that PSK server callback has been set */
  33107. if (ssl->options.server_psk_cb == NULL) {
  33108. WOLFSSL_MSG("No server PSK callback set");
  33109. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  33110. }
  33111. break;
  33112. }
  33113. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  33114. default:
  33115. WOLFSSL_MSG("Bad kea type");
  33116. ret = BAD_KEA_TYPE_E;
  33117. } /* switch (ssl->specs.kea) */
  33118. /* Check for error */
  33119. if (ret != 0) {
  33120. goto exit_dcke;
  33121. }
  33122. /* Advance state and proceed */
  33123. ssl->options.asyncState = TLS_ASYNC_BUILD;
  33124. } /* TLS_ASYNC_BEGIN */
  33125. FALL_THROUGH;
  33126. case TLS_ASYNC_BUILD:
  33127. {
  33128. switch (ssl->specs.kea) {
  33129. #ifndef NO_RSA
  33130. case rsa_kea:
  33131. {
  33132. word16 keySz;
  33133. ssl->buffers.keyType = rsa_sa_algo;
  33134. ret = DecodePrivateKey(ssl, &keySz);
  33135. if (ret != 0) {
  33136. goto exit_dcke;
  33137. }
  33138. args->length = (word32)keySz;
  33139. ssl->arrays->preMasterSz = SECRET_LEN;
  33140. if (ssl->options.tls) {
  33141. word16 check;
  33142. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  33143. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33144. }
  33145. ato16(input + args->idx, &check);
  33146. args->idx += OPAQUE16_LEN;
  33147. if ((word32)check != args->length) {
  33148. WOLFSSL_MSG("RSA explicit size doesn't match");
  33149. #ifdef WOLFSSL_EXTRA_ALERTS
  33150. SendAlert(ssl, alert_fatal, bad_record_mac);
  33151. #endif
  33152. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  33153. }
  33154. }
  33155. if ((args->idx - args->begin) + args->length > size) {
  33156. WOLFSSL_MSG("RSA message too big");
  33157. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33158. }
  33159. /* pre-load PreMasterSecret with RNG data */
  33160. ret = wc_RNG_GenerateBlock(ssl->rng,
  33161. &ssl->arrays->preMasterSecret[VERSION_SZ],
  33162. SECRET_LEN - VERSION_SZ);
  33163. if (ret != 0) {
  33164. goto exit_dcke;
  33165. }
  33166. args->output = NULL;
  33167. break;
  33168. } /* rsa_kea */
  33169. #endif /* !NO_RSA */
  33170. #ifndef NO_PSK
  33171. case psk_kea:
  33172. {
  33173. byte* pms = ssl->arrays->preMasterSecret;
  33174. word16 ci_sz;
  33175. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  33176. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33177. }
  33178. ato16(input + args->idx, &ci_sz);
  33179. args->idx += OPAQUE16_LEN;
  33180. if (ci_sz > MAX_PSK_ID_LEN) {
  33181. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  33182. }
  33183. if ((args->idx - args->begin) + ci_sz > size) {
  33184. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33185. }
  33186. XMEMCPY(ssl->arrays->client_identity,
  33187. input + args->idx, ci_sz);
  33188. args->idx += ci_sz;
  33189. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  33190. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  33191. ssl->arrays->client_identity, ssl->arrays->psk_key,
  33192. MAX_PSK_KEY_LEN);
  33193. if (ssl->arrays->psk_keySz == 0 ||
  33194. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  33195. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  33196. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  33197. SendAlert(ssl, alert_fatal,
  33198. unknown_psk_identity);
  33199. #endif
  33200. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  33201. }
  33202. /* SERVER: Pre-shared Key for peer authentication. */
  33203. ssl->options.peerAuthGood = 1;
  33204. /* make psk pre master secret */
  33205. /* length of key + length 0s + length of key + key */
  33206. c16toa((word16) ssl->arrays->psk_keySz, pms);
  33207. pms += OPAQUE16_LEN;
  33208. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  33209. pms += ssl->arrays->psk_keySz;
  33210. c16toa((word16) ssl->arrays->psk_keySz, pms);
  33211. pms += OPAQUE16_LEN;
  33212. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  33213. ssl->arrays->preMasterSz =
  33214. (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
  33215. break;
  33216. }
  33217. #endif /* !NO_PSK */
  33218. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  33219. defined(HAVE_CURVE448)
  33220. case ecc_diffie_hellman_kea:
  33221. {
  33222. #ifdef HAVE_ECC
  33223. ecc_key* private_key = ssl->eccTempKey;
  33224. /* handle static private key */
  33225. if (ssl->specs.static_ecdh &&
  33226. ssl->ecdhCurveOID != ECC_X25519_OID &&
  33227. ssl->ecdhCurveOID != ECC_X448_OID) {
  33228. word16 keySz;
  33229. ssl->buffers.keyType = ecc_dsa_sa_algo;
  33230. ret = DecodePrivateKey(ssl, &keySz);
  33231. if (ret != 0) {
  33232. goto exit_dcke;
  33233. }
  33234. private_key = (ecc_key*)ssl->hsKey;
  33235. }
  33236. #endif
  33237. /* import peer ECC key */
  33238. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  33239. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33240. }
  33241. args->length = input[args->idx++];
  33242. if ((args->idx - args->begin) + args->length > size) {
  33243. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33244. }
  33245. #ifdef HAVE_CURVE25519
  33246. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  33247. #ifdef HAVE_PK_CALLBACKS
  33248. /* if callback then use it for shared secret */
  33249. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  33250. break;
  33251. }
  33252. #endif
  33253. if (ssl->peerX25519Key == NULL) {
  33254. /* alloc/init on demand */
  33255. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  33256. (void**)&ssl->peerX25519Key);
  33257. if (ret != 0) {
  33258. goto exit_dcke;
  33259. }
  33260. } else if (ssl->peerX25519KeyPresent) {
  33261. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  33262. ssl->peerX25519Key);
  33263. ssl->peerX25519KeyPresent = 0;
  33264. if (ret != 0) {
  33265. goto exit_dcke;
  33266. }
  33267. }
  33268. if ((ret = wc_curve25519_check_public(
  33269. input + args->idx, args->length,
  33270. EC25519_LITTLE_ENDIAN)) != 0) {
  33271. #ifdef WOLFSSL_EXTRA_ALERTS
  33272. if (ret == BUFFER_E)
  33273. SendAlert(ssl, alert_fatal, decode_error);
  33274. else if (ret == ECC_OUT_OF_RANGE_E)
  33275. SendAlert(ssl, alert_fatal, bad_record_mac);
  33276. else {
  33277. SendAlert(ssl, alert_fatal,
  33278. illegal_parameter);
  33279. }
  33280. #endif
  33281. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  33282. }
  33283. if (wc_curve25519_import_public_ex(
  33284. input + args->idx, args->length,
  33285. ssl->peerX25519Key,
  33286. EC25519_LITTLE_ENDIAN)) {
  33287. #ifdef WOLFSSL_EXTRA_ALERTS
  33288. SendAlert(ssl, alert_fatal, illegal_parameter);
  33289. #endif
  33290. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  33291. }
  33292. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  33293. ssl->peerX25519KeyPresent = 1;
  33294. break;
  33295. }
  33296. #endif
  33297. #ifdef HAVE_CURVE448
  33298. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  33299. #ifdef HAVE_PK_CALLBACKS
  33300. /* if callback then use it for shared secret */
  33301. if (ssl->ctx->X448SharedSecretCb != NULL) {
  33302. break;
  33303. }
  33304. #endif
  33305. if (ssl->peerX448Key == NULL) {
  33306. /* alloc/init on demand */
  33307. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  33308. (void**)&ssl->peerX448Key);
  33309. if (ret != 0) {
  33310. goto exit_dcke;
  33311. }
  33312. } else if (ssl->peerX448KeyPresent) {
  33313. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  33314. ssl->peerX448Key);
  33315. ssl->peerX448KeyPresent = 0;
  33316. if (ret != 0) {
  33317. goto exit_dcke;
  33318. }
  33319. }
  33320. if ((ret = wc_curve448_check_public(
  33321. input + args->idx, args->length,
  33322. EC448_LITTLE_ENDIAN)) != 0) {
  33323. #ifdef WOLFSSL_EXTRA_ALERTS
  33324. if (ret == BUFFER_E)
  33325. SendAlert(ssl, alert_fatal, decode_error);
  33326. else if (ret == ECC_OUT_OF_RANGE_E)
  33327. SendAlert(ssl, alert_fatal, bad_record_mac);
  33328. else {
  33329. SendAlert(ssl, alert_fatal,
  33330. illegal_parameter);
  33331. }
  33332. #endif
  33333. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  33334. }
  33335. if (wc_curve448_import_public_ex(
  33336. input + args->idx, args->length,
  33337. ssl->peerX448Key,
  33338. EC448_LITTLE_ENDIAN)) {
  33339. #ifdef WOLFSSL_EXTRA_ALERTS
  33340. SendAlert(ssl, alert_fatal, illegal_parameter);
  33341. #endif
  33342. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  33343. }
  33344. ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
  33345. ssl->peerX448KeyPresent = 1;
  33346. break;
  33347. }
  33348. #endif
  33349. #ifdef HAVE_ECC
  33350. #ifdef HAVE_PK_CALLBACKS
  33351. /* if callback then use it for shared secret */
  33352. if (ssl->ctx->EccSharedSecretCb != NULL) {
  33353. break;
  33354. }
  33355. #endif
  33356. if (!ssl->specs.static_ecdh &&
  33357. ssl->eccTempKeyPresent == 0) {
  33358. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  33359. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  33360. }
  33361. if (ssl->peerEccKey == NULL) {
  33362. /* alloc/init on demand */
  33363. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  33364. (void**)&ssl->peerEccKey);
  33365. if (ret != 0) {
  33366. goto exit_dcke;
  33367. }
  33368. } else if (ssl->peerEccKeyPresent) {
  33369. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  33370. ssl->peerEccKey);
  33371. ssl->peerEccKeyPresent = 0;
  33372. if (ret != 0) {
  33373. goto exit_dcke;
  33374. }
  33375. }
  33376. if (wc_ecc_import_x963_ex(input + args->idx,
  33377. args->length, ssl->peerEccKey,
  33378. private_key->dp->id)) {
  33379. #ifdef WOLFSSL_EXTRA_ALERTS
  33380. SendAlert(ssl, alert_fatal, illegal_parameter);
  33381. #endif
  33382. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  33383. }
  33384. ssl->arrays->preMasterSz = private_key->dp->size;
  33385. ssl->peerEccKeyPresent = 1;
  33386. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  33387. /* client_hello may have sent FFEDH2048, which sets namedGroup,
  33388. but that is not being used, so clear it */
  33389. /* resolves issue with server side wolfSSL_get_curve_name */
  33390. ssl->namedGroup = 0;
  33391. #endif
  33392. #endif /* HAVE_ECC */
  33393. break;
  33394. }
  33395. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  33396. #ifndef NO_DH
  33397. case diffie_hellman_kea:
  33398. {
  33399. word16 clientPubSz;
  33400. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  33401. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33402. }
  33403. ato16(input + args->idx, &clientPubSz);
  33404. args->idx += OPAQUE16_LEN;
  33405. if ((args->idx - args->begin) + clientPubSz > size) {
  33406. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33407. }
  33408. args->sigSz = clientPubSz;
  33409. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  33410. (void**)&ssl->buffers.serverDH_Key);
  33411. if (ret != 0) {
  33412. goto exit_dcke;
  33413. }
  33414. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  33415. ssl->buffers.serverDH_P.buffer,
  33416. ssl->buffers.serverDH_P.length,
  33417. ssl->buffers.serverDH_G.buffer,
  33418. ssl->buffers.serverDH_G.length);
  33419. /* set the max agree result size */
  33420. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  33421. break;
  33422. }
  33423. #endif /* !NO_DH */
  33424. #if !defined(NO_DH) && !defined(NO_PSK)
  33425. case dhe_psk_kea:
  33426. {
  33427. word16 clientSz;
  33428. /* Read in the PSK hint */
  33429. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  33430. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33431. }
  33432. ato16(input + args->idx, &clientSz);
  33433. args->idx += OPAQUE16_LEN;
  33434. if (clientSz > MAX_PSK_ID_LEN) {
  33435. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  33436. }
  33437. if ((args->idx - args->begin) + clientSz > size) {
  33438. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33439. }
  33440. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  33441. clientSz);
  33442. args->idx += clientSz;
  33443. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  33444. /* Read in the DHE business */
  33445. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  33446. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33447. }
  33448. ato16(input + args->idx, &clientSz);
  33449. args->idx += OPAQUE16_LEN;
  33450. if ((args->idx - args->begin) + clientSz > size) {
  33451. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33452. }
  33453. args->sigSz = clientSz;
  33454. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  33455. (void**)&ssl->buffers.serverDH_Key);
  33456. if (ret != 0) {
  33457. goto exit_dcke;
  33458. }
  33459. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  33460. ssl->buffers.serverDH_P.buffer,
  33461. ssl->buffers.serverDH_P.length,
  33462. ssl->buffers.serverDH_G.buffer,
  33463. ssl->buffers.serverDH_G.length);
  33464. break;
  33465. }
  33466. #endif /* !NO_DH && !NO_PSK */
  33467. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  33468. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  33469. case ecdhe_psk_kea:
  33470. {
  33471. word16 clientSz;
  33472. /* Read in the PSK hint */
  33473. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  33474. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33475. }
  33476. ato16(input + args->idx, &clientSz);
  33477. args->idx += OPAQUE16_LEN;
  33478. if (clientSz > MAX_PSK_ID_LEN) {
  33479. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  33480. }
  33481. if ((args->idx - args->begin) + clientSz > size) {
  33482. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33483. }
  33484. XMEMCPY(ssl->arrays->client_identity,
  33485. input + args->idx, clientSz);
  33486. args->idx += clientSz;
  33487. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  33488. /* import peer ECC key */
  33489. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  33490. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33491. }
  33492. args->length = input[args->idx++];
  33493. if ((args->idx - args->begin) + args->length > size) {
  33494. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  33495. }
  33496. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  33497. #ifdef HAVE_CURVE25519
  33498. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  33499. #ifdef HAVE_PK_CALLBACKS
  33500. /* if callback then use it for shared secret */
  33501. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  33502. break;
  33503. }
  33504. #endif
  33505. if (ssl->eccTempKeyPresent == 0) {
  33506. WOLFSSL_MSG(
  33507. "X25519 ephemeral key not made correctly");
  33508. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  33509. }
  33510. if (ssl->peerX25519Key == NULL) {
  33511. /* alloc/init on demand */
  33512. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  33513. (void**)&ssl->peerX25519Key);
  33514. if (ret != 0) {
  33515. goto exit_dcke;
  33516. }
  33517. } else if (ssl->peerX25519KeyPresent) {
  33518. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  33519. ssl->peerX25519Key);
  33520. ssl->peerX25519KeyPresent = 0;
  33521. if (ret != 0) {
  33522. goto exit_dcke;
  33523. }
  33524. }
  33525. if ((ret = wc_curve25519_check_public(
  33526. input + args->idx, args->length,
  33527. EC25519_LITTLE_ENDIAN)) != 0) {
  33528. #ifdef WOLFSSL_EXTRA_ALERTS
  33529. if (ret == BUFFER_E)
  33530. SendAlert(ssl, alert_fatal, decode_error);
  33531. else if (ret == ECC_OUT_OF_RANGE_E)
  33532. SendAlert(ssl, alert_fatal, bad_record_mac);
  33533. else {
  33534. SendAlert(ssl, alert_fatal,
  33535. illegal_parameter);
  33536. }
  33537. #endif
  33538. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  33539. }
  33540. if (wc_curve25519_import_public_ex(
  33541. input + args->idx, args->length,
  33542. ssl->peerX25519Key,
  33543. EC25519_LITTLE_ENDIAN)) {
  33544. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  33545. }
  33546. ssl->peerX25519KeyPresent = 1;
  33547. break;
  33548. }
  33549. #endif
  33550. #ifdef HAVE_CURVE448
  33551. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  33552. #ifdef HAVE_PK_CALLBACKS
  33553. /* if callback then use it for shared secret */
  33554. if (ssl->ctx->X448SharedSecretCb != NULL) {
  33555. break;
  33556. }
  33557. #endif
  33558. if (ssl->eccTempKeyPresent == 0) {
  33559. WOLFSSL_MSG(
  33560. "X448 ephemeral key not made correctly");
  33561. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  33562. }
  33563. if (ssl->peerX448Key == NULL) {
  33564. /* alloc/init on demand */
  33565. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  33566. (void**)&ssl->peerX448Key);
  33567. if (ret != 0) {
  33568. goto exit_dcke;
  33569. }
  33570. } else if (ssl->peerX448KeyPresent) {
  33571. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  33572. ssl->peerX448Key);
  33573. ssl->peerX448KeyPresent = 0;
  33574. if (ret != 0) {
  33575. goto exit_dcke;
  33576. }
  33577. }
  33578. if ((ret = wc_curve448_check_public(
  33579. input + args->idx, args->length,
  33580. EC448_LITTLE_ENDIAN)) != 0) {
  33581. #ifdef WOLFSSL_EXTRA_ALERTS
  33582. if (ret == BUFFER_E)
  33583. SendAlert(ssl, alert_fatal, decode_error);
  33584. else if (ret == ECC_OUT_OF_RANGE_E)
  33585. SendAlert(ssl, alert_fatal, bad_record_mac);
  33586. else {
  33587. SendAlert(ssl, alert_fatal,
  33588. illegal_parameter);
  33589. }
  33590. #endif
  33591. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  33592. }
  33593. if (wc_curve448_import_public_ex(
  33594. input + args->idx, args->length,
  33595. ssl->peerX448Key,
  33596. EC448_LITTLE_ENDIAN)) {
  33597. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  33598. }
  33599. ssl->peerX448KeyPresent = 1;
  33600. break;
  33601. }
  33602. #endif
  33603. #ifdef HAVE_PK_CALLBACKS
  33604. /* if callback then use it for shared secret */
  33605. if (ssl->ctx->EccSharedSecretCb != NULL) {
  33606. break;
  33607. }
  33608. #endif
  33609. if (ssl->eccTempKeyPresent == 0) {
  33610. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  33611. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  33612. }
  33613. if (ssl->peerEccKey == NULL) {
  33614. /* alloc/init on demand */
  33615. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  33616. (void**)&ssl->peerEccKey);
  33617. if (ret != 0) {
  33618. goto exit_dcke;
  33619. }
  33620. }
  33621. else if (ssl->peerEccKeyPresent) {
  33622. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  33623. ssl->peerEccKey);
  33624. ssl->peerEccKeyPresent = 0;
  33625. if (ret != 0) {
  33626. goto exit_dcke;
  33627. }
  33628. }
  33629. if (wc_ecc_import_x963_ex(input + args->idx,
  33630. args->length, ssl->peerEccKey,
  33631. ssl->eccTempKey->dp->id)) {
  33632. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  33633. }
  33634. ssl->peerEccKeyPresent = 1;
  33635. break;
  33636. }
  33637. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  33638. default:
  33639. ret = BAD_KEA_TYPE_E;
  33640. } /* switch (ssl->specs.kea) */
  33641. /* Check for error */
  33642. if (ret != 0) {
  33643. goto exit_dcke;
  33644. }
  33645. /* Advance state and proceed */
  33646. ssl->options.asyncState = TLS_ASYNC_DO;
  33647. } /* TLS_ASYNC_BUILD */
  33648. FALL_THROUGH;
  33649. case TLS_ASYNC_DO:
  33650. {
  33651. switch (ssl->specs.kea) {
  33652. #ifndef NO_RSA
  33653. case rsa_kea:
  33654. {
  33655. RsaKey* key = (RsaKey*)ssl->hsKey;
  33656. ret = RsaDec(ssl,
  33657. input + args->idx,
  33658. args->length,
  33659. &args->output,
  33660. &args->sigSz,
  33661. key,
  33662. #ifdef HAVE_PK_CALLBACKS
  33663. ssl->buffers.key
  33664. #else
  33665. NULL
  33666. #endif
  33667. );
  33668. /* Errors that can occur here that should be
  33669. * indistinguishable:
  33670. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  33671. */
  33672. #ifdef WOLFSSL_ASYNC_CRYPT
  33673. if (ret == WC_PENDING_E)
  33674. goto exit_dcke;
  33675. #endif
  33676. if (ret == BAD_FUNC_ARG)
  33677. goto exit_dcke;
  33678. args->lastErr = ret - (SECRET_LEN - args->sigSz);
  33679. ret = 0;
  33680. break;
  33681. } /* rsa_kea */
  33682. #endif /* !NO_RSA */
  33683. #ifndef NO_PSK
  33684. case psk_kea:
  33685. {
  33686. break;
  33687. }
  33688. #endif /* !NO_PSK */
  33689. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  33690. defined(HAVE_CURVE448)
  33691. case ecc_diffie_hellman_kea:
  33692. {
  33693. void* private_key = ssl->eccTempKey;
  33694. (void)private_key;
  33695. #ifdef HAVE_CURVE25519
  33696. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  33697. ret = X25519SharedSecret(ssl,
  33698. (curve25519_key*)private_key,
  33699. ssl->peerX25519Key,
  33700. input + args->idx, &args->length,
  33701. ssl->arrays->preMasterSecret,
  33702. &ssl->arrays->preMasterSz,
  33703. WOLFSSL_SERVER_END
  33704. );
  33705. break;
  33706. }
  33707. #endif
  33708. #ifdef HAVE_CURVE448
  33709. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  33710. ret = X448SharedSecret(ssl,
  33711. (curve448_key*)private_key,
  33712. ssl->peerX448Key,
  33713. input + args->idx, &args->length,
  33714. ssl->arrays->preMasterSecret,
  33715. &ssl->arrays->preMasterSz,
  33716. WOLFSSL_SERVER_END
  33717. );
  33718. break;
  33719. }
  33720. #endif
  33721. #ifdef HAVE_ECC
  33722. if (ssl->specs.static_ecdh) {
  33723. private_key = ssl->hsKey;
  33724. }
  33725. /* Generate shared secret */
  33726. ret = EccSharedSecret(ssl,
  33727. (ecc_key*)private_key, ssl->peerEccKey,
  33728. input + args->idx, &args->length,
  33729. ssl->arrays->preMasterSecret,
  33730. &ssl->arrays->preMasterSz,
  33731. WOLFSSL_SERVER_END
  33732. );
  33733. #ifdef WOLFSSL_ASYNC_CRYPT
  33734. if (ret != WC_PENDING_E)
  33735. #endif
  33736. {
  33737. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  33738. (void**)&ssl->peerEccKey);
  33739. ssl->peerEccKeyPresent = 0;
  33740. }
  33741. #endif
  33742. break;
  33743. }
  33744. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  33745. #ifndef NO_DH
  33746. case diffie_hellman_kea:
  33747. {
  33748. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  33749. ssl->buffers.serverDH_Priv.buffer,
  33750. ssl->buffers.serverDH_Priv.length,
  33751. input + args->idx,
  33752. (word16)args->sigSz,
  33753. ssl->arrays->preMasterSecret,
  33754. &ssl->arrays->preMasterSz,
  33755. ssl->buffers.serverDH_P.buffer,
  33756. ssl->buffers.serverDH_P.length);
  33757. break;
  33758. }
  33759. #endif /* !NO_DH */
  33760. #if !defined(NO_DH) && !defined(NO_PSK)
  33761. case dhe_psk_kea:
  33762. {
  33763. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  33764. ssl->buffers.serverDH_Priv.buffer,
  33765. ssl->buffers.serverDH_Priv.length,
  33766. input + args->idx,
  33767. (word16)args->sigSz,
  33768. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  33769. &ssl->arrays->preMasterSz,
  33770. ssl->buffers.serverDH_P.buffer,
  33771. ssl->buffers.serverDH_P.length);
  33772. break;
  33773. }
  33774. #endif /* !NO_DH && !NO_PSK */
  33775. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  33776. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  33777. case ecdhe_psk_kea:
  33778. {
  33779. #ifdef HAVE_CURVE25519
  33780. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  33781. ret = X25519SharedSecret(ssl,
  33782. (curve25519_key*)ssl->eccTempKey,
  33783. ssl->peerX25519Key,
  33784. input + args->idx, &args->length,
  33785. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  33786. &args->sigSz,
  33787. WOLFSSL_SERVER_END
  33788. );
  33789. #ifdef WOLFSSL_ASYNC_CRYPT
  33790. if (ret != WC_PENDING_E)
  33791. #endif
  33792. {
  33793. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  33794. (void**)&ssl->peerX25519Key);
  33795. ssl->peerX25519KeyPresent = 0;
  33796. }
  33797. break;
  33798. }
  33799. #endif
  33800. #ifdef HAVE_CURVE448
  33801. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  33802. ret = X448SharedSecret(ssl,
  33803. (curve448_key*)ssl->eccTempKey,
  33804. ssl->peerX448Key,
  33805. input + args->idx, &args->length,
  33806. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  33807. &args->sigSz,
  33808. WOLFSSL_SERVER_END
  33809. );
  33810. #ifdef WOLFSSL_ASYNC_CRYPT
  33811. if (ret != WC_PENDING_E)
  33812. #endif
  33813. {
  33814. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  33815. (void**)&ssl->peerX448Key);
  33816. ssl->peerX448KeyPresent = 0;
  33817. }
  33818. break;
  33819. }
  33820. #endif
  33821. /* Generate shared secret */
  33822. ret = EccSharedSecret(ssl,
  33823. ssl->eccTempKey, ssl->peerEccKey,
  33824. input + args->idx, &args->length,
  33825. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  33826. &args->sigSz,
  33827. WOLFSSL_SERVER_END
  33828. );
  33829. if (!ssl->specs.static_ecdh
  33830. #ifdef WOLFSSL_ASYNC_CRYPT
  33831. && ret != WC_PENDING_E
  33832. #endif
  33833. ) {
  33834. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  33835. (void**)&ssl->peerEccKey);
  33836. ssl->peerEccKeyPresent = 0;
  33837. }
  33838. break;
  33839. }
  33840. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  33841. default:
  33842. ret = BAD_KEA_TYPE_E;
  33843. } /* switch (ssl->specs.kea) */
  33844. /* Check for error */
  33845. if (ret != 0) {
  33846. goto exit_dcke;
  33847. }
  33848. /* Advance state and proceed */
  33849. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  33850. } /* TLS_ASYNC_DO */
  33851. FALL_THROUGH;
  33852. case TLS_ASYNC_VERIFY:
  33853. {
  33854. switch (ssl->specs.kea) {
  33855. #ifndef NO_RSA
  33856. case rsa_kea:
  33857. {
  33858. byte *tmpRsa;
  33859. byte mask;
  33860. /* Add the signature length to idx */
  33861. args->idx += args->length;
  33862. #ifdef DEBUG_WOLFSSL
  33863. /* check version (debug warning message only) */
  33864. if (args->output != NULL) {
  33865. if (args->output[0] != ssl->chVersion.major ||
  33866. args->output[1] != ssl->chVersion.minor) {
  33867. WOLFSSL_MSG("preMasterSecret version mismatch");
  33868. }
  33869. }
  33870. #endif
  33871. /* RFC5246 7.4.7.1:
  33872. * Treat incorrectly formatted message blocks and/or
  33873. * mismatched version numbers in a manner
  33874. * indistinguishable from correctly formatted RSA blocks
  33875. */
  33876. ret = args->lastErr;
  33877. args->lastErr = 0; /* reset */
  33878. /* On error 'ret' will be negative */
  33879. mask = ((unsigned int)ret >>
  33880. ((sizeof(ret) * 8) - 1)) - 1;
  33881. /* build PreMasterSecret */
  33882. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  33883. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  33884. tmpRsa = input + args->idx - VERSION_SZ - SECRET_LEN;
  33885. ctMaskCopy(~mask, (byte*)&args->output, (byte*)&tmpRsa,
  33886. sizeof(args->output));
  33887. if (args->output != NULL) {
  33888. int i;
  33889. /* Use random secret on error */
  33890. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  33891. ssl->arrays->preMasterSecret[i] =
  33892. ctMaskSel(mask, args->output[i],
  33893. ssl->arrays->preMasterSecret[i]);
  33894. }
  33895. }
  33896. /* preMasterSecret has RNG and version set
  33897. * return proper length and ignore error
  33898. * error will be caught as decryption error
  33899. */
  33900. args->sigSz = SECRET_LEN;
  33901. ret = 0;
  33902. break;
  33903. } /* rsa_kea */
  33904. #endif /* !NO_RSA */
  33905. #ifndef NO_PSK
  33906. case psk_kea:
  33907. {
  33908. break;
  33909. }
  33910. #endif /* !NO_PSK */
  33911. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  33912. defined(HAVE_CURVE448)
  33913. case ecc_diffie_hellman_kea:
  33914. {
  33915. /* skip past the imported peer key */
  33916. args->idx += args->length;
  33917. break;
  33918. }
  33919. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  33920. #ifndef NO_DH
  33921. case diffie_hellman_kea:
  33922. {
  33923. args->idx += (word16)args->sigSz;
  33924. break;
  33925. }
  33926. #endif /* !NO_DH */
  33927. #if !defined(NO_DH) && !defined(NO_PSK)
  33928. case dhe_psk_kea:
  33929. {
  33930. byte* pms = ssl->arrays->preMasterSecret;
  33931. word16 clientSz = (word16)args->sigSz;
  33932. args->idx += clientSz;
  33933. c16toa((word16)ssl->arrays->preMasterSz, pms);
  33934. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  33935. pms += ssl->arrays->preMasterSz;
  33936. /* Use the PSK hint to look up the PSK and add it to the
  33937. * preMasterSecret here. */
  33938. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  33939. ssl->arrays->client_identity, ssl->arrays->psk_key,
  33940. MAX_PSK_KEY_LEN);
  33941. if (ssl->arrays->psk_keySz == 0 ||
  33942. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  33943. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  33944. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  33945. SendAlert(ssl, alert_fatal,
  33946. unknown_psk_identity);
  33947. #endif
  33948. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  33949. }
  33950. /* SERVER: Pre-shared Key for peer authentication. */
  33951. ssl->options.peerAuthGood = 1;
  33952. c16toa((word16) ssl->arrays->psk_keySz, pms);
  33953. pms += OPAQUE16_LEN;
  33954. XMEMCPY(pms, ssl->arrays->psk_key,
  33955. ssl->arrays->psk_keySz);
  33956. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
  33957. OPAQUE16_LEN;
  33958. break;
  33959. }
  33960. #endif /* !NO_DH && !NO_PSK */
  33961. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  33962. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  33963. case ecdhe_psk_kea:
  33964. {
  33965. byte* pms = ssl->arrays->preMasterSecret;
  33966. word16 clientSz = (word16)args->sigSz;
  33967. /* skip past the imported peer key */
  33968. args->idx += args->length;
  33969. /* Add preMasterSecret */
  33970. c16toa(clientSz, pms);
  33971. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  33972. pms += ssl->arrays->preMasterSz;
  33973. /* Use the PSK hint to look up the PSK and add it to the
  33974. * preMasterSecret here. */
  33975. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  33976. ssl->arrays->client_identity, ssl->arrays->psk_key,
  33977. MAX_PSK_KEY_LEN);
  33978. if (ssl->arrays->psk_keySz == 0 ||
  33979. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  33980. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  33981. }
  33982. /* SERVER: Pre-shared Key for peer authentication. */
  33983. ssl->options.peerAuthGood = 1;
  33984. c16toa((word16) ssl->arrays->psk_keySz, pms);
  33985. pms += OPAQUE16_LEN;
  33986. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  33987. ssl->arrays->preMasterSz +=
  33988. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  33989. break;
  33990. }
  33991. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  33992. default:
  33993. ret = BAD_KEA_TYPE_E;
  33994. } /* switch (ssl->specs.kea) */
  33995. /* Check for error */
  33996. if (ret != 0) {
  33997. goto exit_dcke;
  33998. }
  33999. /* Advance state and proceed */
  34000. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  34001. } /* TLS_ASYNC_VERIFY */
  34002. FALL_THROUGH;
  34003. case TLS_ASYNC_FINALIZE:
  34004. {
  34005. if (IsEncryptionOn(ssl, 0)) {
  34006. args->idx += ssl->keys.padSz;
  34007. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  34008. if (ssl->options.startedETMRead)
  34009. args->idx += MacSize(ssl);
  34010. #endif
  34011. }
  34012. ret = MakeMasterSecret(ssl);
  34013. /* Check for error */
  34014. if (ret != 0) {
  34015. goto exit_dcke;
  34016. }
  34017. /* Advance state and proceed */
  34018. ssl->options.asyncState = TLS_ASYNC_END;
  34019. } /* TLS_ASYNC_FINALIZE */
  34020. FALL_THROUGH;
  34021. case TLS_ASYNC_END:
  34022. {
  34023. /* Set final index */
  34024. *inOutIdx = args->idx;
  34025. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  34026. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  34027. if (ssl->options.verifyPeer) {
  34028. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  34029. }
  34030. #endif
  34031. break;
  34032. } /* TLS_ASYNC_END */
  34033. default:
  34034. ret = INPUT_CASE_ERROR;
  34035. } /* switch(ssl->options.asyncState) */
  34036. exit_dcke:
  34037. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  34038. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  34039. #ifdef WOLFSSL_ASYNC_CRYPT
  34040. /* Handle async operation */
  34041. if (ret == WC_PENDING_E) {
  34042. /* Mark message as not received so it can process again */
  34043. ssl->msgsReceived.got_client_key_exchange = 0;
  34044. return ret;
  34045. }
  34046. /* Cleanup async */
  34047. FreeAsyncCtx(ssl, 0);
  34048. #else
  34049. FreeDckeArgs(ssl, args);
  34050. #endif /* WOLFSSL_ASYNC_CRYPT */
  34051. #ifdef OPENSSL_ALL
  34052. /* add error ret value to error queue */
  34053. if (ret != 0) {
  34054. WOLFSSL_ERROR(ret);
  34055. }
  34056. #endif
  34057. /* Cleanup PMS */
  34058. if (ssl->arrays->preMasterSecret != NULL) {
  34059. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  34060. }
  34061. ssl->arrays->preMasterSz = 0;
  34062. /* Final cleanup */
  34063. FreeKeyExchange(ssl);
  34064. return ret;
  34065. }
  34066. #endif /* !WOLFSSL_NO_TLS12 */
  34067. #ifdef HAVE_SNI
  34068. int SNI_Callback(WOLFSSL* ssl)
  34069. {
  34070. int ad = 0;
  34071. int sniRet = 0;
  34072. int ret = 0;
  34073. /* OpenSSL defaults alert to SSL_AD_UNRECOGNIZED_NAME, use this if
  34074. WOLFSSL_EXTRA_ALERTS is defined, indicating user is OK with
  34075. potential information disclosure from alerts. */
  34076. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_EXTRA_ALERTS)
  34077. ad = SSL_AD_UNRECOGNIZED_NAME;
  34078. #endif
  34079. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  34080. * when SNI is received. Call it now if exists */
  34081. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  34082. WOLFSSL_MSG("Calling custom sni callback");
  34083. sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg);
  34084. switch (sniRet) {
  34085. case warning_return:
  34086. WOLFSSL_MSG("Error in custom sni callback. Warning alert");
  34087. ret = SendAlert(ssl, alert_warning, ad);
  34088. break;
  34089. case fatal_return:
  34090. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  34091. SendAlert(ssl, alert_fatal, ad);
  34092. return FATAL_ERROR;
  34093. case noack_return:
  34094. WOLFSSL_MSG("Server quietly not acking servername.");
  34095. break;
  34096. default:
  34097. break;
  34098. }
  34099. }
  34100. return ret;
  34101. }
  34102. #endif /* HAVE_SNI */
  34103. #endif /* NO_WOLFSSL_SERVER */
  34104. #ifdef WOLFSSL_ASYNC_CRYPT
  34105. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  34106. {
  34107. int ret = 0;
  34108. WC_ASYNC_DEV* asyncDev;
  34109. WOLF_EVENT* event;
  34110. if (ssl == NULL) {
  34111. return BAD_FUNC_ARG;
  34112. }
  34113. /* check for pending async */
  34114. asyncDev = ssl->asyncDev;
  34115. if (asyncDev) {
  34116. /* grab event pointer */
  34117. event = &asyncDev->event;
  34118. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  34119. if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) {
  34120. /* advance key share state if doesn't need called again */
  34121. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  34122. (*state)++;
  34123. }
  34124. /* clear event */
  34125. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  34126. /* clear async dev */
  34127. ssl->asyncDev = NULL;
  34128. }
  34129. }
  34130. else {
  34131. ret = WC_NOT_PENDING_E;
  34132. }
  34133. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  34134. return ret;
  34135. }
  34136. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  34137. {
  34138. int ret;
  34139. WOLF_EVENT* event;
  34140. if (ssl == NULL || asyncDev == NULL) {
  34141. return BAD_FUNC_ARG;
  34142. }
  34143. /* grab event pointer */
  34144. event = &asyncDev->event;
  34145. /* init event */
  34146. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  34147. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  34148. return ret;
  34149. }
  34150. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  34151. {
  34152. int ret;
  34153. WOLF_EVENT* event;
  34154. if (ssl == NULL || asyncDev == NULL) {
  34155. return BAD_FUNC_ARG;
  34156. }
  34157. /* grab event pointer */
  34158. event = &asyncDev->event;
  34159. /* store reference to active async operation */
  34160. ssl->asyncDev = asyncDev;
  34161. /* place event into queue */
  34162. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  34163. /* success means return WC_PENDING_E */
  34164. if (ret == 0) {
  34165. ret = WC_PENDING_E;
  34166. }
  34167. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  34168. return ret;
  34169. }
  34170. #endif /* WOLFSSL_ASYNC_CRYPT */
  34171. /**
  34172. * Return the max fragment size. This is essentially the maximum
  34173. * fragment_length available.
  34174. * @param ssl WOLFSSL object containing ciphersuite information.
  34175. * @param maxFragment The amount of space we want to check is available. This
  34176. * is only the fragment length WITHOUT the (D)TLS headers.
  34177. * @return Max fragment size
  34178. */
  34179. int wolfSSL_GetMaxFragSize(WOLFSSL* ssl, int maxFragment)
  34180. {
  34181. (void) ssl; /* Avoid compiler warnings */
  34182. if (maxFragment > MAX_RECORD_SIZE) {
  34183. maxFragment = MAX_RECORD_SIZE;
  34184. }
  34185. #ifdef HAVE_MAX_FRAGMENT
  34186. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  34187. maxFragment = ssl->max_fragment;
  34188. }
  34189. #endif /* HAVE_MAX_FRAGMENT */
  34190. #ifdef WOLFSSL_DTLS
  34191. if (IsDtlsNotSctpMode(ssl)) {
  34192. int outputSz, mtuSz;
  34193. /* Given a input buffer size of maxFragment, how big will the
  34194. * encrypted output be? */
  34195. if (IsEncryptionOn(ssl, 1)) {
  34196. outputSz = BuildMessage(ssl, NULL, 0, NULL,
  34197. maxFragment + DTLS_HANDSHAKE_HEADER_SZ,
  34198. application_data, 0, 1, 0, CUR_ORDER);
  34199. }
  34200. else {
  34201. outputSz = maxFragment + DTLS_RECORD_HEADER_SZ +
  34202. DTLS_HANDSHAKE_HEADER_SZ;
  34203. }
  34204. /* Readjust maxFragment for MTU size. */
  34205. #if defined(WOLFSSL_DTLS_MTU)
  34206. mtuSz = ssl->dtlsMtuSz;
  34207. #else
  34208. mtuSz = MAX_MTU;
  34209. #endif
  34210. maxFragment = ModifyForMTU(ssl, maxFragment, outputSz, mtuSz);
  34211. }
  34212. #endif
  34213. return maxFragment;
  34214. }
  34215. #if defined(WOLFSSL_IOTSAFE) && defined(HAVE_PK_CALLBACKS)
  34216. IOTSAFE *wolfSSL_get_iotsafe_ctx(WOLFSSL *ssl)
  34217. {
  34218. if (ssl == NULL)
  34219. return NULL;
  34220. return &ssl->iotsafe;
  34221. }
  34222. int wolfSSL_set_iotsafe_ctx(WOLFSSL *ssl, IOTSAFE *iotsafe)
  34223. {
  34224. if ((ssl == NULL) || (iotsafe == NULL))
  34225. return BAD_FUNC_ARG;
  34226. XMEMCPY(&ssl->iotsafe, iotsafe, sizeof(IOTSAFE));
  34227. return 0;
  34228. }
  34229. #endif
  34230. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  34231. /* create an instance of WOLFSSL_BY_DIR_HASH structure */
  34232. WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void)
  34233. {
  34234. WOLFSSL_BY_DIR_HASH* dir_hash;
  34235. WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new");
  34236. dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL,
  34237. DYNAMIC_TYPE_OPENSSL);
  34238. if (dir_hash) {
  34239. XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH));
  34240. }
  34241. return dir_hash;
  34242. }
  34243. /* release a WOLFSSL_BY_DIR_HASH resource */
  34244. void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash)
  34245. {
  34246. if (dir_hash == NULL)
  34247. return;
  34248. XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL);
  34249. }
  34250. /* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */
  34251. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void)
  34252. {
  34253. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  34254. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null");
  34255. if (sk) {
  34256. sk->type = STACK_TYPE_BY_DIR_hash;
  34257. }
  34258. return sk;
  34259. }
  34260. /* returns value less than 0 on fail to match
  34261. * On a successful match the priority level found is returned
  34262. */
  34263. int wolfSSL_sk_BY_DIR_HASH_find(
  34264. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind)
  34265. {
  34266. WOLFSSL_STACK* next;
  34267. int i, sz;
  34268. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find");
  34269. if (sk == NULL || toFind == NULL) {
  34270. return WOLFSSL_FAILURE;
  34271. }
  34272. sz = wolfSSL_sk_BY_DIR_HASH_num(sk);
  34273. next = sk;
  34274. for (i = 0; i < sz && next != NULL; i++) {
  34275. if (next->data.dir_hash->hash_value == toFind->hash_value) {
  34276. return sz - i; /* reverse because stack pushed highest on first */
  34277. }
  34278. next = next->next;
  34279. }
  34280. return -1;
  34281. }
  34282. /* return a number of WOLFSSL_BY_DIR_HASH in stack */
  34283. int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  34284. {
  34285. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num");
  34286. if (sk == NULL)
  34287. return -1;
  34288. return (int)sk->num;
  34289. }
  34290. /* return WOLFSSL_BY_DIR_HASH instance at i */
  34291. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value(
  34292. const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i)
  34293. {
  34294. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value");
  34295. for (; sk != NULL && i > 0; i--)
  34296. sk = sk->next;
  34297. if (i != 0 || sk == NULL)
  34298. return NULL;
  34299. return sk->data.dir_hash;
  34300. }
  34301. /* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */
  34302. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop(
  34303. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk)
  34304. {
  34305. WOLFSSL_STACK* node;
  34306. WOLFSSL_BY_DIR_HASH* hash;
  34307. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop");
  34308. if (sk == NULL) {
  34309. return NULL;
  34310. }
  34311. node = sk->next;
  34312. hash = sk->data.dir_hash;
  34313. if (node != NULL) { /* update sk and remove node from stack */
  34314. sk->data.dir_hash = node->data.dir_hash;
  34315. sk->next = node->next;
  34316. wolfSSL_sk_free_node(node);
  34317. }
  34318. else { /* last x509 in stack */
  34319. sk->data.dir_hash = NULL;
  34320. }
  34321. if (sk->num > 0) {
  34322. sk->num -= 1;
  34323. }
  34324. return hash;
  34325. }
  34326. /* release all contents in stack, and then release stack itself. */
  34327. /* Second argument is a function pointer to release resources. */
  34328. /* It calls the function to release resources when it is passed */
  34329. /* instead of wolfSSL_BY_DIR_HASH_free(). */
  34330. void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk,
  34331. void (*f) (WOLFSSL_BY_DIR_HASH*))
  34332. {
  34333. WOLFSSL_STACK* node;
  34334. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free");
  34335. if (sk == NULL) {
  34336. return;
  34337. }
  34338. /* parse through stack freeing each node */
  34339. node = sk->next;
  34340. while (node && sk->num > 1) {
  34341. WOLFSSL_STACK* tmp = node;
  34342. node = node->next;
  34343. if (f)
  34344. f(tmp->data.dir_hash);
  34345. else
  34346. wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash);
  34347. tmp->data.dir_hash = NULL;
  34348. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  34349. sk->num -= 1;
  34350. }
  34351. /* free head of stack */
  34352. if (sk->num == 1) {
  34353. if (f)
  34354. f(sk->data.dir_hash);
  34355. else
  34356. wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash);
  34357. sk->data.dir_hash = NULL;
  34358. }
  34359. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  34360. }
  34361. /* release all contents in stack, and then release stack itself */
  34362. void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  34363. {
  34364. wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL);
  34365. }
  34366. /* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and
  34367. * tries to free it when the stack is free'd.
  34368. *
  34369. * return 1 on success 0 on fail
  34370. */
  34371. int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk,
  34372. WOLFSSL_BY_DIR_HASH* in)
  34373. {
  34374. WOLFSSL_STACK* node;
  34375. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push");
  34376. if (sk == NULL || in == NULL) {
  34377. return WOLFSSL_FAILURE;
  34378. }
  34379. /* no previous values in stack */
  34380. if (sk->data.dir_hash == NULL) {
  34381. sk->data.dir_hash = in;
  34382. sk->num += 1;
  34383. return WOLFSSL_SUCCESS;
  34384. }
  34385. /* stack already has value(s) create a new node and add more */
  34386. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  34387. DYNAMIC_TYPE_OPENSSL);
  34388. if (node == NULL) {
  34389. WOLFSSL_MSG("Memory error");
  34390. return WOLFSSL_FAILURE;
  34391. }
  34392. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  34393. /* push new obj onto head of stack */
  34394. node->data.dir_hash = sk->data.dir_hash;
  34395. node->next = sk->next;
  34396. node->type = sk->type;
  34397. sk->next = node;
  34398. sk->data.dir_hash = in;
  34399. sk->num += 1;
  34400. return WOLFSSL_SUCCESS;
  34401. }
  34402. /* create an instance of WOLFSSL_BY_DIR_entry structure */
  34403. WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void)
  34404. {
  34405. WOLFSSL_BY_DIR_entry* entry;
  34406. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new");
  34407. entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL,
  34408. DYNAMIC_TYPE_OPENSSL);
  34409. if (entry) {
  34410. XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry));
  34411. }
  34412. return entry;
  34413. }
  34414. /* release a WOLFSSL_BY_DIR_entry resource */
  34415. void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry)
  34416. {
  34417. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free");
  34418. if (entry == NULL)
  34419. return;
  34420. if (entry->hashes) {
  34421. wolfSSL_sk_BY_DIR_HASH_free(entry->hashes);
  34422. }
  34423. if (entry->dir_name != NULL) {
  34424. XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL);
  34425. }
  34426. XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL);
  34427. }
  34428. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void)
  34429. {
  34430. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  34431. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null");
  34432. if (sk) {
  34433. sk->type = STACK_TYPE_BY_DIR_entry;
  34434. }
  34435. return sk;
  34436. }
  34437. /* return a number of WOLFSSL_BY_DIR_entry in stack */
  34438. int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk)
  34439. {
  34440. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num");
  34441. if (sk == NULL)
  34442. return -1;
  34443. return (int)sk->num;
  34444. }
  34445. /* return WOLFSSL_BY_DIR_entry instance at i */
  34446. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value(
  34447. const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i)
  34448. {
  34449. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value");
  34450. for (; sk != NULL && i > 0; i--)
  34451. sk = sk->next;
  34452. if (i != 0 || sk == NULL)
  34453. return NULL;
  34454. return sk->data.dir_entry;
  34455. }
  34456. /* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */
  34457. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop(
  34458. WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk)
  34459. {
  34460. WOLFSSL_STACK* node;
  34461. WOLFSSL_BY_DIR_entry* entry;
  34462. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop");
  34463. if (sk == NULL) {
  34464. return NULL;
  34465. }
  34466. node = sk->next;
  34467. entry = sk->data.dir_entry;
  34468. if (node != NULL) { /* update sk and remove node from stack */
  34469. sk->data.dir_entry = node->data.dir_entry;
  34470. sk->next = node->next;
  34471. wolfSSL_sk_free_node(node);
  34472. }
  34473. else { /* last x509 in stack */
  34474. sk->data.dir_entry = NULL;
  34475. }
  34476. if (sk->num > 0) {
  34477. sk->num -= 1;
  34478. }
  34479. return entry;
  34480. }
  34481. /* release all contents in stack, and then release stack itself. */
  34482. /* Second argument is a function pointer to release resources. */
  34483. /* It calls the function to release resources when it is passed */
  34484. /* instead of wolfSSL_BY_DIR_entry_free(). */
  34485. void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  34486. void (*f) (WOLFSSL_BY_DIR_entry*))
  34487. {
  34488. WOLFSSL_STACK* node;
  34489. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free");
  34490. if (sk == NULL) {
  34491. return;
  34492. }
  34493. /* parse through stack freeing each node */
  34494. node = sk->next;
  34495. while (node && sk->num > 1) {
  34496. WOLFSSL_STACK* tmp = node;
  34497. node = node->next;
  34498. if (f)
  34499. f(tmp->data.dir_entry);
  34500. else
  34501. wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry);
  34502. tmp->data.dir_entry = NULL;
  34503. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  34504. sk->num -= 1;
  34505. }
  34506. /* free head of stack */
  34507. if (sk->num == 1) {
  34508. if (f)
  34509. f(sk->data.dir_entry);
  34510. else
  34511. wolfSSL_BY_DIR_entry_free(sk->data.dir_entry);
  34512. sk->data.dir_entry = NULL;
  34513. }
  34514. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  34515. }
  34516. /* release all contents in stack, and then release stack itself */
  34517. void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk)
  34518. {
  34519. wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL);
  34520. }
  34521. /* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and
  34522. * tries to free it when the stack is free'd.
  34523. *
  34524. * return 1 on success 0 on fail
  34525. */
  34526. int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  34527. WOLFSSL_BY_DIR_entry* in)
  34528. {
  34529. WOLFSSL_STACK* node;
  34530. if (sk == NULL || in == NULL) {
  34531. return WOLFSSL_FAILURE;
  34532. }
  34533. /* no previous values in stack */
  34534. if (sk->data.dir_entry == NULL) {
  34535. sk->data.dir_entry = in;
  34536. sk->num += 1;
  34537. return WOLFSSL_SUCCESS;
  34538. }
  34539. /* stack already has value(s) create a new node and add more */
  34540. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  34541. DYNAMIC_TYPE_OPENSSL);
  34542. if (node == NULL) {
  34543. WOLFSSL_MSG("Memory error");
  34544. return WOLFSSL_FAILURE;
  34545. }
  34546. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  34547. /* push new obj onto head of stack */
  34548. node->data.dir_entry = sk->data.dir_entry;
  34549. node->next = sk->next;
  34550. node->type = sk->type;
  34551. sk->next = node;
  34552. sk->data.dir_entry = in;
  34553. sk->num += 1;
  34554. return WOLFSSL_SUCCESS;
  34555. }
  34556. #endif /* OPENSSL_ALL */
  34557. #undef ERROR_OUT
  34558. #endif /* WOLFCRYPT_ONLY */