internal.c 1.4 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711107121071310714107151071610717107181071910720107211072210723107241072510726107271072810729107301073110732107331073410735107361073710738107391074010741107421074310744107451074610747107481074910750107511075210753107541075510756107571075810759107601076110762107631076410765107661076710768107691077010771107721077310774107751077610777107781077910780107811078210783107841078510786107871078810789107901079110792107931079410795107961079710798107991080010801108021080310804108051080610807108081080910810108111081210813108141081510816108171081810819108201082110822108231082410825108261082710828108291083010831108321083310834108351083610837108381083910840108411084210843108441084510846108471084810849108501085110852108531085410855108561085710858108591086010861108621086310864108651086610867108681086910870108711087210873108741087510876108771087810879108801088110882108831088410885108861088710888108891089010891108921089310894108951089610897108981089910900109011090210903109041090510906109071090810909109101091110912109131091410915109161091710918109191092010921109221092310924109251092610927109281092910930109311093210933109341093510936109371093810939109401094110942109431094410945109461094710948109491095010951109521095310954109551095610957109581095910960109611096210963109641096510966109671096810969109701097110972109731097410975109761097710978109791098010981109821098310984109851098610987109881098910990109911099210993109941099510996109971099810999110001100111002110031100411005110061100711008110091101011011110121101311014110151101611017110181101911020110211102211023110241102511026110271102811029110301103111032110331103411035110361103711038110391104011041110421104311044110451104611047110481104911050110511105211053110541105511056110571105811059110601106111062110631106411065110661106711068110691107011071110721107311074110751107611077110781107911080110811108211083110841108511086110871108811089110901109111092110931109411095110961109711098110991110011101111021110311104111051110611107111081110911110111111111211113111141111511116111171111811119111201112111122111231112411125111261112711128111291113011131111321113311134111351113611137111381113911140111411114211143111441114511146111471114811149111501115111152111531115411155111561115711158111591116011161111621116311164111651116611167111681116911170111711117211173111741117511176111771117811179111801118111182111831118411185111861118711188111891119011191111921119311194111951119611197111981119911200112011120211203112041120511206112071120811209112101121111212112131121411215112161121711218112191122011221112221122311224112251122611227112281122911230112311123211233112341123511236112371123811239112401124111242112431124411245112461124711248112491125011251112521125311254112551125611257112581125911260112611126211263112641126511266112671126811269112701127111272112731127411275112761127711278112791128011281112821128311284112851128611287112881128911290112911129211293112941129511296112971129811299113001130111302113031130411305113061130711308113091131011311113121131311314113151131611317113181131911320113211132211323113241132511326113271132811329113301133111332113331133411335113361133711338113391134011341113421134311344113451134611347113481134911350113511135211353113541135511356113571135811359113601136111362113631136411365113661136711368113691137011371113721137311374113751137611377113781137911380113811138211383113841138511386113871138811389113901139111392113931139411395113961139711398113991140011401114021140311404114051140611407114081140911410114111141211413114141141511416114171141811419114201142111422114231142411425114261142711428114291143011431114321143311434114351143611437114381143911440114411144211443114441144511446114471144811449114501145111452114531145411455114561145711458114591146011461114621146311464114651146611467114681146911470114711147211473114741147511476114771147811479114801148111482114831148411485114861148711488114891149011491114921149311494114951149611497114981149911500115011150211503115041150511506115071150811509115101151111512115131151411515115161151711518115191152011521115221152311524115251152611527115281152911530115311153211533115341153511536115371153811539115401154111542115431154411545115461154711548115491155011551115521155311554115551155611557115581155911560115611156211563115641156511566115671156811569115701157111572115731157411575115761157711578115791158011581115821158311584115851158611587115881158911590115911159211593115941159511596115971159811599116001160111602116031160411605116061160711608116091161011611116121161311614116151161611617116181161911620116211162211623116241162511626116271162811629116301163111632116331163411635116361163711638116391164011641116421164311644116451164611647116481164911650116511165211653116541165511656116571165811659116601166111662116631166411665116661166711668116691167011671116721167311674116751167611677116781167911680116811168211683116841168511686116871168811689116901169111692116931169411695116961169711698116991170011701117021170311704117051170611707117081170911710117111171211713117141171511716117171171811719117201172111722117231172411725117261172711728117291173011731117321173311734117351173611737117381173911740117411174211743117441174511746117471174811749117501175111752117531175411755117561175711758117591176011761117621176311764117651176611767117681176911770117711177211773117741177511776117771177811779117801178111782117831178411785117861178711788117891179011791117921179311794117951179611797117981179911800118011180211803118041180511806118071180811809118101181111812118131181411815118161181711818118191182011821118221182311824118251182611827118281182911830118311183211833118341183511836118371183811839118401184111842118431184411845118461184711848118491185011851118521185311854118551185611857118581185911860118611186211863118641186511866118671186811869118701187111872118731187411875118761187711878118791188011881118821188311884118851188611887118881188911890118911189211893118941189511896118971189811899119001190111902119031190411905119061190711908119091191011911119121191311914119151191611917119181191911920119211192211923119241192511926119271192811929119301193111932119331193411935119361193711938119391194011941119421194311944119451194611947119481194911950119511195211953119541195511956119571195811959119601196111962119631196411965119661196711968119691197011971119721197311974119751197611977119781197911980119811198211983119841198511986119871198811989119901199111992119931199411995119961199711998119991200012001120021200312004120051200612007120081200912010120111201212013120141201512016120171201812019120201202112022120231202412025120261202712028120291203012031120321203312034120351203612037120381203912040120411204212043120441204512046120471204812049120501205112052120531205412055120561205712058120591206012061120621206312064120651206612067120681206912070120711207212073120741207512076120771207812079120801208112082120831208412085120861208712088120891209012091120921209312094120951209612097120981209912100121011210212103121041210512106121071210812109121101211112112121131211412115121161211712118121191212012121121221212312124121251212612127121281212912130121311213212133121341213512136121371213812139121401214112142121431214412145121461214712148121491215012151121521215312154121551215612157121581215912160121611216212163121641216512166121671216812169121701217112172121731217412175121761217712178121791218012181121821218312184121851218612187121881218912190121911219212193121941219512196121971219812199122001220112202122031220412205122061220712208122091221012211122121221312214122151221612217122181221912220122211222212223122241222512226122271222812229122301223112232122331223412235122361223712238122391224012241122421224312244122451224612247122481224912250122511225212253122541225512256122571225812259122601226112262122631226412265122661226712268122691227012271122721227312274122751227612277122781227912280122811228212283122841228512286122871228812289122901229112292122931229412295122961229712298122991230012301123021230312304123051230612307123081230912310123111231212313123141231512316123171231812319123201232112322123231232412325123261232712328123291233012331123321233312334123351233612337123381233912340123411234212343123441234512346123471234812349123501235112352123531235412355123561235712358123591236012361123621236312364123651236612367123681236912370123711237212373123741237512376123771237812379123801238112382123831238412385123861238712388123891239012391123921239312394123951239612397123981239912400124011240212403124041240512406124071240812409124101241112412124131241412415124161241712418124191242012421124221242312424124251242612427124281242912430124311243212433124341243512436124371243812439124401244112442124431244412445124461244712448124491245012451124521245312454124551245612457124581245912460124611246212463124641246512466124671246812469124701247112472124731247412475124761247712478124791248012481124821248312484124851248612487124881248912490124911249212493124941249512496124971249812499125001250112502125031250412505125061250712508125091251012511125121251312514125151251612517125181251912520125211252212523125241252512526125271252812529125301253112532125331253412535125361253712538125391254012541125421254312544125451254612547125481254912550125511255212553125541255512556125571255812559125601256112562125631256412565125661256712568125691257012571125721257312574125751257612577125781257912580125811258212583125841258512586125871258812589125901259112592125931259412595125961259712598125991260012601126021260312604126051260612607126081260912610126111261212613126141261512616126171261812619126201262112622126231262412625126261262712628126291263012631126321263312634126351263612637126381263912640126411264212643126441264512646126471264812649126501265112652126531265412655126561265712658126591266012661126621266312664126651266612667126681266912670126711267212673126741267512676126771267812679126801268112682126831268412685126861268712688126891269012691126921269312694126951269612697126981269912700127011270212703127041270512706127071270812709127101271112712127131271412715127161271712718127191272012721127221272312724127251272612727127281272912730127311273212733127341273512736127371273812739127401274112742127431274412745127461274712748127491275012751127521275312754127551275612757127581275912760127611276212763127641276512766127671276812769127701277112772127731277412775127761277712778127791278012781127821278312784127851278612787127881278912790127911279212793127941279512796127971279812799128001280112802128031280412805128061280712808128091281012811128121281312814128151281612817128181281912820128211282212823128241282512826128271282812829128301283112832128331283412835128361283712838128391284012841128421284312844128451284612847128481284912850128511285212853128541285512856128571285812859128601286112862128631286412865128661286712868128691287012871128721287312874128751287612877128781287912880128811288212883128841288512886128871288812889128901289112892128931289412895128961289712898128991290012901129021290312904129051290612907129081290912910129111291212913129141291512916129171291812919129201292112922129231292412925129261292712928129291293012931129321293312934129351293612937129381293912940129411294212943129441294512946129471294812949129501295112952129531295412955129561295712958129591296012961129621296312964129651296612967129681296912970129711297212973129741297512976129771297812979129801298112982129831298412985129861298712988129891299012991129921299312994129951299612997129981299913000130011300213003130041300513006130071300813009130101301113012130131301413015130161301713018130191302013021130221302313024130251302613027130281302913030130311303213033130341303513036130371303813039130401304113042130431304413045130461304713048130491305013051130521305313054130551305613057130581305913060130611306213063130641306513066130671306813069130701307113072130731307413075130761307713078130791308013081130821308313084130851308613087130881308913090130911309213093130941309513096130971309813099131001310113102131031310413105131061310713108131091311013111131121311313114131151311613117131181311913120131211312213123131241312513126131271312813129131301313113132131331313413135131361313713138131391314013141131421314313144131451314613147131481314913150131511315213153131541315513156131571315813159131601316113162131631316413165131661316713168131691317013171131721317313174131751317613177131781317913180131811318213183131841318513186131871318813189131901319113192131931319413195131961319713198131991320013201132021320313204132051320613207132081320913210132111321213213132141321513216132171321813219132201322113222132231322413225132261322713228132291323013231132321323313234132351323613237132381323913240132411324213243132441324513246132471324813249132501325113252132531325413255132561325713258132591326013261132621326313264132651326613267132681326913270132711327213273132741327513276132771327813279132801328113282132831328413285132861328713288132891329013291132921329313294132951329613297132981329913300133011330213303133041330513306133071330813309133101331113312133131331413315133161331713318133191332013321133221332313324133251332613327133281332913330133311333213333133341333513336133371333813339133401334113342133431334413345133461334713348133491335013351133521335313354133551335613357133581335913360133611336213363133641336513366133671336813369133701337113372133731337413375133761337713378133791338013381133821338313384133851338613387133881338913390133911339213393133941339513396133971339813399134001340113402134031340413405134061340713408134091341013411134121341313414134151341613417134181341913420134211342213423134241342513426134271342813429134301343113432134331343413435134361343713438134391344013441134421344313444134451344613447134481344913450134511345213453134541345513456134571345813459134601346113462134631346413465134661346713468134691347013471134721347313474134751347613477134781347913480134811348213483134841348513486134871348813489134901349113492134931349413495134961349713498134991350013501135021350313504135051350613507135081350913510135111351213513135141351513516135171351813519135201352113522135231352413525135261352713528135291353013531135321353313534135351353613537135381353913540135411354213543135441354513546135471354813549135501355113552135531355413555135561355713558135591356013561135621356313564135651356613567135681356913570135711357213573135741357513576135771357813579135801358113582135831358413585135861358713588135891359013591135921359313594135951359613597135981359913600136011360213603136041360513606136071360813609136101361113612136131361413615136161361713618136191362013621136221362313624136251362613627136281362913630136311363213633136341363513636136371363813639136401364113642136431364413645136461364713648136491365013651136521365313654136551365613657136581365913660136611366213663136641366513666136671366813669136701367113672136731367413675136761367713678136791368013681136821368313684136851368613687136881368913690136911369213693136941369513696136971369813699137001370113702137031370413705137061370713708137091371013711137121371313714137151371613717137181371913720137211372213723137241372513726137271372813729137301373113732137331373413735137361373713738137391374013741137421374313744137451374613747137481374913750137511375213753137541375513756137571375813759137601376113762137631376413765137661376713768137691377013771137721377313774137751377613777137781377913780137811378213783137841378513786137871378813789137901379113792137931379413795137961379713798137991380013801138021380313804138051380613807138081380913810138111381213813138141381513816138171381813819138201382113822138231382413825138261382713828138291383013831138321383313834138351383613837138381383913840138411384213843138441384513846138471384813849138501385113852138531385413855138561385713858138591386013861138621386313864138651386613867138681386913870138711387213873138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894138951389613897138981389913900139011390213903139041390513906139071390813909139101391113912139131391413915139161391713918139191392013921139221392313924139251392613927139281392913930139311393213933139341393513936139371393813939139401394113942139431394413945139461394713948139491395013951139521395313954139551395613957139581395913960139611396213963139641396513966139671396813969139701397113972139731397413975139761397713978139791398013981139821398313984139851398613987139881398913990139911399213993139941399513996139971399813999140001400114002140031400414005140061400714008140091401014011140121401314014140151401614017140181401914020140211402214023140241402514026140271402814029140301403114032140331403414035140361403714038140391404014041140421404314044140451404614047140481404914050140511405214053140541405514056140571405814059140601406114062140631406414065140661406714068140691407014071140721407314074140751407614077140781407914080140811408214083140841408514086140871408814089140901409114092140931409414095140961409714098140991410014101141021410314104141051410614107141081410914110141111411214113141141411514116141171411814119141201412114122141231412414125141261412714128141291413014131141321413314134141351413614137141381413914140141411414214143141441414514146141471414814149141501415114152141531415414155141561415714158141591416014161141621416314164141651416614167141681416914170141711417214173141741417514176141771417814179141801418114182141831418414185141861418714188141891419014191141921419314194141951419614197141981419914200142011420214203142041420514206142071420814209142101421114212142131421414215142161421714218142191422014221142221422314224142251422614227142281422914230142311423214233142341423514236142371423814239142401424114242142431424414245142461424714248142491425014251142521425314254142551425614257142581425914260142611426214263142641426514266142671426814269142701427114272142731427414275142761427714278142791428014281142821428314284142851428614287142881428914290142911429214293142941429514296142971429814299143001430114302143031430414305143061430714308143091431014311143121431314314143151431614317143181431914320143211432214323143241432514326143271432814329143301433114332143331433414335143361433714338143391434014341143421434314344143451434614347143481434914350143511435214353143541435514356143571435814359143601436114362143631436414365143661436714368143691437014371143721437314374143751437614377143781437914380143811438214383143841438514386143871438814389143901439114392143931439414395143961439714398143991440014401144021440314404144051440614407144081440914410144111441214413144141441514416144171441814419144201442114422144231442414425144261442714428144291443014431144321443314434144351443614437144381443914440144411444214443144441444514446144471444814449144501445114452144531445414455144561445714458144591446014461144621446314464144651446614467144681446914470144711447214473144741447514476144771447814479144801448114482144831448414485144861448714488144891449014491144921449314494144951449614497144981449914500145011450214503145041450514506145071450814509145101451114512145131451414515145161451714518145191452014521145221452314524145251452614527145281452914530145311453214533145341453514536145371453814539145401454114542145431454414545145461454714548145491455014551145521455314554145551455614557145581455914560145611456214563145641456514566145671456814569145701457114572145731457414575145761457714578145791458014581145821458314584145851458614587145881458914590145911459214593145941459514596145971459814599146001460114602146031460414605146061460714608146091461014611146121461314614146151461614617146181461914620146211462214623146241462514626146271462814629146301463114632146331463414635146361463714638146391464014641146421464314644146451464614647146481464914650146511465214653146541465514656146571465814659146601466114662146631466414665146661466714668146691467014671146721467314674146751467614677146781467914680146811468214683146841468514686146871468814689146901469114692146931469414695146961469714698146991470014701147021470314704147051470614707147081470914710147111471214713147141471514716147171471814719147201472114722147231472414725147261472714728147291473014731147321473314734147351473614737147381473914740147411474214743147441474514746147471474814749147501475114752147531475414755147561475714758147591476014761147621476314764147651476614767147681476914770147711477214773147741477514776147771477814779147801478114782147831478414785147861478714788147891479014791147921479314794147951479614797147981479914800148011480214803148041480514806148071480814809148101481114812148131481414815148161481714818148191482014821148221482314824148251482614827148281482914830148311483214833148341483514836148371483814839148401484114842148431484414845148461484714848148491485014851148521485314854148551485614857148581485914860148611486214863148641486514866148671486814869148701487114872148731487414875148761487714878148791488014881148821488314884148851488614887148881488914890148911489214893148941489514896148971489814899149001490114902149031490414905149061490714908149091491014911149121491314914149151491614917149181491914920149211492214923149241492514926149271492814929149301493114932149331493414935149361493714938149391494014941149421494314944149451494614947149481494914950149511495214953149541495514956149571495814959149601496114962149631496414965149661496714968149691497014971149721497314974149751497614977149781497914980149811498214983149841498514986149871498814989149901499114992149931499414995149961499714998149991500015001150021500315004150051500615007150081500915010150111501215013150141501515016150171501815019150201502115022150231502415025150261502715028150291503015031150321503315034150351503615037150381503915040150411504215043150441504515046150471504815049150501505115052150531505415055150561505715058150591506015061150621506315064150651506615067150681506915070150711507215073150741507515076150771507815079150801508115082150831508415085150861508715088150891509015091150921509315094150951509615097150981509915100151011510215103151041510515106151071510815109151101511115112151131511415115151161511715118151191512015121151221512315124151251512615127151281512915130151311513215133151341513515136151371513815139151401514115142151431514415145151461514715148151491515015151151521515315154151551515615157151581515915160151611516215163151641516515166151671516815169151701517115172151731517415175151761517715178151791518015181151821518315184151851518615187151881518915190151911519215193151941519515196151971519815199152001520115202152031520415205152061520715208152091521015211152121521315214152151521615217152181521915220152211522215223152241522515226152271522815229152301523115232152331523415235152361523715238152391524015241152421524315244152451524615247152481524915250152511525215253152541525515256152571525815259152601526115262152631526415265152661526715268152691527015271152721527315274152751527615277152781527915280152811528215283152841528515286152871528815289152901529115292152931529415295152961529715298152991530015301153021530315304153051530615307153081530915310153111531215313153141531515316153171531815319153201532115322153231532415325153261532715328153291533015331153321533315334153351533615337153381533915340153411534215343153441534515346153471534815349153501535115352153531535415355153561535715358153591536015361153621536315364153651536615367153681536915370153711537215373153741537515376153771537815379153801538115382153831538415385153861538715388153891539015391153921539315394153951539615397153981539915400154011540215403154041540515406154071540815409154101541115412154131541415415154161541715418154191542015421154221542315424154251542615427154281542915430154311543215433154341543515436154371543815439154401544115442154431544415445154461544715448154491545015451154521545315454154551545615457154581545915460154611546215463154641546515466154671546815469154701547115472154731547415475154761547715478154791548015481154821548315484154851548615487154881548915490154911549215493154941549515496154971549815499155001550115502155031550415505155061550715508155091551015511155121551315514155151551615517155181551915520155211552215523155241552515526155271552815529155301553115532155331553415535155361553715538155391554015541155421554315544155451554615547155481554915550155511555215553155541555515556155571555815559155601556115562155631556415565155661556715568155691557015571155721557315574155751557615577155781557915580155811558215583155841558515586155871558815589155901559115592155931559415595155961559715598155991560015601156021560315604156051560615607156081560915610156111561215613156141561515616156171561815619156201562115622156231562415625156261562715628156291563015631156321563315634156351563615637156381563915640156411564215643156441564515646156471564815649156501565115652156531565415655156561565715658156591566015661156621566315664156651566615667156681566915670156711567215673156741567515676156771567815679156801568115682156831568415685156861568715688156891569015691156921569315694156951569615697156981569915700157011570215703157041570515706157071570815709157101571115712157131571415715157161571715718157191572015721157221572315724157251572615727157281572915730157311573215733157341573515736157371573815739157401574115742157431574415745157461574715748157491575015751157521575315754157551575615757157581575915760157611576215763157641576515766157671576815769157701577115772157731577415775157761577715778157791578015781157821578315784157851578615787157881578915790157911579215793157941579515796157971579815799158001580115802158031580415805158061580715808158091581015811158121581315814158151581615817158181581915820158211582215823158241582515826158271582815829158301583115832158331583415835158361583715838158391584015841158421584315844158451584615847158481584915850158511585215853158541585515856158571585815859158601586115862158631586415865158661586715868158691587015871158721587315874158751587615877158781587915880158811588215883158841588515886158871588815889158901589115892158931589415895158961589715898158991590015901159021590315904159051590615907159081590915910159111591215913159141591515916159171591815919159201592115922159231592415925159261592715928159291593015931159321593315934159351593615937159381593915940159411594215943159441594515946159471594815949159501595115952159531595415955159561595715958159591596015961159621596315964159651596615967159681596915970159711597215973159741597515976159771597815979159801598115982159831598415985159861598715988159891599015991159921599315994159951599615997159981599916000160011600216003160041600516006160071600816009160101601116012160131601416015160161601716018160191602016021160221602316024160251602616027160281602916030160311603216033160341603516036160371603816039160401604116042160431604416045160461604716048160491605016051160521605316054160551605616057160581605916060160611606216063160641606516066160671606816069160701607116072160731607416075160761607716078160791608016081160821608316084160851608616087160881608916090160911609216093160941609516096160971609816099161001610116102161031610416105161061610716108161091611016111161121611316114161151611616117161181611916120161211612216123161241612516126161271612816129161301613116132161331613416135161361613716138161391614016141161421614316144161451614616147161481614916150161511615216153161541615516156161571615816159161601616116162161631616416165161661616716168161691617016171161721617316174161751617616177161781617916180161811618216183161841618516186161871618816189161901619116192161931619416195161961619716198161991620016201162021620316204162051620616207162081620916210162111621216213162141621516216162171621816219162201622116222162231622416225162261622716228162291623016231162321623316234162351623616237162381623916240162411624216243162441624516246162471624816249162501625116252162531625416255162561625716258162591626016261162621626316264162651626616267162681626916270162711627216273162741627516276162771627816279162801628116282162831628416285162861628716288162891629016291162921629316294162951629616297162981629916300163011630216303163041630516306163071630816309163101631116312163131631416315163161631716318163191632016321163221632316324163251632616327163281632916330163311633216333163341633516336163371633816339163401634116342163431634416345163461634716348163491635016351163521635316354163551635616357163581635916360163611636216363163641636516366163671636816369163701637116372163731637416375163761637716378163791638016381163821638316384163851638616387163881638916390163911639216393163941639516396163971639816399164001640116402164031640416405164061640716408164091641016411164121641316414164151641616417164181641916420164211642216423164241642516426164271642816429164301643116432164331643416435164361643716438164391644016441164421644316444164451644616447164481644916450164511645216453164541645516456164571645816459164601646116462164631646416465164661646716468164691647016471164721647316474164751647616477164781647916480164811648216483164841648516486164871648816489164901649116492164931649416495164961649716498164991650016501165021650316504165051650616507165081650916510165111651216513165141651516516165171651816519165201652116522165231652416525165261652716528165291653016531165321653316534165351653616537165381653916540165411654216543165441654516546165471654816549165501655116552165531655416555165561655716558165591656016561165621656316564165651656616567165681656916570165711657216573165741657516576165771657816579165801658116582165831658416585165861658716588165891659016591165921659316594165951659616597165981659916600166011660216603166041660516606166071660816609166101661116612166131661416615166161661716618166191662016621166221662316624166251662616627166281662916630166311663216633166341663516636166371663816639166401664116642166431664416645166461664716648166491665016651166521665316654166551665616657166581665916660166611666216663166641666516666166671666816669166701667116672166731667416675166761667716678166791668016681166821668316684166851668616687166881668916690166911669216693166941669516696166971669816699167001670116702167031670416705167061670716708167091671016711167121671316714167151671616717167181671916720167211672216723167241672516726167271672816729167301673116732167331673416735167361673716738167391674016741167421674316744167451674616747167481674916750167511675216753167541675516756167571675816759167601676116762167631676416765167661676716768167691677016771167721677316774167751677616777167781677916780167811678216783167841678516786167871678816789167901679116792167931679416795167961679716798167991680016801168021680316804168051680616807168081680916810168111681216813168141681516816168171681816819168201682116822168231682416825168261682716828168291683016831168321683316834168351683616837168381683916840168411684216843168441684516846168471684816849168501685116852168531685416855168561685716858168591686016861168621686316864168651686616867168681686916870168711687216873168741687516876168771687816879168801688116882168831688416885168861688716888168891689016891168921689316894168951689616897168981689916900169011690216903169041690516906169071690816909169101691116912169131691416915169161691716918169191692016921169221692316924169251692616927169281692916930169311693216933169341693516936169371693816939169401694116942169431694416945169461694716948169491695016951169521695316954169551695616957169581695916960169611696216963169641696516966169671696816969169701697116972169731697416975169761697716978169791698016981169821698316984169851698616987169881698916990169911699216993169941699516996169971699816999170001700117002170031700417005170061700717008170091701017011170121701317014170151701617017170181701917020170211702217023170241702517026170271702817029170301703117032170331703417035170361703717038170391704017041170421704317044170451704617047170481704917050170511705217053170541705517056170571705817059170601706117062170631706417065170661706717068170691707017071170721707317074170751707617077170781707917080170811708217083170841708517086170871708817089170901709117092170931709417095170961709717098170991710017101171021710317104171051710617107171081710917110171111711217113171141711517116171171711817119171201712117122171231712417125171261712717128171291713017131171321713317134171351713617137171381713917140171411714217143171441714517146171471714817149171501715117152171531715417155171561715717158171591716017161171621716317164171651716617167171681716917170171711717217173171741717517176171771717817179171801718117182171831718417185171861718717188171891719017191171921719317194171951719617197171981719917200172011720217203172041720517206172071720817209172101721117212172131721417215172161721717218172191722017221172221722317224172251722617227172281722917230172311723217233172341723517236172371723817239172401724117242172431724417245172461724717248172491725017251172521725317254172551725617257172581725917260172611726217263172641726517266172671726817269172701727117272172731727417275172761727717278172791728017281172821728317284172851728617287172881728917290172911729217293172941729517296172971729817299173001730117302173031730417305173061730717308173091731017311173121731317314173151731617317173181731917320173211732217323173241732517326173271732817329173301733117332173331733417335173361733717338173391734017341173421734317344173451734617347173481734917350173511735217353173541735517356173571735817359173601736117362173631736417365173661736717368173691737017371173721737317374173751737617377173781737917380173811738217383173841738517386173871738817389173901739117392173931739417395173961739717398173991740017401174021740317404174051740617407174081740917410174111741217413174141741517416174171741817419174201742117422174231742417425174261742717428174291743017431174321743317434174351743617437174381743917440174411744217443174441744517446174471744817449174501745117452174531745417455174561745717458174591746017461174621746317464174651746617467174681746917470174711747217473174741747517476174771747817479174801748117482174831748417485174861748717488174891749017491174921749317494174951749617497174981749917500175011750217503175041750517506175071750817509175101751117512175131751417515175161751717518175191752017521175221752317524175251752617527175281752917530175311753217533175341753517536175371753817539175401754117542175431754417545175461754717548175491755017551175521755317554175551755617557175581755917560175611756217563175641756517566175671756817569175701757117572175731757417575175761757717578175791758017581175821758317584175851758617587175881758917590175911759217593175941759517596175971759817599176001760117602176031760417605176061760717608176091761017611176121761317614176151761617617176181761917620176211762217623176241762517626176271762817629176301763117632176331763417635176361763717638176391764017641176421764317644176451764617647176481764917650176511765217653176541765517656176571765817659176601766117662176631766417665176661766717668176691767017671176721767317674176751767617677176781767917680176811768217683176841768517686176871768817689176901769117692176931769417695176961769717698176991770017701177021770317704177051770617707177081770917710177111771217713177141771517716177171771817719177201772117722177231772417725177261772717728177291773017731177321773317734177351773617737177381773917740177411774217743177441774517746177471774817749177501775117752177531775417755177561775717758177591776017761177621776317764177651776617767177681776917770177711777217773177741777517776177771777817779177801778117782177831778417785177861778717788177891779017791177921779317794177951779617797177981779917800178011780217803178041780517806178071780817809178101781117812178131781417815178161781717818178191782017821178221782317824178251782617827178281782917830178311783217833178341783517836178371783817839178401784117842178431784417845178461784717848178491785017851178521785317854178551785617857178581785917860178611786217863178641786517866178671786817869178701787117872178731787417875178761787717878178791788017881178821788317884178851788617887178881788917890178911789217893178941789517896178971789817899179001790117902179031790417905179061790717908179091791017911179121791317914179151791617917179181791917920179211792217923179241792517926179271792817929179301793117932179331793417935179361793717938179391794017941179421794317944179451794617947179481794917950179511795217953179541795517956179571795817959179601796117962179631796417965179661796717968179691797017971179721797317974179751797617977179781797917980179811798217983179841798517986179871798817989179901799117992179931799417995179961799717998179991800018001180021800318004180051800618007180081800918010180111801218013180141801518016180171801818019180201802118022180231802418025180261802718028180291803018031180321803318034180351803618037180381803918040180411804218043180441804518046180471804818049180501805118052180531805418055180561805718058180591806018061180621806318064180651806618067180681806918070180711807218073180741807518076180771807818079180801808118082180831808418085180861808718088180891809018091180921809318094180951809618097180981809918100181011810218103181041810518106181071810818109181101811118112181131811418115181161811718118181191812018121181221812318124181251812618127181281812918130181311813218133181341813518136181371813818139181401814118142181431814418145181461814718148181491815018151181521815318154181551815618157181581815918160181611816218163181641816518166181671816818169181701817118172181731817418175181761817718178181791818018181181821818318184181851818618187181881818918190181911819218193181941819518196181971819818199182001820118202182031820418205182061820718208182091821018211182121821318214182151821618217182181821918220182211822218223182241822518226182271822818229182301823118232182331823418235182361823718238182391824018241182421824318244182451824618247182481824918250182511825218253182541825518256182571825818259182601826118262182631826418265182661826718268182691827018271182721827318274182751827618277182781827918280182811828218283182841828518286182871828818289182901829118292182931829418295182961829718298182991830018301183021830318304183051830618307183081830918310183111831218313183141831518316183171831818319183201832118322183231832418325183261832718328183291833018331183321833318334183351833618337183381833918340183411834218343183441834518346183471834818349183501835118352183531835418355183561835718358183591836018361183621836318364183651836618367183681836918370183711837218373183741837518376183771837818379183801838118382183831838418385183861838718388183891839018391183921839318394183951839618397183981839918400184011840218403184041840518406184071840818409184101841118412184131841418415184161841718418184191842018421184221842318424184251842618427184281842918430184311843218433184341843518436184371843818439184401844118442184431844418445184461844718448184491845018451184521845318454184551845618457184581845918460184611846218463184641846518466184671846818469184701847118472184731847418475184761847718478184791848018481184821848318484184851848618487184881848918490184911849218493184941849518496184971849818499185001850118502185031850418505185061850718508185091851018511185121851318514185151851618517185181851918520185211852218523185241852518526185271852818529185301853118532185331853418535185361853718538185391854018541185421854318544185451854618547185481854918550185511855218553185541855518556185571855818559185601856118562185631856418565185661856718568185691857018571185721857318574185751857618577185781857918580185811858218583185841858518586185871858818589185901859118592185931859418595185961859718598185991860018601186021860318604186051860618607186081860918610186111861218613186141861518616186171861818619186201862118622186231862418625186261862718628186291863018631186321863318634186351863618637186381863918640186411864218643186441864518646186471864818649186501865118652186531865418655186561865718658186591866018661186621866318664186651866618667186681866918670186711867218673186741867518676186771867818679186801868118682186831868418685186861868718688186891869018691186921869318694186951869618697186981869918700187011870218703187041870518706187071870818709187101871118712187131871418715187161871718718187191872018721187221872318724187251872618727187281872918730187311873218733187341873518736187371873818739187401874118742187431874418745187461874718748187491875018751187521875318754187551875618757187581875918760187611876218763187641876518766187671876818769187701877118772187731877418775187761877718778187791878018781187821878318784187851878618787187881878918790187911879218793187941879518796187971879818799188001880118802188031880418805188061880718808188091881018811188121881318814188151881618817188181881918820188211882218823188241882518826188271882818829188301883118832188331883418835188361883718838188391884018841188421884318844188451884618847188481884918850188511885218853188541885518856188571885818859188601886118862188631886418865188661886718868188691887018871188721887318874188751887618877188781887918880188811888218883188841888518886188871888818889188901889118892188931889418895188961889718898188991890018901189021890318904189051890618907189081890918910189111891218913189141891518916189171891818919189201892118922189231892418925189261892718928189291893018931189321893318934189351893618937189381893918940189411894218943189441894518946189471894818949189501895118952189531895418955189561895718958189591896018961189621896318964189651896618967189681896918970189711897218973189741897518976189771897818979189801898118982189831898418985189861898718988189891899018991189921899318994189951899618997189981899919000190011900219003190041900519006190071900819009190101901119012190131901419015190161901719018190191902019021190221902319024190251902619027190281902919030190311903219033190341903519036190371903819039190401904119042190431904419045190461904719048190491905019051190521905319054190551905619057190581905919060190611906219063190641906519066190671906819069190701907119072190731907419075190761907719078190791908019081190821908319084190851908619087190881908919090190911909219093190941909519096190971909819099191001910119102191031910419105191061910719108191091911019111191121911319114191151911619117191181911919120191211912219123191241912519126191271912819129191301913119132191331913419135191361913719138191391914019141191421914319144191451914619147191481914919150191511915219153191541915519156191571915819159191601916119162191631916419165191661916719168191691917019171191721917319174191751917619177191781917919180191811918219183191841918519186191871918819189191901919119192191931919419195191961919719198191991920019201192021920319204192051920619207192081920919210192111921219213192141921519216192171921819219192201922119222192231922419225192261922719228192291923019231192321923319234192351923619237192381923919240192411924219243192441924519246192471924819249192501925119252192531925419255192561925719258192591926019261192621926319264192651926619267192681926919270192711927219273192741927519276192771927819279192801928119282192831928419285192861928719288192891929019291192921929319294192951929619297192981929919300193011930219303193041930519306193071930819309193101931119312193131931419315193161931719318193191932019321193221932319324193251932619327193281932919330193311933219333193341933519336193371933819339193401934119342193431934419345193461934719348193491935019351193521935319354193551935619357193581935919360193611936219363193641936519366193671936819369193701937119372193731937419375193761937719378193791938019381193821938319384193851938619387193881938919390193911939219393193941939519396193971939819399194001940119402194031940419405194061940719408194091941019411194121941319414194151941619417194181941919420194211942219423194241942519426194271942819429194301943119432194331943419435194361943719438194391944019441194421944319444194451944619447194481944919450194511945219453194541945519456194571945819459194601946119462194631946419465194661946719468194691947019471194721947319474194751947619477194781947919480194811948219483194841948519486194871948819489194901949119492194931949419495194961949719498194991950019501195021950319504195051950619507195081950919510195111951219513195141951519516195171951819519195201952119522195231952419525195261952719528195291953019531195321953319534195351953619537195381953919540195411954219543195441954519546195471954819549195501955119552195531955419555195561955719558195591956019561195621956319564195651956619567195681956919570195711957219573195741957519576195771957819579195801958119582195831958419585195861958719588195891959019591195921959319594195951959619597195981959919600196011960219603196041960519606196071960819609196101961119612196131961419615196161961719618196191962019621196221962319624196251962619627196281962919630196311963219633196341963519636196371963819639196401964119642196431964419645196461964719648196491965019651196521965319654196551965619657196581965919660196611966219663196641966519666196671966819669196701967119672196731967419675196761967719678196791968019681196821968319684196851968619687196881968919690196911969219693196941969519696196971969819699197001970119702197031970419705197061970719708197091971019711197121971319714197151971619717197181971919720197211972219723197241972519726197271972819729197301973119732197331973419735197361973719738197391974019741197421974319744197451974619747197481974919750197511975219753197541975519756197571975819759197601976119762197631976419765197661976719768197691977019771197721977319774197751977619777197781977919780197811978219783197841978519786197871978819789197901979119792197931979419795197961979719798197991980019801198021980319804198051980619807198081980919810198111981219813198141981519816198171981819819198201982119822198231982419825198261982719828198291983019831198321983319834198351983619837198381983919840198411984219843198441984519846198471984819849198501985119852198531985419855198561985719858198591986019861198621986319864198651986619867198681986919870198711987219873198741987519876198771987819879198801988119882198831988419885198861988719888198891989019891198921989319894198951989619897198981989919900199011990219903199041990519906199071990819909199101991119912199131991419915199161991719918199191992019921199221992319924199251992619927199281992919930199311993219933199341993519936199371993819939199401994119942199431994419945199461994719948199491995019951199521995319954199551995619957199581995919960199611996219963199641996519966199671996819969199701997119972199731997419975199761997719978199791998019981199821998319984199851998619987199881998919990199911999219993199941999519996199971999819999200002000120002200032000420005200062000720008200092001020011200122001320014200152001620017200182001920020200212002220023200242002520026200272002820029200302003120032200332003420035200362003720038200392004020041200422004320044200452004620047200482004920050200512005220053200542005520056200572005820059200602006120062200632006420065200662006720068200692007020071200722007320074200752007620077200782007920080200812008220083200842008520086200872008820089200902009120092200932009420095200962009720098200992010020101201022010320104201052010620107201082010920110201112011220113201142011520116201172011820119201202012120122201232012420125201262012720128201292013020131201322013320134201352013620137201382013920140201412014220143201442014520146201472014820149201502015120152201532015420155201562015720158201592016020161201622016320164201652016620167201682016920170201712017220173201742017520176201772017820179201802018120182201832018420185201862018720188201892019020191201922019320194201952019620197201982019920200202012020220203202042020520206202072020820209202102021120212202132021420215202162021720218202192022020221202222022320224202252022620227202282022920230202312023220233202342023520236202372023820239202402024120242202432024420245202462024720248202492025020251202522025320254202552025620257202582025920260202612026220263202642026520266202672026820269202702027120272202732027420275202762027720278202792028020281202822028320284202852028620287202882028920290202912029220293202942029520296202972029820299203002030120302203032030420305203062030720308203092031020311203122031320314203152031620317203182031920320203212032220323203242032520326203272032820329203302033120332203332033420335203362033720338203392034020341203422034320344203452034620347203482034920350203512035220353203542035520356203572035820359203602036120362203632036420365203662036720368203692037020371203722037320374203752037620377203782037920380203812038220383203842038520386203872038820389203902039120392203932039420395203962039720398203992040020401204022040320404204052040620407204082040920410204112041220413204142041520416204172041820419204202042120422204232042420425204262042720428204292043020431204322043320434204352043620437204382043920440204412044220443204442044520446204472044820449204502045120452204532045420455204562045720458204592046020461204622046320464204652046620467204682046920470204712047220473204742047520476204772047820479204802048120482204832048420485204862048720488204892049020491204922049320494204952049620497204982049920500205012050220503205042050520506205072050820509205102051120512205132051420515205162051720518205192052020521205222052320524205252052620527205282052920530205312053220533205342053520536205372053820539205402054120542205432054420545205462054720548205492055020551205522055320554205552055620557205582055920560205612056220563205642056520566205672056820569205702057120572205732057420575205762057720578205792058020581205822058320584205852058620587205882058920590205912059220593205942059520596205972059820599206002060120602206032060420605206062060720608206092061020611206122061320614206152061620617206182061920620206212062220623206242062520626206272062820629206302063120632206332063420635206362063720638206392064020641206422064320644206452064620647206482064920650206512065220653206542065520656206572065820659206602066120662206632066420665206662066720668206692067020671206722067320674206752067620677206782067920680206812068220683206842068520686206872068820689206902069120692206932069420695206962069720698206992070020701207022070320704207052070620707207082070920710207112071220713207142071520716207172071820719207202072120722207232072420725207262072720728207292073020731207322073320734207352073620737207382073920740207412074220743207442074520746207472074820749207502075120752207532075420755207562075720758207592076020761207622076320764207652076620767207682076920770207712077220773207742077520776207772077820779207802078120782207832078420785207862078720788207892079020791207922079320794207952079620797207982079920800208012080220803208042080520806208072080820809208102081120812208132081420815208162081720818208192082020821208222082320824208252082620827208282082920830208312083220833208342083520836208372083820839208402084120842208432084420845208462084720848208492085020851208522085320854208552085620857208582085920860208612086220863208642086520866208672086820869208702087120872208732087420875208762087720878208792088020881208822088320884208852088620887208882088920890208912089220893208942089520896208972089820899209002090120902209032090420905209062090720908209092091020911209122091320914209152091620917209182091920920209212092220923209242092520926209272092820929209302093120932209332093420935209362093720938209392094020941209422094320944209452094620947209482094920950209512095220953209542095520956209572095820959209602096120962209632096420965209662096720968209692097020971209722097320974209752097620977209782097920980209812098220983209842098520986209872098820989209902099120992209932099420995209962099720998209992100021001210022100321004210052100621007210082100921010210112101221013210142101521016210172101821019210202102121022210232102421025210262102721028210292103021031210322103321034210352103621037210382103921040210412104221043210442104521046210472104821049210502105121052210532105421055210562105721058210592106021061210622106321064210652106621067210682106921070210712107221073210742107521076210772107821079210802108121082210832108421085210862108721088210892109021091210922109321094210952109621097210982109921100211012110221103211042110521106211072110821109211102111121112211132111421115211162111721118211192112021121211222112321124211252112621127211282112921130211312113221133211342113521136211372113821139211402114121142211432114421145211462114721148211492115021151211522115321154211552115621157211582115921160211612116221163211642116521166211672116821169211702117121172211732117421175211762117721178211792118021181211822118321184211852118621187211882118921190211912119221193211942119521196211972119821199212002120121202212032120421205212062120721208212092121021211212122121321214212152121621217212182121921220212212122221223212242122521226212272122821229212302123121232212332123421235212362123721238212392124021241212422124321244212452124621247212482124921250212512125221253212542125521256212572125821259212602126121262212632126421265212662126721268212692127021271212722127321274212752127621277212782127921280212812128221283212842128521286212872128821289212902129121292212932129421295212962129721298212992130021301213022130321304213052130621307213082130921310213112131221313213142131521316213172131821319213202132121322213232132421325213262132721328213292133021331213322133321334213352133621337213382133921340213412134221343213442134521346213472134821349213502135121352213532135421355213562135721358213592136021361213622136321364213652136621367213682136921370213712137221373213742137521376213772137821379213802138121382213832138421385213862138721388213892139021391213922139321394213952139621397213982139921400214012140221403214042140521406214072140821409214102141121412214132141421415214162141721418214192142021421214222142321424214252142621427214282142921430214312143221433214342143521436214372143821439214402144121442214432144421445214462144721448214492145021451214522145321454214552145621457214582145921460214612146221463214642146521466214672146821469214702147121472214732147421475214762147721478214792148021481214822148321484214852148621487214882148921490214912149221493214942149521496214972149821499215002150121502215032150421505215062150721508215092151021511215122151321514215152151621517215182151921520215212152221523215242152521526215272152821529215302153121532215332153421535215362153721538215392154021541215422154321544215452154621547215482154921550215512155221553215542155521556215572155821559215602156121562215632156421565215662156721568215692157021571215722157321574215752157621577215782157921580215812158221583215842158521586215872158821589215902159121592215932159421595215962159721598215992160021601216022160321604216052160621607216082160921610216112161221613216142161521616216172161821619216202162121622216232162421625216262162721628216292163021631216322163321634216352163621637216382163921640216412164221643216442164521646216472164821649216502165121652216532165421655216562165721658216592166021661216622166321664216652166621667216682166921670216712167221673216742167521676216772167821679216802168121682216832168421685216862168721688216892169021691216922169321694216952169621697216982169921700217012170221703217042170521706217072170821709217102171121712217132171421715217162171721718217192172021721217222172321724217252172621727217282172921730217312173221733217342173521736217372173821739217402174121742217432174421745217462174721748217492175021751217522175321754217552175621757217582175921760217612176221763217642176521766217672176821769217702177121772217732177421775217762177721778217792178021781217822178321784217852178621787217882178921790217912179221793217942179521796217972179821799218002180121802218032180421805218062180721808218092181021811218122181321814218152181621817218182181921820218212182221823218242182521826218272182821829218302183121832218332183421835218362183721838218392184021841218422184321844218452184621847218482184921850218512185221853218542185521856218572185821859218602186121862218632186421865218662186721868218692187021871218722187321874218752187621877218782187921880218812188221883218842188521886218872188821889218902189121892218932189421895218962189721898218992190021901219022190321904219052190621907219082190921910219112191221913219142191521916219172191821919219202192121922219232192421925219262192721928219292193021931219322193321934219352193621937219382193921940219412194221943219442194521946219472194821949219502195121952219532195421955219562195721958219592196021961219622196321964219652196621967219682196921970219712197221973219742197521976219772197821979219802198121982219832198421985219862198721988219892199021991219922199321994219952199621997219982199922000220012200222003220042200522006220072200822009220102201122012220132201422015220162201722018220192202022021220222202322024220252202622027220282202922030220312203222033220342203522036220372203822039220402204122042220432204422045220462204722048220492205022051220522205322054220552205622057220582205922060220612206222063220642206522066220672206822069220702207122072220732207422075220762207722078220792208022081220822208322084220852208622087220882208922090220912209222093220942209522096220972209822099221002210122102221032210422105221062210722108221092211022111221122211322114221152211622117221182211922120221212212222123221242212522126221272212822129221302213122132221332213422135221362213722138221392214022141221422214322144221452214622147221482214922150221512215222153221542215522156221572215822159221602216122162221632216422165221662216722168221692217022171221722217322174221752217622177221782217922180221812218222183221842218522186221872218822189221902219122192221932219422195221962219722198221992220022201222022220322204222052220622207222082220922210222112221222213222142221522216222172221822219222202222122222222232222422225222262222722228222292223022231222322223322234222352223622237222382223922240222412224222243222442224522246222472224822249222502225122252222532225422255222562225722258222592226022261222622226322264222652226622267222682226922270222712227222273222742227522276222772227822279222802228122282222832228422285222862228722288222892229022291222922229322294222952229622297222982229922300223012230222303223042230522306223072230822309223102231122312223132231422315223162231722318223192232022321223222232322324223252232622327223282232922330223312233222333223342233522336223372233822339223402234122342223432234422345223462234722348223492235022351223522235322354223552235622357223582235922360223612236222363223642236522366223672236822369223702237122372223732237422375223762237722378223792238022381223822238322384223852238622387223882238922390223912239222393223942239522396223972239822399224002240122402224032240422405224062240722408224092241022411224122241322414224152241622417224182241922420224212242222423224242242522426224272242822429224302243122432224332243422435224362243722438224392244022441224422244322444224452244622447224482244922450224512245222453224542245522456224572245822459224602246122462224632246422465224662246722468224692247022471224722247322474224752247622477224782247922480224812248222483224842248522486224872248822489224902249122492224932249422495224962249722498224992250022501225022250322504225052250622507225082250922510225112251222513225142251522516225172251822519225202252122522225232252422525225262252722528225292253022531225322253322534225352253622537225382253922540225412254222543225442254522546225472254822549225502255122552225532255422555225562255722558225592256022561225622256322564225652256622567225682256922570225712257222573225742257522576225772257822579225802258122582225832258422585225862258722588225892259022591225922259322594225952259622597225982259922600226012260222603226042260522606226072260822609226102261122612226132261422615226162261722618226192262022621226222262322624226252262622627226282262922630226312263222633226342263522636226372263822639226402264122642226432264422645226462264722648226492265022651226522265322654226552265622657226582265922660226612266222663226642266522666226672266822669226702267122672226732267422675226762267722678226792268022681226822268322684226852268622687226882268922690226912269222693226942269522696226972269822699227002270122702227032270422705227062270722708227092271022711227122271322714227152271622717227182271922720227212272222723227242272522726227272272822729227302273122732227332273422735227362273722738227392274022741227422274322744227452274622747227482274922750227512275222753227542275522756227572275822759227602276122762227632276422765227662276722768227692277022771227722277322774227752277622777227782277922780227812278222783227842278522786227872278822789227902279122792227932279422795227962279722798227992280022801228022280322804228052280622807228082280922810228112281222813228142281522816228172281822819228202282122822228232282422825228262282722828228292283022831228322283322834228352283622837228382283922840228412284222843228442284522846228472284822849228502285122852228532285422855228562285722858228592286022861228622286322864228652286622867228682286922870228712287222873228742287522876228772287822879228802288122882228832288422885228862288722888228892289022891228922289322894228952289622897228982289922900229012290222903229042290522906229072290822909229102291122912229132291422915229162291722918229192292022921229222292322924229252292622927229282292922930229312293222933229342293522936229372293822939229402294122942229432294422945229462294722948229492295022951229522295322954229552295622957229582295922960229612296222963229642296522966229672296822969229702297122972229732297422975229762297722978229792298022981229822298322984229852298622987229882298922990229912299222993229942299522996229972299822999230002300123002230032300423005230062300723008230092301023011230122301323014230152301623017230182301923020230212302223023230242302523026230272302823029230302303123032230332303423035230362303723038230392304023041230422304323044230452304623047230482304923050230512305223053230542305523056230572305823059230602306123062230632306423065230662306723068230692307023071230722307323074230752307623077230782307923080230812308223083230842308523086230872308823089230902309123092230932309423095230962309723098230992310023101231022310323104231052310623107231082310923110231112311223113231142311523116231172311823119231202312123122231232312423125231262312723128231292313023131231322313323134231352313623137231382313923140231412314223143231442314523146231472314823149231502315123152231532315423155231562315723158231592316023161231622316323164231652316623167231682316923170231712317223173231742317523176231772317823179231802318123182231832318423185231862318723188231892319023191231922319323194231952319623197231982319923200232012320223203232042320523206232072320823209232102321123212232132321423215232162321723218232192322023221232222322323224232252322623227232282322923230232312323223233232342323523236232372323823239232402324123242232432324423245232462324723248232492325023251232522325323254232552325623257232582325923260232612326223263232642326523266232672326823269232702327123272232732327423275232762327723278232792328023281232822328323284232852328623287232882328923290232912329223293232942329523296232972329823299233002330123302233032330423305233062330723308233092331023311233122331323314233152331623317233182331923320233212332223323233242332523326233272332823329233302333123332233332333423335233362333723338233392334023341233422334323344233452334623347233482334923350233512335223353233542335523356233572335823359233602336123362233632336423365233662336723368233692337023371233722337323374233752337623377233782337923380233812338223383233842338523386233872338823389233902339123392233932339423395233962339723398233992340023401234022340323404234052340623407234082340923410234112341223413234142341523416234172341823419234202342123422234232342423425234262342723428234292343023431234322343323434234352343623437234382343923440234412344223443234442344523446234472344823449234502345123452234532345423455234562345723458234592346023461234622346323464234652346623467234682346923470234712347223473234742347523476234772347823479234802348123482234832348423485234862348723488234892349023491234922349323494234952349623497234982349923500235012350223503235042350523506235072350823509235102351123512235132351423515235162351723518235192352023521235222352323524235252352623527235282352923530235312353223533235342353523536235372353823539235402354123542235432354423545235462354723548235492355023551235522355323554235552355623557235582355923560235612356223563235642356523566235672356823569235702357123572235732357423575235762357723578235792358023581235822358323584235852358623587235882358923590235912359223593235942359523596235972359823599236002360123602236032360423605236062360723608236092361023611236122361323614236152361623617236182361923620236212362223623236242362523626236272362823629236302363123632236332363423635236362363723638236392364023641236422364323644236452364623647236482364923650236512365223653236542365523656236572365823659236602366123662236632366423665236662366723668236692367023671236722367323674236752367623677236782367923680236812368223683236842368523686236872368823689236902369123692236932369423695236962369723698236992370023701237022370323704237052370623707237082370923710237112371223713237142371523716237172371823719237202372123722237232372423725237262372723728237292373023731237322373323734237352373623737237382373923740237412374223743237442374523746237472374823749237502375123752237532375423755237562375723758237592376023761237622376323764237652376623767237682376923770237712377223773237742377523776237772377823779237802378123782237832378423785237862378723788237892379023791237922379323794237952379623797237982379923800238012380223803238042380523806238072380823809238102381123812238132381423815238162381723818238192382023821238222382323824238252382623827238282382923830238312383223833238342383523836238372383823839238402384123842238432384423845238462384723848238492385023851238522385323854238552385623857238582385923860238612386223863238642386523866238672386823869238702387123872238732387423875238762387723878238792388023881238822388323884238852388623887238882388923890238912389223893238942389523896238972389823899239002390123902239032390423905239062390723908239092391023911239122391323914239152391623917239182391923920239212392223923239242392523926239272392823929239302393123932239332393423935239362393723938239392394023941239422394323944239452394623947239482394923950239512395223953239542395523956239572395823959239602396123962239632396423965239662396723968239692397023971239722397323974239752397623977239782397923980239812398223983239842398523986239872398823989239902399123992239932399423995239962399723998239992400024001240022400324004240052400624007240082400924010240112401224013240142401524016240172401824019240202402124022240232402424025240262402724028240292403024031240322403324034240352403624037240382403924040240412404224043240442404524046240472404824049240502405124052240532405424055240562405724058240592406024061240622406324064240652406624067240682406924070240712407224073240742407524076240772407824079240802408124082240832408424085240862408724088240892409024091240922409324094240952409624097240982409924100241012410224103241042410524106241072410824109241102411124112241132411424115241162411724118241192412024121241222412324124241252412624127241282412924130241312413224133241342413524136241372413824139241402414124142241432414424145241462414724148241492415024151241522415324154241552415624157241582415924160241612416224163241642416524166241672416824169241702417124172241732417424175241762417724178241792418024181241822418324184241852418624187241882418924190241912419224193241942419524196241972419824199242002420124202242032420424205242062420724208242092421024211242122421324214242152421624217242182421924220242212422224223242242422524226242272422824229242302423124232242332423424235242362423724238242392424024241242422424324244242452424624247242482424924250242512425224253242542425524256242572425824259242602426124262242632426424265242662426724268242692427024271242722427324274242752427624277242782427924280242812428224283242842428524286242872428824289242902429124292242932429424295242962429724298242992430024301243022430324304243052430624307243082430924310243112431224313243142431524316243172431824319243202432124322243232432424325243262432724328243292433024331243322433324334243352433624337243382433924340243412434224343243442434524346243472434824349243502435124352243532435424355243562435724358243592436024361243622436324364243652436624367243682436924370243712437224373243742437524376243772437824379243802438124382243832438424385243862438724388243892439024391243922439324394243952439624397243982439924400244012440224403244042440524406244072440824409244102441124412244132441424415244162441724418244192442024421244222442324424244252442624427244282442924430244312443224433244342443524436244372443824439244402444124442244432444424445244462444724448244492445024451244522445324454244552445624457244582445924460244612446224463244642446524466244672446824469244702447124472244732447424475244762447724478244792448024481244822448324484244852448624487244882448924490244912449224493244942449524496244972449824499245002450124502245032450424505245062450724508245092451024511245122451324514245152451624517245182451924520245212452224523245242452524526245272452824529245302453124532245332453424535245362453724538245392454024541245422454324544245452454624547245482454924550245512455224553245542455524556245572455824559245602456124562245632456424565245662456724568245692457024571245722457324574245752457624577245782457924580245812458224583245842458524586245872458824589245902459124592245932459424595245962459724598245992460024601246022460324604246052460624607246082460924610246112461224613246142461524616246172461824619246202462124622246232462424625246262462724628246292463024631246322463324634246352463624637246382463924640246412464224643246442464524646246472464824649246502465124652246532465424655246562465724658246592466024661246622466324664246652466624667246682466924670246712467224673246742467524676246772467824679246802468124682246832468424685246862468724688246892469024691246922469324694246952469624697246982469924700247012470224703247042470524706247072470824709247102471124712247132471424715247162471724718247192472024721247222472324724247252472624727247282472924730247312473224733247342473524736247372473824739247402474124742247432474424745247462474724748247492475024751247522475324754247552475624757247582475924760247612476224763247642476524766247672476824769247702477124772247732477424775247762477724778247792478024781247822478324784247852478624787247882478924790247912479224793247942479524796247972479824799248002480124802248032480424805248062480724808248092481024811248122481324814248152481624817248182481924820248212482224823248242482524826248272482824829248302483124832248332483424835248362483724838248392484024841248422484324844248452484624847248482484924850248512485224853248542485524856248572485824859248602486124862248632486424865248662486724868248692487024871248722487324874248752487624877248782487924880248812488224883248842488524886248872488824889248902489124892248932489424895248962489724898248992490024901249022490324904249052490624907249082490924910249112491224913249142491524916249172491824919249202492124922249232492424925249262492724928249292493024931249322493324934249352493624937249382493924940249412494224943249442494524946249472494824949249502495124952249532495424955249562495724958249592496024961249622496324964249652496624967249682496924970249712497224973249742497524976249772497824979249802498124982249832498424985249862498724988249892499024991249922499324994249952499624997249982499925000250012500225003250042500525006250072500825009250102501125012250132501425015250162501725018250192502025021250222502325024250252502625027250282502925030250312503225033250342503525036250372503825039250402504125042250432504425045250462504725048250492505025051250522505325054250552505625057250582505925060250612506225063250642506525066250672506825069250702507125072250732507425075250762507725078250792508025081250822508325084250852508625087250882508925090250912509225093250942509525096250972509825099251002510125102251032510425105251062510725108251092511025111251122511325114251152511625117251182511925120251212512225123251242512525126251272512825129251302513125132251332513425135251362513725138251392514025141251422514325144251452514625147251482514925150251512515225153251542515525156251572515825159251602516125162251632516425165251662516725168251692517025171251722517325174251752517625177251782517925180251812518225183251842518525186251872518825189251902519125192251932519425195251962519725198251992520025201252022520325204252052520625207252082520925210252112521225213252142521525216252172521825219252202522125222252232522425225252262522725228252292523025231252322523325234252352523625237252382523925240252412524225243252442524525246252472524825249252502525125252252532525425255252562525725258252592526025261252622526325264252652526625267252682526925270252712527225273252742527525276252772527825279252802528125282252832528425285252862528725288252892529025291252922529325294252952529625297252982529925300253012530225303253042530525306253072530825309253102531125312253132531425315253162531725318253192532025321253222532325324253252532625327253282532925330253312533225333253342533525336253372533825339253402534125342253432534425345253462534725348253492535025351253522535325354253552535625357253582535925360253612536225363253642536525366253672536825369253702537125372253732537425375253762537725378253792538025381253822538325384253852538625387253882538925390253912539225393253942539525396253972539825399254002540125402254032540425405254062540725408254092541025411254122541325414254152541625417254182541925420254212542225423254242542525426254272542825429254302543125432254332543425435254362543725438254392544025441254422544325444254452544625447254482544925450254512545225453254542545525456254572545825459254602546125462254632546425465254662546725468254692547025471254722547325474254752547625477254782547925480254812548225483254842548525486254872548825489254902549125492254932549425495254962549725498254992550025501255022550325504255052550625507255082550925510255112551225513255142551525516255172551825519255202552125522255232552425525255262552725528255292553025531255322553325534255352553625537255382553925540255412554225543255442554525546255472554825549255502555125552255532555425555255562555725558255592556025561255622556325564255652556625567255682556925570255712557225573255742557525576255772557825579255802558125582255832558425585255862558725588255892559025591255922559325594255952559625597255982559925600256012560225603256042560525606256072560825609256102561125612256132561425615256162561725618256192562025621256222562325624256252562625627256282562925630256312563225633256342563525636256372563825639256402564125642256432564425645256462564725648256492565025651256522565325654256552565625657256582565925660256612566225663256642566525666256672566825669256702567125672256732567425675256762567725678256792568025681256822568325684256852568625687256882568925690256912569225693256942569525696256972569825699257002570125702257032570425705257062570725708257092571025711257122571325714257152571625717257182571925720257212572225723257242572525726257272572825729257302573125732257332573425735257362573725738257392574025741257422574325744257452574625747257482574925750257512575225753257542575525756257572575825759257602576125762257632576425765257662576725768257692577025771257722577325774257752577625777257782577925780257812578225783257842578525786257872578825789257902579125792257932579425795257962579725798257992580025801258022580325804258052580625807258082580925810258112581225813258142581525816258172581825819258202582125822258232582425825258262582725828258292583025831258322583325834258352583625837258382583925840258412584225843258442584525846258472584825849258502585125852258532585425855258562585725858258592586025861258622586325864258652586625867258682586925870258712587225873258742587525876258772587825879258802588125882258832588425885258862588725888258892589025891258922589325894258952589625897258982589925900259012590225903259042590525906259072590825909259102591125912259132591425915259162591725918259192592025921259222592325924259252592625927259282592925930259312593225933259342593525936259372593825939259402594125942259432594425945259462594725948259492595025951259522595325954259552595625957259582595925960259612596225963259642596525966259672596825969259702597125972259732597425975259762597725978259792598025981259822598325984259852598625987259882598925990259912599225993259942599525996259972599825999260002600126002260032600426005260062600726008260092601026011260122601326014260152601626017260182601926020260212602226023260242602526026260272602826029260302603126032260332603426035260362603726038260392604026041260422604326044260452604626047260482604926050260512605226053260542605526056260572605826059260602606126062260632606426065260662606726068260692607026071260722607326074260752607626077260782607926080260812608226083260842608526086260872608826089260902609126092260932609426095260962609726098260992610026101261022610326104261052610626107261082610926110261112611226113261142611526116261172611826119261202612126122261232612426125261262612726128261292613026131261322613326134261352613626137261382613926140261412614226143261442614526146261472614826149261502615126152261532615426155261562615726158261592616026161261622616326164261652616626167261682616926170261712617226173261742617526176261772617826179261802618126182261832618426185261862618726188261892619026191261922619326194261952619626197261982619926200262012620226203262042620526206262072620826209262102621126212262132621426215262162621726218262192622026221262222622326224262252622626227262282622926230262312623226233262342623526236262372623826239262402624126242262432624426245262462624726248262492625026251262522625326254262552625626257262582625926260262612626226263262642626526266262672626826269262702627126272262732627426275262762627726278262792628026281262822628326284262852628626287262882628926290262912629226293262942629526296262972629826299263002630126302263032630426305263062630726308263092631026311263122631326314263152631626317263182631926320263212632226323263242632526326263272632826329263302633126332263332633426335263362633726338263392634026341263422634326344263452634626347263482634926350263512635226353263542635526356263572635826359263602636126362263632636426365263662636726368263692637026371263722637326374263752637626377263782637926380263812638226383263842638526386263872638826389263902639126392263932639426395263962639726398263992640026401264022640326404264052640626407264082640926410264112641226413264142641526416264172641826419264202642126422264232642426425264262642726428264292643026431264322643326434264352643626437264382643926440264412644226443264442644526446264472644826449264502645126452264532645426455264562645726458264592646026461264622646326464264652646626467264682646926470264712647226473264742647526476264772647826479264802648126482264832648426485264862648726488264892649026491264922649326494264952649626497264982649926500265012650226503265042650526506265072650826509265102651126512265132651426515265162651726518265192652026521265222652326524265252652626527265282652926530265312653226533265342653526536265372653826539265402654126542265432654426545265462654726548265492655026551265522655326554265552655626557265582655926560265612656226563265642656526566265672656826569265702657126572265732657426575265762657726578265792658026581265822658326584265852658626587265882658926590265912659226593265942659526596265972659826599266002660126602266032660426605266062660726608266092661026611266122661326614266152661626617266182661926620266212662226623266242662526626266272662826629266302663126632266332663426635266362663726638266392664026641266422664326644266452664626647266482664926650266512665226653266542665526656266572665826659266602666126662266632666426665266662666726668266692667026671266722667326674266752667626677266782667926680266812668226683266842668526686266872668826689266902669126692266932669426695266962669726698266992670026701267022670326704267052670626707267082670926710267112671226713267142671526716267172671826719267202672126722267232672426725267262672726728267292673026731267322673326734267352673626737267382673926740267412674226743267442674526746267472674826749267502675126752267532675426755267562675726758267592676026761267622676326764267652676626767267682676926770267712677226773267742677526776267772677826779267802678126782267832678426785267862678726788267892679026791267922679326794267952679626797267982679926800268012680226803268042680526806268072680826809268102681126812268132681426815268162681726818268192682026821268222682326824268252682626827268282682926830268312683226833268342683526836268372683826839268402684126842268432684426845268462684726848268492685026851268522685326854268552685626857268582685926860268612686226863268642686526866268672686826869268702687126872268732687426875268762687726878268792688026881268822688326884268852688626887268882688926890268912689226893268942689526896268972689826899269002690126902269032690426905269062690726908269092691026911269122691326914269152691626917269182691926920269212692226923269242692526926269272692826929269302693126932269332693426935269362693726938269392694026941269422694326944269452694626947269482694926950269512695226953269542695526956269572695826959269602696126962269632696426965269662696726968269692697026971269722697326974269752697626977269782697926980269812698226983269842698526986269872698826989269902699126992269932699426995269962699726998269992700027001270022700327004270052700627007270082700927010270112701227013270142701527016270172701827019270202702127022270232702427025270262702727028270292703027031270322703327034270352703627037270382703927040270412704227043270442704527046270472704827049270502705127052270532705427055270562705727058270592706027061270622706327064270652706627067270682706927070270712707227073270742707527076270772707827079270802708127082270832708427085270862708727088270892709027091270922709327094270952709627097270982709927100271012710227103271042710527106271072710827109271102711127112271132711427115271162711727118271192712027121271222712327124271252712627127271282712927130271312713227133271342713527136271372713827139271402714127142271432714427145271462714727148271492715027151271522715327154271552715627157271582715927160271612716227163271642716527166271672716827169271702717127172271732717427175271762717727178271792718027181271822718327184271852718627187271882718927190271912719227193271942719527196271972719827199272002720127202272032720427205272062720727208272092721027211272122721327214272152721627217272182721927220272212722227223272242722527226272272722827229272302723127232272332723427235272362723727238272392724027241272422724327244272452724627247272482724927250272512725227253272542725527256272572725827259272602726127262272632726427265272662726727268272692727027271272722727327274272752727627277272782727927280272812728227283272842728527286272872728827289272902729127292272932729427295272962729727298272992730027301273022730327304273052730627307273082730927310273112731227313273142731527316273172731827319273202732127322273232732427325273262732727328273292733027331273322733327334273352733627337273382733927340273412734227343273442734527346273472734827349273502735127352273532735427355273562735727358273592736027361273622736327364273652736627367273682736927370273712737227373273742737527376273772737827379273802738127382273832738427385273862738727388273892739027391273922739327394273952739627397273982739927400274012740227403274042740527406274072740827409274102741127412274132741427415274162741727418274192742027421274222742327424274252742627427274282742927430274312743227433274342743527436274372743827439274402744127442274432744427445274462744727448274492745027451274522745327454274552745627457274582745927460274612746227463274642746527466274672746827469274702747127472274732747427475274762747727478274792748027481274822748327484274852748627487274882748927490274912749227493274942749527496274972749827499275002750127502275032750427505275062750727508275092751027511275122751327514275152751627517275182751927520275212752227523275242752527526275272752827529275302753127532275332753427535275362753727538275392754027541275422754327544275452754627547275482754927550275512755227553275542755527556275572755827559275602756127562275632756427565275662756727568275692757027571275722757327574275752757627577275782757927580275812758227583275842758527586275872758827589275902759127592275932759427595275962759727598275992760027601276022760327604276052760627607276082760927610276112761227613276142761527616276172761827619276202762127622276232762427625276262762727628276292763027631276322763327634276352763627637276382763927640276412764227643276442764527646276472764827649276502765127652276532765427655276562765727658276592766027661276622766327664276652766627667276682766927670276712767227673276742767527676276772767827679276802768127682276832768427685276862768727688276892769027691276922769327694276952769627697276982769927700277012770227703277042770527706277072770827709277102771127712277132771427715277162771727718277192772027721277222772327724277252772627727277282772927730277312773227733277342773527736277372773827739277402774127742277432774427745277462774727748277492775027751277522775327754277552775627757277582775927760277612776227763277642776527766277672776827769277702777127772277732777427775277762777727778277792778027781277822778327784277852778627787277882778927790277912779227793277942779527796277972779827799278002780127802278032780427805278062780727808278092781027811278122781327814278152781627817278182781927820278212782227823278242782527826278272782827829278302783127832278332783427835278362783727838278392784027841278422784327844278452784627847278482784927850278512785227853278542785527856278572785827859278602786127862278632786427865278662786727868278692787027871278722787327874278752787627877278782787927880278812788227883278842788527886278872788827889278902789127892278932789427895278962789727898278992790027901279022790327904279052790627907279082790927910279112791227913279142791527916279172791827919279202792127922279232792427925279262792727928279292793027931279322793327934279352793627937279382793927940279412794227943279442794527946279472794827949279502795127952279532795427955279562795727958279592796027961279622796327964279652796627967279682796927970279712797227973279742797527976279772797827979279802798127982279832798427985279862798727988279892799027991279922799327994279952799627997279982799928000280012800228003280042800528006280072800828009280102801128012280132801428015280162801728018280192802028021280222802328024280252802628027280282802928030280312803228033280342803528036280372803828039280402804128042280432804428045280462804728048280492805028051280522805328054280552805628057280582805928060280612806228063280642806528066280672806828069280702807128072280732807428075280762807728078280792808028081280822808328084280852808628087280882808928090280912809228093280942809528096280972809828099281002810128102281032810428105281062810728108281092811028111281122811328114281152811628117281182811928120281212812228123281242812528126281272812828129281302813128132281332813428135281362813728138281392814028141281422814328144281452814628147281482814928150281512815228153281542815528156281572815828159281602816128162281632816428165281662816728168281692817028171281722817328174281752817628177281782817928180281812818228183281842818528186281872818828189281902819128192281932819428195281962819728198281992820028201282022820328204282052820628207282082820928210282112821228213282142821528216282172821828219282202822128222282232822428225282262822728228282292823028231282322823328234282352823628237282382823928240282412824228243282442824528246282472824828249282502825128252282532825428255282562825728258282592826028261282622826328264282652826628267282682826928270282712827228273282742827528276282772827828279282802828128282282832828428285282862828728288282892829028291282922829328294282952829628297282982829928300283012830228303283042830528306283072830828309283102831128312283132831428315283162831728318283192832028321283222832328324283252832628327283282832928330283312833228333283342833528336283372833828339283402834128342283432834428345283462834728348283492835028351283522835328354283552835628357283582835928360283612836228363283642836528366283672836828369283702837128372283732837428375283762837728378283792838028381283822838328384283852838628387283882838928390283912839228393283942839528396283972839828399284002840128402284032840428405284062840728408284092841028411284122841328414284152841628417284182841928420284212842228423284242842528426284272842828429284302843128432284332843428435284362843728438284392844028441284422844328444284452844628447284482844928450284512845228453284542845528456284572845828459284602846128462284632846428465284662846728468284692847028471284722847328474284752847628477284782847928480284812848228483284842848528486284872848828489284902849128492284932849428495284962849728498284992850028501285022850328504285052850628507285082850928510285112851228513285142851528516285172851828519285202852128522285232852428525285262852728528285292853028531285322853328534285352853628537285382853928540285412854228543285442854528546285472854828549285502855128552285532855428555285562855728558285592856028561285622856328564285652856628567285682856928570285712857228573285742857528576285772857828579285802858128582285832858428585285862858728588285892859028591285922859328594285952859628597285982859928600286012860228603286042860528606286072860828609286102861128612286132861428615286162861728618286192862028621286222862328624286252862628627286282862928630286312863228633286342863528636286372863828639286402864128642286432864428645286462864728648286492865028651286522865328654286552865628657286582865928660286612866228663286642866528666286672866828669286702867128672286732867428675286762867728678286792868028681286822868328684286852868628687286882868928690286912869228693286942869528696286972869828699287002870128702287032870428705287062870728708287092871028711287122871328714287152871628717287182871928720287212872228723287242872528726287272872828729287302873128732287332873428735287362873728738287392874028741287422874328744287452874628747287482874928750287512875228753287542875528756287572875828759287602876128762287632876428765287662876728768287692877028771287722877328774287752877628777287782877928780287812878228783287842878528786287872878828789287902879128792287932879428795287962879728798287992880028801288022880328804288052880628807288082880928810288112881228813288142881528816288172881828819288202882128822288232882428825288262882728828288292883028831288322883328834288352883628837288382883928840288412884228843288442884528846288472884828849288502885128852288532885428855288562885728858288592886028861288622886328864288652886628867288682886928870288712887228873288742887528876288772887828879288802888128882288832888428885288862888728888288892889028891288922889328894288952889628897288982889928900289012890228903289042890528906289072890828909289102891128912289132891428915289162891728918289192892028921289222892328924289252892628927289282892928930289312893228933289342893528936289372893828939289402894128942289432894428945289462894728948289492895028951289522895328954289552895628957289582895928960289612896228963289642896528966289672896828969289702897128972289732897428975289762897728978289792898028981289822898328984289852898628987289882898928990289912899228993289942899528996289972899828999290002900129002290032900429005290062900729008290092901029011290122901329014290152901629017290182901929020290212902229023290242902529026290272902829029290302903129032290332903429035290362903729038290392904029041290422904329044290452904629047290482904929050290512905229053290542905529056290572905829059290602906129062290632906429065290662906729068290692907029071290722907329074290752907629077290782907929080290812908229083290842908529086290872908829089290902909129092290932909429095290962909729098290992910029101291022910329104291052910629107291082910929110291112911229113291142911529116291172911829119291202912129122291232912429125291262912729128291292913029131291322913329134291352913629137291382913929140291412914229143291442914529146291472914829149291502915129152291532915429155291562915729158291592916029161291622916329164291652916629167291682916929170291712917229173291742917529176291772917829179291802918129182291832918429185291862918729188291892919029191291922919329194291952919629197291982919929200292012920229203292042920529206292072920829209292102921129212292132921429215292162921729218292192922029221292222922329224292252922629227292282922929230292312923229233292342923529236292372923829239292402924129242292432924429245292462924729248292492925029251292522925329254292552925629257292582925929260292612926229263292642926529266292672926829269292702927129272292732927429275292762927729278292792928029281292822928329284292852928629287292882928929290292912929229293292942929529296292972929829299293002930129302293032930429305293062930729308293092931029311293122931329314293152931629317293182931929320293212932229323293242932529326293272932829329293302933129332293332933429335293362933729338293392934029341293422934329344293452934629347293482934929350293512935229353293542935529356293572935829359293602936129362293632936429365293662936729368293692937029371293722937329374293752937629377293782937929380293812938229383293842938529386293872938829389293902939129392293932939429395293962939729398293992940029401294022940329404294052940629407294082940929410294112941229413294142941529416294172941829419294202942129422294232942429425294262942729428294292943029431294322943329434294352943629437294382943929440294412944229443294442944529446294472944829449294502945129452294532945429455294562945729458294592946029461294622946329464294652946629467294682946929470294712947229473294742947529476294772947829479294802948129482294832948429485294862948729488294892949029491294922949329494294952949629497294982949929500295012950229503295042950529506295072950829509295102951129512295132951429515295162951729518295192952029521295222952329524295252952629527295282952929530295312953229533295342953529536295372953829539295402954129542295432954429545295462954729548295492955029551295522955329554295552955629557295582955929560295612956229563295642956529566295672956829569295702957129572295732957429575295762957729578295792958029581295822958329584295852958629587295882958929590295912959229593295942959529596295972959829599296002960129602296032960429605296062960729608296092961029611296122961329614296152961629617296182961929620296212962229623296242962529626296272962829629296302963129632296332963429635296362963729638296392964029641296422964329644296452964629647296482964929650296512965229653296542965529656296572965829659296602966129662296632966429665296662966729668296692967029671296722967329674296752967629677296782967929680296812968229683296842968529686296872968829689296902969129692296932969429695296962969729698296992970029701297022970329704297052970629707297082970929710297112971229713297142971529716297172971829719297202972129722297232972429725297262972729728297292973029731297322973329734297352973629737297382973929740297412974229743297442974529746297472974829749297502975129752297532975429755297562975729758297592976029761297622976329764297652976629767297682976929770297712977229773297742977529776297772977829779297802978129782297832978429785297862978729788297892979029791297922979329794297952979629797297982979929800298012980229803298042980529806298072980829809298102981129812298132981429815298162981729818298192982029821298222982329824298252982629827298282982929830298312983229833298342983529836298372983829839298402984129842298432984429845298462984729848298492985029851298522985329854298552985629857298582985929860298612986229863298642986529866298672986829869298702987129872298732987429875298762987729878298792988029881298822988329884298852988629887298882988929890298912989229893298942989529896298972989829899299002990129902299032990429905299062990729908299092991029911299122991329914299152991629917299182991929920299212992229923299242992529926299272992829929299302993129932299332993429935299362993729938299392994029941299422994329944299452994629947299482994929950299512995229953299542995529956299572995829959299602996129962299632996429965299662996729968299692997029971299722997329974299752997629977299782997929980299812998229983299842998529986299872998829989299902999129992299932999429995299962999729998299993000030001300023000330004300053000630007300083000930010300113001230013300143001530016300173001830019300203002130022300233002430025300263002730028300293003030031300323003330034300353003630037300383003930040300413004230043300443004530046300473004830049300503005130052300533005430055300563005730058300593006030061300623006330064300653006630067300683006930070300713007230073300743007530076300773007830079300803008130082300833008430085300863008730088300893009030091300923009330094300953009630097300983009930100301013010230103301043010530106301073010830109301103011130112301133011430115301163011730118301193012030121301223012330124301253012630127301283012930130301313013230133301343013530136301373013830139301403014130142301433014430145301463014730148301493015030151301523015330154301553015630157301583015930160301613016230163301643016530166301673016830169301703017130172301733017430175301763017730178301793018030181301823018330184301853018630187301883018930190301913019230193301943019530196301973019830199302003020130202302033020430205302063020730208302093021030211302123021330214302153021630217302183021930220302213022230223302243022530226302273022830229302303023130232302333023430235302363023730238302393024030241302423024330244302453024630247302483024930250302513025230253302543025530256302573025830259302603026130262302633026430265302663026730268302693027030271302723027330274302753027630277302783027930280302813028230283302843028530286302873028830289302903029130292302933029430295302963029730298302993030030301303023030330304303053030630307303083030930310303113031230313303143031530316303173031830319303203032130322303233032430325303263032730328303293033030331303323033330334303353033630337303383033930340303413034230343303443034530346303473034830349303503035130352303533035430355303563035730358303593036030361303623036330364303653036630367303683036930370303713037230373303743037530376303773037830379303803038130382303833038430385303863038730388303893039030391303923039330394303953039630397303983039930400304013040230403304043040530406304073040830409304103041130412304133041430415304163041730418304193042030421304223042330424304253042630427304283042930430304313043230433304343043530436304373043830439304403044130442304433044430445304463044730448304493045030451304523045330454304553045630457304583045930460304613046230463304643046530466304673046830469304703047130472304733047430475304763047730478304793048030481304823048330484304853048630487304883048930490304913049230493304943049530496304973049830499305003050130502305033050430505305063050730508305093051030511305123051330514305153051630517305183051930520305213052230523305243052530526305273052830529305303053130532305333053430535305363053730538305393054030541305423054330544305453054630547305483054930550305513055230553305543055530556305573055830559305603056130562305633056430565305663056730568305693057030571305723057330574305753057630577305783057930580305813058230583305843058530586305873058830589305903059130592305933059430595305963059730598305993060030601306023060330604306053060630607306083060930610306113061230613306143061530616306173061830619306203062130622306233062430625306263062730628306293063030631306323063330634306353063630637306383063930640306413064230643306443064530646306473064830649306503065130652306533065430655306563065730658306593066030661306623066330664306653066630667306683066930670306713067230673306743067530676306773067830679306803068130682306833068430685306863068730688306893069030691306923069330694306953069630697306983069930700307013070230703307043070530706307073070830709307103071130712307133071430715307163071730718307193072030721307223072330724307253072630727307283072930730307313073230733307343073530736307373073830739307403074130742307433074430745307463074730748307493075030751307523075330754307553075630757307583075930760307613076230763307643076530766307673076830769307703077130772307733077430775307763077730778307793078030781307823078330784307853078630787307883078930790307913079230793307943079530796307973079830799308003080130802308033080430805308063080730808308093081030811308123081330814308153081630817308183081930820308213082230823308243082530826308273082830829308303083130832308333083430835308363083730838308393084030841308423084330844308453084630847308483084930850308513085230853308543085530856308573085830859308603086130862308633086430865308663086730868308693087030871308723087330874308753087630877308783087930880308813088230883308843088530886308873088830889308903089130892308933089430895308963089730898308993090030901309023090330904309053090630907309083090930910309113091230913309143091530916309173091830919309203092130922309233092430925309263092730928309293093030931309323093330934309353093630937309383093930940309413094230943309443094530946309473094830949309503095130952309533095430955309563095730958309593096030961309623096330964309653096630967309683096930970309713097230973309743097530976309773097830979309803098130982309833098430985309863098730988309893099030991309923099330994309953099630997309983099931000310013100231003310043100531006310073100831009310103101131012310133101431015310163101731018310193102031021310223102331024310253102631027310283102931030310313103231033310343103531036310373103831039310403104131042310433104431045310463104731048310493105031051310523105331054310553105631057310583105931060310613106231063310643106531066310673106831069310703107131072310733107431075310763107731078310793108031081310823108331084310853108631087310883108931090310913109231093310943109531096310973109831099311003110131102311033110431105311063110731108311093111031111311123111331114311153111631117311183111931120311213112231123311243112531126311273112831129311303113131132311333113431135311363113731138311393114031141311423114331144311453114631147311483114931150311513115231153311543115531156311573115831159311603116131162311633116431165311663116731168311693117031171311723117331174311753117631177311783117931180311813118231183311843118531186311873118831189311903119131192311933119431195311963119731198311993120031201312023120331204312053120631207312083120931210312113121231213312143121531216312173121831219312203122131222312233122431225312263122731228312293123031231312323123331234312353123631237312383123931240312413124231243312443124531246312473124831249312503125131252312533125431255312563125731258312593126031261312623126331264312653126631267312683126931270312713127231273312743127531276312773127831279312803128131282312833128431285312863128731288312893129031291312923129331294312953129631297312983129931300313013130231303313043130531306313073130831309313103131131312313133131431315313163131731318313193132031321313223132331324313253132631327313283132931330313313133231333313343133531336313373133831339313403134131342313433134431345313463134731348313493135031351313523135331354313553135631357313583135931360313613136231363313643136531366313673136831369313703137131372313733137431375313763137731378313793138031381313823138331384313853138631387313883138931390313913139231393313943139531396313973139831399314003140131402314033140431405314063140731408314093141031411314123141331414314153141631417314183141931420314213142231423314243142531426314273142831429314303143131432314333143431435314363143731438314393144031441314423144331444314453144631447314483144931450314513145231453314543145531456314573145831459314603146131462314633146431465314663146731468314693147031471314723147331474314753147631477314783147931480314813148231483314843148531486314873148831489314903149131492314933149431495314963149731498314993150031501315023150331504315053150631507315083150931510315113151231513315143151531516315173151831519315203152131522315233152431525315263152731528315293153031531315323153331534315353153631537315383153931540315413154231543315443154531546315473154831549315503155131552315533155431555315563155731558315593156031561315623156331564315653156631567315683156931570315713157231573315743157531576315773157831579315803158131582315833158431585315863158731588315893159031591315923159331594315953159631597315983159931600316013160231603316043160531606316073160831609316103161131612316133161431615316163161731618316193162031621316223162331624316253162631627316283162931630316313163231633316343163531636316373163831639316403164131642316433164431645316463164731648316493165031651316523165331654316553165631657316583165931660316613166231663316643166531666316673166831669316703167131672316733167431675316763167731678316793168031681316823168331684316853168631687316883168931690316913169231693316943169531696316973169831699317003170131702317033170431705317063170731708317093171031711317123171331714317153171631717317183171931720317213172231723317243172531726317273172831729317303173131732317333173431735317363173731738317393174031741317423174331744317453174631747317483174931750317513175231753317543175531756317573175831759317603176131762317633176431765317663176731768317693177031771317723177331774317753177631777317783177931780317813178231783317843178531786317873178831789317903179131792317933179431795317963179731798317993180031801318023180331804318053180631807318083180931810318113181231813318143181531816318173181831819318203182131822318233182431825318263182731828318293183031831318323183331834318353183631837318383183931840318413184231843318443184531846318473184831849318503185131852318533185431855318563185731858318593186031861318623186331864318653186631867318683186931870318713187231873318743187531876318773187831879318803188131882318833188431885318863188731888318893189031891318923189331894318953189631897318983189931900319013190231903319043190531906319073190831909319103191131912319133191431915319163191731918319193192031921319223192331924319253192631927319283192931930319313193231933319343193531936319373193831939319403194131942319433194431945319463194731948319493195031951319523195331954319553195631957319583195931960319613196231963319643196531966319673196831969319703197131972319733197431975319763197731978319793198031981319823198331984319853198631987319883198931990319913199231993319943199531996319973199831999320003200132002320033200432005320063200732008320093201032011320123201332014320153201632017320183201932020320213202232023320243202532026320273202832029320303203132032320333203432035320363203732038320393204032041320423204332044320453204632047320483204932050320513205232053320543205532056320573205832059320603206132062320633206432065320663206732068320693207032071320723207332074320753207632077320783207932080320813208232083320843208532086320873208832089320903209132092320933209432095320963209732098320993210032101321023210332104321053210632107321083210932110321113211232113321143211532116321173211832119321203212132122321233212432125321263212732128321293213032131321323213332134321353213632137321383213932140321413214232143321443214532146321473214832149321503215132152321533215432155321563215732158321593216032161321623216332164321653216632167321683216932170321713217232173321743217532176321773217832179321803218132182321833218432185321863218732188321893219032191321923219332194321953219632197321983219932200322013220232203322043220532206322073220832209322103221132212322133221432215322163221732218322193222032221322223222332224322253222632227322283222932230322313223232233322343223532236322373223832239322403224132242322433224432245322463224732248322493225032251322523225332254322553225632257322583225932260322613226232263322643226532266322673226832269322703227132272322733227432275322763227732278322793228032281322823228332284322853228632287322883228932290322913229232293322943229532296322973229832299323003230132302323033230432305323063230732308323093231032311323123231332314323153231632317323183231932320323213232232323323243232532326323273232832329323303233132332323333233432335323363233732338323393234032341323423234332344323453234632347323483234932350323513235232353323543235532356323573235832359323603236132362323633236432365323663236732368323693237032371323723237332374323753237632377323783237932380323813238232383323843238532386323873238832389323903239132392323933239432395323963239732398323993240032401324023240332404324053240632407324083240932410324113241232413324143241532416324173241832419324203242132422324233242432425324263242732428324293243032431324323243332434324353243632437324383243932440324413244232443324443244532446324473244832449324503245132452324533245432455324563245732458324593246032461324623246332464324653246632467324683246932470324713247232473324743247532476324773247832479324803248132482324833248432485324863248732488324893249032491324923249332494324953249632497324983249932500325013250232503325043250532506325073250832509325103251132512325133251432515325163251732518325193252032521325223252332524325253252632527325283252932530325313253232533325343253532536325373253832539325403254132542325433254432545325463254732548325493255032551325523255332554325553255632557325583255932560325613256232563325643256532566325673256832569325703257132572325733257432575325763257732578325793258032581325823258332584325853258632587325883258932590325913259232593325943259532596325973259832599326003260132602326033260432605326063260732608326093261032611326123261332614326153261632617326183261932620326213262232623326243262532626326273262832629326303263132632326333263432635326363263732638326393264032641326423264332644326453264632647326483264932650326513265232653326543265532656326573265832659326603266132662326633266432665326663266732668326693267032671326723267332674326753267632677326783267932680326813268232683326843268532686326873268832689326903269132692326933269432695326963269732698326993270032701327023270332704327053270632707327083270932710327113271232713327143271532716327173271832719327203272132722327233272432725327263272732728327293273032731327323273332734327353273632737327383273932740327413274232743327443274532746327473274832749327503275132752327533275432755327563275732758327593276032761327623276332764327653276632767327683276932770327713277232773327743277532776327773277832779327803278132782327833278432785327863278732788327893279032791327923279332794327953279632797327983279932800328013280232803328043280532806328073280832809328103281132812328133281432815328163281732818328193282032821328223282332824328253282632827328283282932830328313283232833328343283532836328373283832839328403284132842328433284432845328463284732848328493285032851328523285332854328553285632857328583285932860328613286232863328643286532866328673286832869328703287132872328733287432875328763287732878328793288032881328823288332884328853288632887328883288932890328913289232893328943289532896328973289832899329003290132902329033290432905329063290732908329093291032911329123291332914329153291632917329183291932920329213292232923329243292532926329273292832929329303293132932329333293432935329363293732938329393294032941329423294332944329453294632947329483294932950329513295232953329543295532956329573295832959329603296132962329633296432965329663296732968329693297032971329723297332974329753297632977329783297932980329813298232983329843298532986329873298832989329903299132992329933299432995329963299732998329993300033001330023300333004330053300633007330083300933010330113301233013330143301533016330173301833019330203302133022330233302433025330263302733028330293303033031330323303333034330353303633037330383303933040330413304233043330443304533046330473304833049330503305133052330533305433055330563305733058330593306033061330623306333064330653306633067330683306933070330713307233073330743307533076330773307833079330803308133082330833308433085330863308733088330893309033091330923309333094330953309633097330983309933100331013310233103331043310533106331073310833109331103311133112331133311433115331163311733118331193312033121331223312333124331253312633127331283312933130331313313233133331343313533136331373313833139331403314133142331433314433145331463314733148331493315033151331523315333154331553315633157331583315933160331613316233163331643316533166331673316833169331703317133172331733317433175331763317733178331793318033181331823318333184331853318633187331883318933190331913319233193331943319533196331973319833199332003320133202332033320433205332063320733208332093321033211332123321333214332153321633217332183321933220332213322233223332243322533226332273322833229332303323133232332333323433235332363323733238332393324033241332423324333244332453324633247332483324933250332513325233253332543325533256332573325833259332603326133262332633326433265332663326733268332693327033271332723327333274332753327633277332783327933280332813328233283332843328533286332873328833289332903329133292332933329433295332963329733298332993330033301333023330333304333053330633307333083330933310333113331233313333143331533316333173331833319333203332133322333233332433325333263332733328333293333033331333323333333334333353333633337333383333933340333413334233343333443334533346333473334833349333503335133352333533335433355333563335733358333593336033361333623336333364333653336633367333683336933370333713337233373333743337533376333773337833379333803338133382333833338433385333863338733388333893339033391333923339333394333953339633397333983339933400334013340233403334043340533406334073340833409334103341133412334133341433415334163341733418334193342033421334223342333424334253342633427334283342933430334313343233433334343343533436334373343833439334403344133442334433344433445334463344733448334493345033451334523345333454334553345633457334583345933460334613346233463334643346533466334673346833469334703347133472334733347433475334763347733478334793348033481334823348333484334853348633487334883348933490334913349233493334943349533496334973349833499335003350133502335033350433505335063350733508335093351033511335123351333514335153351633517335183351933520335213352233523335243352533526335273352833529335303353133532335333353433535335363353733538335393354033541335423354333544335453354633547335483354933550335513355233553335543355533556335573355833559335603356133562335633356433565335663356733568335693357033571335723357333574335753357633577335783357933580335813358233583335843358533586335873358833589335903359133592335933359433595335963359733598335993360033601336023360333604336053360633607336083360933610336113361233613336143361533616336173361833619336203362133622336233362433625336263362733628336293363033631336323363333634336353363633637336383363933640336413364233643336443364533646336473364833649336503365133652336533365433655336563365733658336593366033661336623366333664336653366633667336683366933670336713367233673336743367533676336773367833679336803368133682336833368433685336863368733688336893369033691336923369333694336953369633697336983369933700337013370233703337043370533706337073370833709337103371133712337133371433715337163371733718337193372033721337223372333724337253372633727337283372933730337313373233733337343373533736337373373833739337403374133742337433374433745337463374733748337493375033751337523375333754337553375633757337583375933760337613376233763337643376533766337673376833769337703377133772337733377433775337763377733778337793378033781337823378333784337853378633787337883378933790337913379233793337943379533796337973379833799338003380133802338033380433805338063380733808338093381033811338123381333814338153381633817338183381933820338213382233823338243382533826338273382833829338303383133832338333383433835338363383733838338393384033841338423384333844338453384633847338483384933850338513385233853338543385533856338573385833859338603386133862338633386433865338663386733868338693387033871338723387333874338753387633877338783387933880338813388233883338843388533886338873388833889338903389133892338933389433895338963389733898338993390033901339023390333904339053390633907339083390933910339113391233913339143391533916339173391833919339203392133922339233392433925339263392733928339293393033931339323393333934339353393633937339383393933940339413394233943339443394533946339473394833949339503395133952339533395433955339563395733958339593396033961339623396333964339653396633967339683396933970339713397233973339743397533976339773397833979339803398133982339833398433985339863398733988339893399033991339923399333994339953399633997339983399934000340013400234003340043400534006340073400834009340103401134012340133401434015340163401734018340193402034021340223402334024340253402634027340283402934030340313403234033340343403534036340373403834039340403404134042340433404434045340463404734048340493405034051340523405334054340553405634057340583405934060340613406234063340643406534066340673406834069340703407134072340733407434075340763407734078340793408034081340823408334084340853408634087340883408934090340913409234093340943409534096340973409834099341003410134102341033410434105341063410734108341093411034111341123411334114341153411634117341183411934120341213412234123341243412534126341273412834129341303413134132341333413434135341363413734138341393414034141341423414334144341453414634147341483414934150341513415234153341543415534156341573415834159341603416134162341633416434165341663416734168341693417034171341723417334174341753417634177341783417934180341813418234183341843418534186341873418834189341903419134192341933419434195341963419734198341993420034201342023420334204342053420634207342083420934210342113421234213342143421534216342173421834219342203422134222342233422434225342263422734228342293423034231342323423334234342353423634237342383423934240342413424234243342443424534246342473424834249342503425134252342533425434255342563425734258342593426034261342623426334264342653426634267342683426934270342713427234273342743427534276342773427834279342803428134282342833428434285342863428734288342893429034291342923429334294342953429634297342983429934300343013430234303343043430534306343073430834309343103431134312343133431434315343163431734318343193432034321343223432334324343253432634327343283432934330343313433234333343343433534336343373433834339343403434134342343433434434345343463434734348343493435034351343523435334354343553435634357343583435934360343613436234363343643436534366343673436834369343703437134372343733437434375343763437734378343793438034381343823438334384343853438634387343883438934390343913439234393343943439534396343973439834399344003440134402344033440434405344063440734408344093441034411344123441334414344153441634417344183441934420344213442234423344243442534426344273442834429344303443134432344333443434435344363443734438344393444034441344423444334444344453444634447344483444934450344513445234453344543445534456344573445834459344603446134462344633446434465344663446734468344693447034471344723447334474344753447634477344783447934480344813448234483344843448534486344873448834489344903449134492344933449434495344963449734498344993450034501345023450334504345053450634507345083450934510345113451234513345143451534516345173451834519345203452134522345233452434525345263452734528345293453034531345323453334534345353453634537345383453934540345413454234543345443454534546345473454834549345503455134552345533455434555345563455734558345593456034561345623456334564345653456634567345683456934570345713457234573345743457534576345773457834579345803458134582345833458434585345863458734588345893459034591345923459334594345953459634597345983459934600346013460234603346043460534606346073460834609346103461134612346133461434615346163461734618346193462034621346223462334624346253462634627346283462934630346313463234633346343463534636346373463834639346403464134642346433464434645346463464734648346493465034651346523465334654346553465634657346583465934660346613466234663346643466534666346673466834669346703467134672346733467434675346763467734678346793468034681346823468334684346853468634687346883468934690346913469234693346943469534696346973469834699347003470134702347033470434705347063470734708347093471034711347123471334714347153471634717347183471934720347213472234723347243472534726347273472834729347303473134732347333473434735347363473734738347393474034741347423474334744347453474634747347483474934750347513475234753347543475534756347573475834759347603476134762347633476434765347663476734768347693477034771347723477334774347753477634777347783477934780347813478234783347843478534786347873478834789347903479134792347933479434795347963479734798347993480034801348023480334804348053480634807348083480934810348113481234813348143481534816348173481834819348203482134822348233482434825348263482734828348293483034831348323483334834348353483634837348383483934840348413484234843348443484534846348473484834849348503485134852348533485434855348563485734858348593486034861348623486334864348653486634867348683486934870348713487234873348743487534876348773487834879348803488134882348833488434885348863488734888348893489034891348923489334894348953489634897348983489934900349013490234903349043490534906349073490834909349103491134912349133491434915349163491734918349193492034921349223492334924349253492634927349283492934930349313493234933349343493534936349373493834939349403494134942349433494434945349463494734948349493495034951349523495334954349553495634957349583495934960349613496234963349643496534966349673496834969349703497134972349733497434975349763497734978349793498034981349823498334984349853498634987349883498934990349913499234993349943499534996349973499834999350003500135002350033500435005350063500735008350093501035011350123501335014350153501635017350183501935020350213502235023350243502535026350273502835029350303503135032350333503435035350363503735038350393504035041350423504335044350453504635047350483504935050350513505235053350543505535056350573505835059350603506135062350633506435065350663506735068350693507035071350723507335074350753507635077350783507935080350813508235083350843508535086350873508835089350903509135092350933509435095350963509735098350993510035101351023510335104351053510635107351083510935110351113511235113351143511535116351173511835119351203512135122351233512435125351263512735128351293513035131351323513335134351353513635137351383513935140351413514235143351443514535146351473514835149351503515135152351533515435155351563515735158351593516035161351623516335164351653516635167351683516935170351713517235173351743517535176351773517835179351803518135182351833518435185351863518735188351893519035191351923519335194351953519635197351983519935200352013520235203352043520535206352073520835209352103521135212352133521435215352163521735218352193522035221352223522335224352253522635227352283522935230352313523235233352343523535236352373523835239352403524135242352433524435245352463524735248352493525035251352523525335254352553525635257352583525935260352613526235263352643526535266352673526835269352703527135272352733527435275352763527735278352793528035281352823528335284352853528635287352883528935290352913529235293352943529535296352973529835299353003530135302353033530435305353063530735308353093531035311353123531335314353153531635317353183531935320353213532235323353243532535326353273532835329353303533135332353333533435335353363533735338353393534035341353423534335344353453534635347353483534935350353513535235353353543535535356353573535835359353603536135362353633536435365353663536735368353693537035371353723537335374353753537635377353783537935380353813538235383353843538535386353873538835389353903539135392353933539435395353963539735398353993540035401354023540335404354053540635407354083540935410354113541235413354143541535416354173541835419354203542135422354233542435425354263542735428354293543035431354323543335434354353543635437354383543935440354413544235443354443544535446354473544835449354503545135452354533545435455354563545735458354593546035461354623546335464354653546635467354683546935470354713547235473354743547535476354773547835479354803548135482354833548435485354863548735488354893549035491354923549335494354953549635497354983549935500355013550235503355043550535506355073550835509355103551135512355133551435515355163551735518355193552035521355223552335524355253552635527355283552935530355313553235533355343553535536355373553835539355403554135542355433554435545355463554735548355493555035551355523555335554355553555635557355583555935560355613556235563355643556535566355673556835569355703557135572355733557435575355763557735578355793558035581355823558335584355853558635587355883558935590355913559235593355943559535596355973559835599356003560135602356033560435605356063560735608356093561035611356123561335614356153561635617356183561935620356213562235623356243562535626356273562835629356303563135632356333563435635356363563735638356393564035641356423564335644356453564635647356483564935650356513565235653356543565535656356573565835659356603566135662356633566435665356663566735668356693567035671356723567335674356753567635677356783567935680356813568235683356843568535686356873568835689356903569135692356933569435695356963569735698356993570035701357023570335704357053570635707357083570935710357113571235713357143571535716357173571835719357203572135722357233572435725357263572735728357293573035731357323573335734357353573635737357383573935740357413574235743357443574535746357473574835749357503575135752357533575435755357563575735758357593576035761357623576335764357653576635767357683576935770357713577235773357743577535776357773577835779357803578135782357833578435785357863578735788357893579035791357923579335794357953579635797357983579935800358013580235803358043580535806358073580835809358103581135812358133581435815358163581735818358193582035821358223582335824358253582635827358283582935830358313583235833358343583535836358373583835839358403584135842358433584435845358463584735848358493585035851358523585335854358553585635857358583585935860358613586235863358643586535866358673586835869358703587135872358733587435875358763587735878358793588035881358823588335884358853588635887358883588935890358913589235893358943589535896358973589835899359003590135902359033590435905359063590735908359093591035911359123591335914359153591635917359183591935920359213592235923359243592535926359273592835929359303593135932359333593435935359363593735938359393594035941359423594335944359453594635947359483594935950359513595235953359543595535956359573595835959359603596135962359633596435965359663596735968359693597035971359723597335974359753597635977359783597935980359813598235983359843598535986359873598835989359903599135992359933599435995359963599735998359993600036001360023600336004360053600636007360083600936010360113601236013360143601536016360173601836019360203602136022360233602436025360263602736028360293603036031360323603336034360353603636037360383603936040360413604236043360443604536046360473604836049360503605136052360533605436055360563605736058360593606036061360623606336064360653606636067360683606936070360713607236073360743607536076360773607836079360803608136082360833608436085360863608736088360893609036091360923609336094360953609636097360983609936100361013610236103361043610536106361073610836109361103611136112361133611436115361163611736118361193612036121361223612336124361253612636127361283612936130361313613236133361343613536136361373613836139361403614136142361433614436145361463614736148361493615036151361523615336154361553615636157361583615936160361613616236163361643616536166361673616836169361703617136172361733617436175361763617736178361793618036181361823618336184361853618636187361883618936190361913619236193361943619536196361973619836199362003620136202362033620436205362063620736208362093621036211362123621336214362153621636217362183621936220362213622236223362243622536226362273622836229362303623136232362333623436235362363623736238362393624036241362423624336244362453624636247362483624936250362513625236253362543625536256362573625836259362603626136262362633626436265362663626736268362693627036271362723627336274362753627636277362783627936280362813628236283362843628536286362873628836289362903629136292362933629436295362963629736298362993630036301363023630336304363053630636307363083630936310363113631236313363143631536316363173631836319363203632136322363233632436325363263632736328363293633036331363323633336334363353633636337363383633936340363413634236343363443634536346363473634836349363503635136352363533635436355363563635736358363593636036361363623636336364363653636636367363683636936370363713637236373363743637536376363773637836379363803638136382363833638436385363863638736388363893639036391363923639336394363953639636397363983639936400364013640236403364043640536406364073640836409364103641136412364133641436415364163641736418364193642036421364223642336424364253642636427364283642936430364313643236433364343643536436364373643836439364403644136442364433644436445364463644736448364493645036451364523645336454364553645636457364583645936460364613646236463364643646536466364673646836469364703647136472364733647436475364763647736478364793648036481364823648336484364853648636487364883648936490364913649236493364943649536496364973649836499365003650136502365033650436505365063650736508365093651036511365123651336514365153651636517365183651936520365213652236523365243652536526365273652836529365303653136532365333653436535365363653736538365393654036541365423654336544365453654636547365483654936550365513655236553365543655536556365573655836559365603656136562365633656436565365663656736568365693657036571365723657336574365753657636577365783657936580365813658236583365843658536586365873658836589365903659136592365933659436595365963659736598365993660036601366023660336604366053660636607366083660936610366113661236613366143661536616366173661836619366203662136622366233662436625366263662736628366293663036631366323663336634366353663636637366383663936640366413664236643366443664536646366473664836649366503665136652366533665436655366563665736658366593666036661366623666336664366653666636667366683666936670366713667236673366743667536676366773667836679366803668136682366833668436685366863668736688366893669036691366923669336694366953669636697366983669936700367013670236703367043670536706367073670836709367103671136712367133671436715367163671736718367193672036721367223672336724367253672636727367283672936730367313673236733367343673536736367373673836739367403674136742367433674436745367463674736748367493675036751367523675336754367553675636757367583675936760367613676236763367643676536766367673676836769367703677136772367733677436775367763677736778367793678036781367823678336784367853678636787367883678936790367913679236793367943679536796367973679836799368003680136802368033680436805368063680736808368093681036811368123681336814368153681636817368183681936820368213682236823368243682536826368273682836829368303683136832368333683436835368363683736838368393684036841368423684336844368453684636847368483684936850368513685236853368543685536856368573685836859368603686136862368633686436865368663686736868368693687036871368723687336874368753687636877368783687936880368813688236883368843688536886368873688836889368903689136892368933689436895368963689736898368993690036901369023690336904369053690636907369083690936910369113691236913369143691536916369173691836919369203692136922369233692436925369263692736928369293693036931369323693336934369353693636937369383693936940369413694236943369443694536946369473694836949369503695136952369533695436955369563695736958369593696036961369623696336964369653696636967369683696936970369713697236973369743697536976369773697836979369803698136982369833698436985369863698736988369893699036991369923699336994369953699636997369983699937000370013700237003370043700537006370073700837009370103701137012370133701437015370163701737018370193702037021370223702337024370253702637027370283702937030370313703237033370343703537036370373703837039370403704137042370433704437045370463704737048370493705037051370523705337054370553705637057370583705937060370613706237063370643706537066370673706837069370703707137072370733707437075370763707737078370793708037081370823708337084370853708637087370883708937090370913709237093370943709537096370973709837099371003710137102371033710437105371063710737108371093711037111371123711337114371153711637117371183711937120371213712237123371243712537126371273712837129371303713137132371333713437135371363713737138371393714037141371423714337144371453714637147371483714937150371513715237153371543715537156371573715837159371603716137162371633716437165371663716737168371693717037171371723717337174371753717637177371783717937180371813718237183371843718537186371873718837189371903719137192371933719437195371963719737198371993720037201372023720337204372053720637207372083720937210372113721237213372143721537216372173721837219372203722137222372233722437225372263722737228372293723037231372323723337234372353723637237372383723937240372413724237243372443724537246372473724837249372503725137252372533725437255372563725737258372593726037261372623726337264372653726637267372683726937270372713727237273372743727537276372773727837279372803728137282372833728437285372863728737288372893729037291372923729337294372953729637297372983729937300373013730237303373043730537306373073730837309373103731137312373133731437315373163731737318373193732037321373223732337324373253732637327373283732937330373313733237333373343733537336373373733837339373403734137342373433734437345373463734737348373493735037351373523735337354373553735637357373583735937360373613736237363373643736537366373673736837369373703737137372373733737437375373763737737378373793738037381373823738337384373853738637387373883738937390373913739237393373943739537396373973739837399374003740137402374033740437405374063740737408374093741037411374123741337414374153741637417374183741937420374213742237423374243742537426374273742837429374303743137432374333743437435374363743737438374393744037441374423744337444374453744637447374483744937450374513745237453374543745537456374573745837459374603746137462374633746437465374663746737468374693747037471374723747337474374753747637477374783747937480374813748237483374843748537486374873748837489374903749137492374933749437495374963749737498374993750037501375023750337504375053750637507375083750937510375113751237513375143751537516375173751837519375203752137522375233752437525375263752737528375293753037531375323753337534375353753637537375383753937540375413754237543375443754537546375473754837549375503755137552375533755437555375563755737558375593756037561375623756337564375653756637567375683756937570375713757237573375743757537576375773757837579375803758137582375833758437585375863758737588375893759037591375923759337594375953759637597375983759937600376013760237603376043760537606376073760837609376103761137612376133761437615376163761737618376193762037621376223762337624376253762637627376283762937630376313763237633376343763537636376373763837639376403764137642376433764437645376463764737648376493765037651376523765337654376553765637657376583765937660376613766237663376643766537666376673766837669376703767137672376733767437675376763767737678376793768037681376823768337684376853768637687376883768937690376913769237693376943769537696376973769837699377003770137702377033770437705377063770737708377093771037711377123771337714377153771637717377183771937720377213772237723377243772537726377273772837729377303773137732377333773437735377363773737738377393774037741377423774337744377453774637747377483774937750377513775237753377543775537756377573775837759377603776137762377633776437765377663776737768377693777037771377723777337774377753777637777377783777937780377813778237783377843778537786377873778837789377903779137792377933779437795377963779737798377993780037801378023780337804378053780637807378083780937810378113781237813378143781537816378173781837819378203782137822378233782437825378263782737828378293783037831378323783337834378353783637837378383783937840378413784237843378443784537846378473784837849378503785137852378533785437855378563785737858378593786037861378623786337864378653786637867378683786937870378713787237873378743787537876378773787837879378803788137882378833788437885378863788737888378893789037891378923789337894378953789637897378983789937900379013790237903379043790537906379073790837909379103791137912379133791437915379163791737918379193792037921379223792337924379253792637927379283792937930379313793237933379343793537936379373793837939379403794137942379433794437945379463794737948379493795037951379523795337954379553795637957379583795937960379613796237963379643796537966379673796837969379703797137972379733797437975379763797737978379793798037981379823798337984379853798637987379883798937990379913799237993379943799537996379973799837999380003800138002380033800438005380063800738008380093801038011380123801338014380153801638017380183801938020380213802238023380243802538026380273802838029380303803138032380333803438035380363803738038380393804038041380423804338044380453804638047380483804938050380513805238053380543805538056380573805838059380603806138062380633806438065380663806738068380693807038071380723807338074380753807638077380783807938080380813808238083380843808538086380873808838089380903809138092380933809438095380963809738098380993810038101381023810338104381053810638107381083810938110381113811238113381143811538116381173811838119381203812138122381233812438125381263812738128381293813038131381323813338134381353813638137381383813938140381413814238143381443814538146381473814838149381503815138152381533815438155381563815738158381593816038161381623816338164381653816638167381683816938170381713817238173381743817538176381773817838179381803818138182381833818438185381863818738188381893819038191381923819338194381953819638197381983819938200382013820238203382043820538206382073820838209382103821138212382133821438215382163821738218382193822038221382223822338224382253822638227382283822938230382313823238233382343823538236382373823838239382403824138242382433824438245382463824738248382493825038251382523825338254382553825638257382583825938260382613826238263382643826538266382673826838269382703827138272382733827438275382763827738278382793828038281382823828338284382853828638287382883828938290382913829238293382943829538296382973829838299383003830138302383033830438305383063830738308383093831038311383123831338314383153831638317383183831938320383213832238323383243832538326383273832838329383303833138332383333833438335383363833738338383393834038341383423834338344383453834638347383483834938350383513835238353383543835538356383573835838359383603836138362383633836438365383663836738368383693837038371383723837338374383753837638377383783837938380383813838238383383843838538386383873838838389383903839138392383933839438395383963839738398383993840038401384023840338404384053840638407384083840938410384113841238413384143841538416384173841838419384203842138422384233842438425384263842738428384293843038431384323843338434384353843638437384383843938440384413844238443384443844538446384473844838449384503845138452384533845438455384563845738458384593846038461384623846338464384653846638467384683846938470384713847238473384743847538476384773847838479384803848138482384833848438485384863848738488384893849038491384923849338494384953849638497384983849938500385013850238503385043850538506385073850838509385103851138512385133851438515385163851738518385193852038521385223852338524385253852638527385283852938530385313853238533385343853538536385373853838539385403854138542385433854438545385463854738548385493855038551385523855338554385553855638557385583855938560385613856238563385643856538566385673856838569385703857138572385733857438575385763857738578385793858038581385823858338584385853858638587385883858938590385913859238593385943859538596385973859838599386003860138602386033860438605386063860738608386093861038611386123861338614386153861638617386183861938620386213862238623386243862538626386273862838629386303863138632386333863438635386363863738638386393864038641386423864338644386453864638647386483864938650386513865238653386543865538656386573865838659386603866138662386633866438665386663866738668386693867038671386723867338674386753867638677386783867938680386813868238683386843868538686386873868838689386903869138692386933869438695386963869738698386993870038701387023870338704387053870638707387083870938710387113871238713387143871538716387173871838719387203872138722387233872438725387263872738728387293873038731387323873338734387353873638737387383873938740387413874238743387443874538746387473874838749387503875138752387533875438755387563875738758387593876038761387623876338764387653876638767387683876938770387713877238773387743877538776387773877838779387803878138782387833878438785387863878738788387893879038791387923879338794387953879638797387983879938800388013880238803388043880538806388073880838809388103881138812388133881438815388163881738818388193882038821388223882338824388253882638827388283882938830388313883238833388343883538836388373883838839388403884138842388433884438845388463884738848388493885038851388523885338854388553885638857388583885938860388613886238863388643886538866388673886838869388703887138872388733887438875388763887738878388793888038881388823888338884388853888638887388883888938890388913889238893388943889538896388973889838899389003890138902389033890438905389063890738908389093891038911389123891338914389153891638917389183891938920389213892238923389243892538926389273892838929389303893138932389333893438935389363893738938389393894038941389423894338944389453894638947389483894938950389513895238953389543895538956389573895838959389603896138962389633896438965389663896738968389693897038971389723897338974389753897638977389783897938980389813898238983389843898538986389873898838989389903899138992389933899438995389963899738998389993900039001390023900339004390053900639007390083900939010390113901239013390143901539016390173901839019390203902139022390233902439025390263902739028390293903039031390323903339034390353903639037390383903939040390413904239043390443904539046390473904839049390503905139052390533905439055390563905739058390593906039061390623906339064390653906639067390683906939070390713907239073390743907539076390773907839079390803908139082390833908439085390863908739088390893909039091390923909339094390953909639097390983909939100391013910239103391043910539106391073910839109391103911139112391133911439115391163911739118391193912039121391223912339124391253912639127391283912939130391313913239133391343913539136391373913839139391403914139142391433914439145391463914739148391493915039151391523915339154391553915639157391583915939160391613916239163391643916539166391673916839169391703917139172391733917439175391763917739178391793918039181391823918339184391853918639187391883918939190391913919239193391943919539196391973919839199392003920139202392033920439205392063920739208392093921039211392123921339214392153921639217392183921939220392213922239223392243922539226392273922839229392303923139232392333923439235392363923739238392393924039241392423924339244392453924639247392483924939250392513925239253392543925539256392573925839259392603926139262392633926439265392663926739268392693927039271392723927339274392753927639277392783927939280392813928239283392843928539286392873928839289392903929139292392933929439295392963929739298392993930039301393023930339304393053930639307393083930939310393113931239313393143931539316393173931839319393203932139322393233932439325393263932739328393293933039331393323933339334393353933639337393383933939340393413934239343393443934539346393473934839349393503935139352393533935439355393563935739358393593936039361393623936339364393653936639367393683936939370393713937239373393743937539376393773937839379393803938139382393833938439385393863938739388393893939039391393923939339394393953939639397393983939939400394013940239403394043940539406394073940839409394103941139412394133941439415394163941739418394193942039421394223942339424394253942639427394283942939430394313943239433394343943539436394373943839439394403944139442394433944439445394463944739448394493945039451394523945339454394553945639457394583945939460394613946239463394643946539466394673946839469394703947139472394733947439475394763947739478394793948039481394823948339484394853948639487394883948939490394913949239493394943949539496394973949839499395003950139502395033950439505395063950739508395093951039511395123951339514395153951639517395183951939520395213952239523395243952539526395273952839529395303953139532395333953439535395363953739538395393954039541395423954339544395453954639547395483954939550395513955239553395543955539556395573955839559395603956139562395633956439565395663956739568395693957039571395723957339574395753957639577395783957939580395813958239583395843958539586395873958839589395903959139592395933959439595395963959739598395993960039601396023960339604396053960639607396083960939610396113961239613396143961539616396173961839619396203962139622396233962439625396263962739628396293963039631396323963339634396353963639637396383963939640396413964239643396443964539646396473964839649396503965139652396533965439655396563965739658396593966039661396623966339664396653966639667396683966939670396713967239673396743967539676396773967839679396803968139682396833968439685396863968739688396893969039691396923969339694396953969639697396983969939700397013970239703397043970539706397073970839709397103971139712397133971439715397163971739718397193972039721397223972339724397253972639727397283972939730397313973239733397343973539736397373973839739397403974139742397433974439745397463974739748397493975039751397523975339754397553975639757397583975939760397613976239763397643976539766397673976839769397703977139772397733977439775397763977739778397793978039781397823978339784397853978639787397883978939790397913979239793397943979539796397973979839799398003980139802398033980439805398063980739808398093981039811398123981339814398153981639817398183981939820398213982239823398243982539826398273982839829398303983139832398333983439835398363983739838398393984039841398423984339844398453984639847398483984939850398513985239853398543985539856398573985839859398603986139862398633986439865398663986739868398693987039871398723987339874398753987639877398783987939880398813988239883398843988539886398873988839889398903989139892398933989439895398963989739898398993990039901399023990339904399053990639907399083990939910399113991239913399143991539916399173991839919399203992139922399233992439925399263992739928399293993039931399323993339934399353993639937399383993939940399413994239943399443994539946399473994839949399503995139952399533995439955399563995739958399593996039961399623996339964399653996639967399683996939970399713997239973399743997539976399773997839979399803998139982399833998439985399863998739988399893999039991399923999339994399953999639997399983999940000400014000240003400044000540006400074000840009400104001140012400134001440015400164001740018400194002040021400224002340024400254002640027400284002940030400314003240033400344003540036400374003840039400404004140042400434004440045400464004740048400494005040051400524005340054400554005640057400584005940060400614006240063400644006540066400674006840069400704007140072400734007440075400764007740078400794008040081400824008340084400854008640087400884008940090400914009240093400944009540096400974009840099401004010140102401034010440105401064010740108401094011040111401124011340114401154011640117401184011940120401214012240123401244012540126401274012840129401304013140132401334013440135401364013740138401394014040141401424014340144401454014640147401484014940150401514015240153401544015540156401574015840159401604016140162401634016440165401664016740168401694017040171401724017340174401754017640177401784017940180401814018240183401844018540186401874018840189401904019140192401934019440195401964019740198401994020040201402024020340204402054020640207402084020940210402114021240213402144021540216402174021840219402204022140222402234022440225402264022740228402294023040231402324023340234402354023640237402384023940240402414024240243402444024540246402474024840249402504025140252402534025440255402564025740258402594026040261402624026340264402654026640267402684026940270402714027240273402744027540276402774027840279402804028140282402834028440285402864028740288402894029040291402924029340294402954029640297402984029940300403014030240303403044030540306403074030840309403104031140312403134031440315403164031740318403194032040321403224032340324403254032640327403284032940330403314033240333403344033540336403374033840339403404034140342403434034440345403464034740348403494035040351403524035340354403554035640357403584035940360403614036240363403644036540366403674036840369403704037140372403734037440375403764037740378403794038040381403824038340384403854038640387403884038940390403914039240393403944039540396403974039840399404004040140402404034040440405404064040740408404094041040411404124041340414404154041640417404184041940420404214042240423404244042540426404274042840429404304043140432404334043440435404364043740438404394044040441404424044340444404454044640447404484044940450404514045240453404544045540456404574045840459404604046140462404634046440465404664046740468404694047040471404724047340474404754047640477404784047940480404814048240483404844048540486404874048840489404904049140492404934049440495404964049740498404994050040501405024050340504405054050640507405084050940510405114051240513405144051540516405174051840519405204052140522405234052440525405264052740528405294053040531405324053340534405354053640537405384053940540405414054240543405444054540546405474054840549405504055140552405534055440555405564055740558405594056040561405624056340564405654056640567405684056940570405714057240573405744057540576405774057840579405804058140582405834058440585405864058740588405894059040591405924059340594405954059640597405984059940600406014060240603406044060540606406074060840609406104061140612406134061440615406164061740618406194062040621406224062340624406254062640627406284062940630406314063240633406344063540636406374063840639406404064140642406434064440645406464064740648406494065040651406524065340654406554065640657406584065940660406614066240663406644066540666406674066840669406704067140672406734067440675406764067740678406794068040681406824068340684406854068640687406884068940690406914069240693406944069540696406974069840699407004070140702407034070440705407064070740708407094071040711407124071340714407154071640717407184071940720407214072240723407244072540726407274072840729407304073140732407334073440735407364073740738407394074040741407424074340744407454074640747407484074940750407514075240753407544075540756407574075840759407604076140762407634076440765407664076740768407694077040771407724077340774407754077640777407784077940780407814078240783407844078540786407874078840789407904079140792407934079440795407964079740798407994080040801408024080340804408054080640807408084080940810408114081240813408144081540816408174081840819408204082140822408234082440825408264082740828408294083040831408324083340834408354083640837
  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. #endif
  192. #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
  193. #include <Security/SecCertificate.h>
  194. #include <Security/SecTrust.h>
  195. #include <Security/SecPolicy.h>
  196. static int DoAppleNativeCertValidation(const WOLFSSL_BUFFER_INFO* certs,
  197. int totalCerts);
  198. #endif /* #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
  199. #ifdef WOLFSSL_DTLS13
  200. #ifndef WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT
  201. #define WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT 0
  202. #endif
  203. #endif /* WOLFSSL_DTLS13 */
  204. enum processReply {
  205. doProcessInit = 0,
  206. #ifndef NO_WOLFSSL_SERVER
  207. runProcessOldClientHello,
  208. #endif
  209. getRecordLayerHeader,
  210. getData,
  211. verifyEncryptedMessage,
  212. decryptMessage,
  213. verifyMessage,
  214. runProcessingOneRecord,
  215. runProcessingOneMessage
  216. };
  217. #ifndef WOLFSSL_NO_TLS12
  218. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  219. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  220. static const byte tls13Downgrade[7] = {
  221. 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
  222. };
  223. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  224. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  225. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  226. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  227. int padLen, int content, int verify, int epochOrder);
  228. #endif
  229. #endif /* !WOLFSSL_NO_TLS12 */
  230. #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  231. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  232. #endif
  233. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  234. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  235. int* secretSz, void* ctx);
  236. #ifdef WOLFSSL_TLS13
  237. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  238. const unsigned char* secret, int secretSz, void* ctx);
  239. #endif
  240. /* Label string for client random. */
  241. #define SSC_CR "CLIENT_RANDOM"
  242. /*
  243. * This function builds up string for key-logging then call user's
  244. * key-log-callback to pass the string for TLS1.2 and older.
  245. * The user's key-logging callback has been set via
  246. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  247. * "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  248. * parameter
  249. * - ssl: WOLFSSL object
  250. * - secret: pointer to the buffer holding master-secret
  251. * - secretSz: size of secret
  252. * - ctx: not used
  253. * returns 0 on success, negative value on failure.
  254. */
  255. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  256. int* secretSz, void* ctx)
  257. {
  258. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  259. int msSz;
  260. int hasVal;
  261. int i;
  262. const char* label = SSC_CR;
  263. int labelSz = sizeof(SSC_CR);
  264. int buffSz;
  265. byte* log = NULL;
  266. word32 outSz;
  267. int idx;
  268. int ret;
  269. (void)ctx;
  270. if (ssl == NULL || secret == NULL || *secretSz == 0)
  271. return BAD_FUNC_ARG;
  272. if (ssl->arrays == NULL)
  273. return BAD_FUNC_ARG;
  274. /* get the user-callback func from CTX*/
  275. logCb = ssl->ctx->keyLogCb;
  276. if (logCb == NULL)
  277. return 0;
  278. /* need to make sure the given master-secret has a meaningful value */
  279. msSz = *secretSz;
  280. hasVal = 0;
  281. for (i = 0; i < msSz; i++) {
  282. if (*((byte*)secret) != 0) {
  283. hasVal = 1;
  284. break;
  285. }
  286. }
  287. if (hasVal == 0)
  288. return 0; /* master-secret looks invalid */
  289. /* build up a hex-decoded keylog string
  290. "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  291. note that each keylog string does not have CR/LF.
  292. */
  293. buffSz = labelSz + (RAN_LEN * 2) + 1 + ((*secretSz) * 2) + 1;
  294. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  295. if (log == NULL)
  296. return MEMORY_E;
  297. #ifdef WOLFSSL_CHECK_MEM_ZERO
  298. wc_MemZero_Add("SessionSecret log", log, buffSz);
  299. #endif
  300. XMEMSET(log, 0, buffSz);
  301. XMEMCPY(log, label, labelSz -1); /* put label w/o terminator */
  302. log[labelSz - 1] = ' '; /* '\0' -> ' ' */
  303. idx = labelSz;
  304. outSz = buffSz - idx;
  305. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  306. log + idx, &outSz)) == 0) {
  307. idx += (outSz - 1); /* reduce terminator byte */
  308. outSz = buffSz - idx;
  309. if (outSz > 1) {
  310. log[idx++] = ' '; /* add space*/
  311. outSz = buffSz - idx;
  312. if ((ret = Base16_Encode((byte*)secret, *secretSz,
  313. log + idx, &outSz)) == 0) {
  314. /* pass the log to the client callback*/
  315. logCb(ssl, (char*)log);
  316. ret = 0;
  317. }
  318. }
  319. else
  320. ret = MEMORY_E;
  321. }
  322. /* Zero out Base16 encoded secret and other data. */
  323. ForceZero(log, buffSz);
  324. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  325. return ret;
  326. }
  327. #if defined(WOLFSSL_TLS13)
  328. /* Label string for client early traffic secret. */
  329. #define SSC_TLS13_CETS "CLIENT_EARLY_TRAFFIC_SECRET"
  330. /* Label string for client handshake traffic secret. */
  331. #define SSC_TLS13_CHTS "CLIENT_HANDSHAKE_TRAFFIC_SECRET"
  332. /* Label string for server handshake traffic secret. */
  333. #define SSC_TLS13_SHTS "SERVER_HANDSHAKE_TRAFFIC_SECRET"
  334. /* Label string for client traffic secret. */
  335. #define SSC_TLS13_CTS "CLIENT_TRAFFIC_SECRET_0"
  336. /* Label string for server traffic secret. */
  337. #define SSC_TLS13_STS "SERVER_TRAFFIC_SECRET_0"
  338. /* Label string for early exporter secret. */
  339. #define SSC_TLS13_EES "EARLY_EXPORTER_SECRET"
  340. /* Label string for exporter secret. */
  341. #define SSC_TLS13_ES "EXPORTER_SECRET"
  342. /*
  343. * This function builds up string for key-logging then call user's
  344. * key-log-callback to pass the string for TLS1.3.
  345. * The user's key-logging callback has been set via
  346. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  347. * "<Label> <hex-encoded client random> <hex-encoded secret>"
  348. *
  349. * parameter
  350. * - ssl: WOLFSSL object
  351. * - id: type of secret for logging
  352. * - secret: pointer to the buffer holding secret
  353. * - secretSz: size of secret
  354. * - ctx: not used
  355. * returns 0 on success, negative value on failure.
  356. */
  357. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  358. const unsigned char* secret, int secretSz, void* ctx)
  359. {
  360. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  361. const char* label;
  362. int labelSz = 0;
  363. int buffSz = 0;
  364. byte* log = NULL;
  365. word32 outSz;
  366. int idx;
  367. int ret;
  368. (void)ctx;
  369. if (ssl == NULL || secret == NULL || secretSz == 0)
  370. return BAD_FUNC_ARG;
  371. if (ssl->arrays == NULL)
  372. return BAD_FUNC_ARG;
  373. /* get the user-callback func from CTX*/
  374. logCb = ssl->ctx->keyLogCb;
  375. if (logCb == NULL)
  376. return 0;
  377. switch (id) {
  378. case CLIENT_EARLY_TRAFFIC_SECRET:
  379. labelSz = sizeof(SSC_TLS13_CETS);
  380. label = SSC_TLS13_CETS;
  381. break;
  382. case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
  383. labelSz = sizeof(SSC_TLS13_CHTS);
  384. label = SSC_TLS13_CHTS;
  385. break;
  386. case SERVER_HANDSHAKE_TRAFFIC_SECRET:
  387. labelSz = sizeof(SSC_TLS13_SHTS);
  388. label = SSC_TLS13_SHTS;
  389. break;
  390. case CLIENT_TRAFFIC_SECRET:
  391. labelSz = sizeof(SSC_TLS13_CTS);
  392. label = SSC_TLS13_CTS;
  393. break;
  394. case SERVER_TRAFFIC_SECRET:
  395. labelSz = sizeof(SSC_TLS13_STS);
  396. label = SSC_TLS13_STS;
  397. break;
  398. case EARLY_EXPORTER_SECRET:
  399. labelSz = sizeof(SSC_TLS13_EES);
  400. label = SSC_TLS13_EES;
  401. break;
  402. case EXPORTER_SECRET:
  403. labelSz = sizeof(SSC_TLS13_ES);
  404. label = SSC_TLS13_ES;
  405. break;
  406. default:
  407. return BAD_FUNC_ARG;
  408. }
  409. /* prepare a log string for passing user callback
  410. * "<Label> <hex-encoded client random> <hex-encoded secret>" */
  411. buffSz = labelSz + (RAN_LEN * 2) + 1 + secretSz * 2 + 1;
  412. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  413. if (log == NULL)
  414. return MEMORY_E;
  415. #ifdef WOLFSSL_CHECK_MEM_ZERO
  416. wc_MemZero_Add("SessionSecret log", log, buffSz);
  417. #endif
  418. XMEMSET(log, 0, buffSz);
  419. XMEMCPY(log, label, labelSz - 1); /* put label w/o terminator */
  420. log[labelSz - 1] = ' '; /* '\0' -> ' ' */
  421. idx = labelSz;
  422. outSz = buffSz - idx;
  423. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  424. log + idx, &outSz)) == 0) {
  425. idx += (outSz - 1); /* reduce terminator byte */
  426. outSz = buffSz - idx;
  427. if (outSz >1) {
  428. log[idx++] = ' '; /* add space*/
  429. outSz = buffSz - idx;
  430. if ((ret = Base16_Encode((byte*)secret, secretSz,
  431. log + idx, &outSz)) == 0) {
  432. logCb(ssl, (char*)log);
  433. ret = 0;
  434. }
  435. }
  436. else
  437. ret = MEMORY_E;
  438. }
  439. /* Zero out Base16 encoded secret and other data. */
  440. ForceZero(log, buffSz);
  441. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  442. return ret;
  443. }
  444. #endif /* WOLFSSL_TLS13*/
  445. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK*/
  446. int IsTLS(const WOLFSSL* ssl)
  447. {
  448. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  449. return 1;
  450. return 0;
  451. }
  452. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  453. {
  454. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  455. return 1;
  456. #ifdef WOLFSSL_DTLS
  457. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  458. return 1;
  459. #endif
  460. return 0;
  461. }
  462. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  463. {
  464. int ret;
  465. ret = (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  466. #ifdef WOLFSSL_DTLS13
  467. if (ret == 0 && pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_3_MINOR)
  468. return 1;
  469. #endif
  470. return ret;
  471. }
  472. int IsEncryptionOn(const WOLFSSL* ssl, int isSend)
  473. {
  474. #ifdef WOLFSSL_DTLS
  475. /* For DTLS, epoch 0 is always not encrypted. */
  476. if (ssl->options.dtls && !isSend) {
  477. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->keys.curEpoch == 0)
  478. return 0;
  479. #ifdef WOLFSSL_DTLS13
  480. else if (IsAtLeastTLSv1_3(ssl->version)
  481. && w64IsZero(ssl->keys.curEpoch64))
  482. return 0;
  483. #endif /* WOLFSSL_DTLS13 */
  484. }
  485. #endif /* WOLFSSL_DTLS */
  486. #ifdef WOLFSSL_QUIC
  487. if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version)) {
  488. return 0;
  489. }
  490. #endif
  491. return ssl->keys.encryptionOn &&
  492. (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
  493. }
  494. #ifdef WOLFSSL_DTLS
  495. /* Stream Control Transmission Protocol */
  496. /* If SCTP is not enabled returns the state of the dtls option.
  497. * If SCTP is enabled returns dtls && !sctp. */
  498. int IsDtlsNotSctpMode(WOLFSSL* ssl)
  499. {
  500. #ifdef WOLFSSL_SCTP
  501. return ssl->options.dtls && !ssl->options.dtlsSctp;
  502. #else
  503. return ssl->options.dtls;
  504. #endif
  505. }
  506. #if !defined(WOLFSSL_NO_TLS12) && !defined(NO_WOLFSSL_SERVER)
  507. /* Secure Real-time Transport Protocol */
  508. /* If SRTP is not enabled returns the state of the dtls option.
  509. * If SRTP is enabled returns dtls && !dtlsSrtpProfiles. */
  510. int IsDtlsNotSrtpMode(WOLFSSL* ssl)
  511. {
  512. #ifdef WOLFSSL_SRTP
  513. return ssl->options.dtls && !ssl->dtlsSrtpProfiles;
  514. #else
  515. return ssl->options.dtls;
  516. #endif
  517. }
  518. #endif /* !WOLFSSL_NO_TLS12 && !NO_WOLFSSL_SERVER */
  519. #endif /* WOLFSSL_DTLS */
  520. #ifdef HAVE_LIBZ
  521. /* alloc user allocs to work with zlib */
  522. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  523. {
  524. (void)opaque;
  525. return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  526. }
  527. static void myFree(void* opaque, void* memory)
  528. {
  529. (void)opaque;
  530. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  531. }
  532. /* init zlib comp/decomp streams, 0 on success */
  533. static int InitStreams(WOLFSSL* ssl)
  534. {
  535. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  536. ssl->c_stream.zfree = (free_func)myFree;
  537. ssl->c_stream.opaque = (voidpf)ssl->heap;
  538. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  539. return ZLIB_INIT_ERROR;
  540. ssl->didStreamInit = 1;
  541. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  542. ssl->d_stream.zfree = (free_func)myFree;
  543. ssl->d_stream.opaque = (voidpf)ssl->heap;
  544. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  545. return 0;
  546. }
  547. static void FreeStreams(WOLFSSL* ssl)
  548. {
  549. if (ssl->didStreamInit) {
  550. deflateEnd(&ssl->c_stream);
  551. inflateEnd(&ssl->d_stream);
  552. }
  553. }
  554. /* compress in to out, return out size or error */
  555. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  556. {
  557. int err;
  558. int currTotal = (int)ssl->c_stream.total_out;
  559. ssl->c_stream.next_in = in;
  560. ssl->c_stream.avail_in = inSz;
  561. ssl->c_stream.next_out = out;
  562. ssl->c_stream.avail_out = outSz;
  563. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  564. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  565. return (int)ssl->c_stream.total_out - currTotal;
  566. }
  567. /* decompress in to out, return out size or error */
  568. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  569. {
  570. int err;
  571. int currTotal = (int)ssl->d_stream.total_out;
  572. ssl->d_stream.next_in = in;
  573. ssl->d_stream.avail_in = inSz;
  574. ssl->d_stream.next_out = out;
  575. ssl->d_stream.avail_out = outSz;
  576. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  577. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  578. return (int)ssl->d_stream.total_out - currTotal;
  579. }
  580. #endif /* HAVE_LIBZ */
  581. #ifdef WOLFSSL_SESSION_EXPORT
  582. /**
  583. * serializes the cipher specs struct for exporting
  584. * @return the amount written to 'exp' buffer
  585. */
  586. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  587. int type)
  588. {
  589. word32 idx = 0;
  590. CipherSpecs* specs;
  591. WOLFSSL_ENTER("ExportCipherSpecState");
  592. if (exp == NULL || ssl == NULL) {
  593. return BAD_FUNC_ARG;
  594. }
  595. specs = &ssl->specs;
  596. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  597. return BUFFER_E;
  598. }
  599. XMEMSET(exp, 0, WOLFSSL_EXPORT_SPC_SZ);
  600. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  601. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  602. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  603. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  604. exp[idx++] = specs->bulk_cipher_algorithm;
  605. exp[idx++] = specs->cipher_type;
  606. exp[idx++] = specs->mac_algorithm;
  607. exp[idx++] = specs->kea;
  608. exp[idx++] = specs->sig_algo;
  609. exp[idx++] = specs->hash_size;
  610. exp[idx++] = specs->pad_size;
  611. exp[idx++] = specs->static_ecdh;
  612. if (idx != WOLFSSL_EXPORT_SPC_SZ) {
  613. WOLFSSL_MSG("WOLFSSL_EXPORT_SPC_SZ needs updated and export version");
  614. return DTLS_EXPORT_VER_E;
  615. }
  616. /* send over state of AES too */
  617. if (type == WOLFSSL_EXPORT_TLS &&
  618. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  619. byte *pt = (byte*)ssl->encrypt.aes->reg;
  620. if ((idx + 2*AES_BLOCK_SIZE) > len) {
  621. WOLFSSL_MSG("Can not fit AES state into buffer");
  622. return BUFFER_E;
  623. }
  624. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  625. idx += AES_BLOCK_SIZE;
  626. pt = (byte*)ssl->decrypt.aes->reg;
  627. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  628. idx += AES_BLOCK_SIZE;
  629. }
  630. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  631. (void)ver;
  632. return idx;
  633. }
  634. /* serializes the key struct for exporting */
  635. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  636. byte small, int type)
  637. {
  638. word32 idx = 0;
  639. byte sz;
  640. Keys* keys;
  641. WOLFSSL_ENTER("ExportKeyState");
  642. if (exp == NULL || ssl == NULL) {
  643. return BAD_FUNC_ARG;
  644. }
  645. keys = &(ssl->keys);
  646. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  647. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  648. return BUFFER_E;
  649. }
  650. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  651. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  652. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  653. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  654. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  655. #if defined(WOLFSSL_DTLS)
  656. if (type == WOLFSSL_EXPORT_DTLS) {
  657. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  658. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  659. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  660. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  661. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  662. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  663. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  664. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  665. c16toa(keys->dtls_peer_handshake_number, exp + idx);
  666. idx += OPAQUE16_LEN;
  667. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  668. idx += OPAQUE16_LEN;
  669. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  670. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  671. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx);
  672. idx += OPAQUE16_LEN;
  673. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx);
  674. idx += OPAQUE32_LEN;
  675. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  676. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  677. }
  678. #endif
  679. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  680. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  681. exp[idx++] = keys->encryptionOn;
  682. exp[idx++] = keys->decryptedCur;
  683. /* from here on the buffer needs checked because is variable length that
  684. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  685. #ifdef WOLFSSL_DTLS
  686. if (type == WOLFSSL_EXPORT_DTLS) {
  687. word32 i;
  688. if ((OPAQUE16_LEN * 2) + idx +
  689. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  690. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  691. return BUFFER_E;
  692. }
  693. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  694. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  695. c32toa(keys->peerSeq[0].window[i], exp + idx);
  696. idx += OPAQUE32_LEN;
  697. }
  698. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  699. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  700. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  701. idx += OPAQUE32_LEN;
  702. }
  703. }
  704. #endif
  705. if (idx >= len) {
  706. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  707. return BUFFER_E;
  708. }
  709. #ifdef HAVE_TRUNCATED_HMAC
  710. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  711. exp[idx++] = ssl->truncated_hmac;
  712. #else
  713. sz = ssl->specs.hash_size;
  714. exp[idx++] = 0; /* no truncated hmac */
  715. #endif
  716. sz = (small)? 0: sz;
  717. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  718. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  719. return BUFFER_E;
  720. }
  721. exp[idx++] = sz;
  722. if (sz > 0) {
  723. #ifndef WOLFSSL_AEAD_ONLY
  724. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  725. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  726. #else
  727. XMEMSET(exp + idx, 0, sz); idx += sz;
  728. XMEMSET(exp + idx, 0, sz); idx += sz;
  729. #endif
  730. }
  731. sz = (small)? 0: ssl->specs.key_size;
  732. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  733. WOLFSSL_MSG("Buffer not large enough for write key");
  734. return BUFFER_E;
  735. }
  736. exp[idx++] = sz;
  737. if (sz > 0) {
  738. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  739. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  740. }
  741. sz = (small)? 0: ssl->specs.iv_size;
  742. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  743. WOLFSSL_MSG("Buffer not large enough for IVs");
  744. return BUFFER_E;
  745. }
  746. exp[idx++] = sz;
  747. if (sz > 0) {
  748. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  749. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  750. }
  751. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  752. idx += AEAD_MAX_EXP_SZ;
  753. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  754. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  755. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  756. return BUFFER_E;
  757. }
  758. exp[idx++] = sz;
  759. if (sz > 0) {
  760. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  761. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  762. }
  763. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  764. if (idx > DTLS_EXPORT_KEY_SZ) {
  765. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  766. return DTLS_EXPORT_VER_E;
  767. }
  768. WOLFSSL_LEAVE("ExportKeyState", idx);
  769. (void)ver;
  770. (void)type;
  771. return idx;
  772. }
  773. /**
  774. * Imports the buffer 'exp' into the 'ssl' CipherSpec structure.
  775. * @param ssl WOLFSSL structure to import into
  776. * @param exp input buffer to read from
  777. * @param len length of exp buffer
  778. * @param ver version of import buffer found
  779. * @param type flag for importing a TLS session or DTLS
  780. *
  781. * @return size of exp buffer consumed on success and negative value on fail
  782. */
  783. static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len,
  784. byte ver, int type)
  785. {
  786. word32 idx = 0;
  787. CipherSpecs* specs;
  788. word32 tmp_seq_peer_lo;
  789. word32 tmp_seq_peer_hi;
  790. word32 tmp_seq_lo;
  791. word32 tmp_seq_hi;
  792. int ret;
  793. WOLFSSL_ENTER("ImportCipherSpecState");
  794. if (exp == NULL || ssl == NULL) {
  795. return BAD_FUNC_ARG;
  796. }
  797. specs= &(ssl->specs);
  798. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  799. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  800. return BUFFER_E;
  801. }
  802. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  803. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  804. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  805. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  806. specs->bulk_cipher_algorithm = exp[idx++];
  807. specs->cipher_type = exp[idx++];
  808. specs->mac_algorithm = exp[idx++];
  809. specs->kea = exp[idx++];
  810. specs->sig_algo = exp[idx++];
  811. specs->hash_size = exp[idx++];
  812. specs->pad_size = exp[idx++];
  813. specs->static_ecdh = exp[idx++];
  814. if (specs->pad_size != PAD_MD5 && specs->pad_size != PAD_SHA) {
  815. WOLFSSL_MSG("Importing bad or unknown pad size");
  816. return BAD_STATE_E;
  817. }
  818. /* temporarily save the sequence numbers */
  819. tmp_seq_peer_lo = ssl->keys.peer_sequence_number_lo;
  820. tmp_seq_peer_hi = ssl->keys.peer_sequence_number_hi;
  821. tmp_seq_lo = ssl->keys.sequence_number_lo;
  822. tmp_seq_hi = ssl->keys.sequence_number_hi;
  823. if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) < 0) {
  824. return ret;
  825. }
  826. /* reset sequence numbers after setting keys */
  827. ssl->keys.peer_sequence_number_lo = tmp_seq_peer_lo;
  828. ssl->keys.peer_sequence_number_hi = tmp_seq_peer_hi;
  829. ssl->keys.sequence_number_lo = tmp_seq_lo;
  830. ssl->keys.sequence_number_hi = tmp_seq_hi;
  831. if (type == WOLFSSL_EXPORT_TLS &&
  832. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  833. byte *pt = (byte*)ssl->encrypt.aes->reg;
  834. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  835. idx += AES_BLOCK_SIZE;
  836. pt = (byte*)ssl->decrypt.aes->reg;
  837. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  838. idx += AES_BLOCK_SIZE;
  839. }
  840. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  841. (void)ver;
  842. return idx;
  843. }
  844. /**
  845. * Import the Key structure
  846. *
  847. * @param ssl WOLFSSL structure to import into
  848. * @param exp buffer to read Key values from
  849. * @param len max length of buffer 'exp'
  850. * @param ver version of import buffer found
  851. * @param type flag for TLS vs DTLS
  852. *
  853. * @return amount of data read from exp on success or negative on fail
  854. */
  855. static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  856. int type)
  857. {
  858. word32 idx = 0;
  859. byte sz;
  860. Keys *keys;
  861. WOLFSSL_ENTER("ImportKeyState");
  862. if (exp == NULL || ssl == NULL) {
  863. return BAD_FUNC_ARG;
  864. }
  865. keys = &(ssl->keys);
  866. /* check minimum length -- includes byte used for size indicators */
  867. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  868. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  869. return BUFFER_E;
  870. }
  871. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  872. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  873. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  874. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  875. #if defined(WOLFSSL_DTLS)
  876. if (type == WOLFSSL_EXPORT_DTLS) {
  877. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  878. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  879. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  880. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  881. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  882. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  883. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  884. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  885. ato16(exp + idx, &keys->dtls_peer_handshake_number);
  886. idx += OPAQUE16_LEN;
  887. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  888. idx += OPAQUE16_LEN;
  889. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  890. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  891. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi);
  892. idx += OPAQUE16_LEN;
  893. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo);
  894. idx += OPAQUE32_LEN;
  895. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  896. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  897. }
  898. #endif
  899. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  900. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  901. keys->encryptionOn = exp[idx++];
  902. keys->decryptedCur = exp[idx++];
  903. #if defined(WOLFSSL_DTLS)
  904. if (type == WOLFSSL_EXPORT_DTLS) {
  905. word16 i, wordCount, wordAdj = 0;
  906. /* do window */
  907. ato16(exp + idx, &wordCount);
  908. idx += OPAQUE16_LEN;
  909. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  910. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  911. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  912. }
  913. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  914. for (i = 0; i < wordCount; i++) {
  915. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  916. idx += OPAQUE32_LEN;
  917. }
  918. idx += wordAdj;
  919. /* do prevWindow */
  920. ato16(exp + idx, &wordCount);
  921. idx += OPAQUE16_LEN;
  922. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  923. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  924. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  925. }
  926. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  927. for (i = 0; i < wordCount; i++) {
  928. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  929. idx += OPAQUE32_LEN;
  930. }
  931. idx += wordAdj;
  932. }
  933. #endif
  934. #ifdef HAVE_TRUNCATED_HMAC
  935. ssl->truncated_hmac = exp[idx++];
  936. #else
  937. idx++; /* no truncated hmac */
  938. #endif
  939. sz = exp[idx++];
  940. #ifndef WOLFSSL_AEAD_ONLY
  941. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  942. WOLFSSL_MSG("Buffer not large enough for MAC import");
  943. return BUFFER_E;
  944. }
  945. if (sz > 0) {
  946. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  947. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  948. }
  949. #else
  950. if (sz + idx > len) {
  951. return BUFFER_E;
  952. }
  953. idx += sz; idx += sz;
  954. #endif
  955. sz = exp[idx++];
  956. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  957. WOLFSSL_MSG("Buffer not large enough for key import");
  958. return BUFFER_E;
  959. }
  960. if (sz > 0) {
  961. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  962. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  963. }
  964. sz = exp[idx++];
  965. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  966. WOLFSSL_MSG("Buffer not large enough for write IV import");
  967. return BUFFER_E;
  968. }
  969. if (sz > 0) {
  970. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  971. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  972. }
  973. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  974. idx += AEAD_MAX_EXP_SZ;
  975. sz = exp[idx++];
  976. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  977. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  978. return BUFFER_E;
  979. }
  980. if (sz > 0) {
  981. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  982. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  983. }
  984. WOLFSSL_LEAVE("ImportKeyState", idx);
  985. (void)ver;
  986. (void)type;
  987. return idx;
  988. }
  989. /* copy over necessary information from Options struct to buffer
  990. * On success returns size of buffer used on failure returns a negative value */
  991. static int ExportOptions(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  992. int type)
  993. {
  994. int idx = 0;
  995. word16 zero = 0;
  996. Options *options;
  997. WOLFSSL_ENTER("ExportOptions");
  998. if (ssl == NULL || exp == NULL || len < DTLS_EXPORT_OPT_SZ) {
  999. return BAD_FUNC_ARG;
  1000. }
  1001. options = &ssl->options;
  1002. if (options == NULL) {
  1003. return BAD_FUNC_ARG;
  1004. }
  1005. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  1006. /* these options are kept and sent to indicate verify status and strength
  1007. * of handshake */
  1008. exp[idx++] = options->sendVerify;
  1009. exp[idx++] = options->verifyPeer;
  1010. exp[idx++] = options->verifyNone;
  1011. exp[idx++] = options->downgrade;
  1012. #ifndef NO_DH
  1013. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  1014. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  1015. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  1016. #else
  1017. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1018. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1019. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1020. #endif
  1021. #ifndef NO_RSA
  1022. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  1023. #else
  1024. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1025. #endif
  1026. #ifdef HAVE_ECC
  1027. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  1028. #else
  1029. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1030. #endif
  1031. /* these options are kept to indicate state and behavior */
  1032. #ifndef NO_PSK
  1033. exp[idx++] = options->havePSK;
  1034. #else
  1035. exp[idx++] = 0;
  1036. #endif
  1037. exp[idx++] = options->sessionCacheOff;
  1038. exp[idx++] = options->sessionCacheFlushOff;
  1039. exp[idx++] = options->side;
  1040. exp[idx++] = options->resuming;
  1041. exp[idx++] = options->haveSessionId;
  1042. exp[idx++] = options->tls;
  1043. exp[idx++] = options->tls1_1;
  1044. exp[idx++] = options->dtls;
  1045. exp[idx++] = options->connReset;
  1046. exp[idx++] = options->isClosed;
  1047. exp[idx++] = options->closeNotify;
  1048. exp[idx++] = options->sentNotify;
  1049. exp[idx++] = options->usingCompression;
  1050. exp[idx++] = options->haveRSA;
  1051. exp[idx++] = options->haveECC;
  1052. exp[idx++] = options->haveDH;
  1053. exp[idx++] = 0; /* Historical: haveNTRU */
  1054. exp[idx++] = 0; /* Historical: haveQSH */
  1055. exp[idx++] = options->haveECDSAsig;
  1056. exp[idx++] = options->haveStaticECC;
  1057. exp[idx++] = options->havePeerVerify;
  1058. exp[idx++] = options->usingPSK_cipher;
  1059. exp[idx++] = options->usingAnon_cipher;
  1060. exp[idx++] = 0; /* Historical: options->sendAlertState */
  1061. exp[idx++] = options->partialWrite;
  1062. exp[idx++] = options->quietShutdown;
  1063. exp[idx++] = options->groupMessages;
  1064. #ifdef HAVE_POLY1305
  1065. exp[idx++] = options->oldPoly;
  1066. #else
  1067. exp[idx++] = 0;
  1068. #endif
  1069. #ifdef HAVE_ANON
  1070. exp[idx++] = options->useAnon;
  1071. #else
  1072. exp[idx++] = 0;
  1073. #endif
  1074. #ifdef HAVE_SESSION_TICKET
  1075. exp[idx++] = options->createTicket;
  1076. exp[idx++] = options->useTicket;
  1077. exp[idx++] = options->noTicketTls12;
  1078. #ifdef WOLFSSL_TLS13
  1079. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1080. exp[idx++] = options->noTicketTls13;
  1081. }
  1082. #else
  1083. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1084. exp[idx++] = 0;
  1085. }
  1086. #endif
  1087. #else
  1088. exp[idx++] = 0;
  1089. exp[idx++] = 0;
  1090. exp[idx++] = 0;
  1091. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1092. exp[idx++] = 0;
  1093. }
  1094. #endif
  1095. exp[idx++] = options->processReply;
  1096. exp[idx++] = options->cipherSuite0;
  1097. exp[idx++] = options->cipherSuite;
  1098. exp[idx++] = options->serverState;
  1099. exp[idx++] = options->clientState;
  1100. exp[idx++] = options->handShakeState;
  1101. exp[idx++] = options->handShakeDone;
  1102. exp[idx++] = options->minDowngrade;
  1103. exp[idx++] = options->connectState;
  1104. exp[idx++] = options->acceptState;
  1105. exp[idx++] = options->asyncState;
  1106. if (type == WOLFSSL_EXPORT_TLS) {
  1107. #ifdef HAVE_ENCRYPT_THEN_MAC
  1108. exp[idx++] = options->disallowEncThenMac;
  1109. exp[idx++] = options->encThenMac;
  1110. exp[idx++] = options->startedETMRead;
  1111. exp[idx++] = options->startedETMWrite;
  1112. #else
  1113. exp[idx++] = 0;
  1114. exp[idx++] = 0;
  1115. exp[idx++] = 0;
  1116. exp[idx++] = 0;
  1117. #endif
  1118. }
  1119. if (ver > WOLFSSL_EXPORT_VERSION_4) {
  1120. #ifdef WOLFSSL_DTLS
  1121. exp[idx++] = options->dtlsStateful;
  1122. #else
  1123. exp[idx++] = 0;
  1124. #endif
  1125. }
  1126. /* version of connection */
  1127. exp[idx++] = ssl->version.major;
  1128. exp[idx++] = ssl->version.minor;
  1129. (void)zero;
  1130. /* check if changes were made and notify of need to update export version */
  1131. switch (ver) {
  1132. case WOLFSSL_EXPORT_VERSION_3:
  1133. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  1134. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1135. return DTLS_EXPORT_VER_E;
  1136. }
  1137. break;
  1138. case WOLFSSL_EXPORT_VERSION_4:
  1139. if (idx != DTLS_EXPORT_OPT_SZ_4 && type == WOLFSSL_EXPORT_DTLS) {
  1140. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1141. return DTLS_EXPORT_VER_E;
  1142. }
  1143. break;
  1144. case WOLFSSL_EXPORT_VERSION:
  1145. if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) {
  1146. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1147. return DTLS_EXPORT_VER_E;
  1148. }
  1149. break;
  1150. default:
  1151. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  1152. return DTLS_EXPORT_VER_E;
  1153. }
  1154. WOLFSSL_LEAVE("ExportOptions", idx);
  1155. (void)type;
  1156. return idx;
  1157. }
  1158. /* copy items from Export struct to Options struct
  1159. * On success returns size of buffer used on failure returns a negative value */
  1160. static int ImportOptions(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  1161. int type)
  1162. {
  1163. int idx = 0;
  1164. Options* options = &ssl->options;
  1165. switch (ver) {
  1166. case WOLFSSL_EXPORT_VERSION:
  1167. if (len < DTLS_EXPORT_OPT_SZ) {
  1168. WOLFSSL_MSG("Sanity check on buffer size failed");
  1169. return BAD_FUNC_ARG;
  1170. }
  1171. break;
  1172. case WOLFSSL_EXPORT_VERSION_4:
  1173. if (len < DTLS_EXPORT_OPT_SZ_4) {
  1174. WOLFSSL_MSG("Sanity check on buffer size failed");
  1175. return BAD_FUNC_ARG;
  1176. }
  1177. break;
  1178. case WOLFSSL_EXPORT_VERSION_3:
  1179. if (len < DTLS_EXPORT_OPT_SZ_3) {
  1180. WOLFSSL_MSG("Sanity check on buffer size failed");
  1181. return BAD_FUNC_ARG;
  1182. }
  1183. break;
  1184. default:
  1185. WOLFSSL_MSG("Export version not supported");
  1186. return BAD_FUNC_ARG;
  1187. }
  1188. if (exp == NULL || options == NULL) {
  1189. return BAD_FUNC_ARG;
  1190. }
  1191. /* these options are kept and sent to indicate verify status and strength
  1192. * of handshake */
  1193. options->sendVerify = exp[idx++];
  1194. options->verifyPeer = exp[idx++];
  1195. options->verifyNone = exp[idx++];
  1196. options->downgrade = exp[idx++];
  1197. #ifndef NO_DH
  1198. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  1199. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  1200. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  1201. #else
  1202. idx += OPAQUE16_LEN;
  1203. idx += OPAQUE16_LEN;
  1204. idx += OPAQUE16_LEN;
  1205. #endif
  1206. #ifndef NO_RSA
  1207. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  1208. #else
  1209. idx += OPAQUE16_LEN;
  1210. #endif
  1211. #ifdef HAVE_ECC
  1212. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  1213. #else
  1214. idx += OPAQUE16_LEN;
  1215. #endif
  1216. /* these options are kept to indicate state and behavior */
  1217. #ifndef NO_PSK
  1218. options->havePSK = exp[idx++];
  1219. #else
  1220. idx++;
  1221. #endif
  1222. options->sessionCacheOff = exp[idx++];
  1223. options->sessionCacheFlushOff = exp[idx++];
  1224. options->side = exp[idx++];
  1225. options->resuming = exp[idx++];
  1226. options->haveSessionId = exp[idx++];
  1227. options->tls = exp[idx++];
  1228. options->tls1_1 = exp[idx++];
  1229. options->dtls = exp[idx++];
  1230. options->connReset = exp[idx++];
  1231. options->isClosed = exp[idx++];
  1232. options->closeNotify = exp[idx++];
  1233. options->sentNotify = exp[idx++];
  1234. options->usingCompression = exp[idx++];
  1235. options->haveRSA = exp[idx++];
  1236. options->haveECC = exp[idx++];
  1237. options->haveDH = exp[idx++];
  1238. idx++; /* Historical: haveNTRU */
  1239. idx++; /* Historical: haveQSH */
  1240. options->haveECDSAsig = exp[idx++];
  1241. options->haveStaticECC = exp[idx++];
  1242. options->havePeerVerify = exp[idx++];
  1243. options->usingPSK_cipher = exp[idx++];
  1244. options->usingAnon_cipher = exp[idx++];
  1245. idx++; /* Historical: options->sendAlertState */
  1246. options->partialWrite = exp[idx++];
  1247. options->quietShutdown = exp[idx++];
  1248. options->groupMessages = exp[idx++];
  1249. #ifdef HAVE_POLY1305
  1250. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  1251. #else
  1252. idx++;
  1253. #endif
  1254. #ifdef HAVE_ANON
  1255. options->useAnon = exp[idx++]; /* User wants to allow Anon suites */
  1256. #else
  1257. idx++;
  1258. #endif
  1259. #ifdef HAVE_SESSION_TICKET
  1260. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  1261. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  1262. options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
  1263. #ifdef WOLFSSL_TLS13
  1264. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1265. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  1266. }
  1267. #else
  1268. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1269. idx++;
  1270. }
  1271. #endif
  1272. #else
  1273. idx++;
  1274. idx++;
  1275. idx++;
  1276. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1277. idx++;
  1278. }
  1279. #endif
  1280. options->processReply = exp[idx++];
  1281. options->cipherSuite0 = exp[idx++];
  1282. options->cipherSuite = exp[idx++];
  1283. options->serverState = exp[idx++];
  1284. options->clientState = exp[idx++];
  1285. options->handShakeState = exp[idx++];
  1286. options->handShakeDone = exp[idx++];
  1287. options->minDowngrade = exp[idx++];
  1288. options->connectState = exp[idx++];
  1289. options->acceptState = exp[idx++];
  1290. options->asyncState = exp[idx++];
  1291. if (type == WOLFSSL_EXPORT_TLS) {
  1292. #ifdef HAVE_ENCRYPT_THEN_MAC
  1293. options->disallowEncThenMac = exp[idx++];
  1294. options->encThenMac = exp[idx++];
  1295. options->startedETMRead = exp[idx++];
  1296. options->startedETMWrite = exp[idx++];
  1297. #else
  1298. idx++;
  1299. idx++;
  1300. idx++;
  1301. idx++;
  1302. #endif
  1303. }
  1304. /* If we had a connection established, let's assume that we can act
  1305. * statefully */
  1306. options->dtlsStateful = 1;
  1307. if (ver > WOLFSSL_EXPORT_VERSION_4) {
  1308. #ifdef WOLFSSL_DTLS
  1309. options->dtlsStateful = exp[idx++];
  1310. #else
  1311. idx++;
  1312. #endif
  1313. }
  1314. /* version of connection */
  1315. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  1316. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  1317. return VERSION_ERROR;
  1318. }
  1319. /* set TLS 1.3 flag in options if this was a TLS 1.3 connection */
  1320. if (ssl->version.major == SSLv3_MAJOR &&
  1321. ssl->version.minor == TLSv1_3_MINOR) {
  1322. options->tls1_3 = 1;
  1323. }
  1324. return idx;
  1325. }
  1326. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  1327. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  1328. {
  1329. int idx = 0;
  1330. int ipSz = MAX_EXPORT_IP; /* start as max size */
  1331. int fam = 0;
  1332. word16 port = 0;
  1333. char ip[MAX_EXPORT_IP];
  1334. if (ver != WOLFSSL_EXPORT_VERSION) {
  1335. WOLFSSL_MSG("Export version not supported");
  1336. return BAD_FUNC_ARG;
  1337. }
  1338. if (ssl == NULL || exp == NULL ||
  1339. len < (sizeof(ip) + 3 * WOLFSSL_EXPORT_LEN)) {
  1340. return BAD_FUNC_ARG;
  1341. }
  1342. if (ssl->ctx->CBGetPeer == NULL) {
  1343. WOLFSSL_MSG("No get peer call back set");
  1344. return BAD_FUNC_ARG;
  1345. }
  1346. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  1347. WOLFSSL_MSG("Get peer callback error");
  1348. return SOCKET_ERROR_E;
  1349. }
  1350. /* check that ipSz/fam is not negative or too large since user can set cb */
  1351. if (ipSz < 0 || ipSz > MAX_EXPORT_IP || fam < 0) {
  1352. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  1353. return SOCKET_ERROR_E;
  1354. }
  1355. c16toa((word16)fam, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1356. c16toa((word16)ipSz, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1357. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  1358. c16toa(port, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1359. return idx;
  1360. }
  1361. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  1362. static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
  1363. {
  1364. word16 idx = 0;
  1365. word16 ipSz;
  1366. word16 fam;
  1367. word16 port;
  1368. char ip[MAX_EXPORT_IP];
  1369. if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_4 &&
  1370. ver != WOLFSSL_EXPORT_VERSION_3) {
  1371. WOLFSSL_MSG("Export version not supported");
  1372. return BAD_FUNC_ARG;
  1373. }
  1374. if (len == 0) {
  1375. WOLFSSL_MSG("No peer info sent");
  1376. return 0;
  1377. }
  1378. if (ssl == NULL || buf == NULL || len < 3 * WOLFSSL_EXPORT_LEN) {
  1379. return BAD_FUNC_ARG;
  1380. }
  1381. /* import sin family */
  1382. ato16(buf + idx, &fam); idx += WOLFSSL_EXPORT_LEN;
  1383. /* import ip address idx, and ipSz are unsigned but cast for enum */
  1384. ato16(buf + idx, &ipSz); idx += WOLFSSL_EXPORT_LEN;
  1385. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + WOLFSSL_EXPORT_LEN) > len) {
  1386. return BUFFER_E;
  1387. }
  1388. XMEMSET(ip, 0, sizeof(ip));
  1389. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  1390. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  1391. ato16(buf + idx, &port); idx += WOLFSSL_EXPORT_LEN;
  1392. /* sanity check for a function to call, then use it to import peer info */
  1393. if (ssl->ctx->CBSetPeer == NULL) {
  1394. WOLFSSL_MSG("No set peer function");
  1395. return BAD_FUNC_ARG;
  1396. }
  1397. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  1398. WOLFSSL_MSG("Error setting peer info");
  1399. return SOCKET_ERROR_E;
  1400. }
  1401. return idx;
  1402. }
  1403. #ifdef WOLFSSL_DTLS
  1404. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1405. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1406. * passed in.
  1407. * On success returns the size of serialized session state.*/
  1408. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1409. {
  1410. int ret;
  1411. word32 idx = 0;
  1412. word32 totalLen = 0;
  1413. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1414. if (buf == NULL || ssl == NULL) {
  1415. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1416. return BAD_FUNC_ARG;
  1417. }
  1418. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1419. /* each of the following have a 2 byte length before data */
  1420. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1421. if (totalLen > sz) {
  1422. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1423. return BUFFER_E;
  1424. }
  1425. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1426. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1427. ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1428. idx += WOLFSSL_EXPORT_LEN; /* leave room for total length */
  1429. /* export keys struct and dtls state -- variable length stored in ret */
  1430. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1431. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1432. WOLFSSL_EXPORT_VERSION, 1, WOLFSSL_EXPORT_DTLS)) < 0) {
  1433. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1434. return ret;
  1435. }
  1436. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1437. /* place total length of exported buffer minus 2 bytes protocol/version */
  1438. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1439. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1440. /* if compiled with debug options then print the version, protocol, size */
  1441. {
  1442. char debug[256];
  1443. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1444. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1445. , (int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1446. WOLFSSL_MSG(debug);
  1447. }
  1448. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1449. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1450. return idx;
  1451. }
  1452. /* On success return amount of buffer consumed */
  1453. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1454. {
  1455. word32 idx = 0;
  1456. word16 length = 0;
  1457. int version;
  1458. int ret;
  1459. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1460. /* check at least enough room for protocol and length */
  1461. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1462. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1463. return BAD_FUNC_ARG;
  1464. }
  1465. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1466. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1467. WOLFSSL_MSG("Incorrect protocol");
  1468. return BAD_FUNC_ARG;
  1469. }
  1470. version = buf[idx++] & 0x0F;
  1471. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1472. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1473. WOLFSSL_MSG("Buffer size sanity check failed");
  1474. return BUFFER_E;
  1475. }
  1476. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1477. /* if compiled with debug options then print the version, protocol, size */
  1478. {
  1479. char debug[256];
  1480. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1481. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1482. , (int)version, buf[0], (buf[1] >> 4), length);
  1483. WOLFSSL_MSG(debug);
  1484. }
  1485. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1486. /* perform sanity checks and extract Options information used */
  1487. switch (version) {
  1488. case WOLFSSL_EXPORT_VERSION:
  1489. break;
  1490. default:
  1491. WOLFSSL_MSG("Bad export state version");
  1492. return BAD_FUNC_ARG;
  1493. }
  1494. /* perform sanity checks and extract Keys struct */
  1495. if (WOLFSSL_EXPORT_LEN + idx > sz) {
  1496. WOLFSSL_MSG("Import Key struct error");
  1497. return BUFFER_E;
  1498. }
  1499. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1500. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1501. WOLFSSL_MSG("Import Key struct error");
  1502. return BUFFER_E;
  1503. }
  1504. if ((ret = ImportKeyState(ssl, buf + idx, length, version,
  1505. WOLFSSL_EXPORT_DTLS)) < 0) {
  1506. WOLFSSL_MSG("Import Key struct error");
  1507. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1508. return ret;
  1509. }
  1510. idx += ret;
  1511. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1512. return idx;
  1513. }
  1514. #endif /* WOLFSSL_DTLS */
  1515. /**
  1516. * Imports a serialized buffer (both TLS and DTLS)
  1517. *
  1518. * @param ssl WOLFSSL structure to import into
  1519. * @param buf buffer containing serialized session
  1520. * @param sz size of buffer 'buf'
  1521. * @param type flag for TLS or DTLS
  1522. *
  1523. * @return the size of serialized buffer on success
  1524. */
  1525. int wolfSSL_session_import_internal(WOLFSSL* ssl, const unsigned char* buf,
  1526. unsigned int sz, int type)
  1527. {
  1528. word32 idx = 0;
  1529. word16 length = 0;
  1530. int version = 0;
  1531. int ret = 0;
  1532. int optSz = 0;
  1533. int rc;
  1534. WOLFSSL_ENTER("wolfSSL_session_import_internal");
  1535. /* check at least enough room for protocol and length */
  1536. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1537. ret = BAD_FUNC_ARG;
  1538. }
  1539. /* Check if is TLS export protocol */
  1540. if (ret == 0) {
  1541. byte validProto = 0; /* did we find a valid protocol */
  1542. if (buf[idx] == (byte)TLS_EXPORT_PRO &&
  1543. (buf[idx + 1] & 0xF0) == ((byte)TLS_EXPORT_PRO & 0xF0)) {
  1544. validProto = 1;
  1545. }
  1546. /* Check if is DTLS export protocol */
  1547. if (buf[idx] == (byte)DTLS_EXPORT_PRO &&
  1548. (buf[idx + 1] & 0xF0) == ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1549. validProto = 1;
  1550. }
  1551. if (validProto == 0) {
  1552. #ifdef WOLFSSL_DTLS
  1553. /* check if importing state only */
  1554. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1555. #else
  1556. WOLFSSL_MSG("Invalid serialized session protocol value");
  1557. ret = BAD_FUNC_ARG;
  1558. #endif
  1559. }
  1560. idx += 1;
  1561. }
  1562. if (ret == 0) {
  1563. version = buf[idx++] & 0x0F;
  1564. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1565. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1566. ret = BUFFER_E;
  1567. }
  1568. }
  1569. /* if compiled with debug options then print the version, protocol, size */
  1570. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1571. {
  1572. char debug[256];
  1573. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1574. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1575. , (int)version, buf[0], (buf[1] >> 4), length);
  1576. WOLFSSL_MSG(debug);
  1577. }
  1578. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1579. /* perform sanity checks and extract Options information used */
  1580. if (ret == 0) {
  1581. switch (version) {
  1582. case WOLFSSL_EXPORT_VERSION:
  1583. if (type == WOLFSSL_EXPORT_DTLS) {
  1584. optSz = DTLS_EXPORT_OPT_SZ;
  1585. }
  1586. else {
  1587. optSz = TLS_EXPORT_OPT_SZ;
  1588. }
  1589. break;
  1590. case WOLFSSL_EXPORT_VERSION_4:
  1591. if (type == WOLFSSL_EXPORT_DTLS) {
  1592. optSz = DTLS_EXPORT_OPT_SZ_4;
  1593. }
  1594. else {
  1595. optSz = TLS_EXPORT_OPT_SZ;
  1596. }
  1597. break;
  1598. case WOLFSSL_EXPORT_VERSION_3:
  1599. WOLFSSL_MSG("Importing older version 3");
  1600. optSz = DTLS_EXPORT_OPT_SZ_3;
  1601. break;
  1602. default:
  1603. WOLFSSL_MSG("Bad export version");
  1604. ret = BAD_FUNC_ARG;
  1605. }
  1606. }
  1607. if (ret == 0 && (WOLFSSL_EXPORT_LEN + optSz + idx > sz)) {
  1608. WOLFSSL_MSG("Import Options struct error");
  1609. ret = BUFFER_E;
  1610. }
  1611. if (ret == 0) {
  1612. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1613. if (length != optSz) {
  1614. WOLFSSL_MSG("Import Options struct error");
  1615. ret = BUFFER_E;
  1616. }
  1617. }
  1618. if (ret == 0) {
  1619. rc = ImportOptions(ssl, buf + idx, length, version, type);
  1620. if (rc < 0) {
  1621. WOLFSSL_MSG("Import Options struct error");
  1622. ret = rc;
  1623. }
  1624. else {
  1625. idx += length;
  1626. }
  1627. }
  1628. /* perform sanity checks and extract Keys struct */
  1629. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1630. WOLFSSL_MSG("Import Key struct error");
  1631. ret = BUFFER_E;
  1632. }
  1633. if (ret == 0) {
  1634. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1635. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1636. WOLFSSL_MSG("Import Key struct error");
  1637. ret = BUFFER_E;
  1638. }
  1639. }
  1640. if (ret == 0) {
  1641. rc = ImportKeyState(ssl, buf + idx, length, version, type);
  1642. if (rc < 0) {
  1643. WOLFSSL_MSG("Import Key struct error");
  1644. ret = rc;
  1645. }
  1646. else {
  1647. idx += rc;
  1648. }
  1649. }
  1650. /* perform sanity checks and extract CipherSpecs struct */
  1651. if (ret == 0 && (WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ + idx > sz)) {
  1652. WOLFSSL_MSG("Import CipherSpecs struct error");
  1653. ret = BUFFER_E;
  1654. }
  1655. if (ret == 0) {
  1656. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1657. if (length != WOLFSSL_EXPORT_SPC_SZ) {
  1658. WOLFSSL_MSG("Import CipherSpecs struct error");
  1659. ret = BUFFER_E;
  1660. }
  1661. }
  1662. if (ret == 0) {
  1663. rc = ImportCipherSpecState(ssl, buf + idx, length, version, type);
  1664. if (rc < 0) {
  1665. WOLFSSL_MSG("Import CipherSpecs struct error");
  1666. ret = rc;
  1667. }
  1668. else {
  1669. idx += rc;
  1670. }
  1671. }
  1672. /* perform sanity checks and extract DTLS peer info */
  1673. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1674. WOLFSSL_MSG("Import DTLS peer info error");
  1675. ret = BUFFER_E;
  1676. }
  1677. if (ret == 0) {
  1678. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1679. if (idx + length > sz) {
  1680. WOLFSSL_MSG("Import DTLS peer info error");
  1681. ret = BUFFER_E;
  1682. }
  1683. }
  1684. if (ret == 0) {
  1685. rc = ImportPeerInfo(ssl, buf + idx, length, version);
  1686. if (rc < 0) {
  1687. WOLFSSL_MSG("Import Peer Addr error");
  1688. ret = rc;
  1689. }
  1690. else {
  1691. idx += rc;
  1692. }
  1693. }
  1694. /* make sure is a valid suite used */
  1695. if (ret == 0 && wolfSSL_get_cipher(ssl) == NULL) {
  1696. WOLFSSL_MSG("Can not match cipher suite imported");
  1697. ret = MATCH_SUITE_ERROR;
  1698. }
  1699. #ifndef WOLFSSL_AEAD_ONLY
  1700. /* set hmac function to use when verifying */
  1701. if (ret == 0 && (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1702. ssl->options.dtls == 1)) {
  1703. #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  1704. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  1705. ssl->hmac = TLS_hmac;
  1706. #else
  1707. ssl->hmac = Renesas_cmn_TLS_hmac;
  1708. #endif
  1709. }
  1710. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1711. if (ret == 0 && ssl->specs.cipher_type == stream &&
  1712. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1713. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1714. ret = SANITY_CIPHER_E;
  1715. }
  1716. #endif /* !WOLFSSL_AEAD_ONLY */
  1717. if (ret != 0) {
  1718. idx = ret;
  1719. }
  1720. WOLFSSL_LEAVE("wolfSSL_session_import_internal", idx);
  1721. return idx;
  1722. }
  1723. /**
  1724. * Handles serializing the session information.
  1725. *
  1726. * @param ssl WOLFSSL structure to serialize session from
  1727. * @param buf output buffer to hold serialized session
  1728. * @param sz the size of buffer 'buf', if too small then gets updated
  1729. * @param type if the input WOLFSSL structure is expected to be TLS or DTLS
  1730. * 1 for yes is TLS and 0 for no is DTLS
  1731. *
  1732. * @return the size of serialized buffer on success and negative values on fail
  1733. */
  1734. int wolfSSL_session_export_internal(WOLFSSL* ssl, byte* buf, word32* sz,
  1735. int type)
  1736. {
  1737. int ret = 0;
  1738. word32 idx = 0;
  1739. word32 totalLen = 0;
  1740. WOLFSSL_ENTER("wolfSSL_session_export_internal");
  1741. if (ssl == NULL) {
  1742. WOLFSSL_MSG("unexpected null argument");
  1743. ret = BAD_FUNC_ARG;
  1744. }
  1745. if (ret == 0) {
  1746. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1747. /* each of the following have a 2 byte length before data */
  1748. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1749. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1750. totalLen += WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ;
  1751. #ifdef WOLFSSL_DTLS
  1752. if (type == WOLFSSL_EXPORT_DTLS) {
  1753. totalLen += WOLFSSL_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1754. }
  1755. #endif
  1756. }
  1757. /* check is at least the minimum size needed, TLS cipher states add more */
  1758. if (ret == 0 && (totalLen > *sz || buf == NULL)) {
  1759. WOLFSSL_MSG("export buffer was too small or null");
  1760. *sz = totalLen;
  1761. /* possible AES state needed */
  1762. if (type == WOLFSSL_EXPORT_TLS) {
  1763. *sz += AES_BLOCK_SIZE*2;
  1764. }
  1765. ret = LENGTH_ONLY_E;
  1766. }
  1767. if (ret == 0) {
  1768. buf[idx++] = (byte)(type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1769. DTLS_EXPORT_PRO;
  1770. buf[idx++] = ((byte)((type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1771. DTLS_EXPORT_PRO) & 0xF0)
  1772. | ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1773. idx += WOLFSSL_EXPORT_LEN; /* leave spot for length of total buffer */
  1774. idx += WOLFSSL_EXPORT_LEN;
  1775. ret = ExportOptions(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1776. type);
  1777. if (ret >= 0) {
  1778. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1779. idx += ret;
  1780. ret = 0;
  1781. }
  1782. }
  1783. /* export keys struct and dtls state -- variable length stored in ret */
  1784. if (ret == 0) {
  1785. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1786. ret = ExportKeyState(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1787. 0, type);
  1788. if (ret >= 0) {
  1789. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1790. ret = 0;
  1791. }
  1792. }
  1793. /* export of cipher specs struct */
  1794. if (ret == 0) {
  1795. c16toa((word16)WOLFSSL_EXPORT_SPC_SZ, buf + idx);
  1796. idx += WOLFSSL_EXPORT_LEN;
  1797. ret = ExportCipherSpecState(ssl, buf + idx, *sz - idx,
  1798. WOLFSSL_EXPORT_VERSION, type);
  1799. if (ret >= 0) {
  1800. idx += ret;
  1801. ret = 0;
  1802. }
  1803. }
  1804. /* export of peer information */
  1805. if (ret == 0) {
  1806. idx += WOLFSSL_EXPORT_LEN;
  1807. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1808. ret = 0; /* not saving peer port/ip information */
  1809. #else
  1810. ret = ExportPeerInfo(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION);
  1811. #endif
  1812. if (ret >= 0) {
  1813. c16toa(ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1814. idx += ret;
  1815. ret = 0;
  1816. }
  1817. }
  1818. if (ret != 0 && ret != LENGTH_ONLY_E && buf != NULL) {
  1819. /*in a fail case clear the buffer which could contain partial key info*/
  1820. XMEMSET(buf, 0, *sz);
  1821. }
  1822. /* place total length of exported buffer minus 2 bytes protocol/version */
  1823. if (ret == 0) {
  1824. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1825. ret = idx;
  1826. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1827. {
  1828. char debug[256];
  1829. XSNPRINTF(debug, sizeof(debug), "Exporting TLS session\n"
  1830. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1831. ,(int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1832. WOLFSSL_MSG(debug);
  1833. }
  1834. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1835. }
  1836. if (ret >= 0) {
  1837. *sz = ret;
  1838. }
  1839. WOLFSSL_LEAVE("wolfSSL_session_export_internal", ret);
  1840. return ret;
  1841. }
  1842. #endif /* WOLFSSL_SESSION_EXPORT */
  1843. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1844. {
  1845. method->version = pv;
  1846. method->side = WOLFSSL_CLIENT_END;
  1847. method->downgrade = 0;
  1848. }
  1849. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) || \
  1850. defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  1851. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1852. {
  1853. if (ssl == NULL)
  1854. return BAD_FUNC_ARG;
  1855. /* set side */
  1856. ssl->options.side = side;
  1857. /* reset options that are side specific */
  1858. #ifdef HAVE_ECC
  1859. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1860. ssl->options.haveECDSAsig = 1; /* always on client side */
  1861. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1862. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1863. }
  1864. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1865. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1866. ssl->options.haveECDSAsig = 1; /* always on client side */
  1867. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1868. }
  1869. #endif
  1870. #ifdef HAVE_PQC
  1871. #ifdef HAVE_FALCON
  1872. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1873. ssl->options.haveFalconSig = 1; /* always on client side */
  1874. }
  1875. #endif /* HAVE_FALCON */
  1876. #ifdef HAVE_DILITHIUM
  1877. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1878. ssl->options.haveDilithiumSig = 1; /* always on client side */
  1879. }
  1880. #endif /* HAVE_DILITHIUM */
  1881. #endif /* HAVE_PQC */
  1882. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1883. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1884. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1885. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1886. ssl->options.haveEMS = 1;
  1887. }
  1888. #ifdef WOLFSSL_DTLS
  1889. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1890. ssl->options.haveEMS = 1;
  1891. #endif /* WOLFSSL_DTLS */
  1892. }
  1893. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1894. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  1895. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  1896. int ret;
  1897. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  1898. if (ret != 0) {
  1899. WOLFSSL_MSG("DTLS Cookie Secret error");
  1900. return ret;
  1901. }
  1902. }
  1903. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  1904. return InitSSL_Suites(ssl);
  1905. }
  1906. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1907. /* Initialize SSL context, return 0 on success */
  1908. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1909. {
  1910. int ret = 0;
  1911. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1912. ctx->method = method;
  1913. if (heap == NULL) {
  1914. ctx->heap = ctx; /* defaults to self */
  1915. }
  1916. else {
  1917. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  1918. }
  1919. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1920. #ifdef WOLFSSL_DTLS
  1921. if (method->version.major == DTLS_MAJOR) {
  1922. ctx->minDowngrade = WOLFSSL_MIN_DTLS_DOWNGRADE;
  1923. }
  1924. else
  1925. #endif /* WOLFSSL_DTLS */
  1926. {
  1927. /* current default: TLSv1_MINOR */
  1928. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE;
  1929. }
  1930. wolfSSL_RefInit(&ctx->ref, &ret);
  1931. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  1932. if (ret < 0) {
  1933. WOLFSSL_MSG("Mutex error on CTX init");
  1934. ctx->err = CTX_INIT_MUTEX_E;
  1935. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  1936. return BAD_MUTEX_E;
  1937. }
  1938. #else
  1939. (void)ret;
  1940. #endif
  1941. #ifndef NO_CERTS
  1942. ctx->privateKeyDevId = INVALID_DEVID;
  1943. #ifdef WOLFSSL_DUAL_ALG_CERTS
  1944. ctx->altPrivateKeyDevId = INVALID_DEVID;
  1945. #endif
  1946. #endif
  1947. #ifndef NO_DH
  1948. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1949. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1950. #endif
  1951. #ifndef NO_RSA
  1952. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1953. #endif
  1954. #ifdef HAVE_ECC
  1955. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1956. ctx->eccTempKeySz = ECDHE_SIZE;
  1957. #endif
  1958. #ifdef HAVE_PQC
  1959. #ifdef HAVE_FALCON
  1960. ctx->minFalconKeySz = MIN_FALCONKEY_SZ;
  1961. #endif /* HAVE_FALCON */
  1962. #ifdef HAVE_DILITHIUM
  1963. ctx->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ;
  1964. #endif /* HAVE_DILITHIUM */
  1965. #endif /* HAVE_PQC */
  1966. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1967. #ifdef OPENSSL_EXTRA
  1968. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1969. #endif
  1970. #ifdef HAVE_NETX
  1971. ctx->CBIORecv = NetX_Receive;
  1972. ctx->CBIOSend = NetX_Send;
  1973. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1974. ctx->CBIORecv = Mynewt_Receive;
  1975. ctx->CBIOSend = Mynewt_Send;
  1976. #elif defined WOLFSSL_LWIP_NATIVE
  1977. ctx->CBIORecv = LwIPNativeReceive;
  1978. ctx->CBIOSend = LwIPNativeSend;
  1979. #elif defined(WOLFSSL_GNRC)
  1980. ctx->CBIORecv = GNRC_ReceiveFrom;
  1981. ctx->CBIOSend = GNRC_SendTo;
  1982. #elif defined WOLFSSL_ISOTP
  1983. ctx->CBIORecv = ISOTP_Receive;
  1984. ctx->CBIOSend = ISOTP_Send;
  1985. #elif !defined(WOLFSSL_USER_IO)
  1986. #ifdef MICRIUM
  1987. ctx->CBIORecv = MicriumReceive;
  1988. ctx->CBIOSend = MicriumSend;
  1989. #ifdef WOLFSSL_DTLS
  1990. if (method->version.major == DTLS_MAJOR) {
  1991. ctx->CBIORecv = MicriumReceiveFrom;
  1992. ctx->CBIOSend = MicriumSendTo;
  1993. }
  1994. #ifdef WOLFSSL_SESSION_EXPORT
  1995. #error Micrium port does not support DTLS session export yet
  1996. #endif
  1997. #endif
  1998. #elif defined WOLFSSL_UIP
  1999. ctx->CBIORecv = uIPReceive;
  2000. ctx->CBIOSend = uIPSend;
  2001. #ifdef WOLFSSL_DTLS
  2002. if (method->version.major == DTLS_MAJOR) {
  2003. ctx->CBIOSendTo = uIPSendTo;
  2004. ctx->CBIORecvFrom = uIPRecvFrom;
  2005. }
  2006. #endif
  2007. #else
  2008. ctx->CBIORecv = EmbedReceive;
  2009. ctx->CBIOSend = EmbedSend;
  2010. #ifdef WOLFSSL_SESSION_EXPORT
  2011. ctx->CBGetPeer = EmbedGetPeer;
  2012. ctx->CBSetPeer = EmbedSetPeer;
  2013. #endif
  2014. #ifdef WOLFSSL_DTLS
  2015. if (method->version.major == DTLS_MAJOR) {
  2016. ctx->CBIORecv = EmbedReceiveFrom;
  2017. ctx->CBIOSend = EmbedSendTo;
  2018. }
  2019. #endif
  2020. #endif /* MICRIUM */
  2021. #endif /* WOLFSSL_USER_IO */
  2022. #if defined(HAVE_RPK)
  2023. wolfSSL_CTX_set_client_cert_type(ctx, NULL, 0); /* set to default */
  2024. wolfSSL_CTX_set_server_cert_type(ctx, NULL, 0); /* set to default */
  2025. #endif /* HAVE_RPK */
  2026. #ifdef HAVE_PQC
  2027. #ifdef HAVE_FALCON
  2028. if (method->side == WOLFSSL_CLIENT_END)
  2029. ctx->haveFalconSig = 1; /* always on client side */
  2030. /* server can turn on by loading key */
  2031. #endif /* HAVE_FALCON */
  2032. #ifdef HAVE_DILITHIUM
  2033. if (method->side == WOLFSSL_CLIENT_END)
  2034. ctx->haveDilithiumSig = 1; /* always on client side */
  2035. /* server can turn on by loading key */
  2036. #endif /* HAVE_DILITHIUM */
  2037. #endif /* HAVE_PQC */
  2038. #ifdef HAVE_ECC
  2039. if (method->side == WOLFSSL_CLIENT_END) {
  2040. ctx->haveECDSAsig = 1; /* always on client side */
  2041. ctx->haveECC = 1; /* server turns on with ECC key cert */
  2042. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  2043. }
  2044. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  2045. if (method->side == WOLFSSL_CLIENT_END) {
  2046. ctx->haveECDSAsig = 1; /* always on client side */
  2047. ctx->haveECC = 1; /* server turns on with ECC key cert */
  2048. }
  2049. #endif
  2050. #ifdef WOLFSSL_QNX_CAAM
  2051. /* default to try using CAAM when built */
  2052. ctx->devId = WOLFSSL_CAAM_DEVID;
  2053. #elif defined(HAVE_ARIA) && defined(WOLF_CRYPTO_CB)
  2054. ctx->devId = WOLFSSL_ARIA_DEVID;
  2055. #else
  2056. ctx->devId = INVALID_DEVID;
  2057. #endif
  2058. #if defined(WOLFSSL_DTLS)
  2059. #ifdef WOLFSSL_SCTP
  2060. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  2061. #elif defined(WOLFSSL_DTLS_MTU)
  2062. ctx->dtlsMtuSz = MAX_MTU;
  2063. #endif
  2064. #endif
  2065. #ifndef NO_CERTS
  2066. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  2067. if (ctx->cm == NULL) {
  2068. WOLFSSL_MSG("Bad Cert Manager New");
  2069. WOLFSSL_ERROR_VERBOSE(BAD_CERT_MANAGER_ERROR);
  2070. return BAD_CERT_MANAGER_ERROR;
  2071. }
  2072. #ifdef OPENSSL_EXTRA
  2073. /* setup WOLFSSL_X509_STORE */
  2074. ctx->x509_store.cm = ctx->cm;
  2075. /* set pointer back to x509 store */
  2076. ctx->cm->x509_store_p = &ctx->x509_store;
  2077. /* WOLFSSL_X509_VERIFY_PARAM */
  2078. if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  2079. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  2080. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  2081. WOLFSSL_MSG("ctx->param memory error");
  2082. return MEMORY_E;
  2083. }
  2084. XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  2085. /* WOLFSSL_X509_LOOKUP */
  2086. if ((ctx->x509_store.lookup.dirs =
  2087. (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR),
  2088. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  2089. WOLFSSL_MSG("ctx-x509_store.lookup.dir memory allocation error");
  2090. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  2091. ctx->param = NULL;
  2092. return MEMORY_E;
  2093. }
  2094. XMEMSET(ctx->x509_store.lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
  2095. if (wc_InitMutex(&ctx->x509_store.lookup.dirs->lock) != 0) {
  2096. WOLFSSL_MSG("Bad mutex init");
  2097. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  2098. ctx->param = NULL;
  2099. XFREE(ctx->x509_store.lookup.dirs, heap, DYNAMIC_TYPE_OPENSSL);
  2100. ctx->x509_store.lookup.dirs = NULL;
  2101. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  2102. return BAD_MUTEX_E;
  2103. }
  2104. #endif
  2105. #endif
  2106. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  2107. if (method->side == WOLFSSL_CLIENT_END) {
  2108. if ((method->version.major == SSLv3_MAJOR) &&
  2109. (method->version.minor >= TLSv1_MINOR)) {
  2110. ctx->haveEMS = 1;
  2111. }
  2112. #ifdef WOLFSSL_DTLS
  2113. if (method->version.major == DTLS_MAJOR)
  2114. ctx->haveEMS = 1;
  2115. #endif /* WOLFSSL_DTLS */
  2116. }
  2117. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  2118. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  2119. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  2120. ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
  2121. if (ret != 0) return ret;
  2122. ctx->ticketEncCb = DefTicketEncCb;
  2123. ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
  2124. #endif
  2125. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  2126. #if defined(WOLFSSL_TLS13)
  2127. ctx->maxTicketTls13 = 1; /* default to sending a session ticket if compiled
  2128. in */
  2129. #endif
  2130. #endif
  2131. #ifdef WOLFSSL_EARLY_DATA
  2132. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  2133. #endif
  2134. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  2135. #if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
  2136. ctx->noPskDheKe = 1;
  2137. #endif
  2138. #endif
  2139. #if defined(WOLFSSL_QT) && !defined(NO_PSK)
  2140. /* Qt retrieves supported cipher list at initialization
  2141. * from get_cipher_compat().
  2142. * Qt doesn't allow to use a cipher if it is not in the supported list.
  2143. * Therefore, we need to enable PSK cipher at the beginning.
  2144. */
  2145. ctx->havePSK = 1;
  2146. #endif
  2147. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  2148. #ifdef HAVE_WOLF_EVENT
  2149. ret = wolfEventQueue_Init(&ctx->event_queue);
  2150. #endif /* HAVE_WOLF_EVENT */
  2151. #ifdef WOLFSSL_MAXQ10XX_TLS
  2152. /* Let maxq10xx know what TLS version we are using. */
  2153. ctx->devId = MAXQ_DEVICE_ID;
  2154. maxq10xx_SetupPkCallbacks(ctx, &method->version);
  2155. #endif /* WOLFSSL_MAXQ10XX_TLS */
  2156. #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
  2157. /* Should only be set when wolfSSL_CTX_load_system_CA_certs() is called */
  2158. ctx->doAppleNativeCertValidationFlag = 0;
  2159. #endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
  2160. return ret;
  2161. }
  2162. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2163. void wolfSSL_CRYPTO_cleanup_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data)
  2164. {
  2165. int n_ex_data = (int)(sizeof ex_data->ex_data / sizeof ex_data->ex_data[0]);
  2166. for (--n_ex_data; n_ex_data >= 0; --n_ex_data) {
  2167. if (ex_data->ex_data[n_ex_data] != NULL)
  2168. (void)wolfSSL_CRYPTO_set_ex_data_with_cleanup(ex_data, n_ex_data,
  2169. NULL, NULL);
  2170. }
  2171. }
  2172. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  2173. #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
  2174. /* free all ech configs in the list */
  2175. static void FreeEchConfigs(WOLFSSL_EchConfig* configs, void* heap)
  2176. {
  2177. WOLFSSL_EchConfig* working_config = configs;
  2178. WOLFSSL_EchConfig* next_config;
  2179. while (working_config != NULL) {
  2180. next_config = working_config->next;
  2181. XFREE(working_config->cipherSuites, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2182. XFREE(working_config->publicName, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2183. if (working_config->raw != NULL)
  2184. XFREE(working_config->raw, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2185. if (working_config->receiverPrivkey != NULL) {
  2186. wc_HpkeFreeKey(NULL, working_config->kemId,
  2187. working_config->receiverPrivkey, heap);
  2188. }
  2189. XFREE(working_config, heap, DYNAMIC_TYPE_TMP_BUFFER);
  2190. working_config = next_config;
  2191. }
  2192. (void)heap;
  2193. }
  2194. #endif
  2195. /* In case contexts are held in array and don't want to free actual ctx. */
  2196. /* The allocations done in InitSSL_Ctx must be free'd with ctx->onHeapHint
  2197. * logic. A WOLFSSL_CTX can be assigned a static memory heap hint using
  2198. * wolfSSL_CTX_load_static_memory after CTX creation, which means variables
  2199. * allocated in InitSSL_Ctx were allocated from heap and should be free'd with
  2200. * a NULL heap hint. */
  2201. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  2202. {
  2203. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
  2204. defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
  2205. int i;
  2206. #endif
  2207. void* heapAtCTXInit = ctx->heap;
  2208. #ifdef WOLFSSL_STATIC_MEMORY
  2209. if (ctx->onHeapHint == 0) {
  2210. heapAtCTXInit = NULL;
  2211. }
  2212. #endif
  2213. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2214. wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
  2215. #endif
  2216. #ifdef HAVE_WOLF_EVENT
  2217. wolfEventQueue_Free(&ctx->event_queue);
  2218. #endif /* HAVE_WOLF_EVENT */
  2219. XFREE(ctx->method, heapAtCTXInit, DYNAMIC_TYPE_METHOD);
  2220. ctx->method = NULL;
  2221. if (ctx->suites) {
  2222. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  2223. ctx->suites = NULL;
  2224. }
  2225. #ifndef NO_DH
  2226. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2227. ctx->serverDH_G.buffer = NULL;
  2228. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2229. ctx->serverDH_P.buffer = NULL;
  2230. #endif /* !NO_DH */
  2231. #ifdef SINGLE_THREADED
  2232. if (ctx->rng) {
  2233. wc_FreeRng(ctx->rng);
  2234. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  2235. ctx->rng = NULL;
  2236. }
  2237. #endif /* SINGLE_THREADED */
  2238. #ifndef NO_CERTS
  2239. if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) {
  2240. ForceZero(ctx->privateKey->buffer, ctx->privateKey->length);
  2241. }
  2242. FreeDer(&ctx->privateKey);
  2243. #ifdef WOLFSSL_DUAL_ALG_CERTS
  2244. if (ctx->altPrivateKey != NULL && ctx->altPrivateKey->buffer != NULL) {
  2245. ForceZero(ctx->altPrivateKey->buffer, ctx->altPrivateKey->length);
  2246. }
  2247. FreeDer(&ctx->altPrivateKey);
  2248. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  2249. #ifdef OPENSSL_ALL
  2250. wolfSSL_EVP_PKEY_free(ctx->privateKeyPKey);
  2251. #endif
  2252. FreeDer(&ctx->certificate);
  2253. #ifdef KEEP_OUR_CERT
  2254. if (ctx->ourCert && ctx->ownOurCert) {
  2255. wolfSSL_X509_free(ctx->ourCert);
  2256. ctx->ourCert = NULL;
  2257. }
  2258. #endif /* KEEP_OUR_CERT */
  2259. FreeDer(&ctx->certChain);
  2260. wolfSSL_CertManagerFree(ctx->cm);
  2261. ctx->cm = NULL;
  2262. #ifdef OPENSSL_ALL
  2263. if (ctx->x509_store.objs != NULL) {
  2264. wolfSSL_sk_X509_OBJECT_pop_free(ctx->x509_store.objs, NULL);
  2265. ctx->x509_store.objs = NULL;
  2266. }
  2267. #endif
  2268. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
  2269. defined(WOLFSSL_WPAS_SMALL)
  2270. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  2271. #endif
  2272. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  2273. wolfSSL_sk_X509_NAME_pop_free(ctx->client_ca_names, NULL);
  2274. ctx->client_ca_names = NULL;
  2275. #endif
  2276. #ifdef OPENSSL_EXTRA
  2277. if (ctx->x509Chain) {
  2278. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  2279. ctx->x509Chain = NULL;
  2280. }
  2281. #endif
  2282. #endif /* !NO_CERTS */
  2283. #ifdef HAVE_TLS_EXTENSIONS
  2284. #if !defined(NO_TLS)
  2285. TLSX_FreeAll(ctx->extensions, ctx->heap);
  2286. #endif /* !NO_TLS */
  2287. #ifndef NO_WOLFSSL_SERVER
  2288. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  2289. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  2290. if (ctx->certOcspRequest) {
  2291. FreeOcspRequest(ctx->certOcspRequest);
  2292. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2293. }
  2294. #endif
  2295. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2296. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  2297. if (ctx->chainOcspRequest[i]) {
  2298. FreeOcspRequest(ctx->chainOcspRequest[i]);
  2299. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2300. ctx->chainOcspRequest[i] = NULL;
  2301. }
  2302. }
  2303. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2304. #endif /* !NO_WOLFSSL_SERVER */
  2305. #endif /* HAVE_TLS_EXTENSIONS */
  2306. #ifdef OPENSSL_EXTRA
  2307. if (ctx->alpn_cli_protos) {
  2308. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  2309. ctx->alpn_cli_protos = NULL;
  2310. }
  2311. if (ctx->param) {
  2312. XFREE(ctx->param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2313. ctx->param = NULL;
  2314. }
  2315. if (ctx->x509_store.lookup.dirs) {
  2316. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  2317. if (ctx->x509_store.lookup.dirs->dir_entry) {
  2318. wolfSSL_sk_BY_DIR_entry_free(ctx->x509_store.lookup.dirs->dir_entry);
  2319. }
  2320. #endif
  2321. wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
  2322. XFREE(ctx->x509_store.lookup.dirs, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2323. }
  2324. #endif
  2325. #ifdef WOLFSSL_STATIC_EPHEMERAL
  2326. #ifndef NO_DH
  2327. FreeDer(&ctx->staticKE.dhKey);
  2328. #endif
  2329. #ifdef HAVE_ECC
  2330. FreeDer(&ctx->staticKE.ecKey);
  2331. #endif
  2332. #ifdef HAVE_CURVE25519
  2333. FreeDer(&ctx->staticKE.x25519Key);
  2334. #endif
  2335. #ifdef HAVE_CURVE448
  2336. FreeDer(&ctx->staticKE.x448Key);
  2337. #endif
  2338. #ifndef SINGLE_THREADED
  2339. if (ctx->staticKELockInit) {
  2340. wc_FreeMutex(&ctx->staticKELock);
  2341. ctx->staticKELockInit = 0;
  2342. }
  2343. #endif
  2344. #endif
  2345. #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
  2346. FreeEchConfigs(ctx->echConfigs, ctx->heap);
  2347. ctx->echConfigs = NULL;
  2348. #endif
  2349. (void)heapAtCTXInit;
  2350. }
  2351. #ifdef WOLFSSL_STATIC_MEMORY
  2352. static void SSL_CtxResourceFreeStaticMem(void* heap)
  2353. {
  2354. if (heap != NULL
  2355. #ifdef WOLFSSL_HEAP_TEST
  2356. /* avoid dereferencing a test value */
  2357. && heap != (void*)WOLFSSL_HEAP_TEST
  2358. #endif
  2359. ) {
  2360. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)heap;
  2361. WOLFSSL_HEAP* mem = hint->memory;
  2362. wc_FreeMutex(&mem->memory_mutex);
  2363. }
  2364. }
  2365. #endif /* WOLFSSL_STATIC_MEMORY */
  2366. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  2367. {
  2368. int isZero;
  2369. int ret;
  2370. void* heap = ctx->heap;
  2371. #ifdef WOLFSSL_STATIC_MEMORY
  2372. if (ctx->onHeapHint == 0) {
  2373. heap = NULL;
  2374. }
  2375. #endif
  2376. /* decrement CTX reference count */
  2377. wolfSSL_RefDec(&ctx->ref, &isZero, &ret);
  2378. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  2379. if (ret < 0) {
  2380. /* check error state, if mutex error code then mutex init failed but
  2381. * CTX was still malloc'd */
  2382. if (ctx->err == CTX_INIT_MUTEX_E) {
  2383. SSL_CtxResourceFree(ctx);
  2384. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2385. #ifdef WOLFSSL_STATIC_MEMORY
  2386. SSL_CtxResourceFreeStaticMem(heap);
  2387. #endif
  2388. }
  2389. return;
  2390. }
  2391. #else
  2392. (void)ret;
  2393. #endif
  2394. if (isZero) {
  2395. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  2396. SSL_CtxResourceFree(ctx);
  2397. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  2398. !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  2399. TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
  2400. #endif
  2401. wolfSSL_RefFree(&ctx->ref);
  2402. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2403. #ifdef WOLFSSL_STATIC_MEMORY
  2404. SSL_CtxResourceFreeStaticMem(heap);
  2405. #endif
  2406. }
  2407. else {
  2408. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  2409. }
  2410. (void)heap; /* not used in some builds */
  2411. }
  2412. /* Set cipher pointers to null */
  2413. void InitCiphers(WOLFSSL* ssl)
  2414. {
  2415. #ifdef BUILD_ARC4
  2416. ssl->encrypt.arc4 = NULL;
  2417. ssl->decrypt.arc4 = NULL;
  2418. #endif
  2419. #ifdef BUILD_DES3
  2420. ssl->encrypt.des3 = NULL;
  2421. ssl->decrypt.des3 = NULL;
  2422. #endif
  2423. #ifdef BUILD_AES
  2424. ssl->encrypt.aes = NULL;
  2425. ssl->decrypt.aes = NULL;
  2426. #endif
  2427. #ifdef HAVE_ARIA
  2428. ssl->encrypt.aria = NULL;
  2429. ssl->decrypt.aria = NULL;
  2430. #endif
  2431. #ifdef HAVE_CAMELLIA
  2432. ssl->encrypt.cam = NULL;
  2433. ssl->decrypt.cam = NULL;
  2434. #endif
  2435. #ifdef HAVE_CHACHA
  2436. ssl->encrypt.chacha = NULL;
  2437. ssl->decrypt.chacha = NULL;
  2438. #endif
  2439. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2440. ssl->auth.poly1305 = NULL;
  2441. #endif
  2442. ssl->encrypt.setup = 0;
  2443. ssl->decrypt.setup = 0;
  2444. #ifdef HAVE_ONE_TIME_AUTH
  2445. ssl->auth.setup = 0;
  2446. #endif
  2447. #ifdef WOLFSSL_DTLS13
  2448. XMEMSET(&ssl->dtlsRecordNumberEncrypt, 0,
  2449. sizeof(ssl->dtlsRecordNumberEncrypt));
  2450. XMEMSET(&ssl->dtlsRecordNumberDecrypt, 0,
  2451. sizeof(ssl->dtlsRecordNumberEncrypt));
  2452. #endif /* WOLFSSL_DTLS13 */
  2453. }
  2454. /* Free ciphers */
  2455. void FreeCiphers(WOLFSSL* ssl)
  2456. {
  2457. (void)ssl;
  2458. #ifdef BUILD_ARC4
  2459. wc_Arc4Free(ssl->encrypt.arc4);
  2460. wc_Arc4Free(ssl->decrypt.arc4);
  2461. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2462. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2463. #endif
  2464. #ifdef BUILD_DES3
  2465. wc_Des3Free(ssl->encrypt.des3);
  2466. wc_Des3Free(ssl->decrypt.des3);
  2467. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2468. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2469. #endif
  2470. #if defined(BUILD_AES) || defined(BUILD_AESGCM) || defined(HAVE_ARIA)
  2471. /* See: InitKeys() in keys.c on addition of BUILD_AESGCM check (enc->aes, dec->aes) */
  2472. wc_AesFree(ssl->encrypt.aes);
  2473. wc_AesFree(ssl->decrypt.aes);
  2474. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2475. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2476. #endif
  2477. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  2478. wc_Sm4Free(ssl->encrypt.sm4);
  2479. wc_Sm4Free(ssl->decrypt.sm4);
  2480. XFREE(ssl->encrypt.sm4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2481. XFREE(ssl->decrypt.sm4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2482. #endif
  2483. #if (defined(BUILD_AESGCM) || defined(BUILD_AESCCM) || defined(HAVE_ARIA)) && \
  2484. !defined(WOLFSSL_NO_TLS12)
  2485. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2486. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2487. #endif
  2488. #ifdef CIPHER_NONCE
  2489. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2490. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2491. #endif
  2492. #ifdef HAVE_ARIA
  2493. wc_AriaFreeCrypt(ssl->encrypt.aria);
  2494. wc_AriaFreeCrypt(ssl->decrypt.aria);
  2495. XFREE(ssl->encrypt.aria, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2496. XFREE(ssl->decrypt.aria, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2497. #endif
  2498. #ifdef HAVE_CAMELLIA
  2499. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2500. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2501. #endif
  2502. #ifdef HAVE_CHACHA
  2503. if (ssl->encrypt.chacha)
  2504. ForceZero(ssl->encrypt.chacha, sizeof(ChaCha));
  2505. if (ssl->decrypt.chacha)
  2506. ForceZero(ssl->decrypt.chacha, sizeof(ChaCha));
  2507. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2508. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2509. #endif
  2510. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2511. if (ssl->auth.poly1305)
  2512. ForceZero(ssl->auth.poly1305, sizeof(Poly1305));
  2513. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2514. #endif
  2515. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  2516. wc_HmacFree(ssl->encrypt.hmac);
  2517. wc_HmacFree(ssl->decrypt.hmac);
  2518. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2519. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2520. #endif
  2521. #ifdef WOLFSSL_DTLS13
  2522. #ifdef BUILD_AES
  2523. if (ssl->dtlsRecordNumberEncrypt.aes != NULL) {
  2524. wc_AesFree(ssl->dtlsRecordNumberEncrypt.aes);
  2525. XFREE(ssl->dtlsRecordNumberEncrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2526. ssl->dtlsRecordNumberEncrypt.aes = NULL;
  2527. }
  2528. if (ssl->dtlsRecordNumberDecrypt.aes != NULL) {
  2529. wc_AesFree(ssl->dtlsRecordNumberDecrypt.aes);
  2530. XFREE(ssl->dtlsRecordNumberDecrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2531. ssl->dtlsRecordNumberDecrypt.aes = NULL;
  2532. }
  2533. #endif /* BUILD_AES */
  2534. #ifdef HAVE_CHACHA
  2535. XFREE(ssl->dtlsRecordNumberEncrypt.chacha,
  2536. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2537. XFREE(ssl->dtlsRecordNumberDecrypt.chacha,
  2538. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2539. ssl->dtlsRecordNumberEncrypt.chacha = NULL;
  2540. ssl->dtlsRecordNumberDecrypt.chacha = NULL;
  2541. #endif /* HAVE_CHACHA */
  2542. #endif /* WOLFSSL_DTLS13 */
  2543. }
  2544. void InitCipherSpecs(CipherSpecs* cs)
  2545. {
  2546. XMEMSET(cs, 0, sizeof(CipherSpecs));
  2547. cs->bulk_cipher_algorithm = INVALID_BYTE;
  2548. cs->cipher_type = INVALID_BYTE;
  2549. cs->mac_algorithm = INVALID_BYTE;
  2550. cs->kea = INVALID_BYTE;
  2551. cs->sig_algo = INVALID_BYTE;
  2552. }
  2553. #if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
  2554. defined(HAVE_ECC))
  2555. static int GetMacDigestSize(byte macAlgo)
  2556. {
  2557. switch (macAlgo) {
  2558. #ifndef NO_SHA
  2559. case sha_mac:
  2560. return WC_SHA_DIGEST_SIZE;
  2561. #endif
  2562. #ifndef NO_SHA256
  2563. case sha256_mac:
  2564. return WC_SHA256_DIGEST_SIZE;
  2565. #endif
  2566. #ifdef WOLFSSL_SHA384
  2567. case sha384_mac:
  2568. return WC_SHA384_DIGEST_SIZE;
  2569. #endif
  2570. #ifdef WOLFSSL_SHA512
  2571. case sha512_mac:
  2572. return WC_SHA512_DIGEST_SIZE;
  2573. #endif
  2574. #ifdef WOLFSSL_SM3
  2575. case sm3_mac:
  2576. return WC_SM3_DIGEST_SIZE;
  2577. #endif
  2578. default:
  2579. break;
  2580. }
  2581. return NOT_COMPILED_IN;
  2582. }
  2583. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO || (WOLFSSL_TLS13 && HAVE_ECC) */
  2584. #define ADD_HASH_SIG_ALGO(out, inOutIdx, major, minor) \
  2585. do { \
  2586. if ((out) != NULL) { \
  2587. (out)[*(inOutIdx) ] = (major); \
  2588. (out)[*(inOutIdx) + 1] = (minor); \
  2589. } \
  2590. *(inOutIdx) += 2; \
  2591. } while (0)
  2592. static WC_INLINE void AddSuiteHashSigAlgo(byte* hashSigAlgo, byte macAlgo,
  2593. byte sigAlgo, int keySz, word16* inOutIdx)
  2594. {
  2595. int addSigAlgo = 1;
  2596. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  2597. if (sigAlgo == ecc_dsa_sa_algo) {
  2598. int digestSz = GetMacDigestSize(macAlgo);
  2599. /* do not add sig/algos with digest size larger than key size */
  2600. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  2601. addSigAlgo = 0;
  2602. }
  2603. }
  2604. #else
  2605. (void)keySz;
  2606. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2607. if (addSigAlgo) {
  2608. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  2609. if (sigAlgo == sm2_sa_algo) {
  2610. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2611. SM2_SA_MAJOR, SM2_SA_MINOR);
  2612. }
  2613. else
  2614. #endif
  2615. #ifdef HAVE_ED25519
  2616. if (sigAlgo == ed25519_sa_algo) {
  2617. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2618. ED25519_SA_MAJOR, ED25519_SA_MINOR);
  2619. }
  2620. else
  2621. #endif
  2622. #ifdef HAVE_ED448
  2623. if (sigAlgo == ed448_sa_algo) {
  2624. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2625. ED448_SA_MAJOR, ED448_SA_MINOR);
  2626. }
  2627. else
  2628. #endif
  2629. #ifdef HAVE_PQC
  2630. #ifdef HAVE_FALCON
  2631. if (sigAlgo == falcon_level1_sa_algo) {
  2632. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2633. FALCON_LEVEL1_SA_MAJOR, FALCON_LEVEL1_SA_MINOR);
  2634. }
  2635. else
  2636. if (sigAlgo == falcon_level5_sa_algo) {
  2637. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2638. FALCON_LEVEL5_SA_MAJOR, FALCON_LEVEL5_SA_MINOR);
  2639. }
  2640. else
  2641. #endif /* HAVE_FALCON */
  2642. #ifdef HAVE_DILITHIUM
  2643. if (sigAlgo == dilithium_level2_sa_algo) {
  2644. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2645. DILITHIUM_LEVEL2_SA_MAJOR, DILITHIUM_LEVEL2_SA_MINOR);
  2646. }
  2647. else
  2648. if (sigAlgo == dilithium_level3_sa_algo) {
  2649. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2650. DILITHIUM_LEVEL3_SA_MAJOR, DILITHIUM_LEVEL3_SA_MINOR);
  2651. }
  2652. else
  2653. if (sigAlgo == dilithium_level5_sa_algo) {
  2654. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx,
  2655. DILITHIUM_LEVEL5_SA_MAJOR, DILITHIUM_LEVEL5_SA_MINOR);
  2656. }
  2657. else
  2658. #endif /* HAVE_DILITHIUM */
  2659. #endif /* HAVE_PQC */
  2660. #ifdef WC_RSA_PSS
  2661. if (sigAlgo == rsa_pss_sa_algo) {
  2662. /* RSA PSS is sig then mac */
  2663. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, sigAlgo, macAlgo);
  2664. #ifdef WOLFSSL_TLS13
  2665. /* Add the certificate algorithm as well */
  2666. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, sigAlgo,
  2667. PSS_RSAE_TO_PSS_PSS(macAlgo));
  2668. #endif
  2669. }
  2670. else
  2671. #endif
  2672. {
  2673. ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, macAlgo, sigAlgo);
  2674. }
  2675. }
  2676. }
  2677. void InitSuitesHashSigAlgo_ex2(byte* hashSigAlgo, int haveSig, int tls1_2,
  2678. int keySz, word16* len)
  2679. {
  2680. word16 idx = 0;
  2681. (void)tls1_2;
  2682. (void)keySz;
  2683. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  2684. if (haveSig & SIG_ECDSA) {
  2685. #ifdef HAVE_ECC
  2686. #ifdef WOLFSSL_SHA512
  2687. AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, ecc_dsa_sa_algo, keySz,
  2688. &idx);
  2689. #endif
  2690. #ifdef WOLFSSL_SHA384
  2691. AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, ecc_dsa_sa_algo, keySz,
  2692. &idx);
  2693. #endif
  2694. #ifndef NO_SHA256
  2695. AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, ecc_dsa_sa_algo, keySz,
  2696. &idx);
  2697. #endif
  2698. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2699. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2700. AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  2701. #endif
  2702. #endif
  2703. #ifdef HAVE_ED25519
  2704. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, ed25519_sa_algo, keySz, &idx);
  2705. #endif
  2706. #ifdef HAVE_ED448
  2707. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, ed448_sa_algo, keySz, &idx);
  2708. #endif
  2709. }
  2710. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  2711. #if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  2712. if (haveSig & SIG_SM2) {
  2713. AddSuiteHashSigAlgo(hashSigAlgo, sm3_mac, sm2_sa_algo, keySz,
  2714. &idx);
  2715. }
  2716. #endif
  2717. #if defined(HAVE_PQC)
  2718. #ifdef HAVE_FALCON
  2719. if (haveSig & SIG_FALCON) {
  2720. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, falcon_level1_sa_algo, keySz,
  2721. &idx);
  2722. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, falcon_level5_sa_algo, keySz,
  2723. &idx);
  2724. }
  2725. #endif /* HAVE_FALCON */
  2726. #ifdef HAVE_DILITHIUM
  2727. if (haveSig & SIG_DILITHIUM) {
  2728. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level2_sa_algo,
  2729. keySz, &idx);
  2730. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level3_sa_algo,
  2731. keySz, &idx);
  2732. AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level5_sa_algo,
  2733. keySz, &idx);
  2734. }
  2735. #endif /* HAVE_DILITHIUM */
  2736. #endif /* HAVE_PQC */
  2737. if (haveSig & SIG_RSA) {
  2738. #ifdef WC_RSA_PSS
  2739. if (tls1_2) {
  2740. #ifdef WOLFSSL_SHA512
  2741. AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, rsa_pss_sa_algo, keySz,
  2742. &idx);
  2743. #endif
  2744. #ifdef WOLFSSL_SHA384
  2745. AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, rsa_pss_sa_algo, keySz,
  2746. &idx);
  2747. #endif
  2748. #ifndef NO_SHA256
  2749. AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, rsa_pss_sa_algo, keySz,
  2750. &idx);
  2751. #endif
  2752. }
  2753. #endif
  2754. #ifdef WOLFSSL_SHA512
  2755. AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, rsa_sa_algo, keySz, &idx);
  2756. #endif
  2757. #ifdef WOLFSSL_SHA384
  2758. AddSuiteHashSigAlgo(hashSigAlgo, sha384_mac, rsa_sa_algo, keySz, &idx);
  2759. #endif
  2760. #ifndef NO_SHA256
  2761. AddSuiteHashSigAlgo(hashSigAlgo, sha256_mac, rsa_sa_algo, keySz, &idx);
  2762. #endif
  2763. #ifdef WOLFSSL_SHA224
  2764. AddSuiteHashSigAlgo(hashSigAlgo, sha224_mac, rsa_sa_algo, keySz, &idx);
  2765. #endif
  2766. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2767. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2768. AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, rsa_sa_algo, keySz, &idx);
  2769. #endif
  2770. }
  2771. #ifdef HAVE_ANON
  2772. if (haveSig & SIG_ANON) {
  2773. AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, anonymous_sa_algo, keySz,
  2774. &idx);
  2775. }
  2776. #endif
  2777. *len = idx;
  2778. }
  2779. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  2780. int haveFalconSig, int haveDilithiumSig, int haveAnon, int tls1_2,
  2781. int keySz)
  2782. {
  2783. InitSuitesHashSigAlgo_ex(suites->hashSigAlgo, haveECDSAsig, haveRSAsig,
  2784. haveFalconSig, haveDilithiumSig, haveAnon, tls1_2, keySz,
  2785. &suites->hashSigAlgoSz);
  2786. }
  2787. void InitSuitesHashSigAlgo_ex(byte* hashSigAlgo, int haveECDSAsig,
  2788. int haveRSAsig, int haveFalconSig, int haveDilithiumSig, int haveAnon,
  2789. int tls1_2, int keySz, word16* len)
  2790. {
  2791. int have = 0;
  2792. if (haveECDSAsig) have |= SIG_ECDSA;
  2793. if (haveRSAsig) have |= SIG_RSA;
  2794. if (haveFalconSig) have |= SIG_FALCON;
  2795. if (haveDilithiumSig) have |= SIG_DILITHIUM;
  2796. if (haveAnon) have |= SIG_ANON;
  2797. InitSuitesHashSigAlgo_ex2(hashSigAlgo, have, tls1_2, keySz, len);
  2798. }
  2799. int AllocateCtxSuites(WOLFSSL_CTX* ctx)
  2800. {
  2801. if (ctx->suites == NULL) {
  2802. ctx->suites = (Suites*)XMALLOC(sizeof(Suites), ctx->heap,
  2803. DYNAMIC_TYPE_SUITES);
  2804. if (ctx->suites == NULL) {
  2805. WOLFSSL_MSG("Memory alloc for Suites failed");
  2806. return MEMORY_ERROR;
  2807. }
  2808. XMEMSET(ctx->suites, 0, sizeof(Suites));
  2809. }
  2810. return 0;
  2811. }
  2812. /* Call this when the ssl object needs to have its own ssl->suites object */
  2813. int AllocateSuites(WOLFSSL* ssl)
  2814. {
  2815. if (ssl->suites == NULL) {
  2816. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  2817. DYNAMIC_TYPE_SUITES);
  2818. if (ssl->suites == NULL) {
  2819. WOLFSSL_MSG("Suites Memory error");
  2820. return MEMORY_ERROR;
  2821. }
  2822. if (ssl->ctx != NULL && ssl->ctx->suites != NULL)
  2823. XMEMCPY(ssl->suites, ssl->ctx->suites, sizeof(Suites));
  2824. else
  2825. XMEMSET(ssl->suites, 0, sizeof(Suites));
  2826. }
  2827. return 0;
  2828. }
  2829. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  2830. word16 havePSK, word16 haveDH, word16 haveECDSAsig,
  2831. word16 haveECC, word16 haveStaticRSA, word16 haveStaticECC,
  2832. word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon,
  2833. word16 haveNull, int side)
  2834. {
  2835. word16 idx = 0;
  2836. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  2837. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  2838. #ifdef WOLFSSL_TLS13
  2839. int tls1_3 = IsAtLeastTLSv1_3(pv);
  2840. #endif
  2841. int dtls = 0;
  2842. int haveRSAsig = 1;
  2843. #ifdef WOLFSSL_DTLS
  2844. /* If DTLS v1.2 or later than set tls1_2 flag */
  2845. if (pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_2_MINOR) {
  2846. tls1_2 = 1;
  2847. }
  2848. #endif
  2849. (void)tls; /* shut up compiler */
  2850. (void)tls1_2;
  2851. (void)dtls;
  2852. (void)haveDH;
  2853. (void)havePSK;
  2854. (void)haveStaticRSA;
  2855. (void)haveStaticECC;
  2856. (void)haveECC;
  2857. (void)side;
  2858. (void)haveRSA; /* some builds won't read */
  2859. (void)haveRSAsig; /* non ecc builds won't read */
  2860. (void)haveAnon; /* anon ciphers optional */
  2861. (void)haveNull;
  2862. (void)haveFalconSig;
  2863. (void)haveDilithiumSig;
  2864. if (suites == NULL) {
  2865. WOLFSSL_MSG("InitSuites pointer error");
  2866. return;
  2867. }
  2868. if (suites->setSuites)
  2869. return; /* trust user settings, don't override */
  2870. #ifdef WOLFSSL_TLS13
  2871. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  2872. if (tls1_3) {
  2873. suites->suites[idx++] = TLS13_BYTE;
  2874. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  2875. }
  2876. #endif
  2877. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  2878. if (tls1_3) {
  2879. suites->suites[idx++] = TLS13_BYTE;
  2880. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  2881. }
  2882. #endif
  2883. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  2884. if (tls1_3) {
  2885. suites->suites[idx++] = TLS13_BYTE;
  2886. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  2887. }
  2888. #endif
  2889. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  2890. if (tls1_3) {
  2891. suites->suites[idx++] = TLS13_BYTE;
  2892. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  2893. }
  2894. #endif
  2895. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  2896. if (tls1_3) {
  2897. suites->suites[idx++] = TLS13_BYTE;
  2898. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  2899. }
  2900. #endif
  2901. #ifdef BUILD_TLS_SM4_GCM_SM3
  2902. if (tls1_3) {
  2903. suites->suites[idx++] = CIPHER_BYTE;
  2904. suites->suites[idx++] = TLS_SM4_GCM_SM3;
  2905. }
  2906. #endif
  2907. #ifdef BUILD_TLS_SM4_CCM_SM3
  2908. if (tls1_3) {
  2909. suites->suites[idx++] = CIPHER_BYTE;
  2910. suites->suites[idx++] = TLS_SM4_CCM_SM3;
  2911. }
  2912. #endif
  2913. #ifdef HAVE_NULL_CIPHER
  2914. #ifdef BUILD_TLS_SHA256_SHA256
  2915. if (tls1_3 && haveNull) {
  2916. suites->suites[idx++] = ECC_BYTE;
  2917. suites->suites[idx++] = TLS_SHA256_SHA256;
  2918. }
  2919. #endif
  2920. #ifdef BUILD_TLS_SHA384_SHA384
  2921. if (tls1_3 && haveNull) {
  2922. suites->suites[idx++] = ECC_BYTE;
  2923. suites->suites[idx++] = TLS_SHA384_SHA384;
  2924. }
  2925. #endif
  2926. #endif
  2927. #endif /* WOLFSSL_TLS13 */
  2928. #ifndef WOLFSSL_NO_TLS12
  2929. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  2930. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  2931. haveRSA = 0; /* can't do RSA with ECDSA key */
  2932. }
  2933. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  2934. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  2935. }
  2936. #endif /* !NO_WOLFSSL_SERVER */
  2937. #ifdef NO_RSA
  2938. haveRSAsig = 0; /* can't have RSA sig if don't have RSA */
  2939. #endif
  2940. #ifdef WOLFSSL_DTLS
  2941. if (pv.major == DTLS_MAJOR) {
  2942. dtls = 1;
  2943. tls = 1;
  2944. /* May be dead assignments dependent upon configuration */
  2945. (void) dtls;
  2946. (void) tls;
  2947. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  2948. }
  2949. #endif
  2950. #ifdef HAVE_RENEGOTIATION_INDICATION
  2951. if (side == WOLFSSL_CLIENT_END) {
  2952. suites->suites[idx++] = CIPHER_BYTE;
  2953. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  2954. }
  2955. #endif
  2956. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2957. if (tls1_2 && haveECC) {
  2958. suites->suites[idx++] = ECC_BYTE;
  2959. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2960. }
  2961. #endif
  2962. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2963. if (tls1_2 && haveECC) {
  2964. suites->suites[idx++] = ECC_BYTE;
  2965. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2966. }
  2967. #endif
  2968. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2969. /* OpenSSL enables ECDHE when using ECDHE aliases without RSA */
  2970. #ifdef OPENSSL_EXTRA
  2971. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  2972. #else
  2973. if (tls1_2 && haveRSA) {
  2974. #endif
  2975. suites->suites[idx++] = ECC_BYTE;
  2976. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2977. }
  2978. #endif
  2979. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2980. #ifdef OPENSSL_EXTRA
  2981. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  2982. #else
  2983. if (tls1_2 && haveRSA) {
  2984. #endif
  2985. suites->suites[idx++] = ECC_BYTE;
  2986. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2987. }
  2988. #endif
  2989. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2990. if (tls1_2 && haveDH && haveRSA) {
  2991. suites->suites[idx++] = CIPHER_BYTE;
  2992. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2993. }
  2994. #endif
  2995. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2996. if (tls1_2 && haveDH && haveRSA) {
  2997. suites->suites[idx++] = CIPHER_BYTE;
  2998. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2999. }
  3000. #endif
  3001. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  3002. if (tls1_2 && haveRSA && haveStaticRSA) {
  3003. suites->suites[idx++] = CIPHER_BYTE;
  3004. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  3005. }
  3006. #endif
  3007. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  3008. if (tls1_2 && haveRSA && haveStaticRSA) {
  3009. suites->suites[idx++] = CIPHER_BYTE;
  3010. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  3011. }
  3012. #endif
  3013. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  3014. if (tls1_2 && haveECC && haveStaticECC) {
  3015. suites->suites[idx++] = ECC_BYTE;
  3016. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  3017. }
  3018. #endif
  3019. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  3020. if (tls1_2 && haveECC && haveStaticECC) {
  3021. suites->suites[idx++] = ECC_BYTE;
  3022. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  3023. }
  3024. #endif
  3025. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  3026. if (tls1_2 && haveRSAsig && haveStaticECC) {
  3027. suites->suites[idx++] = ECC_BYTE;
  3028. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  3029. }
  3030. #endif
  3031. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  3032. if (tls1_2 && haveRSAsig && haveStaticECC) {
  3033. suites->suites[idx++] = ECC_BYTE;
  3034. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  3035. }
  3036. #endif
  3037. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
  3038. if (tls1_2 && haveECC) {
  3039. suites->suites[idx++] = ECC_BYTE;
  3040. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384;
  3041. }
  3042. #endif
  3043. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
  3044. if (tls1_2 && haveECC) {
  3045. suites->suites[idx++] = ECC_BYTE;
  3046. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256;
  3047. }
  3048. #endif
  3049. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  3050. if (tls1_2 && haveDH && havePSK) {
  3051. suites->suites[idx++] = CIPHER_BYTE;
  3052. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  3053. }
  3054. #endif
  3055. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  3056. if (tls1_2 && haveDH && haveAnon) {
  3057. suites->suites[idx++] = CIPHER_BYTE;
  3058. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  3059. }
  3060. #endif
  3061. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  3062. if (tls1_2 && haveDH && haveAnon) {
  3063. suites->suites[idx++] = CIPHER_BYTE;
  3064. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  3065. }
  3066. #endif
  3067. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  3068. if (tls1_2 && haveDH && havePSK) {
  3069. suites->suites[idx++] = CIPHER_BYTE;
  3070. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  3071. }
  3072. #endif
  3073. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  3074. if (tls1_2 && havePSK) {
  3075. suites->suites[idx++] = CIPHER_BYTE;
  3076. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  3077. }
  3078. #endif
  3079. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  3080. if (tls1_2 && havePSK) {
  3081. suites->suites[idx++] = CIPHER_BYTE;
  3082. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  3083. }
  3084. #endif
  3085. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  3086. if (tls1_2 && haveECC) {
  3087. suites->suites[idx++] = CHACHA_BYTE;
  3088. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  3089. }
  3090. #endif
  3091. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  3092. #ifdef OPENSSL_EXTRA
  3093. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  3094. #else
  3095. if (tls1_2 && haveRSA) {
  3096. #endif
  3097. suites->suites[idx++] = CHACHA_BYTE;
  3098. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  3099. }
  3100. #endif
  3101. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  3102. if (tls1_2 && haveRSA) {
  3103. suites->suites[idx++] = CHACHA_BYTE;
  3104. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  3105. }
  3106. #endif
  3107. /* Place as higher priority for MYSQL */
  3108. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  3109. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  3110. if (tls && haveDH && haveRSA) {
  3111. suites->suites[idx++] = CIPHER_BYTE;
  3112. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  3113. }
  3114. #endif
  3115. #endif
  3116. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  3117. #ifdef OPENSSL_EXTRA
  3118. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  3119. #else
  3120. if (tls1_2 && haveRSA) {
  3121. #endif
  3122. suites->suites[idx++] = ECC_BYTE;
  3123. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  3124. }
  3125. #endif
  3126. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  3127. if (tls1_2 && haveECC) {
  3128. suites->suites[idx++] = ECC_BYTE;
  3129. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  3130. }
  3131. #endif
  3132. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  3133. if (tls1_2 && haveRSAsig && haveStaticECC) {
  3134. suites->suites[idx++] = ECC_BYTE;
  3135. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  3136. }
  3137. #endif
  3138. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  3139. if (tls1_2 && haveECC && haveStaticECC) {
  3140. suites->suites[idx++] = ECC_BYTE;
  3141. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  3142. }
  3143. #endif
  3144. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  3145. #ifdef OPENSSL_EXTRA
  3146. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  3147. #else
  3148. if (tls1_2 && haveRSA) {
  3149. #endif
  3150. suites->suites[idx++] = ECC_BYTE;
  3151. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  3152. }
  3153. #endif
  3154. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  3155. if (tls1_2 && haveECC) {
  3156. suites->suites[idx++] = ECC_BYTE;
  3157. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  3158. }
  3159. #endif
  3160. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  3161. if (tls1_2 && haveRSAsig && haveStaticECC) {
  3162. suites->suites[idx++] = ECC_BYTE;
  3163. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  3164. }
  3165. #endif
  3166. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  3167. if (tls1_2 && haveECC && haveStaticECC) {
  3168. suites->suites[idx++] = ECC_BYTE;
  3169. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  3170. }
  3171. #endif
  3172. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  3173. if (tls && haveECC) {
  3174. suites->suites[idx++] = ECC_BYTE;
  3175. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  3176. }
  3177. #endif
  3178. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  3179. if (tls && haveECC && haveStaticECC) {
  3180. suites->suites[idx++] = ECC_BYTE;
  3181. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  3182. }
  3183. #endif
  3184. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  3185. if (tls && haveECC) {
  3186. suites->suites[idx++] = ECC_BYTE;
  3187. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  3188. }
  3189. #endif
  3190. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  3191. if (tls && haveECC && haveStaticECC) {
  3192. suites->suites[idx++] = ECC_BYTE;
  3193. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  3194. }
  3195. #endif
  3196. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  3197. if (!dtls && tls && haveECC) {
  3198. suites->suites[idx++] = ECC_BYTE;
  3199. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  3200. }
  3201. #endif
  3202. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  3203. if (!dtls && tls && haveECC && haveStaticECC) {
  3204. suites->suites[idx++] = ECC_BYTE;
  3205. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  3206. }
  3207. #endif
  3208. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  3209. if (tls && haveECC) {
  3210. suites->suites[idx++] = ECC_BYTE;
  3211. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  3212. }
  3213. #endif
  3214. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  3215. if (tls && haveECC && haveStaticECC) {
  3216. suites->suites[idx++] = ECC_BYTE;
  3217. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  3218. }
  3219. #endif
  3220. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  3221. #ifdef OPENSSL_EXTRA
  3222. if ((tls && haveRSA) || (tls && haveECDSAsig)) {
  3223. #else
  3224. if (tls && haveRSA) {
  3225. #endif
  3226. suites->suites[idx++] = ECC_BYTE;
  3227. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  3228. }
  3229. #endif
  3230. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  3231. if (tls && haveRSAsig && haveStaticECC) {
  3232. suites->suites[idx++] = ECC_BYTE;
  3233. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  3234. }
  3235. #endif
  3236. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  3237. #ifdef OPENSSL_EXTRA
  3238. if ((tls && haveRSA) || (tls && haveECDSAsig)) {
  3239. #else
  3240. if (tls && haveRSA) {
  3241. #endif
  3242. suites->suites[idx++] = ECC_BYTE;
  3243. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  3244. }
  3245. #endif
  3246. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  3247. if (tls && haveRSAsig && haveStaticECC) {
  3248. suites->suites[idx++] = ECC_BYTE;
  3249. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  3250. }
  3251. #endif
  3252. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  3253. if (!dtls && tls && haveRSA) {
  3254. suites->suites[idx++] = ECC_BYTE;
  3255. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  3256. }
  3257. #endif
  3258. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  3259. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  3260. suites->suites[idx++] = ECC_BYTE;
  3261. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  3262. }
  3263. #endif
  3264. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  3265. #ifdef OPENSSL_EXTRA
  3266. if ((tls && haveRSA) || (tls && haveECDSAsig)) {
  3267. #else
  3268. if (tls && haveRSA) {
  3269. #endif
  3270. suites->suites[idx++] = ECC_BYTE;
  3271. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  3272. }
  3273. #endif
  3274. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  3275. if (tls && haveRSAsig && haveStaticECC) {
  3276. suites->suites[idx++] = ECC_BYTE;
  3277. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  3278. }
  3279. #endif
  3280. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  3281. if (tls1_2 && haveECC) {
  3282. suites->suites[idx++] = ECC_BYTE;
  3283. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  3284. }
  3285. #endif
  3286. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  3287. if (tls1_2 && haveECC) {
  3288. suites->suites[idx++] = ECC_BYTE;
  3289. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  3290. }
  3291. #endif
  3292. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  3293. if (tls1_2 && haveECC) {
  3294. suites->suites[idx++] = ECC_BYTE;
  3295. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  3296. }
  3297. #endif
  3298. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  3299. if (tls1_2 && haveRSA && haveStaticRSA) {
  3300. suites->suites[idx++] = ECC_BYTE;
  3301. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  3302. }
  3303. #endif
  3304. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  3305. if (tls1_2 && haveRSA && haveStaticRSA) {
  3306. suites->suites[idx++] = ECC_BYTE;
  3307. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  3308. }
  3309. #endif
  3310. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  3311. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3312. if (tls1_2 && haveDH && haveRSA)
  3313. #else
  3314. if (tls && haveDH && haveRSA)
  3315. #endif
  3316. {
  3317. suites->suites[idx++] = CIPHER_BYTE;
  3318. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  3319. }
  3320. #endif
  3321. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  3322. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3323. if (tls1_2 && haveDH && haveRSA)
  3324. #else
  3325. if (tls && haveDH && haveRSA)
  3326. #endif
  3327. {
  3328. suites->suites[idx++] = CIPHER_BYTE;
  3329. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  3330. }
  3331. #endif
  3332. /* Place as higher priority for MYSQL testing */
  3333. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  3334. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  3335. if (tls && haveDH && haveRSA) {
  3336. suites->suites[idx++] = CIPHER_BYTE;
  3337. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  3338. }
  3339. #endif
  3340. #endif
  3341. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  3342. if (tls && haveDH && haveRSA) {
  3343. suites->suites[idx++] = CIPHER_BYTE;
  3344. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  3345. }
  3346. #endif
  3347. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  3348. if (tls && haveDH && haveRSA) {
  3349. suites->suites[idx++] = CIPHER_BYTE;
  3350. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  3351. }
  3352. #endif
  3353. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  3354. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3355. if (tls1_2 && haveRSA && haveStaticRSA)
  3356. #else
  3357. if (tls && haveRSA && haveStaticRSA)
  3358. #endif
  3359. {
  3360. suites->suites[idx++] = CIPHER_BYTE;
  3361. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  3362. }
  3363. #endif
  3364. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  3365. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3366. if (tls1_2 && haveRSA && haveStaticRSA)
  3367. #else
  3368. if (tls && haveRSA && haveStaticRSA)
  3369. #endif
  3370. {
  3371. suites->suites[idx++] = CIPHER_BYTE;
  3372. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  3373. }
  3374. #endif
  3375. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  3376. if (tls && haveRSA && haveStaticRSA) {
  3377. suites->suites[idx++] = CIPHER_BYTE;
  3378. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  3379. }
  3380. #endif
  3381. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  3382. if (tls && haveRSA && haveStaticRSA) {
  3383. suites->suites[idx++] = CIPHER_BYTE;
  3384. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  3385. }
  3386. #endif
  3387. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3388. if (tls1_2 && haveECC) {
  3389. suites->suites[idx++] = CHACHA_BYTE;
  3390. suites->suites[idx++] =
  3391. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3392. }
  3393. #endif
  3394. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3395. #ifdef OPENSSL_EXTRA
  3396. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  3397. #else
  3398. if (tls1_2 && haveRSA) {
  3399. #endif
  3400. suites->suites[idx++] = CHACHA_BYTE;
  3401. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3402. }
  3403. #endif
  3404. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3405. #ifdef OPENSSL_EXTRA
  3406. if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
  3407. #else
  3408. if (tls1_2 && haveRSA) {
  3409. #endif
  3410. suites->suites[idx++] = CHACHA_BYTE;
  3411. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3412. }
  3413. #endif
  3414. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  3415. if (tls && haveECC && haveNull) {
  3416. suites->suites[idx++] = ECC_BYTE;
  3417. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  3418. }
  3419. #endif
  3420. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  3421. if (tls && haveRSA && haveNull && haveStaticRSA) {
  3422. suites->suites[idx++] = CIPHER_BYTE;
  3423. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  3424. }
  3425. #endif
  3426. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  3427. if (tls && haveRSA && haveNull && haveStaticRSA) {
  3428. suites->suites[idx++] = CIPHER_BYTE;
  3429. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  3430. }
  3431. #endif
  3432. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  3433. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3434. if (tls1_2 && haveRSA && haveNull && haveStaticRSA)
  3435. #else
  3436. if (tls && haveRSA && haveNull && haveStaticRSA)
  3437. #endif
  3438. {
  3439. suites->suites[idx++] = CIPHER_BYTE;
  3440. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  3441. }
  3442. #endif
  3443. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  3444. if (tls && havePSK) {
  3445. suites->suites[idx++] = CIPHER_BYTE;
  3446. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  3447. }
  3448. #endif
  3449. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  3450. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3451. if (tls1_2 && haveDH && havePSK)
  3452. #else
  3453. if (tls && haveDH && havePSK)
  3454. #endif
  3455. {
  3456. suites->suites[idx++] = CIPHER_BYTE;
  3457. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  3458. }
  3459. #endif
  3460. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  3461. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3462. if (tls1_2 && havePSK)
  3463. #else
  3464. if (tls && havePSK)
  3465. #endif
  3466. {
  3467. suites->suites[idx++] = CIPHER_BYTE;
  3468. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  3469. }
  3470. #endif
  3471. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  3472. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3473. if (tls1_2 && haveDH && havePSK)
  3474. #else
  3475. if (tls && haveDH && havePSK)
  3476. #endif
  3477. {
  3478. suites->suites[idx++] = CIPHER_BYTE;
  3479. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  3480. }
  3481. #endif
  3482. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  3483. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3484. if (tls1_2 && havePSK)
  3485. #else
  3486. if (tls1 && havePSK)
  3487. #endif
  3488. {
  3489. suites->suites[idx++] = CIPHER_BYTE;
  3490. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  3491. }
  3492. #endif
  3493. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  3494. if (tls && havePSK) {
  3495. suites->suites[idx++] = CIPHER_BYTE;
  3496. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  3497. }
  3498. #endif
  3499. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  3500. if (tls && haveDH && havePSK) {
  3501. suites->suites[idx++] = ECC_BYTE;
  3502. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  3503. }
  3504. #endif
  3505. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  3506. if (tls && haveDH && havePSK) {
  3507. suites->suites[idx++] = ECC_BYTE;
  3508. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  3509. }
  3510. #endif
  3511. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  3512. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3513. if (tls1_2 && havePSK)
  3514. #else
  3515. if (tls && havePSK)
  3516. #endif
  3517. {
  3518. suites->suites[idx++] = CHACHA_BYTE;
  3519. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3520. }
  3521. #endif
  3522. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3523. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3524. if (tls1_2 && havePSK)
  3525. #else
  3526. if (tls && havePSK)
  3527. #endif
  3528. {
  3529. suites->suites[idx++] = CHACHA_BYTE;
  3530. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3531. }
  3532. #endif
  3533. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3534. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3535. if (tls1_2 && havePSK)
  3536. #else
  3537. if (tls && havePSK)
  3538. #endif
  3539. {
  3540. suites->suites[idx++] = CHACHA_BYTE;
  3541. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3542. }
  3543. #endif
  3544. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  3545. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3546. if (tls1_2 && havePSK)
  3547. #else
  3548. if (tls && havePSK)
  3549. #endif
  3550. {
  3551. suites->suites[idx++] = ECC_BYTE;
  3552. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  3553. }
  3554. #endif
  3555. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
  3556. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3557. if (tls1_2 && havePSK)
  3558. #else
  3559. if (tls && havePSK)
  3560. #endif
  3561. {
  3562. suites->suites[idx++] = ECDHE_PSK_BYTE;
  3563. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256;
  3564. }
  3565. #endif
  3566. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  3567. if (tls && havePSK) {
  3568. suites->suites[idx++] = ECC_BYTE;
  3569. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  3570. }
  3571. #endif
  3572. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  3573. if (tls && havePSK) {
  3574. suites->suites[idx++] = ECC_BYTE;
  3575. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  3576. }
  3577. #endif
  3578. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  3579. if (tls && havePSK) {
  3580. suites->suites[idx++] = ECC_BYTE;
  3581. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  3582. }
  3583. #endif
  3584. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  3585. if (tls && havePSK) {
  3586. suites->suites[idx++] = ECC_BYTE;
  3587. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  3588. }
  3589. #endif
  3590. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  3591. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3592. if (tls1_2 && haveDH && havePSK)
  3593. #else
  3594. if (tls && haveDH && havePSK && haveNull)
  3595. #endif
  3596. {
  3597. suites->suites[idx++] = CIPHER_BYTE;
  3598. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  3599. }
  3600. #endif
  3601. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  3602. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3603. if (tls1_2 && havePSK && haveNull)
  3604. #else
  3605. if (tls && havePSK && haveNull)
  3606. #endif
  3607. {
  3608. suites->suites[idx++] = CIPHER_BYTE;
  3609. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  3610. }
  3611. #endif
  3612. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  3613. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3614. if (tls1_2 && havePSK && haveNull)
  3615. #else
  3616. if (tls && havePSK && haveNull)
  3617. #endif
  3618. {
  3619. suites->suites[idx++] = ECC_BYTE;
  3620. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  3621. }
  3622. #endif
  3623. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  3624. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3625. if (tls1_2 && haveDH && havePSK && haveNull)
  3626. #else
  3627. if (tls && haveDH && havePSK && haveNull)
  3628. #endif
  3629. {
  3630. suites->suites[idx++] = CIPHER_BYTE;
  3631. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  3632. }
  3633. #endif
  3634. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  3635. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3636. if (tls1_2 && havePSK && haveNull)
  3637. #else
  3638. if (tls && havePSK && haveNull)
  3639. #endif
  3640. {
  3641. suites->suites[idx++] = CIPHER_BYTE;
  3642. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  3643. }
  3644. #endif
  3645. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  3646. if (tls && havePSK && haveNull) {
  3647. suites->suites[idx++] = CIPHER_BYTE;
  3648. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  3649. }
  3650. #endif
  3651. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  3652. if (!dtls && haveRSA && haveStaticRSA) {
  3653. suites->suites[idx++] = CIPHER_BYTE;
  3654. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  3655. }
  3656. #endif
  3657. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  3658. if (!dtls && haveRSA && haveStaticRSA) {
  3659. suites->suites[idx++] = CIPHER_BYTE;
  3660. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  3661. }
  3662. #endif
  3663. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  3664. if (haveRSA && haveStaticRSA) {
  3665. suites->suites[idx++] = CIPHER_BYTE;
  3666. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  3667. }
  3668. #endif
  3669. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  3670. if (tls && haveRSA && haveStaticRSA) {
  3671. suites->suites[idx++] = CIPHER_BYTE;
  3672. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3673. }
  3674. #endif
  3675. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  3676. if (tls && haveDH && haveRSA && haveStaticRSA) {
  3677. suites->suites[idx++] = CIPHER_BYTE;
  3678. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3679. }
  3680. #endif
  3681. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  3682. if (tls && haveRSA && haveStaticRSA) {
  3683. suites->suites[idx++] = CIPHER_BYTE;
  3684. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3685. }
  3686. #endif
  3687. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  3688. if (tls && haveDH && haveRSA && haveStaticRSA) {
  3689. suites->suites[idx++] = CIPHER_BYTE;
  3690. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3691. }
  3692. #endif
  3693. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3694. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3695. if (tls1_2 && haveRSA && haveStaticRSA)
  3696. #else
  3697. if (tls && haveRSA && haveStaticRSA)
  3698. #endif
  3699. {
  3700. suites->suites[idx++] = CIPHER_BYTE;
  3701. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3702. }
  3703. #endif
  3704. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3705. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3706. if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
  3707. #else
  3708. if (tls && haveDH && haveRSA && haveStaticRSA)
  3709. #endif
  3710. {
  3711. suites->suites[idx++] = CIPHER_BYTE;
  3712. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3713. }
  3714. #endif
  3715. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3716. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3717. if (tls1_2 && haveRSA && haveStaticRSA)
  3718. #else
  3719. if (tls && haveRSA && haveStaticRSA)
  3720. #endif
  3721. {
  3722. suites->suites[idx++] = CIPHER_BYTE;
  3723. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3724. }
  3725. #endif
  3726. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3727. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3728. if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
  3729. #else
  3730. if (tls && haveDH && haveRSA && haveStaticRSA)
  3731. #endif
  3732. {
  3733. suites->suites[idx++] = CIPHER_BYTE;
  3734. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3735. }
  3736. #endif
  3737. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  3738. if (tls && haveECC) {
  3739. suites->suites[idx++] = SM_BYTE;
  3740. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3;
  3741. }
  3742. #endif
  3743. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  3744. if (tls && haveECC) {
  3745. suites->suites[idx++] = SM_BYTE;
  3746. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3;
  3747. }
  3748. #endif
  3749. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  3750. if (tls && haveECC) {
  3751. suites->suites[idx++] = SM_BYTE;
  3752. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3;
  3753. }
  3754. #endif
  3755. #endif /* !WOLFSSL_NO_TLS12 */
  3756. suites->suiteSz = idx;
  3757. if (suites->hashSigAlgoSz == 0) {
  3758. int haveSig = 0;
  3759. haveSig |= (haveRSAsig | haveRSA) ? SIG_RSA : 0;
  3760. haveSig |= (haveECDSAsig | haveECC) ? SIG_ECDSA : 0;
  3761. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  3762. haveSig |= (haveECDSAsig | haveECC) ? SIG_SM2 : 0;
  3763. #endif
  3764. haveSig |= haveFalconSig ? SIG_FALCON : 0;
  3765. haveSig |= haveDilithiumSig ? SIG_DILITHIUM : 0;
  3766. haveSig &= ~SIG_ANON;
  3767. InitSuitesHashSigAlgo_ex2(suites->hashSigAlgo, haveSig, tls1_2, keySz,
  3768. &suites->hashSigAlgoSz);
  3769. }
  3770. }
  3771. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  3772. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  3773. /* Decode the signature algorithm.
  3774. *
  3775. * input The encoded signature algorithm.
  3776. * hashalgo The hash algorithm.
  3777. * hsType The signature type.
  3778. */
  3779. void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  3780. {
  3781. *hsType = invalid_sa_algo;
  3782. switch (input[0]) {
  3783. case NEW_SA_MAJOR:
  3784. #ifdef HAVE_ED25519
  3785. /* ED25519: 0x0807 */
  3786. if (input[1] == ED25519_SA_MINOR) {
  3787. *hsType = ed25519_sa_algo;
  3788. /* Hash performed as part of sign/verify operation. */
  3789. *hashAlgo = sha512_mac;
  3790. }
  3791. else
  3792. #endif
  3793. #ifdef HAVE_ED448
  3794. /* ED448: 0x0808 */
  3795. if (input[1] == ED448_SA_MINOR) {
  3796. *hsType = ed448_sa_algo;
  3797. /* Hash performed as part of sign/verify operation. */
  3798. *hashAlgo = sha512_mac;
  3799. }
  3800. else
  3801. #endif
  3802. #ifdef WC_RSA_PSS
  3803. /* PSS PSS signatures: 0x080[9-b] */
  3804. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  3805. *hsType = rsa_pss_pss_algo;
  3806. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  3807. }
  3808. else
  3809. #endif
  3810. {
  3811. *hsType = input[0];
  3812. *hashAlgo = input[1];
  3813. }
  3814. break;
  3815. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  3816. case SM2_SA_MAJOR:
  3817. /* SM2: 0x0708 */
  3818. if (input[1] == SM2_SA_MINOR) {
  3819. *hsType = sm2_sa_algo;
  3820. /* Hash performed as part of sign/verify operation. */
  3821. *hashAlgo = sm3_mac;
  3822. }
  3823. break;
  3824. #endif
  3825. #ifdef HAVE_PQC
  3826. case PQC_SA_MAJOR:
  3827. /* Hash performed as part of sign/verify operation.
  3828. * However, if we want a dual alg signature with a
  3829. * classic algorithm as alternative, we need an explicit
  3830. * hash algo here.
  3831. */
  3832. #ifdef HAVE_FALCON
  3833. if (input[1] == FALCON_LEVEL1_SA_MINOR) {
  3834. *hsType = falcon_level1_sa_algo;
  3835. *hashAlgo = sha256_mac;
  3836. }
  3837. else if (input[1] == FALCON_LEVEL5_SA_MINOR) {
  3838. *hsType = falcon_level5_sa_algo;
  3839. *hashAlgo = sha512_mac;
  3840. }
  3841. #endif /* HAVE_FALCON */
  3842. #ifdef HAVE_DILITHIUM
  3843. if (input[1] == DILITHIUM_LEVEL2_SA_MINOR) {
  3844. *hsType = dilithium_level2_sa_algo;
  3845. *hashAlgo = sha256_mac;
  3846. }
  3847. else if (input[1] == DILITHIUM_LEVEL3_SA_MINOR) {
  3848. *hsType = dilithium_level3_sa_algo;
  3849. *hashAlgo = sha384_mac;
  3850. }
  3851. else if (input[1] == DILITHIUM_LEVEL5_SA_MINOR) {
  3852. *hsType = dilithium_level5_sa_algo;
  3853. *hashAlgo = sha512_mac;
  3854. }
  3855. #endif /* HAVE_DILITHIUM */
  3856. break;
  3857. #endif
  3858. default:
  3859. *hashAlgo = input[0];
  3860. *hsType = input[1];
  3861. break;
  3862. }
  3863. }
  3864. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  3865. #ifndef WOLFSSL_NO_TLS12
  3866. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3867. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  3868. defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
  3869. enum wc_HashType HashAlgoToType(int hashAlgo)
  3870. {
  3871. switch (hashAlgo) {
  3872. #ifdef WOLFSSL_SHA512
  3873. case sha512_mac:
  3874. return WC_HASH_TYPE_SHA512;
  3875. #endif
  3876. #ifdef WOLFSSL_SHA384
  3877. case sha384_mac:
  3878. return WC_HASH_TYPE_SHA384;
  3879. #endif
  3880. #ifdef WOLFSSL_SM3
  3881. case sm3_mac:
  3882. return WC_HASH_TYPE_SM3;
  3883. #endif
  3884. #ifndef NO_SHA256
  3885. case sha256_mac:
  3886. return WC_HASH_TYPE_SHA256;
  3887. #endif
  3888. #ifdef WOLFSSL_SHA224
  3889. case sha224_mac:
  3890. return WC_HASH_TYPE_SHA224;
  3891. #endif
  3892. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  3893. defined(WOLFSSL_ALLOW_TLS_SHA1))
  3894. case sha_mac:
  3895. return WC_HASH_TYPE_SHA;
  3896. #endif
  3897. default:
  3898. WOLFSSL_MSG("Bad hash sig algo");
  3899. break;
  3900. }
  3901. return WC_HASH_TYPE_NONE;
  3902. }
  3903. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  3904. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3905. #endif /* !WOLFSSL_NO_TLS12 */
  3906. #ifndef NO_CERTS
  3907. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
  3908. {
  3909. (void)dynamicFlag;
  3910. if (name != NULL) {
  3911. XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME));
  3912. name->name = name->staticName;
  3913. name->heap = heap;
  3914. name->dynamicName = 0;
  3915. }
  3916. }
  3917. void FreeX509Name(WOLFSSL_X509_NAME* name)
  3918. {
  3919. if (name != NULL) {
  3920. if (name->dynamicName) {
  3921. XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
  3922. name->name = NULL;
  3923. }
  3924. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3925. {
  3926. int i;
  3927. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  3928. if (name->entry[i].object != NULL)
  3929. wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
  3930. if (name->entry[i].value != NULL)
  3931. wolfSSL_ASN1_STRING_free(name->entry[i].value);
  3932. XMEMSET(&name->entry[i], 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  3933. }
  3934. }
  3935. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3936. #ifdef OPENSSL_ALL
  3937. if (name->entries) {
  3938. wolfSSL_sk_X509_NAME_ENTRY_free(name->entries);
  3939. name->entries = NULL;
  3940. }
  3941. #endif
  3942. }
  3943. }
  3944. /* Initialize wolfSSL X509 type */
  3945. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  3946. {
  3947. if (x509 == NULL) {
  3948. WOLFSSL_MSG("Null parameter passed in!");
  3949. return;
  3950. }
  3951. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  3952. x509->heap = heap;
  3953. InitX509Name(&x509->issuer, 0, heap);
  3954. InitX509Name(&x509->subject, 0, heap);
  3955. x509->dynamicMemory = (byte)dynamicFlag;
  3956. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  3957. {
  3958. int ret;
  3959. wolfSSL_RefInit(&x509->ref, &ret);
  3960. (void)ret;
  3961. }
  3962. #endif
  3963. }
  3964. /* Free wolfSSL X509 type */
  3965. void FreeX509(WOLFSSL_X509* x509)
  3966. {
  3967. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL) \
  3968. && defined( WOLFSSL_CUSTOM_OID)
  3969. int idx;
  3970. #endif /* WOLFSSL_CERT_REQ && OPENSSL_ALL && WOLFSSL_CUSTOM_OID */
  3971. if (x509 == NULL)
  3972. return;
  3973. FreeX509Name(&x509->issuer);
  3974. FreeX509Name(&x509->subject);
  3975. if (x509->pubKey.buffer) {
  3976. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  3977. x509->pubKey.buffer = NULL;
  3978. }
  3979. FreeDer(&x509->derCert);
  3980. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  3981. x509->sig.buffer = NULL;
  3982. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3983. if (x509->authKeyIdSrc != NULL) {
  3984. XFREE(x509->authKeyIdSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3985. }
  3986. else {
  3987. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3988. }
  3989. x509->authKeyIdSrc = NULL;
  3990. x509->authKeyId = NULL;
  3991. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3992. x509->subjKeyId = NULL;
  3993. if (x509->authInfo != NULL) {
  3994. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3995. x509->authInfo = NULL;
  3996. }
  3997. if (x509->rawCRLInfo != NULL) {
  3998. XFREE(x509->rawCRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3999. x509->rawCRLInfo = NULL;
  4000. }
  4001. if (x509->CRLInfo != NULL) {
  4002. XFREE(x509->CRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  4003. x509->CRLInfo = NULL;
  4004. }
  4005. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  4006. defined(WOLFSSL_QT)
  4007. if (x509->authInfoCaIssuer != NULL) {
  4008. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  4009. }
  4010. if (x509->ext_sk != NULL) {
  4011. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk, NULL);
  4012. }
  4013. if (x509->ext_sk_full != NULL) {
  4014. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk_full, NULL);
  4015. }
  4016. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  4017. #ifdef OPENSSL_EXTRA
  4018. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  4019. if (x509->serialNumber != NULL) {
  4020. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  4021. }
  4022. #endif
  4023. if (x509->extKeyUsageSrc != NULL) {
  4024. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  4025. x509->extKeyUsageSrc= NULL;
  4026. }
  4027. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  4028. #if defined(OPENSSL_ALL)
  4029. if (x509->algor.algorithm) {
  4030. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  4031. x509->algor.algorithm = NULL;
  4032. }
  4033. if (x509->key.algor) {
  4034. wolfSSL_X509_ALGOR_free(x509->key.algor);
  4035. x509->key.algor = NULL;
  4036. }
  4037. if (x509->key.pkey) {
  4038. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  4039. x509->key.pkey = NULL;
  4040. }
  4041. if (x509->subjAltNameSrc != NULL) {
  4042. XFREE(x509->subjAltNameSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  4043. x509->subjAltNameSrc= NULL;
  4044. }
  4045. #endif /* OPENSSL_ALL */
  4046. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
  4047. if (x509->reqAttributes) {
  4048. wolfSSL_sk_pop_free(x509->reqAttributes, NULL);
  4049. }
  4050. #ifdef WOLFSSL_CUSTOM_OID
  4051. for (idx = 0; idx < x509->customExtCount; idx++) {
  4052. XFREE(x509->custom_exts[idx].oid, x509->heap,
  4053. DYNAMIC_TYPE_X509_EXT);
  4054. XFREE(x509->custom_exts[idx].val, x509->heap,
  4055. DYNAMIC_TYPE_X509_EXT);
  4056. }
  4057. #endif /* WOLFSSL_CUSTOM_OID */
  4058. #endif /* WOLFSSL_CERT_REQ && OPENSSL_ALL */
  4059. if (x509->altNames) {
  4060. FreeAltNames(x509->altNames, x509->heap);
  4061. x509->altNames = NULL;
  4062. }
  4063. #ifdef WOLFSSL_DUAL_ALG_CERTS
  4064. XFREE(x509->sapkiDer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  4065. XFREE(x509->altSigAlgDer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  4066. XFREE(x509->altSigValDer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  4067. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  4068. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  4069. wolfSSL_RefFree(&x509->ref);
  4070. #endif
  4071. }
  4072. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  4073. #if !defined(WOLFSSL_NO_TLS12)
  4074. /* Encode the signature algorithm into buffer.
  4075. *
  4076. * hashalgo The hash algorithm.
  4077. * hsType The signature type.
  4078. * output The buffer to encode into.
  4079. */
  4080. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  4081. {
  4082. switch (hsType) {
  4083. #ifdef HAVE_ECC
  4084. case ecc_dsa_sa_algo:
  4085. output[0] = hashAlgo;
  4086. output[1] = ecc_dsa_sa_algo;
  4087. break;
  4088. #endif
  4089. #ifdef HAVE_ED25519
  4090. case ed25519_sa_algo:
  4091. output[0] = ED25519_SA_MAJOR;
  4092. output[1] = ED25519_SA_MINOR;
  4093. (void)hashAlgo;
  4094. break;
  4095. #endif
  4096. #ifdef HAVE_ED448
  4097. case ed448_sa_algo:
  4098. output[0] = ED448_SA_MAJOR;
  4099. output[1] = ED448_SA_MINOR;
  4100. (void)hashAlgo;
  4101. break;
  4102. #endif
  4103. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  4104. case sm2_sa_algo:
  4105. output[0] = SM2_SA_MAJOR;
  4106. output[1] = SM2_SA_MINOR;
  4107. (void)hashAlgo;
  4108. break;
  4109. #endif
  4110. #ifndef NO_RSA
  4111. case rsa_sa_algo:
  4112. output[0] = hashAlgo;
  4113. output[1] = rsa_sa_algo;
  4114. break;
  4115. #ifdef WC_RSA_PSS
  4116. /* PSS signatures: 0x080[4-6] */
  4117. case rsa_pss_sa_algo:
  4118. output[0] = rsa_pss_sa_algo;
  4119. output[1] = hashAlgo;
  4120. break;
  4121. #endif
  4122. #endif
  4123. default:
  4124. break;
  4125. }
  4126. (void)hashAlgo;
  4127. (void)output;
  4128. }
  4129. #endif
  4130. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  4131. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  4132. {
  4133. switch (hashAlgo) {
  4134. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  4135. defined(WOLFSSL_ALLOW_TLS_SHA1))
  4136. case sha_mac:
  4137. ssl->options.dontFreeDigest = 1;
  4138. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  4139. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  4140. break;
  4141. #endif /* !NO_SHA */
  4142. #ifndef NO_SHA256
  4143. case sha256_mac:
  4144. ssl->options.dontFreeDigest = 1;
  4145. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  4146. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  4147. break;
  4148. #endif /* !NO_SHA256 */
  4149. #ifdef WOLFSSL_SM3
  4150. case sm3_mac:
  4151. ssl->options.dontFreeDigest = 1;
  4152. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sm3;
  4153. ssl->buffers.digest.length = WC_SM3_DIGEST_SIZE;
  4154. break;
  4155. #endif /* WOLFSSL_SM2 */
  4156. #ifdef WOLFSSL_SHA384
  4157. case sha384_mac:
  4158. ssl->options.dontFreeDigest = 1;
  4159. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  4160. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  4161. break;
  4162. #endif /* WOLFSSL_SHA384 */
  4163. #ifdef WOLFSSL_SHA512
  4164. case sha512_mac:
  4165. ssl->options.dontFreeDigest = 1;
  4166. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  4167. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  4168. break;
  4169. #endif /* WOLFSSL_SHA512 */
  4170. default:
  4171. break;
  4172. } /* switch */
  4173. }
  4174. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  4175. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  4176. #endif /* !NO_CERTS */
  4177. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  4178. static word32 MacSize(const WOLFSSL* ssl)
  4179. {
  4180. #ifdef HAVE_TRUNCATED_HMAC
  4181. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  4182. : ssl->specs.hash_size;
  4183. #else
  4184. word32 digestSz = ssl->specs.hash_size;
  4185. #endif
  4186. return digestSz;
  4187. }
  4188. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  4189. #ifndef NO_RSA
  4190. #if !defined(WOLFSSL_NO_TLS12) || \
  4191. (defined(WC_RSA_PSS) && defined(HAVE_PK_CALLBACKS))
  4192. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  4193. static int TypeHash(int hashAlgo)
  4194. {
  4195. switch (hashAlgo) {
  4196. #ifdef WOLFSSL_SHA512
  4197. case sha512_mac:
  4198. return SHA512h;
  4199. #endif
  4200. #ifdef WOLFSSL_SHA384
  4201. case sha384_mac:
  4202. return SHA384h;
  4203. #endif
  4204. #ifndef NO_SHA256
  4205. case sha256_mac:
  4206. return SHA256h;
  4207. #endif
  4208. #ifdef WOLFSSL_SHA224
  4209. case sha224_mac:
  4210. return SHA224h;
  4211. #endif
  4212. #ifndef NO_SHA
  4213. case sha_mac:
  4214. return SHAh;
  4215. #endif
  4216. default:
  4217. break;
  4218. }
  4219. return 0;
  4220. }
  4221. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  4222. #endif /* !WOLFSSL_NO_TLS12 */
  4223. #if defined(WC_RSA_PSS)
  4224. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  4225. {
  4226. switch (hashAlgo) {
  4227. #ifdef WOLFSSL_SHA512
  4228. case sha512_mac:
  4229. *hashType = WC_HASH_TYPE_SHA512;
  4230. if (mgf != NULL)
  4231. *mgf = WC_MGF1SHA512;
  4232. break;
  4233. #endif
  4234. #ifdef WOLFSSL_SHA384
  4235. case sha384_mac:
  4236. *hashType = WC_HASH_TYPE_SHA384;
  4237. if (mgf != NULL)
  4238. *mgf = WC_MGF1SHA384;
  4239. break;
  4240. #endif
  4241. #ifndef NO_SHA256
  4242. case sha256_mac:
  4243. *hashType = WC_HASH_TYPE_SHA256;
  4244. if (mgf != NULL)
  4245. *mgf = WC_MGF1SHA256;
  4246. break;
  4247. #endif
  4248. default:
  4249. return BAD_FUNC_ARG;
  4250. }
  4251. return 0;
  4252. }
  4253. #endif
  4254. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  4255. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4256. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  4257. DerBuffer* keyBufInfo)
  4258. {
  4259. int ret;
  4260. #ifdef HAVE_PK_CALLBACKS
  4261. const byte* keyBuf = NULL;
  4262. word32 keySz = 0;
  4263. if (keyBufInfo) {
  4264. keyBuf = keyBufInfo->buffer;
  4265. keySz = keyBufInfo->length;
  4266. }
  4267. #endif
  4268. (void)ssl;
  4269. (void)keyBufInfo;
  4270. (void)sigAlgo;
  4271. (void)hashAlgo;
  4272. WOLFSSL_ENTER("RsaSign");
  4273. #ifdef WOLFSSL_ASYNC_CRYPT
  4274. /* initialize event */
  4275. if (key) {
  4276. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4277. if (ret != 0)
  4278. return ret;
  4279. }
  4280. #endif
  4281. #if defined(WC_RSA_PSS)
  4282. if (sigAlgo == rsa_pss_sa_algo) {
  4283. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4284. int mgf = 0;
  4285. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4286. if (ret != 0)
  4287. return ret;
  4288. #if defined(HAVE_PK_CALLBACKS)
  4289. if (ssl->ctx->RsaPssSignCb) {
  4290. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  4291. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  4292. TypeHash(hashAlgo), mgf,
  4293. keyBuf, keySz, ctx);
  4294. }
  4295. else
  4296. #endif
  4297. {
  4298. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  4299. ssl->rng);
  4300. }
  4301. }
  4302. else
  4303. #endif
  4304. #if defined(HAVE_PK_CALLBACKS)
  4305. if (ssl->ctx->RsaSignCb) {
  4306. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  4307. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4308. ctx);
  4309. }
  4310. else
  4311. #endif /*HAVE_PK_CALLBACKS */
  4312. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  4313. /* Handle async pending response */
  4314. #ifdef WOLFSSL_ASYNC_CRYPT
  4315. if (key && ret == WC_PENDING_E) {
  4316. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4317. }
  4318. #endif /* WOLFSSL_ASYNC_CRYPT */
  4319. /* For positive response return in outSz */
  4320. if (ret > 0) {
  4321. *outSz = ret;
  4322. ret = 0;
  4323. }
  4324. WOLFSSL_LEAVE("RsaSign", ret);
  4325. return ret;
  4326. }
  4327. #endif
  4328. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  4329. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  4330. {
  4331. int ret = SIG_VERIFY_E;
  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("RsaVerify");
  4345. #ifdef WOLFSSL_ASYNC_CRYPT
  4346. /* initialize event */
  4347. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4348. if (ret != 0)
  4349. return ret;
  4350. #endif
  4351. #if defined(WC_RSA_PSS)
  4352. if (sigAlgo == rsa_pss_sa_algo) {
  4353. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4354. int mgf = 0;
  4355. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4356. if (ret != 0)
  4357. return ret;
  4358. #ifdef HAVE_PK_CALLBACKS
  4359. if (ssl->ctx->RsaPssVerifyCb) {
  4360. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  4361. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  4362. TypeHash(hashAlgo), mgf,
  4363. keyBuf, keySz, ctx);
  4364. }
  4365. else
  4366. #endif /*HAVE_PK_CALLBACKS */
  4367. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  4368. }
  4369. else
  4370. #endif
  4371. #ifdef HAVE_PK_CALLBACKS
  4372. if (ssl->ctx->RsaVerifyCb) {
  4373. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  4374. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  4375. }
  4376. #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  4377. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4378. else
  4379. #else
  4380. if (!ssl->ctx->RsaVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4381. #endif
  4382. #endif /*HAVE_PK_CALLBACKS */
  4383. {
  4384. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  4385. }
  4386. /* Handle async pending response */
  4387. #ifdef WOLFSSL_ASYNC_CRYPT
  4388. if (ret == WC_PENDING_E) {
  4389. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4390. }
  4391. #endif /* WOLFSSL_ASYNC_CRYPT */
  4392. WOLFSSL_LEAVE("RsaVerify", ret);
  4393. return ret;
  4394. }
  4395. /* Verify RSA signature, 0 on success */
  4396. /* This function is used to check the sign result */
  4397. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  4398. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  4399. DerBuffer* keyBufInfo)
  4400. {
  4401. byte* out = NULL; /* inline result */
  4402. int ret;
  4403. #ifdef HAVE_PK_CALLBACKS
  4404. const byte* keyBuf = NULL;
  4405. word32 keySz = 0;
  4406. if (keyBufInfo) {
  4407. keyBuf = keyBufInfo->buffer;
  4408. keySz = keyBufInfo->length;
  4409. }
  4410. #endif
  4411. (void)ssl;
  4412. (void)keyBufInfo;
  4413. (void)sigAlgo;
  4414. (void)hashAlgo;
  4415. WOLFSSL_ENTER("VerifyRsaSign");
  4416. if (verifySig == NULL || plain == NULL) {
  4417. return BAD_FUNC_ARG;
  4418. }
  4419. if (sigSz > ENCRYPT_LEN) {
  4420. WOLFSSL_MSG("Signature buffer too big");
  4421. return BUFFER_E;
  4422. }
  4423. #ifdef WOLFSSL_ASYNC_CRYPT
  4424. /* initialize event */
  4425. if (key) {
  4426. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4427. if (ret != 0)
  4428. return ret;
  4429. }
  4430. #endif
  4431. #if defined(WC_RSA_PSS)
  4432. if (sigAlgo == rsa_pss_sa_algo) {
  4433. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4434. int mgf = 0;
  4435. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4436. if (ret != 0)
  4437. return ret;
  4438. #ifdef HAVE_PK_CALLBACKS
  4439. if (ssl->ctx->RsaPssSignCheckCb) {
  4440. /* The key buffer includes private/public portion,
  4441. but only public is used */
  4442. /* If HSM hardware is checking the signature result you can
  4443. optionally skip the sign check and return 0 */
  4444. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  4445. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  4446. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  4447. TypeHash(hashAlgo), mgf,
  4448. keyBuf, keySz, ctx);
  4449. if (ret > 0) {
  4450. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  4451. hashType);
  4452. if (ret != 0) {
  4453. ret = VERIFY_CERT_ERROR;
  4454. WOLFSSL_ERROR_VERBOSE(ret);
  4455. }
  4456. }
  4457. }
  4458. else
  4459. #endif /* HAVE_PK_CALLBACKS */
  4460. {
  4461. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  4462. key);
  4463. if (ret > 0) {
  4464. #ifdef HAVE_SELFTEST
  4465. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  4466. hashType);
  4467. #else
  4468. ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret,
  4469. hashType, -1,
  4470. mp_count_bits(&key->n));
  4471. #endif
  4472. if (ret != 0) {
  4473. ret = VERIFY_CERT_ERROR;
  4474. WOLFSSL_ERROR_VERBOSE(ret);
  4475. }
  4476. }
  4477. }
  4478. }
  4479. else
  4480. #endif /* WC_RSA_PSS */
  4481. {
  4482. #ifdef HAVE_PK_CALLBACKS
  4483. if (ssl->ctx->RsaSignCheckCb) {
  4484. /* The key buffer includes private/public portion,
  4485. but only public is used */
  4486. /* If HSM hardware is checking the signature result you can
  4487. optionally skip the sign check and return 0 */
  4488. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  4489. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  4490. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  4491. keyBuf, keySz, ctx);
  4492. }
  4493. else
  4494. #endif /* HAVE_PK_CALLBACKS */
  4495. {
  4496. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  4497. }
  4498. if (ret > 0) {
  4499. if (ret != (int)plainSz || !out ||
  4500. XMEMCMP(plain, out, plainSz) != 0) {
  4501. WOLFSSL_MSG("RSA Signature verification failed");
  4502. ret = RSA_SIGN_FAULT;
  4503. WOLFSSL_ERROR_VERBOSE(ret);
  4504. }
  4505. else {
  4506. ret = 0; /* RSA reset */
  4507. }
  4508. }
  4509. }
  4510. /* Handle async pending response */
  4511. #ifdef WOLFSSL_ASYNC_CRYPT
  4512. if (key && ret == WC_PENDING_E) {
  4513. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4514. }
  4515. #endif /* WOLFSSL_ASYNC_CRYPT */
  4516. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  4517. return ret;
  4518. }
  4519. #ifndef WOLFSSL_NO_TLS12
  4520. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  4521. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  4522. RsaKey* key, DerBuffer* keyBufInfo)
  4523. {
  4524. byte *outTmp;
  4525. byte mask;
  4526. int ret;
  4527. #ifdef HAVE_PK_CALLBACKS
  4528. const byte* keyBuf = NULL;
  4529. word32 keySz = 0;
  4530. if (keyBufInfo) {
  4531. keyBuf = keyBufInfo->buffer;
  4532. keySz = keyBufInfo->length;
  4533. }
  4534. #endif
  4535. (void)ssl;
  4536. (void)keyBufInfo;
  4537. WOLFSSL_ENTER("RsaDec");
  4538. outTmp = *out;
  4539. #ifdef WOLFSSL_ASYNC_CRYPT
  4540. /* initialize event */
  4541. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4542. if (ret != 0)
  4543. return ret;
  4544. #endif
  4545. #ifdef HAVE_PK_CALLBACKS
  4546. if (ssl->ctx->RsaDecCb) {
  4547. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  4548. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, &outTmp, keyBuf, keySz, ctx);
  4549. }
  4550. else
  4551. #endif /* HAVE_PK_CALLBACKS */
  4552. {
  4553. #ifdef WC_RSA_BLINDING
  4554. ret = wc_RsaSetRNG(key, ssl->rng);
  4555. if (ret != 0)
  4556. return ret;
  4557. #endif
  4558. ret = wc_RsaPrivateDecryptInline(in, inSz, &outTmp, key);
  4559. }
  4560. /* Handle async pending response */
  4561. #ifdef WOLFSSL_ASYNC_CRYPT
  4562. if (ret == WC_PENDING_E) {
  4563. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4564. }
  4565. #endif /* WOLFSSL_ASYNC_CRYPT */
  4566. mask = ctMaskGT(ret, 0);
  4567. *outSz = (word32)(ret & (int)(sword8)mask);
  4568. ret &= (int)(sword8)(~mask);
  4569. /* Copy pointer */
  4570. ctMaskCopy(mask, (byte*)out, (byte*)&outTmp, sizeof(*out));
  4571. WOLFSSL_LEAVE("RsaDec", ret);
  4572. return ret;
  4573. }
  4574. #endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
  4575. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  4576. RsaKey* key, buffer* keyBufInfo)
  4577. {
  4578. int ret = BAD_FUNC_ARG;
  4579. #ifdef HAVE_PK_CALLBACKS
  4580. const byte* keyBuf = NULL;
  4581. word32 keySz = 0;
  4582. if (keyBufInfo) {
  4583. keyBuf = keyBufInfo->buffer;
  4584. keySz = keyBufInfo->length;
  4585. }
  4586. #endif
  4587. (void)ssl;
  4588. (void)keyBufInfo;
  4589. WOLFSSL_ENTER("RsaEnc");
  4590. #ifdef WOLFSSL_ASYNC_CRYPT
  4591. /* initialize event */
  4592. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4593. if (ret != 0)
  4594. return ret;
  4595. #endif
  4596. #ifdef HAVE_PK_CALLBACKS
  4597. if (ssl->ctx->RsaEncCb) {
  4598. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  4599. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  4600. }
  4601. #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  4602. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4603. else
  4604. #else
  4605. if (!ssl->ctx->RsaEncCb || ret == CRYPTOCB_UNAVAILABLE)
  4606. #endif
  4607. #endif /* HAVE_PK_CALLBACKS */
  4608. {
  4609. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  4610. }
  4611. /* Handle async pending response */
  4612. #ifdef WOLFSSL_ASYNC_CRYPT
  4613. if (ret == WC_PENDING_E) {
  4614. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4615. }
  4616. #endif /* WOLFSSL_ASYNC_CRYPT */
  4617. /* For positive response return in outSz */
  4618. if (ret > 0) {
  4619. *outSz = ret;
  4620. ret = 0;
  4621. }
  4622. WOLFSSL_LEAVE("RsaEnc", ret);
  4623. return ret;
  4624. }
  4625. #endif /* !WOLFSSL_NO_TLS12 */
  4626. #endif /* NO_RSA */
  4627. #ifdef HAVE_ECC
  4628. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4629. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  4630. {
  4631. int ret;
  4632. #ifdef HAVE_PK_CALLBACKS
  4633. const byte* keyBuf = NULL;
  4634. word32 keySz = 0;
  4635. if (keyBufInfo) {
  4636. keyBuf = keyBufInfo->buffer;
  4637. keySz = keyBufInfo->length;
  4638. }
  4639. #endif
  4640. (void)ssl;
  4641. (void)keyBufInfo;
  4642. WOLFSSL_ENTER("EccSign");
  4643. #ifdef WOLFSSL_ASYNC_CRYPT
  4644. /* initialize event */
  4645. if (key) {
  4646. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4647. if (ret != 0)
  4648. return ret;
  4649. }
  4650. #endif
  4651. #if defined(HAVE_PK_CALLBACKS)
  4652. if (ssl->ctx->EccSignCb) {
  4653. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  4654. if (ctx == NULL) {
  4655. /* Try to get the WOLFSSL_CTX EccSignCtx*/
  4656. ctx = wolfSSL_CTX_GetEccSignCtx(ssl->ctx);
  4657. }
  4658. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  4659. keySz, ctx);
  4660. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  4661. if (ret == CRYPTOCB_UNAVAILABLE) {
  4662. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4663. }
  4664. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  4665. }
  4666. else
  4667. #endif /* HAVE_PK_CALLBACKS */
  4668. {
  4669. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4670. }
  4671. /* Handle async pending response */
  4672. #ifdef WOLFSSL_ASYNC_CRYPT
  4673. if (key && ret == WC_PENDING_E) {
  4674. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4675. }
  4676. #endif /* WOLFSSL_ASYNC_CRYPT */
  4677. WOLFSSL_LEAVE("EccSign", ret);
  4678. return ret;
  4679. }
  4680. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  4681. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  4682. {
  4683. int ret = SIG_VERIFY_E;
  4684. #ifdef HAVE_PK_CALLBACKS
  4685. const byte* keyBuf = NULL;
  4686. word32 keySz = 0;
  4687. if (keyBufInfo) {
  4688. keyBuf = keyBufInfo->buffer;
  4689. keySz = keyBufInfo->length;
  4690. }
  4691. #endif
  4692. (void)ssl;
  4693. (void)keyBufInfo;
  4694. WOLFSSL_ENTER("EccVerify");
  4695. #ifdef WOLFSSL_ASYNC_CRYPT
  4696. /* initialize event */
  4697. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4698. if (ret != 0)
  4699. return ret;
  4700. #endif
  4701. #ifdef HAVE_PK_CALLBACKS
  4702. if (ssl->ctx->EccVerifyCb) {
  4703. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  4704. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4705. &ssl->eccVerifyRes, ctx);
  4706. }
  4707. #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  4708. !defined(WOLFSSL_RENESAS_TSIP_TLS) && \
  4709. !defined(WOLFSSL_MAXQ108X)
  4710. else
  4711. #else
  4712. if (!ssl->ctx->EccVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4713. #endif
  4714. #endif /* HAVE_PK_CALLBACKS */
  4715. {
  4716. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  4717. }
  4718. /* Handle async pending response */
  4719. #ifdef WOLFSSL_ASYNC_CRYPT
  4720. if (ret == WC_PENDING_E) {
  4721. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4722. }
  4723. else
  4724. #endif /* WOLFSSL_ASYNC_CRYPT */
  4725. {
  4726. if (ret != 0 || ssl->eccVerifyRes == 0) {
  4727. if (ret == 0) {
  4728. ret = VERIFY_SIGN_ERROR;
  4729. }
  4730. WOLFSSL_ERROR_VERBOSE(ret);
  4731. }
  4732. else {
  4733. ret = 0;
  4734. }
  4735. }
  4736. WOLFSSL_LEAVE("EccVerify", ret);
  4737. return ret;
  4738. }
  4739. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  4740. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  4741. int side)
  4742. {
  4743. int ret;
  4744. #ifdef WOLFSSL_ASYNC_CRYPT
  4745. WC_ASYNC_DEV* asyncDev = NULL;
  4746. #endif
  4747. (void)ssl;
  4748. (void)pubKeyDer;
  4749. (void)pubKeySz;
  4750. (void)side;
  4751. WOLFSSL_ENTER("EccSharedSecret");
  4752. #ifdef WOLFSSL_ASYNC_CRYPT
  4753. /* initialize event */
  4754. if (priv_key != NULL) {
  4755. asyncDev = &priv_key->asyncDev;
  4756. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4757. if (ret != 0)
  4758. return ret;
  4759. }
  4760. #endif
  4761. #ifdef HAVE_PK_CALLBACKS
  4762. if (ssl->ctx->EccSharedSecretCb) {
  4763. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  4764. ecc_key* otherKey = (side == WOLFSSL_CLIENT_END) ? pub_key : priv_key;
  4765. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  4766. pubKeySz, out, outlen, side, ctx);
  4767. }
  4768. else
  4769. #endif
  4770. {
  4771. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  4772. !defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2)) && \
  4773. !defined(HAVE_SELFTEST)
  4774. ret = wc_ecc_set_rng(priv_key, ssl->rng);
  4775. if (ret == 0)
  4776. #endif
  4777. {
  4778. PRIVATE_KEY_UNLOCK();
  4779. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  4780. PRIVATE_KEY_LOCK();
  4781. }
  4782. }
  4783. /* Handle async pending response */
  4784. #ifdef WOLFSSL_ASYNC_CRYPT
  4785. if (ret == WC_PENDING_E) {
  4786. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  4787. }
  4788. #endif /* WOLFSSL_ASYNC_CRYPT */
  4789. WOLFSSL_LEAVE("EccSharedSecret", ret);
  4790. return ret;
  4791. }
  4792. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  4793. {
  4794. int ret = 0;
  4795. int keySz = 0;
  4796. int ecc_curve = ECC_CURVE_DEF;
  4797. WOLFSSL_ENTER("EccMakeKey");
  4798. #ifdef WOLFSSL_ASYNC_CRYPT
  4799. /* initialize event */
  4800. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4801. if (ret != 0)
  4802. return ret;
  4803. #endif
  4804. /* get key size */
  4805. if (peer == NULL || peer->dp == NULL) {
  4806. keySz = ssl->eccTempKeySz;
  4807. /* get curve type */
  4808. if (ssl->ecdhCurveOID > 0) {
  4809. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  4810. }
  4811. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \
  4812. (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \
  4813. defined(WOLFSSL_SM4_CCM))
  4814. if ((ssl->options.cipherSuite0 == SM_BYTE) && (0
  4815. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  4816. || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3)
  4817. #endif
  4818. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  4819. || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3)
  4820. #endif
  4821. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  4822. || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3)
  4823. #endif
  4824. )) {
  4825. keySz = 32;
  4826. ecc_curve = ECC_SM2P256V1;
  4827. }
  4828. #endif
  4829. }
  4830. else {
  4831. keySz = peer->dp->size;
  4832. ecc_curve = peer->dp->id;
  4833. }
  4834. #ifdef HAVE_PK_CALLBACKS
  4835. if (ssl->ctx->EccKeyGenCb) {
  4836. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  4837. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  4838. }
  4839. else
  4840. #endif
  4841. {
  4842. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  4843. }
  4844. /* make sure the curve is set for TLS */
  4845. if (ret == 0 && key->dp) {
  4846. ssl->ecdhCurveOID = key->dp->oidSum;
  4847. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4848. ssl->namedGroup = 0;
  4849. #endif
  4850. }
  4851. /* Handle async pending response */
  4852. #ifdef WOLFSSL_ASYNC_CRYPT
  4853. if (ret == WC_PENDING_E) {
  4854. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4855. }
  4856. #endif /* WOLFSSL_ASYNC_CRYPT */
  4857. WOLFSSL_LEAVE("EccMakeKey", ret);
  4858. return ret;
  4859. }
  4860. #endif /* HAVE_ECC */
  4861. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  4862. int Sm2wSm3Sign(WOLFSSL* ssl, const byte* id, word32 idSz, const byte* in,
  4863. word32 inSz, byte* out, word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  4864. {
  4865. int ret;
  4866. byte hash[WC_SM3_DIGEST_SIZE];
  4867. (void)ssl;
  4868. (void)keyBufInfo;
  4869. WOLFSSL_ENTER("Sm2wSm3Sign");
  4870. ret = wc_ecc_sm2_create_digest(id, idSz, in, inSz, WC_HASH_TYPE_SM3, hash,
  4871. sizeof(hash), key);
  4872. if (ret == 0) {
  4873. ret = wc_ecc_sm2_sign_hash(hash, sizeof(hash), out, outSz, ssl->rng,
  4874. key);
  4875. }
  4876. WOLFSSL_LEAVE("Sm2wSm3Sign", ret);
  4877. return ret;
  4878. }
  4879. int Sm2wSm3Verify(WOLFSSL* ssl, const byte* id, word32 idSz, const byte* sig,
  4880. word32 sigSz, const byte* msg, word32 msgSz, ecc_key* key,
  4881. buffer* keyBufInfo)
  4882. {
  4883. int ret = SIG_VERIFY_E;
  4884. byte hash[WC_SM3_DIGEST_SIZE];
  4885. (void)ssl;
  4886. (void)keyBufInfo;
  4887. WOLFSSL_ENTER("Sm2wSm3Verify");
  4888. ret = wc_ecc_sm2_create_digest(id, idSz, msg, msgSz, WC_HASH_TYPE_SM3, hash,
  4889. sizeof(hash), key);
  4890. if (ret == 0) {
  4891. ret = wc_ecc_sm2_verify_hash(sig, sigSz, hash, sizeof(hash),
  4892. &ssl->eccVerifyRes, key);
  4893. if (ret == 0 && ssl->eccVerifyRes == 0) {
  4894. ret = VERIFY_SIGN_ERROR;
  4895. }
  4896. }
  4897. if (ret != 0) {
  4898. WOLFSSL_ERROR_VERBOSE(ret);
  4899. }
  4900. WOLFSSL_LEAVE("Sm2wSm3Verify", ret);
  4901. return ret;
  4902. }
  4903. #endif /* WOLFSSL_SM2 */
  4904. #ifdef HAVE_ED25519
  4905. /* Check whether the key contains a public key.
  4906. * If not then pull it out of the leaf certificate.
  4907. *
  4908. * ssl SSL/TLS object.
  4909. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4910. * 0 on success.
  4911. */
  4912. int Ed25519CheckPubKey(WOLFSSL* ssl)
  4913. {
  4914. #ifndef HAVE_ED25519_KEY_IMPORT
  4915. (void)ssl;
  4916. return NOT_COMPILED_IN;
  4917. #else /* HAVE_ED25519_KEY_IMPORT */
  4918. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  4919. int ret = 0;
  4920. /* Public key required for signing. */
  4921. if (key != NULL && !key->pubKeySet) {
  4922. const unsigned char* pubKey;
  4923. word32 pubKeySz;
  4924. ret = wc_CertGetPubKey(ssl->buffers.certificate->buffer,
  4925. ssl->buffers.certificate->length, &pubKey, &pubKeySz);
  4926. if (ret == 0) {
  4927. ret = wc_ed25519_import_public(pubKey, pubKeySz, key);
  4928. }
  4929. }
  4930. return ret;
  4931. #endif /* HAVE_ED25519_KEY_IMPORT */
  4932. }
  4933. /* Sign the data using EdDSA and key using Ed25519.
  4934. *
  4935. * ssl SSL object.
  4936. * in Data or message to sign.
  4937. * inSz Length of the data.
  4938. * out Buffer to hold signature.
  4939. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4940. * key The private Ed25519 key data.
  4941. * keySz The length of the private key data in bytes.
  4942. * ctx The callback context.
  4943. * returns 0 on success, otherwise the value is an error.
  4944. */
  4945. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4946. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  4947. {
  4948. #ifndef HAVE_ED25519_SIGN
  4949. (void)ssl;
  4950. (void)in;
  4951. (void)inSz;
  4952. (void)out;
  4953. (void)outSz;
  4954. (void)key;
  4955. (void)keyBufInfo;
  4956. return NOT_COMPILED_IN;
  4957. #else /* HAVE_ED25519_SIGN */
  4958. int ret;
  4959. #ifdef HAVE_PK_CALLBACKS
  4960. const byte* keyBuf = NULL;
  4961. word32 keySz = 0;
  4962. if (keyBufInfo) {
  4963. keyBuf = keyBufInfo->buffer;
  4964. keySz = keyBufInfo->length;
  4965. }
  4966. #endif
  4967. (void)ssl;
  4968. (void)keyBufInfo;
  4969. WOLFSSL_ENTER("Ed25519Sign");
  4970. #ifdef WOLFSSL_ASYNC_CRYPT
  4971. /* initialize event */
  4972. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4973. if (ret != 0)
  4974. return ret;
  4975. #endif
  4976. #if defined(HAVE_PK_CALLBACKS)
  4977. if (ssl->ctx->Ed25519SignCb) {
  4978. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  4979. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  4980. keySz, ctx);
  4981. }
  4982. else
  4983. #endif /* HAVE_PK_CALLBACKS */
  4984. {
  4985. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  4986. }
  4987. /* Handle async pending response */
  4988. #ifdef WOLFSSL_ASYNC_CRYPT
  4989. if (ret == WC_PENDING_E) {
  4990. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4991. }
  4992. #endif /* WOLFSSL_ASYNC_CRYPT */
  4993. WOLFSSL_LEAVE("Ed25519Sign", ret);
  4994. return ret;
  4995. #endif /* HAVE_ED25519_SIGN */
  4996. }
  4997. /* Verify the data using EdDSA and key using Ed25519.
  4998. *
  4999. * ssl SSL object.
  5000. * in Signature data.
  5001. * inSz Length of the signature data in bytes.
  5002. * msg Message to verify.
  5003. * outSz Length of message in bytes.
  5004. * key The public Ed25519 key data.
  5005. * keySz The length of the private key data in bytes.
  5006. * ctx The callback context.
  5007. * returns 0 on success, otherwise the value is an error.
  5008. */
  5009. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  5010. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  5011. {
  5012. #ifndef HAVE_ED25519_VERIFY
  5013. (void)ssl;
  5014. (void)in;
  5015. (void)inSz;
  5016. (void)msg;
  5017. (void)msgSz;
  5018. (void)key;
  5019. (void)keyBufInfo;
  5020. return NOT_COMPILED_IN;
  5021. #else /* HAVE_ED25519_VERIFY */
  5022. int ret;
  5023. #ifdef HAVE_PK_CALLBACKS
  5024. const byte* keyBuf = NULL;
  5025. word32 keySz = 0;
  5026. if (keyBufInfo) {
  5027. keyBuf = keyBufInfo->buffer;
  5028. keySz = keyBufInfo->length;
  5029. }
  5030. #endif
  5031. (void)ssl;
  5032. (void)keyBufInfo;
  5033. WOLFSSL_ENTER("Ed25519Verify");
  5034. #ifdef WOLFSSL_ASYNC_CRYPT
  5035. /* initialize event */
  5036. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5037. if (ret != 0)
  5038. return ret;
  5039. #endif
  5040. #ifdef HAVE_PK_CALLBACKS
  5041. if (ssl->ctx->Ed25519VerifyCb) {
  5042. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  5043. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  5044. keySz, &ssl->eccVerifyRes, ctx);
  5045. }
  5046. else
  5047. #endif /* HAVE_PK_CALLBACKS */
  5048. {
  5049. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  5050. &ssl->eccVerifyRes, key);
  5051. }
  5052. /* Handle async pending response */
  5053. #ifdef WOLFSSL_ASYNC_CRYPT
  5054. if (ret == WC_PENDING_E) {
  5055. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5056. }
  5057. else
  5058. #endif /* WOLFSSL_ASYNC_CRYPT */
  5059. {
  5060. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  5061. }
  5062. WOLFSSL_LEAVE("Ed25519Verify", ret);
  5063. return ret;
  5064. #endif /* HAVE_ED25519_VERIFY */
  5065. }
  5066. #endif /* HAVE_ED25519 */
  5067. #ifndef WOLFSSL_NO_TLS12
  5068. #ifdef HAVE_CURVE25519
  5069. #ifdef HAVE_PK_CALLBACKS
  5070. /* Gets X25519 key for shared secret callback testing
  5071. * Client side: returns peer key
  5072. * Server side: returns private key
  5073. */
  5074. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  5075. {
  5076. int ret = NO_PEER_KEY;
  5077. struct curve25519_key* tmpKey = NULL;
  5078. if (ssl == NULL || otherKey == NULL) {
  5079. return BAD_FUNC_ARG;
  5080. }
  5081. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5082. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  5083. !ssl->peerX25519Key->dp) {
  5084. return NO_PEER_KEY;
  5085. }
  5086. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  5087. }
  5088. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  5089. if (!ssl->eccTempKeyPresent) {
  5090. return NO_PRIVATE_KEY;
  5091. }
  5092. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  5093. }
  5094. if (tmpKey) {
  5095. *otherKey = (curve25519_key *)tmpKey;
  5096. ret = 0;
  5097. }
  5098. return ret;
  5099. }
  5100. #endif /* HAVE_PK_CALLBACKS */
  5101. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  5102. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  5103. byte* out, word32* outlen, int side)
  5104. {
  5105. int ret;
  5106. (void)ssl;
  5107. (void)pubKeyDer;
  5108. (void)pubKeySz;
  5109. (void)side;
  5110. WOLFSSL_ENTER("X25519SharedSecret");
  5111. #ifdef WOLFSSL_ASYNC_CRYPT
  5112. /* initialize event */
  5113. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5114. if (ret != 0)
  5115. return ret;
  5116. #endif
  5117. #ifdef HAVE_PK_CALLBACKS
  5118. if (ssl->ctx->X25519SharedSecretCb) {
  5119. curve25519_key* otherKey = NULL;
  5120. ret = X25519GetKey(ssl, &otherKey);
  5121. if (ret == 0) {
  5122. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  5123. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  5124. pubKeySz, out, outlen, side, ctx);
  5125. }
  5126. }
  5127. else
  5128. #endif
  5129. {
  5130. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  5131. EC25519_LITTLE_ENDIAN);
  5132. }
  5133. /* Handle async pending response */
  5134. #ifdef WOLFSSL_ASYNC_CRYPT
  5135. if (ret == WC_PENDING_E) {
  5136. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  5137. }
  5138. #endif /* WOLFSSL_ASYNC_CRYPT */
  5139. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  5140. return ret;
  5141. }
  5142. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  5143. curve25519_key* peer)
  5144. {
  5145. int ret = 0;
  5146. (void)peer;
  5147. WOLFSSL_ENTER("X25519MakeKey");
  5148. #ifdef WOLFSSL_ASYNC_CRYPT
  5149. /* initialize event */
  5150. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  5151. if (ret != 0)
  5152. return ret;
  5153. #endif
  5154. #ifdef HAVE_PK_CALLBACKS
  5155. if (ssl->ctx->X25519KeyGenCb) {
  5156. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  5157. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  5158. }
  5159. else
  5160. #endif
  5161. {
  5162. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  5163. }
  5164. if (ret == 0) {
  5165. ssl->ecdhCurveOID = ECC_X25519_OID;
  5166. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  5167. ssl->namedGroup = 0;
  5168. #endif
  5169. }
  5170. /* Handle async pending response */
  5171. #ifdef WOLFSSL_ASYNC_CRYPT
  5172. if (ret == WC_PENDING_E) {
  5173. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5174. }
  5175. #endif /* WOLFSSL_ASYNC_CRYPT */
  5176. WOLFSSL_LEAVE("X25519MakeKey", ret);
  5177. return ret;
  5178. }
  5179. #endif /* HAVE_CURVE25519 */
  5180. #endif /* !WOLFSSL_NO_TLS12 */
  5181. #ifdef HAVE_ED448
  5182. /* Check whether the key contains a public key.
  5183. * If not then pull it out of the leaf certificate.
  5184. *
  5185. * ssl SSL/TLS object.
  5186. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  5187. * 0 on success.
  5188. */
  5189. int Ed448CheckPubKey(WOLFSSL* ssl)
  5190. {
  5191. #ifndef HAVE_ED448_KEY_IMPORT
  5192. (void)ssl;
  5193. return NOT_COMPILED_IN;
  5194. #else /* HAVE_ED448_KEY_IMPORT */
  5195. ed448_key* key = (ed448_key*)ssl->hsKey;
  5196. int ret = 0;
  5197. /* Public key required for signing. */
  5198. if (key != NULL && !key->pubKeySet) {
  5199. const unsigned char* pubKey;
  5200. word32 pubKeySz;
  5201. ret = wc_CertGetPubKey(ssl->buffers.certificate->buffer,
  5202. ssl->buffers.certificate->length, &pubKey, &pubKeySz);
  5203. if (ret == 0) {
  5204. ret = wc_ed448_import_public(pubKey, pubKeySz, key);
  5205. }
  5206. }
  5207. return ret;
  5208. #endif /* HAVE_ED448_KEY_IMPORT */
  5209. }
  5210. /* Sign the data using EdDSA and key using Ed448.
  5211. *
  5212. * ssl SSL object.
  5213. * in Data or message to sign.
  5214. * inSz Length of the data.
  5215. * out Buffer to hold signature.
  5216. * outSz On entry, size of the buffer. On exit, the size of the signature.
  5217. * key The private Ed448 key data.
  5218. * keySz The length of the private key data in bytes.
  5219. * ctx The callback context.
  5220. * returns 0 on success, otherwise the value is an error.
  5221. */
  5222. int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  5223. word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
  5224. {
  5225. #ifndef HAVE_ED448_SIGN
  5226. (void)ssl;
  5227. (void)in;
  5228. (void)inSz;
  5229. (void)out;
  5230. (void)outSz;
  5231. (void)key;
  5232. (void)keyBufInfo;
  5233. return NOT_COMPILED_IN;
  5234. #else /* HAVE_ED448_SIGN */
  5235. int ret;
  5236. #ifdef HAVE_PK_CALLBACKS
  5237. const byte* keyBuf = NULL;
  5238. word32 keySz = 0;
  5239. if (keyBufInfo) {
  5240. keyBuf = keyBufInfo->buffer;
  5241. keySz = keyBufInfo->length;
  5242. }
  5243. #endif
  5244. (void)ssl;
  5245. (void)keyBufInfo;
  5246. WOLFSSL_ENTER("Ed448Sign");
  5247. #ifdef WOLFSSL_ASYNC_CRYPT
  5248. /* initialize event */
  5249. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5250. if (ret != 0)
  5251. return ret;
  5252. #endif
  5253. #if defined(HAVE_PK_CALLBACKS)
  5254. if (ssl->ctx->Ed448SignCb) {
  5255. void* ctx = wolfSSL_GetEd448SignCtx(ssl);
  5256. ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  5257. ctx);
  5258. }
  5259. else
  5260. #endif /* HAVE_PK_CALLBACKS */
  5261. {
  5262. ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
  5263. }
  5264. /* Handle async pending response */
  5265. #ifdef WOLFSSL_ASYNC_CRYPT
  5266. if (ret == WC_PENDING_E) {
  5267. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5268. }
  5269. #endif /* WOLFSSL_ASYNC_CRYPT */
  5270. WOLFSSL_LEAVE("Ed448Sign", ret);
  5271. return ret;
  5272. #endif /* HAVE_ED448_SIGN */
  5273. }
  5274. /* Verify the data using EdDSA and key using Ed448.
  5275. *
  5276. * ssl SSL object.
  5277. * in Signature data.
  5278. * inSz Length of the signature data in bytes.
  5279. * msg Message to verify.
  5280. * outSz Length of message in bytes.
  5281. * key The public Ed448 key data.
  5282. * keySz The length of the private key data in bytes.
  5283. * ctx The callback context.
  5284. * returns 0 on success, otherwise the value is an error.
  5285. */
  5286. int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  5287. word32 msgSz, ed448_key* key, buffer* keyBufInfo)
  5288. {
  5289. #ifndef HAVE_ED448_VERIFY
  5290. (void)ssl;
  5291. (void)in;
  5292. (void)inSz;
  5293. (void)msg;
  5294. (void)msgSz;
  5295. (void)key;
  5296. (void)keyBufInfo;
  5297. return NOT_COMPILED_IN;
  5298. #else /* HAVE_ED448_VERIFY */
  5299. int ret;
  5300. #ifdef HAVE_PK_CALLBACKS
  5301. const byte* keyBuf = NULL;
  5302. word32 keySz = 0;
  5303. if (keyBufInfo) {
  5304. keyBuf = keyBufInfo->buffer;
  5305. keySz = keyBufInfo->length;
  5306. }
  5307. #endif
  5308. (void)ssl;
  5309. (void)keyBufInfo;
  5310. WOLFSSL_ENTER("Ed448Verify");
  5311. #ifdef WOLFSSL_ASYNC_CRYPT
  5312. /* initialize event */
  5313. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5314. if (ret != 0)
  5315. return ret;
  5316. #endif
  5317. #ifdef HAVE_PK_CALLBACKS
  5318. if (ssl->ctx->Ed448VerifyCb) {
  5319. void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
  5320. ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
  5321. &ssl->eccVerifyRes, ctx);
  5322. }
  5323. else
  5324. #endif /* HAVE_PK_CALLBACKS */
  5325. {
  5326. ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
  5327. NULL, 0);
  5328. }
  5329. /* Handle async pending response */
  5330. #ifdef WOLFSSL_ASYNC_CRYPT
  5331. if (ret == WC_PENDING_E) {
  5332. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5333. }
  5334. else
  5335. #endif /* WOLFSSL_ASYNC_CRYPT */
  5336. {
  5337. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  5338. }
  5339. WOLFSSL_LEAVE("Ed448Verify", ret);
  5340. return ret;
  5341. #endif /* HAVE_ED448_VERIFY */
  5342. }
  5343. #endif /* HAVE_ED448 */
  5344. #ifndef WOLFSSL_NO_TLS12
  5345. #ifdef HAVE_CURVE448
  5346. #ifdef HAVE_PK_CALLBACKS
  5347. /* Gets X448 key for shared secret callback testing
  5348. * Client side: returns peer key
  5349. * Server side: returns private key
  5350. */
  5351. static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
  5352. {
  5353. int ret = NO_PEER_KEY;
  5354. struct curve448_key* tmpKey = NULL;
  5355. if (ssl == NULL || otherKey == NULL) {
  5356. return BAD_FUNC_ARG;
  5357. }
  5358. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5359. if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
  5360. return NO_PEER_KEY;
  5361. }
  5362. tmpKey = (struct curve448_key*)ssl->peerX448Key;
  5363. }
  5364. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  5365. if (!ssl->eccTempKeyPresent) {
  5366. return NO_PRIVATE_KEY;
  5367. }
  5368. tmpKey = (struct curve448_key*)ssl->eccTempKey;
  5369. }
  5370. if (tmpKey) {
  5371. *otherKey = (curve448_key *)tmpKey;
  5372. ret = 0;
  5373. }
  5374. return ret;
  5375. }
  5376. #endif /* HAVE_PK_CALLBACKS */
  5377. static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
  5378. curve448_key* pub_key, byte* pubKeyDer,
  5379. word32* pubKeySz, byte* out, word32* outlen,
  5380. int side)
  5381. {
  5382. int ret;
  5383. (void)ssl;
  5384. (void)pubKeyDer;
  5385. (void)pubKeySz;
  5386. (void)side;
  5387. WOLFSSL_ENTER("X448SharedSecret");
  5388. #ifdef WOLFSSL_ASYNC_CRYPT
  5389. /* initialize event */
  5390. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5391. if (ret != 0)
  5392. return ret;
  5393. #endif
  5394. #ifdef HAVE_PK_CALLBACKS
  5395. if (ssl->ctx->X448SharedSecretCb) {
  5396. curve448_key* otherKey = NULL;
  5397. ret = X448GetKey(ssl, &otherKey);
  5398. if (ret == 0) {
  5399. void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
  5400. ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
  5401. pubKeySz, out, outlen, side, ctx);
  5402. }
  5403. }
  5404. else
  5405. #endif
  5406. {
  5407. ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
  5408. EC448_LITTLE_ENDIAN);
  5409. }
  5410. /* Handle async pending response */
  5411. #ifdef WOLFSSL_ASYNC_CRYPT
  5412. if (ret == WC_PENDING_E) {
  5413. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  5414. }
  5415. #endif /* WOLFSSL_ASYNC_CRYPT */
  5416. WOLFSSL_LEAVE("X448SharedSecret", ret);
  5417. return ret;
  5418. }
  5419. static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
  5420. {
  5421. int ret = 0;
  5422. (void)peer;
  5423. WOLFSSL_ENTER("X448MakeKey");
  5424. #ifdef WOLFSSL_ASYNC_CRYPT
  5425. /* initialize event */
  5426. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  5427. if (ret != 0)
  5428. return ret;
  5429. #endif
  5430. #ifdef HAVE_PK_CALLBACKS
  5431. if (ssl->ctx->X448KeyGenCb) {
  5432. void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
  5433. ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
  5434. }
  5435. else
  5436. #endif
  5437. {
  5438. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  5439. }
  5440. if (ret == 0) {
  5441. ssl->ecdhCurveOID = ECC_X448_OID;
  5442. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  5443. ssl->namedGroup = 0;
  5444. #endif
  5445. }
  5446. /* Handle async pending response */
  5447. #ifdef WOLFSSL_ASYNC_CRYPT
  5448. if (ret == WC_PENDING_E) {
  5449. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5450. }
  5451. #endif /* WOLFSSL_ASYNC_CRYPT */
  5452. WOLFSSL_LEAVE("X448MakeKey", ret);
  5453. return ret;
  5454. }
  5455. #endif /* HAVE_CURVE448 */
  5456. #endif /* !WOLFSSL_NO_TLS12 */
  5457. #if !defined(NO_CERTS) || !defined(NO_PSK)
  5458. #if !defined(NO_DH)
  5459. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  5460. byte* priv, word32* privSz,
  5461. byte* pub, word32* pubSz)
  5462. {
  5463. int ret;
  5464. WOLFSSL_ENTER("DhGenKeyPair");
  5465. #ifdef WOLFSSL_ASYNC_CRYPT
  5466. /* initialize event */
  5467. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5468. if (ret != 0)
  5469. return ret;
  5470. #endif
  5471. #if defined(HAVE_PK_CALLBACKS)
  5472. ret = NOT_COMPILED_IN;
  5473. if (ssl && ssl->ctx && ssl->ctx->DhGenerateKeyPairCb) {
  5474. ret = ssl->ctx->DhGenerateKeyPairCb(dhKey, ssl->rng, priv, privSz,
  5475. pub, pubSz);
  5476. }
  5477. if (ret == NOT_COMPILED_IN)
  5478. #endif
  5479. {
  5480. PRIVATE_KEY_UNLOCK();
  5481. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  5482. PRIVATE_KEY_LOCK();
  5483. }
  5484. /* Handle async pending response */
  5485. #ifdef WOLFSSL_ASYNC_CRYPT
  5486. if (ret == WC_PENDING_E) {
  5487. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  5488. }
  5489. #endif /* WOLFSSL_ASYNC_CRYPT */
  5490. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  5491. return ret;
  5492. }
  5493. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  5494. const byte* priv, word32 privSz,
  5495. const byte* otherPub, word32 otherPubSz,
  5496. byte* agree, word32* agreeSz,
  5497. const byte* prime, word32 primeSz)
  5498. {
  5499. int ret;
  5500. (void)ssl;
  5501. WOLFSSL_ENTER("DhAgree");
  5502. #ifdef WOLFSSL_ASYNC_CRYPT
  5503. /* initialize event */
  5504. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5505. if (ret != 0)
  5506. return ret;
  5507. #endif
  5508. #ifdef HAVE_PK_CALLBACKS
  5509. if (ssl->ctx->DhAgreeCb) {
  5510. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  5511. WOLFSSL_MSG("Calling DhAgree Callback Function");
  5512. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  5513. otherPub, otherPubSz, agree, agreeSz, ctx);
  5514. }
  5515. else
  5516. #endif
  5517. {
  5518. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  5519. /* check the public key has valid number */
  5520. if (dhKey != NULL && (prime == NULL || primeSz == 0)) {
  5521. /* wc_DhCheckPubKey does not do exponentiation */
  5522. ret = wc_DhCheckPubKey(dhKey, otherPub, otherPubSz);
  5523. }
  5524. else {
  5525. ret = wc_DhCheckPubValue(prime, primeSz, otherPub, otherPubSz);
  5526. }
  5527. if (ret != 0) {
  5528. /* translate to valid error (wc_DhCheckPubValue returns MP_VAL -1) */
  5529. ret = PEER_KEY_ERROR;
  5530. WOLFSSL_ERROR_VERBOSE(ret);
  5531. #ifdef OPENSSL_EXTRA
  5532. SendAlert(ssl, alert_fatal, illegal_parameter);
  5533. #endif
  5534. }
  5535. else
  5536. #endif
  5537. {
  5538. PRIVATE_KEY_UNLOCK();
  5539. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  5540. otherPubSz);
  5541. PRIVATE_KEY_LOCK();
  5542. }
  5543. }
  5544. /* Handle async pending response */
  5545. #ifdef WOLFSSL_ASYNC_CRYPT
  5546. if (ret == WC_PENDING_E) {
  5547. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  5548. }
  5549. #endif /* WOLFSSL_ASYNC_CRYPT */
  5550. WOLFSSL_LEAVE("DhAgree", ret);
  5551. (void)prime;
  5552. (void)primeSz;
  5553. return ret;
  5554. }
  5555. #endif /* !NO_DH */
  5556. #endif /* !NO_CERTS || !NO_PSK */
  5557. #ifdef HAVE_PK_CALLBACKS
  5558. int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
  5559. {
  5560. int pkcbset = 0;
  5561. (void)ssl;
  5562. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5563. !defined(NO_RSA)
  5564. if (0
  5565. #ifdef HAVE_ECC
  5566. || (ssl->ctx->EccSignCb != NULL &&
  5567. ssl->buffers.keyType == ecc_dsa_sa_algo)
  5568. #endif
  5569. #ifdef HAVE_ED25519
  5570. || (ssl->ctx->Ed25519SignCb != NULL &&
  5571. ssl->buffers.keyType == ed25519_sa_algo)
  5572. #endif
  5573. #ifdef HAVE_ED448
  5574. || (ssl->ctx->Ed448SignCb != NULL &&
  5575. ssl->buffers.keyType == ed448_sa_algo)
  5576. #endif
  5577. #ifndef NO_RSA
  5578. || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
  5579. || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
  5580. #ifdef WC_RSA_PSS
  5581. || (ssl->ctx->RsaPssSignCb != NULL &&
  5582. ssl->buffers.keyType == rsa_pss_sa_algo)
  5583. #endif
  5584. #endif
  5585. ) {
  5586. pkcbset = 1;
  5587. }
  5588. #endif
  5589. return pkcbset;
  5590. }
  5591. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  5592. {
  5593. int pkcbset = 0;
  5594. (void)ctx;
  5595. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5596. !defined(NO_RSA)
  5597. if (0
  5598. #ifdef HAVE_ECC
  5599. || ctx->EccSignCb != NULL
  5600. #endif
  5601. #ifdef HAVE_ED25519
  5602. || ctx->Ed25519SignCb != NULL
  5603. #endif
  5604. #ifdef HAVE_ED448
  5605. || ctx->Ed448SignCb != NULL
  5606. #endif
  5607. #ifndef NO_RSA
  5608. || ctx->RsaSignCb != NULL
  5609. || ctx->RsaDecCb != NULL
  5610. #ifdef WC_RSA_PSS
  5611. || ctx->RsaPssSignCb != NULL
  5612. #endif
  5613. #endif
  5614. ) {
  5615. pkcbset = 1;
  5616. }
  5617. #endif
  5618. return pkcbset;
  5619. }
  5620. #endif /* HAVE_PK_CALLBACKS */
  5621. static void InitSuites_EitherSide(Suites* suites, ProtocolVersion pv, int keySz,
  5622. word16 haveRSA, word16 havePSK, word16 haveDH, word16 haveECDSAsig,
  5623. word16 haveECC, word16 haveStaticECC,
  5624. word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon,
  5625. int side)
  5626. {
  5627. /* make sure server has DH params, and add PSK if there */
  5628. if (side == WOLFSSL_SERVER_END) {
  5629. InitSuites(suites, pv, keySz, haveRSA, havePSK, haveDH, haveECDSAsig,
  5630. haveECC, TRUE, haveStaticECC, haveFalconSig,
  5631. haveDilithiumSig, haveAnon, TRUE, side);
  5632. }
  5633. else {
  5634. InitSuites(suites, pv, keySz, haveRSA, havePSK, TRUE, haveECDSAsig,
  5635. haveECC, TRUE, haveStaticECC, haveFalconSig,
  5636. haveDilithiumSig, haveAnon, TRUE, side);
  5637. }
  5638. }
  5639. void InitSSL_CTX_Suites(WOLFSSL_CTX* ctx)
  5640. {
  5641. int keySz = 0;
  5642. byte havePSK = 0;
  5643. byte haveAnon = 0;
  5644. byte haveRSA = 0;
  5645. #ifndef NO_RSA
  5646. haveRSA = 1;
  5647. #endif
  5648. #ifndef NO_PSK
  5649. havePSK = ctx->havePSK;
  5650. #endif /* NO_PSK */
  5651. #ifdef HAVE_ANON
  5652. haveAnon = ctx->useAnon;
  5653. #endif /* HAVE_ANON*/
  5654. #ifndef NO_CERTS
  5655. keySz = ctx->privateKeySz;
  5656. #endif
  5657. InitSuites_EitherSide(ctx->suites, ctx->method->version, keySz,
  5658. haveRSA, havePSK, ctx->haveDH, ctx->haveECDSAsig, ctx->haveECC,
  5659. ctx->haveStaticECC, ctx->haveFalconSig, ctx->haveDilithiumSig,
  5660. haveAnon, ctx->method->side);
  5661. }
  5662. int InitSSL_Suites(WOLFSSL* ssl)
  5663. {
  5664. int keySz = 0;
  5665. byte havePSK = 0;
  5666. byte haveAnon = 0;
  5667. byte haveRSA = 0;
  5668. byte haveMcast = 0;
  5669. (void)haveAnon; /* Squash unused var warnings */
  5670. (void)haveMcast;
  5671. if (!ssl)
  5672. return BAD_FUNC_ARG;
  5673. #ifndef NO_RSA
  5674. haveRSA = 1;
  5675. #endif
  5676. #ifndef NO_PSK
  5677. havePSK = (byte)ssl->options.havePSK;
  5678. #endif /* NO_PSK */
  5679. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5680. #ifdef HAVE_ANON
  5681. haveAnon = (byte)ssl->options.useAnon;
  5682. #endif /* HAVE_ANON*/
  5683. #ifdef WOLFSSL_MULTICAST
  5684. haveMcast = (byte)ssl->options.haveMcast;
  5685. #endif /* WOLFSSL_MULTICAST */
  5686. #endif /* !NO_CERTS && !WOLFSSL_SESSION_EXPORT */
  5687. #ifdef WOLFSSL_EARLY_DATA
  5688. if (ssl->options.side == WOLFSSL_SERVER_END)
  5689. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  5690. #endif
  5691. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5692. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  5693. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5694. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5695. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5696. ssl->buffers.keyType == ed25519_sa_algo ||
  5697. ssl->buffers.keyType == ed448_sa_algo ||
  5698. ssl->buffers.keyType == sm2_sa_algo;
  5699. #endif
  5700. #ifndef NO_CERTS
  5701. keySz = ssl->buffers.keySz;
  5702. #endif
  5703. if (ssl->suites != NULL) {
  5704. InitSuites_EitherSide(ssl->suites, ssl->version, keySz, haveRSA,
  5705. havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
  5706. ssl->options.haveECC, ssl->options.haveStaticECC,
  5707. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  5708. ssl->options.useAnon, ssl->options.side);
  5709. }
  5710. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5711. /* make sure server has cert and key unless using PSK, Anon, or
  5712. * Multicast. This should be true even if just switching ssl ctx */
  5713. if (ssl->options.side == WOLFSSL_SERVER_END &&
  5714. !havePSK && !haveAnon && !haveMcast) {
  5715. /* server certificate must be loaded */
  5716. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  5717. WOLFSSL_MSG("Server missing certificate");
  5718. WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
  5719. return NO_PRIVATE_KEY;
  5720. }
  5721. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  5722. /* allow no private key if using existing key */
  5723. #ifdef WOLF_PRIVATE_KEY_ID
  5724. if (ssl->devId != INVALID_DEVID
  5725. #ifdef HAVE_PK_CALLBACKS
  5726. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  5727. #endif
  5728. ) {
  5729. WOLFSSL_MSG("Allowing no server private key (external)");
  5730. }
  5731. else
  5732. #endif
  5733. {
  5734. WOLFSSL_MSG("Server missing private key");
  5735. WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
  5736. return NO_PRIVATE_KEY;
  5737. }
  5738. }
  5739. }
  5740. #endif
  5741. return WOLFSSL_SUCCESS;
  5742. }
  5743. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  5744. It is used during initialization and to switch an ssl's CTX with
  5745. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  5746. unless writeDup is on.
  5747. ssl object to initialize
  5748. ctx parent factory
  5749. writeDup flag indicating this is a write dup only
  5750. WOLFSSL_SUCCESS return value on success */
  5751. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5752. {
  5753. int ret = WOLFSSL_SUCCESS; /* set default ret */
  5754. byte newSSL;
  5755. WOLFSSL_ENTER("SetSSL_CTX");
  5756. if (!ssl || !ctx)
  5757. return BAD_FUNC_ARG;
  5758. newSSL = ssl->ctx == NULL; /* Assign after null check */
  5759. #ifndef NO_PSK
  5760. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  5761. return BAD_FUNC_ARG; /* needed for copy below */
  5762. }
  5763. #endif
  5764. /* decrement previous CTX reference count if exists.
  5765. * This should only happen if switching ctxs!*/
  5766. if (!newSSL) {
  5767. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  5768. wolfSSL_CTX_free(ssl->ctx);
  5769. }
  5770. /* increment CTX reference count */
  5771. ret = wolfSSL_CTX_up_ref(ctx);
  5772. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  5773. if (ret != WOLFSSL_SUCCESS) {
  5774. return ret;
  5775. }
  5776. #else
  5777. (void)ret;
  5778. #endif
  5779. ssl->ctx = ctx; /* only for passing to calls, options could change */
  5780. /* Don't change version on a SSL object that has already started a
  5781. * handshake */
  5782. #if defined(WOLFSSL_HAPROXY)
  5783. if (ssl->initial_ctx == NULL) {
  5784. ret = wolfSSL_CTX_up_ref(ctx);
  5785. if (ret == WOLFSSL_SUCCESS) {
  5786. ssl->initial_ctx = ctx; /* Save access to session key materials */
  5787. }
  5788. else {
  5789. #ifdef WOLFSSL_REFCNT_ERROR_RETURN
  5790. return ret;
  5791. #else
  5792. (void)ret;
  5793. #endif
  5794. }
  5795. }
  5796. #endif
  5797. if (!ssl->msgsReceived.got_client_hello &&
  5798. !ssl->msgsReceived.got_server_hello)
  5799. ssl->version = ctx->method->version;
  5800. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  5801. ssl->options.mask = ctx->mask;
  5802. ssl->options.minProto = ctx->minProto;
  5803. ssl->options.maxProto = ctx->maxProto;
  5804. #endif
  5805. #ifdef OPENSSL_EXTRA
  5806. #ifdef WOLFSSL_TLS13
  5807. if (ssl->version.minor == TLSv1_3_MINOR &&
  5808. (ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  5809. if (!ctx->method->downgrade) {
  5810. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
  5811. "allowed and downgrading disabled.");
  5812. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5813. return VERSION_ERROR;
  5814. }
  5815. WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
  5816. ssl->version.minor = TLSv1_2_MINOR;
  5817. }
  5818. #endif
  5819. if (ssl->version.minor == TLSv1_2_MINOR &&
  5820. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  5821. if (!ctx->method->downgrade) {
  5822. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
  5823. "allowed and downgrading disabled.");
  5824. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5825. return VERSION_ERROR;
  5826. }
  5827. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  5828. ssl->version.minor = TLSv1_1_MINOR;
  5829. }
  5830. if (ssl->version.minor == TLSv1_1_MINOR &&
  5831. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  5832. if (!ctx->method->downgrade) {
  5833. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
  5834. "allowed and downgrading disabled.");
  5835. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5836. return VERSION_ERROR;
  5837. }
  5838. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  5839. ssl->options.tls1_1 = 0;
  5840. ssl->version.minor = TLSv1_MINOR;
  5841. }
  5842. if (ssl->version.minor == TLSv1_MINOR &&
  5843. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  5844. if (!ctx->method->downgrade) {
  5845. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
  5846. "allowed and downgrading disabled.");
  5847. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5848. return VERSION_ERROR;
  5849. }
  5850. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  5851. ssl->options.tls = 0;
  5852. ssl->options.tls1_1 = 0;
  5853. ssl->version.minor = SSLv3_MINOR;
  5854. }
  5855. if (ssl->version.minor == SSLv3_MINOR &&
  5856. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  5857. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  5858. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5859. return VERSION_ERROR;
  5860. }
  5861. if (ssl->version.minor < ssl->options.minDowngrade) {
  5862. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  5863. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5864. return VERSION_ERROR;
  5865. }
  5866. #endif
  5867. #ifdef HAVE_ECC
  5868. ssl->eccTempKeySz = ctx->eccTempKeySz;
  5869. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  5870. #endif
  5871. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  5872. ssl->pkCurveOID = ctx->pkCurveOID;
  5873. #endif
  5874. #ifdef OPENSSL_EXTRA
  5875. ssl->CBIS = ctx->CBIS;
  5876. #endif
  5877. ssl->timeout = ctx->timeout;
  5878. ssl->verifyCallback = ctx->verifyCallback;
  5879. /* If we are setting the ctx on an already initialized SSL object
  5880. * then we possibly already have a side defined. Don't overwrite unless
  5881. * the context has a well defined role. */
  5882. if (newSSL || ctx->method->side != WOLFSSL_NEITHER_END)
  5883. ssl->options.side = ctx->method->side;
  5884. ssl->options.downgrade = ctx->method->downgrade;
  5885. ssl->options.minDowngrade = ctx->minDowngrade;
  5886. ssl->options.haveRSA = ctx->haveRSA;
  5887. ssl->options.haveDH = ctx->haveDH;
  5888. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  5889. ssl->options.haveECC = ctx->haveECC;
  5890. ssl->options.haveStaticECC = ctx->haveStaticECC;
  5891. ssl->options.haveFalconSig = ctx->haveFalconSig;
  5892. ssl->options.haveDilithiumSig = ctx->haveDilithiumSig;
  5893. #ifndef NO_PSK
  5894. ssl->options.havePSK = ctx->havePSK;
  5895. ssl->options.client_psk_cb = ctx->client_psk_cb;
  5896. ssl->options.server_psk_cb = ctx->server_psk_cb;
  5897. ssl->options.psk_ctx = ctx->psk_ctx;
  5898. #ifdef WOLFSSL_TLS13
  5899. ssl->options.client_psk_cs_cb = ctx->client_psk_cs_cb;
  5900. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  5901. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  5902. #endif
  5903. #endif /* NO_PSK */
  5904. #ifdef WOLFSSL_EARLY_DATA
  5905. if (ssl->options.side == WOLFSSL_SERVER_END)
  5906. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  5907. #endif
  5908. #ifdef HAVE_ANON
  5909. ssl->options.useAnon = ctx->useAnon;
  5910. #endif
  5911. #ifndef NO_DH
  5912. ssl->options.minDhKeySz = ctx->minDhKeySz;
  5913. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  5914. #endif
  5915. #ifndef NO_RSA
  5916. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  5917. #endif
  5918. #ifdef HAVE_ECC
  5919. ssl->options.minEccKeySz = ctx->minEccKeySz;
  5920. #endif
  5921. #ifdef HAVE_PQC
  5922. #ifdef HAVE_FALCON
  5923. ssl->options.minFalconKeySz = ctx->minFalconKeySz;
  5924. #endif /* HAVE_FALCON */
  5925. #ifdef HAVE_DILITHIUM
  5926. ssl->options.minDilithiumKeySz = ctx->minDilithiumKeySz;
  5927. #endif /* HAVE_DILITHIUM */
  5928. #endif /* HAVE_PQC */
  5929. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  5930. ssl->options.verifyDepth = ctx->verifyDepth;
  5931. #endif
  5932. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  5933. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  5934. #ifdef HAVE_EXT_CACHE
  5935. ssl->options.internalCacheOff = ctx->internalCacheOff;
  5936. ssl->options.internalCacheLookupOff = ctx->internalCacheLookupOff;
  5937. #endif
  5938. ssl->options.verifyPeer = ctx->verifyPeer;
  5939. ssl->options.verifyNone = ctx->verifyNone;
  5940. ssl->options.failNoCert = ctx->failNoCert;
  5941. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  5942. ssl->options.sendVerify = ctx->sendVerify;
  5943. ssl->options.partialWrite = ctx->partialWrite;
  5944. ssl->options.quietShutdown = ctx->quietShutdown;
  5945. ssl->options.groupMessages = ctx->groupMessages;
  5946. #ifndef NO_DH
  5947. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5948. !defined(HAVE_SELFTEST)
  5949. ssl->options.dhKeyTested = ctx->dhKeyTested;
  5950. #endif
  5951. ssl->buffers.serverDH_P = ctx->serverDH_P;
  5952. ssl->buffers.serverDH_G = ctx->serverDH_G;
  5953. #endif
  5954. #if defined(HAVE_RPK)
  5955. ssl->options.rpkConfig = ctx->rpkConfig;
  5956. ssl->options.rpkState = ctx->rpkState;
  5957. #endif /* HAVE_RPK */
  5958. #ifndef NO_CERTS
  5959. /* ctx still owns certificate, certChain, key, dh, and cm */
  5960. ssl->buffers.certificate = ctx->certificate;
  5961. ssl->buffers.certChain = ctx->certChain;
  5962. #ifdef WOLFSSL_TLS13
  5963. ssl->buffers.certChainCnt = ctx->certChainCnt;
  5964. #endif
  5965. ssl->buffers.key = ctx->privateKey;
  5966. ssl->buffers.keyType = ctx->privateKeyType;
  5967. ssl->buffers.keyId = ctx->privateKeyId;
  5968. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  5969. ssl->buffers.keySz = ctx->privateKeySz;
  5970. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  5971. #ifdef WOLFSSL_DUAL_ALG_CERTS
  5972. ssl->buffers.altKey = ctx->altPrivateKey;
  5973. ssl->buffers.altKeyType = ctx->altPrivateKeyType;
  5974. ssl->buffers.altKeyId = ctx->altPrivateKeyId;
  5975. ssl->buffers.altKeyLabel = ctx->altPrivateKeyLabel;
  5976. ssl->buffers.altKeySz = ctx->altPrivateKeySz;
  5977. ssl->buffers.altKeyDevId = ctx->altPrivateKeyDevId;
  5978. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  5979. #endif
  5980. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5981. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  5982. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5983. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5984. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5985. ssl->buffers.keyType == ed25519_sa_algo ||
  5986. ssl->buffers.keyType == ed448_sa_algo ||
  5987. ssl->buffers.keyType == sm2_sa_algo;
  5988. #endif
  5989. #ifdef WOLFSSL_ASYNC_CRYPT
  5990. ssl->devId = ctx->devId;
  5991. #endif
  5992. if (writeDup == 0) {
  5993. #ifndef NO_PSK
  5994. if (ctx->server_hint[0]) { /* set in CTX */
  5995. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  5996. sizeof(ssl->arrays->server_hint));
  5997. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  5998. }
  5999. #endif /* NO_PSK */
  6000. if (ssl->suites != NULL) {
  6001. if (ctx->suites == NULL)
  6002. XMEMSET(ssl->suites, 0, sizeof(Suites));
  6003. else
  6004. XMEMCPY(ssl->suites, ctx->suites, sizeof(Suites));
  6005. }
  6006. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  6007. /* Defer initializing suites until accept or connect */
  6008. ret = InitSSL_Suites(ssl);
  6009. }
  6010. } /* writeDup check */
  6011. if (ctx->mask != 0 && wolfSSL_set_options(ssl, ctx->mask) == 0) {
  6012. WOLFSSL_MSG("wolfSSL_set_options error");
  6013. return BAD_FUNC_ARG;
  6014. }
  6015. #ifdef WOLFSSL_SESSION_EXPORT
  6016. #ifdef WOLFSSL_DTLS
  6017. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  6018. #endif
  6019. #endif
  6020. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  6021. ssl->AcceptFilter = ctx->AcceptFilter;
  6022. ssl->AcceptFilter_arg = ctx->AcceptFilter_arg;
  6023. ssl->ConnectFilter = ctx->ConnectFilter;
  6024. ssl->ConnectFilter_arg = ctx->ConnectFilter_arg;
  6025. #endif
  6026. #ifdef OPENSSL_EXTRA
  6027. ssl->readAhead = ctx->readAhead;
  6028. #endif
  6029. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  6030. /* Don't change recv callback if currently using BIO's */
  6031. if (ssl->CBIORecv != BioReceive)
  6032. #endif
  6033. ssl->CBIORecv = ctx->CBIORecv;
  6034. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  6035. /* Don't change send callback if currently using BIO's */
  6036. if (ssl->CBIOSend != BioSend)
  6037. #endif
  6038. ssl->CBIOSend = ctx->CBIOSend;
  6039. ssl->verifyDepth = ctx->verifyDepth;
  6040. return ret;
  6041. }
  6042. int InitHandshakeHashes(WOLFSSL* ssl)
  6043. {
  6044. int ret;
  6045. /* make sure existing handshake hashes are free'd */
  6046. if (ssl->hsHashes != NULL) {
  6047. FreeHandshakeHashes(ssl);
  6048. }
  6049. /* allocate handshake hashes */
  6050. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  6051. DYNAMIC_TYPE_HASHES);
  6052. if (ssl->hsHashes == NULL) {
  6053. WOLFSSL_MSG("HS_Hashes Memory error");
  6054. return MEMORY_E;
  6055. }
  6056. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  6057. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  6058. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  6059. if (ret != 0)
  6060. return ret;
  6061. #ifdef WOLFSSL_HASH_FLAGS
  6062. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  6063. #endif
  6064. #endif
  6065. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  6066. defined(WOLFSSL_ALLOW_TLS_SHA1))
  6067. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  6068. if (ret != 0)
  6069. return ret;
  6070. #ifdef WOLFSSL_HASH_FLAGS
  6071. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  6072. #endif
  6073. #endif
  6074. #ifndef NO_SHA256
  6075. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  6076. if (ret != 0)
  6077. return ret;
  6078. #ifdef WOLFSSL_HASH_FLAGS
  6079. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  6080. #endif
  6081. #endif
  6082. #ifdef WOLFSSL_SHA384
  6083. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  6084. if (ret != 0)
  6085. return ret;
  6086. #ifdef WOLFSSL_HASH_FLAGS
  6087. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  6088. #endif
  6089. #endif
  6090. #ifdef WOLFSSL_SHA512
  6091. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  6092. if (ret != 0)
  6093. return ret;
  6094. #ifdef WOLFSSL_HASH_FLAGS
  6095. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  6096. #endif
  6097. #endif
  6098. #ifdef WOLFSSL_SM3
  6099. ret = wc_InitSm3(&ssl->hsHashes->hashSm3, ssl->heap, ssl->devId);
  6100. if (ret != 0)
  6101. return ret;
  6102. #ifdef WOLFSSL_HASH_FLAGS
  6103. wc_Sm3SetFlags(&ssl->hsHashes->hashSm3, WC_HASH_FLAG_WILLCOPY);
  6104. #endif
  6105. #endif
  6106. return ret;
  6107. }
  6108. void FreeHandshakeHashes(WOLFSSL* ssl)
  6109. {
  6110. if (ssl->hsHashes) {
  6111. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  6112. wc_Md5Free(&ssl->hsHashes->hashMd5);
  6113. #endif
  6114. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  6115. defined(WOLFSSL_ALLOW_TLS_SHA1))
  6116. wc_ShaFree(&ssl->hsHashes->hashSha);
  6117. #endif
  6118. #ifndef NO_SHA256
  6119. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  6120. #endif
  6121. #ifdef WOLFSSL_SHA384
  6122. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  6123. #endif
  6124. #ifdef WOLFSSL_SHA512
  6125. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  6126. #endif
  6127. #ifdef WOLFSSL_SM3
  6128. wc_Sm3Free(&ssl->hsHashes->hashSm3);
  6129. #endif
  6130. #if (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  6131. (defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3))) && \
  6132. !defined(WOLFSSL_NO_CLIENT_AUTH)
  6133. if (ssl->hsHashes->messages != NULL) {
  6134. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  6135. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  6136. ssl->hsHashes->messages = NULL;
  6137. }
  6138. #endif
  6139. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  6140. ssl->hsHashes = NULL;
  6141. }
  6142. }
  6143. /* copy the hashes from source to a newly made destination return status */
  6144. int InitHandshakeHashesAndCopy(WOLFSSL* ssl, HS_Hashes* source,
  6145. HS_Hashes** destination)
  6146. {
  6147. int ret = 0;
  6148. HS_Hashes* tmpHashes;
  6149. if (source == NULL)
  6150. return BAD_FUNC_ARG;
  6151. /* save the original so we can put it back afterward */
  6152. tmpHashes = ssl->hsHashes;
  6153. ssl->hsHashes = NULL;
  6154. InitHandshakeHashes(ssl);
  6155. *destination = ssl->hsHashes;
  6156. ssl->hsHashes = tmpHashes;
  6157. /* now copy the source contents to the destination */
  6158. #ifndef NO_OLD_TLS
  6159. #ifndef NO_SHA
  6160. ret = wc_ShaCopy(&source->hashSha, &(*destination)->hashSha);
  6161. #endif
  6162. #ifndef NO_MD5
  6163. if (ret == 0)
  6164. ret = wc_Md5Copy(&source->hashMd5, &(*destination)->hashMd5);
  6165. #endif
  6166. #endif /* !NO_OLD_TLS */
  6167. #ifndef NO_SHA256
  6168. if (ret == 0)
  6169. ret = wc_Sha256Copy(&source->hashSha256,
  6170. &(*destination)->hashSha256);
  6171. #endif
  6172. #ifdef WOLFSSL_SHA384
  6173. if (ret == 0)
  6174. ret = wc_Sha384Copy(&source->hashSha384,
  6175. &(*destination)->hashSha384);
  6176. #endif
  6177. #ifdef WOLFSSL_SHA512
  6178. if (ret == 0)
  6179. ret = wc_Sha512Copy(&source->hashSha512,
  6180. &(*destination)->hashSha512);
  6181. #endif
  6182. #ifdef WOLFSSL_SM3
  6183. if (ret == 0)
  6184. ret = wc_Sm3Copy(&source->hashSm3,
  6185. &(*destination)->hashSm3);
  6186. #endif
  6187. #if (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  6188. (defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3))) && \
  6189. !defined(WOLFSSL_NO_CLIENT_AUTH)
  6190. if (ret == 0 && source->messages != NULL) {
  6191. (*destination)->messages = (byte*)XMALLOC(source->length, ssl->heap,
  6192. DYNAMIC_TYPE_HASHES);
  6193. (*destination)->length = source->length;
  6194. (*destination)->prevLen = source->prevLen;
  6195. if ((*destination)->messages == NULL) {
  6196. ret = MEMORY_E;
  6197. }
  6198. else {
  6199. XMEMCPY((*destination)->messages, source->messages,
  6200. source->length);
  6201. }
  6202. }
  6203. #endif
  6204. return ret;
  6205. }
  6206. /* called if user attempts to reuse WOLFSSL object for a new session.
  6207. * For example wolfSSL_clear() is called then wolfSSL_connect or accept */
  6208. int ReinitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  6209. {
  6210. int ret = 0;
  6211. WOLFSSL_ENTER("ReinitSSL");
  6212. /* arrays */
  6213. if (!writeDup && ssl->arrays == NULL) {
  6214. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  6215. DYNAMIC_TYPE_ARRAYS);
  6216. if (ssl->arrays == NULL) {
  6217. WOLFSSL_MSG("Arrays Memory error");
  6218. return MEMORY_E;
  6219. }
  6220. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6221. wc_MemZero_Add("SSL Arrays", ssl->arrays, sizeof(*ssl->arrays));
  6222. #endif
  6223. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  6224. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  6225. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  6226. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  6227. DYNAMIC_TYPE_SECRET);
  6228. if (ssl->arrays->preMasterSecret == NULL) {
  6229. return MEMORY_E;
  6230. }
  6231. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6232. wc_MemZero_Add("SSL Arrays", ssl->arrays->preMasterSecret, ENCRYPT_LEN);
  6233. #endif
  6234. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  6235. #endif
  6236. }
  6237. /* RNG */
  6238. #ifdef SINGLE_THREADED
  6239. if (ssl->rng == NULL) {
  6240. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  6241. }
  6242. #endif
  6243. if (ssl->rng == NULL) {
  6244. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  6245. if (ssl->rng == NULL) {
  6246. WOLFSSL_MSG("RNG Memory error");
  6247. return MEMORY_E;
  6248. }
  6249. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  6250. ssl->options.weOwnRng = 1;
  6251. /* FIPS RNG API does not accept a heap hint */
  6252. #ifndef HAVE_FIPS
  6253. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  6254. WOLFSSL_MSG("RNG Init error");
  6255. return ret;
  6256. }
  6257. #else
  6258. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  6259. WOLFSSL_MSG("RNG Init error");
  6260. return ret;
  6261. }
  6262. #endif
  6263. }
  6264. (void)ctx;
  6265. ssl->options.shutdownDone = 0;
  6266. if (ssl->session != NULL)
  6267. ssl->session->side = (byte)ssl->options.side;
  6268. return ret;
  6269. }
  6270. /* init everything to 0, NULL, default values before calling anything that may
  6271. fail so that destructor has a "good" state to cleanup
  6272. ssl object to initialize
  6273. ctx parent factory
  6274. writeDup flag indicating this is a write dup only
  6275. 0 on success */
  6276. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  6277. {
  6278. int ret;
  6279. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  6280. #ifdef WOLFSSL_CHECK_MEM_ZERO
  6281. wc_MemZero_Add("SSL Keys", &ssl->keys, sizeof(ssl->keys));
  6282. #ifdef WOLFSSL_TLS13
  6283. wc_MemZero_Add("SSL client secret", &ssl->clientSecret,
  6284. sizeof(ssl->clientSecret));
  6285. wc_MemZero_Add("SSL client secret", &ssl->serverSecret,
  6286. sizeof(ssl->serverSecret));
  6287. #endif
  6288. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  6289. wc_MemZero_Add("ClientFinished hash", &ssl->clientFinished,
  6290. TLS_FINISHED_SZ_MAX);
  6291. wc_MemZero_Add("ServerFinished hash", &ssl->serverFinished,
  6292. TLS_FINISHED_SZ_MAX);
  6293. #endif
  6294. #endif
  6295. #if defined(WOLFSSL_STATIC_MEMORY)
  6296. if (ctx->heap != NULL) {
  6297. WOLFSSL_HEAP_HINT* ssl_hint;
  6298. WOLFSSL_HEAP_HINT* ctx_hint;
  6299. /* avoid dereferencing a test value */
  6300. #ifdef WOLFSSL_HEAP_TEST
  6301. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  6302. ssl->heap = ctx->heap;
  6303. }
  6304. else {
  6305. #endif
  6306. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  6307. ctx->heap, DYNAMIC_TYPE_SSL);
  6308. if (ssl->heap == NULL) {
  6309. return MEMORY_E;
  6310. }
  6311. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  6312. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  6313. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  6314. /* lock and check IO count / handshake count */
  6315. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  6316. WOLFSSL_MSG("Bad memory_mutex lock");
  6317. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  6318. ssl->heap = NULL; /* free and set to NULL for IO counter */
  6319. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  6320. return BAD_MUTEX_E;
  6321. }
  6322. if (ctx_hint->memory->maxHa > 0 &&
  6323. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  6324. WOLFSSL_MSG("At max number of handshakes for static memory");
  6325. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6326. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  6327. ssl->heap = NULL; /* free and set to NULL for IO counter */
  6328. return MEMORY_E;
  6329. }
  6330. if (ctx_hint->memory->maxIO > 0 &&
  6331. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  6332. WOLFSSL_MSG("At max number of IO allowed for static memory");
  6333. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6334. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  6335. ssl->heap = NULL; /* free and set to NULL for IO counter */
  6336. return MEMORY_E;
  6337. }
  6338. ctx_hint->memory->curIO++;
  6339. ctx_hint->memory->curHa++;
  6340. ssl_hint->memory = ctx_hint->memory;
  6341. ssl_hint->haFlag = 1;
  6342. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6343. /* check if tracking stats */
  6344. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  6345. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  6346. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  6347. if (ssl_hint->stats == NULL) {
  6348. return MEMORY_E;
  6349. }
  6350. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  6351. }
  6352. /* check if using fixed IO buffers */
  6353. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  6354. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  6355. WOLFSSL_MSG("Bad memory_mutex lock");
  6356. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  6357. return BAD_MUTEX_E;
  6358. }
  6359. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  6360. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6361. return MEMORY_E;
  6362. }
  6363. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  6364. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6365. return MEMORY_E;
  6366. }
  6367. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  6368. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  6369. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6370. return MEMORY_E;
  6371. }
  6372. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  6373. }
  6374. #ifdef WOLFSSL_HEAP_TEST
  6375. }
  6376. #endif
  6377. }
  6378. else {
  6379. ssl->heap = ctx->heap;
  6380. }
  6381. #else
  6382. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  6383. #endif /* WOLFSSL_STATIC_MEMORY */
  6384. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  6385. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  6386. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  6387. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  6388. #ifdef KEEP_PEER_CERT
  6389. InitX509(&ssl->peerCert, 0, ssl->heap);
  6390. #endif
  6391. ssl->rfd = -1; /* set to invalid descriptor */
  6392. ssl->wfd = -1;
  6393. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  6394. /* initialize states */
  6395. ssl->options.serverState = NULL_STATE;
  6396. ssl->options.clientState = NULL_STATE;
  6397. ssl->options.connectState = CONNECT_BEGIN;
  6398. ssl->options.acceptState = ACCEPT_BEGIN;
  6399. ssl->options.handShakeState = NULL_STATE;
  6400. ssl->options.processReply = doProcessInit;
  6401. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  6402. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  6403. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  6404. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  6405. #ifndef NO_DH
  6406. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  6407. !defined(HAVE_SELFTEST)
  6408. ssl->options.dhDoKeyTest = 1;
  6409. #endif
  6410. #endif
  6411. #ifdef WOLFSSL_DTLS
  6412. #ifdef WOLFSSL_SCTP
  6413. ssl->options.dtlsSctp = ctx->dtlsSctp;
  6414. #endif
  6415. #ifdef WOLFSSL_SRTP
  6416. ssl->dtlsSrtpProfiles = ctx->dtlsSrtpProfiles;
  6417. #endif
  6418. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  6419. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  6420. #endif
  6421. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  6422. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  6423. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6424. ssl->buffers.dtlsCtx.rfd = -1;
  6425. ssl->buffers.dtlsCtx.wfd = -1;
  6426. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx; /* prevent invalid pointer access if not */
  6427. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx; /* correctly set */
  6428. #else
  6429. #ifdef HAVE_NETX
  6430. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  6431. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  6432. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  6433. ssl->mnCtx = mynewt_ctx_new();
  6434. if(!ssl->mnCtx) {
  6435. return MEMORY_E;
  6436. }
  6437. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  6438. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  6439. #elif defined (WOLFSSL_GNRC)
  6440. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  6441. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  6442. #else
  6443. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  6444. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  6445. #endif
  6446. #endif
  6447. #ifndef WOLFSSL_AEAD_ONLY
  6448. #ifndef NO_OLD_TLS
  6449. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  6450. #elif !defined(WOLFSSL_NO_TLS12) && !defined(NO_TLS)
  6451. #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  6452. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  6453. ssl->hmac = TLS_hmac;
  6454. #else
  6455. ssl->hmac = Renesas_cmn_TLS_hmac;
  6456. #endif
  6457. #endif
  6458. #endif
  6459. #if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
  6460. /* Save arrays by default for OpenVPN */
  6461. ssl->options.saveArrays = 1;
  6462. #endif
  6463. ssl->cipher.ssl = ssl;
  6464. #ifdef HAVE_EXTENDED_MASTER
  6465. ssl->options.haveEMS = ctx->haveEMS;
  6466. #endif
  6467. ssl->options.useClientOrder = ctx->useClientOrder;
  6468. ssl->options.mutualAuth = ctx->mutualAuth;
  6469. #ifdef WOLFSSL_TLS13
  6470. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  6471. ssl->options.maxTicketTls13 = ctx->maxTicketTls13;
  6472. #endif
  6473. #ifdef HAVE_SESSION_TICKET
  6474. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  6475. #endif
  6476. #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
  6477. ssl->options.noPskDheKe = ctx->noPskDheKe;
  6478. #ifdef HAVE_SUPPORTED_CURVES
  6479. ssl->options.onlyPskDheKe = ctx->onlyPskDheKe;
  6480. #endif /* HAVE_SUPPORTED_CURVES */
  6481. #endif /* HAVE_SESSION_TICKET || !NO_PSK */
  6482. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6483. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  6484. ssl->options.verifyPostHandshake = ctx->verifyPostHandshake;
  6485. #endif
  6486. if (ctx->numGroups > 0) {
  6487. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  6488. ssl->numGroups = ctx->numGroups;
  6489. }
  6490. #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
  6491. ssl->options.tls13MiddleBoxCompat = 1;
  6492. #endif
  6493. #endif
  6494. #ifdef HAVE_TLS_EXTENSIONS
  6495. #ifdef HAVE_MAX_FRAGMENT
  6496. ssl->max_fragment = MAX_RECORD_SIZE;
  6497. #endif
  6498. #ifdef HAVE_ALPN
  6499. ssl->alpn_peer_requested = NULL;
  6500. ssl->alpn_peer_requested_length = 0;
  6501. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  6502. ssl->alpnSelect = ctx->alpnSelect;
  6503. ssl->alpnSelectArg = ctx->alpnSelectArg;
  6504. #endif
  6505. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  6506. if (ctx->alpn_cli_protos != NULL && ctx->alpn_cli_protos_len > 0) {
  6507. ret = wolfSSL_set_alpn_protos(ssl, ctx->alpn_cli_protos,
  6508. ctx->alpn_cli_protos_len);
  6509. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  6510. if (ret) {
  6511. #else
  6512. if (!ret) {
  6513. #endif
  6514. WOLFSSL_MSG("failed to set alpn protos to ssl object");
  6515. return ret;
  6516. }
  6517. }
  6518. #endif
  6519. #endif
  6520. #ifdef HAVE_SUPPORTED_CURVES
  6521. ssl->options.userCurves = ctx->userCurves;
  6522. #endif
  6523. #endif /* HAVE_TLS_EXTENSIONS */
  6524. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  6525. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  6526. #endif
  6527. /* default alert state (none) */
  6528. ssl->alert_history.last_rx.code = -1;
  6529. ssl->alert_history.last_rx.level = -1;
  6530. ssl->alert_history.last_tx.code = -1;
  6531. ssl->alert_history.last_tx.level = -1;
  6532. #ifdef WOLFSSL_SESSION_ID_CTX
  6533. /* copy over application session context ID */
  6534. ssl->sessionCtxSz = ctx->sessionCtxSz;
  6535. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  6536. #endif
  6537. #ifdef OPENSSL_EXTRA
  6538. ssl->cbioFlag = ctx->cbioFlag;
  6539. ssl->protoMsgCb = ctx->protoMsgCb;
  6540. ssl->protoMsgCtx = ctx->protoMsgCtx;
  6541. /* follow default behavior of setting toInfoOn similar to
  6542. * wolfSSL_set_msg_callback when the callback is set */
  6543. if (ctx->protoMsgCb != NULL) {
  6544. ssl->toInfoOn = 1;
  6545. }
  6546. ssl->disabledCurves = ctx->disabledCurves;
  6547. #endif
  6548. InitCiphers(ssl);
  6549. InitCipherSpecs(&ssl->specs);
  6550. /* all done with init, now can return errors, call other stuff */
  6551. if ((ret = ReinitSSL(ssl, ctx, writeDup)) != 0) {
  6552. WOLFSSL_MSG_EX("ReinitSSL failed. err = %d", ret);
  6553. return ret;
  6554. }
  6555. if (!writeDup) {
  6556. #ifdef OPENSSL_EXTRA
  6557. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  6558. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  6559. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  6560. WOLFSSL_MSG("ssl->param memory error");
  6561. return MEMORY_E;
  6562. }
  6563. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  6564. #endif
  6565. if (ctx->suites == NULL) {
  6566. /* suites */
  6567. ret = AllocateCtxSuites(ctx);
  6568. if (ret != 0)
  6569. return ret;
  6570. InitSSL_CTX_Suites(ctx);
  6571. }
  6572. #ifdef OPENSSL_ALL
  6573. ssl->suitesStack = NULL;
  6574. #endif
  6575. } /* !writeDup */
  6576. /* Initialize SSL with the appropriate fields from it's ctx */
  6577. /* requires valid arrays and suites unless writeDup ing */
  6578. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS
  6579. #ifdef WOLFSSL_NO_INIT_CTX_KEY
  6580. && ret != NO_PRIVATE_KEY
  6581. #endif
  6582. ) {
  6583. WOLFSSL_MSG_EX("SetSSL_CTX failed. err = %d", ret);
  6584. return ret;
  6585. }
  6586. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  6587. #ifdef HAVE_WRITE_DUP
  6588. if (writeDup) {
  6589. /* all done */
  6590. return 0;
  6591. }
  6592. #endif
  6593. /* hsHashes */
  6594. ret = InitHandshakeHashes(ssl);
  6595. if (ret != 0) {
  6596. WOLFSSL_MSG_EX("InitHandshakeHashes failed. err = %d", ret);
  6597. return ret;
  6598. }
  6599. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  6600. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  6601. /* Initialize both in case we allow downgrading. */
  6602. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  6603. if (ret != 0) {
  6604. WOLFSSL_MSG("DTLS Cookie Secret error");
  6605. return ret;
  6606. }
  6607. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
  6608. if (IsAtLeastTLSv1_3(ssl->version)) {
  6609. ret = wolfSSL_send_hrr_cookie(ssl, NULL, 0);
  6610. if (ret != WOLFSSL_SUCCESS) {
  6611. WOLFSSL_MSG("DTLS1.3 Cookie secret error");
  6612. return ret;
  6613. }
  6614. }
  6615. #endif /* WOLFSSL_DTLS13 && WOLFSSL_SEND_HRR_COOKIE */
  6616. }
  6617. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  6618. #ifdef HAVE_SECRET_CALLBACK
  6619. ssl->sessionSecretCb = NULL;
  6620. ssl->sessionSecretCtx = NULL;
  6621. #ifdef WOLFSSL_TLS13
  6622. ssl->tls13SecretCb = NULL;
  6623. ssl->tls13SecretCtx = NULL;
  6624. #endif
  6625. #endif
  6626. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  6627. if (ctx->keyLogCb != NULL) {
  6628. ssl->keyLogCb = SessionSecret_callback;
  6629. #if defined(WOLFSSL_TLS13)
  6630. ssl->tls13KeyLogCb = SessionSecret_callback_Tls13;
  6631. #endif /*WOLFSSL_TLS13*/
  6632. }
  6633. #endif /*OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  6634. ssl->session = wolfSSL_NewSession(ssl->heap);
  6635. if (ssl->session == NULL) {
  6636. WOLFSSL_MSG_EX("SSL Session Memory error. wolfSSL_NewSession "
  6637. "err = %d", ret);
  6638. return MEMORY_E;
  6639. }
  6640. #ifdef HAVE_SESSION_TICKET
  6641. ssl->options.noTicketTls12 = ctx->noTicketTls12;
  6642. #endif
  6643. #ifdef WOLFSSL_MULTICAST
  6644. if (ctx->haveMcast) {
  6645. int i;
  6646. ssl->options.haveMcast = 1;
  6647. ssl->options.mcastID = ctx->mcastID;
  6648. /* Force the state to look like handshake has completed. */
  6649. /* Keying material is supplied externally. */
  6650. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  6651. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  6652. ssl->options.connectState = SECOND_REPLY_DONE;
  6653. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  6654. ssl->options.handShakeState = HANDSHAKE_DONE;
  6655. ssl->options.handShakeDone = 1;
  6656. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  6657. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  6658. }
  6659. #endif
  6660. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  6661. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  6662. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  6663. int useSecureReneg = ssl->ctx->useSecureReneg;
  6664. /* use secure renegotiation by default (not recommend) */
  6665. #if defined(WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT) || \
  6666. (defined(WOLFSSL_HARDEN_TLS) && !defined(WOLFSSL_NO_TLS12) && \
  6667. !defined(WOLFSSL_HARDEN_TLS_NO_SCR_CHECK))
  6668. useSecureReneg = 1;
  6669. #endif
  6670. if (useSecureReneg) {
  6671. ret = wolfSSL_UseSecureRenegotiation(ssl);
  6672. if (ret != WOLFSSL_SUCCESS)
  6673. return ret;
  6674. }
  6675. }
  6676. #endif /* HAVE_SECURE_RENEGOTIATION */
  6677. #ifdef WOLFSSL_DTLS13
  6678. /* setup 0 (un-protected) epoch */
  6679. ssl->dtls13Epochs[0].isValid = 1;
  6680. ssl->dtls13Epochs[0].side = ENCRYPT_AND_DECRYPT_SIDE;
  6681. ssl->dtls13EncryptEpoch = &ssl->dtls13Epochs[0];
  6682. ssl->dtls13DecryptEpoch = &ssl->dtls13Epochs[0];
  6683. ssl->options.dtls13SendMoreAcks = WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT;
  6684. ssl->dtls13Rtx.rtxRecordTailPtr = &ssl->dtls13Rtx.rtxRecords;
  6685. #endif /* WOLFSSL_DTLS13 */
  6686. #ifdef WOLFSSL_QUIC
  6687. if (ctx->quic.method) {
  6688. ret = wolfSSL_set_quic_method(ssl, ctx->quic.method);
  6689. if (ret != WOLFSSL_SUCCESS)
  6690. return ret;
  6691. }
  6692. #endif
  6693. #if defined(WOLFSSL_MAXQ10XX_TLS)
  6694. ret = wolfSSL_maxq10xx_load_certificate(ssl);
  6695. if (ret != WOLFSSL_SUCCESS)
  6696. return ret;
  6697. #endif
  6698. #if defined(HAVE_SECRET_CALLBACK) && defined(SHOW_SECRETS) && \
  6699. defined(WOLFSSL_SSLKEYLOGFILE) && defined(WOLFSSL_TLS13)
  6700. (void)wolfSSL_set_tls13_secret_cb(ssl, tls13ShowSecrets, NULL);
  6701. #endif
  6702. #if defined(HAVE_SECRET_CALLBACK) && defined(SHOW_SECRETS)
  6703. (void)wolfSSL_set_secret_cb(ssl, tlsShowSecrets, NULL);
  6704. #endif
  6705. #ifdef WOLFSSL_DUAL_ALG_CERTS
  6706. ssl->sigSpec = ctx->sigSpec;
  6707. ssl->sigSpecSz = ctx->sigSpecSz;
  6708. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  6709. /* Returns 0 on success, not WOLFSSL_SUCCESS (1) */
  6710. WOLFSSL_MSG_EX("InitSSL done. return 0 (success)");
  6711. return 0;
  6712. }
  6713. /* free use of temporary arrays */
  6714. void FreeArrays(WOLFSSL* ssl, int keep)
  6715. {
  6716. if (ssl->arrays) {
  6717. if (keep && !IsAtLeastTLSv1_3(ssl->version)) {
  6718. /* keeps session id for user retrieval */
  6719. XMEMCPY(ssl->session->sessionID, ssl->arrays->sessionID, ID_LEN);
  6720. ssl->session->sessionIDSz = ssl->arrays->sessionIDSz;
  6721. }
  6722. if (ssl->arrays->preMasterSecret) {
  6723. ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
  6724. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  6725. ssl->arrays->preMasterSecret = NULL;
  6726. }
  6727. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  6728. ssl->arrays->pendingMsg = NULL;
  6729. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  6730. }
  6731. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  6732. ssl->arrays = NULL;
  6733. }
  6734. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  6735. {
  6736. if (ssl && pKey && *pKey) {
  6737. switch (type) {
  6738. #ifndef NO_RSA
  6739. case DYNAMIC_TYPE_RSA:
  6740. wc_FreeRsaKey((RsaKey*)*pKey);
  6741. break;
  6742. #endif /* ! NO_RSA */
  6743. #ifdef HAVE_ECC
  6744. case DYNAMIC_TYPE_ECC:
  6745. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6746. defined(WC_ASYNC_ENABLE_ECC)
  6747. if (((ecc_key*)*pKey)->nb_ctx != NULL) {
  6748. XFREE(((ecc_key*)*pKey)->nb_ctx, ((ecc_key*)*pKey)->heap,
  6749. DYNAMIC_TYPE_TMP_BUFFER);
  6750. }
  6751. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
  6752. WC_ASYNC_ENABLE_ECC */
  6753. wc_ecc_free((ecc_key*)*pKey);
  6754. break;
  6755. #endif /* HAVE_ECC */
  6756. #ifdef HAVE_ED25519
  6757. case DYNAMIC_TYPE_ED25519:
  6758. wc_ed25519_free((ed25519_key*)*pKey);
  6759. break;
  6760. #endif /* HAVE_ED25519 */
  6761. #ifdef HAVE_CURVE25519
  6762. case DYNAMIC_TYPE_CURVE25519:
  6763. wc_curve25519_free((curve25519_key*)*pKey);
  6764. break;
  6765. #endif /* HAVE_CURVE25519 */
  6766. #ifdef HAVE_ED448
  6767. case DYNAMIC_TYPE_ED448:
  6768. wc_ed448_free((ed448_key*)*pKey);
  6769. break;
  6770. #endif /* HAVE_ED448 */
  6771. #ifdef HAVE_CURVE448
  6772. case DYNAMIC_TYPE_CURVE448:
  6773. wc_curve448_free((curve448_key*)*pKey);
  6774. break;
  6775. #endif /* HAVE_CURVE448 */
  6776. #if defined(HAVE_PQC)
  6777. #if defined(HAVE_FALCON)
  6778. case DYNAMIC_TYPE_FALCON:
  6779. wc_falcon_free((falcon_key*)*pKey);
  6780. break;
  6781. #endif /* HAVE_FALCON */
  6782. #if defined(HAVE_DILITHIUM)
  6783. case DYNAMIC_TYPE_DILITHIUM:
  6784. wc_dilithium_free((dilithium_key*)*pKey);
  6785. break;
  6786. #endif /* HAVE_DILITHIUM */
  6787. #endif /* HAVE_PQC */
  6788. #ifndef NO_DH
  6789. case DYNAMIC_TYPE_DH:
  6790. wc_FreeDhKey((DhKey*)*pKey);
  6791. break;
  6792. #endif /* !NO_DH */
  6793. default:
  6794. break;
  6795. }
  6796. XFREE(*pKey, ssl->heap, type);
  6797. /* Reset pointer */
  6798. *pKey = NULL;
  6799. }
  6800. }
  6801. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  6802. {
  6803. int ret = BAD_FUNC_ARG;
  6804. int sz = 0;
  6805. #ifdef HAVE_ECC
  6806. ecc_key* eccKey;
  6807. #endif /* HAVE_ECC */
  6808. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6809. defined(WC_ASYNC_ENABLE_ECC)
  6810. ecc_nb_ctx_t* nbCtx;
  6811. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW && WC_ASYNC_ENABLE_ECC*/
  6812. if (ssl == NULL || pKey == NULL) {
  6813. return BAD_FUNC_ARG;
  6814. }
  6815. /* Sanity check key destination */
  6816. if (*pKey != NULL) {
  6817. WOLFSSL_MSG("Key already present!");
  6818. #ifdef WOLFSSL_ASYNC_CRYPT
  6819. /* allow calling this again for async reentry */
  6820. if (ssl->error == WC_PENDING_E) {
  6821. return 0;
  6822. }
  6823. #endif
  6824. return BAD_STATE_E;
  6825. }
  6826. /* Determine size */
  6827. switch (type) {
  6828. #ifndef NO_RSA
  6829. case DYNAMIC_TYPE_RSA:
  6830. sz = sizeof(RsaKey);
  6831. break;
  6832. #endif /* ! NO_RSA */
  6833. #ifdef HAVE_ECC
  6834. case DYNAMIC_TYPE_ECC:
  6835. sz = sizeof(ecc_key);
  6836. break;
  6837. #endif /* HAVE_ECC */
  6838. #ifdef HAVE_ED25519
  6839. case DYNAMIC_TYPE_ED25519:
  6840. sz = sizeof(ed25519_key);
  6841. break;
  6842. #endif /* HAVE_ED25519 */
  6843. #ifdef HAVE_CURVE25519
  6844. case DYNAMIC_TYPE_CURVE25519:
  6845. sz = sizeof(curve25519_key);
  6846. break;
  6847. #endif /* HAVE_CURVE25519 */
  6848. #ifdef HAVE_ED448
  6849. case DYNAMIC_TYPE_ED448:
  6850. sz = sizeof(ed448_key);
  6851. break;
  6852. #endif /* HAVE_ED448 */
  6853. #ifdef HAVE_CURVE448
  6854. case DYNAMIC_TYPE_CURVE448:
  6855. sz = sizeof(curve448_key);
  6856. break;
  6857. #endif /* HAVE_CURVE448 */
  6858. #if defined(HAVE_PQC)
  6859. #if defined(HAVE_FALCON)
  6860. case DYNAMIC_TYPE_FALCON:
  6861. sz = sizeof(falcon_key);
  6862. break;
  6863. #endif /* HAVE_FALCON */
  6864. #if defined(HAVE_DILITHIUM)
  6865. case DYNAMIC_TYPE_DILITHIUM:
  6866. sz = sizeof(dilithium_key);
  6867. break;
  6868. #endif /* HAVE_DILITHIUM */
  6869. #endif /* HAVE_PQC */
  6870. #ifndef NO_DH
  6871. case DYNAMIC_TYPE_DH:
  6872. sz = sizeof(DhKey);
  6873. break;
  6874. #endif /* !NO_DH */
  6875. default:
  6876. return BAD_FUNC_ARG;
  6877. }
  6878. /* Allocate memory for key */
  6879. *pKey = (void *)XMALLOC(sz, ssl->heap, type);
  6880. if (*pKey == NULL) {
  6881. return MEMORY_E;
  6882. }
  6883. /* Initialize key */
  6884. switch (type) {
  6885. #ifndef NO_RSA
  6886. case DYNAMIC_TYPE_RSA:
  6887. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  6888. break;
  6889. #endif /* ! NO_RSA */
  6890. #ifdef HAVE_ECC
  6891. case DYNAMIC_TYPE_ECC:
  6892. eccKey = (ecc_key*)*pKey;
  6893. ret = wc_ecc_init_ex(eccKey, ssl->heap, ssl->devId);
  6894. if (ret == 0) {
  6895. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6896. defined(WC_ASYNC_ENABLE_ECC)
  6897. nbCtx = (ecc_nb_ctx_t*)XMALLOC(sizeof(ecc_nb_ctx_t),
  6898. eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6899. if (nbCtx == NULL) {
  6900. ret = MEMORY_E;
  6901. }
  6902. else {
  6903. ret = wc_ecc_set_nonblock(eccKey, nbCtx);
  6904. if (ret != 0) {
  6905. XFREE(nbCtx, eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6906. }
  6907. }
  6908. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
  6909. WC_ASYNC_ENABLE_ECC */
  6910. }
  6911. break;
  6912. #endif /* HAVE_ECC */
  6913. #ifdef HAVE_ED25519
  6914. case DYNAMIC_TYPE_ED25519:
  6915. wc_ed25519_init_ex((ed25519_key*)*pKey, ssl->heap, ssl->devId);
  6916. ret = 0;
  6917. break;
  6918. #endif /* HAVE_CURVE25519 */
  6919. #ifdef HAVE_CURVE25519
  6920. case DYNAMIC_TYPE_CURVE25519:
  6921. wc_curve25519_init_ex((curve25519_key*)*pKey, ssl->heap, ssl->devId);
  6922. ret = 0;
  6923. break;
  6924. #endif /* HAVE_CURVE25519 */
  6925. #ifdef HAVE_ED448
  6926. case DYNAMIC_TYPE_ED448:
  6927. wc_ed448_init_ex((ed448_key*)*pKey, ssl->heap, ssl->devId);
  6928. ret = 0;
  6929. break;
  6930. #endif /* HAVE_CURVE448 */
  6931. #if defined(HAVE_PQC)
  6932. #if defined(HAVE_FALCON)
  6933. case DYNAMIC_TYPE_FALCON:
  6934. wc_falcon_init_ex((falcon_key*)*pKey, ssl->heap, ssl->devId);
  6935. ret = 0;
  6936. break;
  6937. #endif /* HAVE_FALCON */
  6938. #if defined(HAVE_DILITHIUM)
  6939. case DYNAMIC_TYPE_DILITHIUM:
  6940. wc_dilithium_init_ex((dilithium_key*)*pKey, ssl->heap, ssl->devId);
  6941. ret = 0;
  6942. break;
  6943. #endif /* HAVE_DILITHIUM */
  6944. #endif /* HAVE_PQC */
  6945. #ifdef HAVE_CURVE448
  6946. case DYNAMIC_TYPE_CURVE448:
  6947. wc_curve448_init((curve448_key*)*pKey);
  6948. ret = 0;
  6949. break;
  6950. #endif /* HAVE_CURVE448 */
  6951. #ifndef NO_DH
  6952. case DYNAMIC_TYPE_DH:
  6953. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  6954. break;
  6955. #endif /* !NO_DH */
  6956. default:
  6957. return BAD_FUNC_ARG;
  6958. }
  6959. /* On error free handshake key */
  6960. if (ret != 0) {
  6961. FreeKey(ssl, type, pKey);
  6962. }
  6963. return ret;
  6964. }
  6965. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  6966. defined(HAVE_CURVE25519) || defined(HAVE_ED448) || \
  6967. defined(HAVE_CURVE448) || (defined(HAVE_PQC) && defined(HAVE_FALCON)) || \
  6968. (defined(HAVE_PQC) && defined(HAVE_DILITHIUM))
  6969. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  6970. {
  6971. int ret = 0;
  6972. (void)ssl;
  6973. switch (type) {
  6974. #ifndef NO_RSA
  6975. case DYNAMIC_TYPE_RSA:
  6976. wc_FreeRsaKey((RsaKey*)pKey);
  6977. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  6978. break;
  6979. #endif /* ! NO_RSA */
  6980. #ifdef HAVE_ECC
  6981. case DYNAMIC_TYPE_ECC:
  6982. wc_ecc_free((ecc_key*)pKey);
  6983. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  6984. break;
  6985. #endif /* HAVE_ECC */
  6986. #ifdef HAVE_ED25519
  6987. case DYNAMIC_TYPE_ED25519:
  6988. wc_ed25519_free((ed25519_key*)pKey);
  6989. ret = wc_ed25519_init_ex((ed25519_key*)pKey, ssl->heap,
  6990. ssl->devId);
  6991. break;
  6992. #endif /* HAVE_CURVE25519 */
  6993. #ifdef HAVE_CURVE25519
  6994. case DYNAMIC_TYPE_CURVE25519:
  6995. wc_curve25519_free((curve25519_key*)pKey);
  6996. ret = wc_curve25519_init_ex((curve25519_key*)pKey, ssl->heap,
  6997. ssl->devId);
  6998. break;
  6999. #endif /* HAVE_CURVE25519 */
  7000. #ifdef HAVE_ED448
  7001. case DYNAMIC_TYPE_ED448:
  7002. wc_ed448_free((ed448_key*)pKey);
  7003. ret = wc_ed448_init_ex((ed448_key*)pKey, ssl->heap, ssl->devId);
  7004. break;
  7005. #endif /* HAVE_CURVE448 */
  7006. #ifdef HAVE_CURVE448
  7007. case DYNAMIC_TYPE_CURVE448:
  7008. wc_curve448_free((curve448_key*)pKey);
  7009. ret = wc_curve448_init((curve448_key*)pKey);
  7010. break;
  7011. #endif /* HAVE_CURVE448 */
  7012. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  7013. case DYNAMIC_TYPE_FALCON:
  7014. wc_falcon_free((falcon_key*)pKey);
  7015. ret = wc_falcon_init((falcon_key*)pKey);
  7016. break;
  7017. #endif /* HAVE_PQC && HAVE_FALCON */
  7018. #ifndef NO_DH
  7019. case DYNAMIC_TYPE_DH:
  7020. wc_FreeDhKey((DhKey*)pKey);
  7021. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  7022. break;
  7023. #endif /* !NO_DH */
  7024. default:
  7025. return BAD_FUNC_ARG;
  7026. }
  7027. return ret;
  7028. }
  7029. #endif
  7030. #ifdef WOLFSSL_ASYNC_IO
  7031. void FreeAsyncCtx(WOLFSSL* ssl, byte freeAsync)
  7032. {
  7033. if (ssl->async != NULL) {
  7034. if (ssl->async->freeArgs != NULL) {
  7035. ssl->async->freeArgs(ssl, ssl->async->args);
  7036. ssl->async->freeArgs = NULL;
  7037. }
  7038. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WOLFSSL_NO_TLS12)
  7039. if (ssl->options.buildArgsSet) {
  7040. FreeBuildMsgArgs(ssl, &ssl->async->buildArgs);
  7041. ssl->options.buildArgsSet = 0;
  7042. }
  7043. #endif
  7044. if (freeAsync) {
  7045. XFREE(ssl->async, ssl->heap, DYNAMIC_TYPE_ASYNC);
  7046. ssl->async = NULL;
  7047. }
  7048. }
  7049. }
  7050. #endif
  7051. void FreeKeyExchange(WOLFSSL* ssl)
  7052. {
  7053. /* Cleanup signature buffer */
  7054. if (ssl->buffers.sig.buffer) {
  7055. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  7056. ssl->buffers.sig.buffer = NULL;
  7057. ssl->buffers.sig.length = 0;
  7058. }
  7059. /* Cleanup digest buffer */
  7060. if (ssl->buffers.digest.buffer) {
  7061. /* Only free if digest buffer was not set using SetDigest */
  7062. if (!ssl->options.dontFreeDigest) {
  7063. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  7064. }
  7065. ssl->buffers.digest.buffer = NULL;
  7066. ssl->buffers.digest.length = 0;
  7067. ssl->options.dontFreeDigest = 0;
  7068. }
  7069. /* Free handshake key */
  7070. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  7071. #ifdef WOLFSSL_DUAL_ALG_CERTS
  7072. FreeKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
  7073. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  7074. #ifndef NO_DH
  7075. /* Free temp DH key */
  7076. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  7077. #endif
  7078. }
  7079. /* Free up all memory used by Suites structure from WOLFSSL */
  7080. void FreeSuites(WOLFSSL* ssl)
  7081. {
  7082. #ifdef OPENSSL_ALL
  7083. if (ssl->suitesStack != NULL) {
  7084. /* Enough to free stack structure since WOLFSSL_CIPHER
  7085. * isn't allocated separately. */
  7086. wolfSSL_sk_SSL_CIPHER_free(ssl->suitesStack);
  7087. ssl->suitesStack = NULL;
  7088. }
  7089. #endif
  7090. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  7091. ssl->suites = NULL;
  7092. }
  7093. /* In case holding SSL object in array and don't want to free actual ssl */
  7094. void SSL_ResourceFree(WOLFSSL* ssl)
  7095. {
  7096. /* Note: any resources used during the handshake should be released in the
  7097. * function FreeHandshakeResources(). Be careful with the special cases
  7098. * like the RNG which may optionally be kept for the whole session. (For
  7099. * example with the RNG, it isn't used beyond the handshake except when
  7100. * using stream ciphers where it is retained. */
  7101. if (ssl->options.side == WOLFSSL_SERVER_END) {
  7102. WOLFSSL_MSG("Free'ing server ssl");
  7103. }
  7104. else {
  7105. WOLFSSL_MSG("Free'ing client ssl");
  7106. }
  7107. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  7108. wolfSSL_CRYPTO_cleanup_ex_data(&ssl->ex_data);
  7109. #endif
  7110. FreeCiphers(ssl);
  7111. FreeArrays(ssl, 0);
  7112. FreeKeyExchange(ssl);
  7113. #ifdef WOLFSSL_ASYNC_IO
  7114. /* Cleanup async */
  7115. FreeAsyncCtx(ssl, 1);
  7116. #endif
  7117. if (ssl->options.weOwnRng) {
  7118. wc_FreeRng(ssl->rng);
  7119. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  7120. ssl->rng = NULL;
  7121. ssl->options.weOwnRng = 0;
  7122. }
  7123. FreeSuites(ssl);
  7124. FreeHandshakeHashes(ssl);
  7125. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  7126. /* clear keys struct after session */
  7127. ForceZero(&ssl->keys, sizeof(Keys));
  7128. #ifdef WOLFSSL_TLS13
  7129. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  7130. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  7131. #if defined(HAVE_ECH)
  7132. if (ssl->options.useEch == 1) {
  7133. FreeEchConfigs(ssl->echConfigs, ssl->heap);
  7134. ssl->echConfigs = NULL;
  7135. /* free the ech specific hashes */
  7136. ssl->hsHashes = ssl->hsHashesEch;
  7137. FreeHandshakeHashes(ssl);
  7138. ssl->options.useEch = 0;
  7139. }
  7140. #endif /* HAVE_ECH */
  7141. #endif /* WOLFSSL_TLS13 */
  7142. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  7143. ForceZero(&ssl->clientFinished, TLS_FINISHED_SZ_MAX);
  7144. ForceZero(&ssl->serverFinished, TLS_FINISHED_SZ_MAX);
  7145. ssl->serverFinished_len = 0;
  7146. ssl->clientFinished_len = 0;
  7147. #endif
  7148. #ifndef NO_DH
  7149. if (ssl->buffers.serverDH_Priv.buffer != NULL) {
  7150. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  7151. ssl->buffers.serverDH_Priv.length);
  7152. }
  7153. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  7154. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7155. /* parameters (p,g) may be owned by ctx */
  7156. if (ssl->buffers.weOwnDH) {
  7157. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7158. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7159. }
  7160. #endif /* !NO_DH */
  7161. #ifndef NO_CERTS
  7162. ssl->keepCert = 0; /* make sure certificate is free'd */
  7163. wolfSSL_UnloadCertsKeys(ssl);
  7164. #endif
  7165. #ifndef NO_RSA
  7166. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  7167. ssl->peerRsaKeyPresent = 0;
  7168. #endif
  7169. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS)
  7170. XFREE(ssl->peerSceTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
  7171. Renesas_cmn_Cleanup(ssl);
  7172. #endif
  7173. if (ssl->buffers.inputBuffer.dynamicFlag)
  7174. ShrinkInputBuffer(ssl, FORCED_FREE);
  7175. if (ssl->buffers.outputBuffer.dynamicFlag)
  7176. ShrinkOutputBuffer(ssl);
  7177. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  7178. if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
  7179. ForceZero(ssl->buffers.tls13CookieSecret.buffer,
  7180. ssl->buffers.tls13CookieSecret.length);
  7181. }
  7182. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  7183. DYNAMIC_TYPE_COOKIE_PWD);
  7184. #endif
  7185. #ifdef WOLFSSL_DTLS
  7186. DtlsMsgPoolReset(ssl);
  7187. if (ssl->dtls_rx_msg_list != NULL) {
  7188. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  7189. ssl->dtls_rx_msg_list = NULL;
  7190. ssl->dtls_rx_msg_list_sz = 0;
  7191. }
  7192. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  7193. ssl->buffers.dtlsCtx.peer.sa = NULL;
  7194. #ifndef NO_WOLFSSL_SERVER
  7195. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  7196. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  7197. ssl->buffers.dtlsCookieSecret.length);
  7198. }
  7199. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  7200. DYNAMIC_TYPE_COOKIE_PWD);
  7201. #endif
  7202. #ifdef WOLFSSL_DTLS13
  7203. if (ssl->dtls13ClientHello != NULL) {
  7204. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  7205. ssl->dtls13ClientHello = NULL;
  7206. ssl->dtls13ClientHelloSz = 0;
  7207. }
  7208. #endif /* WOLFSSL_DTLS13 */
  7209. #endif /* WOLFSSL_DTLS */
  7210. #ifdef OPENSSL_EXTRA
  7211. #ifndef NO_BIO
  7212. /* Don't free if there was/is a previous element in the chain.
  7213. * This means that this BIO was part of a chain that will be
  7214. * free'd separately. */
  7215. if (ssl->biord != ssl->biowr) /* only free write if different */
  7216. if (ssl->biowr != NULL && ssl->biowr->prev == NULL)
  7217. wolfSSL_BIO_free(ssl->biowr);
  7218. if (ssl->biord != NULL && ssl->biord->prev == NULL)
  7219. wolfSSL_BIO_free(ssl->biord);
  7220. ssl->biowr = NULL;
  7221. ssl->biord = NULL;
  7222. #endif
  7223. #endif
  7224. #ifdef HAVE_LIBZ
  7225. FreeStreams(ssl);
  7226. #endif
  7227. #ifdef HAVE_ECC
  7228. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  7229. ssl->peerEccKeyPresent = 0;
  7230. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  7231. ssl->peerEccDsaKeyPresent = 0;
  7232. #endif
  7233. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
  7234. {
  7235. int dtype = 0;
  7236. #ifdef HAVE_ECC
  7237. dtype = DYNAMIC_TYPE_ECC;
  7238. #endif
  7239. #ifdef HAVE_CURVE25519
  7240. if (ssl->peerX25519KeyPresent
  7241. #ifdef HAVE_ECC
  7242. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
  7243. #endif /* HAVE_ECC */
  7244. )
  7245. {
  7246. dtype = DYNAMIC_TYPE_CURVE25519;
  7247. }
  7248. #endif /* HAVE_CURVE25519 */
  7249. #ifdef HAVE_CURVE448
  7250. if (ssl->peerX448KeyPresent
  7251. #ifdef HAVE_ECC
  7252. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
  7253. #endif /* HAVE_ECC */
  7254. )
  7255. {
  7256. dtype = DYNAMIC_TYPE_CURVE448;
  7257. }
  7258. #endif /* HAVE_CURVE448 */
  7259. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  7260. ssl->eccTempKeyPresent = 0;
  7261. }
  7262. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7263. #ifdef HAVE_CURVE25519
  7264. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  7265. ssl->peerX25519KeyPresent = 0;
  7266. #endif
  7267. #ifdef HAVE_ED25519
  7268. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  7269. ssl->peerEd25519KeyPresent = 0;
  7270. #ifdef HAVE_PK_CALLBACKS
  7271. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  7272. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  7273. DYNAMIC_TYPE_ED25519);
  7274. ssl->buffers.peerEd25519Key.buffer = NULL;
  7275. }
  7276. #endif
  7277. #endif
  7278. #ifdef HAVE_CURVE448
  7279. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  7280. ssl->peerX448KeyPresent = 0;
  7281. #endif
  7282. #ifdef HAVE_ED448
  7283. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  7284. ssl->peerEd448KeyPresent = 0;
  7285. #ifdef HAVE_PK_CALLBACKS
  7286. if (ssl->buffers.peerEd448Key.buffer != NULL) {
  7287. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
  7288. DYNAMIC_TYPE_ED448);
  7289. ssl->buffers.peerEd448Key.buffer = NULL;
  7290. }
  7291. #endif
  7292. #endif
  7293. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  7294. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  7295. ssl->peerFalconKeyPresent = 0;
  7296. #endif
  7297. #ifdef HAVE_PK_CALLBACKS
  7298. #ifdef HAVE_ECC
  7299. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  7300. #endif /* HAVE_ECC */
  7301. #ifndef NO_RSA
  7302. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  7303. #endif /* NO_RSA */
  7304. #endif /* HAVE_PK_CALLBACKS */
  7305. #ifdef HAVE_TLS_EXTENSIONS
  7306. #if !defined(NO_TLS)
  7307. TLSX_FreeAll(ssl->extensions, ssl->heap);
  7308. #endif /* !NO_TLS */
  7309. #ifdef HAVE_ALPN
  7310. if (ssl->alpn_peer_requested != NULL) {
  7311. XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
  7312. ssl->alpn_peer_requested = NULL;
  7313. ssl->alpn_peer_requested_length = 0;
  7314. }
  7315. #endif
  7316. #endif /* HAVE_TLS_EXTENSIONS */
  7317. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  7318. if (ssl->mnCtx) {
  7319. mynewt_ctx_clear(ssl->mnCtx);
  7320. ssl->mnCtx = NULL;
  7321. }
  7322. #endif
  7323. #ifdef HAVE_NETX
  7324. if (ssl->nxCtx.nxPacket)
  7325. nx_packet_release(ssl->nxCtx.nxPacket);
  7326. #endif
  7327. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  7328. if (ssl->x509_store_pt)
  7329. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  7330. #endif
  7331. #ifdef KEEP_PEER_CERT
  7332. FreeX509(&ssl->peerCert);
  7333. #endif
  7334. if (ssl->session != NULL)
  7335. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  7336. #ifdef HAVE_WRITE_DUP
  7337. if (ssl->dupWrite) {
  7338. FreeWriteDup(ssl);
  7339. }
  7340. #endif
  7341. #ifdef OPENSSL_EXTRA
  7342. if (ssl->param) {
  7343. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  7344. }
  7345. #endif
  7346. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7347. while (ssl->certReqCtx != NULL) {
  7348. CertReqCtx* curr = ssl->certReqCtx;
  7349. ssl->certReqCtx = curr->next;
  7350. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  7351. }
  7352. #endif
  7353. #ifdef WOLFSSL_STATIC_EPHEMERAL
  7354. #ifndef NO_DH
  7355. FreeDer(&ssl->staticKE.dhKey);
  7356. #endif
  7357. #ifdef HAVE_ECC
  7358. FreeDer(&ssl->staticKE.ecKey);
  7359. #endif
  7360. #ifdef HAVE_CURVE25519
  7361. FreeDer(&ssl->staticKE.x25519Key);
  7362. #endif
  7363. #ifdef HAVE_CURVE448
  7364. FreeDer(&ssl->staticKE.x448Key);
  7365. #endif
  7366. #endif
  7367. #ifdef WOLFSSL_STATIC_MEMORY
  7368. /* check if using fixed io buffers and free them */
  7369. if (ssl->heap != NULL) {
  7370. #ifdef WOLFSSL_HEAP_TEST
  7371. /* avoid dereferencing a test value */
  7372. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  7373. #endif
  7374. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  7375. WOLFSSL_HEAP* ctx_heap;
  7376. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  7377. ctx_heap = ssl_hint->memory;
  7378. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  7379. WOLFSSL_MSG("Bad memory_mutex lock");
  7380. }
  7381. ctx_heap->curIO--;
  7382. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  7383. WOLFSSL_MSG("Error freeing fixed output buffer");
  7384. }
  7385. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  7386. WOLFSSL_MSG("Error freeing fixed output buffer");
  7387. }
  7388. if (ssl_hint->haFlag && ctx_heap->curHa > 0) { /* check if handshake count has been decreased*/
  7389. ctx_heap->curHa--;
  7390. }
  7391. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  7392. /* check if tracking stats */
  7393. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  7394. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  7395. }
  7396. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  7397. #ifdef WOLFSSL_HEAP_TEST
  7398. }
  7399. #endif
  7400. }
  7401. #endif /* WOLFSSL_STATIC_MEMORY */
  7402. #ifdef OPENSSL_EXTRA
  7403. /* Enough to free stack structure since WOLFSSL_CIPHER
  7404. * isn't allocated separately. */
  7405. wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
  7406. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  7407. #ifdef KEEP_OUR_CERT
  7408. wolfSSL_sk_X509_pop_free(ssl->ourCertChain, NULL);
  7409. #endif
  7410. #endif
  7411. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  7412. wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
  7413. ssl->client_ca_names = NULL;
  7414. #endif
  7415. #ifdef WOLFSSL_DTLS13
  7416. Dtls13FreeFsmResources(ssl);
  7417. #endif /* WOLFSSL_DTLS13 */
  7418. #ifdef WOLFSSL_QUIC
  7419. wolfSSL_quic_free(ssl);
  7420. #endif
  7421. #if defined(WOLFSSL_HAPROXY)
  7422. wolfSSL_CTX_free(ssl->initial_ctx);
  7423. ssl->initial_ctx = NULL;
  7424. #endif
  7425. #ifdef WOLFSSL_DUAL_ALG_CERTS
  7426. XFREE(ssl->peerSigSpec, ssl->heap, DYNAMIC_TYPE_TLSX);
  7427. #endif
  7428. }
  7429. /* Free any handshake resources no longer needed */
  7430. void FreeHandshakeResources(WOLFSSL* ssl)
  7431. {
  7432. WOLFSSL_ENTER("FreeHandshakeResources");
  7433. #ifdef WOLFSSL_DTLS
  7434. if (ssl->options.dtls) {
  7435. /* DTLS_POOL (DTLSv1.3 flushes the queue autonomously) */
  7436. if(!IsAtLeastTLSv1_3(ssl->version)) {
  7437. DtlsMsgPoolReset(ssl);
  7438. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  7439. ssl->dtls_rx_msg_list = NULL;
  7440. ssl->dtls_rx_msg_list_sz = 0;
  7441. }
  7442. #ifdef WOLFSSL_DTLS13
  7443. if (ssl->dtls13ClientHello != NULL) {
  7444. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  7445. ssl->dtls13ClientHello = NULL;
  7446. ssl->dtls13ClientHelloSz = 0;
  7447. }
  7448. #endif /* WOLFSSL_DTLS13 */
  7449. }
  7450. #endif
  7451. #ifdef HAVE_SECURE_RENEGOTIATION
  7452. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  7453. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  7454. return;
  7455. }
  7456. #endif
  7457. /* input buffer */
  7458. if (ssl->buffers.inputBuffer.dynamicFlag)
  7459. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  7460. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7461. if (!ssl->options.tls1_3)
  7462. #endif
  7463. {
  7464. #ifndef OPENSSL_EXTRA
  7465. /* free suites unless using compatibility layer */
  7466. FreeSuites(ssl);
  7467. #endif
  7468. /* hsHashes */
  7469. FreeHandshakeHashes(ssl);
  7470. }
  7471. /* RNG */
  7472. if (ssl->options.tls1_1 == 0
  7473. #ifndef WOLFSSL_AEAD_ONLY
  7474. || ssl->specs.cipher_type == stream
  7475. #endif
  7476. #if defined(WOLFSSL_TLS13)
  7477. /* Post-handshake auth requires random on client side for TLS 1.3.
  7478. * Session ticket requires random on server side.
  7479. */
  7480. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && !defined(HAVE_SESSION_TICKET)
  7481. || ssl->options.tls1_3
  7482. #elif !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && defined(HAVE_SESSION_TICKET)
  7483. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_CLIENT_END)
  7484. #elif !defined(HAVE_SESSION_TICKET)
  7485. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  7486. #endif
  7487. #endif
  7488. ) {
  7489. if (ssl->options.weOwnRng) {
  7490. wc_FreeRng(ssl->rng);
  7491. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  7492. ssl->rng = NULL;
  7493. ssl->options.weOwnRng = 0;
  7494. }
  7495. }
  7496. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  7497. defined(HAVE_SESSION_TICKET)
  7498. if (!ssl->options.tls1_3)
  7499. #endif
  7500. /* arrays */
  7501. if (ssl->options.saveArrays == 0)
  7502. FreeArrays(ssl, 1);
  7503. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7504. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  7505. #endif
  7506. {
  7507. #ifndef NO_RSA
  7508. /* peerRsaKey */
  7509. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  7510. ssl->peerRsaKeyPresent = 0;
  7511. #endif
  7512. #ifdef HAVE_ECC
  7513. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  7514. ssl->peerEccDsaKeyPresent = 0;
  7515. #endif /* HAVE_ECC */
  7516. #ifdef HAVE_ED25519
  7517. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  7518. ssl->peerEd25519KeyPresent = 0;
  7519. #endif /* HAVE_ED25519 */
  7520. #ifdef HAVE_ED448
  7521. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  7522. ssl->peerEd448KeyPresent = 0;
  7523. #endif /* HAVE_ED448 */
  7524. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  7525. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  7526. ssl->peerFalconKeyPresent = 0;
  7527. #endif /* HAVE_PQC */
  7528. }
  7529. #ifdef HAVE_ECC
  7530. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  7531. ssl->peerEccKeyPresent = 0;
  7532. #endif
  7533. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7534. {
  7535. int dtype;
  7536. #ifdef HAVE_ECC
  7537. dtype = DYNAMIC_TYPE_ECC;
  7538. #elif defined(HAVE_CURVE25519)
  7539. dtype = DYNAMIC_TYPE_CURVE25519;
  7540. #else
  7541. dtype = DYNAMIC_TYPE_CURVE448;
  7542. #endif
  7543. #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
  7544. if (ssl->peerX25519KeyPresent ||
  7545. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  7546. {
  7547. dtype = DYNAMIC_TYPE_CURVE25519;
  7548. }
  7549. #endif
  7550. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  7551. defined(HAVE_CURVE448)
  7552. if (ssl->peerX448KeyPresent ||
  7553. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
  7554. {
  7555. dtype = DYNAMIC_TYPE_CURVE448;
  7556. }
  7557. #endif
  7558. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  7559. ssl->eccTempKeyPresent = 0;
  7560. }
  7561. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7562. #ifdef HAVE_CURVE25519
  7563. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  7564. ssl->peerX25519KeyPresent = 0;
  7565. #endif
  7566. #ifdef HAVE_CURVE448
  7567. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  7568. ssl->peerX448KeyPresent = 0;
  7569. #endif
  7570. #ifndef NO_DH
  7571. if (ssl->buffers.serverDH_Priv.buffer) {
  7572. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  7573. ssl->buffers.serverDH_Priv.length);
  7574. }
  7575. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  7576. ssl->buffers.serverDH_Priv.buffer = NULL;
  7577. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7578. ssl->buffers.serverDH_Pub.buffer = NULL;
  7579. /* parameters (p,g) may be owned by ctx */
  7580. if (ssl->buffers.weOwnDH) {
  7581. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7582. ssl->buffers.serverDH_G.buffer = NULL;
  7583. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7584. ssl->buffers.serverDH_P.buffer = NULL;
  7585. }
  7586. #endif /* !NO_DH */
  7587. #ifndef NO_CERTS
  7588. wolfSSL_UnloadCertsKeys(ssl);
  7589. #endif
  7590. #ifdef HAVE_PK_CALLBACKS
  7591. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7592. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  7593. #endif
  7594. {
  7595. #ifdef HAVE_ECC
  7596. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  7597. ssl->buffers.peerEccDsaKey.buffer = NULL;
  7598. #endif /* HAVE_ECC */
  7599. #ifndef NO_RSA
  7600. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  7601. ssl->buffers.peerRsaKey.buffer = NULL;
  7602. #endif /* NO_RSA */
  7603. #ifdef HAVE_ED25519
  7604. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  7605. DYNAMIC_TYPE_ED25519);
  7606. ssl->buffers.peerEd25519Key.buffer = NULL;
  7607. #endif
  7608. #ifdef HAVE_ED448
  7609. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
  7610. ssl->buffers.peerEd448Key.buffer = NULL;
  7611. #endif
  7612. }
  7613. #endif /* HAVE_PK_CALLBACKS */
  7614. #if defined(HAVE_TLS_EXTENSIONS) && !defined(NO_TLS)
  7615. #if !defined(HAVE_SNI) && !defined(HAVE_ALPN) && !defined(WOLFSSL_DTLS_CID) && \
  7616. !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7617. /* Some extensions need to be kept for post-handshake querying. */
  7618. TLSX_FreeAll(ssl->extensions, ssl->heap);
  7619. ssl->extensions = NULL;
  7620. #else
  7621. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
  7622. TLSX_Remove(&ssl->extensions, TLSX_SIGNATURE_ALGORITHMS, ssl->heap);
  7623. #endif
  7624. TLSX_Remove(&ssl->extensions, TLSX_EC_POINT_FORMATS, ssl->heap);
  7625. TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
  7626. #ifdef WOLFSSL_TLS13
  7627. TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, ssl->heap);
  7628. TLSX_Remove(&ssl->extensions, TLSX_KEY_SHARE, ssl->heap);
  7629. #endif
  7630. #endif /* !HAVE_SNI && && !HAVE_ALPN && !WOLFSSL_DTLS_CID &&
  7631. * !WOLFSSL_POST_HANDSHAKE_AUTH */
  7632. #endif /* HAVE_TLS_EXTENSIONS && !NO_TLS */
  7633. #ifdef WOLFSSL_STATIC_MEMORY
  7634. /* when done with handshake decrement current handshake count */
  7635. if (ssl->heap != NULL) {
  7636. #ifdef WOLFSSL_HEAP_TEST
  7637. /* avoid dereferencing a test value */
  7638. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  7639. #endif
  7640. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  7641. WOLFSSL_HEAP* ctx_heap;
  7642. ctx_heap = ssl_hint->memory;
  7643. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  7644. WOLFSSL_MSG("Bad memory_mutex lock");
  7645. }
  7646. if (ctx_heap->curHa > 0) {
  7647. ctx_heap->curHa--;
  7648. }
  7649. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  7650. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  7651. #ifdef WOLFSSL_HEAP_TEST
  7652. }
  7653. #endif
  7654. }
  7655. #endif /* WOLFSSL_STATIC_MEMORY */
  7656. }
  7657. /* heap argument is the heap hint used when creating SSL */
  7658. void FreeSSL(WOLFSSL* ssl, void* heap)
  7659. {
  7660. WOLFSSL_CTX* ctx = ssl->ctx;
  7661. SSL_ResourceFree(ssl);
  7662. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  7663. if (ctx)
  7664. FreeSSL_Ctx(ctx); /* will decrement and free underlying CTX if 0 */
  7665. (void)heap;
  7666. #ifdef WOLFSSL_CHECK_MEM_ZERO
  7667. wc_MemZero_Check(ssl, sizeof(*ssl));
  7668. #endif
  7669. }
  7670. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  7671. !defined(WOLFSSL_NO_TLS12) || \
  7672. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || \
  7673. defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) \
  7674. && defined(HAVE_AEAD))
  7675. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  7676. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  7677. {
  7678. if (verify) {
  7679. seq[0] = ssl->keys.peer_sequence_number_hi;
  7680. seq[1] = ssl->keys.peer_sequence_number_lo++;
  7681. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  7682. /* handle rollover */
  7683. ssl->keys.peer_sequence_number_hi++;
  7684. }
  7685. }
  7686. else {
  7687. seq[0] = ssl->keys.sequence_number_hi;
  7688. seq[1] = ssl->keys.sequence_number_lo++;
  7689. if (seq[1] > ssl->keys.sequence_number_lo) {
  7690. /* handle rollover */
  7691. ssl->keys.sequence_number_hi++;
  7692. }
  7693. }
  7694. }
  7695. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  7696. #ifdef WOLFSSL_DTLS
  7697. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  7698. {
  7699. #ifdef HAVE_SECURE_RENEGOTIATION
  7700. order = DtlsCheckOrder(ssl, order);
  7701. #endif
  7702. if (order == PREV_ORDER) {
  7703. /* Previous epoch case */
  7704. if (ssl->options.haveMcast) {
  7705. #ifdef WOLFSSL_MULTICAST
  7706. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  7707. (ssl->options.mcastID << 8) |
  7708. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  7709. #endif
  7710. }
  7711. else
  7712. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  7713. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  7714. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  7715. }
  7716. else if (order == PEER_ORDER) {
  7717. if (ssl->options.haveMcast) {
  7718. #ifdef WOLFSSL_MULTICAST
  7719. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  7720. (ssl->keys.curPeerId << 8) |
  7721. (ssl->keys.curSeq_hi & 0xFF);
  7722. #endif
  7723. }
  7724. else
  7725. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  7726. (ssl->keys.curSeq_hi & 0xFFFF);
  7727. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  7728. }
  7729. else {
  7730. if (ssl->options.haveMcast) {
  7731. #ifdef WOLFSSL_MULTICAST
  7732. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  7733. (ssl->options.mcastID << 8) |
  7734. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  7735. #endif
  7736. }
  7737. else
  7738. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  7739. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  7740. seq[1] = ssl->keys.dtls_sequence_number_lo;
  7741. }
  7742. }
  7743. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  7744. {
  7745. word32 seq;
  7746. #ifdef HAVE_SECURE_RENEGOTIATION
  7747. order = DtlsCheckOrder(ssl, order);
  7748. #endif
  7749. if (order == PREV_ORDER) {
  7750. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  7751. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  7752. /* handle rollover */
  7753. ssl->keys.dtls_prev_sequence_number_hi++;
  7754. }
  7755. }
  7756. else if (order == PEER_ORDER) {
  7757. seq = ssl->keys.peer_sequence_number_lo++;
  7758. if (seq > ssl->keys.peer_sequence_number_lo) {
  7759. /* handle rollover */
  7760. ssl->keys.peer_sequence_number_hi++;
  7761. }
  7762. }
  7763. else {
  7764. seq = ssl->keys.dtls_sequence_number_lo++;
  7765. if (seq > ssl->keys.dtls_sequence_number_lo) {
  7766. /* handle rollover */
  7767. ssl->keys.dtls_sequence_number_hi++;
  7768. }
  7769. }
  7770. }
  7771. #endif /* WOLFSSL_DTLS */
  7772. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  7773. void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  7774. {
  7775. word32 seq[2] = {0, 0};
  7776. if (!ssl->options.dtls) {
  7777. GetSEQIncrement(ssl, verifyOrder, seq);
  7778. }
  7779. else {
  7780. #ifdef WOLFSSL_DTLS
  7781. DtlsGetSEQ(ssl, verifyOrder, seq);
  7782. #endif
  7783. }
  7784. c32toa(seq[0], out);
  7785. c32toa(seq[1], out + OPAQUE32_LEN);
  7786. }
  7787. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  7788. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
  7789. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_SM4_GCM ||
  7790. * WOLFSSL_SM4_CCM) && HAVE_AEAD) */
  7791. #ifdef WOLFSSL_DTLS
  7792. /* functions for managing DTLS datagram reordering */
  7793. /* Need to allocate space for the handshake message header. The hashing
  7794. * routines assume the message pointer is still within the buffer that
  7795. * has the headers, and will include those headers in the hash. The store
  7796. * routines need to take that into account as well. New will allocate
  7797. * extra space for the headers. */
  7798. DtlsMsg* DtlsMsgNew(word32 sz, byte tx, void* heap)
  7799. {
  7800. DtlsMsg* msg;
  7801. WOLFSSL_ENTER("DtlsMsgNew");
  7802. (void)heap;
  7803. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  7804. if (msg != NULL) {
  7805. XMEMSET(msg, 0, sizeof(DtlsMsg));
  7806. msg->sz = sz;
  7807. msg->type = no_shake;
  7808. if (tx) {
  7809. msg->raw = msg->fullMsg =
  7810. (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ, heap,
  7811. DYNAMIC_TYPE_DTLS_FRAG);
  7812. msg->ready = 1;
  7813. if (msg->raw == NULL) {
  7814. DtlsMsgDelete(msg, heap);
  7815. msg = NULL;
  7816. }
  7817. }
  7818. }
  7819. return msg;
  7820. }
  7821. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  7822. {
  7823. (void)heap;
  7824. WOLFSSL_ENTER("DtlsMsgDelete");
  7825. if (item != NULL) {
  7826. while (item->fragBucketList != NULL) {
  7827. DtlsFragBucket* next = item->fragBucketList->m.m.next;
  7828. DtlsMsgDestroyFragBucket(item->fragBucketList, heap);
  7829. item->fragBucketList = next;
  7830. }
  7831. if (item->raw != NULL)
  7832. XFREE(item->raw, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7833. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  7834. }
  7835. }
  7836. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  7837. {
  7838. DtlsMsg* next;
  7839. WOLFSSL_ENTER("DtlsMsgListDelete");
  7840. while (head) {
  7841. next = head->next;
  7842. DtlsMsgDelete(head, heap);
  7843. head = next;
  7844. }
  7845. }
  7846. /**
  7847. * Drop messages when they are no longer going to be retransmitted
  7848. */
  7849. void DtlsTxMsgListClean(WOLFSSL* ssl)
  7850. {
  7851. DtlsMsg* head = ssl->dtls_tx_msg_list;
  7852. DtlsMsg* next;
  7853. WOLFSSL_ENTER("DtlsTxMsgListClean");
  7854. while (head) {
  7855. next = head->next;
  7856. if (VerifyForTxDtlsMsgDelete(ssl, head))
  7857. DtlsMsgDelete(head, ssl->heap);
  7858. else
  7859. /* Stored packets should be in order so break on first failed
  7860. * verify */
  7861. break;
  7862. ssl->dtls_tx_msg_list_sz--;
  7863. head = next;
  7864. }
  7865. ssl->dtls_tx_msg_list = head;
  7866. }
  7867. static DtlsFragBucket* DtlsMsgCreateFragBucket(word32 offset, const byte* data,
  7868. word32 dataSz, void* heap)
  7869. {
  7870. DtlsFragBucket* bucket =
  7871. (DtlsFragBucket*)XMALLOC(sizeof(DtlsFragBucket) + dataSz, heap,
  7872. DYNAMIC_TYPE_DTLS_FRAG);
  7873. if (bucket != NULL) {
  7874. XMEMSET(bucket, 0, sizeof(*bucket));
  7875. bucket->m.m.next = NULL;
  7876. bucket->m.m.offset = offset;
  7877. bucket->m.m.sz = dataSz;
  7878. if (data != NULL)
  7879. XMEMCPY(bucket->buf, data, dataSz);
  7880. }
  7881. (void)heap;
  7882. return bucket;
  7883. }
  7884. void DtlsMsgDestroyFragBucket(DtlsFragBucket* fragBucket, void* heap)
  7885. {
  7886. (void)heap;
  7887. XFREE(fragBucket, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7888. }
  7889. /*
  7890. * data overlaps with cur but is before next.
  7891. * data + dataSz has to end before or inside next. next can be NULL.
  7892. */
  7893. static DtlsFragBucket* DtlsMsgCombineFragBuckets(DtlsMsg* msg,
  7894. DtlsFragBucket* cur, DtlsFragBucket* next, word32 offset,
  7895. const byte* data, word32 dataSz, void* heap)
  7896. {
  7897. word32 offsetEnd = offset + dataSz;
  7898. word32 newOffset = min(cur->m.m.offset, offset);
  7899. word32 newOffsetEnd;
  7900. word32 newSz;
  7901. word32 overlapSz = cur->m.m.sz;
  7902. DtlsFragBucket** chosenBucket;
  7903. DtlsFragBucket* newBucket;
  7904. DtlsFragBucket* otherBucket;
  7905. byte combineNext = FALSE;
  7906. if (next != NULL && offsetEnd >= next->m.m.offset)
  7907. combineNext = TRUE;
  7908. if (combineNext)
  7909. newOffsetEnd = next->m.m.offset + next->m.m.sz;
  7910. else
  7911. newOffsetEnd = max(cur->m.m.offset + cur->m.m.sz, offsetEnd);
  7912. newSz = newOffsetEnd - newOffset;
  7913. /* Expand the larger bucket if data bridges the gap between cur and next */
  7914. if (!combineNext || cur->m.m.sz >= next->m.m.sz) {
  7915. chosenBucket = &cur;
  7916. otherBucket = next;
  7917. }
  7918. else {
  7919. chosenBucket = &next;
  7920. otherBucket = cur;
  7921. }
  7922. {
  7923. #ifdef XREALLOC
  7924. DtlsFragBucket* tmp = (DtlsFragBucket*)XREALLOC(*chosenBucket,
  7925. sizeof(DtlsFragBucket) + newSz, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7926. #else
  7927. DtlsFragBucket* tmp = (DtlsFragBucket*)XMALLOC(
  7928. sizeof(DtlsFragBucket) + newSz, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7929. #endif
  7930. if (tmp == NULL)
  7931. return NULL;
  7932. #ifndef XREALLOC
  7933. XMEMCPY(tmp, *chosenBucket, sizeof(DtlsFragBucket) +
  7934. (*chosenBucket)->m.m.sz);
  7935. #endif
  7936. if (chosenBucket == &next) {
  7937. /* Update the link */
  7938. DtlsFragBucket* beforeNext = cur;
  7939. while (beforeNext->m.m.next != next)
  7940. beforeNext = beforeNext->m.m.next;
  7941. beforeNext->m.m.next = tmp;
  7942. }
  7943. #ifndef XREALLOC
  7944. XFREE(*chosenBucket, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7945. #endif
  7946. newBucket = *chosenBucket = tmp;
  7947. }
  7948. if (combineNext) {
  7949. /* Put next first since it will always be at the end. Use memmove since
  7950. * newBucket may be next. */
  7951. XMEMMOVE(newBucket->buf + (next->m.m.offset - newOffset), next->buf,
  7952. next->m.m.sz);
  7953. /* memory after newOffsetEnd is already copied. Don't do extra work. */
  7954. newOffsetEnd = next->m.m.offset;
  7955. }
  7956. if (newOffset == offset) {
  7957. /* data comes first */
  7958. if (newOffsetEnd <= offsetEnd) {
  7959. /* data encompasses cur. only copy data */
  7960. XMEMCPY(newBucket->buf, data,
  7961. min(dataSz, newOffsetEnd - newOffset));
  7962. }
  7963. else {
  7964. /* data -> cur. memcpy as much possible as its faster. */
  7965. XMEMMOVE(newBucket->buf + dataSz, cur->buf,
  7966. cur->m.m.sz - (offsetEnd - cur->m.m.offset));
  7967. XMEMCPY(newBucket->buf, data, dataSz);
  7968. }
  7969. }
  7970. else {
  7971. /* cur -> data */
  7972. word32 curOffsetEnd = cur->m.m.offset + cur->m.m.sz;
  7973. if (newBucket != cur)
  7974. XMEMCPY(newBucket->buf, cur->buf, cur->m.m.sz);
  7975. XMEMCPY(newBucket->buf + cur->m.m.sz,
  7976. data + (curOffsetEnd - offset),
  7977. newOffsetEnd - curOffsetEnd);
  7978. }
  7979. /* FINALLY the newBucket is populated correctly */
  7980. /* All buckets up to and including next (if combining) have to be free'd */
  7981. {
  7982. DtlsFragBucket* toFree = cur->m.m.next;
  7983. while (toFree != next) {
  7984. DtlsFragBucket* n = toFree->m.m.next;
  7985. overlapSz += toFree->m.m.sz;
  7986. DtlsMsgDestroyFragBucket(toFree, heap);
  7987. msg->fragBucketListCount--;
  7988. toFree = n;
  7989. }
  7990. if (combineNext) {
  7991. newBucket->m.m.next = next->m.m.next;
  7992. overlapSz += next->m.m.sz;
  7993. DtlsMsgDestroyFragBucket(otherBucket, heap);
  7994. msg->fragBucketListCount--;
  7995. }
  7996. else {
  7997. newBucket->m.m.next = next;
  7998. }
  7999. }
  8000. /* Adjust size in msg */
  8001. msg->bytesReceived += newSz - overlapSz;
  8002. newBucket->m.m.offset = newOffset;
  8003. newBucket->m.m.sz = newSz;
  8004. return newBucket;
  8005. }
  8006. static void DtlsMsgAssembleCompleteMessage(DtlsMsg* msg)
  8007. {
  8008. DtlsHandShakeHeader* dtls;
  8009. /* We have received all necessary fragments. Reconstruct the header. */
  8010. if (msg->fragBucketListCount != 1 || msg->fragBucketList->m.m.offset != 0 ||
  8011. msg->fragBucketList->m.m.sz != msg->sz) {
  8012. WOLFSSL_MSG("Major error in fragment assembly logic");
  8013. return;
  8014. }
  8015. /* Re-cycle the DtlsFragBucket as the buffer that holds the complete
  8016. * handshake message and the header. */
  8017. msg->raw = (byte*)msg->fragBucketList;
  8018. msg->fullMsg = msg->fragBucketList->buf;
  8019. msg->ready = 1;
  8020. /* frag->padding makes sure we can fit the entire DTLS handshake header
  8021. * before frag->buf */
  8022. /* note the dtls pointer needs to be computed from msg->fragBucketList, not
  8023. * from msg->fragBucketList->buf, to avoid a pointerOutOfBounds access
  8024. * detected by cppcheck.
  8025. *
  8026. * also note, the (void *) intermediate cast is necessary to avoid a
  8027. * potential -Wcast-align around alignment of DtlsHandShakeHeader exceeding
  8028. * alignment of char.
  8029. */
  8030. dtls = (DtlsHandShakeHeader*)(void *)((char *)msg->fragBucketList
  8031. + OFFSETOF(DtlsFragBucket,buf)
  8032. - DTLS_HANDSHAKE_HEADER_SZ);
  8033. msg->fragBucketList = NULL;
  8034. msg->fragBucketListCount = 0;
  8035. dtls->type = msg->type;
  8036. c32to24(msg->sz, dtls->length);
  8037. c16toa((word16)msg->seq, dtls->message_seq);
  8038. c32to24(0, dtls->fragment_offset);
  8039. c32to24(msg->sz, dtls->fragment_length);
  8040. }
  8041. int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
  8042. word32 fragOffset, word32 fragSz, void* heap, word32 totalLen,
  8043. byte encrypted)
  8044. {
  8045. word32 fragOffsetEnd = fragOffset + fragSz;
  8046. WOLFSSL_ENTER("DtlsMsgSet");
  8047. if (msg == NULL || data == NULL || msg->sz != totalLen ||
  8048. fragOffsetEnd > totalLen) {
  8049. WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
  8050. return BAD_FUNC_ARG;
  8051. }
  8052. if (msg->ready)
  8053. return 0; /* msg is already complete */
  8054. if (msg->type != no_shake) {
  8055. /* msg is already populated with the correct seq, epoch, and type */
  8056. if (msg->type != type || msg->epoch != epoch || msg->seq != seq) {
  8057. WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
  8058. return SEQUENCE_ERROR;
  8059. }
  8060. msg->encrypted = msg->encrypted && encrypted;
  8061. }
  8062. else {
  8063. msg->type = type;
  8064. msg->epoch = epoch;
  8065. msg->seq = seq;
  8066. msg->encrypted = encrypted;
  8067. }
  8068. if (msg->fragBucketList == NULL) {
  8069. /* Clean list. Create first fragment. */
  8070. msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data, fragSz, heap);
  8071. if (msg->fragBucketList != NULL) {
  8072. msg->bytesReceived = fragSz;
  8073. msg->fragBucketListCount++;
  8074. }
  8075. else {
  8076. return MEMORY_ERROR;
  8077. }
  8078. }
  8079. else {
  8080. /* See if we can expand any existing bucket to fit this new data into */
  8081. DtlsFragBucket* prev = NULL;
  8082. DtlsFragBucket* cur = msg->fragBucketList;
  8083. byte done = 0;
  8084. for (; cur != NULL; prev = cur, cur = cur->m.m.next) {
  8085. word32 curOffset = cur->m.m.offset;
  8086. word32 curEnd = cur->m.m.offset + cur->m.m.sz;
  8087. if (fragOffset >= curOffset && fragOffsetEnd <= curEnd) {
  8088. /* We already have this fragment */
  8089. done = 1;
  8090. break;
  8091. }
  8092. else if (fragOffset <= curEnd) {
  8093. /* found place to store fragment */
  8094. break;
  8095. }
  8096. }
  8097. if (!done) {
  8098. if (cur == NULL) {
  8099. /* We reached the end of the list. data is after and disjointed
  8100. * from anything we have received so far. */
  8101. if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
  8102. WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
  8103. return DTLS_TOO_MANY_FRAGMENTS_E;
  8104. }
  8105. prev->m.m.next =
  8106. DtlsMsgCreateFragBucket(fragOffset, data, fragSz, heap);
  8107. if (prev->m.m.next != NULL) {
  8108. msg->bytesReceived += fragSz;
  8109. msg->fragBucketListCount++;
  8110. }
  8111. }
  8112. else if (prev == NULL && fragOffsetEnd < cur->m.m.offset) {
  8113. /* This is the new first fragment we have received */
  8114. if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
  8115. WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
  8116. return DTLS_TOO_MANY_FRAGMENTS_E;
  8117. }
  8118. msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data,
  8119. fragSz, heap);
  8120. if (msg->fragBucketList != NULL) {
  8121. msg->fragBucketList->m.m.next = cur;
  8122. msg->bytesReceived += fragSz;
  8123. msg->fragBucketListCount++;
  8124. }
  8125. else {
  8126. /* reset on error */
  8127. msg->fragBucketList = cur;
  8128. }
  8129. }
  8130. else {
  8131. /* Find if this fragment overlaps with any more */
  8132. DtlsFragBucket* next = cur->m.m.next;
  8133. DtlsFragBucket** prev_next = prev != NULL
  8134. ? &prev->m.m.next : &msg->fragBucketList;
  8135. while (next != NULL &&
  8136. (next->m.m.offset + next->m.m.sz) <= fragOffsetEnd)
  8137. next = next->m.m.next;
  8138. /* We can combine the buckets */
  8139. *prev_next = DtlsMsgCombineFragBuckets(msg, cur, next,
  8140. fragOffset, data, fragSz, heap);
  8141. if (*prev_next == NULL) /* reset on error */
  8142. *prev_next = cur;
  8143. }
  8144. }
  8145. }
  8146. if (msg->bytesReceived == msg->sz)
  8147. DtlsMsgAssembleCompleteMessage(msg);
  8148. return 0;
  8149. }
  8150. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word16 epoch, word32 seq)
  8151. {
  8152. WOLFSSL_ENTER("DtlsMsgFind");
  8153. while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
  8154. head = head->next;
  8155. }
  8156. return head;
  8157. }
  8158. void DtlsMsgStore(WOLFSSL* ssl, word16 epoch, word32 seq, const byte* data,
  8159. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  8160. {
  8161. /* See if seq exists in the list. If it isn't in the list, make
  8162. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  8163. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  8164. * the seq is in the list and it isn't full, copy fragSz bytes from
  8165. * data to msg->msg starting at offset fragOffset, and add fragSz to
  8166. * msg->fragSz. Insertions take into account data already in the list
  8167. * in case there are overlaps in the handshake message due to retransmit
  8168. * messages. The new item should be inserted into the list in its
  8169. * proper position.
  8170. *
  8171. * 1. Find seq in list, or where seq should go in list. If seq not in
  8172. * list, create new item and insert into list. Either case, keep
  8173. * pointer to item.
  8174. * 2. Copy the data from the message to the stored message where it
  8175. * belongs without overlaps.
  8176. */
  8177. DtlsMsg* head = ssl->dtls_rx_msg_list;
  8178. byte encrypted = ssl->keys.decryptedCur == 1;
  8179. WOLFSSL_ENTER("DtlsMsgStore");
  8180. if (head != NULL) {
  8181. DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
  8182. if (cur == NULL) {
  8183. cur = DtlsMsgNew(dataSz, 0, heap);
  8184. if (cur != NULL) {
  8185. if (DtlsMsgSet(cur, seq, epoch, data, type,
  8186. fragOffset, fragSz, heap, dataSz, encrypted) < 0) {
  8187. DtlsMsgDelete(cur, heap);
  8188. }
  8189. else {
  8190. ssl->dtls_rx_msg_list_sz++;
  8191. head = DtlsMsgInsert(head, cur);
  8192. }
  8193. }
  8194. }
  8195. else {
  8196. /* If this fails, the data is just dropped. */
  8197. DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
  8198. fragSz, heap, dataSz, encrypted);
  8199. }
  8200. }
  8201. else {
  8202. head = DtlsMsgNew(dataSz, 0, heap);
  8203. if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
  8204. fragSz, heap, dataSz, encrypted) < 0) {
  8205. DtlsMsgDelete(head, heap);
  8206. head = NULL;
  8207. }
  8208. else {
  8209. ssl->dtls_rx_msg_list_sz++;
  8210. }
  8211. }
  8212. ssl->dtls_rx_msg_list = head;
  8213. }
  8214. /* DtlsMsgInsert() is an in-order insert. */
  8215. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  8216. {
  8217. WOLFSSL_ENTER("DtlsMsgInsert");
  8218. if (head == NULL || (item->epoch <= head->epoch &&
  8219. item->seq < head->seq)) {
  8220. item->next = head;
  8221. head = item;
  8222. }
  8223. else if (head->next == NULL) {
  8224. head->next = item;
  8225. }
  8226. else {
  8227. DtlsMsg* cur = head->next;
  8228. DtlsMsg* prev = head;
  8229. while (cur) {
  8230. if (item->epoch <= cur->epoch &&
  8231. item->seq < cur->seq) {
  8232. item->next = cur;
  8233. prev->next = item;
  8234. break;
  8235. }
  8236. prev = cur;
  8237. cur = cur->next;
  8238. }
  8239. if (cur == NULL) {
  8240. prev->next = item;
  8241. }
  8242. }
  8243. return head;
  8244. }
  8245. /**
  8246. * DtlsMsgPoolSave() adds the message to the end of the stored transmit
  8247. * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
  8248. * anything else that increments ssl->keys.dtls_handshake_number.
  8249. */
  8250. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
  8251. enum HandShakeType type)
  8252. {
  8253. DtlsMsg* item;
  8254. int ret = 0;
  8255. WOLFSSL_ENTER("DtlsMsgPoolSave");
  8256. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  8257. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  8258. return DTLS_POOL_SZ_E;
  8259. }
  8260. item = DtlsMsgNew(dataSz, 1, ssl->heap);
  8261. if (item != NULL) {
  8262. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  8263. XMEMCPY(item->raw, data, dataSz);
  8264. item->epoch = ssl->keys.dtls_epoch;
  8265. item->seq = ssl->keys.dtls_handshake_number;
  8266. item->type = type;
  8267. if (cur == NULL)
  8268. ssl->dtls_tx_msg_list = item;
  8269. else {
  8270. while (cur->next)
  8271. cur = cur->next;
  8272. cur->next = item;
  8273. }
  8274. ssl->dtls_tx_msg_list_sz++;
  8275. }
  8276. else
  8277. ret = MEMORY_E;
  8278. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  8279. return ret;
  8280. }
  8281. /* DtlsMsgPoolTimeout() updates the timeout time. */
  8282. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  8283. {
  8284. int result = -1;
  8285. WOLFSSL_ENTER("DtlsMsgPoolTimeout");
  8286. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  8287. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  8288. result = 0;
  8289. }
  8290. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  8291. return result;
  8292. }
  8293. /* DtlsMsgPoolReset() deletes the stored transmit list. */
  8294. void DtlsMsgPoolReset(WOLFSSL* ssl)
  8295. {
  8296. WOLFSSL_ENTER("DtlsMsgPoolReset");
  8297. if (ssl->dtls_tx_msg_list) {
  8298. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  8299. ssl->dtls_tx_msg_list = NULL;
  8300. ssl->dtls_tx_msg = NULL;
  8301. ssl->dtls_tx_msg_list_sz = 0;
  8302. }
  8303. #ifdef WOLFSSL_DTLS13
  8304. /* Clear DTLS 1.3 buffer too */
  8305. Dtls13RtxFlushBuffered(ssl, 1);
  8306. #endif
  8307. }
  8308. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  8309. {
  8310. /**
  8311. * only the first message from previous flight should be valid
  8312. * to be used for triggering retransmission of whole DtlsMsgPool.
  8313. * change cipher suite type is not verified here
  8314. */
  8315. if (fragOffset == 0) {
  8316. if (ssl->options.side == WOLFSSL_SERVER_END) {
  8317. if (type == client_hello)
  8318. return 1;
  8319. else if (ssl->options.verifyPeer && type == certificate)
  8320. return 1;
  8321. else if (!ssl->options.verifyPeer && type == client_key_exchange)
  8322. return 1;
  8323. }
  8324. else {
  8325. if (type == hello_request || type == server_hello)
  8326. return 1;
  8327. }
  8328. }
  8329. return 0;
  8330. }
  8331. /**
  8332. * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
  8333. * depending on the current state of the handshake negotiation.
  8334. */
  8335. int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
  8336. {
  8337. WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete");
  8338. if (item->epoch < ssl->keys.dtls_epoch - 1)
  8339. /* Messages not from current or previous epoch can be deleted */
  8340. return 1;
  8341. switch (ssl->options.side) {
  8342. case WOLFSSL_CLIENT_END:
  8343. if (item->type == client_hello &&
  8344. ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
  8345. return 1; /* client can forget first client_hello if received full
  8346. * flight of packets from server */
  8347. else
  8348. return 0;
  8349. case WOLFSSL_SERVER_END:
  8350. if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
  8351. item->type == hello_request)
  8352. return 1; /* Server can forget HelloRequest if client sent a valid
  8353. * ClientHello */
  8354. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
  8355. item->type <= server_hello_done)
  8356. return 1; /* server can forget everything up to ServerHelloDone if
  8357. * a client finished message has been received and
  8358. * successfully processed */
  8359. else
  8360. return 0;
  8361. default:
  8362. return 0;
  8363. }
  8364. }
  8365. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  8366. * updated with new sequence numbers, and will be re-encrypted if needed. */
  8367. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  8368. {
  8369. int ret = 0;
  8370. DtlsMsg* pool;
  8371. WOLFSSL_ENTER("DtlsMsgPoolSend");
  8372. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  8373. if (pool != NULL) {
  8374. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  8375. !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
  8376. ssl->options.acceptState == SERVER_HELLO_DONE ||
  8377. ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
  8378. ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
  8379. (ssl->options.side == WOLFSSL_CLIENT_END &&
  8380. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  8381. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  8382. ssl->options.connectState == FINISHED_DONE ||
  8383. ssl->options.connectState == SECOND_REPLY_DONE))) {
  8384. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  8385. ssl->error = DTLS_RETX_OVER_TX;
  8386. return WOLFSSL_FATAL_ERROR;
  8387. }
  8388. while (pool != NULL) {
  8389. int epochOrder;
  8390. if (pool->epoch == 0) {
  8391. DtlsRecordLayerHeader* dtls;
  8392. dtls = (DtlsRecordLayerHeader*)pool->raw;
  8393. /* If the stored record's epoch is 0, and the currently set
  8394. * epoch is 0, use the "current order" sequence number.
  8395. * If the stored record's epoch is 0 and the currently set
  8396. * epoch is not 0, the stored record is considered a "previous
  8397. * order" sequence number. */
  8398. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  8399. CUR_ORDER : PREV_ORDER;
  8400. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  8401. DtlsSEQIncrement(ssl, epochOrder);
  8402. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  8403. WOLFSSL_ERROR(ret);
  8404. return ret;
  8405. }
  8406. XMEMCPY(GetOutputBuffer(ssl), pool->raw, pool->sz);
  8407. ssl->buffers.outputBuffer.length += pool->sz;
  8408. }
  8409. else {
  8410. /* Handle sending packets from previous epoch */
  8411. byte* input;
  8412. byte* output;
  8413. int inputSz, sendSz;
  8414. input = pool->raw;
  8415. inputSz = pool->sz;
  8416. sendSz = inputSz + cipherExtraData(ssl);
  8417. #ifdef HAVE_SECURE_RENEGOTIATION
  8418. /*
  8419. * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
  8420. * ssl->keys otherwise
  8421. * PREV_ORDER will always use ssl->keys
  8422. */
  8423. if (DtlsSCRKeysSet(ssl)) {
  8424. if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  8425. epochOrder = CUR_ORDER;
  8426. else
  8427. epochOrder = PREV_ORDER;
  8428. }
  8429. else {
  8430. epochOrder = CUR_ORDER;
  8431. }
  8432. #else
  8433. epochOrder = CUR_ORDER;
  8434. #endif
  8435. /* add back in record header space from saved pool size */
  8436. sendSz += DTLS_RECORD_HEADER_SZ;
  8437. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  8438. WOLFSSL_ERROR(ret);
  8439. return ret;
  8440. }
  8441. output = GetOutputBuffer(ssl);
  8442. if (inputSz != ENUM_LEN)
  8443. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  8444. handshake, 0, 0, 0, epochOrder);
  8445. else
  8446. /* inputSz == ENUM_LEN must mean that this is a change cipher
  8447. * spec message */
  8448. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  8449. change_cipher_spec, 0, 0, 0, epochOrder);
  8450. if (sendSz < 0) {
  8451. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  8452. return BUILD_MSG_ERROR;
  8453. }
  8454. ssl->buffers.outputBuffer.length += sendSz;
  8455. }
  8456. if (!ssl->options.groupMessages)
  8457. ret = SendBuffered(ssl);
  8458. /**
  8459. * on server side, retransmission is being triggered only by sending
  8460. * first message of given flight, in order to trigger client
  8461. * to retransmit its whole flight. Sending the whole previous flight
  8462. * could lead to retransmission of previous client flight for each
  8463. * server message from previous flight. Therefore one message should
  8464. * be enough to do the trick.
  8465. */
  8466. if (sendOnlyFirstPacket &&
  8467. ssl->options.side == WOLFSSL_SERVER_END)
  8468. pool = NULL;
  8469. else
  8470. pool = pool->next;
  8471. ssl->dtls_tx_msg = pool;
  8472. }
  8473. if (ret == 0 && ssl->options.groupMessages)
  8474. ret = SendBuffered(ssl);
  8475. }
  8476. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  8477. return ret;
  8478. }
  8479. #endif /* WOLFSSL_DTLS */
  8480. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  8481. ProtocolVersion MakeSSLv3(void)
  8482. {
  8483. ProtocolVersion pv;
  8484. pv.major = SSLv3_MAJOR;
  8485. pv.minor = SSLv3_MINOR;
  8486. return pv;
  8487. }
  8488. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  8489. #ifdef WOLFSSL_DTLS
  8490. ProtocolVersion MakeDTLSv1(void)
  8491. {
  8492. ProtocolVersion pv;
  8493. pv.major = DTLS_MAJOR;
  8494. pv.minor = DTLS_MINOR;
  8495. return pv;
  8496. }
  8497. #ifndef WOLFSSL_NO_TLS12
  8498. ProtocolVersion MakeDTLSv1_2(void)
  8499. {
  8500. ProtocolVersion pv;
  8501. pv.major = DTLS_MAJOR;
  8502. pv.minor = DTLSv1_2_MINOR;
  8503. return pv;
  8504. }
  8505. #endif /* !WOLFSSL_NO_TLS12 */
  8506. #ifdef WOLFSSL_DTLS13
  8507. ProtocolVersion MakeDTLSv1_3(void)
  8508. {
  8509. ProtocolVersion pv;
  8510. pv.major = DTLS_MAJOR;
  8511. pv.minor = DTLSv1_3_MINOR;
  8512. return pv;
  8513. }
  8514. #endif /* WOLFSSL_DTLS13 */
  8515. #endif /* WOLFSSL_DTLS */
  8516. #ifndef NO_ASN_TIME
  8517. #if defined(USER_TICKS)
  8518. #if 0
  8519. word32 LowResTimer(void)
  8520. {
  8521. /*
  8522. write your own clock tick function if don't want time(0)
  8523. needs second accuracy but doesn't have to correlated to EPOCH
  8524. */
  8525. }
  8526. #endif
  8527. #elif defined(TIME_OVERRIDES)
  8528. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  8529. /* use same asn time overrides unless user wants tick override above */
  8530. word32 LowResTimer(void)
  8531. {
  8532. return (word32) wc_Time(0);
  8533. }
  8534. #else
  8535. #ifndef HAVE_TIME_T_TYPE
  8536. typedef long time_t;
  8537. #endif
  8538. extern time_t XTIME(time_t * timer);
  8539. word32 LowResTimer(void)
  8540. {
  8541. return (word32) XTIME(0);
  8542. }
  8543. #endif
  8544. #elif defined(USE_WINDOWS_API)
  8545. word32 LowResTimer(void)
  8546. {
  8547. static int init = 0;
  8548. static LARGE_INTEGER freq;
  8549. LARGE_INTEGER count;
  8550. if (!init) {
  8551. QueryPerformanceFrequency(&freq);
  8552. init = 1;
  8553. }
  8554. QueryPerformanceCounter(&count);
  8555. return (word32)(count.QuadPart / freq.QuadPart);
  8556. }
  8557. #elif defined(HAVE_RTP_SYS)
  8558. #include "rtptime.h"
  8559. word32 LowResTimer(void)
  8560. {
  8561. return (word32)rtp_get_system_sec();
  8562. }
  8563. #elif defined(WOLFSSL_DEOS)
  8564. word32 LowResTimer(void)
  8565. {
  8566. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  8567. const volatile word32 *systemTickPtr = systemTickPointer();
  8568. return (word32) *systemTickPtr/systemTickTimeInHz;
  8569. }
  8570. #elif defined(MICRIUM)
  8571. word32 LowResTimer(void)
  8572. {
  8573. OS_TICK ticks = 0;
  8574. OS_ERR err;
  8575. ticks = OSTimeGet(&err);
  8576. return (word32) (ticks / OSCfg_TickRate_Hz);
  8577. }
  8578. #elif defined(MICROCHIP_TCPIP_V5)
  8579. word32 LowResTimer(void)
  8580. {
  8581. return (word32) (TickGet() / TICKS_PER_SECOND);
  8582. }
  8583. #elif defined(MICROCHIP_TCPIP)
  8584. #if defined(MICROCHIP_MPLAB_HARMONY)
  8585. #include <system/tmr/sys_tmr.h>
  8586. word32 LowResTimer(void)
  8587. {
  8588. return (word32) (SYS_TMR_TickCountGet() /
  8589. SYS_TMR_TickCounterFrequencyGet());
  8590. }
  8591. #else
  8592. word32 LowResTimer(void)
  8593. {
  8594. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  8595. }
  8596. #endif
  8597. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  8598. word32 LowResTimer(void)
  8599. {
  8600. TIME_STRUCT mqxTime;
  8601. _time_get_elapsed(&mqxTime);
  8602. return (word32) mqxTime.SECONDS;
  8603. }
  8604. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  8605. #include "include/task.h"
  8606. unsigned int LowResTimer(void)
  8607. {
  8608. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  8609. }
  8610. #elif defined(FREERTOS)
  8611. #ifdef PLATFORMIO
  8612. #include <freertos/FreeRTOS.h>
  8613. #include <freertos/task.h>
  8614. #else
  8615. #include "task.h"
  8616. #endif
  8617. unsigned int LowResTimer(void)
  8618. {
  8619. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  8620. }
  8621. #elif defined(FREESCALE_KSDK_BM)
  8622. #include "lwip/sys.h" /* lwIP */
  8623. word32 LowResTimer(void)
  8624. {
  8625. return sys_now()/1000;
  8626. }
  8627. #elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2)
  8628. word32 LowResTimer(void)
  8629. {
  8630. return (word32)osKernelGetTickCount() / 1000;
  8631. }
  8632. #elif defined(WOLFSSL_TIRTOS)
  8633. word32 LowResTimer(void)
  8634. {
  8635. return (word32) Seconds_get();
  8636. }
  8637. #elif defined(WOLFSSL_XILINX)
  8638. #include "xrtcpsu.h"
  8639. word32 LowResTimer(void)
  8640. {
  8641. XRtcPsu_Config* con;
  8642. XRtcPsu rtc;
  8643. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  8644. if (con != NULL) {
  8645. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  8646. == XST_SUCCESS) {
  8647. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  8648. }
  8649. else {
  8650. WOLFSSL_MSG("Unable to initialize RTC");
  8651. }
  8652. }
  8653. return 0;
  8654. }
  8655. #elif defined(WOLFSSL_UTASKER)
  8656. word32 LowResTimer(void)
  8657. {
  8658. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  8659. }
  8660. #elif defined(WOLFSSL_NUCLEUS_1_2)
  8661. #define NU_TICKS_PER_SECOND 100
  8662. word32 LowResTimer(void)
  8663. {
  8664. /* returns number of 10ms ticks, so 100 ticks/sec */
  8665. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  8666. }
  8667. #elif defined(WOLFSSL_APACHE_MYNEWT)
  8668. #include "os/os_time.h"
  8669. word32 LowResTimer(void)
  8670. {
  8671. word32 now;
  8672. struct os_timeval tv;
  8673. os_gettimeofday(&tv, NULL);
  8674. now = (word32)tv.tv_sec;
  8675. return now;
  8676. }
  8677. #elif defined(WOLFSSL_ZEPHYR)
  8678. word32 LowResTimer(void)
  8679. {
  8680. int64_t t;
  8681. #if defined(CONFIG_ARCH_POSIX)
  8682. k_cpu_idle();
  8683. #endif
  8684. t = k_uptime_get(); /* returns current uptime in milliseconds */
  8685. return (word32)(t / 1000);
  8686. }
  8687. #elif defined(WOLFSSL_LINUXKM)
  8688. word32 LowResTimer(void)
  8689. {
  8690. return (word32)time(NULL);
  8691. }
  8692. #else
  8693. /* Posix style time */
  8694. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  8695. #include <time.h>
  8696. #endif
  8697. word32 LowResTimer(void)
  8698. {
  8699. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  8700. return (word32)wc_Time(0);
  8701. #else
  8702. return (word32)XTIME(0);
  8703. #endif
  8704. }
  8705. #endif
  8706. #else
  8707. /* user must supply timer function to return elapsed seconds:
  8708. * word32 LowResTimer(void);
  8709. */
  8710. #endif /* !NO_ASN_TIME */
  8711. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  8712. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  8713. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  8714. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  8715. /* Store the message for use with CertificateVerify using EdDSA.
  8716. *
  8717. * ssl SSL/TLS object.
  8718. * data Message to store.
  8719. * sz Size of message to store.
  8720. * returns MEMORY_E if not able to reallocate, otherwise 0.
  8721. */
  8722. static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
  8723. {
  8724. int ret = 0;
  8725. byte* msgs;
  8726. if (ssl->options.cacheMessages) {
  8727. msgs = (byte*)XMALLOC(ssl->hsHashes->length + sz, ssl->heap,
  8728. DYNAMIC_TYPE_HASHES);
  8729. if (msgs == NULL)
  8730. ret = MEMORY_E;
  8731. if ((ret == 0) && (ssl->hsHashes->messages != NULL)) {
  8732. XMEMCPY(msgs, ssl->hsHashes->messages, ssl->hsHashes->length);
  8733. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  8734. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  8735. }
  8736. if (ret == 0) {
  8737. #ifdef WOLFSSL_CHECK_MEM_ZERO
  8738. wc_MemZero_Add("Handshake messages", msgs,
  8739. ssl->hsHashes->length + sz);
  8740. #endif
  8741. ssl->hsHashes->messages = msgs;
  8742. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  8743. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  8744. ssl->hsHashes->length += sz;
  8745. }
  8746. }
  8747. return ret;
  8748. }
  8749. #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  8750. int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
  8751. {
  8752. int ret = 0;
  8753. #ifdef WOLFSSL_DEBUG_TLS
  8754. byte digest[WC_MAX_DIGEST_SIZE];
  8755. WOLFSSL_MSG("HashRaw:");
  8756. WOLFSSL_MSG("Data:");
  8757. WOLFSSL_BUFFER(data, sz);
  8758. WOLFSSL_MSG("Hashes:");
  8759. #endif
  8760. (void)data;
  8761. (void)sz;
  8762. if (ssl->hsHashes == NULL) {
  8763. return BAD_FUNC_ARG;
  8764. }
  8765. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  8766. ret = tsip_StoreMessage(ssl, data, sz);
  8767. if (ret != 0 && ret != CRYPTOCB_UNAVAILABLE) {
  8768. return ret;
  8769. }
  8770. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  8771. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  8772. defined(WOLFSSL_ALLOW_TLS_SHA1))
  8773. wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
  8774. #endif
  8775. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  8776. wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
  8777. #endif
  8778. if (IsAtLeastTLSv1_2(ssl)) {
  8779. #ifndef NO_SHA256
  8780. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
  8781. if (ret != 0)
  8782. return ret;
  8783. #ifdef WOLFSSL_DEBUG_TLS
  8784. WOLFSSL_MSG("Sha256");
  8785. wc_Sha256GetHash(&ssl->hsHashes->hashSha256, digest);
  8786. WOLFSSL_BUFFER(digest, WC_SHA256_DIGEST_SIZE);
  8787. #endif
  8788. #endif
  8789. #ifdef WOLFSSL_SHA384
  8790. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
  8791. if (ret != 0)
  8792. return ret;
  8793. #ifdef WOLFSSL_DEBUG_TLS
  8794. WOLFSSL_MSG("Sha384");
  8795. wc_Sha384GetHash(&ssl->hsHashes->hashSha384, digest);
  8796. WOLFSSL_BUFFER(digest, WC_SHA384_DIGEST_SIZE);
  8797. #endif
  8798. #endif
  8799. #ifdef WOLFSSL_SHA512
  8800. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
  8801. if (ret != 0)
  8802. return ret;
  8803. #ifdef WOLFSSL_DEBUG_TLS
  8804. WOLFSSL_MSG("Sha512");
  8805. wc_Sha512GetHash(&ssl->hsHashes->hashSha512, digest);
  8806. WOLFSSL_BUFFER(digest, WC_SHA512_DIGEST_SIZE);
  8807. #endif
  8808. #endif
  8809. #ifdef WOLFSSL_SM3
  8810. ret = wc_Sm3Update(&ssl->hsHashes->hashSm3, data, sz);
  8811. if (ret != 0)
  8812. return ret;
  8813. #ifdef WOLFSSL_DEBUG_TLS
  8814. WOLFSSL_MSG("SM3");
  8815. wc_Sm3GetHash(&ssl->hsHashes->hashSm3, digest);
  8816. WOLFSSL_BUFFER(digest, WC_SM3_DIGEST_SIZE);
  8817. #endif
  8818. #endif
  8819. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  8820. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  8821. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  8822. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  8823. ret = EdDSA_Update(ssl, data, sz);
  8824. if (ret != 0)
  8825. return ret;
  8826. #endif
  8827. }
  8828. return ret;
  8829. }
  8830. /* add output to md5 and sha handshake hashes, exclude record header */
  8831. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  8832. {
  8833. const byte* adj;
  8834. if (ssl->hsHashes == NULL)
  8835. return BAD_FUNC_ARG;
  8836. adj = output + RECORD_HEADER_SZ + ivSz;
  8837. sz -= RECORD_HEADER_SZ;
  8838. #ifdef HAVE_FUZZER
  8839. if (ssl->fuzzerCb)
  8840. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  8841. #endif
  8842. #ifdef WOLFSSL_DTLS
  8843. if (ssl->options.dtls) {
  8844. if (IsAtLeastTLSv1_3(ssl->version)) {
  8845. #ifdef WOLFSSL_DTLS13
  8846. word16 dtls_record_extra;
  8847. dtls_record_extra = Dtls13GetRlHeaderLength(ssl, (byte)IsEncryptionOn(ssl, 1));
  8848. dtls_record_extra -= RECORD_HEADER_SZ;
  8849. adj += dtls_record_extra;
  8850. sz -= dtls_record_extra;
  8851. #endif /* WOLFSSL_DTLS13 */
  8852. } else {
  8853. adj += DTLS_RECORD_EXTRA;
  8854. sz -= DTLS_RECORD_EXTRA;
  8855. }
  8856. }
  8857. #endif
  8858. return HashRaw(ssl, adj, sz);
  8859. }
  8860. /* add input to md5 and sha handshake hashes, include handshake header */
  8861. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  8862. {
  8863. const byte* adj;
  8864. if (ssl->hsHashes == NULL) {
  8865. return BAD_FUNC_ARG;
  8866. }
  8867. adj = input - HANDSHAKE_HEADER_SZ;
  8868. sz += HANDSHAKE_HEADER_SZ;
  8869. #ifdef WOLFSSL_DTLS
  8870. if (ssl->options.dtls) {
  8871. adj -= DTLS_HANDSHAKE_EXTRA;
  8872. sz += DTLS_HANDSHAKE_EXTRA;
  8873. #ifdef WOLFSSL_DTLS13
  8874. if (IsAtLeastTLSv1_3(ssl->version))
  8875. return Dtls13HashHandshake(ssl, adj, (word16)sz);
  8876. #endif /* WOLFSSL_DTLS13 */
  8877. }
  8878. #endif
  8879. return HashRaw(ssl, adj, sz);
  8880. }
  8881. /* add record layer header for message */
  8882. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
  8883. {
  8884. RecordLayerHeader* rl;
  8885. (void)epochOrder;
  8886. /* record layer header */
  8887. rl = (RecordLayerHeader*)output;
  8888. if (rl == NULL) {
  8889. return;
  8890. }
  8891. rl->type = type;
  8892. rl->pvMajor = ssl->version.major; /* type and version same in each */
  8893. #ifdef WOLFSSL_TLS13
  8894. if (IsAtLeastTLSv1_3(ssl->version)) {
  8895. rl->pvMinor = TLSv1_2_MINOR;
  8896. #ifdef WOLFSSL_DTLS
  8897. if (ssl->options.dtls)
  8898. rl->pvMinor = DTLSv1_2_MINOR;
  8899. #endif /* WOLFSSL_DTLS */
  8900. }
  8901. else
  8902. #endif
  8903. rl->pvMinor = ssl->version.minor;
  8904. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  8905. if (ssl->options.side == WOLFSSL_CLIENT_END
  8906. && ssl->options.connectState == CONNECT_BEGIN
  8907. && !ssl->options.resuming) {
  8908. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  8909. : ssl->version.minor;
  8910. }
  8911. #endif
  8912. if (!ssl->options.dtls) {
  8913. c16toa((word16)length, rl->length);
  8914. }
  8915. else {
  8916. #ifdef WOLFSSL_DTLS
  8917. DtlsRecordLayerHeader* dtls;
  8918. /* dtls record layer header extensions */
  8919. dtls = (DtlsRecordLayerHeader*)output;
  8920. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  8921. c16toa((word16)length, dtls->length);
  8922. #endif
  8923. }
  8924. }
  8925. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  8926. !defined(NO_WOLFSSL_SERVER))
  8927. /* add handshake header for message */
  8928. static void AddHandShakeHeader(byte* output, word32 length,
  8929. word32 fragOffset, word32 fragLength,
  8930. byte type, WOLFSSL* ssl)
  8931. {
  8932. HandShakeHeader* hs;
  8933. (void)fragOffset;
  8934. (void)fragLength;
  8935. (void)ssl;
  8936. /* handshake header */
  8937. hs = (HandShakeHeader*)output;
  8938. if (hs == NULL)
  8939. return;
  8940. hs->type = type;
  8941. c32to24(length, hs->length); /* type and length same for each */
  8942. #ifdef WOLFSSL_DTLS
  8943. if (ssl->options.dtls) {
  8944. DtlsHandShakeHeader* dtls;
  8945. /* dtls handshake header extensions */
  8946. dtls = (DtlsHandShakeHeader*)output;
  8947. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  8948. c32to24(fragOffset, dtls->fragment_offset);
  8949. c32to24(fragLength, dtls->fragment_length);
  8950. }
  8951. #endif
  8952. }
  8953. /* add both headers for handshake message */
  8954. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  8955. {
  8956. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  8957. word32 outputAdj = RECORD_HEADER_SZ;
  8958. #ifdef WOLFSSL_DTLS
  8959. if (ssl->options.dtls) {
  8960. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  8961. outputAdj += DTLS_RECORD_EXTRA;
  8962. }
  8963. #endif
  8964. AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
  8965. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  8966. }
  8967. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  8968. #ifndef WOLFSSL_NO_TLS12
  8969. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
  8970. !defined(WOLFSSL_NO_CLIENT_AUTH)) || \
  8971. defined(WOLFSSL_DTLS)
  8972. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  8973. word32 length, byte type, WOLFSSL* ssl)
  8974. {
  8975. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  8976. word32 outputAdj = RECORD_HEADER_SZ;
  8977. (void)fragSz;
  8978. #ifdef WOLFSSL_DTLS
  8979. if (ssl->options.dtls) {
  8980. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  8981. outputAdj += DTLS_RECORD_EXTRA;
  8982. }
  8983. #endif
  8984. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
  8985. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  8986. }
  8987. #endif /* NO_CERTS */
  8988. #if !defined(NO_WOLFSSL_SERVER) || \
  8989. (!defined(NO_WOLFSSL_CLIENT) && !defined(NO_CERTS) && \
  8990. !defined(WOLFSSL_NO_CLIENT_AUTH))
  8991. /**
  8992. * Send the handshake message. This function handles fragmenting the message
  8993. * so that it will fit into the desired MTU or the max fragment size.
  8994. * @param ssl Connection object
  8995. * @param input Input starting at the record layer header. This function
  8996. * assumes that the appropriate record and handshake headers
  8997. * are present. These headers must assume no fragmentation.
  8998. * That is handled here.
  8999. * @param inputSz Length of message excluding headers (this is the total
  9000. * length of all fragments)
  9001. * @param type Type of message being sent
  9002. * @return 0 on success and negative otherwise
  9003. */
  9004. static int SendHandshakeMsg(WOLFSSL* ssl, byte* input, word32 inputSz,
  9005. enum HandShakeType type, const char* packetName)
  9006. {
  9007. int maxFrag;
  9008. int ret = 0;
  9009. int headerSz;
  9010. WOLFSSL_ENTER("SendHandshakeMsg");
  9011. (void)type;
  9012. (void)packetName;
  9013. if (ssl == NULL || input == NULL)
  9014. return BAD_FUNC_ARG;
  9015. #ifdef WOLFSSL_DTLS
  9016. if (ssl->options.dtls)
  9017. headerSz = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  9018. else
  9019. #endif
  9020. {
  9021. /* In TLS we send one handshake header in total, not one
  9022. * per fragment like in DTLS. The handshake header should
  9023. * already be in the input buffer. */
  9024. inputSz += HANDSHAKE_HEADER_SZ;
  9025. headerSz = RECORD_HEADER_SZ;
  9026. }
  9027. maxFrag = wolfSSL_GetMaxFragSize(ssl, (int)inputSz);
  9028. /* Make sure input is not the ssl output buffer as this
  9029. * function doesn't handle that */
  9030. if (input >= ssl->buffers.outputBuffer.buffer &&
  9031. input < ssl->buffers.outputBuffer.buffer +
  9032. ssl->buffers.outputBuffer.bufferSize) {
  9033. WOLFSSL_MSG("Can't use output buffer for input in SendHandshakeMsg");
  9034. return BAD_FUNC_ARG;
  9035. }
  9036. if (!ssl->options.buildingMsg) {
  9037. /* Hash it before the loop as we modify the input with
  9038. * encryption on */
  9039. ret = HashOutput(ssl, input, headerSz + (int)inputSz, 0);
  9040. if (ret != 0)
  9041. return ret;
  9042. #ifdef WOLFSSL_DTLS
  9043. /* Decrement msg number so that we continue to use the
  9044. * same msg number for this msg */
  9045. if (ssl->options.dtls)
  9046. ssl->keys.dtls_handshake_number--;
  9047. #endif
  9048. }
  9049. while (ssl->fragOffset < inputSz) {
  9050. byte* output;
  9051. int outputSz;
  9052. byte* data = input + ssl->fragOffset + headerSz;
  9053. word32 fragSz = (word32)maxFrag;
  9054. ssl->options.buildingMsg = 1;
  9055. if (inputSz - ssl->fragOffset < fragSz)
  9056. fragSz = inputSz - ssl->fragOffset;
  9057. /* check for available size */
  9058. outputSz = headerSz + fragSz;
  9059. if (IsEncryptionOn(ssl, 1))
  9060. outputSz += cipherExtraData(ssl);
  9061. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  9062. return ret;
  9063. if (ssl->buffers.outputBuffer.buffer == NULL)
  9064. return MEMORY_E;
  9065. output = GetOutputBuffer(ssl);
  9066. if (IsEncryptionOn(ssl, 1)) {
  9067. /* First we need to add the fragment header ourselves.
  9068. * We do this in the input to minimize allocations */
  9069. int dataSz = (int)fragSz;
  9070. #ifdef WOLFSSL_DTLS
  9071. if (ssl->options.dtls) {
  9072. data -= DTLS_HANDSHAKE_HEADER_SZ;
  9073. dataSz += DTLS_HANDSHAKE_HEADER_SZ;
  9074. AddHandShakeHeader(data, inputSz, ssl->fragOffset, fragSz,
  9075. type, ssl);
  9076. ssl->keys.dtls_handshake_number--;
  9077. }
  9078. if (IsDtlsNotSctpMode(ssl) &&
  9079. (ret = DtlsMsgPoolSave(ssl, data,
  9080. fragSz + DTLS_HANDSHAKE_HEADER_SZ, type))
  9081. != 0)
  9082. return ret;
  9083. #endif
  9084. ret = BuildMessage(ssl, output, outputSz,
  9085. data, dataSz, handshake, 0, 0, 0, CUR_ORDER);
  9086. if (ret >= 0)
  9087. outputSz = ret;
  9088. else
  9089. return ret;
  9090. ret = 0;
  9091. }
  9092. else {
  9093. #ifdef WOLFSSL_DTLS
  9094. if (ssl->options.dtls)
  9095. AddFragHeaders(output, fragSz, ssl->fragOffset,
  9096. inputSz, type, ssl);
  9097. else
  9098. #endif
  9099. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  9100. XMEMCPY(output + headerSz, data, fragSz);
  9101. #ifdef WOLFSSL_DTLS
  9102. if (ssl->options.dtls) {
  9103. ssl->keys.dtls_handshake_number--;
  9104. DtlsSEQIncrement(ssl, CUR_ORDER);
  9105. }
  9106. if (IsDtlsNotSctpMode(ssl)) {
  9107. if ((ret = DtlsMsgPoolSave(ssl, output, headerSz + fragSz,
  9108. type)) != 0) {
  9109. return ret;
  9110. }
  9111. }
  9112. #endif
  9113. }
  9114. ssl->buffers.outputBuffer.length += outputSz;
  9115. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  9116. if (ssl->hsInfoOn) {
  9117. AddPacketName(ssl, packetName);
  9118. }
  9119. if (ssl->toInfoOn) {
  9120. ret = AddPacketInfo(ssl, packetName, handshake,
  9121. output, outputSz, WRITE_PROTO, 0, ssl->heap);
  9122. if (ret != 0)
  9123. return ret;
  9124. }
  9125. #endif
  9126. ssl->fragOffset += fragSz;
  9127. if (!ssl->options.groupMessages)
  9128. ret = SendBuffered(ssl);
  9129. if (ret != 0)
  9130. return ret;
  9131. }
  9132. #ifdef WOLFSSL_DTLS
  9133. /* Increment msg number once we sent all fragments */
  9134. if (ssl->options.dtls)
  9135. ssl->keys.dtls_handshake_number++;
  9136. #endif
  9137. ssl->fragOffset = 0;
  9138. ssl->options.buildingMsg = 0;
  9139. return ret;
  9140. }
  9141. #endif /* !NO_WOLFSSL_SERVER || (!NO_WOLFSSL_CLIENT && !NO_CERTS &&
  9142. * !WOLFSSL_NO_CLIENT_AUTH) */
  9143. #endif /* !WOLFSSL_NO_TLS12 */
  9144. /* return bytes received, -1 on error */
  9145. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  9146. {
  9147. int recvd;
  9148. int retryLimit = WOLFSSL_MODE_AUTO_RETRY_ATTEMPTS;
  9149. #ifdef WOLFSSL_QUIC
  9150. if (WOLFSSL_IS_QUIC(ssl)) {
  9151. /* QUIC only "reads" from data provided by the application
  9152. * via wolfSSL_provide_quic_data(). Transfer from there
  9153. * into the inputBuffer. */
  9154. return wolfSSL_quic_receive(ssl, buf, sz);
  9155. }
  9156. #endif
  9157. if (ssl->CBIORecv == NULL) {
  9158. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  9159. return -1;
  9160. }
  9161. retry:
  9162. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  9163. if (recvd < 0) {
  9164. switch (recvd) {
  9165. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  9166. #ifdef WOLFSSL_APACHE_HTTPD
  9167. #ifndef NO_BIO
  9168. if (ssl->biord) {
  9169. /* If retry and read flags are set, return WANT_READ */
  9170. if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
  9171. (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
  9172. return WANT_READ;
  9173. }
  9174. }
  9175. #endif
  9176. #endif
  9177. return -1;
  9178. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  9179. if (retryLimit > 0 && ssl->ctx->autoRetry &&
  9180. !ssl->options.handShakeDone && !ssl->options.dtls) {
  9181. retryLimit--;
  9182. goto retry;
  9183. }
  9184. return WANT_READ;
  9185. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  9186. #ifdef USE_WINDOWS_API
  9187. if (ssl->options.dtls) {
  9188. goto retry;
  9189. }
  9190. #endif
  9191. ssl->options.connReset = 1;
  9192. return -1;
  9193. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  9194. /* see if we got our timeout */
  9195. #ifdef WOLFSSL_CALLBACKS
  9196. if (ssl->toInfoOn) {
  9197. struct itimerval timeout;
  9198. getitimer(ITIMER_REAL, &timeout);
  9199. if (timeout.it_value.tv_sec == 0 &&
  9200. timeout.it_value.tv_usec == 0) {
  9201. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  9202. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  9203. ssl->timeoutInfo.timeoutName[
  9204. MAX_TIMEOUT_NAME_SZ] = '\0';
  9205. WOLFSSL_MSG("Got our timeout");
  9206. return WANT_READ;
  9207. }
  9208. }
  9209. #endif
  9210. goto retry;
  9211. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  9212. ssl->options.isClosed = 1;
  9213. return -1;
  9214. case WOLFSSL_CBIO_ERR_TIMEOUT:
  9215. #ifdef WOLFSSL_DTLS
  9216. #ifdef WOLFSSL_DTLS13
  9217. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  9218. /* TODO: support WANT_WRITE here */
  9219. if (Dtls13RtxTimeout(ssl) < 0) {
  9220. WOLFSSL_MSG(
  9221. "Error trying to retransmit DTLS buffered message");
  9222. return -1;
  9223. }
  9224. goto retry;
  9225. }
  9226. #endif /* WOLFSSL_DTLS13 */
  9227. if (IsDtlsNotSctpMode(ssl) &&
  9228. ssl->options.handShakeState != HANDSHAKE_DONE &&
  9229. DtlsMsgPoolTimeout(ssl) == 0 &&
  9230. DtlsMsgPoolSend(ssl, 0) == 0) {
  9231. /* retry read for DTLS during handshake only */
  9232. goto retry;
  9233. }
  9234. #endif
  9235. return -1;
  9236. default:
  9237. WOLFSSL_MSG("Unexpected recv return code");
  9238. return recvd;
  9239. }
  9240. }
  9241. return recvd;
  9242. }
  9243. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  9244. void ShrinkOutputBuffer(WOLFSSL* ssl)
  9245. {
  9246. WOLFSSL_MSG("Shrinking output buffer");
  9247. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  9248. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  9249. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  9250. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  9251. ssl->buffers.outputBuffer.dynamicFlag = 0;
  9252. ssl->buffers.outputBuffer.offset = 0;
  9253. /* idx and length are assumed to be 0. */
  9254. }
  9255. /* Switch dynamic input buffer back to static, keep any remaining input */
  9256. /* forced free means cleaning up */
  9257. /* Be *CAREFUL* where this function is called. ProcessReply relies on
  9258. * inputBuffer.idx *NOT* changing inside the ProcessReply function. ProcessReply
  9259. * calls ShrinkInputBuffer itself when it is safe to do so. Don't overuse it. */
  9260. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  9261. {
  9262. int usedLength = ssl->buffers.inputBuffer.length -
  9263. ssl->buffers.inputBuffer.idx;
  9264. if (!forcedFree && (usedLength > STATIC_BUFFER_LEN ||
  9265. ssl->buffers.clearOutputBuffer.length > 0))
  9266. return;
  9267. WOLFSSL_MSG("Shrinking input buffer");
  9268. if (!forcedFree && usedLength > 0) {
  9269. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  9270. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  9271. usedLength);
  9272. }
  9273. ForceZero(ssl->buffers.inputBuffer.buffer,
  9274. ssl->buffers.inputBuffer.length);
  9275. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  9276. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  9277. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  9278. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  9279. ssl->buffers.inputBuffer.dynamicFlag = 0;
  9280. ssl->buffers.inputBuffer.offset = 0;
  9281. ssl->buffers.inputBuffer.idx = 0;
  9282. ssl->buffers.inputBuffer.length = usedLength;
  9283. }
  9284. int SendBuffered(WOLFSSL* ssl)
  9285. {
  9286. int retryLimit = WOLFSSL_MODE_AUTO_RETRY_ATTEMPTS;
  9287. if (ssl->CBIOSend == NULL && !WOLFSSL_IS_QUIC(ssl)) {
  9288. WOLFSSL_MSG("Your IO Send callback is null, please set");
  9289. return SOCKET_ERROR_E;
  9290. }
  9291. #ifdef WOLFSSL_DEBUG_TLS
  9292. if (ssl->buffers.outputBuffer.idx == 0) {
  9293. WOLFSSL_MSG("Data to send");
  9294. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  9295. ssl->buffers.outputBuffer.length);
  9296. }
  9297. #endif
  9298. #ifdef WOLFSSL_QUIC
  9299. if (WOLFSSL_IS_QUIC(ssl)) {
  9300. return wolfSSL_quic_send(ssl);
  9301. }
  9302. #endif
  9303. while (ssl->buffers.outputBuffer.length > 0) {
  9304. int sent = 0;
  9305. retry:
  9306. sent = ssl->CBIOSend(ssl,
  9307. (char*)ssl->buffers.outputBuffer.buffer +
  9308. ssl->buffers.outputBuffer.idx,
  9309. (int)ssl->buffers.outputBuffer.length,
  9310. ssl->IOCB_WriteCtx);
  9311. if (sent < 0) {
  9312. switch (sent) {
  9313. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  9314. if (retryLimit > 0 && ssl->ctx->autoRetry &&
  9315. !ssl->options.handShakeDone && !ssl->options.dtls) {
  9316. retryLimit--;
  9317. goto retry;
  9318. }
  9319. return WANT_WRITE;
  9320. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  9321. ssl->options.connReset = 1;
  9322. break;
  9323. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  9324. /* see if we got our timeout */
  9325. #ifdef WOLFSSL_CALLBACKS
  9326. if (ssl->toInfoOn) {
  9327. struct itimerval timeout;
  9328. getitimer(ITIMER_REAL, &timeout);
  9329. if (timeout.it_value.tv_sec == 0 &&
  9330. timeout.it_value.tv_usec == 0) {
  9331. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  9332. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  9333. ssl->timeoutInfo.timeoutName[
  9334. MAX_TIMEOUT_NAME_SZ] = '\0';
  9335. WOLFSSL_MSG("Got our timeout");
  9336. return WANT_WRITE;
  9337. }
  9338. }
  9339. #endif
  9340. continue;
  9341. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  9342. ssl->options.connReset = 1; /* treat same as reset */
  9343. break;
  9344. default:
  9345. return SOCKET_ERROR_E;
  9346. }
  9347. return SOCKET_ERROR_E;
  9348. }
  9349. if (sent > (int)ssl->buffers.outputBuffer.length) {
  9350. WOLFSSL_MSG("SendBuffered() out of bounds read");
  9351. return SEND_OOB_READ_E;
  9352. }
  9353. ssl->buffers.outputBuffer.idx += sent;
  9354. ssl->buffers.outputBuffer.length -= sent;
  9355. }
  9356. ssl->buffers.outputBuffer.idx = 0;
  9357. if (ssl->buffers.outputBuffer.dynamicFlag)
  9358. ShrinkOutputBuffer(ssl);
  9359. return 0;
  9360. }
  9361. /* returns the current location in the output buffer to start writing to */
  9362. byte* GetOutputBuffer(WOLFSSL* ssl)
  9363. {
  9364. return ssl->buffers.outputBuffer.buffer + ssl->buffers.outputBuffer.idx +
  9365. ssl->buffers.outputBuffer.length;
  9366. }
  9367. /* Grow the output buffer */
  9368. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  9369. {
  9370. byte* tmp;
  9371. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  9372. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  9373. RECORD_HEADER_SZ;
  9374. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  9375. #else
  9376. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  9377. #endif
  9378. word32 newSz;
  9379. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  9380. /* the encrypted data will be offset from the front of the buffer by
  9381. the header, if the user wants encrypted alignment they need
  9382. to define their alignment requirement */
  9383. while (align < hdrSz)
  9384. align *= 2;
  9385. #endif
  9386. if (! WC_SAFE_SUM_WORD32(ssl->buffers.outputBuffer.idx,
  9387. ssl->buffers.outputBuffer.length, newSz))
  9388. return BUFFER_E;
  9389. if (! WC_SAFE_SUM_WORD32(newSz, (word32)size, newSz))
  9390. return BUFFER_E;
  9391. if (! WC_SAFE_SUM_WORD32(newSz, align, newSz))
  9392. return BUFFER_E;
  9393. tmp = (byte*)XMALLOC(newSz, ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  9394. newSz -= align;
  9395. WOLFSSL_MSG("growing output buffer");
  9396. if (tmp == NULL)
  9397. return MEMORY_E;
  9398. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  9399. if (align)
  9400. tmp += align - hdrSz;
  9401. #endif
  9402. #ifdef WOLFSSL_STATIC_MEMORY
  9403. /* can be from IO memory pool which does not need copy if same buffer */
  9404. if (ssl->buffers.outputBuffer.length &&
  9405. tmp == ssl->buffers.outputBuffer.buffer) {
  9406. ssl->buffers.outputBuffer.bufferSize = newSz;
  9407. return 0;
  9408. }
  9409. #endif
  9410. if (ssl->buffers.outputBuffer.length)
  9411. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  9412. ssl->buffers.outputBuffer.idx +
  9413. ssl->buffers.outputBuffer.length);
  9414. if (ssl->buffers.outputBuffer.dynamicFlag) {
  9415. XFREE(ssl->buffers.outputBuffer.buffer -
  9416. ssl->buffers.outputBuffer.offset, ssl->heap,
  9417. DYNAMIC_TYPE_OUT_BUFFER);
  9418. }
  9419. ssl->buffers.outputBuffer.dynamicFlag = 1;
  9420. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  9421. if (align)
  9422. ssl->buffers.outputBuffer.offset = align - hdrSz;
  9423. else
  9424. #endif
  9425. ssl->buffers.outputBuffer.offset = 0;
  9426. ssl->buffers.outputBuffer.buffer = tmp;
  9427. ssl->buffers.outputBuffer.bufferSize = newSz;
  9428. return 0;
  9429. }
  9430. /* Grow the input buffer, should only be to read cert or big app data */
  9431. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  9432. {
  9433. byte* tmp;
  9434. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  9435. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  9436. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  9437. #else
  9438. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  9439. #endif
  9440. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  9441. /* the encrypted data will be offset from the front of the buffer by
  9442. the dtls record header, if the user wants encrypted alignment they need
  9443. to define their alignment requirement. in tls we read record header
  9444. to get size of record and put actual data back at front, so don't need */
  9445. if (align) {
  9446. while (align < hdrSz)
  9447. align *= 2;
  9448. }
  9449. #endif
  9450. if (usedLength < 0 || size < 0) {
  9451. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  9452. return BAD_FUNC_ARG;
  9453. }
  9454. tmp = (byte*)XMALLOC(size + usedLength + align,
  9455. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  9456. WOLFSSL_MSG("growing input buffer");
  9457. if (tmp == NULL)
  9458. return MEMORY_E;
  9459. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  9460. if (align)
  9461. tmp += align - hdrSz;
  9462. #endif
  9463. #ifdef WOLFSSL_STATIC_MEMORY
  9464. /* can be from IO memory pool which does not need copy if same buffer */
  9465. if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
  9466. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  9467. ssl->buffers.inputBuffer.idx = 0;
  9468. ssl->buffers.inputBuffer.length = usedLength;
  9469. return 0;
  9470. }
  9471. #endif
  9472. if (usedLength)
  9473. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  9474. ssl->buffers.inputBuffer.idx, usedLength);
  9475. if (ssl->buffers.inputBuffer.dynamicFlag) {
  9476. if (IsEncryptionOn(ssl, 1)) {
  9477. ForceZero(ssl->buffers.inputBuffer.buffer,
  9478. ssl->buffers.inputBuffer.length);
  9479. }
  9480. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  9481. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  9482. }
  9483. ssl->buffers.inputBuffer.dynamicFlag = 1;
  9484. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  9485. if (align)
  9486. ssl->buffers.inputBuffer.offset = align - hdrSz;
  9487. else
  9488. #endif
  9489. ssl->buffers.inputBuffer.offset = 0;
  9490. ssl->buffers.inputBuffer.buffer = tmp;
  9491. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  9492. ssl->buffers.inputBuffer.idx = 0;
  9493. ssl->buffers.inputBuffer.length = usedLength;
  9494. return 0;
  9495. }
  9496. /* Check available size into output buffer, make room if needed.
  9497. * This function needs to be called before anything gets put
  9498. * into the output buffers since it flushes pending data if it
  9499. * predicts that the msg will exceed MTU. */
  9500. int CheckAvailableSize(WOLFSSL *ssl, int size)
  9501. {
  9502. if (size < 0) {
  9503. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  9504. return BAD_FUNC_ARG;
  9505. }
  9506. #ifdef WOLFSSL_DTLS
  9507. if (ssl->options.dtls) {
  9508. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  9509. word32 mtu = (word32)ssl->dtlsMtuSz;
  9510. #else
  9511. word32 mtu = MAX_MTU;
  9512. #endif
  9513. if ((word32)size + ssl->buffers.outputBuffer.length > mtu) {
  9514. int ret;
  9515. WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
  9516. "to make room for new message");
  9517. if ((ret = SendBuffered(ssl)) != 0) {
  9518. return ret;
  9519. }
  9520. }
  9521. if ((word32)size > mtu
  9522. #ifdef WOLFSSL_DTLS13
  9523. /* DTLS1.3 uses the output buffer to store the full message and deal
  9524. with fragmentation later in dtls13HandshakeSend() */
  9525. && !IsAtLeastTLSv1_3(ssl->version)
  9526. #endif /* WOLFSSL_DTLS13 */
  9527. ) {
  9528. WOLFSSL_MSG("CheckAvailableSize() called with size greater than MTU.");
  9529. return DTLS_SIZE_ERROR;
  9530. }
  9531. }
  9532. #endif
  9533. if ((ssl->buffers.outputBuffer.bufferSize -
  9534. ssl->buffers.outputBuffer.length -
  9535. ssl->buffers.outputBuffer.idx) < (word32)size) {
  9536. if (GrowOutputBuffer(ssl, size) < 0)
  9537. return MEMORY_E;
  9538. }
  9539. return 0;
  9540. }
  9541. #ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS
  9542. int MsgCheckEncryption(WOLFSSL* ssl, byte type, byte encrypted)
  9543. {
  9544. #ifdef WOLFSSL_QUIC
  9545. /* QUIC protects messages outside of the TLS scope */
  9546. if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version))
  9547. return 0;
  9548. #endif
  9549. /* Verify which messages always have to be encrypted */
  9550. if (IsAtLeastTLSv1_3(ssl->version)) {
  9551. switch ((enum HandShakeType)type) {
  9552. case client_hello:
  9553. case server_hello:
  9554. case hello_verify_request:
  9555. case hello_retry_request:
  9556. case change_cipher_hs:
  9557. if (encrypted) {
  9558. WOLFSSL_MSG("Message can not be encrypted");
  9559. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  9560. return OUT_OF_ORDER_E;
  9561. }
  9562. break;
  9563. case hello_request:
  9564. case session_ticket:
  9565. case end_of_early_data:
  9566. case encrypted_extensions:
  9567. case certificate:
  9568. case server_key_exchange:
  9569. case certificate_request:
  9570. case server_hello_done:
  9571. case certificate_verify:
  9572. case client_key_exchange:
  9573. case finished:
  9574. case certificate_status:
  9575. case key_update:
  9576. if (!encrypted) {
  9577. WOLFSSL_MSG("Message always has to be encrypted");
  9578. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  9579. return OUT_OF_ORDER_E;
  9580. }
  9581. break;
  9582. case message_hash:
  9583. case no_shake:
  9584. default:
  9585. WOLFSSL_MSG("Unknown message type");
  9586. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  9587. return SANITY_MSG_E;
  9588. }
  9589. }
  9590. else {
  9591. switch ((enum HandShakeType)type) {
  9592. case client_hello:
  9593. if ((IsSCR(ssl) || ssl->options.handShakeDone) && !encrypted) {
  9594. WOLFSSL_MSG("Message has to be encrypted for SCR");
  9595. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  9596. return OUT_OF_ORDER_E;
  9597. }
  9598. break;
  9599. case server_hello:
  9600. case hello_verify_request:
  9601. case hello_retry_request:
  9602. case certificate:
  9603. case server_key_exchange:
  9604. case certificate_request:
  9605. case server_hello_done:
  9606. case certificate_verify:
  9607. case client_key_exchange:
  9608. case certificate_status:
  9609. case session_ticket:
  9610. case change_cipher_hs:
  9611. if (IsSCR(ssl)) {
  9612. if (!encrypted) {
  9613. WOLFSSL_MSG("Message has to be encrypted during SCR");
  9614. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  9615. return OUT_OF_ORDER_E;
  9616. }
  9617. }
  9618. else if (encrypted) {
  9619. WOLFSSL_MSG("Message can not be encrypted in regular "
  9620. "handshake");
  9621. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  9622. return OUT_OF_ORDER_E;
  9623. }
  9624. break;
  9625. case hello_request:
  9626. case finished:
  9627. if (!encrypted) {
  9628. WOLFSSL_MSG("Message always has to be encrypted");
  9629. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  9630. return OUT_OF_ORDER_E;
  9631. }
  9632. break;
  9633. case key_update:
  9634. case encrypted_extensions:
  9635. case end_of_early_data:
  9636. case message_hash:
  9637. case no_shake:
  9638. default:
  9639. WOLFSSL_MSG("Unknown message type");
  9640. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  9641. return SANITY_MSG_E;
  9642. }
  9643. }
  9644. return 0;
  9645. }
  9646. static WC_INLINE int isLastMsg(const WOLFSSL* ssl, word32 msgSz)
  9647. {
  9648. word32 extra = 0;
  9649. if (IsEncryptionOn(ssl, 0)) {
  9650. extra = ssl->keys.padSz;
  9651. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  9652. if (ssl->options.startedETMRead)
  9653. extra += MacSize(ssl);
  9654. #endif
  9655. }
  9656. return (ssl->buffers.inputBuffer.idx - ssl->curStartIdx) + msgSz + extra
  9657. == ssl->curSize;
  9658. }
  9659. /* Check if the msg is the last msg in a record. This is also an easy way
  9660. * to check that a record doesn't span different key boundaries. */
  9661. static int MsgCheckBoundary(const WOLFSSL* ssl, byte type,
  9662. byte version_negotiated, word32 msgSz)
  9663. {
  9664. if (version_negotiated) {
  9665. if (IsAtLeastTLSv1_3(ssl->version)) {
  9666. switch ((enum HandShakeType)type) {
  9667. case hello_request:
  9668. case client_hello:
  9669. case server_hello:
  9670. case hello_verify_request:
  9671. case hello_retry_request:
  9672. case finished:
  9673. case end_of_early_data:
  9674. if (!isLastMsg(ssl, msgSz)) {
  9675. WOLFSSL_MSG("Message type is not last in record");
  9676. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  9677. return OUT_OF_ORDER_E;
  9678. }
  9679. break;
  9680. case session_ticket:
  9681. case encrypted_extensions:
  9682. case certificate:
  9683. case server_key_exchange:
  9684. case certificate_request:
  9685. case certificate_verify:
  9686. case client_key_exchange:
  9687. case certificate_status:
  9688. case key_update:
  9689. case change_cipher_hs:
  9690. break;
  9691. case server_hello_done:
  9692. case message_hash:
  9693. case no_shake:
  9694. default:
  9695. WOLFSSL_MSG("Unknown message type");
  9696. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  9697. return SANITY_MSG_E;
  9698. }
  9699. }
  9700. else {
  9701. switch ((enum HandShakeType)type) {
  9702. case hello_request:
  9703. case client_hello:
  9704. case hello_verify_request:
  9705. if (!isLastMsg(ssl, msgSz)) {
  9706. WOLFSSL_MSG("Message type is not last in record");
  9707. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  9708. return OUT_OF_ORDER_E;
  9709. }
  9710. break;
  9711. case server_hello:
  9712. case session_ticket:
  9713. case end_of_early_data:
  9714. case certificate:
  9715. case server_key_exchange:
  9716. case certificate_request:
  9717. case server_hello_done:
  9718. case certificate_verify:
  9719. case client_key_exchange:
  9720. case finished:
  9721. case certificate_status:
  9722. case change_cipher_hs:
  9723. break;
  9724. case hello_retry_request:
  9725. case encrypted_extensions:
  9726. case key_update:
  9727. case message_hash:
  9728. case no_shake:
  9729. default:
  9730. WOLFSSL_MSG("Unknown message type");
  9731. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  9732. return SANITY_MSG_E;
  9733. }
  9734. }
  9735. }
  9736. else {
  9737. switch ((enum HandShakeType)type) {
  9738. case hello_request:
  9739. case client_hello:
  9740. case hello_verify_request:
  9741. if (!isLastMsg(ssl, msgSz)) {
  9742. WOLFSSL_MSG("Message type is not last in record");
  9743. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  9744. return OUT_OF_ORDER_E;
  9745. }
  9746. break;
  9747. case server_hello:
  9748. case session_ticket:
  9749. case end_of_early_data:
  9750. case hello_retry_request:
  9751. case encrypted_extensions:
  9752. case certificate:
  9753. case server_key_exchange:
  9754. case certificate_request:
  9755. case server_hello_done:
  9756. case certificate_verify:
  9757. case client_key_exchange:
  9758. case finished:
  9759. case certificate_status:
  9760. case key_update:
  9761. case change_cipher_hs:
  9762. break;
  9763. case message_hash:
  9764. case no_shake:
  9765. default:
  9766. WOLFSSL_MSG("Unknown message type");
  9767. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  9768. return SANITY_MSG_E;
  9769. }
  9770. }
  9771. return 0;
  9772. }
  9773. #endif /* WOLFSSL_DISABLE_EARLY_SANITY_CHECKS */
  9774. /**
  9775. * This check is performed as soon as the handshake message type becomes known.
  9776. * These checks can not be delayed and need to be performed when the msg is
  9777. * received and not when it is processed (fragmentation may cause messages to
  9778. * be processed at a later time). This function CAN NOT be called on stored
  9779. * messages as it relies on the state of the WOLFSSL object right after
  9780. * receiving the message.
  9781. *
  9782. * @param ssl The current connection
  9783. * @param type The enum HandShakeType of the current message
  9784. * @param msgSz Size of the current message
  9785. * @return
  9786. */
  9787. int EarlySanityCheckMsgReceived(WOLFSSL* ssl, byte type, word32 msgSz)
  9788. {
  9789. int ret = 0;
  9790. #ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS
  9791. /* Version has only been negotiated after we either send or process a
  9792. * ServerHello message */
  9793. byte version_negotiated = ssl->options.serverState >= SERVER_HELLO_COMPLETE;
  9794. WOLFSSL_ENTER("EarlySanityCheckMsgReceived");
  9795. if (version_negotiated)
  9796. ret = MsgCheckEncryption(ssl, type, ssl->keys.decryptedCur == 1);
  9797. if (ret == 0)
  9798. ret = MsgCheckBoundary(ssl, type, version_negotiated, msgSz);
  9799. if (ret != 0
  9800. #ifdef WOLFSSL_DTLS
  9801. && ssl->options.dtls && ssl->options.dtlsStateful
  9802. #endif
  9803. )
  9804. SendAlert(ssl, alert_fatal, unexpected_message);
  9805. WOLFSSL_LEAVE("EarlySanityCheckMsgReceived", ret);
  9806. #else
  9807. (void)ssl;
  9808. (void)type;
  9809. (void)msgSz;
  9810. #endif
  9811. return ret;
  9812. }
  9813. #ifdef WOLFSSL_DTLS13
  9814. static int GetInputData(WOLFSSL *ssl, word32 size);
  9815. static int GetDtls13RecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9816. RecordLayerHeader* rh, word16* size)
  9817. {
  9818. Dtls13UnifiedHdrInfo hdrInfo;
  9819. w64wrapper epochNumber;
  9820. byte epochBits;
  9821. int readSize;
  9822. int ret;
  9823. readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
  9824. if (readSize < DTLS_UNIFIED_HEADER_MIN_SZ)
  9825. return BUFFER_ERROR;
  9826. epochBits = *(ssl->buffers.inputBuffer.buffer + *inOutIdx) & EE_MASK;
  9827. ret = Dtls13ReconstructEpochNumber(ssl, epochBits, &epochNumber);
  9828. if (ret != 0)
  9829. return ret;
  9830. #ifdef WOLFSSL_DEBUG_TLS
  9831. WOLFSSL_MSG_EX("reconstructed epoch number: %ld",
  9832. epochNumber);
  9833. #endif /* WOLFSSL_DEBUG_TLS */
  9834. /* protected records always use unified_headers in DTLSv1.3 */
  9835. if (w64IsZero(epochNumber))
  9836. return SEQUENCE_ERROR;
  9837. if (ssl->dtls13DecryptEpoch == NULL)
  9838. return BAD_STATE_E;
  9839. #ifdef WOLFSSL_EARLY_DATA
  9840. if (w64Equal(epochNumber, w64From32(0x0, DTLS13_EPOCH_EARLYDATA)) &&
  9841. ssl->options.handShakeDone) {
  9842. WOLFSSL_MSG("discarding early data after handshake");
  9843. return SEQUENCE_ERROR;
  9844. }
  9845. #endif /* WOLFSSL_DTLS13 */
  9846. if (!w64Equal(ssl->dtls13DecryptEpoch->epochNumber, epochNumber)) {
  9847. ret = Dtls13SetEpochKeys(ssl, epochNumber, DECRYPT_SIDE_ONLY);
  9848. if (ret != 0)
  9849. return SEQUENCE_ERROR;
  9850. }
  9851. ret = Dtls13GetUnifiedHeaderSize(ssl,
  9852. *(ssl->buffers.inputBuffer.buffer+*inOutIdx), &ssl->dtls13CurRlLength);
  9853. if (ret != 0)
  9854. return ret;
  9855. if (readSize < ssl->dtls13CurRlLength + DTLS13_RN_MASK_SIZE) {
  9856. /* when using DTLS over a medium that does not guarantee that a full
  9857. * message is received in a single read, we may end up without the full
  9858. * header and minimum ciphertext to decrypt record sequence numbers */
  9859. ret = GetInputData(ssl, ssl->dtls13CurRlLength + DTLS13_RN_MASK_SIZE);
  9860. if (ret != 0)
  9861. return ret;
  9862. readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
  9863. }
  9864. ret = Dtls13ParseUnifiedRecordLayer(ssl,
  9865. ssl->buffers.inputBuffer.buffer + *inOutIdx, (word16)readSize,
  9866. &hdrInfo);
  9867. if (ret != 0)
  9868. return ret;
  9869. *size = hdrInfo.recordLength;
  9870. c16toa(*size, rh->length);
  9871. /* type is implicit */
  9872. rh->type = application_data;
  9873. /* version is implicit */
  9874. rh->pvMajor = ssl->version.major;
  9875. rh->pvMinor = DTLSv1_2_MINOR;
  9876. ssl->keys.curEpoch64 = epochNumber;
  9877. ret = Dtls13ReconstructSeqNumber(ssl, &hdrInfo, &ssl->keys.curSeq);
  9878. if (ret != 0)
  9879. return ret;
  9880. #ifdef WOLFSSL_DEBUG_TLS
  9881. WOLFSSL_MSG_EX("reconstructed seq number: %ld",
  9882. ssl->keys.curSeq);
  9883. #endif /* WOLFSSL_DEBUG_TLS */
  9884. XMEMCPY(ssl->dtls13CurRL, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9885. ssl->dtls13CurRlLength);
  9886. *inOutIdx += ssl->dtls13CurRlLength;
  9887. return 0;
  9888. }
  9889. #endif /* WOLFSSL_DTLS13 */
  9890. #ifdef WOLFSSL_DTLS
  9891. static int GetDtlsRecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9892. RecordLayerHeader* rh, word16* size)
  9893. {
  9894. #ifdef HAVE_FUZZER
  9895. if (ssl->fuzzerCb)
  9896. ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9897. DTLS_RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx);
  9898. #endif
  9899. #ifdef WOLFSSL_DTLS13
  9900. int ret;
  9901. if (Dtls13IsUnifiedHeader(*(ssl->buffers.inputBuffer.buffer + *inOutIdx))) {
  9902. ssl->options.seenUnifiedHdr = 1; /* We can send ACKs to the peer */
  9903. /* version 1.3 already negotiated */
  9904. if (ssl->options.tls1_3) {
  9905. ret = GetDtls13RecordHeader(ssl, inOutIdx, rh, size);
  9906. if (ret == 0 || ret != SEQUENCE_ERROR || ret != DTLS_CID_ERROR)
  9907. return ret;
  9908. }
  9909. #ifndef NO_WOLFSSL_CLIENT
  9910. if (ssl->options.side == WOLFSSL_CLIENT_END
  9911. && ssl->options.serverState < SERVER_HELLO_COMPLETE
  9912. && IsAtLeastTLSv1_3(ssl->version)
  9913. && !ssl->options.handShakeDone) {
  9914. /* we may have lost ServerHello. Try to send a empty ACK to shortcut
  9915. Server retransmission timer */
  9916. ssl->dtls13Rtx.sendAcks = 1;
  9917. }
  9918. #endif
  9919. return SEQUENCE_ERROR;
  9920. }
  9921. /* not a unified header, check that we have at least
  9922. * DTLS_RECORD_HEADER_SZ */
  9923. if (ssl->buffers.inputBuffer.length - *inOutIdx < DTLS_RECORD_HEADER_SZ) {
  9924. ret = GetInputData(ssl, DTLS_RECORD_HEADER_SZ);
  9925. /* Check if Dtls13RtxTimeout(ssl) returned socket error */
  9926. if (ret == SOCKET_ERROR_E)
  9927. return ret;
  9928. if (ret != 0)
  9929. return LENGTH_ERROR;
  9930. }
  9931. #endif /* WOLFSSL_DTLS13 */
  9932. /* type and version in same spot */
  9933. XMEMCPY(rh, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9934. ENUM_LEN + VERSION_SZ);
  9935. *inOutIdx += ENUM_LEN + VERSION_SZ;
  9936. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curEpoch);
  9937. #ifdef WOLFSSL_DTLS13
  9938. /* only non protected message can use the DTLSPlaintext record header */
  9939. if (IsAtLeastTLSv1_3(ssl->version)) {
  9940. if (ssl->keys.curEpoch != 0)
  9941. return SEQUENCE_ERROR;
  9942. w64Zero(&ssl->keys.curEpoch64);
  9943. if (!w64IsZero(ssl->dtls13DecryptEpoch->epochNumber))
  9944. Dtls13SetEpochKeys(ssl, ssl->keys.curEpoch64, DECRYPT_SIDE_ONLY);
  9945. }
  9946. #endif /* WOLFSSL_DTLS13 */
  9947. *inOutIdx += OPAQUE16_LEN;
  9948. if (ssl->options.haveMcast) {
  9949. #ifdef WOLFSSL_MULTICAST
  9950. ssl->keys.curPeerId = ssl->buffers.inputBuffer.buffer[*inOutIdx];
  9951. ssl->keys.curSeq_hi = ssl->buffers.inputBuffer.buffer[*inOutIdx+1];
  9952. #endif
  9953. }
  9954. else
  9955. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curSeq_hi);
  9956. *inOutIdx += OPAQUE16_LEN;
  9957. ato32(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curSeq_lo);
  9958. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  9959. #ifdef WOLFSSL_DTLS13
  9960. /* DTLSv1.3 PlainText records use DTLSv1.2 sequence number encoding. Update
  9961. the DTLv1.3 word64 version as well */
  9962. ssl->keys.curSeq = w64From32(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo);
  9963. #endif /* WOLFSSL_DTLS13 */
  9964. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, size);
  9965. *inOutIdx += LENGTH_SZ;
  9966. return 0;
  9967. }
  9968. #endif /* WOLFSSL_DTLS */
  9969. /* do all verify and sanity checks on record header */
  9970. static int GetRecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9971. RecordLayerHeader* rh, word16 *size)
  9972. {
  9973. byte tls12minor = 0;
  9974. #ifdef OPENSSL_ALL
  9975. word32 start = *inOutIdx;
  9976. #endif
  9977. (void)tls12minor;
  9978. if (!ssl->options.dtls) {
  9979. #ifdef HAVE_FUZZER
  9980. if (ssl->fuzzerCb)
  9981. ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9982. RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx);
  9983. #endif
  9984. XMEMCPY(rh, ssl->buffers.inputBuffer.buffer + *inOutIdx, RECORD_HEADER_SZ);
  9985. *inOutIdx += RECORD_HEADER_SZ;
  9986. ato16(rh->length, size);
  9987. }
  9988. else {
  9989. #ifdef WOLFSSL_DTLS
  9990. int ret = GetDtlsRecordHeader(ssl, inOutIdx, rh, size);
  9991. if (ret != 0)
  9992. return ret;
  9993. #endif
  9994. }
  9995. #ifdef WOLFSSL_DTLS
  9996. /* DTLSv1.3 MUST check window after deprotecting to avoid timing channel
  9997. (RFC9147 Section 4.5.1) */
  9998. if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) {
  9999. if (!_DtlsCheckWindow(ssl) ||
  10000. (rh->type == application_data && ssl->keys.curEpoch == 0) ||
  10001. (rh->type == alert && ssl->options.handShakeDone &&
  10002. ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
  10003. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  10004. return SEQUENCE_ERROR;
  10005. }
  10006. }
  10007. #endif
  10008. #if defined(WOLFSSL_DTLS13) || defined(WOLFSSL_TLS13)
  10009. tls12minor = TLSv1_2_MINOR;
  10010. #endif
  10011. #ifdef WOLFSSL_DTLS13
  10012. if (ssl->options.dtls)
  10013. tls12minor = DTLSv1_2_MINOR;
  10014. #endif /* WOLFSSL_DTLS13 */
  10015. /* catch version mismatch */
  10016. #ifndef WOLFSSL_TLS13
  10017. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  10018. #else
  10019. if (rh->pvMajor != ssl->version.major ||
  10020. (rh->pvMinor != ssl->version.minor &&
  10021. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != tls12minor)
  10022. ))
  10023. #endif
  10024. {
  10025. if (ssl->options.side == WOLFSSL_SERVER_END &&
  10026. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  10027. WOLFSSL_MSG("Client attempting to connect with different version");
  10028. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  10029. ssl->options.downgrade &&
  10030. ssl->options.connectState < FIRST_REPLY_DONE)
  10031. WOLFSSL_MSG("Server attempting to accept with different version");
  10032. else if (ssl->options.dtls && rh->type == handshake)
  10033. /* Check the DTLS handshake message RH version later. */
  10034. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  10035. #ifdef WOLFSSL_DTLS13
  10036. else if (ssl->options.dtls && !ssl->options.handShakeDone) {
  10037. /* we may have lost the ServerHello and this is a unified record
  10038. before version been negotiated */
  10039. if (Dtls13IsUnifiedHeader(*ssl->buffers.inputBuffer.buffer)) {
  10040. return SEQUENCE_ERROR;
  10041. }
  10042. }
  10043. #endif /* WOLFSSL_DTLS13 */
  10044. else {
  10045. WOLFSSL_MSG("SSL version error");
  10046. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  10047. return VERSION_ERROR; /* only use requested version */
  10048. }
  10049. }
  10050. /* record layer length check */
  10051. #ifdef HAVE_MAX_FRAGMENT
  10052. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  10053. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  10054. return LENGTH_ERROR;
  10055. }
  10056. #else
  10057. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  10058. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  10059. return LENGTH_ERROR;
  10060. }
  10061. #endif
  10062. if (*size == 0 && rh->type != application_data) {
  10063. WOLFSSL_MSG("0 length, non-app data record.");
  10064. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  10065. return LENGTH_ERROR;
  10066. }
  10067. /* verify record type here as well */
  10068. switch (rh->type) {
  10069. case handshake:
  10070. case change_cipher_spec:
  10071. case application_data:
  10072. case alert:
  10073. #ifdef WOLFSSL_DTLS13
  10074. case ack:
  10075. #endif /* WOLFSSL_DTLS13 */
  10076. break;
  10077. case no_type:
  10078. default:
  10079. #ifdef OPENSSL_ALL
  10080. if (!ssl->options.dtls) {
  10081. char *method = (char*)ssl->buffers.inputBuffer.buffer + start;
  10082. /* Attempt to identify if this is a plain HTTP request.
  10083. * No size checks because this function assumes at least
  10084. * RECORD_HEADER_SZ size of data has been read which is
  10085. * also the longest string comparison in this if. */
  10086. if (XSTRNCMP(method, "GET ", XSTR_SIZEOF("GET ")) == 0 ||
  10087. XSTRNCMP(method, "POST ", XSTR_SIZEOF("POST ")) == 0 ||
  10088. XSTRNCMP(method, "HEAD ", XSTR_SIZEOF("HEAD ")) == 0 ||
  10089. XSTRNCMP(method, "PUT ", XSTR_SIZEOF("PUT ")) == 0) {
  10090. WOLFSSL_MSG("Plain HTTP request detected");
  10091. return SSL_R_HTTP_REQUEST;
  10092. }
  10093. }
  10094. #endif
  10095. WOLFSSL_MSG("Unknown Record Type");
  10096. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  10097. return UNKNOWN_RECORD_TYPE;
  10098. }
  10099. /* haven't decrypted this record yet */
  10100. ssl->keys.decryptedCur = 0;
  10101. return 0;
  10102. }
  10103. #ifndef WOLFSSL_NO_TLS12
  10104. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  10105. byte *type, word32 *size, word32 totalSz)
  10106. {
  10107. const byte *ptr = input + *inOutIdx;
  10108. (void)ssl;
  10109. *inOutIdx += HANDSHAKE_HEADER_SZ;
  10110. if (*inOutIdx > totalSz)
  10111. return BUFFER_E;
  10112. *type = ptr[0];
  10113. c24to32(&ptr[1], size);
  10114. return 0;
  10115. }
  10116. #endif
  10117. #ifdef WOLFSSL_DTLS
  10118. int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  10119. word32* inOutIdx, byte *type, word32 *size,
  10120. word32 *fragOffset, word32 *fragSz,
  10121. word32 totalSz)
  10122. {
  10123. word32 idx = *inOutIdx;
  10124. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  10125. if (*inOutIdx > totalSz) {
  10126. WOLFSSL_ERROR(BUFFER_E);
  10127. return BUFFER_E;
  10128. }
  10129. *type = input[idx++];
  10130. c24to32(input + idx, size);
  10131. idx += OPAQUE24_LEN;
  10132. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  10133. idx += DTLS_HANDSHAKE_SEQ_SZ;
  10134. c24to32(input + idx, fragOffset);
  10135. idx += DTLS_HANDSHAKE_FRAG_SZ;
  10136. c24to32(input + idx, fragSz);
  10137. if ((ssl->curRL.pvMajor != ssl->version.major) ||
  10138. (!IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != ssl->version.minor) ||
  10139. (IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != DTLSv1_2_MINOR)
  10140. ) {
  10141. if (*type != client_hello && *type != hello_verify_request && *type != server_hello) {
  10142. WOLFSSL_ERROR(VERSION_ERROR);
  10143. return VERSION_ERROR;
  10144. }
  10145. else {
  10146. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  10147. }
  10148. }
  10149. return 0;
  10150. }
  10151. #endif
  10152. #if !defined(NO_OLD_TLS) || \
  10153. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  10154. /* fill with MD5 pad size since biggest required */
  10155. static const byte PAD1[PAD_MD5] =
  10156. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  10157. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  10158. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  10159. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  10160. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  10161. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  10162. };
  10163. static const byte PAD2[PAD_MD5] =
  10164. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  10165. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  10166. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  10167. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  10168. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  10169. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  10170. };
  10171. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  10172. #ifndef NO_OLD_TLS
  10173. /* calculate MD5 hash for finished */
  10174. #ifdef WOLFSSL_TI_HASH
  10175. #include <wolfssl/wolfcrypt/hash.h>
  10176. #endif
  10177. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  10178. {
  10179. int ret;
  10180. byte md5_result[WC_MD5_DIGEST_SIZE];
  10181. #ifdef WOLFSSL_SMALL_STACK
  10182. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  10183. if (md5 == NULL)
  10184. return MEMORY_E;
  10185. #else
  10186. wc_Md5 md5[1];
  10187. #endif
  10188. /* make md5 inner */
  10189. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  10190. if (ret == 0)
  10191. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  10192. if (ret == 0)
  10193. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  10194. if (ret == 0)
  10195. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  10196. if (ret == 0)
  10197. ret = wc_Md5Final(md5, md5_result);
  10198. /* make md5 outer */
  10199. if (ret == 0) {
  10200. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  10201. if (ret == 0) {
  10202. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  10203. if (ret == 0)
  10204. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  10205. if (ret == 0)
  10206. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  10207. if (ret == 0)
  10208. ret = wc_Md5Final(md5, hashes->md5);
  10209. wc_Md5Free(md5);
  10210. }
  10211. }
  10212. #ifdef WOLFSSL_SMALL_STACK
  10213. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  10214. #endif
  10215. return ret;
  10216. }
  10217. /* calculate SHA hash for finished */
  10218. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  10219. {
  10220. int ret;
  10221. byte sha_result[WC_SHA_DIGEST_SIZE];
  10222. #ifdef WOLFSSL_SMALL_STACK
  10223. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  10224. if (sha == NULL)
  10225. return MEMORY_E;
  10226. #else
  10227. wc_Sha sha[1];
  10228. #endif
  10229. /* make sha inner */
  10230. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  10231. if (ret == 0)
  10232. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  10233. if (ret == 0)
  10234. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN);
  10235. if (ret == 0)
  10236. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  10237. if (ret == 0)
  10238. ret = wc_ShaFinal(sha, sha_result);
  10239. /* make sha outer */
  10240. if (ret == 0) {
  10241. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  10242. if (ret == 0) {
  10243. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN);
  10244. if (ret == 0)
  10245. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  10246. if (ret == 0)
  10247. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  10248. if (ret == 0)
  10249. ret = wc_ShaFinal(sha, hashes->sha);
  10250. wc_ShaFree(sha);
  10251. }
  10252. }
  10253. #ifdef WOLFSSL_SMALL_STACK
  10254. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  10255. #endif
  10256. return ret;
  10257. }
  10258. #endif
  10259. #ifndef WOLFSSL_NO_TLS12
  10260. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  10261. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  10262. {
  10263. int ret = 0;
  10264. if (ssl == NULL)
  10265. return BAD_FUNC_ARG;
  10266. #ifndef NO_TLS
  10267. if (ssl->options.tls) {
  10268. ret = BuildTlsFinished(ssl, hashes, sender);
  10269. }
  10270. #else
  10271. (void)hashes;
  10272. (void)sender;
  10273. #endif
  10274. #ifndef NO_OLD_TLS
  10275. if (!ssl->options.tls) {
  10276. ret = BuildMD5(ssl, hashes, sender);
  10277. if (ret == 0) {
  10278. ret = BuildSHA(ssl, hashes, sender);
  10279. }
  10280. }
  10281. #endif
  10282. return ret;
  10283. }
  10284. #endif /* WOLFSSL_NO_TLS12 */
  10285. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  10286. /* Does this cipher suite (first, second) have the requirement
  10287. an ephemeral key exchange will still require the key for signing
  10288. the key exchange so ECDHE_RSA requires an rsa key thus rsa_kea */
  10289. int CipherRequires(byte first, byte second, int requirement)
  10290. {
  10291. (void)requirement;
  10292. #ifndef WOLFSSL_NO_TLS12
  10293. #ifdef HAVE_CHACHA
  10294. if (first == CHACHA_BYTE) {
  10295. switch (second) {
  10296. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  10297. if (requirement == REQUIRES_RSA)
  10298. return 1;
  10299. break;
  10300. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  10301. if (requirement == REQUIRES_ECC)
  10302. return 1;
  10303. break;
  10304. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  10305. if (requirement == REQUIRES_RSA)
  10306. return 1;
  10307. if (requirement == REQUIRES_DHE)
  10308. return 1;
  10309. break;
  10310. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  10311. if (requirement == REQUIRES_RSA)
  10312. return 1;
  10313. break;
  10314. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  10315. if (requirement == REQUIRES_ECC)
  10316. return 1;
  10317. break;
  10318. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  10319. if (requirement == REQUIRES_RSA)
  10320. return 1;
  10321. if (requirement == REQUIRES_DHE)
  10322. return 1;
  10323. break;
  10324. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  10325. if (requirement == REQUIRES_PSK)
  10326. return 1;
  10327. break;
  10328. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  10329. if (requirement == REQUIRES_PSK)
  10330. return 1;
  10331. break;
  10332. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  10333. if (requirement == REQUIRES_PSK)
  10334. return 1;
  10335. if (requirement == REQUIRES_DHE)
  10336. return 1;
  10337. break;
  10338. default:
  10339. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires CHACHA");
  10340. return 0;
  10341. }
  10342. if (requirement == REQUIRES_AEAD)
  10343. return 1;
  10344. }
  10345. #endif /* HAVE_CHACHA */
  10346. /* ECC extensions */
  10347. if (first == ECC_BYTE) {
  10348. switch (second) {
  10349. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10350. #ifndef NO_RSA
  10351. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  10352. if (requirement == REQUIRES_RSA)
  10353. return 1;
  10354. break;
  10355. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  10356. if (requirement == REQUIRES_ECC_STATIC)
  10357. return 1;
  10358. if (requirement == REQUIRES_RSA_SIG)
  10359. return 1;
  10360. break;
  10361. #ifndef NO_DES3
  10362. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  10363. if (requirement == REQUIRES_RSA)
  10364. return 1;
  10365. break;
  10366. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  10367. if (requirement == REQUIRES_ECC_STATIC)
  10368. return 1;
  10369. if (requirement == REQUIRES_RSA_SIG)
  10370. return 1;
  10371. break;
  10372. #endif /* !NO_DES3 */
  10373. #ifndef NO_RC4
  10374. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  10375. if (requirement == REQUIRES_RSA)
  10376. return 1;
  10377. break;
  10378. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  10379. if (requirement == REQUIRES_ECC_STATIC)
  10380. return 1;
  10381. if (requirement == REQUIRES_RSA_SIG)
  10382. return 1;
  10383. break;
  10384. #endif /* !NO_RC4 */
  10385. #endif /* NO_RSA */
  10386. #ifndef NO_DES3
  10387. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  10388. if (requirement == REQUIRES_ECC)
  10389. return 1;
  10390. break;
  10391. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  10392. if (requirement == REQUIRES_ECC_STATIC)
  10393. return 1;
  10394. break;
  10395. #endif /* !NO_DES3 */
  10396. #ifndef NO_RC4
  10397. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  10398. if (requirement == REQUIRES_ECC)
  10399. return 1;
  10400. break;
  10401. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  10402. if (requirement == REQUIRES_ECC_STATIC)
  10403. return 1;
  10404. break;
  10405. #endif /* !NO_RC4 */
  10406. #ifndef NO_RSA
  10407. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  10408. if (requirement == REQUIRES_RSA)
  10409. return 1;
  10410. break;
  10411. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  10412. if (requirement == REQUIRES_ECC_STATIC)
  10413. return 1;
  10414. if (requirement == REQUIRES_RSA_SIG)
  10415. return 1;
  10416. break;
  10417. #endif /* !NO_RSA */
  10418. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  10419. if (requirement == REQUIRES_ECC)
  10420. return 1;
  10421. break;
  10422. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  10423. if (requirement == REQUIRES_ECC_STATIC)
  10424. return 1;
  10425. break;
  10426. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  10427. if (requirement == REQUIRES_ECC)
  10428. return 1;
  10429. break;
  10430. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  10431. if (requirement == REQUIRES_ECC_STATIC)
  10432. return 1;
  10433. break;
  10434. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  10435. if (requirement == REQUIRES_ECC)
  10436. return 1;
  10437. if (requirement == REQUIRES_AEAD)
  10438. return 1;
  10439. break;
  10440. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  10441. if (requirement == REQUIRES_ECC)
  10442. return 1;
  10443. if (requirement == REQUIRES_AEAD)
  10444. return 1;
  10445. break;
  10446. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  10447. if (requirement == REQUIRES_ECC_STATIC)
  10448. return 1;
  10449. if (requirement == REQUIRES_AEAD)
  10450. return 1;
  10451. break;
  10452. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  10453. if (requirement == REQUIRES_ECC_STATIC)
  10454. return 1;
  10455. if (requirement == REQUIRES_AEAD)
  10456. return 1;
  10457. break;
  10458. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10459. #ifndef NO_RSA
  10460. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10461. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  10462. if (requirement == REQUIRES_RSA)
  10463. return 1;
  10464. if (requirement == REQUIRES_AEAD)
  10465. return 1;
  10466. break;
  10467. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  10468. if (requirement == REQUIRES_RSA)
  10469. return 1;
  10470. if (requirement == REQUIRES_AEAD)
  10471. return 1;
  10472. break;
  10473. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  10474. if (requirement == REQUIRES_ECC_STATIC)
  10475. return 1;
  10476. if (requirement == REQUIRES_RSA_SIG)
  10477. return 1;
  10478. if (requirement == REQUIRES_AEAD)
  10479. return 1;
  10480. break;
  10481. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  10482. if (requirement == REQUIRES_ECC_STATIC)
  10483. return 1;
  10484. if (requirement == REQUIRES_RSA_SIG)
  10485. return 1;
  10486. if (requirement == REQUIRES_AEAD)
  10487. return 1;
  10488. break;
  10489. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10490. #ifdef HAVE_AESCCM
  10491. case TLS_RSA_WITH_AES_128_CCM_8 :
  10492. case TLS_RSA_WITH_AES_256_CCM_8 :
  10493. if (requirement == REQUIRES_RSA)
  10494. return 1;
  10495. if (requirement == REQUIRES_RSA_SIG)
  10496. return 1;
  10497. if (requirement == REQUIRES_AEAD)
  10498. return 1;
  10499. break;
  10500. #endif /* HAVE_AESCCM */
  10501. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10502. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  10503. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  10504. if (requirement == REQUIRES_RSA)
  10505. return 1;
  10506. break;
  10507. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  10508. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  10509. if (requirement == REQUIRES_RSA_SIG)
  10510. return 1;
  10511. if (requirement == REQUIRES_ECC_STATIC)
  10512. return 1;
  10513. break;
  10514. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10515. #endif /* !NO_RSA */
  10516. #ifdef HAVE_ARIA
  10517. case TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 :
  10518. case TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 :
  10519. if (requirement == REQUIRES_ECC)
  10520. return 1;
  10521. break;
  10522. #endif /* HAVE_ARIA */
  10523. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10524. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  10525. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  10526. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  10527. if (requirement == REQUIRES_ECC)
  10528. return 1;
  10529. if (requirement == REQUIRES_AEAD)
  10530. return 1;
  10531. break;
  10532. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  10533. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  10534. if (requirement == REQUIRES_ECC)
  10535. return 1;
  10536. break;
  10537. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  10538. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  10539. if (requirement == REQUIRES_ECC)
  10540. return 1;
  10541. if (requirement == REQUIRES_ECC_STATIC)
  10542. return 1;
  10543. break;
  10544. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10545. #ifndef NO_PSK
  10546. case TLS_PSK_WITH_AES_128_CCM:
  10547. case TLS_PSK_WITH_AES_256_CCM:
  10548. case TLS_PSK_WITH_AES_128_CCM_8:
  10549. case TLS_PSK_WITH_AES_256_CCM_8:
  10550. if (requirement == REQUIRES_PSK)
  10551. return 1;
  10552. if (requirement == REQUIRES_AEAD)
  10553. return 1;
  10554. break;
  10555. case TLS_DHE_PSK_WITH_AES_128_CCM:
  10556. case TLS_DHE_PSK_WITH_AES_256_CCM:
  10557. if (requirement == REQUIRES_PSK)
  10558. return 1;
  10559. if (requirement == REQUIRES_DHE)
  10560. return 1;
  10561. if (requirement == REQUIRES_AEAD)
  10562. return 1;
  10563. break;
  10564. #endif /* !NO_PSK */
  10565. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10566. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  10567. if (requirement == REQUIRES_ECC)
  10568. return 1;
  10569. break;
  10570. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  10571. if (requirement == REQUIRES_PSK)
  10572. return 1;
  10573. break;
  10574. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  10575. if (requirement == REQUIRES_PSK)
  10576. return 1;
  10577. break;
  10578. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10579. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  10580. case TLS_SHA256_SHA256:
  10581. break;
  10582. case TLS_SHA384_SHA384:
  10583. break;
  10584. #endif
  10585. default:
  10586. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  10587. return 0;
  10588. } /* switch */
  10589. } /* if */
  10590. /* ECC extensions */
  10591. if (first == ECDHE_PSK_BYTE) {
  10592. switch (second) {
  10593. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  10594. case TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 :
  10595. if (requirement == REQUIRES_PSK)
  10596. return 1;
  10597. break;
  10598. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10599. default:
  10600. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC PSK");
  10601. return 0;
  10602. } /* switch */
  10603. } /* if */
  10604. #endif /* !WOLFSSL_NO_TLS12 */
  10605. #ifdef WOLFSSL_TLS13
  10606. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  10607. if (first == TLS13_BYTE) {
  10608. switch (second) {
  10609. case TLS_AES_128_GCM_SHA256:
  10610. case TLS_AES_256_GCM_SHA384:
  10611. case TLS_CHACHA20_POLY1305_SHA256:
  10612. case TLS_AES_128_CCM_SHA256:
  10613. case TLS_AES_128_CCM_8_SHA256:
  10614. if (requirement == REQUIRES_AEAD)
  10615. return 1;
  10616. return 0;
  10617. default:
  10618. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  10619. "TLS v1.3");
  10620. return 0;
  10621. }
  10622. }
  10623. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && defined(WOLFSSL_SM4)
  10624. if (first == CIPHER_BYTE) {
  10625. /* Other cipher suites for TLS 1.2 below. */
  10626. switch (second) {
  10627. #if defined(WOLFSSL_SM4_GCM)
  10628. case TLS_SM4_GCM_SM3:
  10629. return 0;
  10630. break;
  10631. #endif
  10632. #if defined(WOLFSSL_SM4_CCM)
  10633. case TLS_SM4_CCM_SM3:
  10634. return 0;
  10635. break;
  10636. #endif
  10637. }
  10638. }
  10639. #endif /* WOLFSSL_SM2 && WOLFSSL_SM3 && WOLFSSL_SM4 */
  10640. #endif /* WOLFSSL_TLS13 */
  10641. #ifndef WOLFSSL_NO_TLS12
  10642. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && defined(WOLFSSL_SM4)
  10643. if (first == SM_BYTE) {
  10644. switch (second) {
  10645. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  10646. case TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3:
  10647. if (requirement == REQUIRES_ECC)
  10648. return 1;
  10649. break;
  10650. #endif
  10651. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  10652. case TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3:
  10653. if (requirement == REQUIRES_ECC)
  10654. return 1;
  10655. break;
  10656. #endif
  10657. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  10658. case TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3:
  10659. if (requirement == REQUIRES_ECC)
  10660. return 1;
  10661. break;
  10662. #endif
  10663. default:
  10664. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires SM");
  10665. return 0;
  10666. }
  10667. }
  10668. #endif
  10669. if (first == CIPHER_BYTE) {
  10670. /* normal suites */
  10671. switch (second) {
  10672. #ifndef NO_RSA
  10673. #ifndef NO_RC4
  10674. case SSL_RSA_WITH_RC4_128_SHA :
  10675. if (requirement == REQUIRES_RSA)
  10676. return 1;
  10677. break;
  10678. case SSL_RSA_WITH_RC4_128_MD5 :
  10679. if (requirement == REQUIRES_RSA)
  10680. return 1;
  10681. break;
  10682. #endif /* NO_RC4 */
  10683. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  10684. if (requirement == REQUIRES_RSA)
  10685. return 1;
  10686. break;
  10687. case TLS_RSA_WITH_AES_128_CBC_SHA :
  10688. if (requirement == REQUIRES_RSA)
  10689. return 1;
  10690. break;
  10691. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  10692. if (requirement == REQUIRES_RSA)
  10693. return 1;
  10694. break;
  10695. case TLS_RSA_WITH_AES_256_CBC_SHA :
  10696. if (requirement == REQUIRES_RSA)
  10697. return 1;
  10698. break;
  10699. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  10700. if (requirement == REQUIRES_RSA)
  10701. return 1;
  10702. break;
  10703. case TLS_RSA_WITH_NULL_MD5 :
  10704. case TLS_RSA_WITH_NULL_SHA :
  10705. case TLS_RSA_WITH_NULL_SHA256 :
  10706. if (requirement == REQUIRES_RSA)
  10707. return 1;
  10708. break;
  10709. #endif /* !NO_RSA */
  10710. #ifndef NO_PSK
  10711. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  10712. if (requirement == REQUIRES_PSK)
  10713. return 1;
  10714. if (requirement == REQUIRES_AEAD)
  10715. return 1;
  10716. break;
  10717. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  10718. if (requirement == REQUIRES_PSK)
  10719. return 1;
  10720. if (requirement == REQUIRES_AEAD)
  10721. return 1;
  10722. break;
  10723. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  10724. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  10725. case TLS_PSK_WITH_AES_128_CBC_SHA :
  10726. case TLS_PSK_WITH_AES_256_CBC_SHA :
  10727. case TLS_PSK_WITH_NULL_SHA384 :
  10728. case TLS_PSK_WITH_NULL_SHA256 :
  10729. case TLS_PSK_WITH_NULL_SHA :
  10730. if (requirement == REQUIRES_PSK)
  10731. return 1;
  10732. break;
  10733. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  10734. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  10735. if (requirement == REQUIRES_DHE)
  10736. return 1;
  10737. if (requirement == REQUIRES_PSK)
  10738. return 1;
  10739. if (requirement == REQUIRES_AEAD)
  10740. return 1;
  10741. break;
  10742. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  10743. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  10744. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  10745. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  10746. if (requirement == REQUIRES_DHE)
  10747. return 1;
  10748. if (requirement == REQUIRES_PSK)
  10749. return 1;
  10750. break;
  10751. #endif /* NO_PSK */
  10752. #ifndef NO_RSA
  10753. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  10754. if (requirement == REQUIRES_RSA)
  10755. return 1;
  10756. if (requirement == REQUIRES_DHE)
  10757. return 1;
  10758. break;
  10759. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  10760. if (requirement == REQUIRES_RSA)
  10761. return 1;
  10762. if (requirement == REQUIRES_DHE)
  10763. return 1;
  10764. break;
  10765. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  10766. if (requirement == REQUIRES_RSA)
  10767. return 1;
  10768. if (requirement == REQUIRES_DHE)
  10769. return 1;
  10770. break;
  10771. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  10772. if (requirement == REQUIRES_RSA)
  10773. return 1;
  10774. if (requirement == REQUIRES_DHE)
  10775. return 1;
  10776. break;
  10777. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  10778. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  10779. if (requirement == REQUIRES_RSA)
  10780. return 1;
  10781. if (requirement == REQUIRES_AEAD)
  10782. return 1;
  10783. break;
  10784. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  10785. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  10786. if (requirement == REQUIRES_RSA)
  10787. return 1;
  10788. if (requirement == REQUIRES_DHE)
  10789. return 1;
  10790. if (requirement == REQUIRES_AEAD)
  10791. return 1;
  10792. break;
  10793. #ifdef HAVE_CAMELLIA
  10794. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  10795. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  10796. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  10797. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  10798. if (requirement == REQUIRES_RSA)
  10799. return 1;
  10800. break;
  10801. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  10802. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  10803. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  10804. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  10805. if (requirement == REQUIRES_RSA)
  10806. return 1;
  10807. if (requirement == REQUIRES_RSA_SIG)
  10808. return 1;
  10809. if (requirement == REQUIRES_DHE)
  10810. return 1;
  10811. break;
  10812. #endif /* HAVE_CAMELLIA */
  10813. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  10814. if (requirement == REQUIRES_RSA)
  10815. return 1;
  10816. if (requirement == REQUIRES_RSA_SIG)
  10817. return 1;
  10818. if (requirement == REQUIRES_DHE)
  10819. return 1;
  10820. break;
  10821. #endif /* !NO_RSA */
  10822. #ifdef HAVE_ANON
  10823. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  10824. if (requirement == REQUIRES_DHE)
  10825. return 1;
  10826. break;
  10827. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  10828. if (requirement == REQUIRES_DHE)
  10829. return 1;
  10830. if (requirement == REQUIRES_AEAD)
  10831. return 1;
  10832. break;
  10833. #endif
  10834. #ifdef WOLFSSL_MULTICAST
  10835. case WDM_WITH_NULL_SHA256 :
  10836. break;
  10837. #endif
  10838. default:
  10839. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  10840. return 0;
  10841. } /* switch */
  10842. } /* if ECC / Normal suites else */
  10843. #endif /* !WOLFSSL_NO_TLS12 */
  10844. return 0;
  10845. }
  10846. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  10847. #ifndef NO_CERTS
  10848. /* Match names with wildcards, each wildcard can represent a single name
  10849. component or fragment but not multiple names, i.e.,
  10850. *.z.com matches y.z.com but not x.y.z.com
  10851. return 1 on success */
  10852. int MatchDomainName(const char* pattern, int len, const char* str)
  10853. {
  10854. int ret = 0;
  10855. if (pattern == NULL || str == NULL || len <= 0)
  10856. return 0;
  10857. while (len > 0) {
  10858. char p = (char)XTOLOWER((unsigned char)*pattern++);
  10859. if (p == '\0')
  10860. break;
  10861. if (p == '*') {
  10862. char s;
  10863. while (--len > 0) {
  10864. p = (char)XTOLOWER((unsigned char)*pattern);
  10865. pattern++;
  10866. if (p != '*')
  10867. break;
  10868. }
  10869. if (len == 0)
  10870. p = '\0';
  10871. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  10872. if (s == p)
  10873. break;
  10874. if (s == '.')
  10875. return 0;
  10876. str++;
  10877. }
  10878. }
  10879. else {
  10880. if (p != (char)XTOLOWER((unsigned char) *str))
  10881. return 0;
  10882. }
  10883. if (len > 0) {
  10884. str++;
  10885. len--;
  10886. }
  10887. }
  10888. if (*str == '\0' && len == 0) {
  10889. ret = 1; /* success */
  10890. }
  10891. return ret;
  10892. }
  10893. /* Check that alternative names, if they exists, match the domain.
  10894. * Fail if there are wild patterns and they didn't match.
  10895. * Check the common name if no alternative names matched.
  10896. *
  10897. * dCert Decoded cert to get the alternative names from.
  10898. * domain Domain name to compare against.
  10899. * checkCN Whether to check the common name.
  10900. * returns 1 : match was found.
  10901. * 0 : no match found.
  10902. * -1 : No matches and wild pattern match failed.
  10903. */
  10904. int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
  10905. {
  10906. int match = 0;
  10907. DNS_entry* altName = NULL;
  10908. char *buf;
  10909. word32 len;
  10910. WOLFSSL_MSG("Checking AltNames");
  10911. if (dCert)
  10912. altName = dCert->altNames;
  10913. if (checkCN != NULL) {
  10914. *checkCN = (altName == NULL) ? 1 : 0;
  10915. }
  10916. while (altName) {
  10917. WOLFSSL_MSG("\tindividual AltName check");
  10918. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  10919. if (altName->type == ASN_IP_TYPE) {
  10920. buf = altName->ipString;
  10921. len = (word32)XSTRLEN(buf);
  10922. }
  10923. else
  10924. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  10925. {
  10926. buf = altName->name;
  10927. len = altName->len;
  10928. }
  10929. if (MatchDomainName(buf, len, domain)) {
  10930. match = 1;
  10931. if (checkCN != NULL) {
  10932. *checkCN = 0;
  10933. }
  10934. WOLFSSL_MSG("\tmatch found");
  10935. break;
  10936. }
  10937. /* No matches and wild pattern match failed. */
  10938. else if (buf && (len >=1) && (buf[0] == '*')) {
  10939. match = -1;
  10940. WOLFSSL_MSG("\twildcard match failed");
  10941. }
  10942. altName = altName->next;
  10943. }
  10944. return match;
  10945. }
  10946. /* Check the domain name matches the subject alternative name or the subject
  10947. * name.
  10948. *
  10949. * dcert Decoded certificate.
  10950. * domainName The domain name.
  10951. * domainNameLen The length of the domain name.
  10952. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  10953. */
  10954. int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
  10955. {
  10956. int checkCN;
  10957. int ret = DOMAIN_NAME_MISMATCH;
  10958. /* Assume name is NUL terminated. */
  10959. (void)domainNameLen;
  10960. if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
  10961. WOLFSSL_MSG("DomainName match on alt names failed");
  10962. }
  10963. else {
  10964. ret = 0;
  10965. }
  10966. #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  10967. if (checkCN == 1) {
  10968. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  10969. domainName) == 1) {
  10970. ret = 0;
  10971. }
  10972. else {
  10973. WOLFSSL_MSG("DomainName match on common name failed");
  10974. }
  10975. }
  10976. #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
  10977. return ret;
  10978. }
  10979. int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
  10980. {
  10981. WOLFSSL_MSG("Checking IPAddr");
  10982. return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
  10983. }
  10984. #ifdef SESSION_CERTS
  10985. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  10986. byte* certBuf, word32 certSz)
  10987. {
  10988. if (chain->count < MAX_CHAIN_DEPTH &&
  10989. certSz < MAX_X509_SIZE) {
  10990. chain->certs[chain->count].length = certSz;
  10991. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  10992. chain->count++;
  10993. }
  10994. else {
  10995. WOLFSSL_MSG("Couldn't store chain cert for session");
  10996. }
  10997. }
  10998. #endif
  10999. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  11000. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11001. void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType)
  11002. {
  11003. if (nameType == SUBJECT) {
  11004. XSTRNCPY(name->name, dCert->subject, ASN_NAME_MAX);
  11005. name->name[ASN_NAME_MAX - 1] = '\0';
  11006. name->sz = (int)XSTRLEN(name->name) + 1;
  11007. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  11008. name->rawLen = min(dCert->subjectRawLen, ASN_NAME_MAX);
  11009. if (name->rawLen > 0)
  11010. XMEMCPY(name->raw, dCert->subjectRaw, name->rawLen);
  11011. #endif
  11012. }
  11013. else {
  11014. XSTRNCPY(name->name, dCert->issuer, ASN_NAME_MAX);
  11015. name->name[ASN_NAME_MAX - 1] = '\0';
  11016. name->sz = (int)XSTRLEN(name->name) + 1;
  11017. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)) \
  11018. && (defined(HAVE_PKCS7) || defined(WOLFSSL_CERT_EXT))
  11019. name->rawLen = min(dCert->issuerRawLen, ASN_NAME_MAX);
  11020. if (name->rawLen > 0) {
  11021. XMEMCPY(name->raw, dCert->issuerRaw, name->rawLen);
  11022. }
  11023. #endif
  11024. }
  11025. }
  11026. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  11027. !defined(IGNORE_NAME_CONSTRAINTS)
  11028. /* copies over additional alt names such as dirName
  11029. * returns 0 on success
  11030. */
  11031. static int CopyAdditionalAltNames(DNS_entry** to, DNS_entry* from, int type,
  11032. void* heap)
  11033. {
  11034. DNS_entry* cur = from;
  11035. if (to == NULL) {
  11036. return BAD_FUNC_ARG;
  11037. }
  11038. while (cur != NULL) {
  11039. if (cur->type == type) {
  11040. DNS_entry* dnsEntry;
  11041. int strLen = cur->len;
  11042. dnsEntry = AltNameNew(heap);
  11043. if (dnsEntry == NULL) {
  11044. WOLFSSL_MSG("\tOut of Memory");
  11045. return MEMORY_E;
  11046. }
  11047. dnsEntry->type = type;
  11048. dnsEntry->name = (char*)XMALLOC(strLen + 1, heap,
  11049. DYNAMIC_TYPE_ALTNAME);
  11050. if (dnsEntry->name == NULL) {
  11051. WOLFSSL_MSG("\tOut of Memory");
  11052. XFREE(dnsEntry, heap, DYNAMIC_TYPE_ALTNAME);
  11053. return MEMORY_E;
  11054. }
  11055. dnsEntry->len = strLen;
  11056. XMEMCPY(dnsEntry->name, cur->name, strLen);
  11057. dnsEntry->name[strLen] = '\0';
  11058. dnsEntry->next = *to;
  11059. *to = dnsEntry;
  11060. }
  11061. cur = cur->next;
  11062. }
  11063. return 0;
  11064. }
  11065. #endif /* OPENSSL_EXTRA */
  11066. #ifdef WOLFSSL_CERT_REQ
  11067. static int CopyREQAttributes(WOLFSSL_X509* x509, DecodedCert* dCert)
  11068. {
  11069. int ret = 0;
  11070. if (dCert->cPwd) {
  11071. if (dCert->cPwdLen < CTC_NAME_SIZE) {
  11072. XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
  11073. x509->challengePw[dCert->cPwdLen] = '\0';
  11074. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  11075. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  11076. NID_pkcs9_challengePassword,
  11077. MBSTRING_ASC,
  11078. (const byte*)dCert->cPwd,
  11079. dCert->cPwdLen) != WOLFSSL_SUCCESS) {
  11080. ret = REQ_ATTRIBUTE_E;
  11081. WOLFSSL_ERROR_VERBOSE(ret);
  11082. }
  11083. #endif
  11084. }
  11085. else {
  11086. WOLFSSL_MSG("Challenge password too long");
  11087. ret = MEMORY_E;
  11088. }
  11089. }
  11090. if (dCert->contentType) {
  11091. if (dCert->contentTypeLen < CTC_NAME_SIZE) {
  11092. XMEMCPY(x509->contentType, dCert->contentType, dCert->contentTypeLen);
  11093. x509->contentType[dCert->contentTypeLen] = '\0';
  11094. }
  11095. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  11096. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  11097. NID_pkcs9_contentType,
  11098. MBSTRING_ASC,
  11099. (const byte*)dCert->contentType,
  11100. dCert->contentTypeLen) !=
  11101. WOLFSSL_SUCCESS) {
  11102. ret = REQ_ATTRIBUTE_E;
  11103. WOLFSSL_ERROR_VERBOSE(ret);
  11104. }
  11105. #endif
  11106. }
  11107. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  11108. if (dCert->sNum) {
  11109. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  11110. NID_serialNumber,
  11111. MBSTRING_ASC,
  11112. (const byte*)dCert->sNum,
  11113. dCert->sNumLen) != WOLFSSL_SUCCESS) {
  11114. ret = REQ_ATTRIBUTE_E;
  11115. WOLFSSL_ERROR_VERBOSE(ret);
  11116. }
  11117. }
  11118. if (dCert->unstructuredName) {
  11119. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  11120. NID_pkcs9_unstructuredName,
  11121. MBSTRING_ASC,
  11122. (const byte*)dCert->unstructuredName,
  11123. dCert->unstructuredNameLen)
  11124. != WOLFSSL_SUCCESS) {
  11125. ret = REQ_ATTRIBUTE_E;
  11126. WOLFSSL_ERROR_VERBOSE(ret);
  11127. }
  11128. }
  11129. if (dCert->surname) {
  11130. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  11131. NID_surname,
  11132. MBSTRING_ASC,
  11133. (const byte*)dCert->surname,
  11134. dCert->surnameLen) != WOLFSSL_SUCCESS) {
  11135. ret = REQ_ATTRIBUTE_E;
  11136. WOLFSSL_ERROR_VERBOSE(ret);
  11137. }
  11138. }
  11139. if (dCert->givenName) {
  11140. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  11141. NID_givenName,
  11142. MBSTRING_ASC,
  11143. (const byte*)dCert->givenName,
  11144. dCert->givenNameLen) != WOLFSSL_SUCCESS) {
  11145. ret = REQ_ATTRIBUTE_E;
  11146. WOLFSSL_ERROR_VERBOSE(ret);
  11147. }
  11148. }
  11149. if (dCert->dnQualifier) {
  11150. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  11151. NID_dnQualifier,
  11152. MBSTRING_ASC,
  11153. (const byte*)dCert->dnQualifier,
  11154. dCert->dnQualifierLen) != WOLFSSL_SUCCESS) {
  11155. ret = REQ_ATTRIBUTE_E;
  11156. WOLFSSL_ERROR_VERBOSE(ret);
  11157. }
  11158. }
  11159. if (dCert->initials) {
  11160. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  11161. NID_initials,
  11162. MBSTRING_ASC,
  11163. (const byte*)dCert->initials,
  11164. dCert->initialsLen) != WOLFSSL_SUCCESS) {
  11165. ret = REQ_ATTRIBUTE_E;
  11166. WOLFSSL_ERROR_VERBOSE(ret);
  11167. }
  11168. }
  11169. #endif /* OPENSSL_ALL */
  11170. return ret;
  11171. }
  11172. #endif /* WOLFSSL_CERT_REQ */
  11173. /* Copy parts X509 needs from Decoded cert, 0 on success */
  11174. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  11175. * altNames pointers could be free'd by second x509 still active by first */
  11176. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  11177. {
  11178. int ret = 0;
  11179. if (x509 == NULL || dCert == NULL ||
  11180. dCert->subjectCNLen < 0)
  11181. return BAD_FUNC_ARG;
  11182. if (x509->issuer.name == NULL || x509->subject.name == NULL) {
  11183. WOLFSSL_MSG("Either init was not called on X509 or programming error");
  11184. WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
  11185. return BAD_FUNC_ARG;
  11186. }
  11187. x509->version = dCert->version + 1;
  11188. CopyDecodedName(&x509->issuer, dCert, ISSUER);
  11189. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11190. if (dCert->issuerName != NULL) {
  11191. wolfSSL_X509_set_issuer_name(x509,
  11192. (WOLFSSL_X509_NAME*)dCert->issuerName);
  11193. x509->issuer.x509 = x509;
  11194. }
  11195. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  11196. CopyDecodedName(&x509->subject, dCert, SUBJECT);
  11197. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11198. if (dCert->subjectName != NULL) {
  11199. wolfSSL_X509_set_subject_name(x509,
  11200. (WOLFSSL_X509_NAME*)dCert->subjectName);
  11201. x509->subject.x509 = x509;
  11202. }
  11203. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  11204. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  11205. x509->serialSz = dCert->serialSz;
  11206. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  11207. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  11208. x509->subjectCN[dCert->subjectCNLen] = '\0';
  11209. }
  11210. else
  11211. x509->subjectCN[0] = '\0';
  11212. #ifdef WOLFSSL_CERT_REQ
  11213. x509->isCSR = dCert->isCSR;
  11214. /* CSR attributes */
  11215. if (x509->isCSR) {
  11216. ret = CopyREQAttributes(x509, dCert);
  11217. }
  11218. #endif /* WOLFSSL_CERT_REQ */
  11219. #ifdef WOLFSSL_SEP
  11220. {
  11221. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  11222. if (minSz > 0) {
  11223. x509->deviceTypeSz = minSz;
  11224. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  11225. }
  11226. else
  11227. x509->deviceTypeSz = 0;
  11228. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  11229. if (minSz > 0) {
  11230. x509->hwTypeSz = minSz;
  11231. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  11232. }
  11233. else
  11234. x509->hwTypeSz = 0;
  11235. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  11236. if (minSz > 0) {
  11237. x509->hwSerialNumSz = minSz;
  11238. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  11239. }
  11240. else
  11241. x509->hwSerialNumSz = 0;
  11242. }
  11243. #endif /* WOLFSSL_SEP */
  11244. {
  11245. int minSz;
  11246. if (dCert->beforeDateLen > 0) {
  11247. minSz = min(dCert->beforeDate[1], MAX_DATE_SZ);
  11248. x509->notBefore.type = dCert->beforeDate[0];
  11249. x509->notBefore.length = minSz;
  11250. XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
  11251. }
  11252. else
  11253. x509->notBefore.length = 0;
  11254. if (dCert->afterDateLen > 0) {
  11255. minSz = min(dCert->afterDate[1], MAX_DATE_SZ);
  11256. x509->notAfter.type = dCert->afterDate[0];
  11257. x509->notAfter.length = minSz;
  11258. XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
  11259. }
  11260. else
  11261. x509->notAfter.length = 0;
  11262. }
  11263. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  11264. x509->pubKey.buffer = (byte*)XMALLOC(
  11265. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  11266. if (x509->pubKey.buffer != NULL) {
  11267. x509->pubKeyOID = dCert->keyOID;
  11268. x509->pubKey.length = dCert->pubKeySize;
  11269. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  11270. }
  11271. else
  11272. ret = MEMORY_E;
  11273. #if defined(OPENSSL_ALL)
  11274. if (ret == 0) {
  11275. x509->key.pubKeyOID = dCert->keyOID;
  11276. if (!x509->key.algor) {
  11277. x509->key.algor = wolfSSL_X509_ALGOR_new();
  11278. } else {
  11279. wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
  11280. }
  11281. if (!x509->key.algor) {
  11282. ret = MEMORY_E;
  11283. } else {
  11284. if (!(x509->key.algor->algorithm =
  11285. wolfSSL_OBJ_nid2obj(oid2nid(dCert->keyOID, oidKeyType)))) {
  11286. ret = PUBLIC_KEY_E;
  11287. WOLFSSL_ERROR_VERBOSE(ret);
  11288. }
  11289. }
  11290. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  11291. if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
  11292. &dCert->publicKey,
  11293. dCert->pubKeySize))) {
  11294. ret = PUBLIC_KEY_E;
  11295. WOLFSSL_ERROR_VERBOSE(ret);
  11296. }
  11297. }
  11298. #endif
  11299. }
  11300. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  11301. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  11302. x509->sig.buffer = (byte*)XMALLOC(
  11303. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  11304. if (x509->sig.buffer == NULL) {
  11305. ret = MEMORY_E;
  11306. }
  11307. else {
  11308. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  11309. x509->sig.length = dCert->sigLength;
  11310. x509->sigOID = dCert->signatureOID;
  11311. }
  11312. #if defined(OPENSSL_ALL)
  11313. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  11314. if (!(x509->algor.algorithm =
  11315. wolfSSL_OBJ_nid2obj(oid2nid(dCert->signatureOID, oidSigType)))) {
  11316. ret = PUBLIC_KEY_E;
  11317. WOLFSSL_ERROR_VERBOSE(ret);
  11318. }
  11319. #endif
  11320. }
  11321. /* if der contains original source buffer then store for potential
  11322. * retrieval */
  11323. if (dCert->source != NULL && dCert->maxIdx > 0) {
  11324. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap)
  11325. == 0) {
  11326. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  11327. }
  11328. else {
  11329. ret = MEMORY_E;
  11330. }
  11331. }
  11332. x509->altNames = dCert->altNames;
  11333. dCert->weOwnAltNames = 0;
  11334. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  11335. !defined(IGNORE_NAME_CONSTRAINTS)
  11336. /* add copies of email names from dCert to X509 */
  11337. if (CopyAdditionalAltNames(&x509->altNames, dCert->altEmailNames,
  11338. ASN_RFC822_TYPE, x509->heap) != 0) {
  11339. return MEMORY_E;
  11340. }
  11341. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  11342. #if defined(OPENSSL_EXTRA) && !defined(IGNORE_NAME_CONSTRAINTS)
  11343. /* add copies of alternate directory names from dCert to X509 */
  11344. if (CopyAdditionalAltNames(&x509->altNames, dCert->altDirNames,
  11345. ASN_DIR_TYPE, x509->heap) != 0) {
  11346. return MEMORY_E;
  11347. }
  11348. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  11349. x509->altNamesNext = x509->altNames; /* index hint */
  11350. x509->isCa = dCert->isCA;
  11351. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11352. x509->pathLength = dCert->pathLength;
  11353. x509->keyUsage = dCert->extKeyUsage;
  11354. x509->CRLdistSet = dCert->extCRLdistSet;
  11355. x509->CRLdistCrit = dCert->extCRLdistCrit;
  11356. if (dCert->extCrlInfoRaw != NULL && dCert->extCrlInfoRawSz > 0) {
  11357. x509->rawCRLInfo = (byte*)XMALLOC(dCert->extCrlInfoRawSz, x509->heap,
  11358. DYNAMIC_TYPE_X509_EXT);
  11359. if (x509->rawCRLInfo != NULL) {
  11360. XMEMCPY(x509->rawCRLInfo, dCert->extCrlInfoRaw, dCert->extCrlInfoRawSz);
  11361. x509->rawCRLInfoSz = dCert->extCrlInfoRawSz;
  11362. }
  11363. else {
  11364. ret = MEMORY_E;
  11365. }
  11366. }
  11367. if (dCert->extCrlInfo != NULL && dCert->extCrlInfoSz > 0) {
  11368. x509->CRLInfo = (byte*)XMALLOC(dCert->extCrlInfoSz, x509->heap,
  11369. DYNAMIC_TYPE_X509_EXT);
  11370. if (x509->CRLInfo != NULL) {
  11371. XMEMCPY(x509->CRLInfo, dCert->extCrlInfo, dCert->extCrlInfoSz);
  11372. x509->CRLInfoSz = dCert->extCrlInfoSz;
  11373. }
  11374. else {
  11375. ret = MEMORY_E;
  11376. }
  11377. }
  11378. x509->authInfoSet = dCert->extAuthInfoSet;
  11379. x509->authInfoCrit = dCert->extAuthInfoCrit;
  11380. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  11381. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  11382. DYNAMIC_TYPE_X509_EXT);
  11383. if (x509->authInfo != NULL) {
  11384. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  11385. x509->authInfoSz = dCert->extAuthInfoSz;
  11386. }
  11387. else {
  11388. ret = MEMORY_E;
  11389. }
  11390. }
  11391. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  11392. if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
  11393. x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
  11394. DYNAMIC_TYPE_X509_EXT);
  11395. if (x509->authInfoCaIssuer != NULL) {
  11396. XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
  11397. x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
  11398. }
  11399. else {
  11400. ret = MEMORY_E;
  11401. }
  11402. }
  11403. #endif
  11404. x509->basicConstSet = dCert->extBasicConstSet;
  11405. x509->basicConstCrit = dCert->extBasicConstCrit;
  11406. x509->basicConstPlSet = dCert->pathLengthSet;
  11407. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  11408. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  11409. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  11410. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  11411. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  11412. #ifdef WOLFSSL_AKID_NAME
  11413. if (dCert->extRawAuthKeyIdSrc != NULL &&
  11414. dCert->extAuthKeyIdSrc > dCert->extRawAuthKeyIdSrc &&
  11415. dCert->extAuthKeyIdSrc <
  11416. (dCert->extRawAuthKeyIdSrc + dCert->extRawAuthKeyIdSz)) {
  11417. /* Confirmed: extAuthKeyIdSrc points inside extRawAuthKeyIdSrc */
  11418. x509->authKeyIdSrc = (byte*)XMALLOC(dCert->extRawAuthKeyIdSz,
  11419. x509->heap, DYNAMIC_TYPE_X509_EXT);
  11420. if (x509->authKeyIdSrc != NULL) {
  11421. XMEMCPY(x509->authKeyIdSrc, dCert->extRawAuthKeyIdSrc,
  11422. dCert->extRawAuthKeyIdSz);
  11423. x509->authKeyIdSrcSz = dCert->extRawAuthKeyIdSz;
  11424. /* Set authKeyId to same offset inside authKeyIdSrc */
  11425. x509->authKeyId = x509->authKeyIdSrc +
  11426. (dCert->extAuthKeyIdSrc - dCert->extRawAuthKeyIdSrc);
  11427. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  11428. }
  11429. else
  11430. ret = MEMORY_E;
  11431. }
  11432. #else
  11433. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  11434. DYNAMIC_TYPE_X509_EXT);
  11435. if (x509->authKeyId != NULL) {
  11436. XMEMCPY(x509->authKeyId,
  11437. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  11438. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  11439. }
  11440. #endif
  11441. else
  11442. ret = MEMORY_E;
  11443. }
  11444. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  11445. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  11446. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  11447. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  11448. DYNAMIC_TYPE_X509_EXT);
  11449. if (x509->subjKeyId != NULL) {
  11450. XMEMCPY(x509->subjKeyId,
  11451. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  11452. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  11453. }
  11454. else
  11455. ret = MEMORY_E;
  11456. }
  11457. x509->keyUsageSet = dCert->extKeyUsageSet;
  11458. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  11459. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  11460. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  11461. x509->heap, DYNAMIC_TYPE_X509_EXT);
  11462. if (x509->extKeyUsageSrc != NULL) {
  11463. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  11464. dCert->extExtKeyUsageSz);
  11465. x509->extKeyUsage = dCert->extExtKeyUsage;
  11466. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  11467. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  11468. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  11469. }
  11470. else {
  11471. ret = MEMORY_E;
  11472. }
  11473. }
  11474. #ifndef IGNORE_NETSCAPE_CERT_TYPE
  11475. x509->nsCertType = dCert->nsCertType;
  11476. #endif
  11477. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  11478. x509->certPolicySet = dCert->extCertPolicySet;
  11479. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  11480. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  11481. #ifdef WOLFSSL_CERT_EXT
  11482. {
  11483. int i;
  11484. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  11485. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  11486. MAX_CERTPOL_SZ);
  11487. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  11488. }
  11489. #endif /* WOLFSSL_CERT_EXT */
  11490. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  11491. #ifdef OPENSSL_ALL
  11492. if (dCert->extSubjAltNameSrc != NULL && dCert->extSubjAltNameSz != 0) {
  11493. x509->subjAltNameSrc = (byte*)XMALLOC(dCert->extSubjAltNameSz, x509->heap,
  11494. DYNAMIC_TYPE_X509_EXT);
  11495. if (x509->subjAltNameSrc != NULL) {
  11496. XMEMCPY(x509->subjAltNameSrc,
  11497. dCert->extSubjAltNameSrc, dCert->extSubjAltNameSz);
  11498. x509->subjAltNameSz = dCert->extSubjAltNameSz;
  11499. }
  11500. else
  11501. ret = MEMORY_E;
  11502. }
  11503. #endif
  11504. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  11505. x509->pkCurveOID = dCert->pkCurveOID;
  11506. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  11507. #ifdef WOLFSSL_DUAL_ALG_CERTS
  11508. /* Copy over alternative sig and pubkey. In this case we will allocate new
  11509. * buffers for them as we have no knowledge of when the DecodedCert is
  11510. * freed. */
  11511. if (dCert->extSapkiSet) {
  11512. x509->sapkiDer = (byte*)XMALLOC(dCert->sapkiLen, x509->heap,
  11513. DYNAMIC_TYPE_X509_EXT);
  11514. if (x509->sapkiDer != NULL) {
  11515. XMEMCPY(x509->sapkiDer, dCert->sapkiDer, dCert->sapkiLen);
  11516. x509->sapkiLen = dCert->sapkiLen;
  11517. }
  11518. else {
  11519. ret = MEMORY_E;
  11520. }
  11521. }
  11522. if (dCert->extAltSigAlgSet) {
  11523. x509->altSigAlgDer = (byte*)XMALLOC(dCert->altSigAlgLen, x509->heap,
  11524. DYNAMIC_TYPE_X509_EXT);
  11525. if (x509->altSigAlgDer != NULL) {
  11526. XMEMCPY(x509->altSigAlgDer, dCert->altSigAlgDer,
  11527. dCert->altSigAlgLen);
  11528. x509->altSigAlgLen = dCert->altSigAlgLen;
  11529. }
  11530. else {
  11531. ret = MEMORY_E;
  11532. }
  11533. }
  11534. if (dCert->extAltSigValSet) {
  11535. x509->altSigValDer = (byte*)XMALLOC(dCert->altSigValLen, x509->heap,
  11536. DYNAMIC_TYPE_X509_EXT);
  11537. if (x509->altSigValDer != NULL) {
  11538. XMEMCPY(x509->altSigValDer, dCert->altSigValDer,
  11539. dCert->altSigValLen);
  11540. x509->altSigValLen = dCert->altSigValLen;
  11541. }
  11542. else {
  11543. ret = MEMORY_E;
  11544. }
  11545. }
  11546. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  11547. return ret;
  11548. }
  11549. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  11550. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  11551. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  11552. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11553. word32 status_length)
  11554. {
  11555. int ret = 0;
  11556. OcspRequest* request;
  11557. #ifdef WOLFSSL_SMALL_STACK
  11558. CertStatus* status;
  11559. OcspEntry* single;
  11560. OcspResponse* response;
  11561. #else
  11562. CertStatus status[1];
  11563. OcspEntry single[1];
  11564. OcspResponse response[1];
  11565. #endif
  11566. WOLFSSL_ENTER("ProcessCSR");
  11567. do {
  11568. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  11569. if (ssl->status_request) {
  11570. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  11571. ssl->status_request = 0;
  11572. break;
  11573. }
  11574. #endif
  11575. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  11576. if (ssl->status_request_v2) {
  11577. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  11578. WOLFSSL_CSR2_OCSP, 0);
  11579. ssl->status_request_v2 = 0;
  11580. break;
  11581. }
  11582. #endif
  11583. return BUFFER_ERROR;
  11584. } while(0);
  11585. if (request == NULL)
  11586. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  11587. #ifdef WOLFSSL_SMALL_STACK
  11588. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  11589. DYNAMIC_TYPE_OCSP_STATUS);
  11590. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  11591. DYNAMIC_TYPE_OCSP_ENTRY);
  11592. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  11593. DYNAMIC_TYPE_OCSP_REQUEST);
  11594. if (status == NULL || single == NULL || response == NULL) {
  11595. if (status)
  11596. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  11597. if (single)
  11598. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  11599. if (response)
  11600. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  11601. return MEMORY_ERROR;
  11602. }
  11603. #endif
  11604. InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
  11605. if (OcspResponseDecode(response, SSL_CM(ssl), ssl->heap, 0) != 0)
  11606. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11607. else if (CompareOcspReqResp(request, response) != 0)
  11608. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11609. else if (response->responseStatus != OCSP_SUCCESSFUL)
  11610. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11611. else if (response->single->status->status == CERT_REVOKED)
  11612. ret = OCSP_CERT_REVOKED;
  11613. else if (response->single->status->status != CERT_GOOD)
  11614. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11615. else {
  11616. XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
  11617. ssl->ocspProducedDateFormat = response->producedDateFormat;
  11618. }
  11619. *inOutIdx += status_length;
  11620. FreeOcspResponse(response);
  11621. #ifdef WOLFSSL_SMALL_STACK
  11622. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  11623. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  11624. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  11625. #endif
  11626. WOLFSSL_LEAVE("ProcessCSR", ret);
  11627. return ret;
  11628. }
  11629. #endif
  11630. #ifdef HAVE_PK_CALLBACKS
  11631. #ifdef HAVE_ECC
  11632. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  11633. const unsigned char* hash, unsigned int hashSz,
  11634. const unsigned char* keyDer, unsigned int keySz,
  11635. int* result, void* ctx)
  11636. {
  11637. int ret = NOT_COMPILED_IN;
  11638. WOLFSSL* ssl = (WOLFSSL*)ctx;
  11639. if (ssl && ssl->ctx->EccVerifyCb) {
  11640. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  11641. keyDer, keySz, result, ssl->EccVerifyCtx);
  11642. }
  11643. return ret;
  11644. }
  11645. #endif
  11646. #ifndef NO_RSA
  11647. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  11648. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  11649. void* ctx)
  11650. {
  11651. int ret = NOT_COMPILED_IN;
  11652. WOLFSSL* ssl = (WOLFSSL*)ctx;
  11653. if (ssl && ssl->ctx->RsaVerifyCb) {
  11654. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  11655. ssl->RsaVerifyCtx);
  11656. }
  11657. return ret;
  11658. }
  11659. #endif
  11660. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  11661. {
  11662. if (ssl == NULL || sigCtx == NULL)
  11663. return BAD_FUNC_ARG;
  11664. /* only setup the verify callback if a PK is set */
  11665. #ifdef HAVE_ECC
  11666. #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  11667. sigCtx->pkCbEcc = Renesas_cmn_SigPkCbEccVerify;
  11668. sigCtx->pkCtxEcc = (void*)&sigCtx->CertAtt;
  11669. (void)SigPkCbEccVerify;
  11670. #else
  11671. if (ssl->ctx->EccVerifyCb) {
  11672. sigCtx->pkCbEcc = SigPkCbEccVerify;
  11673. sigCtx->pkCtxEcc = ssl;
  11674. }
  11675. #endif
  11676. #endif
  11677. #ifndef NO_RSA
  11678. /* only setup the verify callback if a PK is set */
  11679. #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  11680. sigCtx->pkCbRsa = Renesas_cmn_SigPkCbRsaVerify;
  11681. sigCtx->pkCtxRsa = (void*)&sigCtx->CertAtt;
  11682. (void)SigPkCbRsaVerify;
  11683. #else
  11684. if (ssl->ctx->RsaVerifyCb) {
  11685. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  11686. sigCtx->pkCtxRsa = ssl;
  11687. }
  11688. #endif
  11689. #endif
  11690. return 0;
  11691. }
  11692. #endif /* HAVE_PK_CALLBACKS */
  11693. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  11694. void DoCertFatalAlert(WOLFSSL* ssl, int ret)
  11695. {
  11696. int alertWhy;
  11697. if (ssl == NULL || ret == 0) {
  11698. return;
  11699. }
  11700. WOLFSSL_ERROR(ret);
  11701. /* Determine alert reason */
  11702. alertWhy = bad_certificate;
  11703. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
  11704. alertWhy = certificate_expired;
  11705. }
  11706. else if (ret == ASN_NO_SIGNER_E || ret == ASN_PATHLEN_INV_E ||
  11707. ret == ASN_PATHLEN_SIZE_E) {
  11708. alertWhy = unknown_ca;
  11709. }
  11710. #ifdef OPENSSL_EXTRA
  11711. else if (ret == CRL_CERT_REVOKED) {
  11712. alertWhy = certificate_revoked;
  11713. }
  11714. #endif
  11715. #if defined(HAVE_RPK)
  11716. else if (ret == UNSUPPORTED_CERTIFICATE) {
  11717. alertWhy = unsupported_certificate;
  11718. }
  11719. #endif /* HAVE_RPK */
  11720. else if (ret == NO_PEER_CERT) {
  11721. #ifdef WOLFSSL_TLS13
  11722. if (ssl->options.tls1_3) {
  11723. alertWhy = certificate_required;
  11724. }
  11725. else
  11726. #endif
  11727. {
  11728. alertWhy = handshake_failure;
  11729. }
  11730. }
  11731. /* send fatal alert and mark connection closed */
  11732. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  11733. ssl->options.isClosed = 1;
  11734. }
  11735. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  11736. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  11737. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  11738. * The intermediates are done first then peer leaf cert last. Use the
  11739. * store->error_depth member to determine index (0=peer, >1 intermediates)
  11740. */
  11741. int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret,
  11742. ProcPeerCertArgs* args)
  11743. {
  11744. int verify_ok = 0, use_cb = 0;
  11745. void *heap;
  11746. if (cm == NULL) {
  11747. return BAD_FUNC_ARG;
  11748. }
  11749. heap = (ssl != NULL) ? ssl->heap : cm->heap;
  11750. /* Determine if verify was okay */
  11751. if (ret == 0) {
  11752. verify_ok = 1;
  11753. }
  11754. /* Determine if verify callback should be used */
  11755. if (ret != 0) {
  11756. if ((ssl != NULL) && (!ssl->options.verifyNone)) {
  11757. use_cb = 1; /* always report errors */
  11758. }
  11759. }
  11760. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  11761. /* always use verify callback on peer leaf cert */
  11762. if (args->certIdx == 0) {
  11763. use_cb = 1;
  11764. }
  11765. #endif
  11766. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  11767. /* perform verify callback on other intermediate certs (not just peer) */
  11768. if (args->certIdx > 0) {
  11769. use_cb = 1;
  11770. }
  11771. #endif
  11772. #if defined(OPENSSL_EXTRA)
  11773. /* Perform domain and IP check only for the leaf certificate */
  11774. if (args->certIdx == 0) {
  11775. /* perform domain name check on the peer certificate */
  11776. if (args->dCertInit && args->dCert && (ssl != NULL) &&
  11777. ssl->param && ssl->param->hostName[0]) {
  11778. /* If altNames names is present, then subject common name is ignored */
  11779. if (args->dCert->altNames != NULL) {
  11780. if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
  11781. if (ret == 0) {
  11782. ret = DOMAIN_NAME_MISMATCH;
  11783. WOLFSSL_ERROR_VERBOSE(ret);
  11784. }
  11785. }
  11786. }
  11787. #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  11788. else {
  11789. if (args->dCert->subjectCN) {
  11790. if (MatchDomainName(args->dCert->subjectCN,
  11791. args->dCert->subjectCNLen,
  11792. ssl->param->hostName) == 0) {
  11793. if (ret == 0) {
  11794. ret = DOMAIN_NAME_MISMATCH;
  11795. WOLFSSL_ERROR_VERBOSE(ret);
  11796. }
  11797. }
  11798. }
  11799. }
  11800. #else
  11801. else {
  11802. if (ret == 0) {
  11803. ret = DOMAIN_NAME_MISMATCH;
  11804. WOLFSSL_ERROR_VERBOSE(ret);
  11805. }
  11806. }
  11807. #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
  11808. }
  11809. /* perform IP address check on the peer certificate */
  11810. if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
  11811. (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
  11812. if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
  11813. if (ret == 0) {
  11814. ret = IPADDR_MISMATCH;
  11815. WOLFSSL_ERROR_VERBOSE(ret);
  11816. }
  11817. }
  11818. }
  11819. }
  11820. #endif
  11821. /* if verify callback has been set */
  11822. if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
  11823. #ifdef OPENSSL_ALL
  11824. || (ssl->ctx->verifyCertCb != NULL)
  11825. #endif
  11826. ))
  11827. #ifndef NO_WOLFSSL_CM_VERIFY
  11828. || (cm->verifyCallback != NULL)
  11829. #endif
  11830. ) {
  11831. int verifyFail = 0;
  11832. #ifdef WOLFSSL_SMALL_STACK
  11833. WOLFSSL_X509_STORE_CTX* store;
  11834. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11835. WOLFSSL_X509* x509;
  11836. #endif
  11837. char* domain = NULL;
  11838. #else
  11839. WOLFSSL_X509_STORE_CTX store[1];
  11840. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11841. WOLFSSL_X509 x509[1];
  11842. #endif
  11843. char domain[ASN_NAME_MAX];
  11844. #endif
  11845. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11846. int x509Free = 0;
  11847. #endif
  11848. #ifdef WOLFSSL_SMALL_STACK
  11849. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  11850. sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE);
  11851. if (store == NULL) {
  11852. return MEMORY_E;
  11853. }
  11854. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11855. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  11856. DYNAMIC_TYPE_X509);
  11857. if (x509 == NULL) {
  11858. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11859. return MEMORY_E;
  11860. }
  11861. #endif
  11862. domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
  11863. if (domain == NULL) {
  11864. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11865. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11866. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  11867. #endif
  11868. return MEMORY_E;
  11869. }
  11870. #endif /* WOLFSSL_SMALL_STACK */
  11871. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  11872. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11873. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  11874. #endif
  11875. domain[0] = '\0';
  11876. /* build subject CN as string to return in store */
  11877. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  11878. int subjectCNLen = args->dCert->subjectCNLen;
  11879. if (subjectCNLen > ASN_NAME_MAX-1)
  11880. subjectCNLen = ASN_NAME_MAX-1;
  11881. if (subjectCNLen > 0) {
  11882. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  11883. domain[subjectCNLen] = '\0';
  11884. }
  11885. }
  11886. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  11887. store->error = ret;
  11888. #else
  11889. store->error = GetX509Error(ret);
  11890. #endif
  11891. store->error_depth = args->certIdx;
  11892. store->discardSessionCerts = 0;
  11893. store->domain = domain;
  11894. if (ssl != NULL) {
  11895. if (ssl->verifyCbCtx != NULL) {
  11896. /* Use the WOLFSSL user context if set */
  11897. store->userCtx = ssl->verifyCbCtx;
  11898. }
  11899. else {
  11900. /* Else use the WOLFSSL_CTX user context */
  11901. store->userCtx = ssl->ctx->verifyCbCtx;
  11902. }
  11903. }
  11904. else {
  11905. store->userCtx = cm;
  11906. }
  11907. store->certs = args->certs;
  11908. store->totalCerts = args->totalCerts;
  11909. #if defined(HAVE_EX_DATA) && \
  11910. (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  11911. if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
  11912. != WOLFSSL_SUCCESS) {
  11913. WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
  11914. }
  11915. #endif
  11916. if (ssl != NULL) {
  11917. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  11918. store->store = SSL_STORE(ssl);
  11919. #if defined(OPENSSL_EXTRA)
  11920. store->depth = args->count;
  11921. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  11922. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  11923. heap, DYNAMIC_TYPE_OPENSSL);
  11924. if (store->param == NULL) {
  11925. #ifdef WOLFSSL_SMALL_STACK
  11926. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  11927. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11928. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  11929. #endif
  11930. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11931. #endif
  11932. return MEMORY_E;
  11933. }
  11934. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  11935. /* Overwrite with non-default param values in SSL */
  11936. if (ssl->param) {
  11937. if (ssl->param->check_time)
  11938. store->param->check_time = ssl->param->check_time;
  11939. if (ssl->param->flags)
  11940. store->param->flags = ssl->param->flags;
  11941. if (ssl->param->hostName[0])
  11942. XMEMCPY(store->param->hostName, ssl->param->hostName,
  11943. WOLFSSL_HOST_NAME_MAX);
  11944. }
  11945. #endif /* defined(OPENSSL_EXTRA) */
  11946. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  11947. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11948. #ifdef KEEP_PEER_CERT
  11949. if (args->certIdx == 0) {
  11950. store->current_cert = &ssl->peerCert; /* use existing X509 */
  11951. }
  11952. else
  11953. #endif
  11954. {
  11955. InitX509(x509, 0, heap);
  11956. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  11957. store->current_cert = x509;
  11958. x509Free = 1;
  11959. }
  11960. else {
  11961. FreeX509(x509);
  11962. }
  11963. }
  11964. #endif
  11965. #ifdef SESSION_CERTS
  11966. store->sesChain = &ssl->session->chain;
  11967. #endif
  11968. }
  11969. #ifndef NO_WOLFSSL_CM_VERIFY
  11970. /* non-zero return code indicates failure override */
  11971. if (cm->verifyCallback != NULL) {
  11972. store->userCtx = cm;
  11973. if (cm->verifyCallback(verify_ok, store)) {
  11974. if (ret != 0) {
  11975. WOLFSSL_MSG("Verify CM callback overriding error!");
  11976. ret = 0;
  11977. }
  11978. }
  11979. else {
  11980. verifyFail = 1;
  11981. }
  11982. }
  11983. #endif
  11984. if (ssl != NULL) {
  11985. #ifdef OPENSSL_ALL
  11986. /* non-zero return code indicates failure override */
  11987. if (ssl->ctx->verifyCertCb) {
  11988. if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
  11989. if (ret != 0) {
  11990. WOLFSSL_MSG("Verify Cert callback overriding error!");
  11991. ret = 0;
  11992. }
  11993. }
  11994. else {
  11995. verifyFail = 1;
  11996. }
  11997. }
  11998. #endif
  11999. /* non-zero return code indicates failure override */
  12000. if (ssl->verifyCallback) {
  12001. if (ssl->verifyCallback(verify_ok, store)) {
  12002. if (ret != 0) {
  12003. WOLFSSL_MSG("Verify callback overriding error!");
  12004. ret = 0;
  12005. }
  12006. }
  12007. else {
  12008. verifyFail = 1;
  12009. }
  12010. }
  12011. }
  12012. if (verifyFail) {
  12013. /* induce error if one not present */
  12014. if (ret == 0) {
  12015. ret = VERIFY_CERT_ERROR;
  12016. WOLFSSL_ERROR_VERBOSE(ret);
  12017. }
  12018. /* mark as verify error */
  12019. args->verifyErr = 1;
  12020. }
  12021. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12022. if (x509Free) {
  12023. FreeX509(x509);
  12024. }
  12025. #endif
  12026. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  12027. wolfSSL_sk_X509_pop_free(store->chain, NULL);
  12028. store->chain = NULL;
  12029. #endif
  12030. #ifdef SESSION_CERTS
  12031. if ((ssl != NULL) && (store->discardSessionCerts)) {
  12032. WOLFSSL_MSG("Verify callback requested discard sess certs");
  12033. ssl->session->chain.count = 0;
  12034. #ifdef WOLFSSL_ALT_CERT_CHAINS
  12035. ssl->session->altChain.count = 0;
  12036. #endif
  12037. }
  12038. #endif /* SESSION_CERTS */
  12039. #ifdef OPENSSL_EXTRA
  12040. if ((ssl != NULL) && (store->param)) {
  12041. XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL);
  12042. }
  12043. #endif
  12044. #ifdef WOLFSSL_SMALL_STACK
  12045. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  12046. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12047. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  12048. #endif
  12049. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  12050. #endif
  12051. }
  12052. (void)heap;
  12053. return ret;
  12054. }
  12055. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  12056. {
  12057. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  12058. (void)ssl;
  12059. if (args->certs) {
  12060. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  12061. args->certs = NULL;
  12062. }
  12063. #ifdef WOLFSSL_TLS13
  12064. if (args->exts) {
  12065. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  12066. args->exts = NULL;
  12067. }
  12068. #endif
  12069. if (args->dCert) {
  12070. if (args->dCertInit) {
  12071. FreeDecodedCert(args->dCert);
  12072. args->dCertInit = 0;
  12073. }
  12074. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  12075. args->dCert = NULL;
  12076. }
  12077. }
  12078. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  12079. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  12080. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \
  12081. !defined(NO_STDIO_FILESYSTEM)
  12082. /* load certificate file which has the form <hash>.(r)N[0..N] */
  12083. /* in the folder. */
  12084. /* (r), in the case of CRL file */
  12085. /* @param store a pointer to X509_STORE structure */
  12086. /* @param issuer a pointer to X509_NAME that presents an issuer */
  12087. /* @param type X509_LU_X509 or X509_LU_CRL */
  12088. /* @return WOLFSSL_SUCCESS on successful, otherwise WOLFSSL_FAILURE */
  12089. int LoadCertByIssuer(WOLFSSL_X509_STORE* store, X509_NAME* issuer, int type)
  12090. {
  12091. const int MAX_SUFFIX = 10;/* The number comes from CA_TABLE_SIZE=10 */
  12092. int ret = WOLFSSL_SUCCESS;
  12093. WOLFSSL_X509_LOOKUP* lookup;
  12094. WOLFSSL_BY_DIR_entry* entry;
  12095. WOLFSSL_BY_DIR_HASH hash_tmp;
  12096. WOLFSSL_BY_DIR_HASH* ph = NULL;
  12097. WOLFSSL_X509* x509;
  12098. unsigned long hash = 0;
  12099. char* filename = NULL;
  12100. const char* post = "";
  12101. byte* pbuf = NULL;
  12102. int len, num, i, idx;
  12103. int suffix = 0;
  12104. int retHash = NOT_COMPILED_IN;
  12105. byte dgt[WC_MAX_DIGEST_SIZE];
  12106. WOLFSSL_ENTER("LoadCertByIssuer");
  12107. /* sanity check */
  12108. if (store == NULL || issuer == NULL || (type != X509_LU_X509 && type != X509_LU_CRL)) {
  12109. return WOLFSSL_FAILURE;
  12110. }
  12111. lookup = &store->lookup;
  12112. if (lookup->dirs == NULL || lookup->type != 1) {
  12113. return WOLFSSL_FAILURE;
  12114. }
  12115. len = wolfSSL_i2d_X509_NAME_canon(issuer, &pbuf);
  12116. if (len > 0) {
  12117. #if defined(NO_SHA) && !defined(NO_SHA256)
  12118. retHash = wc_Sha256Hash((const byte*)pbuf, len, dgt);
  12119. #elif !defined(NO_SHA)
  12120. retHash = wc_ShaHash((const byte*)pbuf, len, dgt);
  12121. #endif
  12122. if (retHash == 0) {
  12123. /* 4 bytes in little endian as unsigned long */
  12124. hash = (((unsigned long)dgt[3] << 24) |
  12125. ((unsigned long)dgt[2] << 16) |
  12126. ((unsigned long)dgt[1] << 8) |
  12127. ((unsigned long)dgt[0]));
  12128. } else {
  12129. WOLFSSL_MSG("failed hash operation");
  12130. return WOLFSSL_FAILURE;
  12131. }
  12132. wolfSSL_OPENSSL_free(pbuf);
  12133. }
  12134. /* try to load each hashed name file in path */
  12135. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  12136. if (type == X509_LU_CRL) {
  12137. post = "r";
  12138. }
  12139. num = wolfSSL_sk_BY_DIR_entry_num(lookup->dirs->dir_entry);
  12140. for (i=0; i<num; i++) {
  12141. entry = wolfSSL_sk_BY_DIR_entry_value(lookup->dirs->dir_entry, i);
  12142. if (type == X509_LU_CRL && entry->hashes != NULL &&
  12143. wolfSSL_sk_BY_DIR_HASH_num(entry->hashes) > 0) {
  12144. /* lock the list */
  12145. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  12146. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  12147. return BAD_MUTEX_E;
  12148. }
  12149. hash_tmp.hash_value = hash;
  12150. idx = wolfSSL_sk_BY_DIR_HASH_find(entry->hashes, &hash_tmp);
  12151. if (idx >= 0) {
  12152. WOLFSSL_MSG("find hashed CRL in list");
  12153. ph = wolfSSL_sk_BY_DIR_HASH_value(entry->hashes, idx);
  12154. suffix = ph->last_suffix;
  12155. } else {
  12156. ph = NULL;
  12157. suffix = 0;
  12158. }
  12159. wc_UnLockMutex(&lookup->dirs->lock);
  12160. }
  12161. /* Additional buffer length for file name memory allocation : */
  12162. /* / <hashvalue>.(r)N\0 */
  12163. /*|1| 8 |1|1|1|1| => 13 */
  12164. len = (int)XSTRLEN(entry->dir_name) + 13;
  12165. if (filename != NULL) {
  12166. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  12167. }
  12168. filename = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  12169. if (filename == NULL) {
  12170. WOLFSSL_MSG("memory allocation error");
  12171. return MEMORY_E;
  12172. }
  12173. /* set as FAILURE, if successfully loading cert of CRL, this becomes */
  12174. /* WOLFSSL_SUCCESS */
  12175. ret = WOLFSSL_FAILURE;
  12176. for (; suffix < MAX_SUFFIX; suffix++) {
  12177. /* /folder-path/<hash>.(r)N[0..9] */
  12178. if (XSNPRINTF(filename, len, "%s/%08lx.%s%d", entry->dir_name,
  12179. hash, post, suffix)
  12180. >= len)
  12181. {
  12182. WOLFSSL_MSG("buffer overrun in LoadCertByIssuer");
  12183. ret = BUFFER_E;
  12184. break;
  12185. }
  12186. if(wc_FileExists(filename) == 0/*0 file exists */) {
  12187. if (type == X509_LU_X509) {
  12188. x509 = wolfSSL_X509_load_certificate_file(filename,
  12189. WOLFSSL_FILETYPE_PEM);
  12190. if (x509 != NULL) {
  12191. ret = wolfSSL_X509_STORE_add_cert(store, x509);
  12192. wolfSSL_X509_free(x509);
  12193. } else {
  12194. WOLFSSL_MSG("failed to load certificate");
  12195. ret = WOLFSSL_FAILURE;
  12196. break;
  12197. }
  12198. }
  12199. else if (type == X509_LU_CRL) {
  12200. #if defined(HAVE_CRL)
  12201. ret = wolfSSL_X509_load_crl_file(&store->lookup, filename,
  12202. entry->dir_type);
  12203. if (ret != WOLFSSL_SUCCESS) {
  12204. WOLFSSL_MSG("failed to load CRL");
  12205. break;
  12206. }
  12207. #else
  12208. WOLFSSL_MSG("CRL is not supported");
  12209. ret = WOLFSSL_FAILURE;
  12210. break;
  12211. #endif /* HAVE_CRL */
  12212. }
  12213. } else
  12214. break;
  12215. }
  12216. if (ret != WOLFSSL_SUCCESS) {
  12217. WOLFSSL_MSG("not found file");
  12218. ret = WOLFSSL_FAILURE;
  12219. } else {
  12220. if (type == X509_LU_CRL) {
  12221. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  12222. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  12223. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  12224. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  12225. return BAD_MUTEX_E;
  12226. }
  12227. if (ph == NULL) {
  12228. ph = wolfSSL_BY_DIR_HASH_new();
  12229. if (ph == NULL) {
  12230. WOLFSSL_MSG("failed to allocate hash stack");
  12231. ret = WOLFSSL_FAILURE;
  12232. } else {
  12233. ph->hash_value = hash;
  12234. ph->last_suffix = suffix;
  12235. ret = wolfSSL_sk_BY_DIR_HASH_push(entry->hashes, ph);
  12236. }
  12237. }
  12238. wc_UnLockMutex(&lookup->dirs->lock);
  12239. }
  12240. }
  12241. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  12242. filename = NULL;
  12243. }
  12244. #else
  12245. (void) type;
  12246. (void) ret;
  12247. (void) x509;
  12248. (void) filename;
  12249. (void) suffix;
  12250. (void) num;
  12251. (void) i;
  12252. ret = WOLFSSL_NOT_IMPLEMENTED;
  12253. #endif
  12254. WOLFSSL_LEAVE("LoadCertByIssuer", ret);
  12255. return ret;
  12256. }
  12257. #endif
  12258. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  12259. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  12260. {
  12261. int ret = 0;
  12262. buffer* cert;
  12263. byte* subjectHash = NULL;
  12264. int alreadySigner = 0;
  12265. #if defined(HAVE_RPK)
  12266. int cType;
  12267. #endif
  12268. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  12269. int sigRet = 0;
  12270. #endif
  12271. if (ssl == NULL || args == NULL
  12272. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  12273. || args->dCert == NULL
  12274. #endif
  12275. ) {
  12276. return BAD_FUNC_ARG;
  12277. }
  12278. PRAGMA_GCC_DIAG_PUSH
  12279. PRAGMA_GCC("GCC diagnostic ignored \"-Wstrict-overflow\"")
  12280. /* Surrounded in gcc pragma to avoid -Werror=strict-overflow when the
  12281. * compiler optimizes out the check and assumes no underflow. Keeping the
  12282. * check in place to handle multiple build configurations and future
  12283. * changes. */
  12284. /* check to make sure certificate index is valid */
  12285. if (args->certIdx > args->count)
  12286. return BUFFER_E;
  12287. PRAGMA_GCC_DIAG_POP
  12288. /* check if returning from non-blocking OCSP */
  12289. /* skip this section because cert is already initialized and parsed */
  12290. #ifdef WOLFSSL_NONBLOCK_OCSP
  12291. if (args->lastErr == OCSP_WANT_READ) {
  12292. args->lastErr = 0; /* clear error */
  12293. return 0;
  12294. }
  12295. #endif
  12296. #ifdef WOLFSSL_TRUST_PEER_CERT
  12297. /* we have trusted peer */
  12298. if (args->haveTrustPeer) {
  12299. return 0;
  12300. }
  12301. #endif
  12302. /* get certificate buffer */
  12303. cert = &args->certs[args->certIdx];
  12304. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  12305. if (verify == VERIFY) {
  12306. /* for small cert verify, release decoded cert during signature check to
  12307. reduce peak memory usage */
  12308. if (args->dCert != NULL) {
  12309. if (args->dCertInit) {
  12310. FreeDecodedCert(args->dCert);
  12311. args->dCertInit = 0;
  12312. }
  12313. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  12314. args->dCert = NULL;
  12315. }
  12316. /* perform cert parsing and signature check */
  12317. sigRet = CheckCertSignature(cert->buffer, cert->length,
  12318. ssl->heap, SSL_CM(ssl));
  12319. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  12320. /* verify name only in ParseCertRelative below, signature check done */
  12321. verify = VERIFY_NAME;
  12322. }
  12323. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  12324. /* make sure the decoded cert structure is allocated and initialized */
  12325. if (!args->dCertInit
  12326. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  12327. || args->dCert == NULL
  12328. #endif
  12329. ) {
  12330. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  12331. if (args->dCert == NULL) {
  12332. args->dCert = (DecodedCert*)XMALLOC(
  12333. sizeof(DecodedCert), ssl->heap,
  12334. DYNAMIC_TYPE_DCERT);
  12335. if (args->dCert == NULL) {
  12336. return MEMORY_E;
  12337. }
  12338. }
  12339. #endif
  12340. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  12341. args->dCertInit = 1;
  12342. args->dCert->sigCtx.devId = ssl->devId;
  12343. #ifdef WOLFSSL_ASYNC_CRYPT
  12344. args->dCert->sigCtx.asyncCtx = ssl;
  12345. #endif
  12346. #ifdef HAVE_PK_CALLBACKS
  12347. /* setup the PK callback context */
  12348. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  12349. if (ret != 0)
  12350. return ret;
  12351. #endif
  12352. }
  12353. /* Parse Certificate */
  12354. ret = ParseCertRelative(args->dCert, certType, verify, SSL_CM(ssl));
  12355. #if defined(HAVE_RPK)
  12356. /* if cert type has negotiated with peer, confirm the cert received has
  12357. * the same type.
  12358. */
  12359. if (ret == 0 ) {
  12360. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12361. if (ssl->options.rpkState.received_ServerCertTypeCnt == 1) {
  12362. cType = ssl->options.rpkState.received_ServerCertTypes[0];
  12363. if ((cType == WOLFSSL_CERT_TYPE_RPK && !args->dCert->isRPK) ||
  12364. (cType == WOLFSSL_CERT_TYPE_X509 && args->dCert->isRPK)) {
  12365. /* cert type mismatch */
  12366. WOLFSSL_MSG("unsupported certificate type received");
  12367. ret = UNSUPPORTED_CERTIFICATE;
  12368. }
  12369. }
  12370. }
  12371. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  12372. if (ssl->options.rpkState.received_ClientCertTypeCnt == 1) {
  12373. cType = ssl->options.rpkState.sending_ClientCertTypes[0];
  12374. if ((cType == WOLFSSL_CERT_TYPE_RPK && !args->dCert->isRPK) ||
  12375. (cType == WOLFSSL_CERT_TYPE_X509 && args->dCert->isRPK)) {
  12376. /* cert type mismatch */
  12377. WOLFSSL_MSG("unsupported certificate type received");
  12378. ret = UNSUPPORTED_CERTIFICATE;
  12379. }
  12380. }
  12381. }
  12382. }
  12383. #endif /* HAVE_RPK */
  12384. /* perform below checks for date failure cases */
  12385. if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) {
  12386. /* get subject and determine if already loaded */
  12387. #ifndef NO_SKID
  12388. if (args->dCert->extAuthKeyIdSet)
  12389. subjectHash = args->dCert->extSubjKeyId;
  12390. else
  12391. #endif
  12392. subjectHash = args->dCert->subjectHash;
  12393. alreadySigner = AlreadySigner(SSL_CM(ssl), subjectHash);
  12394. }
  12395. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  12396. /* get signature check failures from above */
  12397. if (ret == 0)
  12398. ret = sigRet;
  12399. #endif
  12400. if (pSubjectHash)
  12401. *pSubjectHash = subjectHash;
  12402. if (pAlreadySigner)
  12403. *pAlreadySigner = alreadySigner;
  12404. #ifdef WOLFSSL_ASYNC_CRYPT
  12405. if (ret == WC_PENDING_E) {
  12406. ret = wolfSSL_AsyncPush(ssl,
  12407. args->dCert->sigCtx.asyncDev);
  12408. }
  12409. #endif
  12410. #if defined(WOLFSSL_PUBLIC_ASN) && defined(HAVE_PK_CALLBACKS)
  12411. /* This block gives the callback a chance to process the peer cert.
  12412. * If there is no callback set or it returns NOT_COMPILED_IN, then the
  12413. * original return code is returned. */
  12414. if (ssl->ctx && ssl->ctx->ProcessPeerCertCb) {
  12415. int new_ret = ssl->ctx->ProcessPeerCertCb(ssl, args->dCert);
  12416. if (new_ret != NOT_COMPILED_IN) {
  12417. ret = new_ret;
  12418. }
  12419. }
  12420. #endif /* WOLFSSL_PUBLIC_ASN && HAVE_PK_CALLBACKS */
  12421. return ret;
  12422. }
  12423. /* Check key sizes for certs. Is redundant check since
  12424. ProcessBuffer also performs this check. */
  12425. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  12426. {
  12427. int ret = 0;
  12428. if (ssl->options.verifyNone) {
  12429. return ret;
  12430. }
  12431. switch (args->dCert->keyOID) {
  12432. #ifndef NO_RSA
  12433. #ifdef WC_RSA_PSS
  12434. case RSAPSSk:
  12435. #endif
  12436. case RSAk:
  12437. if (ssl->options.minRsaKeySz < 0 ||
  12438. args->dCert->pubKeySize <
  12439. (word16)ssl->options.minRsaKeySz) {
  12440. WOLFSSL_MSG(
  12441. "RSA key size in cert chain error");
  12442. ret = RSA_KEY_SIZE_E;
  12443. WOLFSSL_ERROR_VERBOSE(ret);
  12444. }
  12445. break;
  12446. #endif /* !NO_RSA */
  12447. #ifdef HAVE_ECC
  12448. case ECDSAk:
  12449. if (ssl->options.minEccKeySz < 0 ||
  12450. args->dCert->pubKeySize <
  12451. (word16)ssl->options.minEccKeySz) {
  12452. WOLFSSL_MSG(
  12453. "ECC key size in cert chain error");
  12454. ret = ECC_KEY_SIZE_E;
  12455. WOLFSSL_ERROR_VERBOSE(ret);
  12456. }
  12457. break;
  12458. #endif /* HAVE_ECC */
  12459. #ifdef HAVE_ED25519
  12460. case ED25519k:
  12461. if (ssl->options.minEccKeySz < 0 ||
  12462. ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  12463. WOLFSSL_MSG(
  12464. "ECC key size in cert chain error");
  12465. ret = ECC_KEY_SIZE_E;
  12466. WOLFSSL_ERROR_VERBOSE(ret);
  12467. }
  12468. break;
  12469. #endif /* HAVE_ED25519 */
  12470. #ifdef HAVE_ED448
  12471. case ED448k:
  12472. if (ssl->options.minEccKeySz < 0 ||
  12473. ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  12474. WOLFSSL_MSG(
  12475. "ECC key size in cert chain error");
  12476. ret = ECC_KEY_SIZE_E;
  12477. WOLFSSL_ERROR_VERBOSE(ret);
  12478. }
  12479. break;
  12480. #endif /* HAVE_ED448 */
  12481. #if defined(HAVE_PQC)
  12482. #if defined(HAVE_FALCON)
  12483. case FALCON_LEVEL1k:
  12484. if (ssl->options.minFalconKeySz < 0 ||
  12485. FALCON_LEVEL1_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  12486. WOLFSSL_MSG("Falcon key size in cert chain error");
  12487. ret = FALCON_KEY_SIZE_E;
  12488. WOLFSSL_ERROR_VERBOSE(ret);
  12489. }
  12490. break;
  12491. case FALCON_LEVEL5k:
  12492. if (ssl->options.minFalconKeySz < 0 ||
  12493. FALCON_LEVEL5_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  12494. WOLFSSL_MSG("Falcon key size in cert chain error");
  12495. ret = FALCON_KEY_SIZE_E;
  12496. WOLFSSL_ERROR_VERBOSE(ret);
  12497. }
  12498. break;
  12499. #endif /* HAVE_FALCON */
  12500. #endif /* HAVE_PQC */
  12501. #if defined(HAVE_DILITHIUM)
  12502. case DILITHIUM_LEVEL2k:
  12503. if (ssl->options.minDilithiumKeySz < 0 ||
  12504. DILITHIUM_LEVEL2_KEY_SIZE
  12505. < (word16)ssl->options.minDilithiumKeySz) {
  12506. WOLFSSL_MSG("Dilithium key size in cert chain error");
  12507. ret = DILITHIUM_KEY_SIZE_E;
  12508. }
  12509. break;
  12510. case DILITHIUM_LEVEL3k:
  12511. if (ssl->options.minDilithiumKeySz < 0 ||
  12512. DILITHIUM_LEVEL3_KEY_SIZE
  12513. < (word16)ssl->options.minDilithiumKeySz) {
  12514. WOLFSSL_MSG( "Dilithium key size in cert chain error");
  12515. ret = DILITHIUM_KEY_SIZE_E;
  12516. }
  12517. break;
  12518. case DILITHIUM_LEVEL5k:
  12519. if (ssl->options.minDilithiumKeySz < 0 ||
  12520. DILITHIUM_LEVEL5_KEY_SIZE
  12521. < (word16)ssl->options.minDilithiumKeySz) {
  12522. WOLFSSL_MSG("Dilithium key size in cert chain error");
  12523. ret = DILITHIUM_KEY_SIZE_E;
  12524. }
  12525. break;
  12526. #endif /* HAVE_DILITHIUM */
  12527. default:
  12528. WOLFSSL_MSG("Key size not checked");
  12529. /* key not being checked for size if not in
  12530. switch */
  12531. break;
  12532. }
  12533. return ret;
  12534. }
  12535. #ifdef HAVE_CRL
  12536. static int ProcessPeerCertsChainCRLCheck(WOLFSSL_CERT_MANAGER* cm, Signer* ca)
  12537. {
  12538. Signer* prev = NULL;
  12539. int ret = 0;
  12540. /* End loop if no more issuers found or if we have
  12541. * found a self signed cert (ca == prev) */
  12542. for (; ret == 0 && ca != NULL && ca != prev;
  12543. prev = ca, ca = GetCAByName(cm, ca->issuerNameHash)) {
  12544. ret = CheckCertCRL_ex(cm->crl, ca->issuerNameHash, NULL, 0,
  12545. ca->serialHash, NULL, 0, NULL);
  12546. if (ret != 0)
  12547. break;
  12548. }
  12549. return ret;
  12550. }
  12551. #endif
  12552. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12553. word32 totalSz)
  12554. {
  12555. int ret = 0;
  12556. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12557. ProcPeerCertArgs* args = NULL;
  12558. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  12559. #elif defined(WOLFSSL_SMALL_STACK)
  12560. ProcPeerCertArgs* args = NULL;
  12561. #else
  12562. ProcPeerCertArgs args[1];
  12563. #endif
  12564. byte* subjectHash = NULL;
  12565. int alreadySigner = 0;
  12566. WOLFSSL_ENTER("ProcessPeerCerts");
  12567. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12568. if (ssl->async == NULL) {
  12569. ssl->async = (struct WOLFSSL_ASYNC*)
  12570. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  12571. DYNAMIC_TYPE_ASYNC);
  12572. if (ssl->async == NULL)
  12573. ERROR_OUT(MEMORY_E, exit_ppc);
  12574. }
  12575. args = (ProcPeerCertArgs*)ssl->async->args;
  12576. #ifdef WOLFSSL_ASYNC_CRYPT
  12577. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  12578. if (ret != WC_NO_PENDING_E) {
  12579. /* Check for error */
  12580. if (ret < 0)
  12581. goto exit_ppc;
  12582. }
  12583. else
  12584. #endif /* WOLFSSL_ASYNC_CRYPT */
  12585. #ifdef WOLFSSL_NONBLOCK_OCSP
  12586. if (ssl->error == OCSP_WANT_READ) {
  12587. /* Re-entry after non-blocking OCSP */
  12588. #ifdef WOLFSSL_ASYNC_CRYPT
  12589. /* if async operationg not pending, reset error code */
  12590. if (ret == WC_NO_PENDING_E)
  12591. ret = 0;
  12592. #endif
  12593. }
  12594. else
  12595. #endif /* WOLFSSL_NONBLOCK_OCSP */
  12596. #elif defined(WOLFSSL_SMALL_STACK)
  12597. args = (ProcPeerCertArgs*)XMALLOC(
  12598. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  12599. if (args == NULL) {
  12600. ERROR_OUT(MEMORY_E, exit_ppc);
  12601. }
  12602. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  12603. {
  12604. /* Reset state */
  12605. ret = 0;
  12606. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  12607. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  12608. args->idx = *inOutIdx;
  12609. args->begin = *inOutIdx;
  12610. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12611. ssl->async->freeArgs = FreeProcPeerCertArgs;
  12612. #endif
  12613. }
  12614. switch (ssl->options.asyncState)
  12615. {
  12616. case TLS_ASYNC_BEGIN:
  12617. {
  12618. word32 listSz;
  12619. #ifdef WOLFSSL_CALLBACKS
  12620. if (ssl->hsInfoOn)
  12621. AddPacketName(ssl, "Certificate");
  12622. if (ssl->toInfoOn)
  12623. AddLateName("Certificate", &ssl->timeoutInfo);
  12624. #endif
  12625. #ifdef WOLFSSL_TLS13
  12626. if (ssl->options.tls1_3) {
  12627. byte ctxSz;
  12628. /* Certificate Request Context */
  12629. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  12630. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12631. ctxSz = *(input + args->idx);
  12632. args->idx++;
  12633. if ((args->idx - args->begin) + ctxSz > totalSz)
  12634. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12635. #ifndef NO_WOLFSSL_CLIENT
  12636. /* Must be empty when received from server. */
  12637. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12638. if (ctxSz != 0) {
  12639. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  12640. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  12641. }
  12642. }
  12643. #endif
  12644. #ifndef NO_WOLFSSL_SERVER
  12645. /* Must contain value sent in request. */
  12646. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12647. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  12648. ctxSz != 0) {
  12649. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  12650. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  12651. }
  12652. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  12653. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  12654. CertReqCtx* curr = ssl->certReqCtx;
  12655. CertReqCtx* prev = NULL;
  12656. while (curr != NULL) {
  12657. if ((ctxSz == curr->len) &&
  12658. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  12659. == 0) {
  12660. if (prev != NULL)
  12661. prev->next = curr->next;
  12662. else
  12663. ssl->certReqCtx = curr->next;
  12664. XFREE(curr, ssl->heap,
  12665. DYNAMIC_TYPE_TMP_BUFFER);
  12666. break;
  12667. }
  12668. prev = curr;
  12669. curr = curr->next;
  12670. }
  12671. if (curr == NULL)
  12672. #endif
  12673. {
  12674. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  12675. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  12676. }
  12677. }
  12678. }
  12679. #endif
  12680. args->idx += ctxSz;
  12681. /* allocate buffer for cert extensions */
  12682. args->exts = (buffer*)XMALLOC(sizeof(buffer) *
  12683. MAX_CHAIN_DEPTH, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  12684. if (args->exts == NULL) {
  12685. ERROR_OUT(MEMORY_E, exit_ppc);
  12686. }
  12687. }
  12688. #endif
  12689. /* allocate buffer for certs */
  12690. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  12691. ssl->heap, DYNAMIC_TYPE_DER);
  12692. if (args->certs == NULL) {
  12693. ERROR_OUT(MEMORY_E, exit_ppc);
  12694. }
  12695. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  12696. /* Certificate List */
  12697. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  12698. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12699. }
  12700. c24to32(input + args->idx, &listSz);
  12701. #ifdef HAVE_RPK
  12702. /*
  12703. * If this is RPK from the peer, then single cert (if TLS1.2).
  12704. * So, ListSz location is same as CertSz location, so fake
  12705. * we have just seen this ListSz.
  12706. */
  12707. if (!IsAtLeastTLSv1_3(ssl->version) &&
  12708. ((ssl->options.side == WOLFSSL_SERVER_END &&
  12709. ssl->options.rpkState.received_ClientCertTypeCnt == 1 &&
  12710. ssl->options.rpkState.received_ClientCertTypes[0] == WOLFSSL_CERT_TYPE_RPK) ||
  12711. (ssl->options.side == WOLFSSL_CLIENT_END &&
  12712. ssl->options.rpkState.received_ServerCertTypeCnt == 1 &&
  12713. ssl->options.rpkState.received_ServerCertTypes[0] == WOLFSSL_CERT_TYPE_RPK))) {
  12714. listSz += OPAQUE24_LEN;
  12715. } else
  12716. #endif /* HAVE_RPK */
  12717. {
  12718. args->idx += OPAQUE24_LEN;
  12719. }
  12720. if (listSz > MAX_CERTIFICATE_SZ) {
  12721. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12722. }
  12723. if ((args->idx - args->begin) + listSz != totalSz) {
  12724. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12725. }
  12726. WOLFSSL_MSG("Loading peer's cert chain");
  12727. /* first put cert chain into buffer so can verify top down
  12728. we're sent bottom up */
  12729. while (listSz) {
  12730. word32 certSz;
  12731. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12732. if (args->totalCerts >= MAX_CHAIN_DEPTH) {
  12733. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12734. ssl->peerVerifyRet =
  12735. WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
  12736. ret = MAX_CHAIN_ERROR;
  12737. WOLFSSL_ERROR_VERBOSE(ret);
  12738. WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
  12739. break; /* break out to avoid reading more certs then buffer
  12740. * can hold */
  12741. }
  12742. #else
  12743. if (args->totalCerts >= ssl->verifyDepth ||
  12744. args->totalCerts >= MAX_CHAIN_DEPTH) {
  12745. WOLFSSL_ERROR_VERBOSE(MAX_CHAIN_ERROR);
  12746. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  12747. }
  12748. #endif
  12749. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  12750. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12751. }
  12752. c24to32(input + args->idx, &certSz);
  12753. args->idx += OPAQUE24_LEN;
  12754. if ((args->idx - args->begin) + certSz > totalSz) {
  12755. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12756. }
  12757. args->certs[args->totalCerts].length = certSz;
  12758. args->certs[args->totalCerts].buffer = input + args->idx;
  12759. #ifdef SESSION_CERTS
  12760. AddSessionCertToChain(&ssl->session->chain,
  12761. input + args->idx, certSz);
  12762. #endif /* SESSION_CERTS */
  12763. args->idx += certSz;
  12764. listSz -= certSz + CERT_HEADER_SZ;
  12765. #ifdef WOLFSSL_TLS13
  12766. /* Extensions */
  12767. if (ssl->options.tls1_3) {
  12768. word16 extSz;
  12769. if (args->exts == NULL) {
  12770. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12771. }
  12772. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  12773. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12774. }
  12775. ato16(input + args->idx, &extSz);
  12776. args->idx += OPAQUE16_LEN;
  12777. if ((args->idx - args->begin) + extSz > totalSz) {
  12778. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  12779. }
  12780. /* Store extension data info for later processing. */
  12781. args->exts[args->totalCerts].length = extSz;
  12782. args->exts[args->totalCerts].buffer = input + args->idx;
  12783. args->idx += extSz;
  12784. listSz -= extSz + OPAQUE16_LEN;
  12785. WOLFSSL_MSG_EX("\tParsing %d bytes of cert extensions",
  12786. args->exts[args->totalCerts].length);
  12787. #if !defined(NO_TLS)
  12788. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  12789. (word16)args->exts[args->totalCerts].length,
  12790. certificate, NULL);
  12791. #endif /* !NO_TLS */
  12792. if (ret < 0) {
  12793. WOLFSSL_ERROR_VERBOSE(ret);
  12794. ERROR_OUT(ret, exit_ppc);
  12795. }
  12796. }
  12797. #endif
  12798. args->totalCerts++;
  12799. WOLFSSL_MSG("\tPut another cert into chain");
  12800. } /* while (listSz) */
  12801. args->count = args->totalCerts;
  12802. args->certIdx = 0; /* select peer cert (first one) */
  12803. if (args->count == 0) {
  12804. /* Empty certificate message. */
  12805. if ((ssl->options.side == WOLFSSL_SERVER_END) &&
  12806. (ssl->options.mutualAuth || (ssl->options.failNoCert &&
  12807. IsAtLeastTLSv1_3(ssl->version)))) {
  12808. WOLFSSL_MSG("No peer cert from Client");
  12809. ret = NO_PEER_CERT;
  12810. WOLFSSL_ERROR_VERBOSE(ret);
  12811. DoCertFatalAlert(ssl, ret);
  12812. }
  12813. else if ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  12814. IsAtLeastTLSv1_3(ssl->version)) {
  12815. WOLFSSL_MSG("No peer cert from Server");
  12816. ret = NO_PEER_CERT;
  12817. WOLFSSL_ERROR_VERBOSE(ret);
  12818. SendAlert(ssl, alert_fatal, decode_error);
  12819. }
  12820. }
  12821. args->dCertInit = 0;
  12822. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  12823. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  12824. DYNAMIC_TYPE_DCERT);
  12825. if (args->dCert == NULL) {
  12826. ERROR_OUT(MEMORY_E, exit_ppc);
  12827. }
  12828. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  12829. #endif
  12830. /* Advance state and proceed */
  12831. ssl->options.asyncState = TLS_ASYNC_BUILD;
  12832. } /* case TLS_ASYNC_BEGIN */
  12833. FALL_THROUGH;
  12834. case TLS_ASYNC_BUILD:
  12835. {
  12836. if (args->count > 0) {
  12837. /* check for trusted peer and get untrustedDepth */
  12838. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  12839. if (args->certIdx == 0) {
  12840. #ifdef WOLFSSL_TRUST_PEER_CERT
  12841. TrustedPeerCert* tp;
  12842. #endif
  12843. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  12844. &subjectHash, &alreadySigner);
  12845. if (ret != 0)
  12846. goto exit_ppc;
  12847. #ifdef OPENSSL_EXTRA
  12848. /* Determine untrusted depth */
  12849. if (!alreadySigner && (!args->dCert ||
  12850. !args->dCertInit || !args->dCert->selfSigned)) {
  12851. args->untrustedDepth = 1;
  12852. }
  12853. #endif
  12854. #ifdef WOLFSSL_TRUST_PEER_CERT
  12855. tp = GetTrustedPeer(SSL_CM(ssl), args->dCert);
  12856. WOLFSSL_MSG("Checking for trusted peer cert");
  12857. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  12858. WOLFSSL_MSG("Found matching trusted peer cert");
  12859. args->haveTrustPeer = 1;
  12860. }
  12861. else if (tp == NULL) {
  12862. /* no trusted peer cert */
  12863. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  12864. }
  12865. else {
  12866. WOLFSSL_MSG("Trusted peer cert did not match!");
  12867. }
  12868. if (!args->haveTrustPeer)
  12869. #endif
  12870. {
  12871. /* free cert if not trusted peer */
  12872. FreeDecodedCert(args->dCert);
  12873. args->dCertInit = 0;
  12874. }
  12875. }
  12876. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  12877. /* check certificate up to peer's first */
  12878. /* do not verify chain if trusted peer cert found */
  12879. while (args->count > 1
  12880. #ifdef WOLFSSL_TRUST_PEER_CERT
  12881. && !args->haveTrustPeer
  12882. #endif /* WOLFSSL_TRUST_PEER_CERT */
  12883. ) {
  12884. int skipAddCA = 0;
  12885. /* select last certificate */
  12886. args->certIdx = args->count - 1;
  12887. ret = ProcessPeerCertParse(ssl, args, CHAIN_CERT_TYPE,
  12888. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  12889. &subjectHash, &alreadySigner);
  12890. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  12891. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  12892. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \
  12893. !defined(NO_STDIO_FILESYSTEM)
  12894. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  12895. WOLFSSL_MSG("try to load certificate if hash dir is set");
  12896. ret = LoadCertByIssuer(SSL_STORE(ssl),
  12897. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  12898. X509_LU_X509);
  12899. if (ret == WOLFSSL_SUCCESS) {
  12900. FreeDecodedCert(args->dCert);
  12901. args->dCertInit = 0;
  12902. /* once again */
  12903. ret = ProcessPeerCertParse(ssl, args, CHAIN_CERT_TYPE,
  12904. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  12905. &subjectHash, &alreadySigner);
  12906. }
  12907. else {
  12908. ret = ASN_NO_SIGNER_E;
  12909. WOLFSSL_ERROR_VERBOSE(ret);
  12910. }
  12911. }
  12912. #endif
  12913. #ifdef WOLFSSL_ASYNC_CRYPT
  12914. if (ret == WC_PENDING_E)
  12915. goto exit_ppc;
  12916. #endif
  12917. if (ret == 0) {
  12918. ret = ProcessPeerCertCheckKey(ssl, args);
  12919. }
  12920. else if (ret == ASN_PARSE_E || ret == BUFFER_E ||
  12921. ret == MEMORY_E) {
  12922. WOLFSSL_MSG(
  12923. "Got Peer cert ASN PARSE_E, BUFFER E, MEMORY_E");
  12924. ERROR_OUT(ret, exit_ppc);
  12925. }
  12926. if (ret == 0 && args->dCert->isCA == 0) {
  12927. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  12928. }
  12929. else if (ret == 0 && ssl->options.verifyNone) {
  12930. WOLFSSL_MSG("Chain cert not verified by option, "
  12931. "not adding as CA");
  12932. }
  12933. else if (ret == 0) {
  12934. #ifdef OPENSSL_EXTRA
  12935. if (args->certIdx > args->untrustedDepth) {
  12936. args->untrustedDepth = (char)args->certIdx + 1;
  12937. }
  12938. #endif
  12939. if (alreadySigner) {
  12940. WOLFSSL_MSG("Verified CA from chain and already had it");
  12941. }
  12942. }
  12943. else {
  12944. WOLFSSL_MSG("Failed to verify CA from chain");
  12945. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12946. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12947. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_INVALID_CA;
  12948. #endif
  12949. }
  12950. if (ret == 0) {
  12951. #ifdef HAVE_OCSP
  12952. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  12953. if (ssl->status_request_v2) {
  12954. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  12955. args->dCert, 0, ssl->heap);
  12956. }
  12957. else /* skips OCSP and force CRL check */
  12958. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  12959. if (SSL_CM(ssl)->ocspEnabled &&
  12960. SSL_CM(ssl)->ocspCheckAll) {
  12961. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  12962. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  12963. args->dCert, ssl);
  12964. #ifdef WOLFSSL_NONBLOCK_OCSP
  12965. if (ret == OCSP_WANT_READ) {
  12966. args->lastErr = ret;
  12967. goto exit_ppc;
  12968. }
  12969. #endif
  12970. if (ret != 0) {
  12971. WOLFSSL_ERROR_VERBOSE(ret);
  12972. WOLFSSL_MSG("\tOCSP Lookup not ok");
  12973. }
  12974. }
  12975. #endif /* HAVE_OCSP */
  12976. #ifdef HAVE_CRL
  12977. if (SSL_CM(ssl)->crlEnabled &&
  12978. SSL_CM(ssl)->crlCheckAll) {
  12979. int doCrlLookup = 1;
  12980. #ifdef HAVE_OCSP
  12981. if (SSL_CM(ssl)->ocspEnabled &&
  12982. SSL_CM(ssl)->ocspCheckAll) {
  12983. /* If the cert status is unknown to the OCSP
  12984. responder, do a CRL lookup. If any other
  12985. error, skip the CRL lookup and fail the
  12986. certificate. */
  12987. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  12988. }
  12989. #endif /* HAVE_OCSP */
  12990. if (doCrlLookup) {
  12991. WOLFSSL_MSG("Doing Non Leaf CRL check");
  12992. ret = CheckCertCRL(SSL_CM(ssl)->crl,
  12993. args->dCert);
  12994. #ifdef WOLFSSL_NONBLOCK_OCSP
  12995. /* The CRL lookup I/O callback is using the
  12996. * same WOULD_BLOCK error code as OCSP's I/O
  12997. * callback, and it is enabling it using the
  12998. * same flag. */
  12999. if (ret == OCSP_WANT_READ) {
  13000. args->lastErr = ret;
  13001. goto exit_ppc;
  13002. }
  13003. #endif
  13004. if (ret != 0) {
  13005. WOLFSSL_ERROR_VERBOSE(ret);
  13006. WOLFSSL_MSG("\tCRL check not ok");
  13007. }
  13008. if (ret == 0 &&
  13009. args->certIdx == args->totalCerts-1) {
  13010. ret = ProcessPeerCertsChainCRLCheck(
  13011. SSL_CM(ssl), args->dCert->ca);
  13012. if (ret != 0) {
  13013. WOLFSSL_ERROR_VERBOSE(ret);
  13014. WOLFSSL_MSG("\tCRL chain check not ok");
  13015. args->fatal = 0;
  13016. }
  13017. }
  13018. }
  13019. }
  13020. #endif /* HAVE_CRL */
  13021. }
  13022. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13023. if (ret == 0 &&
  13024. /* extend the limit "+1" until reaching
  13025. * an ultimately trusted issuer.*/
  13026. args->count > (ssl->verifyDepth + 1)) {
  13027. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  13028. ssl->peerVerifyRet =
  13029. WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
  13030. ret = MAX_CHAIN_ERROR;
  13031. WOLFSSL_ERROR_VERBOSE(ret);
  13032. }
  13033. #endif
  13034. #ifdef WOLFSSL_ALT_CERT_CHAINS
  13035. /* For alternate cert chain, its okay for a CA cert to fail
  13036. with ASN_NO_SIGNER_E here. The "alternate" certificate
  13037. chain mode only requires that the peer certificate
  13038. validate to a trusted CA */
  13039. if (ret != 0 && args->dCert->isCA) {
  13040. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  13041. if (!ssl->options.usingAltCertChain) {
  13042. WOLFSSL_MSG("Trying alternate cert chain");
  13043. ssl->options.usingAltCertChain = 1;
  13044. }
  13045. ret = 0; /* clear errors and continue */
  13046. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13047. ssl->peerVerifyRet = 0;
  13048. #endif
  13049. args->verifyErr = 0;
  13050. /* do not add to certificate manager */
  13051. skipAddCA = 1;
  13052. }
  13053. }
  13054. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  13055. #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
  13056. /* If we are using native Apple CA validation, it is okay
  13057. * for a CA cert to fail validation here, as we will verify
  13058. * the entire chain when we hit the peer (leaf) cert */
  13059. if ((ssl->ctx->doAppleNativeCertValidationFlag)
  13060. && (ret == ASN_NO_SIGNER_E)) {
  13061. WOLFSSL_MSG("Bypassing errors to allow for Apple native"
  13062. " CA validation");
  13063. ret = 0; /* clear errors and continue */
  13064. args->verifyErr = 0;
  13065. #if defined(OPENSSL_EXTRA) \
  13066. || defined(OPENSSL_EXTRA_X509_SMALL)
  13067. ssl->peerVerifyRet = 0;
  13068. #endif
  13069. /* do not add to certificate manager */
  13070. skipAddCA = 1;
  13071. }
  13072. #endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
  13073. /* Do verify callback */
  13074. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  13075. if (ssl->options.verifyNone &&
  13076. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  13077. ret == CRL_CERT_DATE_ERR)) {
  13078. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  13079. ret = ssl->error = 0;
  13080. }
  13081. #ifdef WOLFSSL_ALT_CERT_CHAINS
  13082. if (ret != 0 && args->dCert->isCA) {
  13083. /* do not add to certificate manager */
  13084. skipAddCA = 1;
  13085. }
  13086. #endif
  13087. /* If valid CA then add to Certificate Manager */
  13088. if (ret == 0 && args->dCert->isCA &&
  13089. !ssl->options.verifyNone && !skipAddCA) {
  13090. buffer* cert = &args->certs[args->certIdx];
  13091. /* Is valid CA */
  13092. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  13093. /* if using alternate chain, store the cert used */
  13094. if (ssl->options.usingAltCertChain) {
  13095. AddSessionCertToChain(&ssl->session->altChain,
  13096. cert->buffer, cert->length);
  13097. }
  13098. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  13099. if (!alreadySigner) {
  13100. DerBuffer* add = NULL;
  13101. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  13102. if (ret < 0)
  13103. goto exit_ppc;
  13104. XMEMCPY(add->buffer, cert->buffer, cert->length);
  13105. /* CA already verified above in ParseCertRelative */
  13106. WOLFSSL_MSG("Adding CA from chain");
  13107. SSL_CM_WARNING(ssl);
  13108. ret = AddCA(SSL_CM(ssl), &add, WOLFSSL_CHAIN_CA,
  13109. NO_VERIFY);
  13110. if (ret == WOLFSSL_SUCCESS) {
  13111. ret = 0;
  13112. }
  13113. }
  13114. }
  13115. /* Handle error codes */
  13116. ssl->error = ret; /* Report SSL error or clear error if
  13117. * callback overrides. */
  13118. if (ret != 0) {
  13119. if (!ssl->options.verifyNone) {
  13120. WOLFSSL_ERROR_VERBOSE(ret);
  13121. DoCertFatalAlert(ssl, ret);
  13122. args->lastErr = ret;
  13123. break; /* We sent a fatal alert.
  13124. * No point continuing. */
  13125. }
  13126. if (args->lastErr == 0) {
  13127. args->lastErr = ret; /* save error from last time */
  13128. ret = 0; /* reset error */
  13129. }
  13130. }
  13131. FreeDecodedCert(args->dCert);
  13132. args->dCertInit = 0;
  13133. args->count--;
  13134. } /* while (count > 1 && !args->haveTrustPeer) */
  13135. } /* if (count > 0) */
  13136. /* Check for error */
  13137. if (ret != 0) {
  13138. goto exit_ppc;
  13139. }
  13140. /* Advance state and proceed */
  13141. ssl->options.asyncState = TLS_ASYNC_DO;
  13142. } /* case TLS_ASYNC_BUILD */
  13143. FALL_THROUGH;
  13144. case TLS_ASYNC_DO:
  13145. {
  13146. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  13147. if (args->count > 0) {
  13148. WOLFSSL_MSG("Verifying Peer's cert");
  13149. /* select peer cert (first one) */
  13150. args->certIdx = 0;
  13151. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  13152. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  13153. &subjectHash, &alreadySigner);
  13154. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  13155. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  13156. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \
  13157. !defined(NO_STDIO_FILESYSTEM)
  13158. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  13159. int lastErr = ret; /* save error from last time */
  13160. WOLFSSL_MSG("try to load certificate if hash dir is set");
  13161. ret = LoadCertByIssuer(SSL_STORE(ssl),
  13162. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  13163. X509_LU_X509);
  13164. if (ret == WOLFSSL_SUCCESS) {
  13165. FreeDecodedCert(args->dCert);
  13166. args->dCertInit = 0;
  13167. /* once again */
  13168. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  13169. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  13170. &subjectHash, &alreadySigner);
  13171. }
  13172. else {
  13173. ret = lastErr; /* restore error */
  13174. WOLFSSL_ERROR_VERBOSE(ret);
  13175. }
  13176. }
  13177. #endif
  13178. #ifdef WOLFSSL_ASYNC_CRYPT
  13179. if (ret == WC_PENDING_E)
  13180. goto exit_ppc;
  13181. #endif
  13182. if (ret == 0) {
  13183. WOLFSSL_MSG("Verified Peer's cert");
  13184. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13185. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  13186. ssl->peerVerifyRet = WOLFSSL_X509_V_OK;
  13187. #endif
  13188. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  13189. /* if using alternate chain, store the cert used */
  13190. if (ssl->options.usingAltCertChain) {
  13191. buffer* cert = &args->certs[args->certIdx];
  13192. AddSessionCertToChain(&ssl->session->altChain,
  13193. cert->buffer, cert->length);
  13194. }
  13195. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  13196. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  13197. /* Check peer's certificate version number. TLS 1.2 / 1.3
  13198. * requires the clients certificate be version 3 unless a
  13199. * different version has been negotiated using RFC 7250.
  13200. * OpenSSL doesn't appear to be performing this check.
  13201. * For TLS 1.3 see RFC8446 Section 4.4.2.3 */
  13202. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13203. #if defined(HAVE_RPK)
  13204. if (args->dCert->isRPK) {
  13205. /* to verify Raw Public Key cert, DANE(RFC6698)
  13206. * should be introduced. Without DANE, no
  13207. * authentication is performed.
  13208. */
  13209. #if defined(HAVE_DANE)
  13210. if (ssl->useDANE) {
  13211. /* DANE authentication should be added */
  13212. }
  13213. #endif /* HAVE_DANE */
  13214. }
  13215. else /* skip followingx509 version check */
  13216. #endif /* HAVE_RPK */
  13217. if (args->dCert->version != WOLFSSL_X509_V3) {
  13218. WOLFSSL_MSG("Peers certificate was not version 3!");
  13219. args->lastErr = ASN_VERSION_E;
  13220. /* setting last error but not considering it fatal
  13221. * giving the user a chance to override */
  13222. }
  13223. }
  13224. #endif
  13225. /* check if fatal error */
  13226. if (args->verifyErr) {
  13227. args->fatal = 1;
  13228. ret = args->lastErr;
  13229. }
  13230. else {
  13231. args->fatal = 0;
  13232. }
  13233. }
  13234. else if (ret == ASN_PARSE_E || ret == BUFFER_E ||
  13235. ret == MEMORY_E || ret == BAD_FUNC_ARG) {
  13236. WOLFSSL_MSG("Got Peer cert ASN_PARSE_E, BUFFER_E, MEMORY_E,"
  13237. " BAD_FUNC_ARG");
  13238. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
  13239. defined(OPENSSL_EXTRA_X509_SMALL)
  13240. DoCertFatalAlert(ssl, ret);
  13241. #endif
  13242. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13243. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  13244. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_REJECTED;
  13245. #endif
  13246. args->fatal = 1;
  13247. }
  13248. else {
  13249. WOLFSSL_MSG("Failed to verify Peer's cert");
  13250. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13251. if (ssl->peerVerifyRet == 0) { /* Return first cert error here */
  13252. if (ret == ASN_BEFORE_DATE_E) {
  13253. ssl->peerVerifyRet =
  13254. (unsigned long)WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID;
  13255. }
  13256. else if (ret == ASN_AFTER_DATE_E) {
  13257. ssl->peerVerifyRet =
  13258. (unsigned long)WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED;
  13259. }
  13260. else {
  13261. ssl->peerVerifyRet =
  13262. (unsigned long)
  13263. WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  13264. }
  13265. }
  13266. #endif
  13267. if (ssl->verifyCallback) {
  13268. WOLFSSL_MSG(
  13269. "\tCallback override available, will continue");
  13270. /* check if fatal error */
  13271. args->fatal = (args->verifyErr) ? 1 : 0;
  13272. if (args->fatal)
  13273. DoCertFatalAlert(ssl, ret);
  13274. }
  13275. #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
  13276. /* Disregard failure to verify peer cert, as we will verify
  13277. * the whole chain with the native API later */
  13278. else if (ssl->ctx->doAppleNativeCertValidationFlag) {
  13279. WOLFSSL_MSG("\tApple native CA validation override"
  13280. " available, will continue");
  13281. /* check if fatal error */
  13282. args->fatal = (args->verifyErr) ? 1 : 0;
  13283. if (args->fatal)
  13284. DoCertFatalAlert(ssl, ret);
  13285. }
  13286. #endif/*defined(__APPLE__)&& defined(WOLFSSL_SYS_CA_CERTS)*/
  13287. else {
  13288. WOLFSSL_MSG("\tNo callback override available, fatal");
  13289. args->fatal = 1;
  13290. DoCertFatalAlert(ssl, ret);
  13291. }
  13292. }
  13293. #ifdef HAVE_SECURE_RENEGOTIATION
  13294. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  13295. && ssl->secure_renegotiation
  13296. && ssl->secure_renegotiation->enabled) {
  13297. if (IsEncryptionOn(ssl, 0)) {
  13298. /* compare against previous time */
  13299. if (ssl->secure_renegotiation->subject_hash_set) {
  13300. if (XMEMCMP(args->dCert->subjectHash,
  13301. ssl->secure_renegotiation->subject_hash,
  13302. KEYID_SIZE) != 0) {
  13303. WOLFSSL_MSG(
  13304. "Peer sent different cert during scr, fatal");
  13305. args->fatal = 1;
  13306. ret = SCR_DIFFERENT_CERT_E;
  13307. WOLFSSL_ERROR_VERBOSE(ret);
  13308. }
  13309. }
  13310. }
  13311. /* cache peer's hash */
  13312. if (args->fatal == 0) {
  13313. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  13314. args->dCert->subjectHash, KEYID_SIZE);
  13315. ssl->secure_renegotiation->subject_hash_set = 1;
  13316. }
  13317. }
  13318. #endif /* HAVE_SECURE_RENEGOTIATION */
  13319. } /* if (count > 0) */
  13320. /* Check for error */
  13321. if (args->fatal && ret != 0) {
  13322. goto exit_ppc;
  13323. }
  13324. /* Advance state and proceed */
  13325. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  13326. } /* case TLS_ASYNC_DO */
  13327. FALL_THROUGH;
  13328. case TLS_ASYNC_VERIFY:
  13329. {
  13330. if (args->count > 0) {
  13331. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  13332. /* only attempt to check OCSP or CRL if not previous error such
  13333. * as ASN_BEFORE_DATE_E or ASN_AFTER_DATE_E */
  13334. if (args->fatal == 0 && ret == 0) {
  13335. int doLookup = 1;
  13336. WOLFSSL_MSG("Checking if ocsp needed");
  13337. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13338. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  13339. if (ssl->status_request) {
  13340. args->fatal = (TLSX_CSR_InitRequest(ssl->extensions,
  13341. args->dCert, ssl->heap) != 0);
  13342. doLookup = 0;
  13343. WOLFSSL_MSG("\tHave status request");
  13344. #if defined(WOLFSSL_TLS13)
  13345. if (ssl->options.tls1_3) {
  13346. TLSX* ext = TLSX_Find(ssl->extensions,
  13347. TLSX_STATUS_REQUEST);
  13348. if (ext != NULL) {
  13349. word32 idx = 0;
  13350. CertificateStatusRequest* csr =
  13351. (CertificateStatusRequest*)ext->data;
  13352. ret = ProcessCSR(ssl, csr->response.buffer,
  13353. &idx, csr->response.length);
  13354. if (ret < 0) {
  13355. WOLFSSL_ERROR_VERBOSE(ret);
  13356. goto exit_ppc;
  13357. }
  13358. }
  13359. }
  13360. #endif
  13361. }
  13362. /* Ensure a stapling response was seen */
  13363. else if (ssl->options.tls1_3 &&
  13364. SSL_CM(ssl)->ocspMustStaple) {
  13365. ret = OCSP_CERT_UNKNOWN;
  13366. goto exit_ppc;
  13367. }
  13368. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  13369. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13370. if (ssl->status_request_v2) {
  13371. args->fatal = (TLSX_CSR2_InitRequests(ssl->extensions,
  13372. args->dCert, 1, ssl->heap) != 0);
  13373. doLookup = 0;
  13374. WOLFSSL_MSG("\tHave status request v2");
  13375. }
  13376. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  13377. }
  13378. #ifdef HAVE_OCSP
  13379. if (doLookup && SSL_CM(ssl)->ocspEnabled) {
  13380. WOLFSSL_MSG("Doing Leaf OCSP check");
  13381. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  13382. args->dCert, ssl);
  13383. #ifdef WOLFSSL_NONBLOCK_OCSP
  13384. if (ret == OCSP_WANT_READ) {
  13385. goto exit_ppc;
  13386. }
  13387. #endif
  13388. doLookup = (ret == OCSP_CERT_UNKNOWN);
  13389. if (ret != 0) {
  13390. WOLFSSL_MSG("\tOCSP Lookup not ok");
  13391. args->fatal = 0;
  13392. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13393. if (ssl->peerVerifyRet == 0) {
  13394. /* Return first cert error here */
  13395. ssl->peerVerifyRet =
  13396. ret == OCSP_CERT_REVOKED
  13397. ? WOLFSSL_X509_V_ERR_CERT_REVOKED
  13398. : WOLFSSL_X509_V_ERR_CERT_REJECTED;
  13399. }
  13400. #endif
  13401. }
  13402. }
  13403. #endif /* HAVE_OCSP */
  13404. #ifdef HAVE_CRL
  13405. if (ret == 0 && doLookup && SSL_CM(ssl)->crlEnabled) {
  13406. WOLFSSL_MSG("Doing Leaf CRL check");
  13407. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  13408. #ifdef WOLFSSL_NONBLOCK_OCSP
  13409. /* The CRL lookup I/O callback is using the
  13410. * same WOULD_BLOCK error code as OCSP's I/O
  13411. * callback, and it is enabling it using the
  13412. * same flag. */
  13413. if (ret == OCSP_WANT_READ) {
  13414. goto exit_ppc;
  13415. }
  13416. #endif
  13417. if (ret != 0) {
  13418. WOLFSSL_MSG("\tCRL check not ok");
  13419. args->fatal = 0;
  13420. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13421. if (ssl->peerVerifyRet == 0) {
  13422. /* Return first cert error here */
  13423. ssl->peerVerifyRet =
  13424. ret == CRL_CERT_REVOKED
  13425. ? WOLFSSL_X509_V_ERR_CERT_REVOKED
  13426. : WOLFSSL_X509_V_ERR_CERT_REJECTED;
  13427. }
  13428. #endif
  13429. }
  13430. }
  13431. if (ret == 0 && doLookup && SSL_CM(ssl)->crlEnabled &&
  13432. SSL_CM(ssl)->crlCheckAll && args->totalCerts == 1) {
  13433. /* Check the entire cert chain */
  13434. if (args->dCert->ca != NULL) {
  13435. ret = ProcessPeerCertsChainCRLCheck(SSL_CM(ssl),
  13436. args->dCert->ca);
  13437. if (ret != 0) {
  13438. WOLFSSL_ERROR_VERBOSE(ret);
  13439. WOLFSSL_MSG("\tCRL chain check not ok");
  13440. args->fatal = 0;
  13441. }
  13442. }
  13443. else {
  13444. WOLFSSL_MSG("No CA signer set");
  13445. }
  13446. }
  13447. #endif /* HAVE_CRL */
  13448. (void)doLookup;
  13449. }
  13450. #endif /* HAVE_OCSP || HAVE_CRL */
  13451. #ifdef KEEP_PEER_CERT
  13452. if (args->fatal == 0) {
  13453. int copyRet = 0;
  13454. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  13455. if (ssl->options.handShakeDone) {
  13456. FreeX509(&ssl->peerCert);
  13457. InitX509(&ssl->peerCert, 0, ssl->heap);
  13458. }
  13459. else
  13460. #endif
  13461. #ifdef HAVE_SECURE_RENEGOTIATION
  13462. if (ssl->secure_renegotiation &&
  13463. ssl->secure_renegotiation->enabled) {
  13464. /* free old peer cert */
  13465. FreeX509(&ssl->peerCert);
  13466. InitX509(&ssl->peerCert, 0, ssl->heap);
  13467. }
  13468. else
  13469. #endif
  13470. {
  13471. }
  13472. /* set X509 format for peer cert */
  13473. copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
  13474. if (copyRet == MEMORY_E) {
  13475. args->fatal = 1;
  13476. }
  13477. }
  13478. #endif /* KEEP_PEER_CERT */
  13479. #ifndef IGNORE_KEY_EXTENSIONS
  13480. #if defined(OPENSSL_EXTRA)
  13481. /* when compatibility layer is turned on and no verify is
  13482. * set then ignore the certificate key extension */
  13483. if (args->dCert->extKeyUsageSet &&
  13484. args->dCert->extKeyUsageCrit == 0 &&
  13485. ssl->options.verifyNone) {
  13486. WOLFSSL_MSG("Not verifying certificate key usage");
  13487. }
  13488. else
  13489. #endif
  13490. if (args->dCert->extKeyUsageSet) {
  13491. if ((ssl->specs.kea == rsa_kea) &&
  13492. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  13493. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  13494. ret = KEYUSE_ENCIPHER_E;
  13495. WOLFSSL_ERROR_VERBOSE(ret);
  13496. }
  13497. if ((ssl->specs.kea != rsa_kea) &&
  13498. (ssl->specs.sig_algo == rsa_sa_algo ||
  13499. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  13500. !ssl->specs.static_ecdh)) &&
  13501. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  13502. WOLFSSL_MSG("KeyUse Digital Sig not set");
  13503. ret = KEYUSE_SIGNATURE_E;
  13504. WOLFSSL_ERROR_VERBOSE(ret);
  13505. }
  13506. }
  13507. #if defined(OPENSSL_EXTRA)
  13508. /* when compatibility layer is turned on and no verify is
  13509. * set then ignore the certificate key extension */
  13510. if (args->dCert->extExtKeyUsageSet &&
  13511. args->dCert->extExtKeyUsageCrit == 0 &&
  13512. ssl->options.verifyNone) {
  13513. WOLFSSL_MSG("Not verifying certificate ext key usage");
  13514. }
  13515. else
  13516. #endif
  13517. if (args->dCert->extExtKeyUsageSet) {
  13518. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13519. if ((args->dCert->extExtKeyUsage &
  13520. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  13521. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  13522. ret = EXTKEYUSE_AUTH_E;
  13523. WOLFSSL_ERROR_VERBOSE(ret);
  13524. }
  13525. }
  13526. else {
  13527. if ((args->dCert->extExtKeyUsage &
  13528. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  13529. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  13530. ret = EXTKEYUSE_AUTH_E;
  13531. WOLFSSL_ERROR_VERBOSE(ret);
  13532. }
  13533. }
  13534. }
  13535. #endif /* IGNORE_KEY_EXTENSIONS */
  13536. if (args->fatal) {
  13537. ssl->error = ret;
  13538. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13539. SendAlert(ssl, alert_fatal, bad_certificate);
  13540. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  13541. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_REJECTED;
  13542. #endif
  13543. goto exit_ppc;
  13544. }
  13545. /* Certificate validated and stored. */
  13546. ssl->options.havePeerCert = 1;
  13547. #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_RSA)
  13548. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  13549. ssl->specs.sig_algo == rsa_kea) {
  13550. /* CLIENT: No ServerKeyExchange message sent by server. */
  13551. ssl->options.peerAuthGood = 1;
  13552. }
  13553. #endif
  13554. #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_ECC)
  13555. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  13556. ssl->specs.static_ecdh) {
  13557. /* CLIENT: No ServerKeyExchange message sent by server. */
  13558. ssl->options.peerAuthGood = 1;
  13559. }
  13560. #endif
  13561. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  13562. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  13563. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  13564. * are to be bound into a certificate, the subject
  13565. * alternative name extension MUST be used." */
  13566. if (args->dCert->altNames) {
  13567. if (CheckForAltNames(args->dCert,
  13568. (char*)ssl->buffers.domainName.buffer,
  13569. NULL) != 1) {
  13570. WOLFSSL_MSG("DomainName match on alt names failed");
  13571. /* try to get peer key still */
  13572. ret = DOMAIN_NAME_MISMATCH;
  13573. WOLFSSL_ERROR_VERBOSE(ret);
  13574. }
  13575. }
  13576. else {
  13577. if (MatchDomainName(
  13578. args->dCert->subjectCN,
  13579. args->dCert->subjectCNLen,
  13580. (char*)ssl->buffers.domainName.buffer) == 0) {
  13581. WOLFSSL_MSG("DomainName match on common name failed");
  13582. ret = DOMAIN_NAME_MISMATCH;
  13583. WOLFSSL_ERROR_VERBOSE(ret);
  13584. }
  13585. }
  13586. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  13587. /* Old behavior. */
  13588. if (MatchDomainName(args->dCert->subjectCN,
  13589. args->dCert->subjectCNLen,
  13590. (char*)ssl->buffers.domainName.buffer) == 0) {
  13591. WOLFSSL_MSG("DomainName match on common name failed");
  13592. if (CheckForAltNames(args->dCert,
  13593. (char*)ssl->buffers.domainName.buffer,
  13594. NULL) != 1) {
  13595. WOLFSSL_MSG(
  13596. "DomainName match on alt names failed too");
  13597. /* try to get peer key still */
  13598. ret = DOMAIN_NAME_MISMATCH;
  13599. WOLFSSL_ERROR_VERBOSE(ret);
  13600. }
  13601. }
  13602. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  13603. }
  13604. /* decode peer key */
  13605. switch (args->dCert->keyOID) {
  13606. #ifndef NO_RSA
  13607. #ifdef WC_RSA_PSS
  13608. case RSAPSSk:
  13609. #endif
  13610. case RSAk:
  13611. {
  13612. word32 keyIdx = 0;
  13613. int keyRet = 0;
  13614. if (ssl->peerRsaKey == NULL) {
  13615. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  13616. (void**)&ssl->peerRsaKey);
  13617. } else if (ssl->peerRsaKeyPresent) {
  13618. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  13619. ssl->peerRsaKey);
  13620. ssl->peerRsaKeyPresent = 0;
  13621. }
  13622. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  13623. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  13624. args->dCert->pubKeySize) != 0) {
  13625. ret = PEER_KEY_ERROR;
  13626. WOLFSSL_ERROR_VERBOSE(ret);
  13627. }
  13628. else {
  13629. ssl->peerRsaKeyPresent = 1;
  13630. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || \
  13631. defined(WOLFSSL_RENESAS_FSPSM_TLS)
  13632. /* copy encrypted tsip key index into ssl object */
  13633. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  13634. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  13635. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  13636. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  13637. ssl->heap, DYNAMIC_TYPE_RSA);
  13638. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  13639. args->lastErr = MEMORY_E;
  13640. goto exit_ppc;
  13641. }
  13642. }
  13643. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  13644. args->dCert->sce_tsip_encRsaKeyIdx,
  13645. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  13646. }
  13647. #endif
  13648. #ifdef HAVE_PK_CALLBACKS
  13649. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  13650. defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  13651. if (ssl->buffers.peerRsaKey.buffer) {
  13652. XFREE(ssl->buffers.peerRsaKey.buffer,
  13653. ssl->heap, DYNAMIC_TYPE_RSA);
  13654. ssl->buffers.peerRsaKey.buffer = NULL;
  13655. }
  13656. #endif
  13657. ssl->buffers.peerRsaKey.buffer =
  13658. (byte*)XMALLOC(args->dCert->pubKeySize,
  13659. ssl->heap, DYNAMIC_TYPE_RSA);
  13660. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  13661. ret = MEMORY_ERROR;
  13662. }
  13663. else {
  13664. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  13665. args->dCert->publicKey,
  13666. args->dCert->pubKeySize);
  13667. ssl->buffers.peerRsaKey.length =
  13668. args->dCert->pubKeySize;
  13669. }
  13670. #endif /* HAVE_PK_CALLBACKS */
  13671. }
  13672. /* check size of peer RSA key */
  13673. if (ret == 0 && ssl->peerRsaKeyPresent &&
  13674. !ssl->options.verifyNone &&
  13675. wc_RsaEncryptSize(ssl->peerRsaKey)
  13676. < ssl->options.minRsaKeySz) {
  13677. ret = RSA_KEY_SIZE_E;
  13678. WOLFSSL_ERROR_VERBOSE(ret);
  13679. WOLFSSL_MSG("Peer RSA key is too small");
  13680. }
  13681. break;
  13682. }
  13683. #endif /* NO_RSA */
  13684. #ifdef HAVE_ECC
  13685. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  13686. case SM2k:
  13687. #endif
  13688. case ECDSAk:
  13689. {
  13690. int keyRet = 0;
  13691. word32 idx = 0;
  13692. #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || \
  13693. defined(WOLFSSL_RENESAS_TSIP_TLS)
  13694. /* copy encrypted tsip/sce key index into ssl object */
  13695. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  13696. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  13697. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  13698. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  13699. ssl->heap, DYNAMIC_TYPE_RSA);
  13700. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  13701. args->lastErr = MEMORY_E;
  13702. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  13703. }
  13704. }
  13705. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  13706. args->dCert->sce_tsip_encRsaKeyIdx,
  13707. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  13708. }
  13709. #endif
  13710. if (ssl->peerEccDsaKey == NULL) {
  13711. /* alloc/init on demand */
  13712. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  13713. (void**)&ssl->peerEccDsaKey);
  13714. } else if (ssl->peerEccDsaKeyPresent) {
  13715. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  13716. ssl->peerEccDsaKey);
  13717. ssl->peerEccDsaKeyPresent = 0;
  13718. }
  13719. if (keyRet != 0 ||
  13720. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  13721. ssl->peerEccDsaKey,
  13722. args->dCert->pubKeySize) != 0) {
  13723. ret = PEER_KEY_ERROR;
  13724. WOLFSSL_ERROR_VERBOSE(ret);
  13725. }
  13726. else {
  13727. ssl->peerEccDsaKeyPresent = 1;
  13728. #ifdef HAVE_PK_CALLBACKS
  13729. if (ssl->buffers.peerEccDsaKey.buffer)
  13730. XFREE(ssl->buffers.peerEccDsaKey.buffer,
  13731. ssl->heap, DYNAMIC_TYPE_ECC);
  13732. ssl->buffers.peerEccDsaKey.buffer =
  13733. (byte*)XMALLOC(args->dCert->pubKeySize,
  13734. ssl->heap, DYNAMIC_TYPE_ECC);
  13735. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  13736. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  13737. }
  13738. else {
  13739. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  13740. args->dCert->publicKey,
  13741. args->dCert->pubKeySize);
  13742. ssl->buffers.peerEccDsaKey.length =
  13743. args->dCert->pubKeySize;
  13744. }
  13745. #endif /* HAVE_PK_CALLBACKS */
  13746. }
  13747. /* check size of peer ECC key */
  13748. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  13749. !ssl->options.verifyNone &&
  13750. wc_ecc_size(ssl->peerEccDsaKey)
  13751. < ssl->options.minEccKeySz) {
  13752. ret = ECC_KEY_SIZE_E;
  13753. WOLFSSL_ERROR_VERBOSE(ret);
  13754. WOLFSSL_MSG("Peer ECC key is too small");
  13755. }
  13756. /* populate curve oid - if missing */
  13757. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  13758. ssl->ecdhCurveOID = args->dCert->pkCurveOID;
  13759. break;
  13760. }
  13761. #endif /* HAVE_ECC */
  13762. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  13763. case ED25519k:
  13764. {
  13765. int keyRet = 0;
  13766. if (ssl->peerEd25519Key == NULL) {
  13767. /* alloc/init on demand */
  13768. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  13769. (void**)&ssl->peerEd25519Key);
  13770. } else if (ssl->peerEd25519KeyPresent) {
  13771. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  13772. ssl->peerEd25519Key);
  13773. ssl->peerEd25519KeyPresent = 0;
  13774. }
  13775. if (keyRet != 0 ||
  13776. wc_ed25519_import_public(args->dCert->publicKey,
  13777. args->dCert->pubKeySize,
  13778. ssl->peerEd25519Key)
  13779. != 0) {
  13780. ret = PEER_KEY_ERROR;
  13781. WOLFSSL_ERROR_VERBOSE(ret);
  13782. }
  13783. else {
  13784. ssl->peerEd25519KeyPresent = 1;
  13785. #ifdef HAVE_PK_CALLBACKS
  13786. ssl->buffers.peerEd25519Key.buffer =
  13787. (byte*)XMALLOC(args->dCert->pubKeySize,
  13788. ssl->heap, DYNAMIC_TYPE_ED25519);
  13789. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  13790. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  13791. }
  13792. else {
  13793. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  13794. args->dCert->publicKey,
  13795. args->dCert->pubKeySize);
  13796. ssl->buffers.peerEd25519Key.length =
  13797. args->dCert->pubKeySize;
  13798. }
  13799. #endif /*HAVE_PK_CALLBACKS */
  13800. }
  13801. /* check size of peer ECC key */
  13802. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  13803. !ssl->options.verifyNone &&
  13804. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  13805. ret = ECC_KEY_SIZE_E;
  13806. WOLFSSL_ERROR_VERBOSE(ret);
  13807. WOLFSSL_MSG("Peer ECC key is too small");
  13808. }
  13809. /* populate curve oid - if missing */
  13810. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  13811. ssl->ecdhCurveOID = ECC_X25519_OID;
  13812. break;
  13813. }
  13814. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  13815. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  13816. case ED448k:
  13817. {
  13818. int keyRet = 0;
  13819. if (ssl->peerEd448Key == NULL) {
  13820. /* alloc/init on demand */
  13821. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
  13822. (void**)&ssl->peerEd448Key);
  13823. } else if (ssl->peerEd448KeyPresent) {
  13824. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
  13825. ssl->peerEd448Key);
  13826. ssl->peerEd448KeyPresent = 0;
  13827. }
  13828. if (keyRet != 0 ||
  13829. wc_ed448_import_public(args->dCert->publicKey,
  13830. args->dCert->pubKeySize,
  13831. ssl->peerEd448Key) != 0) {
  13832. ret = PEER_KEY_ERROR;
  13833. WOLFSSL_ERROR_VERBOSE(ret);
  13834. }
  13835. else {
  13836. ssl->peerEd448KeyPresent = 1;
  13837. #ifdef HAVE_PK_CALLBACKS
  13838. ssl->buffers.peerEd448Key.buffer =
  13839. (byte*)XMALLOC(args->dCert->pubKeySize,
  13840. ssl->heap, DYNAMIC_TYPE_ED448);
  13841. if (ssl->buffers.peerEd448Key.buffer == NULL) {
  13842. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  13843. }
  13844. else {
  13845. XMEMCPY(ssl->buffers.peerEd448Key.buffer,
  13846. args->dCert->publicKey,
  13847. args->dCert->pubKeySize);
  13848. ssl->buffers.peerEd448Key.length =
  13849. args->dCert->pubKeySize;
  13850. }
  13851. #endif /*HAVE_PK_CALLBACKS */
  13852. }
  13853. /* check size of peer ECC key */
  13854. if (ret == 0 && ssl->peerEd448KeyPresent &&
  13855. !ssl->options.verifyNone &&
  13856. ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  13857. ret = ECC_KEY_SIZE_E;
  13858. WOLFSSL_ERROR_VERBOSE(ret);
  13859. WOLFSSL_MSG("Peer ECC key is too small");
  13860. }
  13861. /* populate curve oid - if missing */
  13862. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  13863. ssl->ecdhCurveOID = ECC_X448_OID;
  13864. break;
  13865. }
  13866. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  13867. #if defined(HAVE_PQC)
  13868. #if defined(HAVE_FALCON)
  13869. case FALCON_LEVEL1k:
  13870. case FALCON_LEVEL5k:
  13871. {
  13872. int keyRet = 0;
  13873. if (ssl->peerFalconKey == NULL) {
  13874. /* alloc/init on demand */
  13875. keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON,
  13876. (void**)&ssl->peerFalconKey);
  13877. } else if (ssl->peerFalconKeyPresent) {
  13878. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_FALCON,
  13879. ssl->peerFalconKey);
  13880. ssl->peerFalconKeyPresent = 0;
  13881. }
  13882. if (keyRet == 0) {
  13883. if (args->dCert->keyOID == FALCON_LEVEL1k) {
  13884. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  13885. 1);
  13886. }
  13887. else {
  13888. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  13889. 5);
  13890. }
  13891. }
  13892. if (keyRet != 0 ||
  13893. wc_falcon_import_public(args->dCert->publicKey,
  13894. args->dCert->pubKeySize,
  13895. ssl->peerFalconKey) != 0) {
  13896. ret = PEER_KEY_ERROR;
  13897. WOLFSSL_ERROR_VERBOSE(ret);
  13898. }
  13899. else {
  13900. ssl->peerFalconKeyPresent = 1;
  13901. }
  13902. /* check size of peer Falcon key */
  13903. if (ret == 0 && ssl->peerFalconKeyPresent &&
  13904. !ssl->options.verifyNone &&
  13905. FALCON_MAX_KEY_SIZE <
  13906. ssl->options.minFalconKeySz) {
  13907. ret = FALCON_KEY_SIZE_E;
  13908. WOLFSSL_ERROR_VERBOSE(ret);
  13909. WOLFSSL_MSG("Peer Falcon key is too small");
  13910. }
  13911. break;
  13912. }
  13913. #endif /* HAVE_FALCON */
  13914. #if defined(HAVE_DILITHIUM)
  13915. case DILITHIUM_LEVEL2k:
  13916. case DILITHIUM_LEVEL3k:
  13917. case DILITHIUM_LEVEL5k:
  13918. {
  13919. int keyRet = 0;
  13920. if (ssl->peerDilithiumKey == NULL) {
  13921. /* alloc/init on demand */
  13922. keyRet = AllocKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  13923. (void**)&ssl->peerDilithiumKey);
  13924. } else if (ssl->peerDilithiumKeyPresent) {
  13925. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  13926. ssl->peerDilithiumKey);
  13927. ssl->peerDilithiumKeyPresent = 0;
  13928. }
  13929. if (keyRet == 0) {
  13930. if (args->dCert->keyOID == DILITHIUM_LEVEL2k) {
  13931. keyRet = wc_dilithium_set_level(
  13932. ssl->peerDilithiumKey, 2);
  13933. }
  13934. else if (args->dCert->keyOID == DILITHIUM_LEVEL3k) {
  13935. keyRet = wc_dilithium_set_level(
  13936. ssl->peerDilithiumKey, 3);
  13937. }
  13938. else if (args->dCert->keyOID == DILITHIUM_LEVEL5k) {
  13939. keyRet = wc_dilithium_set_level(
  13940. ssl->peerDilithiumKey, 5);
  13941. }
  13942. }
  13943. if (keyRet != 0 ||
  13944. wc_dilithium_import_public(args->dCert->publicKey,
  13945. args->dCert->pubKeySize,
  13946. ssl->peerDilithiumKey)
  13947. != 0) {
  13948. ret = PEER_KEY_ERROR;
  13949. }
  13950. else {
  13951. ssl->peerDilithiumKeyPresent = 1;
  13952. }
  13953. /* check size of peer Dilithium key */
  13954. if (ret == 0 && ssl->peerDilithiumKeyPresent &&
  13955. !ssl->options.verifyNone &&
  13956. DILITHIUM_MAX_KEY_SIZE <
  13957. ssl->options.minDilithiumKeySz) {
  13958. ret = DILITHIUM_KEY_SIZE_E;
  13959. WOLFSSL_MSG("Peer Dilithium key is too small");
  13960. }
  13961. break;
  13962. }
  13963. #endif /* HAVE_DILITHIUM */
  13964. #endif /* HAVE_PQC */
  13965. default:
  13966. break;
  13967. }
  13968. /* args->dCert free'd in function cleanup after callback */
  13969. } /* if (count > 0) */
  13970. /* Check for error */
  13971. if (args->fatal && ret != 0) {
  13972. goto exit_ppc;
  13973. }
  13974. /* Advance state and proceed */
  13975. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  13976. } /* case TLS_ASYNC_VERIFY */
  13977. FALL_THROUGH;
  13978. case TLS_ASYNC_FINALIZE:
  13979. {
  13980. /* load last error */
  13981. if (args->lastErr != 0 && ret == 0) {
  13982. ret = args->lastErr;
  13983. }
  13984. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  13985. /* limit compliant with OpenSSL verify Depth + 1
  13986. * OpenSSL tries to expand the chain one longer than limit until
  13987. * reaching an ultimately trusted issuer. Becoming failure if
  13988. * we hit the limit, with WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG
  13989. */
  13990. if (args->untrustedDepth > (ssl->options.verifyDepth + 1)) {
  13991. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  13992. ssl->peerVerifyRet = WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG;
  13993. ret = MAX_CHAIN_ERROR;
  13994. WOLFSSL_ERROR_VERBOSE(ret);
  13995. }
  13996. #endif
  13997. #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
  13998. /* If we can't validate the peer cert chain against the CAs loaded
  13999. * into wolfSSL, try to validate against the system certificates
  14000. * using Apple's native trust APIs */
  14001. if ((ret != 0) && (ssl->ctx->doAppleNativeCertValidationFlag)) {
  14002. if (DoAppleNativeCertValidation(args->certs,
  14003. args->totalCerts)) {
  14004. WOLFSSL_MSG("Apple native cert chain validation SUCCESS");
  14005. ret = 0;
  14006. }
  14007. else {
  14008. WOLFSSL_MSG("Apple native cert chain validation FAIL");
  14009. }
  14010. }
  14011. #endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
  14012. /* Do verify callback */
  14013. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  14014. if (ssl->options.verifyNone &&
  14015. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  14016. ret == CRL_CERT_DATE_ERR)) {
  14017. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  14018. ret = ssl->error = 0;
  14019. }
  14020. if (ret != 0) {
  14021. if (!ssl->options.verifyNone) {
  14022. DoCertFatalAlert(ssl, ret);
  14023. }
  14024. ssl->error = ret; /* Report SSL error */
  14025. }
  14026. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  14027. ssl->options.serverState = SERVER_CERT_COMPLETE;
  14028. }
  14029. if (IsEncryptionOn(ssl, 0)) {
  14030. args->idx += ssl->keys.padSz;
  14031. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14032. if (ssl->options.startedETMRead)
  14033. args->idx += MacSize(ssl);
  14034. #endif
  14035. }
  14036. /* Advance state and proceed */
  14037. ssl->options.asyncState = TLS_ASYNC_END;
  14038. } /* case TLS_ASYNC_FINALIZE */
  14039. FALL_THROUGH;
  14040. case TLS_ASYNC_END:
  14041. {
  14042. /* Set final index */
  14043. *inOutIdx = args->idx;
  14044. break;
  14045. }
  14046. default:
  14047. ret = INPUT_CASE_ERROR;
  14048. break;
  14049. } /* switch(ssl->options.asyncState) */
  14050. exit_ppc:
  14051. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  14052. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  14053. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  14054. /* Mark message as not received so it can process again */
  14055. ssl->msgsReceived.got_certificate = 0;
  14056. return ret;
  14057. }
  14058. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  14059. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  14060. /* Cleanup async */
  14061. FreeAsyncCtx(ssl, 0);
  14062. #elif defined(WOLFSSL_SMALL_STACK)
  14063. if (args)
  14064. {
  14065. FreeProcPeerCertArgs(ssl, args);
  14066. }
  14067. #else
  14068. FreeProcPeerCertArgs(ssl, args);
  14069. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
  14070. #if !defined(WOLFSSL_ASYNC_CRYPT) && defined(WOLFSSL_SMALL_STACK)
  14071. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  14072. #endif
  14073. FreeKeyExchange(ssl);
  14074. return ret;
  14075. }
  14076. #endif
  14077. #ifndef WOLFSSL_NO_TLS12
  14078. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  14079. /* handle processing of certificate (11) */
  14080. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  14081. word32 size)
  14082. {
  14083. int ret;
  14084. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  14085. WOLFSSL_ENTER("DoCertificate");
  14086. #ifdef SESSION_CERTS
  14087. /* Reset the session cert chain count in case the session resume failed,
  14088. * do not reset if we are resuming after an async wait */
  14089. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  14090. if (ssl->error != OCSP_WANT_READ && ssl->error != WC_PENDING_E)
  14091. #endif
  14092. {
  14093. ssl->session->chain.count = 0;
  14094. #ifdef WOLFSSL_ALT_CERT_CHAINS
  14095. ssl->session->altChain.count = 0;
  14096. #endif
  14097. }
  14098. #endif /* SESSION_CERTS */
  14099. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  14100. #ifdef OPENSSL_EXTRA
  14101. ssl->options.serverState = SERVER_CERT_COMPLETE;
  14102. #endif
  14103. WOLFSSL_LEAVE("DoCertificate", ret);
  14104. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  14105. return ret;
  14106. }
  14107. /* handle processing of certificate_status (22) */
  14108. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  14109. word32 size)
  14110. {
  14111. int ret = 0;
  14112. byte status_type;
  14113. word32 status_length;
  14114. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  14115. WOLFSSL_ENTER("DoCertificateStatus");
  14116. if (size < ENUM_LEN + OPAQUE24_LEN)
  14117. return BUFFER_ERROR;
  14118. status_type = input[(*inOutIdx)++];
  14119. c24to32(input + *inOutIdx, &status_length);
  14120. *inOutIdx += OPAQUE24_LEN;
  14121. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  14122. return BUFFER_ERROR;
  14123. switch (status_type) {
  14124. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  14125. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  14126. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  14127. case WOLFSSL_CSR2_OCSP:
  14128. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  14129. break;
  14130. #endif
  14131. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  14132. case WOLFSSL_CSR2_OCSP_MULTI: {
  14133. OcspRequest* request;
  14134. word32 list_length = status_length;
  14135. byte idx = 0;
  14136. #ifdef WOLFSSL_SMALL_STACK
  14137. CertStatus* status;
  14138. OcspEntry* single;
  14139. OcspResponse* response;
  14140. #else
  14141. CertStatus status[1];
  14142. OcspEntry single[1];
  14143. OcspResponse response[1];
  14144. #endif
  14145. do {
  14146. if (ssl->status_request_v2) {
  14147. ssl->status_request_v2 = 0;
  14148. break;
  14149. }
  14150. return BUFFER_ERROR;
  14151. } while(0);
  14152. #ifdef WOLFSSL_SMALL_STACK
  14153. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  14154. DYNAMIC_TYPE_OCSP_STATUS);
  14155. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  14156. DYNAMIC_TYPE_OCSP_ENTRY);
  14157. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  14158. DYNAMIC_TYPE_OCSP_REQUEST);
  14159. if (status == NULL || single == NULL || response == NULL) {
  14160. if (status)
  14161. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  14162. if (single)
  14163. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  14164. if (response)
  14165. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  14166. return MEMORY_ERROR;
  14167. }
  14168. #endif
  14169. while (list_length && ret == 0) {
  14170. if (OPAQUE24_LEN > list_length) {
  14171. ret = BUFFER_ERROR;
  14172. break;
  14173. }
  14174. c24to32(input + *inOutIdx, &status_length);
  14175. *inOutIdx += OPAQUE24_LEN;
  14176. list_length -= OPAQUE24_LEN;
  14177. if (status_length > list_length) {
  14178. ret = BUFFER_ERROR;
  14179. break;
  14180. }
  14181. if (status_length) {
  14182. InitOcspResponse(response, single, status, input +*inOutIdx,
  14183. status_length, ssl->heap);
  14184. if ((OcspResponseDecode(response, SSL_CM(ssl), ssl->heap,
  14185. 0) != 0)
  14186. || (response->responseStatus != OCSP_SUCCESSFUL)
  14187. || (response->single->status->status != CERT_GOOD))
  14188. ret = BAD_CERTIFICATE_STATUS_ERROR;
  14189. while (ret == 0) {
  14190. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  14191. ssl->extensions, status_type, idx++);
  14192. if (request == NULL)
  14193. ret = BAD_CERTIFICATE_STATUS_ERROR;
  14194. else if (CompareOcspReqResp(request, response) == 0)
  14195. break;
  14196. else if (idx == 1) /* server cert must be OK */
  14197. ret = BAD_CERTIFICATE_STATUS_ERROR;
  14198. }
  14199. /* only frees 'single' if single->isDynamic is set */
  14200. FreeOcspResponse(response);
  14201. *inOutIdx += status_length;
  14202. list_length -= status_length;
  14203. }
  14204. }
  14205. ssl->status_request_v2 = 0;
  14206. #ifdef WOLFSSL_SMALL_STACK
  14207. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  14208. XFREE(single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
  14209. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  14210. #endif
  14211. }
  14212. break;
  14213. #endif
  14214. default:
  14215. ret = BUFFER_ERROR;
  14216. }
  14217. if (ret != 0) {
  14218. WOLFSSL_ERROR_VERBOSE(ret);
  14219. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  14220. }
  14221. if (IsEncryptionOn(ssl, 0)) {
  14222. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14223. if (ssl->options.startedETMRead) {
  14224. word32 digestSz = MacSize(ssl);
  14225. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  14226. return BUFFER_E;
  14227. *inOutIdx += ssl->keys.padSz + digestSz;
  14228. }
  14229. else
  14230. #endif
  14231. {
  14232. if (*inOutIdx + ssl->keys.padSz > size)
  14233. return BUFFER_E;
  14234. *inOutIdx += ssl->keys.padSz;
  14235. }
  14236. }
  14237. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  14238. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  14239. return ret;
  14240. }
  14241. #endif
  14242. #endif /* !WOLFSSL_NO_TLS12 */
  14243. #endif /* !NO_CERTS */
  14244. #ifndef WOLFSSL_NO_TLS12
  14245. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  14246. word32 size, word32 totalSz)
  14247. {
  14248. (void)input;
  14249. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  14250. WOLFSSL_ENTER("DoHelloRequest");
  14251. if (size) /* must be 0 */
  14252. return BUFFER_ERROR;
  14253. if (IsEncryptionOn(ssl, 0)) {
  14254. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  14255. * about padding */
  14256. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14257. if (ssl->options.startedETMRead) {
  14258. word32 digestSz = MacSize(ssl);
  14259. if (size != totalSz &&
  14260. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  14261. return BUFFER_E;
  14262. *inOutIdx += ssl->keys.padSz + digestSz;
  14263. }
  14264. else
  14265. #endif
  14266. {
  14267. /* access beyond input + size should be checked against totalSz */
  14268. if (size != totalSz &&
  14269. *inOutIdx + ssl->keys.padSz > totalSz)
  14270. return BUFFER_E;
  14271. *inOutIdx += ssl->keys.padSz;
  14272. }
  14273. }
  14274. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14275. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  14276. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  14277. return FATAL_ERROR;
  14278. }
  14279. #ifdef HAVE_SECURE_RENEGOTIATION
  14280. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  14281. ssl->secure_renegotiation->startScr = 1;
  14282. WOLFSSL_LEAVE("DoHelloRequest", 0);
  14283. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  14284. return 0;
  14285. }
  14286. #endif
  14287. else {
  14288. return SendAlert(ssl, alert_warning, no_renegotiation);
  14289. }
  14290. }
  14291. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  14292. word32 totalSz, int sniff)
  14293. {
  14294. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  14295. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  14296. WOLFSSL_ENTER("DoFinished");
  14297. if (finishedSz != size)
  14298. return BUFFER_ERROR;
  14299. /* check against totalSz
  14300. * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
  14301. * padding */
  14302. if (size != totalSz) {
  14303. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14304. if (ssl->options.startedETMRead) {
  14305. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  14306. return BUFFER_E;
  14307. }
  14308. else
  14309. #endif
  14310. {
  14311. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  14312. return BUFFER_E;
  14313. }
  14314. }
  14315. #ifdef WOLFSSL_CALLBACKS
  14316. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  14317. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  14318. #endif
  14319. if (sniff == NO_SNIFF) {
  14320. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  14321. WOLFSSL_MSG("Verify finished error on hashes");
  14322. WOLFSSL_ERROR_VERBOSE(VERIFY_FINISHED_ERROR);
  14323. return VERIFY_FINISHED_ERROR;
  14324. }
  14325. }
  14326. #ifdef HAVE_SECURE_RENEGOTIATION
  14327. if (ssl->secure_renegotiation) {
  14328. /* save peer's state */
  14329. if (ssl->options.side == WOLFSSL_CLIENT_END)
  14330. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  14331. input + *inOutIdx, TLS_FINISHED_SZ);
  14332. else
  14333. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  14334. input + *inOutIdx, TLS_FINISHED_SZ);
  14335. ssl->secure_renegotiation->verifySet = 1;
  14336. }
  14337. #endif
  14338. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  14339. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14340. XMEMCPY(ssl->serverFinished,
  14341. input + *inOutIdx, TLS_FINISHED_SZ);
  14342. ssl->serverFinished_len = TLS_FINISHED_SZ;
  14343. }
  14344. else {
  14345. XMEMCPY(ssl->clientFinished,
  14346. input + *inOutIdx, TLS_FINISHED_SZ);
  14347. ssl->clientFinished_len = TLS_FINISHED_SZ;
  14348. }
  14349. #endif
  14350. /* force input exhaustion at ProcessReply consuming padSz */
  14351. *inOutIdx += size + ssl->keys.padSz;
  14352. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14353. if (ssl->options.startedETMRead)
  14354. *inOutIdx += MacSize(ssl);
  14355. #endif
  14356. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14357. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  14358. #ifdef OPENSSL_EXTRA
  14359. ssl->cbmode = SSL_CB_MODE_WRITE;
  14360. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  14361. #endif
  14362. if (!ssl->options.resuming) {
  14363. #ifdef OPENSSL_EXTRA
  14364. if (ssl->CBIS != NULL) {
  14365. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  14366. }
  14367. #endif
  14368. ssl->options.handShakeState = HANDSHAKE_DONE;
  14369. ssl->options.handShakeDone = 1;
  14370. #ifdef HAVE_SECURE_RENEGOTIATION
  14371. ssl->options.resumed = ssl->options.resuming;
  14372. #endif
  14373. }
  14374. }
  14375. else {
  14376. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  14377. #ifdef OPENSSL_EXTRA
  14378. ssl->cbmode = SSL_CB_MODE_READ;
  14379. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  14380. #endif
  14381. if (ssl->options.resuming) {
  14382. #ifdef OPENSSL_EXTRA
  14383. if (ssl->CBIS != NULL) {
  14384. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
  14385. }
  14386. #endif
  14387. ssl->options.handShakeState = HANDSHAKE_DONE;
  14388. ssl->options.handShakeDone = 1;
  14389. #ifdef HAVE_SECURE_RENEGOTIATION
  14390. ssl->options.resumed = ssl->options.resuming;
  14391. #endif
  14392. }
  14393. }
  14394. #ifdef WOLFSSL_DTLS
  14395. if (ssl->options.dtls) {
  14396. if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
  14397. (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
  14398. DtlsMsgPoolReset(ssl);
  14399. ssl->keys.dtls_handshake_number = 0;
  14400. ssl->keys.dtls_expected_peer_handshake_number = 0;
  14401. }
  14402. }
  14403. #endif
  14404. WOLFSSL_LEAVE("DoFinished", 0);
  14405. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  14406. return 0;
  14407. }
  14408. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  14409. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  14410. {
  14411. /* verify not a duplicate, mark received, check state */
  14412. switch (type) {
  14413. #ifndef NO_WOLFSSL_CLIENT
  14414. case hello_request:
  14415. #ifndef NO_WOLFSSL_SERVER
  14416. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14417. WOLFSSL_MSG("HelloRequest received by server");
  14418. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14419. return SIDE_ERROR;
  14420. }
  14421. #endif
  14422. if (ssl->msgsReceived.got_hello_request) {
  14423. WOLFSSL_MSG("Duplicate HelloRequest received");
  14424. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14425. return DUPLICATE_MSG_E;
  14426. }
  14427. ssl->msgsReceived.got_hello_request = 1;
  14428. break;
  14429. #endif
  14430. #ifndef NO_WOLFSSL_SERVER
  14431. case client_hello:
  14432. #ifndef NO_WOLFSSL_CLIENT
  14433. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14434. WOLFSSL_MSG("ClientHello received by client");
  14435. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14436. return SIDE_ERROR;
  14437. }
  14438. #endif
  14439. if (ssl->msgsReceived.got_client_hello) {
  14440. WOLFSSL_MSG("Duplicate ClientHello received");
  14441. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14442. return DUPLICATE_MSG_E;
  14443. }
  14444. ssl->msgsReceived.got_client_hello = 1;
  14445. break;
  14446. #endif
  14447. #ifndef NO_WOLFSSL_CLIENT
  14448. case server_hello:
  14449. #ifndef NO_WOLFSSL_SERVER
  14450. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14451. WOLFSSL_MSG("ServerHello received by server");
  14452. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14453. return SIDE_ERROR;
  14454. }
  14455. #endif
  14456. if (ssl->msgsReceived.got_server_hello) {
  14457. WOLFSSL_MSG("Duplicate ServerHello received");
  14458. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14459. return DUPLICATE_MSG_E;
  14460. }
  14461. ssl->msgsReceived.got_server_hello = 1;
  14462. break;
  14463. #endif
  14464. #ifndef NO_WOLFSSL_CLIENT
  14465. case hello_verify_request:
  14466. #ifndef NO_WOLFSSL_SERVER
  14467. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14468. WOLFSSL_MSG("HelloVerifyRequest received by server");
  14469. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14470. return SIDE_ERROR;
  14471. }
  14472. #endif
  14473. if (ssl->msgsReceived.got_hello_verify_request) {
  14474. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  14475. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14476. return DUPLICATE_MSG_E;
  14477. }
  14478. if (ssl->msgsReceived.got_hello_retry_request) {
  14479. WOLFSSL_MSG("Received HelloVerifyRequest after a "
  14480. "HelloRetryRequest");
  14481. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  14482. return VERSION_ERROR;
  14483. }
  14484. ssl->msgsReceived.got_hello_verify_request = 1;
  14485. break;
  14486. #endif
  14487. #ifndef NO_WOLFSSL_CLIENT
  14488. case session_ticket:
  14489. #ifndef NO_WOLFSSL_SERVER
  14490. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14491. WOLFSSL_MSG("SessionTicket received by server");
  14492. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14493. return SIDE_ERROR;
  14494. }
  14495. #endif
  14496. if (ssl->msgsReceived.got_session_ticket) {
  14497. WOLFSSL_MSG("Duplicate SessionTicket received");
  14498. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14499. return DUPLICATE_MSG_E;
  14500. }
  14501. ssl->msgsReceived.got_session_ticket = 1;
  14502. break;
  14503. #endif
  14504. case certificate:
  14505. if (ssl->msgsReceived.got_certificate) {
  14506. WOLFSSL_MSG("Duplicate Certificate received");
  14507. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14508. return DUPLICATE_MSG_E;
  14509. }
  14510. ssl->msgsReceived.got_certificate = 1;
  14511. #ifndef NO_WOLFSSL_CLIENT
  14512. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14513. if ( ssl->msgsReceived.got_server_hello == 0) {
  14514. WOLFSSL_MSG("No ServerHello before Cert");
  14515. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14516. return OUT_OF_ORDER_E;
  14517. }
  14518. }
  14519. #endif
  14520. #ifndef NO_WOLFSSL_SERVER
  14521. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14522. if ( ssl->msgsReceived.got_client_hello == 0) {
  14523. WOLFSSL_MSG("No ClientHello before Cert");
  14524. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14525. return OUT_OF_ORDER_E;
  14526. }
  14527. }
  14528. #endif
  14529. break;
  14530. #ifndef NO_WOLFSSL_CLIENT
  14531. case certificate_status:
  14532. #ifndef NO_WOLFSSL_SERVER
  14533. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14534. WOLFSSL_MSG("CertificateStatus received by server");
  14535. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14536. return SIDE_ERROR;
  14537. }
  14538. #endif
  14539. if (ssl->msgsReceived.got_certificate_status) {
  14540. WOLFSSL_MSG("Duplicate CertificateStatus received");
  14541. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14542. return DUPLICATE_MSG_E;
  14543. }
  14544. ssl->msgsReceived.got_certificate_status = 1;
  14545. if (ssl->msgsReceived.got_certificate == 0) {
  14546. WOLFSSL_MSG("No Certificate before CertificateStatus");
  14547. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14548. return OUT_OF_ORDER_E;
  14549. }
  14550. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  14551. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  14552. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14553. return OUT_OF_ORDER_E;
  14554. }
  14555. break;
  14556. #endif
  14557. #ifndef NO_WOLFSSL_CLIENT
  14558. case server_key_exchange:
  14559. #ifndef NO_WOLFSSL_SERVER
  14560. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14561. WOLFSSL_MSG("ServerKeyExchange received by server");
  14562. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14563. return SIDE_ERROR;
  14564. }
  14565. #endif
  14566. if (ssl->msgsReceived.got_server_key_exchange) {
  14567. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  14568. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14569. return DUPLICATE_MSG_E;
  14570. }
  14571. ssl->msgsReceived.got_server_key_exchange = 1;
  14572. if (ssl->msgsReceived.got_server_hello == 0) {
  14573. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  14574. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14575. return OUT_OF_ORDER_E;
  14576. }
  14577. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  14578. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  14579. if (ssl->msgsReceived.got_certificate_status == 0) {
  14580. int csrRet = 0;
  14581. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  14582. if (csrRet == 0 && ssl->status_request) {
  14583. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  14584. csrRet = TLSX_CSR_ForceRequest(ssl);
  14585. }
  14586. #endif
  14587. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  14588. if (csrRet == 0 && ssl->status_request_v2) {
  14589. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  14590. csrRet = TLSX_CSR2_ForceRequest(ssl);
  14591. }
  14592. #endif
  14593. if (csrRet != 0) {
  14594. /* Error out if OCSP lookups are enabled and failed or if
  14595. * the user requires stapling. */
  14596. if (SSL_CM(ssl)->ocspEnabled || SSL_CM(ssl)->ocspMustStaple)
  14597. return csrRet;
  14598. }
  14599. /* Check that a status request extension was seen as the
  14600. * CertificateStatus wasn't when an OCSP staple is required.
  14601. */
  14602. if (
  14603. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  14604. !ssl->status_request &&
  14605. #endif
  14606. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  14607. !ssl->status_request_v2 &&
  14608. #endif
  14609. SSL_CM(ssl)->ocspMustStaple) {
  14610. WOLFSSL_ERROR_VERBOSE(OCSP_CERT_UNKNOWN);
  14611. return OCSP_CERT_UNKNOWN;
  14612. }
  14613. }
  14614. #endif
  14615. break;
  14616. #endif
  14617. #ifndef NO_WOLFSSL_CLIENT
  14618. case certificate_request:
  14619. #ifndef NO_WOLFSSL_SERVER
  14620. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14621. WOLFSSL_MSG("CertificateRequest received by server");
  14622. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14623. return SIDE_ERROR;
  14624. }
  14625. #endif
  14626. if (ssl->msgsReceived.got_certificate_request) {
  14627. WOLFSSL_MSG("Duplicate CertificateRequest received");
  14628. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14629. return DUPLICATE_MSG_E;
  14630. }
  14631. ssl->msgsReceived.got_certificate_request = 1;
  14632. break;
  14633. #endif
  14634. #ifndef NO_WOLFSSL_CLIENT
  14635. case server_hello_done:
  14636. #ifndef NO_WOLFSSL_SERVER
  14637. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14638. WOLFSSL_MSG("ServerHelloDone received by server");
  14639. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14640. return SIDE_ERROR;
  14641. }
  14642. #endif
  14643. if (ssl->msgsReceived.got_server_hello_done) {
  14644. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  14645. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14646. return DUPLICATE_MSG_E;
  14647. }
  14648. ssl->msgsReceived.got_server_hello_done = 1;
  14649. if (ssl->msgsReceived.got_certificate == 0) {
  14650. if (ssl->specs.kea == psk_kea ||
  14651. ssl->specs.kea == dhe_psk_kea ||
  14652. ssl->specs.kea == ecdhe_psk_kea ||
  14653. ssl->options.usingAnon_cipher) {
  14654. WOLFSSL_MSG("No Cert required");
  14655. }
  14656. else {
  14657. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  14658. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14659. return OUT_OF_ORDER_E;
  14660. }
  14661. }
  14662. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  14663. int pskNoServerHint = 0; /* not required in this case */
  14664. #ifndef NO_PSK
  14665. if (ssl->specs.kea == psk_kea &&
  14666. ssl->arrays != NULL &&
  14667. ssl->arrays->server_hint[0] == 0)
  14668. pskNoServerHint = 1;
  14669. #endif
  14670. if (ssl->specs.static_ecdh == 1 ||
  14671. ssl->specs.kea == rsa_kea ||
  14672. pskNoServerHint) {
  14673. WOLFSSL_MSG("No KeyExchange required");
  14674. }
  14675. else {
  14676. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  14677. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14678. return OUT_OF_ORDER_E;
  14679. }
  14680. }
  14681. break;
  14682. #endif
  14683. #ifndef NO_WOLFSSL_SERVER
  14684. case certificate_verify:
  14685. #ifndef NO_WOLFSSL_CLIENT
  14686. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14687. WOLFSSL_MSG("CertificateVerify received by client");
  14688. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14689. return SIDE_ERROR;
  14690. }
  14691. #endif
  14692. if (ssl->msgsReceived.got_certificate_verify) {
  14693. WOLFSSL_MSG("Duplicate CertificateVerify received");
  14694. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14695. return DUPLICATE_MSG_E;
  14696. }
  14697. ssl->msgsReceived.got_certificate_verify = 1;
  14698. if ( ssl->msgsReceived.got_certificate == 0) {
  14699. WOLFSSL_MSG("No Cert before CertVerify");
  14700. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14701. return OUT_OF_ORDER_E;
  14702. }
  14703. break;
  14704. #endif
  14705. #ifndef NO_WOLFSSL_SERVER
  14706. case client_key_exchange:
  14707. #ifndef NO_WOLFSSL_CLIENT
  14708. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14709. WOLFSSL_MSG("ClientKeyExchange received by client");
  14710. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  14711. return SIDE_ERROR;
  14712. }
  14713. #endif
  14714. if (ssl->msgsReceived.got_client_key_exchange) {
  14715. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  14716. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14717. return DUPLICATE_MSG_E;
  14718. }
  14719. ssl->msgsReceived.got_client_key_exchange = 1;
  14720. if (ssl->msgsReceived.got_client_hello == 0) {
  14721. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  14722. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14723. return OUT_OF_ORDER_E;
  14724. }
  14725. break;
  14726. #endif
  14727. case finished:
  14728. if (ssl->msgsReceived.got_finished) {
  14729. WOLFSSL_MSG("Duplicate Finished received");
  14730. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14731. return DUPLICATE_MSG_E;
  14732. }
  14733. #ifdef WOLFSSL_DTLS
  14734. if (ssl->options.dtls) {
  14735. if (ssl->keys.curEpoch == 0) {
  14736. WOLFSSL_MSG("Finished received with epoch 0");
  14737. WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
  14738. return SEQUENCE_ERROR;
  14739. }
  14740. }
  14741. #endif
  14742. ssl->msgsReceived.got_finished = 1;
  14743. if (ssl->msgsReceived.got_change_cipher == 0) {
  14744. WOLFSSL_MSG("Finished received before ChangeCipher");
  14745. WOLFSSL_ERROR_VERBOSE(NO_CHANGE_CIPHER_E);
  14746. return NO_CHANGE_CIPHER_E;
  14747. }
  14748. break;
  14749. case change_cipher_hs:
  14750. if (ssl->msgsReceived.got_change_cipher) {
  14751. WOLFSSL_MSG("Duplicate ChangeCipher received");
  14752. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  14753. return DUPLICATE_MSG_E;
  14754. }
  14755. /* DTLS is going to ignore the CCS message if the client key
  14756. * exchange message wasn't received yet. */
  14757. if (!ssl->options.dtls)
  14758. ssl->msgsReceived.got_change_cipher = 1;
  14759. #ifndef NO_WOLFSSL_CLIENT
  14760. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14761. if (!ssl->options.resuming) {
  14762. if (ssl->msgsReceived.got_server_hello_done == 0) {
  14763. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  14764. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14765. return OUT_OF_ORDER_E;
  14766. }
  14767. }
  14768. else {
  14769. if (ssl->msgsReceived.got_server_hello == 0) {
  14770. WOLFSSL_MSG("No ServerHello before ChangeCipher on "
  14771. "Resume");
  14772. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14773. return OUT_OF_ORDER_E;
  14774. }
  14775. }
  14776. #ifdef HAVE_SESSION_TICKET
  14777. if (ssl->expect_session_ticket) {
  14778. WOLFSSL_MSG("Expected session ticket missing");
  14779. #ifdef WOLFSSL_DTLS
  14780. if (ssl->options.dtls) {
  14781. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14782. return OUT_OF_ORDER_E;
  14783. }
  14784. #endif
  14785. WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
  14786. return SESSION_TICKET_EXPECT_E;
  14787. }
  14788. #endif
  14789. }
  14790. #endif
  14791. #ifndef NO_WOLFSSL_SERVER
  14792. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14793. if (!ssl->options.resuming &&
  14794. ssl->msgsReceived.got_client_key_exchange == 0) {
  14795. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  14796. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14797. return OUT_OF_ORDER_E;
  14798. }
  14799. #ifndef NO_CERTS
  14800. if (ssl->options.verifyPeer &&
  14801. ssl->options.havePeerCert) {
  14802. if (!ssl->options.havePeerVerify ||
  14803. !ssl->msgsReceived.got_certificate_verify) {
  14804. WOLFSSL_MSG("client didn't send cert verify");
  14805. #ifdef WOLFSSL_DTLS
  14806. if (ssl->options.dtls) {
  14807. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14808. return OUT_OF_ORDER_E;
  14809. }
  14810. #endif
  14811. WOLFSSL_ERROR_VERBOSE(NO_PEER_VERIFY);
  14812. return NO_PEER_VERIFY;
  14813. }
  14814. }
  14815. #endif
  14816. }
  14817. #endif
  14818. if (ssl->options.dtls)
  14819. ssl->msgsReceived.got_change_cipher = 1;
  14820. break;
  14821. default:
  14822. WOLFSSL_MSG("Unknown message type");
  14823. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  14824. return SANITY_MSG_E;
  14825. }
  14826. return 0;
  14827. }
  14828. int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  14829. byte type, word32 size, word32 totalSz)
  14830. {
  14831. int ret = 0;
  14832. word32 expectedIdx;
  14833. WOLFSSL_ENTER("DoHandShakeMsgType");
  14834. #ifdef WOLFSSL_TLS13
  14835. if (type == hello_retry_request) {
  14836. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  14837. totalSz);
  14838. }
  14839. #endif
  14840. /* make sure can read the message */
  14841. if (*inOutIdx + size > totalSz) {
  14842. WOLFSSL_MSG("Incomplete Data");
  14843. WOLFSSL_ERROR_VERBOSE(INCOMPLETE_DATA);
  14844. return INCOMPLETE_DATA;
  14845. }
  14846. expectedIdx = *inOutIdx + size +
  14847. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  14848. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14849. if (ssl->options.startedETMRead && ssl->keys.encryptionOn)
  14850. expectedIdx += MacSize(ssl);
  14851. #endif
  14852. #if !defined(NO_WOLFSSL_SERVER) && \
  14853. defined(HAVE_SECURE_RENEGOTIATION) && \
  14854. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  14855. if (ssl->options.handShakeDone && type == client_hello &&
  14856. ssl->secure_renegotiation &&
  14857. ssl->secure_renegotiation->enabled)
  14858. {
  14859. WOLFSSL_MSG("Reset handshake state");
  14860. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  14861. ssl->options.serverState = NULL_STATE;
  14862. ssl->options.clientState = NULL_STATE;
  14863. ssl->options.connectState = CONNECT_BEGIN;
  14864. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  14865. ssl->options.handShakeState = NULL_STATE;
  14866. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  14867. ret = InitHandshakeHashes(ssl);
  14868. if (ret != 0)
  14869. return ret;
  14870. }
  14871. #endif
  14872. /* sanity check msg received */
  14873. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  14874. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  14875. return ret;
  14876. }
  14877. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14878. /* add name later, add the handshake header part back on and record layer
  14879. * header */
  14880. if (ssl->toInfoOn) {
  14881. ret = AddPacketInfo(ssl, 0, handshake, input + *inOutIdx -
  14882. HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ, READ_PROTO,
  14883. RECORD_HEADER_SZ, ssl->heap);
  14884. if (ret != 0)
  14885. return ret;
  14886. #ifdef WOLFSSL_CALLBACKS
  14887. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  14888. #endif
  14889. }
  14890. #endif
  14891. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  14892. WOLFSSL_MSG("HandShake message after handshake complete");
  14893. SendAlert(ssl, alert_fatal, unexpected_message);
  14894. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14895. return OUT_OF_ORDER_E;
  14896. }
  14897. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  14898. ssl->options.serverState == NULL_STATE && type != server_hello &&
  14899. type != hello_request) {
  14900. WOLFSSL_MSG("First server message not server hello or "
  14901. "hello request");
  14902. SendAlert(ssl, alert_fatal, unexpected_message);
  14903. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14904. return OUT_OF_ORDER_E;
  14905. }
  14906. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  14907. type == server_hello_done &&
  14908. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  14909. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  14910. SendAlert(ssl, alert_fatal, unexpected_message);
  14911. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14912. return OUT_OF_ORDER_E;
  14913. }
  14914. if (ssl->options.side == WOLFSSL_SERVER_END &&
  14915. ssl->options.clientState == NULL_STATE && type != client_hello) {
  14916. WOLFSSL_MSG("First client message not client hello");
  14917. SendAlert(ssl, alert_fatal, unexpected_message);
  14918. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14919. return OUT_OF_ORDER_E;
  14920. }
  14921. /* above checks handshake state */
  14922. /* hello_request not hashed */
  14923. if (type != hello_request
  14924. #ifdef WOLFSSL_ASYNC_CRYPT
  14925. && ssl->error != WC_PENDING_E
  14926. #endif
  14927. #ifdef WOLFSSL_NONBLOCK_OCSP
  14928. && ssl->error != OCSP_WANT_READ
  14929. #endif
  14930. ) {
  14931. ret = HashInput(ssl, input + *inOutIdx, size);
  14932. if (ret != 0) {
  14933. WOLFSSL_MSG("Incomplete handshake hashes");
  14934. return ret;
  14935. }
  14936. }
  14937. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14938. switch (type) {
  14939. case certificate:
  14940. case server_key_exchange:
  14941. case certificate_request:
  14942. case server_hello_done:
  14943. if (ssl->options.resuming) {
  14944. /* https://www.rfc-editor.org/rfc/rfc5077.html#section-3.4
  14945. * Alternatively, the client MAY include an empty Session ID
  14946. * in the ClientHello. In this case, the client ignores the
  14947. * Session ID sent in the ServerHello and determines if the
  14948. * server is resuming a session by the subsequent handshake
  14949. * messages.
  14950. */
  14951. #ifndef WOLFSSL_WPAS
  14952. if (ssl->session->sessionIDSz != 0) {
  14953. /* Fatal error. Only try to send an alert. RFC 5246 does not
  14954. * allow for reverting back to a full handshake after the
  14955. * server has indicated the intention to do a resumption. */
  14956. (void)SendAlert(ssl, alert_fatal, unexpected_message);
  14957. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  14958. return OUT_OF_ORDER_E;
  14959. }
  14960. #endif
  14961. /* This can occur when ssl->sessionSecretCb is set. EAP-FAST
  14962. * (RFC 4851) allows for detecting server session resumption
  14963. * based on the msg received after the ServerHello. */
  14964. WOLFSSL_MSG("Not resuming as thought");
  14965. ssl->options.resuming = 0;
  14966. /* No longer resuming, reset peer authentication state. */
  14967. ssl->options.peerAuthGood = 0;
  14968. }
  14969. }
  14970. }
  14971. #ifdef OPENSSL_EXTRA
  14972. if (ssl->CBIS != NULL){
  14973. ssl->cbmode = SSL_CB_MODE_READ;
  14974. ssl->cbtype = type;
  14975. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
  14976. }
  14977. #endif
  14978. switch (type) {
  14979. case hello_request:
  14980. WOLFSSL_MSG("processing hello request");
  14981. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  14982. break;
  14983. #ifndef NO_WOLFSSL_CLIENT
  14984. case hello_verify_request:
  14985. WOLFSSL_MSG("processing hello verify request");
  14986. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  14987. if (IsEncryptionOn(ssl, 0)) {
  14988. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14989. if (ssl->options.startedETMRead) {
  14990. word32 digestSz = MacSize(ssl);
  14991. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  14992. return BUFFER_E;
  14993. *inOutIdx += ssl->keys.padSz + digestSz;
  14994. }
  14995. else
  14996. #endif
  14997. {
  14998. /* access beyond input + size should be checked against totalSz
  14999. */
  15000. if (*inOutIdx + ssl->keys.padSz > totalSz)
  15001. return BUFFER_E;
  15002. *inOutIdx += ssl->keys.padSz;
  15003. }
  15004. }
  15005. break;
  15006. case server_hello:
  15007. WOLFSSL_MSG("processing server hello");
  15008. ret = DoServerHello(ssl, input, inOutIdx, size);
  15009. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  15010. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  15011. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  15012. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  15013. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  15014. IsAtLeastTLSv1_3(ssl->version)) {
  15015. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  15016. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  15017. #endif
  15018. {
  15019. ssl->options.cacheMessages = 0;
  15020. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  15021. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  15022. XFREE(ssl->hsHashes->messages, ssl->heap,
  15023. DYNAMIC_TYPE_HASHES);
  15024. ssl->hsHashes->messages = NULL;
  15025. }
  15026. }
  15027. }
  15028. #endif
  15029. break;
  15030. #ifndef NO_CERTS
  15031. case certificate_request:
  15032. WOLFSSL_MSG("processing certificate request");
  15033. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  15034. break;
  15035. #endif
  15036. case server_key_exchange:
  15037. WOLFSSL_MSG("processing server key exchange");
  15038. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  15039. break;
  15040. #ifdef HAVE_SESSION_TICKET
  15041. case session_ticket:
  15042. WOLFSSL_MSG("processing session ticket");
  15043. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  15044. break;
  15045. #endif /* HAVE_SESSION_TICKET */
  15046. #endif
  15047. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  15048. !defined(WOLFSSL_NO_CLIENT_AUTH))
  15049. case certificate:
  15050. WOLFSSL_MSG("processing certificate");
  15051. ret = DoCertificate(ssl, input, inOutIdx, size);
  15052. break;
  15053. case certificate_status:
  15054. WOLFSSL_MSG("processing certificate status");
  15055. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  15056. break;
  15057. #endif
  15058. case server_hello_done:
  15059. WOLFSSL_MSG("processing server hello done");
  15060. #ifdef WOLFSSL_CALLBACKS
  15061. if (ssl->hsInfoOn)
  15062. AddPacketName(ssl, "ServerHelloDone");
  15063. if (ssl->toInfoOn)
  15064. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  15065. #endif
  15066. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  15067. if (IsEncryptionOn(ssl, 0)) {
  15068. *inOutIdx += ssl->keys.padSz;
  15069. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15070. if (ssl->options.startedETMRead)
  15071. *inOutIdx += MacSize(ssl);
  15072. #endif
  15073. }
  15074. break;
  15075. case finished:
  15076. WOLFSSL_MSG("processing finished");
  15077. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  15078. break;
  15079. #ifndef NO_WOLFSSL_SERVER
  15080. case client_hello:
  15081. WOLFSSL_MSG("processing client hello");
  15082. ret = DoClientHello(ssl, input, inOutIdx, size);
  15083. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  15084. ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \
  15085. (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  15086. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  15087. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  15088. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  15089. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  15090. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  15091. #endif
  15092. {
  15093. ssl->options.cacheMessages = 0;
  15094. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  15095. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  15096. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  15097. ssl->hsHashes->messages = NULL;
  15098. }
  15099. }
  15100. }
  15101. #endif
  15102. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  15103. * about padding */
  15104. if (IsEncryptionOn(ssl, 0)) {
  15105. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15106. if (ssl->options.startedETMRead) {
  15107. word32 digestSz = MacSize(ssl);
  15108. if (size != totalSz &&
  15109. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  15110. return BUFFER_E;
  15111. *inOutIdx += ssl->keys.padSz + digestSz;
  15112. }
  15113. else
  15114. #endif
  15115. {
  15116. /* access beyond input + size should be checked against totalSz
  15117. */
  15118. if (size != totalSz &&
  15119. *inOutIdx + ssl->keys.padSz > totalSz)
  15120. return BUFFER_E;
  15121. *inOutIdx += ssl->keys.padSz;
  15122. }
  15123. }
  15124. break;
  15125. case client_key_exchange:
  15126. WOLFSSL_MSG("processing client key exchange");
  15127. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  15128. break;
  15129. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  15130. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  15131. case certificate_verify:
  15132. WOLFSSL_MSG("processing certificate verify");
  15133. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  15134. break;
  15135. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  15136. #endif /* !NO_WOLFSSL_SERVER */
  15137. default:
  15138. WOLFSSL_MSG("Unknown handshake message type");
  15139. ret = UNKNOWN_HANDSHAKE_TYPE;
  15140. break;
  15141. }
  15142. if (ret == 0 && expectedIdx != *inOutIdx) {
  15143. WOLFSSL_MSG("Extra data in handshake message");
  15144. if (!ssl->options.dtls)
  15145. SendAlert(ssl, alert_fatal, decode_error);
  15146. ret = DECODE_E;
  15147. WOLFSSL_ERROR_VERBOSE(ret);
  15148. }
  15149. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  15150. /* if async, offset index so this msg will be processed again */
  15151. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  15152. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  15153. #ifdef WOLFSSL_DTLS
  15154. if (ssl->options.dtls) {
  15155. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  15156. }
  15157. #endif
  15158. }
  15159. /* make sure async error is cleared */
  15160. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  15161. ssl->error = 0;
  15162. }
  15163. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  15164. #ifdef WOLFSSL_DTLS
  15165. if (ret == 0) {
  15166. if (type == client_hello) {
  15167. /* Advance expected number only if cookie exchange complete */
  15168. if (ssl->msgsReceived.got_client_hello)
  15169. ssl->keys.dtls_expected_peer_handshake_number =
  15170. ssl->keys.dtls_peer_handshake_number + 1;
  15171. }
  15172. else if (type != finished) {
  15173. ssl->keys.dtls_expected_peer_handshake_number++;
  15174. }
  15175. }
  15176. #endif
  15177. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  15178. return ret;
  15179. }
  15180. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  15181. word32 totalSz)
  15182. {
  15183. int ret = 0;
  15184. word32 inputLength;
  15185. WOLFSSL_ENTER("DoHandShakeMsg");
  15186. if (ssl->arrays == NULL) {
  15187. byte type;
  15188. word32 size;
  15189. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0) {
  15190. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  15191. return PARSE_ERROR;
  15192. }
  15193. ret = EarlySanityCheckMsgReceived(ssl, type, size);
  15194. if (ret != 0) {
  15195. WOLFSSL_ERROR(ret);
  15196. return ret;
  15197. }
  15198. if (size > MAX_HANDSHAKE_SZ) {
  15199. WOLFSSL_MSG("Handshake message too large");
  15200. WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
  15201. return HANDSHAKE_SIZE_ERROR;
  15202. }
  15203. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  15204. }
  15205. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  15206. /* If there is a pending fragmented handshake message,
  15207. * pending message size will be non-zero. */
  15208. if (ssl->arrays->pendingMsgSz == 0) {
  15209. byte type;
  15210. word32 size;
  15211. if (GetHandShakeHeader(ssl, input, inOutIdx, &type, &size,
  15212. totalSz) != 0) {
  15213. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  15214. return PARSE_ERROR;
  15215. }
  15216. ret = EarlySanityCheckMsgReceived(ssl, type,
  15217. min(inputLength - HANDSHAKE_HEADER_SZ, size));
  15218. if (ret != 0) {
  15219. WOLFSSL_ERROR(ret);
  15220. return ret;
  15221. }
  15222. /* Cap the maximum size of a handshake message to something reasonable.
  15223. * By default is the maximum size of a certificate message assuming
  15224. * nine 2048-bit RSA certificates in the chain. */
  15225. if (size > MAX_HANDSHAKE_SZ) {
  15226. WOLFSSL_MSG("Handshake message too large");
  15227. WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
  15228. return HANDSHAKE_SIZE_ERROR;
  15229. }
  15230. /* size is the size of the certificate message payload */
  15231. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  15232. ssl->arrays->pendingMsgType = type;
  15233. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  15234. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  15235. ssl->heap,
  15236. DYNAMIC_TYPE_ARRAYS);
  15237. if (ssl->arrays->pendingMsg == NULL)
  15238. return MEMORY_E;
  15239. XMEMCPY(ssl->arrays->pendingMsg,
  15240. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  15241. inputLength);
  15242. ssl->arrays->pendingMsgOffset = inputLength;
  15243. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  15244. return 0;
  15245. }
  15246. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  15247. }
  15248. else {
  15249. word32 pendSz =
  15250. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  15251. /* Catch the case where there may be the remainder of a fragmented
  15252. * handshake message and the next handshake message in the same
  15253. * record. */
  15254. if (inputLength > pendSz)
  15255. inputLength = pendSz;
  15256. ret = EarlySanityCheckMsgReceived(ssl, ssl->arrays->pendingMsgType,
  15257. inputLength);
  15258. if (ret != 0) {
  15259. WOLFSSL_ERROR(ret);
  15260. return ret;
  15261. }
  15262. #ifdef WOLFSSL_ASYNC_CRYPT
  15263. if (ssl->error != WC_PENDING_E)
  15264. #endif
  15265. {
  15266. /* for async this copy was already done, do not replace, since
  15267. * contents may have been changed for inline operations */
  15268. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  15269. input + *inOutIdx, inputLength);
  15270. }
  15271. ssl->arrays->pendingMsgOffset += inputLength;
  15272. *inOutIdx += inputLength;
  15273. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  15274. {
  15275. word32 idx = HANDSHAKE_HEADER_SZ;
  15276. ret = DoHandShakeMsgType(ssl,
  15277. ssl->arrays->pendingMsg,
  15278. &idx, ssl->arrays->pendingMsgType,
  15279. ssl->arrays->pendingMsgSz - idx,
  15280. ssl->arrays->pendingMsgSz);
  15281. #ifdef WOLFSSL_ASYNC_CRYPT
  15282. if (ret == WC_PENDING_E) {
  15283. /* setup to process fragment again */
  15284. ssl->arrays->pendingMsgOffset -= inputLength;
  15285. *inOutIdx -= inputLength;
  15286. }
  15287. else
  15288. #endif
  15289. {
  15290. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  15291. ssl->arrays->pendingMsg = NULL;
  15292. ssl->arrays->pendingMsgSz = 0;
  15293. }
  15294. }
  15295. }
  15296. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  15297. return ret;
  15298. }
  15299. #endif /* !WOLFSSL_NO_TLS12 */
  15300. #ifdef WOLFSSL_EXTRA_ALERTS
  15301. int SendFatalAlertOnly(WOLFSSL *ssl, int error)
  15302. {
  15303. int why;
  15304. /* already sent a more specific fatal alert */
  15305. if (ssl->alert_history.last_tx.level == alert_fatal)
  15306. return 0;
  15307. switch (error) {
  15308. /* not fatal errors */
  15309. case WANT_WRITE:
  15310. case WANT_READ:
  15311. case ZERO_RETURN:
  15312. #ifdef WOLFSSL_NONBLOCK_OCSP
  15313. case OCSP_WANT_READ:
  15314. #endif
  15315. #ifdef WOLFSSL_ASYNC_CRYPT
  15316. case WC_PENDING_E:
  15317. #endif
  15318. return 0;
  15319. /* peer already disconnected and ssl is possibly in bad state
  15320. * don't try to send an alert */
  15321. case SOCKET_ERROR_E:
  15322. return error;
  15323. case BUFFER_ERROR:
  15324. case ASN_PARSE_E:
  15325. case COMPRESSION_ERROR:
  15326. why = decode_error;
  15327. break;
  15328. case VERIFY_FINISHED_ERROR:
  15329. case SIG_VERIFY_E:
  15330. why = decrypt_error;
  15331. break;
  15332. case DUPLICATE_MSG_E:
  15333. case NO_CHANGE_CIPHER_E:
  15334. case OUT_OF_ORDER_E:
  15335. why = unexpected_message;
  15336. break;
  15337. case ECC_OUT_OF_RANGE_E:
  15338. why = bad_record_mac;
  15339. break;
  15340. case MATCH_SUITE_ERROR:
  15341. case VERSION_ERROR:
  15342. default:
  15343. why = handshake_failure;
  15344. break;
  15345. }
  15346. return SendAlert(ssl, alert_fatal, why);
  15347. }
  15348. #else
  15349. int SendFatalAlertOnly(WOLFSSL *ssl, int error)
  15350. {
  15351. (void)ssl;
  15352. (void)error;
  15353. /* no op */
  15354. return 0;
  15355. }
  15356. #endif /* WOLFSSL_EXTRA_ALERTS */
  15357. #ifdef WOLFSSL_DTLS
  15358. static int _DtlsCheckWindow(WOLFSSL* ssl)
  15359. {
  15360. word32* window;
  15361. word16 cur_hi, next_hi;
  15362. word32 cur_lo, next_lo, diff;
  15363. int curLT;
  15364. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  15365. if (!ssl->options.haveMcast)
  15366. peerSeq = ssl->keys.peerSeq;
  15367. else {
  15368. #ifdef WOLFSSL_MULTICAST
  15369. WOLFSSL_DTLS_PEERSEQ* p;
  15370. int i;
  15371. for (i = 0, p = ssl->keys.peerSeq;
  15372. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  15373. i++, p++) {
  15374. if (p->peerId == ssl->keys.curPeerId) {
  15375. peerSeq = p;
  15376. break;
  15377. }
  15378. }
  15379. #endif
  15380. }
  15381. if (peerSeq == NULL) {
  15382. WOLFSSL_MSG("Could not find peer sequence");
  15383. return 0;
  15384. }
  15385. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  15386. next_hi = peerSeq->nextSeq_hi;
  15387. next_lo = peerSeq->nextSeq_lo;
  15388. window = peerSeq->window;
  15389. }
  15390. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  15391. next_hi = peerSeq->prevSeq_hi;
  15392. next_lo = peerSeq->prevSeq_lo;
  15393. window = peerSeq->prevWindow;
  15394. }
  15395. else {
  15396. return 0;
  15397. }
  15398. cur_hi = ssl->keys.curSeq_hi;
  15399. cur_lo = ssl->keys.curSeq_lo;
  15400. /* If the difference between next and cur is > 2^32, way outside window. */
  15401. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  15402. WOLFSSL_MSG("Current record from way too far in the future.");
  15403. return 0;
  15404. }
  15405. if (cur_hi == next_hi) {
  15406. curLT = cur_lo < next_lo;
  15407. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  15408. }
  15409. else {
  15410. curLT = cur_hi < next_hi;
  15411. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  15412. }
  15413. /* Check to see that the next value is greater than the number of messages
  15414. * trackable in the window, and that the difference between the next
  15415. * expected sequence number and the received sequence number is inside the
  15416. * window. */
  15417. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  15418. curLT && (diff > DTLS_SEQ_BITS)) {
  15419. WOLFSSL_MSG("Current record sequence number from the past.");
  15420. return 0;
  15421. }
  15422. #ifdef WOLFSSL_DTLS_DISALLOW_FUTURE
  15423. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  15424. WOLFSSL_MSG("Rejecting message too far into the future.");
  15425. return 0;
  15426. }
  15427. #endif
  15428. else if (curLT) {
  15429. word32 idx;
  15430. word32 newDiff;
  15431. if (diff == 0) {
  15432. WOLFSSL_MSG("DTLS sanity check failed");
  15433. return 0;
  15434. }
  15435. diff--;
  15436. idx = diff / DTLS_WORD_BITS;
  15437. newDiff = diff % DTLS_WORD_BITS;
  15438. /* verify idx is valid for window array */
  15439. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  15440. WOLFSSL_MSG("Invalid DTLS windows index");
  15441. return 0;
  15442. }
  15443. if (window[idx] & (1 << newDiff)) {
  15444. WOLFSSL_MSG("Current record sequence number already received.");
  15445. return 0;
  15446. }
  15447. }
  15448. return 1;
  15449. }
  15450. #ifdef WOLFSSL_DTLS13
  15451. static WC_INLINE int Dtls13CheckWindow(WOLFSSL* ssl)
  15452. {
  15453. w64wrapper nextSeq, seq;
  15454. w64wrapper diff64;
  15455. word32 *window;
  15456. int wordOffset;
  15457. int wordIndex;
  15458. word32 diff;
  15459. WOLFSSL_ENTER("Dtls13CheckWindow");
  15460. if (ssl->dtls13DecryptEpoch == NULL) {
  15461. WOLFSSL_MSG("Can't find decrypting epoch");
  15462. return 0;
  15463. }
  15464. nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber;
  15465. window = ssl->dtls13DecryptEpoch->window;
  15466. seq = ssl->keys.curSeq;
  15467. if (w64GTE(seq, nextSeq))
  15468. return 1;
  15469. /* seq < nextSeq, nextSeq - seq */
  15470. diff64 = w64Sub(nextSeq, seq);
  15471. /* diff >= DTLS_SEQ_BITS, outside of the window */
  15472. if (w64GT(diff64, w64From32(0, DTLS_SEQ_BITS)))
  15473. return 0;
  15474. /* we are assuming DTLS_SEQ_BITS <= 2**32 */
  15475. diff = w64GetLow32(diff64);
  15476. /* zero based index */
  15477. diff--;
  15478. wordIndex = ((int)diff) / DTLS_WORD_BITS;
  15479. wordOffset = ((int)diff) % DTLS_WORD_BITS;
  15480. if (window[wordIndex] & (1 << wordOffset))
  15481. return 0;
  15482. return 1;
  15483. }
  15484. #endif /* WOLFSSL_DTLS13 */
  15485. #ifdef WOLFSSL_MULTICAST
  15486. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  15487. word32 second, word32 high)
  15488. {
  15489. word32 newCur = 0;
  15490. if (cur < first)
  15491. newCur = first;
  15492. else if (cur < second)
  15493. newCur = second;
  15494. else if (cur < high)
  15495. newCur = high;
  15496. return newCur;
  15497. }
  15498. #endif /* WOLFSSL_MULTICAST */
  15499. /* diff is the difference between the message sequence and the
  15500. * expected sequence number. 0 is special where it is an overflow. */
  15501. static void _DtlsUpdateWindowGTSeq(word32 diff, word32* window)
  15502. {
  15503. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  15504. if (diff == 0 || diff >= DTLS_SEQ_BITS)
  15505. XMEMSET(window, 0, DTLS_SEQ_SZ);
  15506. else {
  15507. word32 i;
  15508. word32 temp = 0;
  15509. word32 idx = diff / DTLS_WORD_BITS;
  15510. diff %= DTLS_WORD_BITS;
  15511. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  15512. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  15513. if (i < idx)
  15514. window[i] = 0;
  15515. else {
  15516. temp |= (oldWindow[i-idx] << diff);
  15517. window[i] = temp;
  15518. if (diff > 0)
  15519. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - diff);
  15520. else
  15521. temp = 0;
  15522. }
  15523. }
  15524. }
  15525. window[0] |= 1;
  15526. }
  15527. int wolfSSL_DtlsUpdateWindow(word16 cur_hi, word32 cur_lo,
  15528. word16* next_hi, word32* next_lo, word32 *window)
  15529. {
  15530. word32 diff;
  15531. int curLT;
  15532. if (cur_hi == *next_hi) {
  15533. curLT = cur_lo < *next_lo;
  15534. diff = curLT ? *next_lo - cur_lo : cur_lo - *next_lo;
  15535. }
  15536. else {
  15537. if (cur_hi > *next_hi + 1) {
  15538. /* reset window */
  15539. _DtlsUpdateWindowGTSeq(0, window);
  15540. *next_lo = cur_lo + 1;
  15541. if (*next_lo == 0)
  15542. *next_hi = cur_hi + 1;
  15543. else
  15544. *next_hi = cur_hi;
  15545. return 1;
  15546. }
  15547. else if (*next_hi > cur_hi + 1) {
  15548. return 1;
  15549. }
  15550. else {
  15551. curLT = cur_hi < *next_hi;
  15552. if (curLT) {
  15553. if (*next_lo < DTLS_SEQ_BITS &&
  15554. cur_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS)) {
  15555. /* diff here can still result in a difference that can not
  15556. * be stored in the window. The index is checked against
  15557. * WOLFSSL_DTLS_WINDOW_WORDS later. */
  15558. diff = *next_lo + ((word32)0xFFFFFFFF - cur_lo) + 1;
  15559. }
  15560. else {
  15561. /* Too far back to update */
  15562. return 1;
  15563. }
  15564. }
  15565. else {
  15566. if (*next_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS) &&
  15567. cur_lo < DTLS_SEQ_BITS) {
  15568. /* diff here can still result in a difference that can not
  15569. * be stored in the window. The index is checked against
  15570. * WOLFSSL_DTLS_WINDOW_WORDS later. */
  15571. diff = cur_lo - *next_lo;
  15572. }
  15573. else {
  15574. _DtlsUpdateWindowGTSeq(0, window);
  15575. *next_lo = cur_lo + 1;
  15576. if (*next_lo == 0)
  15577. *next_hi = cur_hi + 1;
  15578. else
  15579. *next_hi = cur_hi;
  15580. return 1;
  15581. }
  15582. }
  15583. }
  15584. }
  15585. if (curLT) {
  15586. word32 idx;
  15587. diff--;
  15588. idx = diff / DTLS_WORD_BITS;
  15589. diff %= DTLS_WORD_BITS;
  15590. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  15591. window[idx] |= (1U << diff);
  15592. }
  15593. else {
  15594. _DtlsUpdateWindowGTSeq(diff + 1, window);
  15595. *next_lo = cur_lo + 1;
  15596. if (*next_lo == 0)
  15597. *next_hi = cur_hi + 1;
  15598. else
  15599. *next_hi = cur_hi;
  15600. }
  15601. return 1;
  15602. }
  15603. int DtlsUpdateWindow(WOLFSSL* ssl)
  15604. {
  15605. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  15606. word16 *next_hi;
  15607. word32 *next_lo;
  15608. word32* window;
  15609. #ifdef WOLFSSL_MULTICAST
  15610. word32 cur_lo = ssl->keys.curSeq_lo;
  15611. if (ssl->options.haveMcast) {
  15612. WOLFSSL_DTLS_PEERSEQ* p;
  15613. int i;
  15614. peerSeq = NULL;
  15615. for (i = 0, p = ssl->keys.peerSeq;
  15616. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  15617. i++, p++) {
  15618. if (p->peerId == ssl->keys.curPeerId) {
  15619. peerSeq = p;
  15620. break;
  15621. }
  15622. }
  15623. if (peerSeq == NULL) {
  15624. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  15625. return 0;
  15626. }
  15627. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  15628. int cbError = 0;
  15629. if (ssl->ctx->mcastHwCb)
  15630. cbError = ssl->ctx->mcastHwCb(p->peerId,
  15631. ssl->ctx->mcastMaxSeq,
  15632. cur_lo, ssl->mcastHwCbCtx);
  15633. if (cbError) {
  15634. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  15635. return MCAST_HIGHWATER_CB_E;
  15636. }
  15637. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  15638. ssl->ctx->mcastFirstSeq,
  15639. ssl->ctx->mcastSecondSeq,
  15640. ssl->ctx->mcastMaxSeq);
  15641. }
  15642. }
  15643. #endif
  15644. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  15645. next_hi = &peerSeq->nextSeq_hi;
  15646. next_lo = &peerSeq->nextSeq_lo;
  15647. window = peerSeq->window;
  15648. }
  15649. else {
  15650. next_hi = &peerSeq->prevSeq_hi;
  15651. next_lo = &peerSeq->prevSeq_lo;
  15652. window = peerSeq->prevWindow;
  15653. }
  15654. return wolfSSL_DtlsUpdateWindow(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo,
  15655. next_hi, next_lo, window);
  15656. }
  15657. #ifdef WOLFSSL_DTLS13
  15658. /* Update DTLS 1.3 window
  15659. * Return
  15660. * 0 on successful update
  15661. * <0 on error
  15662. */
  15663. static int Dtls13UpdateWindow(WOLFSSL* ssl)
  15664. {
  15665. w64wrapper nextSeq, seq;
  15666. w64wrapper diff64;
  15667. word32 *window;
  15668. int wordOffset;
  15669. int wordIndex;
  15670. word32 diff;
  15671. Dtls13Epoch* e = ssl->dtls13DecryptEpoch;
  15672. WOLFSSL_ENTER("Dtls13UpdateWindow");
  15673. if (ssl->dtls13DecryptEpoch == NULL) {
  15674. WOLFSSL_MSG("Can't find decrypting Epoch");
  15675. return BAD_STATE_E;
  15676. }
  15677. if (!w64Equal(ssl->keys.curEpoch64, ssl->dtls13DecryptEpoch->epochNumber)) {
  15678. /* ssl->dtls13DecryptEpoch has been updated since we received the msg */
  15679. e = Dtls13GetEpoch(ssl, ssl->keys.curEpoch64);
  15680. if (e == NULL) {
  15681. WOLFSSL_MSG("Can't find decrypting Epoch");
  15682. return BAD_STATE_E;
  15683. }
  15684. }
  15685. nextSeq = e->nextPeerSeqNumber;
  15686. window = e->window;
  15687. seq = ssl->keys.curSeq;
  15688. /* seq < nextSeq */
  15689. if (w64LT(seq, nextSeq)) {
  15690. diff64 = w64Sub(nextSeq, seq);
  15691. /* zero based index */
  15692. w64Decrement(&diff64);
  15693. /* FIXME: check that diff64 < DTLS_WORDS_BITS */
  15694. diff = w64GetLow32(diff64);
  15695. wordIndex = ((int)diff) / DTLS_WORD_BITS;
  15696. wordOffset = ((int)diff) % DTLS_WORD_BITS;
  15697. if (wordIndex >= WOLFSSL_DTLS_WINDOW_WORDS) {
  15698. WOLFSSL_MSG("Invalid sequence number to Dtls13UpdateWindow");
  15699. return BAD_STATE_E;
  15700. }
  15701. window[wordIndex] |= (1 << wordOffset);
  15702. return 0;
  15703. }
  15704. /* seq >= nextSeq, seq - nextSeq */
  15705. diff64 = w64Sub(seq, nextSeq);
  15706. /* as we are considering nextSeq inside the window, we should add + 1 */
  15707. w64Increment(&diff64);
  15708. _DtlsUpdateWindowGTSeq(w64GetLow32(diff64), window);
  15709. w64Increment(&seq);
  15710. e->nextPeerSeqNumber = seq;
  15711. return 0;
  15712. }
  15713. int Dtls13UpdateWindowRecordRecvd(WOLFSSL* ssl)
  15714. {
  15715. int ret = Dtls13UpdateWindow(ssl);
  15716. if (ret != 0)
  15717. return ret;
  15718. return Dtls13RecordRecvd(ssl);
  15719. }
  15720. #endif /* WOLFSSL_DTLS13 */
  15721. int DtlsMsgDrain(WOLFSSL* ssl)
  15722. {
  15723. DtlsMsg* item = ssl->dtls_rx_msg_list;
  15724. int ret = 0;
  15725. WOLFSSL_ENTER("DtlsMsgDrain");
  15726. /* While there is an item in the store list, and it is the expected
  15727. * message, and it is complete, and there hasn't been an error in the
  15728. * last message... */
  15729. while (item != NULL &&
  15730. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  15731. item->ready && ret == 0) {
  15732. word32 idx = 0;
  15733. #ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS
  15734. ret = MsgCheckEncryption(ssl, item->type, item->encrypted);
  15735. if (ret != 0) {
  15736. SendAlert(ssl, alert_fatal, unexpected_message);
  15737. break;
  15738. }
  15739. #endif
  15740. #ifdef WOLFSSL_NO_TLS12
  15741. ret = DoTls13HandShakeMsgType(ssl, item->fullMsg, &idx, item->type,
  15742. item->sz, item->sz);
  15743. #else
  15744. ret = DoHandShakeMsgType(ssl, item->fullMsg, &idx, item->type,
  15745. item->sz, item->sz);
  15746. #endif
  15747. if (ret == 0) {
  15748. DtlsTxMsgListClean(ssl);
  15749. }
  15750. else if (!IsAtLeastTLSv1_3(ssl->version)) {
  15751. if (SendFatalAlertOnly(ssl, ret) == SOCKET_ERROR_E) {
  15752. ret = SOCKET_ERROR_E;
  15753. }
  15754. }
  15755. #ifdef WOLFSSL_ASYNC_CRYPT
  15756. if (ret == WC_PENDING_E) {
  15757. break;
  15758. }
  15759. #endif
  15760. ssl->dtls_rx_msg_list = item->next;
  15761. DtlsMsgDelete(item, ssl->heap);
  15762. item = ssl->dtls_rx_msg_list;
  15763. ssl->dtls_rx_msg_list_sz--;
  15764. }
  15765. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  15766. return ret;
  15767. }
  15768. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  15769. word32 totalSz)
  15770. {
  15771. byte type;
  15772. word32 size;
  15773. word32 fragOffset, fragSz;
  15774. int ret = 0;
  15775. int ignoreFinished = 0;
  15776. WOLFSSL_ENTER("DoDtlsHandShakeMsg");
  15777. /* parse header */
  15778. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  15779. &size, &fragOffset, &fragSz, totalSz) != 0) {
  15780. WOLFSSL_ERROR(PARSE_ERROR);
  15781. return PARSE_ERROR;
  15782. }
  15783. ret = EarlySanityCheckMsgReceived(ssl, type, fragSz);
  15784. if (ret != 0) {
  15785. WOLFSSL_ERROR(ret);
  15786. return ret;
  15787. }
  15788. /* Cap the maximum size of a handshake message to something reasonable.
  15789. * By default is the maximum size of a certificate message assuming
  15790. * nine 2048-bit RSA certificates in the chain. */
  15791. if (size > MAX_HANDSHAKE_SZ) {
  15792. WOLFSSL_MSG("Handshake message too large");
  15793. return HANDSHAKE_SIZE_ERROR;
  15794. }
  15795. /* check that we have complete fragment */
  15796. if (*inOutIdx + fragSz > totalSz) {
  15797. WOLFSSL_ERROR(INCOMPLETE_DATA);
  15798. return INCOMPLETE_DATA;
  15799. }
  15800. /* check that the fragment is contained in the message */
  15801. if (fragOffset + fragSz > size) {
  15802. WOLFSSL_ERROR(LENGTH_ERROR);
  15803. return LENGTH_ERROR;
  15804. }
  15805. if (type == finished && ssl->keys.dtls_peer_handshake_number >=
  15806. ssl->keys.dtls_expected_peer_handshake_number &&
  15807. ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
  15808. /* finished msg should be ignore from the current epoch
  15809. * if it comes from a previous handshake */
  15810. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  15811. ignoreFinished = ssl->options.connectState < FINISHED_DONE;
  15812. }
  15813. else {
  15814. ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
  15815. }
  15816. }
  15817. #if !defined(NO_WOLFSSL_SERVER)
  15818. if (ssl->options.side == WOLFSSL_SERVER_END &&
  15819. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE &&
  15820. type != client_hello) {
  15821. WOLFSSL_MSG("Ignoring other messages before we verify a ClientHello");
  15822. *inOutIdx = totalSz;
  15823. return 0;
  15824. }
  15825. #endif
  15826. /* Check the handshake sequence number first. If out of order,
  15827. * add the current message to the list. If the message is in order,
  15828. * but it is a fragment, add the current message to the list, then
  15829. * check the head of the list to see if it is complete, if so, pop
  15830. * it out as the current message. If the message is complete and in
  15831. * order, process it. Check the head of the list to see if it is in
  15832. * order, if so, process it. (Repeat until list exhausted.) If the
  15833. * head is out of order, return for more processing.
  15834. */
  15835. if (ssl->keys.dtls_peer_handshake_number >
  15836. ssl->keys.dtls_expected_peer_handshake_number &&
  15837. /* Only client_hello shouldn't be ignored if the handshake
  15838. * num is greater */
  15839. (type == client_hello ||
  15840. ssl->options.handShakeState != HANDSHAKE_DONE) &&
  15841. !ignoreFinished) {
  15842. /* Current message is out of order. It will get stored in the list.
  15843. * Storing also takes care of defragmentation. If the messages is a
  15844. * client hello, we need to process this out of order; the server
  15845. * is not supposed to keep state, but the second client hello will
  15846. * have a different handshake sequence number than is expected, and
  15847. * the server shouldn't be expecting any particular handshake sequence
  15848. * number. (If the cookie changes multiple times in quick succession,
  15849. * the client could be sending multiple new client hello messages
  15850. * with newer and newer cookies.) */
  15851. if (type != client_hello) {
  15852. WOLFSSL_MSG("Current message is out of order");
  15853. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  15854. WOLFSSL_MSG("Reached rx msg limit error");
  15855. return DTLS_TOO_MANY_FRAGMENTS_E;
  15856. }
  15857. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  15858. ssl->keys.dtls_peer_handshake_number,
  15859. input + *inOutIdx, size, type,
  15860. fragOffset, fragSz, ssl->heap);
  15861. *inOutIdx += fragSz;
  15862. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15863. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  15864. word32 digestSz = MacSize(ssl);
  15865. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) {
  15866. WOLFSSL_ERROR(BUFFER_E);
  15867. return BUFFER_E;
  15868. }
  15869. *inOutIdx += digestSz;
  15870. }
  15871. else
  15872. #endif
  15873. {
  15874. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  15875. WOLFSSL_ERROR(BUFFER_E);
  15876. return BUFFER_E;
  15877. }
  15878. }
  15879. *inOutIdx += ssl->keys.padSz;
  15880. ret = 0;
  15881. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  15882. /* If we receive an out of order last flight msg then retransmit */
  15883. if (type == server_hello_done || type == finished) {
  15884. ret = DtlsMsgPoolSend(ssl, 0);
  15885. }
  15886. #endif
  15887. }
  15888. else {
  15889. if (fragSz < size) {
  15890. /* a fragmented ClientHello, very probably forged or
  15891. erroneous. Even if the packet is valid, we don't want to save
  15892. state while processing a ClientHello to avoid DoS attacks */
  15893. WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
  15894. *inOutIdx = totalSz;
  15895. }
  15896. else {
  15897. #ifdef WOLFSSL_NO_TLS12
  15898. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  15899. totalSz);
  15900. #else
  15901. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size,
  15902. totalSz);
  15903. #endif
  15904. }
  15905. }
  15906. }
  15907. else if (ssl->keys.dtls_peer_handshake_number <
  15908. ssl->keys.dtls_expected_peer_handshake_number ||
  15909. /* ignore all handshake messages if we are done with the
  15910. * handshake */
  15911. (ssl->keys.dtls_peer_handshake_number >
  15912. ssl->keys.dtls_expected_peer_handshake_number &&
  15913. ssl->options.handShakeState == HANDSHAKE_DONE) ||
  15914. ignoreFinished) {
  15915. /* Already saw this message and processed it. It can be ignored. */
  15916. WOLFSSL_MSG("Already saw this message and processed it");
  15917. *inOutIdx += fragSz;
  15918. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15919. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  15920. word32 digestSz = MacSize(ssl);
  15921. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) {
  15922. WOLFSSL_ERROR(BUFFER_E);
  15923. return BUFFER_E;
  15924. }
  15925. *inOutIdx += digestSz;
  15926. }
  15927. else
  15928. #endif
  15929. {
  15930. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  15931. WOLFSSL_ERROR(BUFFER_E);
  15932. return BUFFER_E;
  15933. }
  15934. }
  15935. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  15936. if (IsDtlsNotSctpMode(ssl) &&
  15937. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  15938. ret = DtlsMsgPoolSend(ssl, 0);
  15939. }
  15940. #endif
  15941. *inOutIdx += ssl->keys.padSz;
  15942. }
  15943. else if (fragSz < size) {
  15944. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  15945. * be pointing to the message with this fragment in it. Check it to see
  15946. * if it is completed. */
  15947. WOLFSSL_MSG("Branch is in order, but fragmented");
  15948. if (type == client_hello) {
  15949. WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
  15950. *inOutIdx = totalSz;
  15951. return 0;
  15952. }
  15953. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  15954. WOLFSSL_MSG("Reached rx msg limit error");
  15955. WOLFSSL_ERROR(DTLS_TOO_MANY_FRAGMENTS_E);
  15956. return DTLS_TOO_MANY_FRAGMENTS_E;
  15957. }
  15958. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  15959. ssl->keys.dtls_peer_handshake_number,
  15960. input + *inOutIdx, size, type,
  15961. fragOffset, fragSz, ssl->heap);
  15962. *inOutIdx += fragSz;
  15963. *inOutIdx += ssl->keys.padSz;
  15964. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15965. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  15966. word32 digestSz = MacSize(ssl);
  15967. if (*inOutIdx + digestSz > totalSz) {
  15968. WOLFSSL_ERROR(BUFFER_E);
  15969. return BUFFER_E;
  15970. }
  15971. *inOutIdx += digestSz;
  15972. }
  15973. #endif
  15974. ret = 0;
  15975. if (ssl->dtls_rx_msg_list != NULL && ssl->dtls_rx_msg_list->ready)
  15976. ret = DtlsMsgDrain(ssl);
  15977. }
  15978. else {
  15979. /* This branch is in order next, and a complete message. On success
  15980. * clean the tx list. */
  15981. WOLFSSL_MSG("Branch is in order and a complete message");
  15982. #ifdef WOLFSSL_ASYNC_CRYPT
  15983. if (ssl->devId != INVALID_DEVID) {
  15984. word32 idx = *inOutIdx;
  15985. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  15986. WOLFSSL_ERROR(BUFFER_ERROR);
  15987. return BUFFER_ERROR;
  15988. }
  15989. if (idx + fragSz + ssl->keys.padSz > totalSz)
  15990. return BUFFER_E;
  15991. *inOutIdx = idx + fragSz + ssl->keys.padSz;
  15992. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15993. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  15994. word32 digestSz = MacSize(ssl);
  15995. if (*inOutIdx + digestSz > totalSz)
  15996. return BUFFER_E;
  15997. *inOutIdx += digestSz;
  15998. }
  15999. #endif
  16000. /* In async mode always store the message and process it with
  16001. * DtlsMsgDrain because in case of a WC_PENDING_E it will be
  16002. * easier this way. */
  16003. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  16004. WOLFSSL_MSG("Reached rx msg limit error");
  16005. return DTLS_TOO_MANY_FRAGMENTS_E;
  16006. }
  16007. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  16008. ssl->keys.dtls_peer_handshake_number,
  16009. input + idx, size, type,
  16010. fragOffset, fragSz, ssl->heap);
  16011. ret = DtlsMsgDrain(ssl);
  16012. }
  16013. else
  16014. #endif
  16015. {
  16016. #ifdef WOLFSSL_NO_TLS12
  16017. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  16018. totalSz);
  16019. #else
  16020. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  16021. #endif
  16022. if (ret == 0) {
  16023. DtlsTxMsgListClean(ssl);
  16024. if (ssl->dtls_rx_msg_list != NULL) {
  16025. ret = DtlsMsgDrain(ssl);
  16026. }
  16027. }
  16028. }
  16029. }
  16030. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  16031. return ret;
  16032. }
  16033. #endif /* WOLFSSL_DTLS13 */
  16034. #ifndef WOLFSSL_NO_TLS12
  16035. #ifdef HAVE_AEAD
  16036. #if (!defined(NO_PUBLIC_GCM_SET_IV) && \
  16037. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  16038. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
  16039. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
  16040. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  16041. {
  16042. int i;
  16043. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  16044. if (++ssl->keys.aead_exp_IV[i]) return;
  16045. }
  16046. }
  16047. #endif
  16048. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && !defined(NO_CHAPOL_AEAD)
  16049. /* Used for the older version of creating AEAD tags with Poly1305 */
  16050. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  16051. byte* cipher, word16 sz, byte* tag)
  16052. {
  16053. int ret = 0;
  16054. int msglen = (sz - ssl->specs.aead_mac_size);
  16055. word32 keySz = 32;
  16056. byte padding[8]; /* used to temporarily store lengths */
  16057. #ifdef CHACHA_AEAD_TEST
  16058. printf("Using old version of poly1305 input.\n");
  16059. #endif
  16060. if (msglen < 0)
  16061. return INPUT_CASE_ERROR;
  16062. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  16063. return ret;
  16064. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  16065. AEAD_AUTH_DATA_SZ)) != 0)
  16066. return ret;
  16067. /* length of additional input plus padding */
  16068. XMEMSET(padding, 0, sizeof(padding));
  16069. padding[0] = AEAD_AUTH_DATA_SZ;
  16070. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  16071. sizeof(padding))) != 0)
  16072. return ret;
  16073. /* add cipher info and then its length */
  16074. XMEMSET(padding, 0, sizeof(padding));
  16075. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  16076. return ret;
  16077. /* 32 bit size of cipher to 64 bit endian */
  16078. padding[0] = msglen & 0xff;
  16079. padding[1] = (msglen >> 8) & 0xff;
  16080. padding[2] = ((word32)msglen >> 16) & 0xff;
  16081. padding[3] = ((word32)msglen >> 24) & 0xff;
  16082. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  16083. != 0)
  16084. return ret;
  16085. /* generate tag */
  16086. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  16087. return ret;
  16088. return ret;
  16089. }
  16090. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  16091. * the implementation follows an older draft for creating the nonce and MAC.
  16092. * The flag oldPoly gets set automatically depending on what cipher suite was
  16093. * negotiated in the handshake. This is able to be done because the IDs for the
  16094. * cipher suites was updated in RFC7905 giving unique values for the older
  16095. * draft in comparison to the more recent RFC.
  16096. *
  16097. * ssl WOLFSSL structure to get cipher and TLS state from
  16098. * out output buffer to hold encrypted data
  16099. * input data to encrypt
  16100. * sz size of input
  16101. *
  16102. * Return 0 on success negative values in error case
  16103. */
  16104. int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  16105. word16 sz)
  16106. {
  16107. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  16108. int ret = 0;
  16109. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  16110. byte tag[POLY1305_AUTH_SZ];
  16111. byte add[AEAD_AUTH_DATA_SZ];
  16112. byte nonce[CHACHA20_NONCE_SZ];
  16113. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  16114. #ifdef CHACHA_AEAD_TEST
  16115. int i;
  16116. #endif
  16117. Keys* keys = &ssl->keys;
  16118. XMEMSET(tag, 0, sizeof(tag));
  16119. XMEMSET(nonce, 0, sizeof(nonce));
  16120. XMEMSET(poly, 0, sizeof(poly));
  16121. XMEMSET(add, 0, sizeof(add));
  16122. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  16123. /*
  16124. * For epochs 2+:
  16125. * * use ssl->secure_renegotiation when encrypting the current epoch as it
  16126. * has the current epoch cipher material
  16127. * * use PREV_ORDER if encrypting the epoch not in
  16128. * ssl->secure_renegotiation
  16129. */
  16130. /* opaque SEQ number stored for AD */
  16131. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  16132. if (ssl->keys.dtls_epoch ==
  16133. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  16134. keys = &ssl->secure_renegotiation->tmp_keys;
  16135. WriteSEQ(ssl, CUR_ORDER, add);
  16136. }
  16137. else
  16138. WriteSEQ(ssl, PREV_ORDER, add);
  16139. }
  16140. else
  16141. #endif
  16142. WriteSEQ(ssl, CUR_ORDER, add);
  16143. if (ssl->options.oldPoly != 0) {
  16144. /* get nonce. SEQ should not be incremented again here */
  16145. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  16146. }
  16147. /* Store the type, version. Unfortunately, they are in
  16148. * the input buffer ahead of the plaintext. */
  16149. #ifdef WOLFSSL_DTLS
  16150. if (ssl->options.dtls) {
  16151. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  16152. }
  16153. #endif
  16154. /* add TLS message size to additional data */
  16155. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  16156. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  16157. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  16158. #ifdef CHACHA_AEAD_TEST
  16159. printf("Encrypt Additional : ");
  16160. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  16161. printf("%02x", add[i]);
  16162. }
  16163. printf("\n\n");
  16164. printf("input before encryption :\n");
  16165. for (i = 0; i < sz; i++) {
  16166. printf("%02x", input[i]);
  16167. if ((i + 1) % 16 == 0)
  16168. printf("\n");
  16169. }
  16170. printf("\n");
  16171. #endif
  16172. if (ssl->options.oldPoly == 0) {
  16173. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  16174. * record sequence number XORed with client_write_IV/server_write_IV */
  16175. XMEMCPY(nonce, keys->aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  16176. nonce[4] ^= add[0];
  16177. nonce[5] ^= add[1];
  16178. nonce[6] ^= add[2];
  16179. nonce[7] ^= add[3];
  16180. nonce[8] ^= add[4];
  16181. nonce[9] ^= add[5];
  16182. nonce[10] ^= add[6];
  16183. nonce[11] ^= add[7];
  16184. }
  16185. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16186. wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
  16187. #endif
  16188. /* set the nonce for chacha and get poly1305 key */
  16189. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  16190. ForceZero(nonce, CHACHA20_NONCE_SZ);
  16191. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16192. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  16193. #endif
  16194. return ret;
  16195. }
  16196. /* create Poly1305 key using chacha20 keystream */
  16197. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  16198. poly, sizeof(poly))) != 0) {
  16199. ForceZero(nonce, CHACHA20_NONCE_SZ);
  16200. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16201. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  16202. #endif
  16203. return ret;
  16204. }
  16205. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16206. wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
  16207. #endif
  16208. /* set the counter after getting poly1305 key */
  16209. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
  16210. ForceZero(nonce, CHACHA20_NONCE_SZ);
  16211. ForceZero(poly, sizeof(poly));
  16212. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16213. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  16214. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16215. #endif
  16216. return ret;
  16217. }
  16218. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  16219. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16220. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  16221. #endif
  16222. /* encrypt the plain text */
  16223. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  16224. input, msgLen)) != 0) {
  16225. ForceZero(poly, sizeof(poly));
  16226. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16227. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16228. #endif
  16229. return ret;
  16230. }
  16231. /* get the poly1305 tag using either old padding scheme or more recent */
  16232. if (ssl->options.oldPoly != 0) {
  16233. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  16234. poly, sz, tag)) != 0) {
  16235. ForceZero(poly, sizeof(poly));
  16236. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16237. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16238. #endif
  16239. return ret;
  16240. }
  16241. }
  16242. else {
  16243. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  16244. sizeof(poly))) != 0) {
  16245. ForceZero(poly, sizeof(poly));
  16246. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16247. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16248. #endif
  16249. return ret;
  16250. }
  16251. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  16252. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  16253. ForceZero(poly, sizeof(poly));
  16254. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16255. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16256. #endif
  16257. return ret;
  16258. }
  16259. }
  16260. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  16261. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16262. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16263. #endif
  16264. /* append tag to ciphertext */
  16265. XMEMCPY(out + msgLen, tag, sizeof(tag));
  16266. AeadIncrementExpIV(ssl);
  16267. #ifdef CHACHA_AEAD_TEST
  16268. printf("mac tag :\n");
  16269. for (i = 0; i < 16; i++) {
  16270. printf("%02x", tag[i]);
  16271. if ((i + 1) % 16 == 0)
  16272. printf("\n");
  16273. }
  16274. printf("\n\noutput after encrypt :\n");
  16275. for (i = 0; i < sz; i++) {
  16276. printf("%02x", out[i]);
  16277. if ((i + 1) % 16 == 0)
  16278. printf("\n");
  16279. }
  16280. printf("\n");
  16281. #endif
  16282. return ret;
  16283. }
  16284. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  16285. * the implementation follows an older draft for creating the nonce and MAC.
  16286. * The flag oldPoly gets set automatically depending on what cipher suite was
  16287. * negotiated in the handshake. This is able to be done because the IDs for the
  16288. * cipher suites was updated in RFC7905 giving unique values for the older
  16289. * draft in comparison to the more recent RFC.
  16290. *
  16291. * ssl WOLFSSL structure to get cipher and TLS state from
  16292. * plain output buffer to hold decrypted data
  16293. * input data to decrypt
  16294. * sz size of input
  16295. *
  16296. * Return 0 on success negative values in error case
  16297. */
  16298. int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  16299. word16 sz)
  16300. {
  16301. byte add[AEAD_AUTH_DATA_SZ];
  16302. byte nonce[CHACHA20_NONCE_SZ];
  16303. byte tag[POLY1305_AUTH_SZ];
  16304. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  16305. int ret = 0;
  16306. int msgLen = (sz - ssl->specs.aead_mac_size);
  16307. Keys* keys = &ssl->keys;
  16308. #ifdef CHACHA_AEAD_TEST
  16309. int i;
  16310. printf("input before decrypt :\n");
  16311. for (i = 0; i < sz; i++) {
  16312. printf("%02x", input[i]);
  16313. if ((i + 1) % 16 == 0)
  16314. printf("\n");
  16315. }
  16316. printf("\n");
  16317. #endif
  16318. XMEMSET(tag, 0, sizeof(tag));
  16319. XMEMSET(poly, 0, sizeof(poly));
  16320. XMEMSET(nonce, 0, sizeof(nonce));
  16321. XMEMSET(add, 0, sizeof(add));
  16322. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  16323. /*
  16324. * For epochs 2+:
  16325. * * use ssl->secure_renegotiation when decrypting the latest epoch as it
  16326. * has the latest epoch cipher material
  16327. */
  16328. if (ssl->options.dtls && DtlsSCRKeysSet(ssl) &&
  16329. ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  16330. keys = &ssl->secure_renegotiation->tmp_keys;
  16331. #endif
  16332. /* sequence number field is 64-bits */
  16333. WriteSEQ(ssl, PEER_ORDER, add);
  16334. if (ssl->options.oldPoly != 0) {
  16335. /* get nonce, SEQ should not be incremented again here */
  16336. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  16337. }
  16338. /* get AD info */
  16339. /* Store the type, version. */
  16340. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  16341. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  16342. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  16343. /* add TLS message size to additional data */
  16344. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  16345. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  16346. #ifdef CHACHA_AEAD_TEST
  16347. printf("Decrypt Additional : ");
  16348. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  16349. printf("%02x", add[i]);
  16350. }
  16351. printf("\n\n");
  16352. #endif
  16353. if (ssl->options.oldPoly == 0) {
  16354. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  16355. * record sequence number XORed with client_write_IV/server_write_IV */
  16356. XMEMCPY(nonce, keys->aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  16357. nonce[4] ^= add[0];
  16358. nonce[5] ^= add[1];
  16359. nonce[6] ^= add[2];
  16360. nonce[7] ^= add[3];
  16361. nonce[8] ^= add[4];
  16362. nonce[9] ^= add[5];
  16363. nonce[10] ^= add[6];
  16364. nonce[11] ^= add[7];
  16365. }
  16366. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16367. wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
  16368. #endif
  16369. /* set nonce and get poly1305 key */
  16370. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  16371. ForceZero(nonce, CHACHA20_NONCE_SZ);
  16372. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16373. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  16374. #endif
  16375. return ret;
  16376. }
  16377. /* use chacha20 keystream to get poly1305 key for tag */
  16378. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  16379. poly, sizeof(poly))) != 0) {
  16380. ForceZero(nonce, CHACHA20_NONCE_SZ);
  16381. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16382. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  16383. #endif
  16384. return ret;
  16385. }
  16386. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16387. wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
  16388. #endif
  16389. /* set counter after getting poly1305 key */
  16390. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
  16391. ForceZero(nonce, CHACHA20_NONCE_SZ);
  16392. ForceZero(poly, sizeof(poly));
  16393. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16394. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  16395. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16396. #endif
  16397. return ret;
  16398. }
  16399. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  16400. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16401. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  16402. #endif
  16403. /* get the tag using Poly1305 */
  16404. if (ssl->options.oldPoly != 0) {
  16405. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  16406. ForceZero(poly, sizeof(poly));
  16407. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16408. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16409. #endif
  16410. return ret;
  16411. }
  16412. }
  16413. else {
  16414. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  16415. sizeof(poly))) != 0) {
  16416. ForceZero(poly, sizeof(poly));
  16417. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16418. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16419. #endif
  16420. return ret;
  16421. }
  16422. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  16423. sizeof(add), input, msgLen, tag, sizeof(tag))) != 0) {
  16424. ForceZero(poly, sizeof(poly));
  16425. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16426. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16427. #endif
  16428. return ret;
  16429. }
  16430. }
  16431. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  16432. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16433. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  16434. #endif
  16435. /* check tag sent along with packet */
  16436. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  16437. WOLFSSL_MSG("MAC did not match");
  16438. if (!ssl->options.dtls)
  16439. SendAlert(ssl, alert_fatal, bad_record_mac);
  16440. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16441. return VERIFY_MAC_ERROR;
  16442. }
  16443. /* if the tag was good decrypt message */
  16444. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  16445. input, msgLen)) != 0)
  16446. return ret;
  16447. #ifdef CHACHA_AEAD_TEST
  16448. printf("plain after decrypt :\n");
  16449. for (i = 0; i < sz; i++) {
  16450. printf("%02x", plain[i]);
  16451. if ((i + 1) % 16 == 0)
  16452. printf("\n");
  16453. }
  16454. printf("\n");
  16455. #endif
  16456. return ret;
  16457. }
  16458. #endif /* HAVE_CHACHA && HAVE_POLY1305 && !NO_CHAPOL_AEAD*/
  16459. #endif /* HAVE_AEAD */
  16460. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  16461. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  16462. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  16463. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  16464. /* The following type is used to share code between AES-GCM and AES-CCM. */
  16465. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  16466. const byte* in, word32 sz,
  16467. byte* iv, word32 ivSz,
  16468. byte* authTag, word32 authTagSz,
  16469. const byte* authIn, word32 authInSz);
  16470. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  16471. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  16472. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  16473. #else
  16474. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  16475. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  16476. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  16477. #endif
  16478. #endif
  16479. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  16480. /* The following type is used to share code between SM4-GCM and SM4-CCM. */
  16481. typedef int (*Sm4AuthEncryptFunc)(wc_Sm4* sm4, byte* out, const byte* in,
  16482. word32 sz, const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz,
  16483. const byte* aad, word32 aadSz);
  16484. typedef int (*Sm4AuthDecryptFunc)(wc_Sm4* sm4, byte* out, const byte* in,
  16485. word32 sz, const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz,
  16486. const byte* aad, word32 aadSz);
  16487. #define SM4_AUTH_ENCRYPT_FUNC Sm4AuthEncryptFunc
  16488. #define SM4_AUTH_DECRYPT_FUNC Sm4AuthDecryptFunc
  16489. #define SM4_GCM_ENCRYPT_FUNC wc_Sm4GcmEncrypt
  16490. #define SM4_CCM_ENCRYPT_FUNC wc_Sm4CcmEncrypt
  16491. #define SM4_GCM_DECRYPT_FUNC wc_Sm4GcmDecrypt
  16492. #define SM4_CCM_DECRYPT_FUNC wc_Sm4CcmDecrypt
  16493. #endif
  16494. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  16495. word16 sz, int asyncOkay)
  16496. {
  16497. int ret = 0;
  16498. #ifdef WOLFSSL_ASYNC_CRYPT
  16499. WC_ASYNC_DEV* asyncDev = NULL;
  16500. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  16501. #else
  16502. (void)asyncOkay;
  16503. #endif
  16504. (void)out;
  16505. (void)input;
  16506. (void)sz;
  16507. if (input == NULL) {
  16508. return BAD_FUNC_ARG;
  16509. }
  16510. switch (ssl->specs.bulk_cipher_algorithm) {
  16511. #ifdef BUILD_ARC4
  16512. case wolfssl_rc4:
  16513. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  16514. break;
  16515. #endif
  16516. #ifdef BUILD_DES3
  16517. case wolfssl_triple_des:
  16518. #ifdef WOLFSSL_ASYNC_CRYPT
  16519. /* initialize event */
  16520. asyncDev = &ssl->encrypt.des3->asyncDev;
  16521. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  16522. if (ret != 0)
  16523. break;
  16524. #endif
  16525. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  16526. #ifdef WOLFSSL_ASYNC_CRYPT
  16527. if (ret == WC_PENDING_E && asyncOkay) {
  16528. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  16529. }
  16530. #endif
  16531. break;
  16532. #endif
  16533. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  16534. case wolfssl_aes:
  16535. #ifdef WOLFSSL_ASYNC_CRYPT
  16536. /* initialize event */
  16537. asyncDev = &ssl->encrypt.aes->asyncDev;
  16538. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  16539. if (ret != 0)
  16540. break;
  16541. #endif
  16542. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  16543. #ifdef WOLFSSL_ASYNC_CRYPT
  16544. if (ret == WC_PENDING_E && asyncOkay) {
  16545. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  16546. }
  16547. #endif
  16548. break;
  16549. #endif
  16550. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  16551. case wolfssl_aes_gcm:
  16552. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  16553. {
  16554. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  16555. const byte* additionalSrc;
  16556. #ifdef WOLFSSL_ASYNC_CRYPT
  16557. /* initialize event */
  16558. asyncDev = &ssl->encrypt.aes->asyncDev;
  16559. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  16560. if (ret != 0)
  16561. break;
  16562. #endif
  16563. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  16564. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  16565. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  16566. #elif defined(BUILD_AESGCM)
  16567. aes_auth_fn = AES_GCM_ENCRYPT;
  16568. #else
  16569. aes_auth_fn = AES_CCM_ENCRYPT;
  16570. #endif
  16571. additionalSrc = input - 5;
  16572. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  16573. /* sequence number field is 64-bits */
  16574. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  16575. /* Store the type, version. Unfortunately, they are in
  16576. * the input buffer ahead of the plaintext. */
  16577. #ifdef WOLFSSL_DTLS
  16578. if (ssl->options.dtls) {
  16579. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  16580. }
  16581. #endif
  16582. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  16583. additionalSrc, 3);
  16584. /* Store the length of the plain text minus the explicit
  16585. * IV length minus the authentication tag size. */
  16586. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16587. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  16588. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  16589. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  16590. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  16591. XMEMCPY(ssl->encrypt.nonce,
  16592. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  16593. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  16594. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  16595. #endif
  16596. #ifdef HAVE_PK_CALLBACKS
  16597. ret = NOT_COMPILED_IN;
  16598. if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
  16599. ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 1,
  16600. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  16601. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16602. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  16603. out + sz - ssl->specs.aead_mac_size,
  16604. ssl->specs.aead_mac_size,
  16605. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  16606. }
  16607. if (ret == NOT_COMPILED_IN)
  16608. #endif /* HAVE_PK_CALLBACKS */
  16609. {
  16610. ret = aes_auth_fn(ssl->encrypt.aes,
  16611. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  16612. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16613. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  16614. out + sz - ssl->specs.aead_mac_size,
  16615. ssl->specs.aead_mac_size,
  16616. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  16617. }
  16618. #ifdef WOLFSSL_ASYNC_CRYPT
  16619. if (ret == WC_PENDING_E && asyncOkay) {
  16620. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  16621. }
  16622. #endif
  16623. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  16624. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  16625. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  16626. XMEMCPY(out,
  16627. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  16628. #endif
  16629. }
  16630. break;
  16631. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  16632. #ifdef HAVE_ARIA
  16633. case wolfssl_aria_gcm:
  16634. {
  16635. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  16636. byte *outBuf = NULL;
  16637. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  16638. /* sequence number field is 64-bits */
  16639. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  16640. /* Store the type, version. Unfortunately, they are in
  16641. * the input buffer ahead of the plaintext. */
  16642. #ifdef WOLFSSL_DTLS
  16643. if (ssl->options.dtls) {
  16644. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  16645. }
  16646. #endif
  16647. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  16648. additionalSrc, 3);
  16649. /* Store the length of the plain text minus the explicit
  16650. * IV length minus the authentication tag size. */
  16651. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16652. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  16653. XMEMCPY(ssl->encrypt.nonce,
  16654. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  16655. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  16656. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  16657. outBuf = (byte*)XMALLOC(sz - AESGCM_EXP_IV_SZ, ssl->heap,
  16658. DYNAMIC_TYPE_TMP_BUFFER);
  16659. if (outBuf == NULL) {
  16660. ret = MEMORY_ERROR;
  16661. break;
  16662. }
  16663. ret = wc_AriaEncrypt(ssl->encrypt.aria, outBuf,
  16664. (byte*) input + AESGCM_EXP_IV_SZ,
  16665. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16666. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  16667. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ,
  16668. out + sz - ssl->specs.aead_mac_size,
  16669. ssl->specs.aead_mac_size
  16670. );
  16671. if (ret != 0)
  16672. break;
  16673. XMEMCPY(out,
  16674. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  16675. XMEMCPY(out + AESGCM_EXP_IV_SZ,outBuf,sz - AESGCM_EXP_IV_SZ);
  16676. XFREE(outBuf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  16677. break;
  16678. }
  16679. #endif
  16680. #ifdef HAVE_CAMELLIA
  16681. case wolfssl_camellia:
  16682. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  16683. break;
  16684. #endif
  16685. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  16686. !defined(NO_CHAPOL_AEAD)
  16687. case wolfssl_chacha:
  16688. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  16689. break;
  16690. #endif
  16691. #ifdef WOLFSSL_SM4_CBC
  16692. case wolfssl_sm4_cbc:
  16693. #ifdef WOLFSSL_ASYNC_CRYPT
  16694. /* initialize event */
  16695. asyncDev = &ssl->encrypt.sm4->asyncDev;
  16696. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  16697. if (ret != 0)
  16698. break;
  16699. #endif
  16700. ret = wc_Sm4CbcEncrypt(ssl->encrypt.sm4, out, input, sz);
  16701. #ifdef WOLFSSL_ASYNC_CRYPT
  16702. if (ret == WC_PENDING_E && asyncOkay) {
  16703. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  16704. }
  16705. #endif
  16706. break;
  16707. #endif
  16708. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  16709. case wolfssl_sm4_gcm:
  16710. case wolfssl_sm4_ccm:/* GCM AEAD macros use same size as CCM */
  16711. {
  16712. SM4_AUTH_ENCRYPT_FUNC sm4_auth_fn;
  16713. const byte* additionalSrc;
  16714. #ifdef WOLFSSL_ASYNC_CRYPT
  16715. /* initialize event */
  16716. asyncDev = &ssl->encrypt.sm4->asyncDev;
  16717. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  16718. if (ret != 0)
  16719. break;
  16720. #endif
  16721. #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM4_CCM)
  16722. sm4_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm)
  16723. ? SM4_GCM_ENCRYPT_FUNC : SM4_CCM_ENCRYPT_FUNC;
  16724. #elif defined(WOLFSSL_SM4_GCM)
  16725. sm4_auth_fn = SM4_GCM_ENCRYPT_FUNC;
  16726. #else
  16727. sm4_auth_fn = SM4_CCM_ENCRYPT_FUNC;
  16728. #endif
  16729. additionalSrc = input - 5;
  16730. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  16731. /* sequence number field is 64-bits */
  16732. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  16733. /* Store the type, version. Unfortunately, they are in
  16734. * the input buffer ahead of the plaintext. */
  16735. #ifdef WOLFSSL_DTLS
  16736. if (ssl->options.dtls) {
  16737. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  16738. }
  16739. #endif
  16740. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  16741. additionalSrc, 3);
  16742. /* Store the length of the plain text minus the explicit
  16743. * IV length minus the authentication tag size. */
  16744. c16toa(sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16745. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  16746. XMEMCPY(ssl->encrypt.nonce,
  16747. ssl->keys.aead_enc_imp_IV, GCM_IMP_IV_SZ);
  16748. XMEMCPY(ssl->encrypt.nonce + GCM_IMP_IV_SZ,
  16749. ssl->keys.aead_exp_IV, GCM_EXP_IV_SZ);
  16750. ret = sm4_auth_fn(ssl->encrypt.sm4,
  16751. out + GCM_EXP_IV_SZ, input + GCM_EXP_IV_SZ,
  16752. sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  16753. ssl->encrypt.nonce, GCM_NONCE_SZ,
  16754. out + sz - ssl->specs.aead_mac_size,
  16755. ssl->specs.aead_mac_size,
  16756. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  16757. #ifdef WOLFSSL_ASYNC_CRYPT
  16758. if (ret == WC_PENDING_E && asyncOkay) {
  16759. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  16760. }
  16761. #endif
  16762. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  16763. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  16764. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  16765. XMEMCPY(out,
  16766. ssl->encrypt.nonce + GCM_IMP_IV_SZ, GCM_EXP_IV_SZ);
  16767. #endif
  16768. }
  16769. break;
  16770. #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
  16771. #ifdef HAVE_NULL_CIPHER
  16772. case wolfssl_cipher_null:
  16773. if (input != out) {
  16774. XMEMMOVE(out, input, sz);
  16775. }
  16776. break;
  16777. #endif
  16778. default:
  16779. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  16780. ret = ENCRYPT_ERROR;
  16781. WOLFSSL_ERROR_VERBOSE(ret);
  16782. }
  16783. #ifdef WOLFSSL_ASYNC_CRYPT
  16784. /* if async is not okay, then block */
  16785. if (ret == WC_PENDING_E && !asyncOkay) {
  16786. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  16787. }
  16788. #endif
  16789. return ret;
  16790. }
  16791. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input,
  16792. word16 sz, int asyncOkay)
  16793. {
  16794. int ret = 0;
  16795. #ifdef WOLFSSL_ASYNC_CRYPT
  16796. if (ssl->error == WC_PENDING_E) {
  16797. ssl->error = 0; /* clear async */
  16798. }
  16799. #endif
  16800. switch (ssl->encrypt.state) {
  16801. case CIPHER_STATE_BEGIN:
  16802. {
  16803. if (ssl->encrypt.setup == 0) {
  16804. WOLFSSL_MSG("Encrypt ciphers not setup");
  16805. WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
  16806. return ENCRYPT_ERROR;
  16807. }
  16808. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  16809. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  16810. XMEMCPY(ssl->encrypt.sanityCheck, input,
  16811. min(sz, sizeof(ssl->encrypt.sanityCheck)));
  16812. }
  16813. #endif
  16814. #ifdef HAVE_FUZZER
  16815. if (ssl->fuzzerCb)
  16816. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  16817. #endif
  16818. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
  16819. /* make sure AES GCM/CCM memory is allocated */
  16820. /* free for these happens in FreeCiphers */
  16821. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  16822. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm ||
  16823. ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm) {
  16824. /* make sure auth iv and auth are allocated */
  16825. if (ssl->encrypt.additional == NULL)
  16826. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  16827. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16828. if (ssl->encrypt.nonce == NULL) {
  16829. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  16830. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16831. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16832. if (ssl->encrypt.nonce != NULL) {
  16833. wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce,
  16834. AESGCM_NONCE_SZ);
  16835. }
  16836. #endif
  16837. }
  16838. if (ssl->encrypt.additional == NULL ||
  16839. ssl->encrypt.nonce == NULL) {
  16840. return MEMORY_E;
  16841. }
  16842. }
  16843. #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
  16844. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  16845. /* make sure SM4 GCM/CCM memory is allocated */
  16846. /* free for these happens in FreeCiphers */
  16847. if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
  16848. ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) {
  16849. /* make sure auth iv and auth are allocated */
  16850. if (ssl->encrypt.additional == NULL)
  16851. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  16852. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16853. if (ssl->encrypt.nonce == NULL) {
  16854. ssl->encrypt.nonce = (byte*)XMALLOC(GCM_NONCE_SZ,
  16855. ssl->heap, DYNAMIC_TYPE_CIPHER);
  16856. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16857. if (ssl->encrypt.nonce != NULL) {
  16858. wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce,
  16859. GCM_NONCE_SZ);
  16860. }
  16861. #endif
  16862. }
  16863. if (ssl->encrypt.additional == NULL ||
  16864. ssl->encrypt.nonce == NULL) {
  16865. return MEMORY_E;
  16866. }
  16867. }
  16868. #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
  16869. /* Advance state and proceed */
  16870. ssl->encrypt.state = CIPHER_STATE_DO;
  16871. }
  16872. FALL_THROUGH;
  16873. case CIPHER_STATE_DO:
  16874. {
  16875. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  16876. /* Advance state */
  16877. ssl->encrypt.state = CIPHER_STATE_END;
  16878. #ifdef WOLFSSL_ASYNC_CRYPT
  16879. /* If pending, then leave and return will resume below */
  16880. if (ret == WC_PENDING_E) {
  16881. return ret;
  16882. }
  16883. #endif
  16884. }
  16885. FALL_THROUGH;
  16886. case CIPHER_STATE_END:
  16887. {
  16888. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  16889. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null &&
  16890. XMEMCMP(out, ssl->encrypt.sanityCheck,
  16891. min(sz, sizeof(ssl->encrypt.sanityCheck))) == 0) {
  16892. WOLFSSL_MSG("Encrypt sanity check failed! Glitch?");
  16893. WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
  16894. return ENCRYPT_ERROR;
  16895. }
  16896. ForceZero(ssl->encrypt.sanityCheck,
  16897. sizeof(ssl->encrypt.sanityCheck));
  16898. #endif
  16899. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
  16900. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  16901. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm ||
  16902. ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm)
  16903. {
  16904. /* finalize authentication cipher */
  16905. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  16906. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  16907. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  16908. AeadIncrementExpIV(ssl);
  16909. #endif
  16910. if (ssl->encrypt.nonce)
  16911. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  16912. }
  16913. #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
  16914. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  16915. if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
  16916. ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm)
  16917. {
  16918. /* finalize authentication cipher */
  16919. AeadIncrementExpIV(ssl);
  16920. if (ssl->encrypt.nonce)
  16921. ForceZero(ssl->encrypt.nonce, GCM_NONCE_SZ);
  16922. }
  16923. #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
  16924. #ifdef WOLFSSL_CHECK_MEM_ZERO
  16925. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  16926. (out != input) && (ret == 0)) {
  16927. wc_MemZero_Add("TLS Encrypt plaintext", input, sz);
  16928. }
  16929. #endif
  16930. break;
  16931. }
  16932. default:
  16933. break;
  16934. }
  16935. /* Reset state */
  16936. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  16937. return ret;
  16938. }
  16939. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  16940. word16 sz)
  16941. {
  16942. int ret = 0;
  16943. (void)plain;
  16944. (void)input;
  16945. (void)sz;
  16946. switch (ssl->specs.bulk_cipher_algorithm)
  16947. {
  16948. #ifdef BUILD_ARC4
  16949. case wolfssl_rc4:
  16950. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  16951. break;
  16952. #endif
  16953. #ifdef BUILD_DES3
  16954. case wolfssl_triple_des:
  16955. #ifdef WOLFSSL_ASYNC_CRYPT
  16956. /* initialize event */
  16957. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  16958. WC_ASYNC_FLAG_CALL_AGAIN);
  16959. if (ret != 0)
  16960. break;
  16961. #endif
  16962. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  16963. #ifdef WOLFSSL_ASYNC_CRYPT
  16964. if (ret == WC_PENDING_E) {
  16965. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  16966. }
  16967. #endif
  16968. break;
  16969. #endif
  16970. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  16971. case wolfssl_aes:
  16972. #ifdef WOLFSSL_ASYNC_CRYPT
  16973. /* initialize event */
  16974. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  16975. WC_ASYNC_FLAG_CALL_AGAIN);
  16976. if (ret != 0)
  16977. break;
  16978. #endif
  16979. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  16980. #ifdef WOLFSSL_ASYNC_CRYPT
  16981. if (ret == WC_PENDING_E) {
  16982. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  16983. }
  16984. #endif
  16985. break;
  16986. #endif
  16987. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  16988. case wolfssl_aes_gcm:
  16989. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  16990. {
  16991. wc_AesAuthDecryptFunc aes_auth_fn;
  16992. #ifdef WOLFSSL_ASYNC_CRYPT
  16993. /* initialize event */
  16994. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  16995. WC_ASYNC_FLAG_CALL_AGAIN);
  16996. if (ret != 0)
  16997. break;
  16998. #endif
  16999. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  17000. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  17001. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  17002. #elif defined(BUILD_AESGCM)
  17003. aes_auth_fn = wc_AesGcmDecrypt;
  17004. #else
  17005. aes_auth_fn = wc_AesCcmDecrypt;
  17006. #endif
  17007. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  17008. /* sequence number field is 64-bits */
  17009. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  17010. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  17011. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  17012. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  17013. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  17014. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  17015. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  17016. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  17017. XMEMCPY(ssl->decrypt.nonce,
  17018. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  17019. AESGCM_IMP_IV_SZ);
  17020. else
  17021. #endif
  17022. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  17023. AESGCM_IMP_IV_SZ);
  17024. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  17025. AESGCM_EXP_IV_SZ);
  17026. #ifdef HAVE_PK_CALLBACKS
  17027. ret = NOT_COMPILED_IN;
  17028. if (ssl->ctx && ssl->ctx->PerformTlsRecordProcessingCb) {
  17029. ret = ssl->ctx->PerformTlsRecordProcessingCb(ssl, 0,
  17030. plain + AESGCM_EXP_IV_SZ,
  17031. input + AESGCM_EXP_IV_SZ,
  17032. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  17033. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  17034. (byte *)(input + sz - ssl->specs.aead_mac_size),
  17035. ssl->specs.aead_mac_size,
  17036. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ);
  17037. }
  17038. if (ret == NOT_COMPILED_IN)
  17039. #endif /* HAVE_PK_CALLBACKS */
  17040. {
  17041. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  17042. plain + AESGCM_EXP_IV_SZ,
  17043. input + AESGCM_EXP_IV_SZ,
  17044. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  17045. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  17046. input + sz - ssl->specs.aead_mac_size,
  17047. ssl->specs.aead_mac_size,
  17048. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  17049. #ifdef WOLFSSL_ASYNC_CRYPT
  17050. if (ret == WC_PENDING_E) {
  17051. ret = wolfSSL_AsyncPush(ssl,
  17052. &ssl->decrypt.aes->asyncDev);
  17053. }
  17054. #endif
  17055. }
  17056. }
  17057. }
  17058. break;
  17059. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  17060. #ifdef HAVE_ARIA
  17061. case wolfssl_aria_gcm:
  17062. {
  17063. byte *outBuf = NULL;
  17064. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  17065. /* sequence number field is 64-bits */
  17066. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  17067. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  17068. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  17069. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  17070. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  17071. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  17072. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  17073. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  17074. XMEMCPY(ssl->decrypt.nonce,
  17075. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  17076. AESGCM_IMP_IV_SZ);
  17077. else
  17078. #endif
  17079. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  17080. AESGCM_IMP_IV_SZ);
  17081. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  17082. AESGCM_EXP_IV_SZ);
  17083. outBuf = (byte*)XMALLOC(sz - AESGCM_EXP_IV_SZ, ssl->heap,
  17084. DYNAMIC_TYPE_TMP_BUFFER);
  17085. if (outBuf == NULL) {
  17086. ret = MEMORY_ERROR;
  17087. break;
  17088. }
  17089. ret = wc_AriaDecrypt(ssl->decrypt.aria, outBuf,
  17090. (byte *)input + AESGCM_EXP_IV_SZ,
  17091. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  17092. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  17093. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ,
  17094. (byte *)input + sz - ssl->specs.aead_mac_size,
  17095. ssl->specs.aead_mac_size
  17096. );
  17097. if (ret != 0)
  17098. break;
  17099. XMEMCPY(plain + AESGCM_EXP_IV_SZ,
  17100. outBuf,
  17101. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size);
  17102. XFREE(outBuf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  17103. break;
  17104. }
  17105. #endif /* HAVE_ARIA */
  17106. #ifdef HAVE_CAMELLIA
  17107. case wolfssl_camellia:
  17108. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  17109. break;
  17110. #endif
  17111. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  17112. !defined(NO_CHAPOL_AEAD)
  17113. case wolfssl_chacha:
  17114. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  17115. break;
  17116. #endif
  17117. #ifdef WOLFSSL_SM4_CBC
  17118. case wolfssl_sm4_cbc:
  17119. #ifdef WOLFSSL_ASYNC_CRYPT
  17120. /* initialize event */
  17121. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  17122. WC_ASYNC_FLAG_CALL_AGAIN);
  17123. if (ret != 0)
  17124. break;
  17125. #endif
  17126. ret = wc_Sm4CbcDecrypt(ssl->decrypt.sm4, plain, input, sz);
  17127. #ifdef WOLFSSL_ASYNC_CRYPT
  17128. if (ret == WC_PENDING_E) {
  17129. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  17130. }
  17131. #endif
  17132. break;
  17133. #endif
  17134. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  17135. case wolfssl_sm4_gcm:
  17136. case wolfssl_sm4_ccm: /* GCM AEAD macros use same size as CCM */
  17137. {
  17138. SM4_AUTH_DECRYPT_FUNC sm4_auth_fn;
  17139. #ifdef WOLFSSL_ASYNC_CRYPT
  17140. /* initialize event */
  17141. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.sm4->asyncDev,
  17142. WC_ASYNC_FLAG_CALL_AGAIN);
  17143. if (ret != 0)
  17144. break;
  17145. #endif
  17146. #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM4_CCM)
  17147. sm4_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm)
  17148. ? SM4_GCM_DECRYPT_FUNC : SM4_CCM_DECRYPT_FUNC;
  17149. #elif defined(WOLFSSL_SM4_GCM)
  17150. sm4_auth_fn = SM4_GCM_DECRYPT_FUNC;
  17151. #else
  17152. sm4_auth_fn = SM4_CCM_DECRYPT_FUNC;
  17153. #endif
  17154. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  17155. /* sequence number field is 64-bits */
  17156. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  17157. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  17158. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  17159. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  17160. c16toa(sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  17161. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  17162. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  17163. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  17164. XMEMCPY(ssl->decrypt.nonce,
  17165. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  17166. GCM_IMP_IV_SZ);
  17167. else
  17168. #endif
  17169. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  17170. GCM_IMP_IV_SZ);
  17171. XMEMCPY(ssl->decrypt.nonce + GCM_IMP_IV_SZ, input, GCM_EXP_IV_SZ);
  17172. if ((ret = sm4_auth_fn(ssl->decrypt.sm4,
  17173. plain + GCM_EXP_IV_SZ,
  17174. input + GCM_EXP_IV_SZ,
  17175. sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  17176. ssl->decrypt.nonce, GCM_NONCE_SZ,
  17177. input + sz - ssl->specs.aead_mac_size,
  17178. ssl->specs.aead_mac_size,
  17179. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  17180. #ifdef WOLFSSL_ASYNC_CRYPT
  17181. if (ret == WC_PENDING_E) {
  17182. ret = wolfSSL_AsyncPush(ssl,
  17183. &ssl->decrypt.sm4->asyncDev);
  17184. }
  17185. #endif
  17186. }
  17187. }
  17188. break;
  17189. #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
  17190. #ifdef HAVE_NULL_CIPHER
  17191. case wolfssl_cipher_null:
  17192. if (input != plain) {
  17193. XMEMMOVE(plain, input, sz);
  17194. }
  17195. break;
  17196. #endif
  17197. default:
  17198. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  17199. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  17200. ret = DECRYPT_ERROR;
  17201. }
  17202. #ifdef WOLFSSL_CHECK_MEM_ZERO
  17203. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  17204. (ret == 0)) {
  17205. wc_MemZero_Add("Decrypted data", plain, sz);
  17206. }
  17207. #endif
  17208. return ret;
  17209. }
  17210. static int DecryptTls(WOLFSSL* ssl, byte* plain, const byte* input, word16 sz)
  17211. {
  17212. int ret = 0;
  17213. #ifdef WOLFSSL_ASYNC_CRYPT
  17214. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  17215. if (ret != WC_NO_PENDING_E) {
  17216. /* check for still pending */
  17217. if (ret == WC_PENDING_E)
  17218. return ret;
  17219. ssl->error = 0; /* clear async */
  17220. /* let failures through so CIPHER_STATE_END logic is run */
  17221. }
  17222. else
  17223. #endif
  17224. {
  17225. /* Reset state */
  17226. ret = 0;
  17227. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  17228. }
  17229. switch (ssl->decrypt.state) {
  17230. case CIPHER_STATE_BEGIN:
  17231. {
  17232. if (ssl->decrypt.setup == 0) {
  17233. WOLFSSL_MSG("Decrypt ciphers not setup");
  17234. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  17235. return DECRYPT_ERROR;
  17236. }
  17237. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
  17238. /* make sure AES GCM/CCM memory is allocated */
  17239. /* free for these happens in FreeCiphers */
  17240. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  17241. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm ||
  17242. ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm) {
  17243. /* make sure auth iv and auth are allocated */
  17244. if (ssl->decrypt.additional == NULL)
  17245. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  17246. ssl->heap, DYNAMIC_TYPE_CIPHER);
  17247. if (ssl->decrypt.nonce == NULL) {
  17248. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  17249. ssl->heap, DYNAMIC_TYPE_CIPHER);
  17250. #ifdef WOLFSSL_CHECK_MEM_ZERO
  17251. if (ssl->decrypt.nonce != NULL) {
  17252. wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce,
  17253. AESGCM_NONCE_SZ);
  17254. }
  17255. #endif
  17256. }
  17257. if (ssl->decrypt.additional == NULL ||
  17258. ssl->decrypt.nonce == NULL) {
  17259. return MEMORY_E;
  17260. }
  17261. }
  17262. #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
  17263. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  17264. /* make sure SM4 GCM/CCM memory is allocated */
  17265. /* free for these happens in FreeCiphers */
  17266. if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
  17267. ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) {
  17268. /* make sure auth iv and auth are allocated */
  17269. if (ssl->decrypt.additional == NULL)
  17270. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  17271. ssl->heap, DYNAMIC_TYPE_CIPHER);
  17272. if (ssl->decrypt.nonce == NULL) {
  17273. ssl->decrypt.nonce = (byte*)XMALLOC(GCM_NONCE_SZ,
  17274. ssl->heap, DYNAMIC_TYPE_CIPHER);
  17275. #ifdef WOLFSSL_CHECK_MEM_ZERO
  17276. if (ssl->decrypt.nonce != NULL) {
  17277. wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce,
  17278. GCM_NONCE_SZ);
  17279. }
  17280. #endif
  17281. }
  17282. if (ssl->decrypt.additional == NULL ||
  17283. ssl->decrypt.nonce == NULL) {
  17284. return MEMORY_E;
  17285. }
  17286. }
  17287. #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */
  17288. /* Advance state and proceed */
  17289. ssl->decrypt.state = CIPHER_STATE_DO;
  17290. }
  17291. FALL_THROUGH;
  17292. case CIPHER_STATE_DO:
  17293. {
  17294. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  17295. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  17296. /* For epochs >1 the current cipher parameters are located in
  17297. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  17298. * parameters and for epoch 1 use ssl->keys */
  17299. if (ssl->keys.curEpoch ==
  17300. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  17301. if (ssl->decrypt.src != SCR) {
  17302. ssl->secure_renegotiation->cache_status =
  17303. SCR_CACHE_NEEDED;
  17304. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  17305. break;
  17306. }
  17307. }
  17308. else {
  17309. if (ssl->decrypt.src != KEYS) {
  17310. ssl->secure_renegotiation->cache_status =
  17311. SCR_CACHE_NULL;
  17312. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  17313. break;
  17314. }
  17315. }
  17316. }
  17317. #endif
  17318. ret = DecryptDo(ssl, plain, input, sz);
  17319. /* Advance state */
  17320. ssl->decrypt.state = CIPHER_STATE_END;
  17321. #ifdef WOLFSSL_ASYNC_CRYPT
  17322. /* If pending, leave and return below */
  17323. if (ret == WC_PENDING_E) {
  17324. return ret;
  17325. }
  17326. #endif
  17327. }
  17328. FALL_THROUGH;
  17329. case CIPHER_STATE_END:
  17330. {
  17331. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA)
  17332. /* make sure AES GCM/CCM nonce is cleared */
  17333. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  17334. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  17335. if (ssl->decrypt.nonce)
  17336. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  17337. if (ret < 0) {
  17338. ret = VERIFY_MAC_ERROR;
  17339. WOLFSSL_ERROR_VERBOSE(ret);
  17340. }
  17341. }
  17342. #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */
  17343. #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)
  17344. /* make sure SM4 GCM/CCM nonce is cleared */
  17345. if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm ||
  17346. ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) {
  17347. if (ssl->decrypt.nonce)
  17348. ForceZero(ssl->decrypt.nonce, GCM_NONCE_SZ);
  17349. if (ret < 0) {
  17350. ret = VERIFY_MAC_ERROR;
  17351. WOLFSSL_ERROR_VERBOSE(ret);
  17352. }
  17353. }
  17354. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  17355. break;
  17356. }
  17357. default:
  17358. break;
  17359. }
  17360. /* Reset state */
  17361. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  17362. return ret;
  17363. }
  17364. #endif /* !WOLFSSL_NO_TLS12 */
  17365. /* Check conditions for a cipher to have an explicit IV.
  17366. *
  17367. * ssl The SSL/TLS object.
  17368. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  17369. */
  17370. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  17371. {
  17372. #ifdef WOLFSSL_TLS13
  17373. if (ssl->options.tls1_3)
  17374. return 0;
  17375. #endif
  17376. return (ssl->specs.cipher_type == aead) &&
  17377. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  17378. }
  17379. /* check cipher text size for sanity */
  17380. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  17381. {
  17382. #ifdef HAVE_TRUNCATED_HMAC
  17383. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  17384. : ssl->specs.hash_size;
  17385. #else
  17386. word32 minLength = ssl->specs.hash_size; /* covers stream */
  17387. #endif
  17388. #ifndef WOLFSSL_AEAD_ONLY
  17389. if (ssl->specs.cipher_type == block) {
  17390. #ifdef HAVE_ENCRYPT_THEN_MAC
  17391. if (ssl->options.startedETMRead) {
  17392. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  17393. WOLFSSL_MSG("Block ciphertext not block size");
  17394. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  17395. return SANITY_CIPHER_E;
  17396. }
  17397. }
  17398. else
  17399. #endif
  17400. if (encryptSz % ssl->specs.block_size) {
  17401. WOLFSSL_MSG("Block ciphertext not block size");
  17402. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  17403. return SANITY_CIPHER_E;
  17404. }
  17405. minLength++; /* pad byte */
  17406. if (ssl->specs.block_size > minLength)
  17407. minLength = ssl->specs.block_size;
  17408. if (ssl->options.tls1_1)
  17409. minLength += ssl->specs.block_size; /* explicit IV */
  17410. }
  17411. else
  17412. #endif
  17413. if (ssl->specs.cipher_type == aead) {
  17414. minLength = ssl->specs.aead_mac_size; /* authTag size */
  17415. if (CipherHasExpIV(ssl))
  17416. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  17417. }
  17418. if (encryptSz < minLength) {
  17419. WOLFSSL_MSG("Ciphertext not minimum size");
  17420. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  17421. return SANITY_CIPHER_E;
  17422. }
  17423. return 0;
  17424. }
  17425. #ifndef WOLFSSL_AEAD_ONLY
  17426. #ifdef WOLSSL_OLD_TIMINGPADVERIFY
  17427. #define COMPRESS_LOWER 64
  17428. #define COMPRESS_UPPER 55
  17429. #define COMPRESS_CONSTANT 13
  17430. #ifndef NO_OLD_TLS
  17431. static WC_INLINE void Md5Rounds(int rounds, const byte* data, int sz)
  17432. {
  17433. wc_Md5 md5;
  17434. int i;
  17435. wc_InitMd5(&md5); /* no error check on purpose, dummy round */
  17436. for (i = 0; i < rounds; i++)
  17437. wc_Md5Update(&md5, data, sz);
  17438. wc_Md5Free(&md5); /* in case needed to release resources */
  17439. }
  17440. /* do a dummy sha round */
  17441. static WC_INLINE void ShaRounds(int rounds, const byte* data, int sz)
  17442. {
  17443. wc_Sha sha;
  17444. int i;
  17445. wc_InitSha(&sha); /* no error check on purpose, dummy round */
  17446. for (i = 0; i < rounds; i++)
  17447. wc_ShaUpdate(&sha, data, sz);
  17448. wc_ShaFree(&sha); /* in case needed to release resources */
  17449. }
  17450. #endif
  17451. #ifndef NO_SHA256
  17452. static WC_INLINE void Sha256Rounds(int rounds, const byte* data, int sz)
  17453. {
  17454. wc_Sha256 sha256;
  17455. int i;
  17456. wc_InitSha256(&sha256); /* no error check on purpose, dummy round */
  17457. for (i = 0; i < rounds; i++) {
  17458. wc_Sha256Update(&sha256, data, sz);
  17459. /* no error check on purpose, dummy round */
  17460. }
  17461. wc_Sha256Free(&sha256); /* in case needed to release resources */
  17462. }
  17463. #endif
  17464. #ifdef WOLFSSL_SHA384
  17465. static WC_INLINE void Sha384Rounds(int rounds, const byte* data, int sz)
  17466. {
  17467. wc_Sha384 sha384;
  17468. int i;
  17469. wc_InitSha384(&sha384); /* no error check on purpose, dummy round */
  17470. for (i = 0; i < rounds; i++) {
  17471. wc_Sha384Update(&sha384, data, sz);
  17472. /* no error check on purpose, dummy round */
  17473. }
  17474. wc_Sha384Free(&sha384); /* in case needed to release resources */
  17475. }
  17476. #endif
  17477. #ifdef WOLFSSL_SHA512
  17478. static WC_INLINE void Sha512Rounds(int rounds, const byte* data, int sz)
  17479. {
  17480. wc_Sha512 sha512;
  17481. int i;
  17482. wc_InitSha512(&sha512); /* no error check on purpose, dummy round */
  17483. for (i = 0; i < rounds; i++) {
  17484. wc_Sha512Update(&sha512, data, sz);
  17485. /* no error check on purpose, dummy round */
  17486. }
  17487. wc_Sha512Free(&sha512); /* in case needed to release resources */
  17488. }
  17489. #endif
  17490. #ifdef WOLFSSL_RIPEMD
  17491. static WC_INLINE void RmdRounds(int rounds, const byte* data, int sz)
  17492. {
  17493. RipeMd ripemd;
  17494. int i;
  17495. wc_InitRipeMd(&ripemd);
  17496. for (i = 0; i < rounds; i++)
  17497. wc_RipeMdUpdate(&ripemd, data, sz);
  17498. }
  17499. #endif
  17500. /* Do dummy rounds */
  17501. static WC_INLINE void DoRounds(int type, int rounds, const byte* data, int sz)
  17502. {
  17503. (void)rounds;
  17504. (void)data;
  17505. (void)sz;
  17506. switch (type) {
  17507. case no_mac :
  17508. break;
  17509. #ifndef NO_OLD_TLS
  17510. #ifndef NO_MD5
  17511. case md5_mac :
  17512. Md5Rounds(rounds, data, sz);
  17513. break;
  17514. #endif
  17515. #ifndef NO_SHA
  17516. case sha_mac :
  17517. ShaRounds(rounds, data, sz);
  17518. break;
  17519. #endif
  17520. #endif
  17521. #ifndef NO_SHA256
  17522. case sha256_mac :
  17523. Sha256Rounds(rounds, data, sz);
  17524. break;
  17525. #endif
  17526. #ifdef WOLFSSL_SHA384
  17527. case sha384_mac :
  17528. Sha384Rounds(rounds, data, sz);
  17529. break;
  17530. #endif
  17531. #ifdef WOLFSSL_SHA512
  17532. case sha512_mac :
  17533. Sha512Rounds(rounds, data, sz);
  17534. break;
  17535. #endif
  17536. #ifdef WOLFSSL_RIPEMD
  17537. case rmd_mac :
  17538. RmdRounds(rounds, data, sz);
  17539. break;
  17540. #endif
  17541. default:
  17542. WOLFSSL_MSG("Bad round type");
  17543. break;
  17544. }
  17545. }
  17546. /* do number of compression rounds on dummy data */
  17547. static WC_INLINE void CompressRounds(WOLFSSL* ssl, int rounds, const byte* dummy)
  17548. {
  17549. if (rounds)
  17550. DoRounds(ssl->specs.mac_algorithm, rounds, dummy, COMPRESS_LOWER);
  17551. }
  17552. /* check all length bytes for the pad value, return 0 on success */
  17553. static int PadCheck(const byte* a, byte pad, int length)
  17554. {
  17555. int i;
  17556. int compareSum = 0;
  17557. for (i = 0; i < length; i++) {
  17558. compareSum |= a[i] ^ pad;
  17559. }
  17560. return compareSum;
  17561. }
  17562. /* get compression extra rounds */
  17563. static WC_INLINE int GetRounds(int pLen, int padLen, int t)
  17564. {
  17565. int roundL1 = 1; /* round up flags */
  17566. int roundL2 = 1;
  17567. int L1 = COMPRESS_CONSTANT + pLen - t;
  17568. int L2 = COMPRESS_CONSTANT + pLen - padLen - 1 - t;
  17569. L1 -= COMPRESS_UPPER;
  17570. L2 -= COMPRESS_UPPER;
  17571. if ( (L1 % COMPRESS_LOWER) == 0)
  17572. roundL1 = 0;
  17573. if ( (L2 % COMPRESS_LOWER) == 0)
  17574. roundL2 = 0;
  17575. L1 /= COMPRESS_LOWER;
  17576. L2 /= COMPRESS_LOWER;
  17577. L1 += roundL1;
  17578. L2 += roundL2;
  17579. return L1 - L2;
  17580. }
  17581. /* timing resistant pad/verify check, return 0 on success */
  17582. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int t,
  17583. int pLen, int content)
  17584. {
  17585. byte verify[WC_MAX_DIGEST_SIZE];
  17586. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  17587. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  17588. int ret = 0;
  17589. (void)dmy;
  17590. if ( (t + padLen + 1) > pLen) {
  17591. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  17592. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE);
  17593. /* still compare */
  17594. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  17595. ConstantCompare(verify, input + pLen - t, t);
  17596. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17597. return VERIFY_MAC_ERROR;
  17598. }
  17599. if (PadCheck(input + pLen - (padLen + 1), (byte)padLen, padLen + 1) != 0) {
  17600. WOLFSSL_MSG("PadCheck failed");
  17601. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  17602. /* still compare */
  17603. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  17604. ConstantCompare(verify, input + pLen - t, t);
  17605. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17606. return VERIFY_MAC_ERROR;
  17607. }
  17608. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  17609. ret = ssl->hmac(ssl, verify, input, pLen - padLen - 1 - t, -1, content,
  17610. 1, PEER_ORDER);
  17611. CompressRounds(ssl, GetRounds(pLen, padLen, t), dummy);
  17612. if (ConstantCompare(verify, input + (pLen - padLen - 1 - t), t) != 0) {
  17613. WOLFSSL_MSG("Verify MAC compare failed");
  17614. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17615. return VERIFY_MAC_ERROR;
  17616. }
  17617. /* treat any failure as verify MAC error */
  17618. if (ret != 0) {
  17619. ret = VERIFY_MAC_ERROR;
  17620. WOLFSSL_ERROR_VERBOSE(ret);
  17621. }
  17622. return ret;
  17623. }
  17624. #else
  17625. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  17626. /* check all length bytes for the pad value, return 0 on success */
  17627. static int PadCheck(const byte* a, byte pad, int length)
  17628. {
  17629. int i;
  17630. int compareSum = 0;
  17631. for (i = 0; i < length; i++) {
  17632. compareSum |= a[i] ^ pad;
  17633. }
  17634. return compareSum;
  17635. }
  17636. /* Mask the padding bytes with the expected values.
  17637. * Constant time implementation - does maximum pad size possible.
  17638. *
  17639. * data Message data.
  17640. * sz Size of the message including MAC and padding and padding length.
  17641. * macSz Size of the MAC.
  17642. * returns 0 on success, otherwise failure.
  17643. */
  17644. static byte MaskPadding(const byte* data, int sz, int macSz)
  17645. {
  17646. int i;
  17647. int checkSz = sz - 1;
  17648. byte paddingSz = data[sz - 1];
  17649. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  17650. if (checkSz > TLS_MAX_PAD_SZ)
  17651. checkSz = TLS_MAX_PAD_SZ;
  17652. for (i = 0; i < checkSz; i++) {
  17653. byte mask = ctMaskLTE(i, paddingSz);
  17654. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  17655. }
  17656. return good;
  17657. }
  17658. /* Mask the MAC in the message with the MAC calculated.
  17659. * Constant time implementation - starts looking for MAC where maximum padding
  17660. * size has it.
  17661. *
  17662. * data Message data.
  17663. * sz Size of the message including MAC and padding and padding length.
  17664. * macSz Size of the MAC data.
  17665. * expMac Expected MAC value.
  17666. * returns 0 on success, otherwise failure.
  17667. */
  17668. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  17669. {
  17670. int i, j;
  17671. unsigned char mac[WC_MAX_DIGEST_SIZE];
  17672. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  17673. int macEnd = sz - 1 - data[sz - 1];
  17674. int macStart = macEnd - macSz;
  17675. int r = 0;
  17676. unsigned char started, notEnded;
  17677. unsigned char good = 0;
  17678. scanStart &= ctMaskIntGTE(scanStart, 0);
  17679. macStart &= ctMaskIntGTE(macStart, 0);
  17680. /* Div on Intel has different speeds depending on value.
  17681. * Use a bitwise AND or mod a specific value (converted to mul). */
  17682. if ((macSz & (macSz - 1)) == 0)
  17683. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  17684. #ifndef NO_SHA
  17685. else if (macSz == WC_SHA_DIGEST_SIZE)
  17686. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  17687. #endif
  17688. #ifdef WOLFSSL_SHA384
  17689. else if (macSz == WC_SHA384_DIGEST_SIZE)
  17690. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  17691. #endif
  17692. XMEMSET(mac, 0, macSz);
  17693. for (i = scanStart; i < sz; i += macSz) {
  17694. for (j = 0; j < macSz && j + i < sz; j++) {
  17695. started = ctMaskGTE(i + j, macStart);
  17696. notEnded = ctMaskLT(i + j, macEnd);
  17697. mac[j] |= started & notEnded & data[i + j];
  17698. }
  17699. }
  17700. if ((macSz & (macSz - 1)) == 0) {
  17701. for (i = 0; i < macSz; i++)
  17702. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  17703. }
  17704. #ifndef NO_SHA
  17705. else if (macSz == WC_SHA_DIGEST_SIZE) {
  17706. for (i = 0; i < macSz; i++)
  17707. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  17708. }
  17709. #endif
  17710. #ifdef WOLFSSL_SHA384
  17711. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  17712. for (i = 0; i < macSz; i++)
  17713. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  17714. }
  17715. #endif
  17716. return good;
  17717. }
  17718. /* timing resistant pad/verify check, return 0 on success */
  17719. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  17720. int pLen, int content)
  17721. {
  17722. byte verify[WC_MAX_DIGEST_SIZE];
  17723. byte good;
  17724. int ret = 0;
  17725. good = MaskPadding(input, pLen, macSz);
  17726. /* 4th argument has potential to underflow, ssl->hmac function should
  17727. * either increment the size by (macSz + padLen + 1) before use or check on
  17728. * the size to make sure is valid. */
  17729. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  17730. content, 1, PEER_ORDER);
  17731. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  17732. /* Non-zero on failure. */
  17733. good = (byte)~(word32)good;
  17734. good &= good >> 4;
  17735. good &= good >> 2;
  17736. good &= good >> 1;
  17737. /* Make ret negative on masking failure. */
  17738. ret -= 1 - good;
  17739. /* Treat any failure as verify MAC error. */
  17740. if (ret != 0) {
  17741. ret = VERIFY_MAC_ERROR;
  17742. WOLFSSL_ERROR_VERBOSE(ret);
  17743. }
  17744. return ret;
  17745. }
  17746. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  17747. #endif /* WOLSSL_OLD_TIMINGPADVERIFY */
  17748. #endif /* WOLFSSL_AEAD_ONLY */
  17749. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx, int sniff)
  17750. {
  17751. word32 msgSz = WOLFSSL_IS_QUIC(ssl)? ssl->curSize : ssl->keys.encryptSz;
  17752. word32 idx = *inOutIdx;
  17753. int dataSz;
  17754. int ivExtra = 0;
  17755. byte* rawData = input + idx; /* keep current for hmac */
  17756. #ifdef HAVE_LIBZ
  17757. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  17758. #endif
  17759. #ifdef WOLFSSL_EARLY_DATA
  17760. if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
  17761. int process = 0;
  17762. if (ssl->options.side == WOLFSSL_SERVER_END) {
  17763. if ((ssl->earlyData != no_early_data) &&
  17764. (ssl->options.clientState == CLIENT_HELLO_COMPLETE)) {
  17765. process = 1;
  17766. }
  17767. if (!process) {
  17768. WOLFSSL_MSG("Ignoring EarlyData!");
  17769. *inOutIdx += ssl->curSize;
  17770. if (*inOutIdx > ssl->buffers.inputBuffer.length)
  17771. return BUFFER_E;
  17772. return 0;
  17773. }
  17774. }
  17775. if (!process) {
  17776. WOLFSSL_MSG("Received App data before a handshake completed");
  17777. if (sniff == NO_SNIFF) {
  17778. SendAlert(ssl, alert_fatal, unexpected_message);
  17779. }
  17780. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  17781. return OUT_OF_ORDER_E;
  17782. }
  17783. }
  17784. else
  17785. #endif
  17786. if (ssl->options.handShakeDone == 0) {
  17787. WOLFSSL_MSG("Received App data before a handshake completed");
  17788. if (sniff == NO_SNIFF) {
  17789. SendAlert(ssl, alert_fatal, unexpected_message);
  17790. }
  17791. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  17792. return OUT_OF_ORDER_E;
  17793. }
  17794. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  17795. /* Check if we want to invalidate old epochs. If
  17796. * ssl->dtls13InvalidateBefore is set then we want to mark all old
  17797. * epochs as encrypt only. This is done when we detect too many failed
  17798. * decryptions. We do this here to confirm that the peer has updated its
  17799. * keys and we can stop using the old keys. */
  17800. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  17801. if (!w64IsZero(ssl->dtls13InvalidateBefore) &&
  17802. w64Equal(ssl->keys.curEpoch64, ssl->dtls13InvalidateBefore)) {
  17803. Dtls13SetOlderEpochSide(ssl, ssl->dtls13InvalidateBefore,
  17804. ENCRYPT_SIDE_ONLY);
  17805. w64Zero(&ssl->dtls13InvalidateBefore);
  17806. }
  17807. }
  17808. #endif
  17809. #ifndef WOLFSSL_AEAD_ONLY
  17810. if (ssl->specs.cipher_type == block) {
  17811. if (ssl->options.tls1_1)
  17812. ivExtra = ssl->specs.block_size;
  17813. }
  17814. else
  17815. #endif
  17816. if (ssl->specs.cipher_type == aead) {
  17817. if (CipherHasExpIV(ssl))
  17818. ivExtra = AESGCM_EXP_IV_SZ;
  17819. }
  17820. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  17821. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17822. if (ssl->options.startedETMRead)
  17823. dataSz -= MacSize(ssl);
  17824. #endif
  17825. if (dataSz < 0) {
  17826. WOLFSSL_MSG("App data buffer error, malicious input?");
  17827. if (sniff == NO_SNIFF) {
  17828. SendAlert(ssl, alert_fatal, unexpected_message);
  17829. }
  17830. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  17831. return BUFFER_ERROR;
  17832. }
  17833. #ifdef WOLFSSL_EARLY_DATA
  17834. if (ssl->options.side == WOLFSSL_SERVER_END &&
  17835. ssl->earlyData > early_data_ext) {
  17836. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  17837. if (sniff == NO_SNIFF) {
  17838. SendAlert(ssl, alert_fatal, unexpected_message);
  17839. }
  17840. return WOLFSSL_FATAL_ERROR;
  17841. }
  17842. ssl->earlyDataSz += dataSz;
  17843. }
  17844. #endif
  17845. /* read data */
  17846. if (dataSz) {
  17847. int rawSz = dataSz; /* keep raw size for idx adjustment */
  17848. #ifdef HAVE_LIBZ
  17849. if (ssl->options.usingCompression) {
  17850. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  17851. if (dataSz < 0) return dataSz;
  17852. }
  17853. #endif
  17854. idx += rawSz;
  17855. ssl->buffers.clearOutputBuffer.buffer = rawData;
  17856. ssl->buffers.clearOutputBuffer.length = dataSz;
  17857. }
  17858. idx += ssl->keys.padSz;
  17859. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17860. if (ssl->options.startedETMRead)
  17861. idx += MacSize(ssl);
  17862. #endif
  17863. #ifdef HAVE_LIBZ
  17864. /* decompress could be bigger, overwrite after verify */
  17865. if (ssl->options.usingCompression)
  17866. XMEMMOVE(rawData, decomp, dataSz);
  17867. #endif
  17868. *inOutIdx = idx;
  17869. #ifdef WOLFSSL_DTLS13
  17870. if (ssl->options.connectState == WAIT_FINISHED_ACK) {
  17871. /* DTLS 1.3 is waiting for an ACK but we can still return app data. */
  17872. return APP_DATA_READY;
  17873. }
  17874. #endif
  17875. #ifdef HAVE_SECURE_RENEGOTIATION
  17876. if (IsSCR(ssl)) {
  17877. /* If we are in a secure renegotiation then APP DATA is treated
  17878. * differently */
  17879. return APP_DATA_READY;
  17880. }
  17881. #endif
  17882. return 0;
  17883. }
  17884. const char* AlertTypeToString(int type)
  17885. {
  17886. switch (type) {
  17887. case close_notify:
  17888. {
  17889. static const char close_notify_str[] =
  17890. "close_notify";
  17891. return close_notify_str;
  17892. }
  17893. case unexpected_message:
  17894. {
  17895. static const char unexpected_message_str[] =
  17896. "unexpected_message";
  17897. return unexpected_message_str;
  17898. }
  17899. case bad_record_mac:
  17900. {
  17901. static const char bad_record_mac_str[] =
  17902. "bad_record_mac";
  17903. return bad_record_mac_str;
  17904. }
  17905. case record_overflow:
  17906. {
  17907. static const char record_overflow_str[] =
  17908. "record_overflow";
  17909. return record_overflow_str;
  17910. }
  17911. case decompression_failure:
  17912. {
  17913. static const char decompression_failure_str[] =
  17914. "decompression_failure";
  17915. return decompression_failure_str;
  17916. }
  17917. case handshake_failure:
  17918. {
  17919. static const char handshake_failure_str[] =
  17920. "handshake_failure";
  17921. return handshake_failure_str;
  17922. }
  17923. case no_certificate:
  17924. {
  17925. static const char no_certificate_str[] =
  17926. "no_certificate";
  17927. return no_certificate_str;
  17928. }
  17929. case bad_certificate:
  17930. {
  17931. static const char bad_certificate_str[] =
  17932. "bad_certificate";
  17933. return bad_certificate_str;
  17934. }
  17935. case unsupported_certificate:
  17936. {
  17937. static const char unsupported_certificate_str[] =
  17938. "unsupported_certificate";
  17939. return unsupported_certificate_str;
  17940. }
  17941. case certificate_revoked:
  17942. {
  17943. static const char certificate_revoked_str[] =
  17944. "certificate_revoked";
  17945. return certificate_revoked_str;
  17946. }
  17947. case certificate_expired:
  17948. {
  17949. static const char certificate_expired_str[] =
  17950. "certificate_expired";
  17951. return certificate_expired_str;
  17952. }
  17953. case certificate_unknown:
  17954. {
  17955. static const char certificate_unknown_str[] =
  17956. "certificate_unknown";
  17957. return certificate_unknown_str;
  17958. }
  17959. case illegal_parameter:
  17960. {
  17961. static const char illegal_parameter_str[] =
  17962. "illegal_parameter";
  17963. return illegal_parameter_str;
  17964. }
  17965. case unknown_ca:
  17966. {
  17967. static const char unknown_ca_str[] =
  17968. "unknown_ca";
  17969. return unknown_ca_str;
  17970. }
  17971. case access_denied:
  17972. {
  17973. static const char access_denied_str[] =
  17974. "access_denied";
  17975. return access_denied_str;
  17976. }
  17977. case decode_error:
  17978. {
  17979. static const char decode_error_str[] =
  17980. "decode_error";
  17981. return decode_error_str;
  17982. }
  17983. case decrypt_error:
  17984. {
  17985. static const char decrypt_error_str[] =
  17986. "decrypt_error";
  17987. return decrypt_error_str;
  17988. }
  17989. case wolfssl_alert_protocol_version:
  17990. {
  17991. static const char protocol_version_str[] =
  17992. "protocol_version";
  17993. return protocol_version_str;
  17994. }
  17995. case insufficient_security:
  17996. {
  17997. static const char insufficient_security_str[] =
  17998. "insufficient_security";
  17999. return insufficient_security_str;
  18000. }
  18001. case internal_error:
  18002. {
  18003. static const char internal_error_str[] =
  18004. "internal_error";
  18005. return internal_error_str;
  18006. }
  18007. case user_canceled:
  18008. {
  18009. static const char user_canceled_str[] =
  18010. "user_canceled";
  18011. return user_canceled_str;
  18012. }
  18013. case no_renegotiation:
  18014. {
  18015. static const char no_renegotiation_str[] =
  18016. "no_renegotiation";
  18017. return no_renegotiation_str;
  18018. }
  18019. case unrecognized_name:
  18020. {
  18021. static const char unrecognized_name_str[] =
  18022. "unrecognized_name";
  18023. return unrecognized_name_str;
  18024. }
  18025. case bad_certificate_status_response:
  18026. {
  18027. static const char bad_certificate_status_response_str[] =
  18028. "bad_certificate_status_response";
  18029. return bad_certificate_status_response_str;
  18030. }
  18031. case no_application_protocol:
  18032. {
  18033. static const char no_application_protocol_str[] =
  18034. "no_application_protocol";
  18035. return no_application_protocol_str;
  18036. }
  18037. default:
  18038. WOLFSSL_MSG("Unknown Alert");
  18039. return NULL;
  18040. }
  18041. }
  18042. static void LogAlert(int type)
  18043. {
  18044. #ifdef DEBUG_WOLFSSL
  18045. const char* typeStr;
  18046. typeStr = AlertTypeToString(type);
  18047. if (typeStr != NULL) {
  18048. char buff[60];
  18049. XSNPRINTF(buff, sizeof(buff), "Alert type: %s", typeStr);
  18050. WOLFSSL_MSG(buff);
  18051. }
  18052. #else
  18053. (void)type;
  18054. #endif /* DEBUG_WOLFSSL */
  18055. }
  18056. /* process alert, return level */
  18057. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
  18058. {
  18059. byte level;
  18060. byte code;
  18061. word32 dataSz = (word32)ssl->curSize;
  18062. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18063. if (ssl->hsInfoOn)
  18064. AddPacketName(ssl, "Alert");
  18065. if (ssl->toInfoOn) {
  18066. /* add record header back on to info + alert bytes level/code */
  18067. int ret = AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx,
  18068. ALERT_SIZE, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
  18069. if (ret != 0)
  18070. return ret;
  18071. #ifdef WOLFSSL_CALLBACKS
  18072. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  18073. #endif
  18074. }
  18075. #endif
  18076. if (IsEncryptionOn(ssl, 0)) {
  18077. int ivExtra = 0;
  18078. #ifndef WOLFSSL_AEAD_ONLY
  18079. if (ssl->specs.cipher_type == block) {
  18080. if (ssl->options.tls1_1)
  18081. ivExtra = ssl->specs.block_size;
  18082. }
  18083. else
  18084. #endif
  18085. if (ssl->specs.cipher_type == aead) {
  18086. if (CipherHasExpIV(ssl))
  18087. ivExtra = AESGCM_EXP_IV_SZ;
  18088. }
  18089. dataSz -= ivExtra;
  18090. dataSz -= ssl->keys.padSz;
  18091. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18092. if (ssl->options.startedETMRead)
  18093. dataSz -= MacSize(ssl);
  18094. #endif
  18095. }
  18096. /* make sure can read the message */
  18097. if (dataSz != ALERT_SIZE) {
  18098. #ifdef WOLFSSL_EXTRA_ALERTS
  18099. SendAlert(ssl, alert_fatal, unexpected_message);
  18100. #endif
  18101. return BUFFER_E;
  18102. }
  18103. level = input[(*inOutIdx)++];
  18104. code = input[(*inOutIdx)++];
  18105. ssl->alert_history.last_rx.code = code;
  18106. ssl->alert_history.last_rx.level = level;
  18107. *type = code;
  18108. if (level == alert_fatal) {
  18109. ssl->options.isClosed = 1; /* Don't send close_notify */
  18110. }
  18111. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  18112. WOLFSSL_MSG("Alert count exceeded");
  18113. #ifdef WOLFSSL_EXTRA_ALERTS
  18114. if (level != alert_warning || code != close_notify)
  18115. SendAlert(ssl, alert_fatal, unexpected_message);
  18116. #endif
  18117. WOLFSSL_ERROR_VERBOSE(ALERT_COUNT_E);
  18118. return ALERT_COUNT_E;
  18119. }
  18120. LogAlert(*type);
  18121. if (*type == close_notify) {
  18122. ssl->options.closeNotify = 1;
  18123. }
  18124. else {
  18125. /*
  18126. * A close_notify alert doesn't mean there's been an error, so we only
  18127. * add other types of alerts to the error queue
  18128. */
  18129. WOLFSSL_ERROR(*type);
  18130. }
  18131. if (IsEncryptionOn(ssl, 0)) {
  18132. *inOutIdx += ssl->keys.padSz;
  18133. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18134. if (ssl->options.startedETMRead)
  18135. *inOutIdx += MacSize(ssl);
  18136. #endif
  18137. }
  18138. return level;
  18139. }
  18140. static int GetInputData(WOLFSSL *ssl, word32 size)
  18141. {
  18142. int inSz;
  18143. int maxLength;
  18144. int usedLength;
  18145. int dtlsExtra = 0;
  18146. /* check max input length */
  18147. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  18148. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  18149. inSz = (int)(size - usedLength); /* from last partial read */
  18150. #ifdef WOLFSSL_DTLS
  18151. if (ssl->options.dtls && IsDtlsNotSctpMode(ssl)) {
  18152. /* Add DTLS_MTU_ADDITIONAL_READ_BUFFER bytes so that we can operate with
  18153. * slight difference in set MTU size on each peer */
  18154. #ifdef WOLFSSL_DTLS_MTU
  18155. inSz = (word32)ssl->dtlsMtuSz + DTLS_MTU_ADDITIONAL_READ_BUFFER;
  18156. #else
  18157. inSz = MAX_MTU + DTLS_MTU_ADDITIONAL_READ_BUFFER;
  18158. #endif
  18159. if (size < (word32)inSz)
  18160. dtlsExtra = (int)(inSz - size);
  18161. }
  18162. #endif
  18163. /* check that no lengths or size values are negative */
  18164. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  18165. return BUFFER_ERROR;
  18166. }
  18167. if (inSz > maxLength) {
  18168. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  18169. return MEMORY_E;
  18170. }
  18171. /* Put buffer data at start if not there */
  18172. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  18173. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  18174. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  18175. usedLength);
  18176. /* remove processed data */
  18177. ssl->buffers.inputBuffer.idx = 0;
  18178. ssl->buffers.inputBuffer.length = usedLength;
  18179. /* read data from network */
  18180. do {
  18181. int in = wolfSSLReceive(ssl,
  18182. ssl->buffers.inputBuffer.buffer +
  18183. ssl->buffers.inputBuffer.length,
  18184. inSz);
  18185. if (in == WANT_READ)
  18186. return WANT_READ;
  18187. if (in < 0) {
  18188. WOLFSSL_ERROR_VERBOSE(SOCKET_ERROR_E);
  18189. return SOCKET_ERROR_E;
  18190. }
  18191. if (in > inSz) {
  18192. WOLFSSL_ERROR_VERBOSE(RECV_OVERFLOW_E);
  18193. return RECV_OVERFLOW_E;
  18194. }
  18195. ssl->buffers.inputBuffer.length += in;
  18196. inSz -= in;
  18197. } while (ssl->buffers.inputBuffer.length < size);
  18198. #ifdef WOLFSSL_DEBUG_TLS
  18199. if (ssl->buffers.inputBuffer.idx == 0) {
  18200. WOLFSSL_MSG("Data received");
  18201. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  18202. ssl->buffers.inputBuffer.length);
  18203. }
  18204. #endif
  18205. return 0;
  18206. }
  18207. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18208. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  18209. int content)
  18210. {
  18211. int ret;
  18212. #ifdef HAVE_TRUNCATED_HMAC
  18213. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  18214. : ssl->specs.hash_size;
  18215. #else
  18216. word32 digestSz = ssl->specs.hash_size;
  18217. #endif
  18218. byte verify[WC_MAX_DIGEST_SIZE];
  18219. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  18220. if (msgSz < digestSz) {
  18221. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18222. return VERIFY_MAC_ERROR;
  18223. }
  18224. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
  18225. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  18226. if (ret != 0) {
  18227. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18228. return VERIFY_MAC_ERROR;
  18229. }
  18230. return 0;
  18231. }
  18232. #endif
  18233. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  18234. int content, word32* padSz)
  18235. {
  18236. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  18237. int ret;
  18238. word32 pad = 0;
  18239. word32 padByte = 0;
  18240. #ifdef HAVE_TRUNCATED_HMAC
  18241. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  18242. : ssl->specs.hash_size;
  18243. #else
  18244. word32 digestSz = ssl->specs.hash_size;
  18245. #endif
  18246. byte verify[WC_MAX_DIGEST_SIZE];
  18247. if (ssl->specs.cipher_type == block) {
  18248. int ivExtra = 0;
  18249. if (ssl->options.tls1_1)
  18250. ivExtra = ssl->specs.block_size;
  18251. pad = *(input + msgSz - ivExtra - 1);
  18252. padByte = 1;
  18253. if (ssl->options.tls) {
  18254. #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
  18255. ret = PROTOCOLCB_UNAVAILABLE;
  18256. if(ssl->ctx->VerifyMacCb) {
  18257. void* ctx = wolfSSL_GetVerifyMacCtx(ssl);
  18258. ret = ssl->ctx->VerifyMacCb(ssl, input,
  18259. (msgSz - ivExtra) - digestSz - pad - 1,
  18260. digestSz, content, ctx);
  18261. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  18262. return ret;
  18263. }
  18264. }
  18265. if (!ssl->ctx->VerifyMacCb || ret == PROTOCOLCB_UNAVAILABLE)
  18266. #endif
  18267. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  18268. content);
  18269. if (ret != 0)
  18270. return ret;
  18271. }
  18272. else { /* sslv3, some implementations have bad padding, but don't
  18273. * allow bad read */
  18274. int badPadLen = 0;
  18275. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE];
  18276. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  18277. XMEMSET(dmy, 0, sizeof(dmy));
  18278. if (pad > (msgSz - digestSz - 1)) {
  18279. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  18280. pad = 0; /* no bad read */
  18281. badPadLen = 1;
  18282. }
  18283. (void)PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  18284. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
  18285. pad, content, 1, PEER_ORDER);
  18286. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  18287. digestSz) != 0) {
  18288. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18289. return VERIFY_MAC_ERROR;
  18290. }
  18291. if (ret != 0 || badPadLen) {
  18292. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18293. return VERIFY_MAC_ERROR;
  18294. }
  18295. }
  18296. }
  18297. else if (ssl->specs.cipher_type == stream) {
  18298. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
  18299. PEER_ORDER);
  18300. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0) {
  18301. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18302. return VERIFY_MAC_ERROR;
  18303. }
  18304. if (ret != 0) {
  18305. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  18306. return VERIFY_MAC_ERROR;
  18307. }
  18308. }
  18309. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  18310. if (ssl->specs.cipher_type == aead) {
  18311. *padSz = ssl->specs.aead_mac_size;
  18312. }
  18313. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  18314. else {
  18315. *padSz = digestSz + pad + padByte;
  18316. }
  18317. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  18318. (void)input;
  18319. (void)msgSz;
  18320. (void)content;
  18321. return 0;
  18322. }
  18323. #ifdef WOLFSSL_DTLS
  18324. static int HandleDTLSDecryptFailed(WOLFSSL* ssl)
  18325. {
  18326. int ret = 0;
  18327. #ifdef WOLFSSL_DTLS_DROP_STATS
  18328. ssl->macDropCount++;
  18329. #endif
  18330. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  18331. /* Handle AEAD limits specified by the RFC for failed decryption */
  18332. if (IsAtLeastTLSv1_3(ssl->version))
  18333. ret = Dtls13CheckAEADFailLimit(ssl);
  18334. #endif
  18335. (void)ssl;
  18336. WOLFSSL_MSG("DTLS: Ignoring failed decryption");
  18337. return ret;
  18338. }
  18339. static int DtlsShouldDrop(WOLFSSL* ssl, int retcode)
  18340. {
  18341. if (ssl->options.handShakeDone && !IsEncryptionOn(ssl, 0) &&
  18342. !ssl->options.dtlsHsRetain) {
  18343. WOLFSSL_MSG("Silently dropping plaintext DTLS message "
  18344. "on established connection when we have nothing to send.");
  18345. return 1;
  18346. }
  18347. if ((ssl->options.handShakeDone && retcode != 0)
  18348. || retcode == SEQUENCE_ERROR || retcode == DTLS_CID_ERROR) {
  18349. WOLFSSL_MSG_EX("Silently dropping DTLS message: %d", retcode);
  18350. return 1;
  18351. }
  18352. #ifdef WOLFSSL_DTLS13
  18353. if (IsAtLeastTLSv1_3(ssl->version) && !w64IsZero(ssl->dtls13Epoch)
  18354. && w64IsZero(ssl->keys.curEpoch64) && ssl->curRL.type != ack) {
  18355. WOLFSSL_MSG("Silently dropping plaintext DTLS message "
  18356. "during encrypted handshake.");
  18357. return 1;
  18358. }
  18359. #endif /* WOLFSSL_DTLS13 */
  18360. #ifndef NO_WOLFSSL_SERVER
  18361. if (ssl->options.side == WOLFSSL_SERVER_END
  18362. && ssl->curRL.type != handshake && !IsSCR(ssl)) {
  18363. if (!ssl->options.dtlsStateful) {
  18364. WOLFSSL_MSG("Drop non-handshake record when not stateful");
  18365. return 1;
  18366. }
  18367. }
  18368. #endif /* NO_WOLFSSL_SERVER */
  18369. return 0;
  18370. }
  18371. #endif /* WOLFSSL_DTLS */
  18372. int ProcessReply(WOLFSSL* ssl)
  18373. {
  18374. return ProcessReplyEx(ssl, 0);
  18375. }
  18376. /* Process input requests. Return 0 is done, 1 is call again to complete, and
  18377. negative number is error. If allowSocketErr is set, SOCKET_ERROR_E in
  18378. ssl->error will be whitelisted. This is useful when the connection has been
  18379. closed and the endpoint wants to check for an alert sent by the other end. */
  18380. int ProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
  18381. {
  18382. int ret = 0, type = internal_error, readSz;
  18383. int atomicUser = 0;
  18384. #if defined(WOLFSSL_DTLS)
  18385. int used;
  18386. #endif
  18387. #ifdef ATOMIC_USER
  18388. if (ssl->ctx->DecryptVerifyCb)
  18389. atomicUser = 1;
  18390. #endif
  18391. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  18392. #if defined(HAVE_SECURE_RENEGOTIATION) || defined(WOLFSSL_DTLS13)
  18393. && ssl->error != APP_DATA_READY
  18394. #endif
  18395. #ifdef WOLFSSL_ASYNC_CRYPT
  18396. && ssl->error != WC_PENDING_E
  18397. #endif
  18398. #ifdef WOLFSSL_NONBLOCK_OCSP
  18399. && ssl->error != OCSP_WANT_READ
  18400. #endif
  18401. && (allowSocketErr != 1 || ssl->error != SOCKET_ERROR_E)
  18402. ) {
  18403. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  18404. return ssl->error;
  18405. }
  18406. /* If checking alert on error (allowSocketErr == 1) do not try and
  18407. * process alerts for async or ocsp non blocking */
  18408. #if defined(WOLFSSL_CHECK_ALERT_ON_ERR) && \
  18409. (defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP))
  18410. if (allowSocketErr == 1 && \
  18411. (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  18412. return ssl->error;
  18413. }
  18414. #endif
  18415. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
  18416. /* process any pending DTLS messages - this flow can happen with async */
  18417. if (ssl->dtls_rx_msg_list != NULL) {
  18418. word32 pendingMsg = ssl->dtls_rx_msg_list_sz;
  18419. if(IsAtLeastTLSv1_3(ssl->version)) {
  18420. #ifdef WOLFSSL_DTLS13
  18421. ret = Dtls13ProcessBufferedMessages(ssl);
  18422. #else
  18423. ret = NOT_COMPILED_IN;
  18424. #endif /* WOLFSSL_DTLS13 */
  18425. }
  18426. else {
  18427. ret = DtlsMsgDrain(ssl);
  18428. }
  18429. if (ret != 0) {
  18430. WOLFSSL_ERROR(ret);
  18431. return ret;
  18432. }
  18433. /* we processed some messages, return so connect/accept can make
  18434. progress */
  18435. if (ssl->dtls_rx_msg_list_sz != pendingMsg)
  18436. return ret;
  18437. }
  18438. #endif
  18439. ret = RetrySendAlert(ssl);
  18440. if (ret != 0) {
  18441. WOLFSSL_MSG_EX("RetrySendAlert failed, giving up. err = %d", ret);
  18442. return ret;
  18443. }
  18444. for (;;) {
  18445. switch (ssl->options.processReply) {
  18446. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  18447. * old client hello */
  18448. case doProcessInit:
  18449. readSz = RECORD_HEADER_SZ;
  18450. #ifdef WOLFSSL_DTLS
  18451. if (ssl->options.dtls) {
  18452. readSz = DTLS_RECORD_HEADER_SZ;
  18453. #ifdef WOLFSSL_DTLS13
  18454. if (ssl->options.tls1_3) {
  18455. /* dtls1.3 unified header can be as little as 2 bytes */
  18456. readSz = DTLS_UNIFIED_HEADER_MIN_SZ;
  18457. }
  18458. #endif /* WOLFSSL_DTLS13 */
  18459. }
  18460. #endif
  18461. /* get header or return error */
  18462. if (!ssl->options.dtls) {
  18463. if ((ret = GetInputData(ssl, readSz)) < 0)
  18464. return ret;
  18465. } else {
  18466. #ifdef WOLFSSL_DTLS
  18467. /* read ahead may already have header */
  18468. used = ssl->buffers.inputBuffer.length -
  18469. ssl->buffers.inputBuffer.idx;
  18470. if (used < readSz) {
  18471. if ((ret = GetInputData(ssl, readSz)) < 0)
  18472. return ret;
  18473. }
  18474. #endif
  18475. }
  18476. #ifdef OLD_HELLO_ALLOWED
  18477. /* see if sending SSLv2 client hello */
  18478. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  18479. ssl->options.clientState == NULL_STATE &&
  18480. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  18481. != handshake) {
  18482. byte b0, b1;
  18483. ssl->options.processReply = runProcessOldClientHello;
  18484. /* sanity checks before getting size at front */
  18485. if (ssl->buffers.inputBuffer.buffer[
  18486. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  18487. WOLFSSL_MSG("Not a valid old client hello");
  18488. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  18489. return PARSE_ERROR;
  18490. }
  18491. if (ssl->buffers.inputBuffer.buffer[
  18492. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  18493. ssl->buffers.inputBuffer.buffer[
  18494. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  18495. WOLFSSL_MSG("Not a valid version in old client hello");
  18496. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  18497. return PARSE_ERROR;
  18498. }
  18499. /* how many bytes need ProcessOldClientHello */
  18500. b0 =
  18501. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  18502. b1 =
  18503. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  18504. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  18505. }
  18506. else {
  18507. ssl->options.processReply = getRecordLayerHeader;
  18508. continue;
  18509. }
  18510. FALL_THROUGH;
  18511. /* in the WOLFSSL_SERVER case, run the old client hello */
  18512. case runProcessOldClientHello:
  18513. /* get sz bytes or return error */
  18514. if (!ssl->options.dtls) {
  18515. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  18516. return ret;
  18517. } else {
  18518. #ifdef WOLFSSL_DTLS
  18519. /* read ahead may already have */
  18520. used = ssl->buffers.inputBuffer.length -
  18521. ssl->buffers.inputBuffer.idx;
  18522. if (used < ssl->curSize)
  18523. if ((ret = GetInputData(ssl, ssl->curSize - used)) < 0)
  18524. return ret;
  18525. #endif /* WOLFSSL_DTLS */
  18526. }
  18527. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  18528. &ssl->buffers.inputBuffer.idx,
  18529. ssl->buffers.inputBuffer.length -
  18530. ssl->buffers.inputBuffer.idx,
  18531. ssl->curSize);
  18532. if (ret < 0)
  18533. return ret;
  18534. else if (ssl->buffers.inputBuffer.idx ==
  18535. ssl->buffers.inputBuffer.length) {
  18536. ssl->options.processReply = doProcessInit;
  18537. return 0;
  18538. }
  18539. #endif /* OLD_HELLO_ALLOWED */
  18540. FALL_THROUGH;
  18541. /* get the record layer header */
  18542. case getRecordLayerHeader:
  18543. /* DTLSv1.3 record numbers in the header are encrypted, and AAD
  18544. * uses the unencrypted form. Because of this we need to modify the
  18545. * header, decrypting the numbers inside
  18546. * DtlsParseUnifiedRecordLayer(). This violates the const attribute
  18547. * of the buffer parameter of GetRecordHeader() used here. */
  18548. ret = GetRecordHeader(ssl, &ssl->buffers.inputBuffer.idx,
  18549. &ssl->curRL, &ssl->curSize);
  18550. #ifdef WOLFSSL_DTLS
  18551. if (ssl->options.dtls && DtlsShouldDrop(ssl, ret)) {
  18552. ssl->options.processReply = doProcessInit;
  18553. ssl->buffers.inputBuffer.length = 0;
  18554. ssl->buffers.inputBuffer.idx = 0;
  18555. #ifdef WOLFSSL_DTLS_DROP_STATS
  18556. ssl->replayDropCount++;
  18557. #endif /* WOLFSSL_DTLS_DROP_STATS */
  18558. #ifdef WOLFSSL_DTLS13
  18559. /* return to send ACKS and shortcut rtx timer */
  18560. if (IsAtLeastTLSv1_3(ssl->version)
  18561. && ssl->dtls13Rtx.sendAcks)
  18562. return 0;
  18563. #endif /* WOLFSSL_DTLS13 */
  18564. continue;
  18565. }
  18566. #endif
  18567. if (ret != 0) {
  18568. switch (ret) {
  18569. case VERSION_ERROR:
  18570. /* send alert per RFC5246 Appendix E. Backward
  18571. * Compatibility */
  18572. if (ssl->options.side == WOLFSSL_CLIENT_END)
  18573. SendAlert(ssl, alert_fatal,
  18574. wolfssl_alert_protocol_version);
  18575. break;
  18576. #ifdef HAVE_MAX_FRAGMENT
  18577. case LENGTH_ERROR:
  18578. SendAlert(ssl, alert_fatal, record_overflow);
  18579. break;
  18580. #endif /* HAVE_MAX_FRAGMENT */
  18581. default:
  18582. break;
  18583. }
  18584. return ret;
  18585. }
  18586. #ifdef WOLFSSL_TLS13
  18587. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  18588. ssl->curRL.type != application_data &&
  18589. ssl->curRL.type != change_cipher_spec) {
  18590. SendAlert(ssl, alert_fatal, unexpected_message);
  18591. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  18592. return PARSE_ERROR;
  18593. }
  18594. #endif
  18595. ssl->options.processReply = getData;
  18596. FALL_THROUGH;
  18597. /* retrieve record layer data */
  18598. case getData:
  18599. /* get sz bytes or return error */
  18600. if (!ssl->options.dtls) {
  18601. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  18602. #ifdef WOLFSSL_EXTRA_ALERTS
  18603. if (ret != WANT_READ)
  18604. SendAlert(ssl, alert_fatal, bad_record_mac);
  18605. #endif
  18606. return ret;
  18607. }
  18608. }
  18609. else {
  18610. #ifdef WOLFSSL_DTLS
  18611. /* read ahead may already have */
  18612. used = ssl->buffers.inputBuffer.length -
  18613. ssl->buffers.inputBuffer.idx;
  18614. if (used < ssl->curSize)
  18615. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  18616. return ret;
  18617. #endif
  18618. }
  18619. if (IsEncryptionOn(ssl, 0)) {
  18620. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  18621. int tooLong = 0;
  18622. #endif
  18623. #ifdef WOLFSSL_TLS13
  18624. if (IsAtLeastTLSv1_3(ssl->version)) {
  18625. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  18626. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  18627. MAX_TLS13_PLAIN_SZ;
  18628. }
  18629. #endif
  18630. #ifdef WOLFSSL_EXTRA_ALERTS
  18631. if (!IsAtLeastTLSv1_3(ssl->version))
  18632. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  18633. #endif
  18634. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  18635. if (tooLong) {
  18636. WOLFSSL_MSG("Encrypted data too long");
  18637. SendAlert(ssl, alert_fatal, record_overflow);
  18638. return BUFFER_ERROR;
  18639. }
  18640. #endif
  18641. }
  18642. ssl->keys.padSz = 0;
  18643. ssl->options.processReply = verifyEncryptedMessage;
  18644. /* in case > 1 msg per record */
  18645. ssl->curStartIdx = ssl->buffers.inputBuffer.idx;
  18646. FALL_THROUGH;
  18647. /* verify digest of encrypted message */
  18648. case verifyEncryptedMessage:
  18649. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18650. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  18651. !atomicUser && ssl->options.startedETMRead) {
  18652. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  18653. ssl->buffers.inputBuffer.idx,
  18654. ssl->curSize, ssl->curRL.type);
  18655. #ifdef WOLFSSL_ASYNC_CRYPT
  18656. if (ret == WC_PENDING_E)
  18657. return ret;
  18658. #endif
  18659. if (ret < 0) {
  18660. WOLFSSL_MSG("VerifyMacEnc failed");
  18661. #ifdef WOLFSSL_DTLS
  18662. /* If in DTLS mode, if the decrypt fails for any
  18663. * reason, pretend the datagram never happened. */
  18664. if (ssl->options.dtls) {
  18665. ssl->options.processReply = doProcessInit;
  18666. ssl->buffers.inputBuffer.idx =
  18667. ssl->buffers.inputBuffer.length;
  18668. return HandleDTLSDecryptFailed(ssl);
  18669. }
  18670. #endif /* WOLFSSL_DTLS */
  18671. #ifdef WOLFSSL_EXTRA_ALERTS
  18672. if (!ssl->options.dtls)
  18673. SendAlert(ssl, alert_fatal, bad_record_mac);
  18674. #endif
  18675. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  18676. return DECRYPT_ERROR;
  18677. }
  18678. ssl->keys.encryptSz = ssl->curSize;
  18679. }
  18680. #endif
  18681. ssl->options.processReply = decryptMessage;
  18682. FALL_THROUGH;
  18683. /* decrypt message */
  18684. case decryptMessage:
  18685. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  18686. (!IsAtLeastTLSv1_3(ssl->version) ||
  18687. ssl->curRL.type != change_cipher_spec))
  18688. {
  18689. bufferStatic* in = &ssl->buffers.inputBuffer;
  18690. ret = SanityCheckCipherText(ssl, ssl->curSize);
  18691. if (ret < 0) {
  18692. #ifdef WOLFSSL_EXTRA_ALERTS
  18693. SendAlert(ssl, alert_fatal, bad_record_mac);
  18694. #endif
  18695. return ret;
  18696. }
  18697. if (atomicUser) {
  18698. #ifdef ATOMIC_USER
  18699. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18700. if (ssl->options.startedETMRead) {
  18701. ret = ssl->ctx->VerifyDecryptCb(ssl,
  18702. in->buffer + in->idx, in->buffer + in->idx,
  18703. ssl->curSize - MacSize(ssl),
  18704. ssl->curRL.type, 1, &ssl->keys.padSz,
  18705. ssl->DecryptVerifyCtx);
  18706. }
  18707. else
  18708. #endif
  18709. {
  18710. ret = ssl->ctx->DecryptVerifyCb(ssl,
  18711. in->buffer + in->idx,
  18712. in->buffer + in->idx,
  18713. ssl->curSize, ssl->curRL.type, 1,
  18714. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  18715. }
  18716. #endif /* ATOMIC_USER */
  18717. }
  18718. else {
  18719. if (!ssl->options.tls1_3) {
  18720. #ifndef WOLFSSL_NO_TLS12
  18721. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18722. if (ssl->options.startedETMRead) {
  18723. word32 digestSz = MacSize(ssl);
  18724. ret = DecryptTls(ssl,
  18725. in->buffer + in->idx,
  18726. in->buffer + in->idx,
  18727. ssl->curSize - (word16)digestSz);
  18728. if (ret == 0) {
  18729. byte invalid = 0;
  18730. byte padding = (byte)-1;
  18731. word32 i;
  18732. word32 off = in->idx + ssl->curSize - digestSz - 1;
  18733. /* Last of padding bytes - indicates length. */
  18734. ssl->keys.padSz = in->buffer[off];
  18735. /* Constant time checking of padding - don't leak
  18736. * the length of the data.
  18737. */
  18738. /* Compare max pad bytes or at most data + pad. */
  18739. for (i = 1; i < MAX_PAD_SIZE && off >= i; i++) {
  18740. /* Mask on indicates this is expected to be a
  18741. * padding byte.
  18742. */
  18743. padding &= ctMaskLTE(i, ssl->keys.padSz);
  18744. /* When this is a padding byte and not equal
  18745. * to length then mask is set.
  18746. */
  18747. invalid |= padding &
  18748. ctMaskNotEq(in->buffer[off - i],
  18749. ssl->keys.padSz);
  18750. }
  18751. /* If mask is set then there was an error. */
  18752. if (invalid) {
  18753. ret = DECRYPT_ERROR;
  18754. }
  18755. ssl->keys.padSz += 1;
  18756. ssl->keys.decryptedCur = 1;
  18757. }
  18758. }
  18759. else
  18760. #endif
  18761. {
  18762. ret = DecryptTls(ssl,
  18763. in->buffer + in->idx,
  18764. in->buffer + in->idx,
  18765. ssl->curSize);
  18766. }
  18767. #else
  18768. ret = DECRYPT_ERROR;
  18769. #endif
  18770. }
  18771. else
  18772. {
  18773. #ifdef WOLFSSL_TLS13
  18774. byte *aad = (byte*)&ssl->curRL;
  18775. word16 aad_size = RECORD_HEADER_SZ;
  18776. #ifdef WOLFSSL_DTLS13
  18777. if (ssl->options.dtls) {
  18778. /* aad now points to the record header */
  18779. aad = ssl->dtls13CurRL;
  18780. aad_size = ssl->dtls13CurRlLength;
  18781. }
  18782. #endif /* WOLFSSL_DTLS13 */
  18783. /* Don't send an alert for DTLS. We will just drop it
  18784. * silently later. */
  18785. ret = DecryptTls13(ssl,
  18786. in->buffer + in->idx,
  18787. in->buffer + in->idx,
  18788. ssl->curSize,
  18789. aad, aad_size);
  18790. #else
  18791. ret = DECRYPT_ERROR;
  18792. #endif /* WOLFSSL_TLS13 */
  18793. }
  18794. (void)in;
  18795. }
  18796. #ifdef WOLFSSL_ASYNC_CRYPT
  18797. if (ret == WC_PENDING_E)
  18798. return ret;
  18799. #endif
  18800. if (ret >= 0) {
  18801. #ifndef WOLFSSL_NO_TLS12
  18802. /* handle success */
  18803. #ifndef WOLFSSL_AEAD_ONLY
  18804. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  18805. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  18806. #endif
  18807. /* go past TLSv1.1 IV */
  18808. if (CipherHasExpIV(ssl))
  18809. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  18810. #endif
  18811. }
  18812. else {
  18813. WOLFSSL_MSG("Decrypt failed");
  18814. #ifdef WOLFSSL_DTLS
  18815. /* If in DTLS mode, if the decrypt fails for any
  18816. * reason, pretend the datagram never happened. */
  18817. if (ssl->options.dtls) {
  18818. ssl->options.processReply = doProcessInit;
  18819. ssl->buffers.inputBuffer.idx =
  18820. ssl->buffers.inputBuffer.length;
  18821. return HandleDTLSDecryptFailed(ssl);
  18822. }
  18823. #endif /* WOLFSSL_DTLS */
  18824. #ifdef WOLFSSL_EARLY_DATA
  18825. if (ssl->options.tls1_3) {
  18826. if (ssl->options.side == WOLFSSL_SERVER_END &&
  18827. ssl->earlyData != no_early_data &&
  18828. ssl->options.clientState <
  18829. CLIENT_FINISHED_COMPLETE) {
  18830. ssl->earlyDataSz += ssl->curSize;
  18831. if (ssl->earlyDataSz <=
  18832. ssl->options.maxEarlyDataSz) {
  18833. WOLFSSL_MSG("Ignoring EarlyData!");
  18834. if (ssl->keys.peer_sequence_number_lo-- == 0)
  18835. ssl->keys.peer_sequence_number_hi--;
  18836. ssl->options.processReply = doProcessInit;
  18837. ssl->buffers.inputBuffer.idx += ssl->curSize;
  18838. if (ssl->buffers.inputBuffer.idx >
  18839. ssl->buffers.inputBuffer.length) {
  18840. WOLFSSL_ERROR(BUFFER_E);
  18841. return BUFFER_E;
  18842. }
  18843. return 0;
  18844. }
  18845. WOLFSSL_MSG("Too much EarlyData!");
  18846. SendAlert(ssl, alert_fatal, unexpected_message);
  18847. WOLFSSL_ERROR(TOO_MUCH_EARLY_DATA);
  18848. return TOO_MUCH_EARLY_DATA;
  18849. }
  18850. }
  18851. #endif
  18852. SendAlert(ssl, alert_fatal, bad_record_mac);
  18853. /* Push error once we know that we will error out here */
  18854. WOLFSSL_ERROR(ret);
  18855. return ret;
  18856. }
  18857. }
  18858. ssl->options.processReply = verifyMessage;
  18859. FALL_THROUGH;
  18860. /* verify digest of message */
  18861. case verifyMessage:
  18862. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  18863. (!IsAtLeastTLSv1_3(ssl->version) ||
  18864. ssl->curRL.type != change_cipher_spec))
  18865. {
  18866. if (!atomicUser
  18867. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18868. && !ssl->options.startedETMRead
  18869. #endif
  18870. ) {
  18871. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  18872. ssl->buffers.inputBuffer.idx,
  18873. ssl->curSize, ssl->curRL.type,
  18874. &ssl->keys.padSz);
  18875. #ifdef WOLFSSL_ASYNC_CRYPT
  18876. if (ret == WC_PENDING_E)
  18877. return ret;
  18878. #endif
  18879. if (ret < 0) {
  18880. #ifdef WOLFSSL_DTLS
  18881. /* If in DTLS mode, if the decrypt fails for any
  18882. * reason, pretend the datagram never happened. */
  18883. if (ssl->options.dtls) {
  18884. ssl->options.processReply = doProcessInit;
  18885. ssl->buffers.inputBuffer.idx =
  18886. ssl->buffers.inputBuffer.length;
  18887. return HandleDTLSDecryptFailed(ssl);
  18888. }
  18889. #endif /* WOLFSSL_DTLS */
  18890. #if defined(WOLFSSL_EXTRA_ALERTS) && !defined(WOLFSSL_NO_ETM_ALERT)
  18891. if (!ssl->options.dtls)
  18892. SendAlert(ssl, alert_fatal, bad_record_mac);
  18893. #endif
  18894. WOLFSSL_MSG("VerifyMac failed");
  18895. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  18896. return DECRYPT_ERROR;
  18897. }
  18898. }
  18899. ssl->keys.encryptSz = ssl->curSize;
  18900. ssl->keys.decryptedCur = 1;
  18901. #ifdef WOLFSSL_TLS13
  18902. if (ssl->options.tls1_3) {
  18903. word32 i = (ssl->buffers.inputBuffer.idx +
  18904. ssl->curSize - ssl->specs.aead_mac_size);
  18905. /* check that the end of the logical length doesn't extend
  18906. * past the real buffer */
  18907. if (i > ssl->buffers.inputBuffer.length || i == 0) {
  18908. WOLFSSL_ERROR(BUFFER_ERROR);
  18909. return BUFFER_ERROR;
  18910. }
  18911. /* Remove padding from end of plain text. */
  18912. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  18913. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  18914. break;
  18915. }
  18916. /* Get the real content type from the end of the data. */
  18917. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  18918. /* consider both contentType byte and MAC as padding */
  18919. ssl->keys.padSz = ssl->buffers.inputBuffer.idx
  18920. + ssl->curSize - i;
  18921. }
  18922. #endif
  18923. }
  18924. ssl->options.processReply = runProcessingOneRecord;
  18925. FALL_THROUGH;
  18926. /* the record layer is here */
  18927. case runProcessingOneRecord:
  18928. #ifdef WOLFSSL_DTLS13
  18929. if (ssl->options.dtls) {
  18930. if (IsAtLeastTLSv1_3(ssl->version)) {
  18931. if (!Dtls13CheckWindow(ssl)) {
  18932. /* drop packet */
  18933. WOLFSSL_MSG("Dropping DTLS record outside receiving "
  18934. "window");
  18935. ssl->options.processReply = doProcessInit;
  18936. ssl->buffers.inputBuffer.idx += ssl->curSize;
  18937. if (ssl->buffers.inputBuffer.idx >
  18938. ssl->buffers.inputBuffer.length)
  18939. return BUFFER_E;
  18940. continue;
  18941. }
  18942. /* Only update the window once we enter stateful parsing */
  18943. if (ssl->options.dtlsStateful) {
  18944. ret = Dtls13UpdateWindowRecordRecvd(ssl);
  18945. if (ret != 0) {
  18946. WOLFSSL_ERROR(ret);
  18947. return ret;
  18948. }
  18949. }
  18950. }
  18951. else if (IsDtlsNotSctpMode(ssl)) {
  18952. DtlsUpdateWindow(ssl);
  18953. }
  18954. }
  18955. #endif /* WOLFSSL_DTLS13 */
  18956. ssl->options.processReply = runProcessingOneMessage;
  18957. FALL_THROUGH;
  18958. case runProcessingOneMessage:
  18959. /* can't process a message if we have no data. */
  18960. if (ssl->buffers.inputBuffer.idx
  18961. >= ssl->buffers.inputBuffer.length) {
  18962. return BUFFER_ERROR;
  18963. }
  18964. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18965. if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
  18966. /* For TLS v1.1 the block size and explicit IV are added to idx,
  18967. * so it needs to be included in this limit check */
  18968. if ((ssl->curSize - ssl->keys.padSz -
  18969. (ssl->buffers.inputBuffer.idx - ssl->curStartIdx) -
  18970. MacSize(ssl) > MAX_PLAINTEXT_SZ)
  18971. #ifdef WOLFSSL_ASYNC_CRYPT
  18972. && ssl->buffers.inputBuffer.length !=
  18973. ssl->buffers.inputBuffer.idx
  18974. #endif
  18975. ) {
  18976. WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
  18977. #if defined(WOLFSSL_EXTRA_ALERTS) && !defined(WOLFSSL_NO_ETM_ALERT)
  18978. SendAlert(ssl, alert_fatal, record_overflow);
  18979. #endif
  18980. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  18981. return BUFFER_ERROR;
  18982. }
  18983. }
  18984. else
  18985. #endif
  18986. /* TLS13 plaintext limit is checked earlier before decryption */
  18987. /* For TLS v1.1 the block size and explicit IV are added to idx,
  18988. * so it needs to be included in this limit check */
  18989. if (!IsAtLeastTLSv1_3(ssl->version)
  18990. && ssl->curSize - ssl->keys.padSz -
  18991. (ssl->buffers.inputBuffer.idx - ssl->curStartIdx)
  18992. > MAX_PLAINTEXT_SZ
  18993. #ifdef WOLFSSL_ASYNC_CRYPT
  18994. && ssl->buffers.inputBuffer.length !=
  18995. ssl->buffers.inputBuffer.idx
  18996. #endif
  18997. ) {
  18998. WOLFSSL_MSG("Plaintext too long");
  18999. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  19000. SendAlert(ssl, alert_fatal, record_overflow);
  19001. #endif
  19002. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  19003. return BUFFER_ERROR;
  19004. }
  19005. WOLFSSL_MSG("received record layer msg");
  19006. switch (ssl->curRL.type) {
  19007. case handshake :
  19008. WOLFSSL_MSG("got HANDSHAKE");
  19009. /* debugging in DoHandShakeMsg */
  19010. if (ssl->options.dtls) {
  19011. #ifdef WOLFSSL_DTLS
  19012. if (!IsAtLeastTLSv1_3(ssl->version)) {
  19013. ret = DoDtlsHandShakeMsg(ssl,
  19014. ssl->buffers.inputBuffer.buffer,
  19015. &ssl->buffers.inputBuffer.idx,
  19016. ssl->buffers.inputBuffer.length);
  19017. if (ret == 0 || ret == WC_PENDING_E) {
  19018. /* Reset timeout as we have received a valid
  19019. * DTLS handshake message */
  19020. ssl->dtls_timeout = ssl->dtls_timeout_init;
  19021. }
  19022. else {
  19023. if (SendFatalAlertOnly(ssl, ret)
  19024. == SOCKET_ERROR_E) {
  19025. ret = SOCKET_ERROR_E;
  19026. }
  19027. }
  19028. }
  19029. #endif
  19030. #ifdef WOLFSSL_DTLS13
  19031. if (IsAtLeastTLSv1_3(ssl->version)) {
  19032. ret = Dtls13HandshakeRecv(ssl,
  19033. ssl->buffers.inputBuffer.buffer,
  19034. &ssl->buffers.inputBuffer.idx,
  19035. ssl->buffers.inputBuffer.length);
  19036. #ifdef WOLFSSL_EARLY_DATA
  19037. if (ret == 0 &&
  19038. ssl->options.side == WOLFSSL_SERVER_END &&
  19039. ssl->earlyData > early_data_ext &&
  19040. ssl->options.handShakeState == HANDSHAKE_DONE) {
  19041. /* return so wolfSSL_read_early_data can return
  19042. exit */
  19043. ssl->earlyData = no_early_data;
  19044. ssl->options.processReply = doProcessInit;
  19045. return ZERO_RETURN;
  19046. }
  19047. #endif /* WOLFSSL_EARLY_DATA */
  19048. }
  19049. #endif /* WOLFSSL_DTLS13 */
  19050. }
  19051. else if (!IsAtLeastTLSv1_3(ssl->version)
  19052. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  19053. || !TLSv1_3_Capable(ssl)
  19054. #endif
  19055. ) {
  19056. #ifndef WOLFSSL_NO_TLS12
  19057. ret = DoHandShakeMsg(ssl,
  19058. ssl->buffers.inputBuffer.buffer,
  19059. &ssl->buffers.inputBuffer.idx,
  19060. ssl->buffers.inputBuffer.length);
  19061. if (ret != 0) {
  19062. if (SendFatalAlertOnly(ssl, ret) == SOCKET_ERROR_E)
  19063. ret = SOCKET_ERROR_E;
  19064. }
  19065. #else
  19066. ret = BUFFER_ERROR;
  19067. #endif
  19068. }
  19069. else {
  19070. #ifdef WOLFSSL_TLS13
  19071. ssl->msgsReceived.got_change_cipher = 0;
  19072. ret = DoTls13HandShakeMsg(ssl,
  19073. ssl->buffers.inputBuffer.buffer,
  19074. &ssl->buffers.inputBuffer.idx,
  19075. ssl->buffers.inputBuffer.length);
  19076. #ifdef WOLFSSL_EARLY_DATA
  19077. if (ret != 0)
  19078. return ret;
  19079. if (ssl->options.side == WOLFSSL_SERVER_END &&
  19080. ssl->earlyData > early_data_ext &&
  19081. ssl->options.handShakeState == HANDSHAKE_DONE) {
  19082. ssl->earlyData = no_early_data;
  19083. ssl->options.processReply = doProcessInit;
  19084. return ZERO_RETURN;
  19085. }
  19086. #endif
  19087. #else
  19088. ret = BUFFER_ERROR;
  19089. #endif
  19090. }
  19091. if (ret != 0
  19092. /* DoDtlsHandShakeMsg can return a WANT_WRITE when
  19093. * calling DtlsMsgPoolSend. This msg is done
  19094. * processing so let's move on. */
  19095. && (!ssl->options.dtls
  19096. || ret != WANT_WRITE)
  19097. #ifdef WOLFSSL_ASYNC_CRYPT
  19098. /* In async case, on pending, move onto next message.
  19099. * Current message should have been DtlsMsgStore'ed and
  19100. * should be processed with DtlsMsgDrain */
  19101. && (!ssl->options.dtls
  19102. || ret != WC_PENDING_E)
  19103. #endif
  19104. ) {
  19105. WOLFSSL_ERROR(ret);
  19106. return ret;
  19107. }
  19108. break;
  19109. case change_cipher_spec:
  19110. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  19111. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19112. if (ssl->hsInfoOn)
  19113. AddPacketName(ssl, "ChangeCipher");
  19114. /* add record header back on info */
  19115. if (ssl->toInfoOn) {
  19116. ret = AddPacketInfo(ssl, "ChangeCipher",
  19117. change_cipher_spec,
  19118. ssl->buffers.inputBuffer.buffer +
  19119. ssl->buffers.inputBuffer.idx,
  19120. 1, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
  19121. if (ret != 0)
  19122. return ret;
  19123. #ifdef WOLFSSL_CALLBACKS
  19124. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  19125. #endif
  19126. }
  19127. #endif
  19128. #ifdef WOLFSSL_TLS13
  19129. if (IsAtLeastTLSv1_3(ssl->version)) {
  19130. word32 i = ssl->buffers.inputBuffer.idx;
  19131. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  19132. SendAlert(ssl, alert_fatal, unexpected_message);
  19133. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  19134. return UNKNOWN_RECORD_TYPE;
  19135. }
  19136. if (ssl->curSize != 1 ||
  19137. ssl->buffers.inputBuffer.buffer[i] != 1) {
  19138. SendAlert(ssl, alert_fatal, illegal_parameter);
  19139. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  19140. return UNKNOWN_RECORD_TYPE;
  19141. }
  19142. ssl->buffers.inputBuffer.idx++;
  19143. if (!ssl->msgsReceived.got_change_cipher) {
  19144. ssl->msgsReceived.got_change_cipher = 1;
  19145. }
  19146. else {
  19147. SendAlert(ssl, alert_fatal, illegal_parameter);
  19148. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  19149. return UNKNOWN_RECORD_TYPE;
  19150. }
  19151. break;
  19152. }
  19153. #endif
  19154. #ifndef WOLFSSL_NO_TLS12
  19155. if (ssl->buffers.inputBuffer.idx >=
  19156. ssl->buffers.inputBuffer.length ||
  19157. ssl->curSize < 1) {
  19158. WOLFSSL_MSG("ChangeCipher msg too short");
  19159. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  19160. return LENGTH_ERROR;
  19161. }
  19162. if (ssl->buffers.inputBuffer.buffer[
  19163. ssl->buffers.inputBuffer.idx] != 1) {
  19164. WOLFSSL_MSG("ChangeCipher msg wrong value");
  19165. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  19166. return LENGTH_ERROR;
  19167. }
  19168. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  19169. #ifdef HAVE_AEAD
  19170. if (ssl->specs.cipher_type == aead) {
  19171. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  19172. ssl->curSize -= AESGCM_EXP_IV_SZ;
  19173. ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
  19174. ssl->curSize -= ssl->specs.aead_mac_size;
  19175. }
  19176. else
  19177. #endif
  19178. {
  19179. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  19180. ssl->curSize -= (word16)ssl->keys.padSz;
  19181. ssl->curSize -= ssl->specs.iv_size;
  19182. }
  19183. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19184. if (ssl->options.startedETMRead) {
  19185. word32 digestSz = MacSize(ssl);
  19186. ssl->buffers.inputBuffer.idx += digestSz;
  19187. ssl->curSize -= (word16)digestSz;
  19188. }
  19189. #endif
  19190. }
  19191. if (ssl->curSize != 1) {
  19192. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  19193. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  19194. return LENGTH_ERROR;
  19195. }
  19196. ssl->buffers.inputBuffer.idx++;
  19197. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  19198. if (ret != 0) {
  19199. if (!ssl->options.dtls) {
  19200. return ret;
  19201. }
  19202. else {
  19203. #ifdef WOLFSSL_DTLS
  19204. /* Check for duplicate CCS message in DTLS mode.
  19205. * DTLS allows for duplicate messages, and it should be
  19206. * skipped. Also skip if out of order. */
  19207. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  19208. return ret;
  19209. /* Reset error */
  19210. ret = 0;
  19211. break;
  19212. #endif /* WOLFSSL_DTLS */
  19213. }
  19214. }
  19215. ssl->keys.encryptionOn = 1;
  19216. /* setup decrypt keys for following messages */
  19217. /* XXX This might not be what we want to do when
  19218. * receiving a CCS with multicast. We update the
  19219. * key when the application updates them. */
  19220. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  19221. return ret;
  19222. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19223. ssl->options.startedETMRead = ssl->options.encThenMac;
  19224. #endif
  19225. #ifdef WOLFSSL_DTLS
  19226. if (ssl->options.dtls) {
  19227. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  19228. #ifdef WOLFSSL_MULTICAST
  19229. if (ssl->options.haveMcast) {
  19230. peerSeq += ssl->keys.curPeerId;
  19231. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  19232. ssl->ctx->mcastFirstSeq,
  19233. ssl->ctx->mcastSecondSeq,
  19234. ssl->ctx->mcastMaxSeq);
  19235. }
  19236. #endif
  19237. peerSeq->nextEpoch++;
  19238. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  19239. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  19240. peerSeq->nextSeq_lo = 0;
  19241. peerSeq->nextSeq_hi = 0;
  19242. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  19243. DTLS_SEQ_SZ);
  19244. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  19245. }
  19246. #endif
  19247. #ifdef HAVE_LIBZ
  19248. if (ssl->options.usingCompression)
  19249. if ( (ret = InitStreams(ssl)) != 0)
  19250. return ret;
  19251. #endif
  19252. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  19253. ssl->options.side == WOLFSSL_CLIENT_END ?
  19254. kTlsServerStr : kTlsClientStr);
  19255. if (ret != 0)
  19256. return ret;
  19257. #endif /* !WOLFSSL_NO_TLS12 */
  19258. break;
  19259. case application_data:
  19260. WOLFSSL_MSG("got app DATA");
  19261. #ifdef WOLFSSL_DTLS
  19262. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  19263. #ifdef HAVE_SECURE_RENEGOTIATION
  19264. /*
  19265. * Only free HS resources when not in the process of a
  19266. * secure renegotiation and we have received APP DATA
  19267. * from the current epoch
  19268. */
  19269. if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
  19270. || !DtlsSCRKeysSet(ssl))) {
  19271. FreeHandshakeResources(ssl);
  19272. ssl->options.dtlsHsRetain = 0;
  19273. }
  19274. #else
  19275. FreeHandshakeResources(ssl);
  19276. ssl->options.dtlsHsRetain = 0;
  19277. #endif
  19278. }
  19279. #endif
  19280. #ifdef WOLFSSL_TLS13
  19281. if (ssl->keys.keyUpdateRespond) {
  19282. WOLFSSL_MSG("No KeyUpdate from peer seen");
  19283. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  19284. return SANITY_MSG_E;
  19285. }
  19286. #endif
  19287. if ((ret = DoApplicationData(ssl,
  19288. ssl->buffers.inputBuffer.buffer,
  19289. &ssl->buffers.inputBuffer.idx,
  19290. NO_SNIFF)) != 0) {
  19291. WOLFSSL_ERROR(ret);
  19292. #if defined(WOLFSSL_DTLS13) || \
  19293. defined(HAVE_SECURE_RENEGOTIATION)
  19294. /* Not really an error. We will return after cleaning
  19295. * up the processReply state. */
  19296. if (ret != APP_DATA_READY)
  19297. #endif
  19298. return ret;
  19299. }
  19300. break;
  19301. case alert:
  19302. WOLFSSL_MSG("got ALERT!");
  19303. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  19304. &ssl->buffers.inputBuffer.idx, &type);
  19305. if (ret == alert_fatal)
  19306. return FATAL_ERROR;
  19307. else if (ret < 0)
  19308. return ret;
  19309. /* catch warnings that are handled as errors */
  19310. if (type == close_notify) {
  19311. ssl->buffers.inputBuffer.idx =
  19312. ssl->buffers.inputBuffer.length;
  19313. ssl->options.processReply = doProcessInit;
  19314. return ssl->error = ZERO_RETURN;
  19315. }
  19316. if (type == decrypt_error)
  19317. return FATAL_ERROR;
  19318. /* Reset error if we got an alert level in ret */
  19319. if (ret > 0)
  19320. ret = 0;
  19321. break;
  19322. #ifdef WOLFSSL_DTLS13
  19323. case ack:
  19324. WOLFSSL_MSG("got ACK");
  19325. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  19326. word32 processedSize = 0;
  19327. ret = DoDtls13Ack(ssl, ssl->buffers.inputBuffer.buffer +
  19328. ssl->buffers.inputBuffer.idx,
  19329. ssl->buffers.inputBuffer.length -
  19330. ssl->buffers.inputBuffer.idx -
  19331. ssl->keys.padSz, &processedSize);
  19332. ssl->buffers.inputBuffer.idx += processedSize;
  19333. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  19334. if (ret != 0)
  19335. return ret;
  19336. break;
  19337. }
  19338. FALL_THROUGH;
  19339. #endif /* WOLFSSL_DTLS13 */
  19340. default:
  19341. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  19342. return UNKNOWN_RECORD_TYPE;
  19343. }
  19344. ssl->options.processReply = doProcessInit;
  19345. /* input exhausted */
  19346. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
  19347. #ifdef WOLFSSL_DTLS
  19348. || (ssl->options.dtls &&
  19349. /* If app data was processed then return now to avoid
  19350. * dropping any app data. */
  19351. (ssl->curRL.type == application_data ||
  19352. /* client: if we processed a finished message, return to
  19353. * allow higher layers to establish the crypto
  19354. * parameters of the connection. The remaining data
  19355. * may be app data that we would drop without the
  19356. * crypto setup. */
  19357. (ssl->options.side == WOLFSSL_CLIENT_END &&
  19358. ssl->options.serverState == SERVER_FINISHED_COMPLETE &&
  19359. ssl->options.handShakeState != HANDSHAKE_DONE)))
  19360. #endif
  19361. ) {
  19362. /* Shrink input buffer when we successfully finish record
  19363. * processing */
  19364. if ((ret == 0) && ssl->buffers.inputBuffer.dynamicFlag)
  19365. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  19366. return ret;
  19367. }
  19368. /* more messages per record */
  19369. else if ((ssl->buffers.inputBuffer.idx - ssl->curStartIdx)
  19370. < ssl->curSize) {
  19371. WOLFSSL_MSG("More messages in record");
  19372. ssl->options.processReply = runProcessingOneMessage;
  19373. if (IsEncryptionOn(ssl, 0)) {
  19374. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  19375. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19376. if (ssl->options.startedETMRead) {
  19377. word32 digestSz = MacSize(ssl);
  19378. if (ssl->buffers.inputBuffer.idx >=
  19379. ssl->keys.padSz + digestSz) {
  19380. ssl->buffers.inputBuffer.idx -=
  19381. ssl->keys.padSz + digestSz;
  19382. }
  19383. else {
  19384. WOLFSSL_MSG("\tmiddle padding error");
  19385. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  19386. return FATAL_ERROR;
  19387. }
  19388. }
  19389. else
  19390. #endif
  19391. {
  19392. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  19393. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  19394. }
  19395. else {
  19396. WOLFSSL_MSG("\tmiddle padding error");
  19397. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  19398. return FATAL_ERROR;
  19399. }
  19400. }
  19401. }
  19402. }
  19403. /* more records */
  19404. else {
  19405. WOLFSSL_MSG("More records in input");
  19406. }
  19407. #ifdef WOLFSSL_ASYNC_CRYPT
  19408. /* We are setup to read next message/record but we had an error
  19409. * (probably WC_PENDING_E) so return that so it can be handled
  19410. * by higher layers. */
  19411. if (ret != 0)
  19412. return ret;
  19413. #endif
  19414. #if defined(WOLFSSL_DTLS13) || defined(HAVE_SECURE_RENEGOTIATION)
  19415. /* Signal to user that we have application data ready to read */
  19416. if (ret == APP_DATA_READY)
  19417. return ret;
  19418. #endif
  19419. /* It is safe to shrink the input buffer here now. local vars will
  19420. * be reset to the new starting value. */
  19421. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag)
  19422. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  19423. continue;
  19424. default:
  19425. WOLFSSL_MSG("Bad process input state, programming error");
  19426. WOLFSSL_ERROR_VERBOSE(INPUT_CASE_ERROR);
  19427. return INPUT_CASE_ERROR;
  19428. }
  19429. }
  19430. }
  19431. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  19432. (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
  19433. int SendChangeCipher(WOLFSSL* ssl)
  19434. {
  19435. byte *output;
  19436. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  19437. int idx = RECORD_HEADER_SZ;
  19438. int ret;
  19439. #ifdef OPENSSL_EXTRA
  19440. ssl->cbmode = SSL_CB_MODE_WRITE;
  19441. if (ssl->options.side == WOLFSSL_SERVER_END){
  19442. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  19443. if (ssl->CBIS != NULL)
  19444. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, WOLFSSL_SUCCESS);
  19445. }
  19446. else{
  19447. ssl->options.clientState =
  19448. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  19449. if (ssl->CBIS != NULL)
  19450. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  19451. }
  19452. #endif
  19453. #ifdef WOLFSSL_DTLS
  19454. if (ssl->options.dtls) {
  19455. sendSz += DTLS_RECORD_EXTRA;
  19456. idx += DTLS_RECORD_EXTRA;
  19457. }
  19458. #endif
  19459. /* are we in scr */
  19460. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  19461. sendSz += MAX_MSG_EXTRA;
  19462. }
  19463. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  19464. * is not advanced yet */
  19465. ssl->options.buildingMsg = 1;
  19466. /* check for available size */
  19467. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  19468. return ret;
  19469. /* get output buffer */
  19470. output = GetOutputBuffer(ssl);
  19471. AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
  19472. output[idx] = 1; /* turn it on */
  19473. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  19474. byte input[ENUM_LEN];
  19475. int inputSz = ENUM_LEN;
  19476. input[0] = 1; /* turn it on */
  19477. #ifdef WOLFSSL_DTLS
  19478. if (IsDtlsNotSctpMode(ssl) &&
  19479. (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
  19480. return ret;
  19481. }
  19482. #endif
  19483. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19484. change_cipher_spec, 0, 0, 0, CUR_ORDER);
  19485. if (sendSz < 0) {
  19486. return sendSz;
  19487. }
  19488. }
  19489. #ifdef WOLFSSL_DTLS
  19490. else {
  19491. if (IsDtlsNotSctpMode(ssl)) {
  19492. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
  19493. return ret;
  19494. DtlsSEQIncrement(ssl, CUR_ORDER);
  19495. }
  19496. }
  19497. #endif
  19498. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19499. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  19500. if (ssl->toInfoOn) {
  19501. ret = AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  19502. sendSz, WRITE_PROTO, 0, ssl->heap);
  19503. if (ret != 0)
  19504. return ret;
  19505. }
  19506. #endif
  19507. ssl->buffers.outputBuffer.length += sendSz;
  19508. #ifdef WOLFSSL_TLS13
  19509. if (!ssl->options.tls1_3)
  19510. #endif
  19511. {
  19512. /* setup encrypt keys */
  19513. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  19514. return ret;
  19515. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19516. ssl->options.startedETMWrite = ssl->options.encThenMac;
  19517. #endif
  19518. }
  19519. ssl->options.buildingMsg = 0;
  19520. if (ssl->options.groupMessages)
  19521. return 0;
  19522. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  19523. else if (ssl->options.dtls) {
  19524. /* If using DTLS, force the ChangeCipherSpec message to be in the
  19525. * same datagram as the finished message. */
  19526. return 0;
  19527. }
  19528. #endif
  19529. else
  19530. return SendBuffered(ssl);
  19531. }
  19532. #endif
  19533. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  19534. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  19535. int padLen, int content, int verify, int epochOrder)
  19536. {
  19537. byte result[WC_MAX_DIGEST_SIZE];
  19538. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  19539. word32 padSz = ssl->specs.pad_size;
  19540. int ret = 0;
  19541. wc_Md5 md5;
  19542. wc_Sha sha;
  19543. /* data */
  19544. byte seq[SEQ_SZ];
  19545. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  19546. const byte* macSecret = NULL;
  19547. (void)padLen;
  19548. #ifdef HAVE_FUZZER
  19549. if (ssl->fuzzerCb)
  19550. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  19551. #endif
  19552. #ifdef WOLFSSL_DTLS
  19553. if (ssl->options.dtls)
  19554. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  19555. else
  19556. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  19557. #else
  19558. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  19559. #endif
  19560. XMEMSET(seq, 0, SEQ_SZ);
  19561. conLen[0] = (byte)content;
  19562. c16toa((word16)sz, &conLen[ENUM_LEN]);
  19563. WriteSEQ(ssl, epochOrder, seq);
  19564. if (ssl->specs.mac_algorithm == md5_mac) {
  19565. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  19566. if (ret != 0)
  19567. return ret;
  19568. /* inner */
  19569. ret = wc_Md5Update(&md5, macSecret, digestSz);
  19570. ret |= wc_Md5Update(&md5, PAD1, padSz);
  19571. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  19572. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  19573. /* in buffer */
  19574. ret |= wc_Md5Update(&md5, in, sz);
  19575. if (ret != 0) {
  19576. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  19577. return VERIFY_MAC_ERROR;
  19578. }
  19579. ret = wc_Md5Final(&md5, result);
  19580. #ifdef WOLFSSL_ASYNC_CRYPT
  19581. /* TODO: Make non-blocking */
  19582. if (ret == WC_PENDING_E) {
  19583. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  19584. }
  19585. #endif
  19586. if (ret != 0) {
  19587. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  19588. return VERIFY_MAC_ERROR;
  19589. }
  19590. /* outer */
  19591. ret = wc_Md5Update(&md5, macSecret, digestSz);
  19592. ret |= wc_Md5Update(&md5, PAD2, padSz);
  19593. ret |= wc_Md5Update(&md5, result, digestSz);
  19594. if (ret != 0) {
  19595. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  19596. return VERIFY_MAC_ERROR;
  19597. }
  19598. ret = wc_Md5Final(&md5, digest);
  19599. #ifdef WOLFSSL_ASYNC_CRYPT
  19600. /* TODO: Make non-blocking */
  19601. if (ret == WC_PENDING_E) {
  19602. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  19603. }
  19604. #endif
  19605. if (ret != 0) {
  19606. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  19607. return VERIFY_MAC_ERROR;
  19608. }
  19609. wc_Md5Free(&md5);
  19610. }
  19611. else {
  19612. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  19613. if (ret != 0)
  19614. return ret;
  19615. /* inner */
  19616. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  19617. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  19618. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  19619. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  19620. /* in buffer */
  19621. ret |= wc_ShaUpdate(&sha, in, sz);
  19622. if (ret != 0) {
  19623. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  19624. return VERIFY_MAC_ERROR;
  19625. }
  19626. ret = wc_ShaFinal(&sha, result);
  19627. #ifdef WOLFSSL_ASYNC_CRYPT
  19628. /* TODO: Make non-blocking */
  19629. if (ret == WC_PENDING_E) {
  19630. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  19631. }
  19632. #endif
  19633. if (ret != 0) {
  19634. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  19635. return VERIFY_MAC_ERROR;
  19636. }
  19637. /* outer */
  19638. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  19639. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  19640. ret |= wc_ShaUpdate(&sha, result, digestSz);
  19641. if (ret != 0) {
  19642. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  19643. return VERIFY_MAC_ERROR;
  19644. }
  19645. ret = wc_ShaFinal(&sha, digest);
  19646. #ifdef WOLFSSL_ASYNC_CRYPT
  19647. /* TODO: Make non-blocking */
  19648. if (ret == WC_PENDING_E) {
  19649. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  19650. }
  19651. #endif
  19652. if (ret != 0) {
  19653. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  19654. return VERIFY_MAC_ERROR;
  19655. }
  19656. wc_ShaFree(&sha);
  19657. }
  19658. return 0;
  19659. }
  19660. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  19661. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  19662. static int BuildMD5_CertVerify(const WOLFSSL* ssl, byte* digest)
  19663. {
  19664. int ret;
  19665. byte md5_result[WC_MD5_DIGEST_SIZE];
  19666. #ifdef WOLFSSL_SMALL_STACK
  19667. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap,
  19668. DYNAMIC_TYPE_HASHCTX);
  19669. #else
  19670. wc_Md5 md5[1];
  19671. #endif
  19672. /* make md5 inner */
  19673. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  19674. if (ret == 0)
  19675. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  19676. if (ret == 0)
  19677. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  19678. if (ret == 0)
  19679. ret = wc_Md5Final(md5, md5_result);
  19680. /* make md5 outer */
  19681. if (ret == 0) {
  19682. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  19683. if (ret == 0) {
  19684. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  19685. if (ret == 0)
  19686. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  19687. if (ret == 0)
  19688. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  19689. if (ret == 0)
  19690. ret = wc_Md5Final(md5, digest);
  19691. wc_Md5Free(md5);
  19692. }
  19693. }
  19694. #ifdef WOLFSSL_SMALL_STACK
  19695. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  19696. #endif
  19697. return ret;
  19698. }
  19699. #endif /* !NO_MD5 && !NO_OLD_TLS */
  19700. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  19701. defined(WOLFSSL_ALLOW_TLS_SHA1))
  19702. static int BuildSHA_CertVerify(const WOLFSSL* ssl, byte* digest)
  19703. {
  19704. int ret;
  19705. byte sha_result[WC_SHA_DIGEST_SIZE];
  19706. #ifdef WOLFSSL_SMALL_STACK
  19707. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap,
  19708. DYNAMIC_TYPE_HASHCTX);
  19709. #else
  19710. wc_Sha sha[1];
  19711. #endif
  19712. /* make sha inner */
  19713. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  19714. if (ret == 0)
  19715. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN);
  19716. if (ret == 0)
  19717. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  19718. if (ret == 0)
  19719. ret = wc_ShaFinal(sha, sha_result);
  19720. /* make sha outer */
  19721. if (ret == 0) {
  19722. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  19723. if (ret == 0) {
  19724. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN);
  19725. if (ret == 0)
  19726. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  19727. if (ret == 0)
  19728. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  19729. if (ret == 0)
  19730. ret = wc_ShaFinal(sha, digest);
  19731. wc_ShaFree(sha);
  19732. }
  19733. }
  19734. #ifdef WOLFSSL_SMALL_STACK
  19735. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  19736. #endif
  19737. return ret;
  19738. }
  19739. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  19740. int BuildCertHashes(const WOLFSSL* ssl, Hashes* hashes)
  19741. {
  19742. int ret = 0;
  19743. (void)hashes;
  19744. if (ssl->options.tls) {
  19745. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  19746. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  19747. if (ret != 0)
  19748. return ret;
  19749. #endif
  19750. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  19751. defined(WOLFSSL_ALLOW_TLS_SHA1))
  19752. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  19753. if (ret != 0)
  19754. return ret;
  19755. #endif
  19756. if (IsAtLeastTLSv1_2(ssl)) {
  19757. #ifndef NO_SHA256
  19758. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  19759. hashes->sha256);
  19760. if (ret != 0)
  19761. return ret;
  19762. #endif
  19763. #ifdef WOLFSSL_SHA384
  19764. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  19765. hashes->sha384);
  19766. if (ret != 0)
  19767. return ret;
  19768. #endif
  19769. #ifdef WOLFSSL_SHA512
  19770. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  19771. hashes->sha512);
  19772. if (ret != 0)
  19773. return ret;
  19774. #endif
  19775. #ifdef WOLFSSL_SM3
  19776. ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3,
  19777. hashes->sm3);
  19778. if (ret != 0)
  19779. return ret;
  19780. #endif
  19781. }
  19782. }
  19783. else {
  19784. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  19785. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  19786. if (ret != 0)
  19787. return ret;
  19788. #endif
  19789. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  19790. defined(WOLFSSL_ALLOW_TLS_SHA1))
  19791. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  19792. if (ret != 0)
  19793. return ret;
  19794. #endif
  19795. }
  19796. return ret;
  19797. }
  19798. #ifndef WOLFSSL_NO_TLS12
  19799. void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
  19800. {
  19801. (void)ssl;
  19802. if (args
  19803. #ifdef WOLFSSL_ASYNC_CRYPT
  19804. && ssl->options.buildArgsSet
  19805. #endif
  19806. ) {
  19807. /* only free the IV if it was dynamically allocated */
  19808. if (args->iv && (args->iv != args->staticIvBuffer)) {
  19809. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  19810. }
  19811. }
  19812. #ifdef WOLFSSL_ASYNC_CRYPT
  19813. ssl->options.buildArgsSet = 0;
  19814. #endif
  19815. }
  19816. #endif
  19817. /* Build SSL Message, encrypted */
  19818. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  19819. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
  19820. int epochOrder)
  19821. {
  19822. #ifndef WOLFSSL_NO_TLS12
  19823. int ret;
  19824. BuildMsgArgs* args;
  19825. BuildMsgArgs lcl_args;
  19826. #endif
  19827. WOLFSSL_ENTER("BuildMessage");
  19828. if (ssl == NULL) {
  19829. return BAD_FUNC_ARG;
  19830. }
  19831. /* catch mistaken sizeOnly parameter */
  19832. if (!sizeOnly && (output == NULL || input == NULL) ) {
  19833. return BAD_FUNC_ARG;
  19834. }
  19835. if (sizeOnly && (output || input) ) {
  19836. return BAD_FUNC_ARG;
  19837. }
  19838. (void)epochOrder;
  19839. #ifndef NO_TLS
  19840. #if defined(WOLFSSL_NO_TLS12) && defined(WOLFSSL_TLS13)
  19841. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  19842. hashOutput, sizeOnly, asyncOkay);
  19843. #else
  19844. #ifdef WOLFSSL_TLS13
  19845. if (ssl->options.tls1_3) {
  19846. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  19847. hashOutput, sizeOnly, asyncOkay);
  19848. }
  19849. #endif
  19850. #ifdef WOLFSSL_ASYNC_CRYPT
  19851. ret = WC_NO_PENDING_E;
  19852. if (asyncOkay) {
  19853. if (ssl->async == NULL) {
  19854. return BAD_FUNC_ARG;
  19855. }
  19856. args = &ssl->async->buildArgs;
  19857. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  19858. if (ret != WC_NO_PENDING_E) {
  19859. /* Check for error */
  19860. if (ret < 0)
  19861. goto exit_buildmsg;
  19862. }
  19863. }
  19864. else
  19865. #endif
  19866. {
  19867. args = &lcl_args;
  19868. }
  19869. /* Reset state */
  19870. #ifdef WOLFSSL_ASYNC_CRYPT
  19871. if (ret == WC_NO_PENDING_E)
  19872. #endif
  19873. {
  19874. ret = 0;
  19875. #ifdef WOLFSSL_ASYNC_CRYPT
  19876. ssl->options.buildArgsSet = 1;
  19877. #endif
  19878. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  19879. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  19880. args->sz = RECORD_HEADER_SZ + inSz;
  19881. args->idx = RECORD_HEADER_SZ;
  19882. args->headerSz = RECORD_HEADER_SZ;
  19883. }
  19884. switch (ssl->options.buildMsgState) {
  19885. case BUILD_MSG_BEGIN:
  19886. {
  19887. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  19888. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  19889. /* For epochs >1 the current cipher parameters are located in
  19890. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  19891. * parameters and for epoch 1 use ssl->keys */
  19892. switch (epochOrder) {
  19893. case PREV_ORDER:
  19894. if (ssl->encrypt.src != KEYS) {
  19895. ssl->secure_renegotiation->cache_status =
  19896. SCR_CACHE_NULL;
  19897. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  19898. ERROR_OUT(ret, exit_buildmsg);
  19899. }
  19900. break;
  19901. case CUR_ORDER:
  19902. if (ssl->keys.dtls_epoch ==
  19903. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  19904. if (ssl->encrypt.src != SCR) {
  19905. ssl->secure_renegotiation->cache_status =
  19906. SCR_CACHE_NEEDED;
  19907. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  19908. != 0)
  19909. ERROR_OUT(ret, exit_buildmsg);
  19910. }
  19911. }
  19912. else {
  19913. if (ssl->encrypt.src != KEYS) {
  19914. ssl->secure_renegotiation->cache_status =
  19915. SCR_CACHE_NULL;
  19916. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  19917. != 0)
  19918. ERROR_OUT(ret, exit_buildmsg);
  19919. }
  19920. }
  19921. break;
  19922. default:
  19923. WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
  19924. "CUR_ORDER");
  19925. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  19926. }
  19927. }
  19928. #endif
  19929. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  19930. }
  19931. FALL_THROUGH;
  19932. case BUILD_MSG_SIZE:
  19933. {
  19934. args->digestSz = ssl->specs.hash_size;
  19935. #ifdef HAVE_TRUNCATED_HMAC
  19936. if (ssl->truncated_hmac)
  19937. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  19938. #endif
  19939. args->sz += args->digestSz;
  19940. #ifdef WOLFSSL_DTLS
  19941. if (ssl->options.dtls) {
  19942. args->sz += DTLS_RECORD_EXTRA;
  19943. args->idx += DTLS_RECORD_EXTRA;
  19944. args->headerSz += DTLS_RECORD_EXTRA;
  19945. }
  19946. #endif
  19947. #ifndef WOLFSSL_AEAD_ONLY
  19948. if (ssl->specs.cipher_type == block) {
  19949. word32 blockSz = ssl->specs.block_size;
  19950. if (blockSz == 0) {
  19951. WOLFSSL_MSG("Invalid block size with block cipher type");
  19952. ERROR_OUT(BAD_STATE_E, exit_buildmsg);
  19953. }
  19954. if (ssl->options.tls1_1) {
  19955. args->ivSz = blockSz;
  19956. args->sz += args->ivSz;
  19957. if (args->ivSz > MAX_IV_SZ)
  19958. ERROR_OUT(BUFFER_E, exit_buildmsg);
  19959. }
  19960. args->sz += 1; /* pad byte */
  19961. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  19962. if (ssl->options.startedETMWrite) {
  19963. args->pad = (args->sz - args->headerSz -
  19964. args->digestSz) % blockSz;
  19965. }
  19966. else
  19967. #endif
  19968. {
  19969. args->pad = (args->sz - args->headerSz) % blockSz;
  19970. }
  19971. if (args->pad != 0)
  19972. args->pad = blockSz - args->pad;
  19973. args->sz += args->pad;
  19974. }
  19975. #endif /* WOLFSSL_AEAD_ONLY */
  19976. #ifdef HAVE_AEAD
  19977. if (ssl->specs.cipher_type == aead) {
  19978. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  19979. args->ivSz = AESGCM_EXP_IV_SZ;
  19980. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  19981. }
  19982. #endif
  19983. /* done with size calculations */
  19984. if (sizeOnly)
  19985. goto exit_buildmsg;
  19986. if (args->sz > (word32)outSz) {
  19987. WOLFSSL_MSG("Oops, want to write past output buffer size");
  19988. ERROR_OUT(BUFFER_E, exit_buildmsg);
  19989. }
  19990. if (args->ivSz > 0) {
  19991. if (args->ivSz > sizeof(args->staticIvBuffer)) {
  19992. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap,
  19993. DYNAMIC_TYPE_SALT);
  19994. if (args->iv == NULL) {
  19995. ERROR_OUT(MEMORY_E, exit_buildmsg);
  19996. }
  19997. }
  19998. else {
  19999. args->iv = args->staticIvBuffer;
  20000. }
  20001. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  20002. if (ret != 0)
  20003. goto exit_buildmsg;
  20004. }
  20005. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  20006. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  20007. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  20008. defined(HAVE_AEAD))
  20009. if (ssl->specs.cipher_type == aead) {
  20010. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  20011. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  20012. }
  20013. #endif
  20014. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  20015. AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
  20016. /* write to output */
  20017. if (args->ivSz > 0) {
  20018. XMEMCPY(output + args->idx, args->iv,
  20019. min(args->ivSz, MAX_IV_SZ));
  20020. args->idx += min(args->ivSz, MAX_IV_SZ);
  20021. }
  20022. XMEMCPY(output + args->idx, input, inSz);
  20023. args->idx += inSz;
  20024. ssl->options.buildMsgState = BUILD_MSG_HASH;
  20025. }
  20026. FALL_THROUGH;
  20027. case BUILD_MSG_HASH:
  20028. {
  20029. /* done with size calculations */
  20030. if (sizeOnly)
  20031. goto exit_buildmsg;
  20032. if (type == handshake && hashOutput) {
  20033. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  20034. if (ret != 0)
  20035. goto exit_buildmsg;
  20036. }
  20037. #ifndef WOLFSSL_AEAD_ONLY
  20038. if (ssl->specs.cipher_type == block) {
  20039. word32 tmpIdx;
  20040. word32 i;
  20041. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  20042. if (ssl->options.startedETMWrite)
  20043. tmpIdx = args->idx;
  20044. else
  20045. #endif
  20046. tmpIdx = args->idx + args->digestSz;
  20047. for (i = 0; i <= args->pad; i++)
  20048. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  20049. }
  20050. #endif
  20051. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  20052. }
  20053. FALL_THROUGH;
  20054. case BUILD_MSG_VERIFY_MAC:
  20055. {
  20056. /* done with size calculations */
  20057. if (sizeOnly)
  20058. goto exit_buildmsg;
  20059. /* User Record Layer Callback handling */
  20060. #ifdef ATOMIC_USER
  20061. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  20062. if (ssl->options.startedETMWrite) {
  20063. if (ssl->ctx->EncryptMacCb) {
  20064. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  20065. args->pad + 1, type, 0,
  20066. output + args->headerSz,
  20067. output + args->headerSz,
  20068. args->size - args->digestSz,
  20069. ssl->MacEncryptCtx);
  20070. goto exit_buildmsg;
  20071. }
  20072. }
  20073. else
  20074. #endif
  20075. {
  20076. if (ssl->ctx->MacEncryptCb) {
  20077. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  20078. output + args->headerSz + args->ivSz, inSz,
  20079. type, 0, output + args->headerSz,
  20080. output + args->headerSz, args->size,
  20081. ssl->MacEncryptCtx);
  20082. goto exit_buildmsg;
  20083. }
  20084. }
  20085. #endif
  20086. #ifndef WOLFSSL_AEAD_ONLY
  20087. if (ssl->specs.cipher_type != aead
  20088. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  20089. && !ssl->options.startedETMWrite
  20090. #endif
  20091. ) {
  20092. #ifdef HAVE_TRUNCATED_HMAC
  20093. if (ssl->truncated_hmac &&
  20094. ssl->specs.hash_size > args->digestSz) {
  20095. #ifdef WOLFSSL_SMALL_STACK
  20096. byte* hmac;
  20097. #else
  20098. byte hmac[WC_MAX_DIGEST_SIZE];
  20099. #endif
  20100. #ifdef WOLFSSL_SMALL_STACK
  20101. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  20102. DYNAMIC_TYPE_DIGEST);
  20103. if (hmac == NULL)
  20104. ERROR_OUT(MEMORY_E, exit_buildmsg);
  20105. #endif
  20106. ret = ssl->hmac(ssl, hmac,
  20107. output + args->headerSz + args->ivSz, inSz,
  20108. -1, type, 0, epochOrder);
  20109. XMEMCPY(output + args->idx, hmac, args->digestSz);
  20110. #ifdef WOLFSSL_SMALL_STACK
  20111. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  20112. #endif
  20113. }
  20114. else
  20115. #endif
  20116. {
  20117. ret = ssl->hmac(ssl, output + args->idx, output +
  20118. args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
  20119. }
  20120. }
  20121. #endif /* WOLFSSL_AEAD_ONLY */
  20122. if (ret != 0)
  20123. goto exit_buildmsg;
  20124. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  20125. }
  20126. FALL_THROUGH;
  20127. case BUILD_MSG_ENCRYPT:
  20128. {
  20129. /* done with size calculations */
  20130. if (sizeOnly)
  20131. goto exit_buildmsg;
  20132. {
  20133. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  20134. /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
  20135. * for all encryption algos that use it for encryption parameters */
  20136. word16 dtls_epoch = 0;
  20137. word16 dtls_sequence_number_hi = 0;
  20138. word32 dtls_sequence_number_lo = 0;
  20139. int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
  20140. DtlsUseSCRKeys(ssl);
  20141. if (swap_seq) {
  20142. dtls_epoch = ssl->keys.dtls_epoch;
  20143. dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
  20144. dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
  20145. ssl->keys.dtls_epoch--;
  20146. ssl->keys.dtls_sequence_number_hi =
  20147. ssl->keys.dtls_prev_sequence_number_hi;
  20148. ssl->keys.dtls_sequence_number_lo =
  20149. ssl->keys.dtls_prev_sequence_number_lo;
  20150. }
  20151. #endif
  20152. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  20153. if (ssl->options.startedETMWrite) {
  20154. ret = Encrypt(ssl, output + args->headerSz,
  20155. output + args->headerSz,
  20156. (word16)(args->size - args->digestSz),
  20157. asyncOkay);
  20158. }
  20159. else
  20160. #endif
  20161. {
  20162. ret = Encrypt(ssl, output + args->headerSz,
  20163. output + args->headerSz, args->size, asyncOkay);
  20164. }
  20165. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  20166. /* Restore sequence numbers */
  20167. if (swap_seq) {
  20168. ssl->keys.dtls_epoch = dtls_epoch;
  20169. ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
  20170. ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
  20171. }
  20172. #endif
  20173. }
  20174. if (ret != 0) {
  20175. #ifdef WOLFSSL_ASYNC_CRYPT
  20176. if (ret != WC_PENDING_E)
  20177. #endif
  20178. {
  20179. /* Zeroize plaintext. */
  20180. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  20181. if (ssl->options.startedETMWrite) {
  20182. ForceZero(output + args->headerSz,
  20183. (word16)(args->size - args->digestSz));
  20184. }
  20185. else
  20186. #endif
  20187. {
  20188. ForceZero(output + args->headerSz, (word16)args->size);
  20189. }
  20190. }
  20191. goto exit_buildmsg;
  20192. }
  20193. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  20194. }
  20195. FALL_THROUGH;
  20196. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  20197. {
  20198. /* done with size calculations */
  20199. if (sizeOnly)
  20200. goto exit_buildmsg;
  20201. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  20202. if (ssl->options.startedETMWrite) {
  20203. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  20204. #ifdef HAVE_TRUNCATED_HMAC
  20205. if (ssl->truncated_hmac &&
  20206. ssl->specs.hash_size > args->digestSz) {
  20207. #ifdef WOLFSSL_SMALL_STACK
  20208. byte* hmac = NULL;
  20209. #else
  20210. byte hmac[WC_MAX_DIGEST_SIZE];
  20211. #endif
  20212. #ifdef WOLFSSL_SMALL_STACK
  20213. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  20214. DYNAMIC_TYPE_DIGEST);
  20215. if (hmac == NULL)
  20216. ERROR_OUT(MEMORY_E, exit_buildmsg);
  20217. #endif
  20218. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  20219. args->ivSz + inSz + args->pad + 1, -1, type,
  20220. 0, epochOrder);
  20221. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  20222. args->digestSz);
  20223. #ifdef WOLFSSL_SMALL_STACK
  20224. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  20225. #endif
  20226. }
  20227. else
  20228. #endif
  20229. {
  20230. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  20231. output + args->headerSz,
  20232. args->ivSz + inSz + args->pad + 1, -1, type,
  20233. 0, epochOrder);
  20234. }
  20235. }
  20236. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  20237. }
  20238. FALL_THROUGH;
  20239. default:
  20240. break;
  20241. }
  20242. exit_buildmsg:
  20243. WOLFSSL_LEAVE("BuildMessage", ret);
  20244. #ifdef WOLFSSL_ASYNC_CRYPT
  20245. if (ret == WC_PENDING_E) {
  20246. return ret;
  20247. }
  20248. #endif
  20249. /* make sure build message state is reset */
  20250. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  20251. #ifdef WOLFSSL_DTLS
  20252. if (ret == 0 && ssl->options.dtls && !sizeOnly)
  20253. DtlsSEQIncrement(ssl, epochOrder);
  20254. #endif
  20255. /* return sz on success */
  20256. if (ret == 0) {
  20257. ret = args->sz;
  20258. }
  20259. else {
  20260. WOLFSSL_ERROR_VERBOSE(ret);
  20261. }
  20262. /* Final cleanup */
  20263. FreeBuildMsgArgs(ssl, args);
  20264. return ret;
  20265. #endif /* !WOLFSSL_NO_TLS12 */
  20266. #else
  20267. (void)outSz;
  20268. (void)inSz;
  20269. (void)type;
  20270. (void)hashOutput;
  20271. (void)asyncOkay;
  20272. return NOT_COMPILED_IN;
  20273. #endif /* NO_TLS */
  20274. }
  20275. #ifndef WOLFSSL_NO_TLS12
  20276. int SendFinished(WOLFSSL* ssl)
  20277. {
  20278. int sendSz,
  20279. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  20280. FINISHED_SZ;
  20281. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  20282. byte *output;
  20283. Hashes* hashes;
  20284. int ret;
  20285. int headerSz = HANDSHAKE_HEADER_SZ;
  20286. int outputSz;
  20287. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  20288. WOLFSSL_ENTER("SendFinished");
  20289. /* check for available size */
  20290. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  20291. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  20292. * is not advanced yet */
  20293. ssl->options.buildingMsg = 1;
  20294. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  20295. return ret;
  20296. #ifdef WOLFSSL_DTLS
  20297. if (ssl->options.dtls) {
  20298. headerSz += DTLS_HANDSHAKE_EXTRA;
  20299. ssl->keys.dtls_epoch++;
  20300. ssl->keys.dtls_prev_sequence_number_hi =
  20301. ssl->keys.dtls_sequence_number_hi;
  20302. ssl->keys.dtls_prev_sequence_number_lo =
  20303. ssl->keys.dtls_sequence_number_lo;
  20304. ssl->keys.dtls_sequence_number_hi = 0;
  20305. ssl->keys.dtls_sequence_number_lo = 0;
  20306. }
  20307. #endif
  20308. /* get output buffer */
  20309. output = GetOutputBuffer(ssl);
  20310. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  20311. /* make finished hashes */
  20312. hashes = (Hashes*)&input[headerSz];
  20313. ret = BuildFinished(ssl, hashes, ssl->options.side == WOLFSSL_CLIENT_END ?
  20314. kTlsClientStr : kTlsServerStr);
  20315. if (ret != 0) return ret;
  20316. #ifdef HAVE_SECURE_RENEGOTIATION
  20317. if (ssl->secure_renegotiation) {
  20318. if (ssl->options.side == WOLFSSL_CLIENT_END)
  20319. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  20320. TLS_FINISHED_SZ);
  20321. else
  20322. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  20323. TLS_FINISHED_SZ);
  20324. }
  20325. #endif
  20326. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  20327. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  20328. XMEMCPY(ssl->clientFinished,
  20329. hashes, TLS_FINISHED_SZ);
  20330. ssl->clientFinished_len = TLS_FINISHED_SZ;
  20331. }
  20332. else {
  20333. XMEMCPY(ssl->serverFinished,
  20334. hashes, TLS_FINISHED_SZ);
  20335. ssl->serverFinished_len = TLS_FINISHED_SZ;
  20336. }
  20337. #endif
  20338. #ifdef WOLFSSL_DTLS
  20339. if (IsDtlsNotSctpMode(ssl)) {
  20340. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz,
  20341. finished)) != 0) {
  20342. return ret;
  20343. }
  20344. }
  20345. #endif
  20346. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  20347. handshake, 1, 0, 0, CUR_ORDER);
  20348. if (sendSz < 0)
  20349. return BUILD_MSG_ERROR;
  20350. if (!ssl->options.resuming) {
  20351. SetupSession(ssl);
  20352. #ifndef NO_SESSION_CACHE
  20353. AddSession(ssl);
  20354. #endif
  20355. if (ssl->options.side == WOLFSSL_SERVER_END) {
  20356. #ifdef OPENSSL_EXTRA
  20357. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  20358. ssl->cbmode = SSL_CB_MODE_WRITE;
  20359. if (ssl->CBIS != NULL)
  20360. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, WOLFSSL_SUCCESS);
  20361. #endif
  20362. ssl->options.handShakeState = HANDSHAKE_DONE;
  20363. ssl->options.handShakeDone = 1;
  20364. #ifdef HAVE_SECURE_RENEGOTIATION
  20365. ssl->options.resumed = ssl->options.resuming;
  20366. #endif
  20367. }
  20368. }
  20369. else {
  20370. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  20371. #ifdef OPENSSL_EXTRA
  20372. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  20373. ssl->cbmode = SSL_CB_MODE_WRITE;
  20374. if (ssl->CBIS != NULL)
  20375. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, WOLFSSL_SUCCESS);
  20376. #endif
  20377. ssl->options.handShakeState = HANDSHAKE_DONE;
  20378. ssl->options.handShakeDone = 1;
  20379. #ifdef HAVE_SECURE_RENEGOTIATION
  20380. ssl->options.resumed = ssl->options.resuming;
  20381. #endif
  20382. }
  20383. }
  20384. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20385. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  20386. if (ssl->toInfoOn) {
  20387. ret = AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  20388. WRITE_PROTO, 0, ssl->heap);
  20389. if (ret != 0)
  20390. return ret;
  20391. }
  20392. #endif
  20393. ssl->buffers.outputBuffer.length += sendSz;
  20394. ret = SendBuffered(ssl);
  20395. ssl->options.buildingMsg = 0;
  20396. #ifdef WOLFSSL_DTLS
  20397. if ((!ssl->options.resuming &&
  20398. ssl->options.side == WOLFSSL_SERVER_END) ||
  20399. (ssl->options.resuming &&
  20400. ssl->options.side == WOLFSSL_CLIENT_END)) {
  20401. ssl->keys.dtls_handshake_number = 0;
  20402. ssl->keys.dtls_expected_peer_handshake_number = 0;
  20403. }
  20404. #endif
  20405. WOLFSSL_LEAVE("SendFinished", ret);
  20406. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  20407. return ret;
  20408. }
  20409. #endif /* WOLFSSL_NO_TLS12 */
  20410. #ifndef NO_WOLFSSL_SERVER
  20411. #if (!defined(WOLFSSL_NO_TLS12) && \
  20412. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  20413. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  20414. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  20415. /* Parses and decodes the certificate then initializes "request". In the case
  20416. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  20417. *
  20418. * Returns 0 on success
  20419. */
  20420. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  20421. DecodedCert* cert, byte* certData, word32 length)
  20422. {
  20423. int ret;
  20424. if (request != NULL)
  20425. XMEMSET(request, 0, sizeof(OcspRequest));
  20426. InitDecodedCert(cert, certData, length, ssl->heap);
  20427. /* TODO: Setup async support here */
  20428. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl));
  20429. if (ret != 0) {
  20430. WOLFSSL_MSG("ParseCert failed");
  20431. }
  20432. if (ret == 0)
  20433. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  20434. if (ret == 0) {
  20435. /* make sure ctx OCSP request is updated */
  20436. if (!ssl->buffers.weOwnCert) {
  20437. wolfSSL_Mutex* ocspLock = &SSL_CM(ssl)->ocsp_stapling->ocspLock;
  20438. if (wc_LockMutex(ocspLock) == 0) {
  20439. if (ssl->ctx->certOcspRequest == NULL)
  20440. ssl->ctx->certOcspRequest = request;
  20441. wc_UnLockMutex(ocspLock);
  20442. }
  20443. }
  20444. }
  20445. FreeDecodedCert(cert);
  20446. return ret;
  20447. }
  20448. /* Creates OCSP response and places it in variable "response". Memory
  20449. * management for "buffer* response" is up to the caller.
  20450. *
  20451. * Also creates an OcspRequest in the case that ocspRequest is null or that
  20452. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  20453. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  20454. * be set to point to "ocspRequest" and it then should not be free'd since
  20455. * wolfSSL_CTX_free will take care of it.
  20456. *
  20457. * Returns 0 on success
  20458. */
  20459. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  20460. buffer* response)
  20461. {
  20462. int ret = 0;
  20463. OcspRequest* request = NULL;
  20464. byte createdRequest = 0;
  20465. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  20466. return BAD_FUNC_ARG;
  20467. XMEMSET(response, 0, sizeof(*response));
  20468. request = *ocspRequest;
  20469. /* unable to fetch status. skip. */
  20470. if (SSL_CM(ssl) == NULL || SSL_CM(ssl)->ocspStaplingEnabled == 0)
  20471. return 0;
  20472. if (request == NULL || ssl->buffers.weOwnCert) {
  20473. DerBuffer* der = ssl->buffers.certificate;
  20474. #ifdef WOLFSSL_SMALL_STACK
  20475. DecodedCert* cert = NULL;
  20476. #else
  20477. DecodedCert cert[1];
  20478. #endif
  20479. /* unable to fetch status. skip. */
  20480. if (der->buffer == NULL || der->length == 0)
  20481. return 0;
  20482. #ifdef WOLFSSL_SMALL_STACK
  20483. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  20484. DYNAMIC_TYPE_DCERT);
  20485. if (cert == NULL)
  20486. return MEMORY_E;
  20487. #endif
  20488. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  20489. DYNAMIC_TYPE_OCSP_REQUEST);
  20490. if (request == NULL)
  20491. ret = MEMORY_E;
  20492. createdRequest = 1;
  20493. if (ret == 0) {
  20494. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  20495. der->length);
  20496. }
  20497. if (ret != 0) {
  20498. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  20499. request = NULL;
  20500. }
  20501. #ifdef WOLFSSL_SMALL_STACK
  20502. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  20503. #endif
  20504. }
  20505. if (ret == 0) {
  20506. request->ssl = ssl;
  20507. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, request, response,
  20508. ssl->heap);
  20509. /* Suppressing, not critical */
  20510. if (ret == OCSP_CERT_REVOKED ||
  20511. ret == OCSP_CERT_UNKNOWN ||
  20512. ret == OCSP_LOOKUP_FAIL) {
  20513. ret = 0;
  20514. }
  20515. }
  20516. /* free request up if error case found otherwise return it */
  20517. if (ret != 0 && createdRequest) {
  20518. FreeOcspRequest(request);
  20519. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  20520. }
  20521. if (ret == 0)
  20522. *ocspRequest = request;
  20523. return ret;
  20524. }
  20525. #endif
  20526. #endif /* !NO_WOLFSSL_SERVER */
  20527. int cipherExtraData(WOLFSSL* ssl)
  20528. {
  20529. int cipherExtra;
  20530. /* Cipher data that may be added by BuildMessage */
  20531. /* There is always an IV (expect for chacha). For AEAD ciphers,
  20532. * there is the authentication tag (aead_mac_size). For block
  20533. * ciphers we have the hash_size MAC on the message, and one
  20534. * block size for possible padding. */
  20535. if (ssl->specs.cipher_type == aead) {
  20536. cipherExtra = ssl->specs.aead_mac_size;
  20537. /* CHACHA does not have an explicit IV. */
  20538. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) {
  20539. cipherExtra += AESGCM_EXP_IV_SZ;
  20540. }
  20541. }
  20542. else {
  20543. cipherExtra = ssl->specs.iv_size + ssl->specs.block_size +
  20544. ssl->specs.hash_size;
  20545. }
  20546. /* Sanity check so we don't ever return negative. */
  20547. return cipherExtra > 0 ? cipherExtra : 0;
  20548. }
  20549. #ifndef WOLFSSL_NO_TLS12
  20550. #ifndef NO_CERTS
  20551. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  20552. /* handle generation of certificate (11) */
  20553. int SendCertificate(WOLFSSL* ssl)
  20554. {
  20555. int ret = 0;
  20556. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  20557. word32 length, maxFragment;
  20558. #ifdef HAVE_RPK
  20559. int usingRpkTls12 = 0;
  20560. #endif /* HAVE_RPK */
  20561. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  20562. WOLFSSL_ENTER("SendCertificate");
  20563. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher) {
  20564. WOLFSSL_MSG("Not sending certificate msg. Using PSK or ANON cipher.");
  20565. return 0; /* not needed */
  20566. }
  20567. #ifdef HAVE_RPK
  20568. if (!IsAtLeastTLSv1_3(ssl->version)) {
  20569. /* If this is (D)TLS1.2 and RPK, then single cert, not list. */
  20570. if (ssl->options.side == WOLFSSL_SERVER_END) {
  20571. if (ssl->options.rpkState.sending_ServerCertTypeCnt == 1 &&
  20572. ssl->options.rpkState.sending_ServerCertTypes[0] == WOLFSSL_CERT_TYPE_RPK)
  20573. usingRpkTls12 = 1;
  20574. } else if (ssl->options.side == WOLFSSL_CLIENT_END) {
  20575. if (ssl->options.rpkState.sending_ClientCertTypeCnt == 1 &&
  20576. ssl->options.rpkState.sending_ClientCertTypes[0] == WOLFSSL_CERT_TYPE_RPK)
  20577. usingRpkTls12 = 1;
  20578. }
  20579. }
  20580. #endif /* HAVE_RPK */
  20581. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  20582. #ifdef OPENSSL_EXTRA
  20583. if (ssl->version.major == SSLv3_MAJOR
  20584. && ssl->version.minor == SSLv3_MINOR){
  20585. return SendAlert(ssl, alert_warning, no_certificate);
  20586. } else {
  20587. #endif
  20588. certSz = 0;
  20589. certChainSz = 0;
  20590. headerSz = CERT_HEADER_SZ;
  20591. length = CERT_HEADER_SZ;
  20592. listSz = 0;
  20593. #ifdef OPENSSL_EXTRA
  20594. }
  20595. #endif
  20596. }
  20597. else {
  20598. if (!ssl->buffers.certificate) {
  20599. WOLFSSL_MSG("Send Cert missing certificate buffer");
  20600. return BUFFER_ERROR;
  20601. }
  20602. certSz = ssl->buffers.certificate->length;
  20603. #ifdef HAVE_RPK
  20604. if (usingRpkTls12) {
  20605. headerSz = 1 * CERT_HEADER_SZ;
  20606. listSz = certSz;
  20607. } else {
  20608. #endif /* HAVE_RPK */
  20609. headerSz = 2 * CERT_HEADER_SZ;
  20610. listSz = certSz + CERT_HEADER_SZ;
  20611. #ifdef HAVE_RPK
  20612. }
  20613. #endif /* HAVE_RPK */
  20614. /* list + cert size */
  20615. length = certSz + headerSz;
  20616. /* may need to send rest of chain, already has leading size(s) */
  20617. if (certSz && ssl->buffers.certChain) {
  20618. certChainSz = ssl->buffers.certChain->length;
  20619. length += certChainSz;
  20620. listSz += certChainSz;
  20621. }
  20622. else
  20623. certChainSz = 0;
  20624. }
  20625. payloadSz = length;
  20626. if (ssl->fragOffset != 0)
  20627. length -= (ssl->fragOffset + headerSz);
  20628. maxFragment = MAX_RECORD_SIZE;
  20629. maxFragment = wolfSSL_GetMaxFragSize(ssl, maxFragment);
  20630. while (length > 0 && ret == 0) {
  20631. byte* output = NULL;
  20632. word32 fragSz = 0;
  20633. word32 i = RECORD_HEADER_SZ;
  20634. int sendSz = RECORD_HEADER_SZ;
  20635. ssl->options.buildingMsg = 1;
  20636. if (!ssl->options.dtls) {
  20637. if (ssl->fragOffset == 0) {
  20638. if (headerSz + certSz + certChainSz <=
  20639. maxFragment - HANDSHAKE_HEADER_SZ) {
  20640. fragSz = headerSz + certSz + certChainSz;
  20641. }
  20642. else {
  20643. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  20644. }
  20645. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  20646. i += HANDSHAKE_HEADER_SZ;
  20647. }
  20648. else {
  20649. fragSz = min(length, maxFragment);
  20650. sendSz += fragSz;
  20651. }
  20652. if (IsEncryptionOn(ssl, 1))
  20653. sendSz += MAX_MSG_EXTRA;
  20654. }
  20655. else {
  20656. #ifdef WOLFSSL_DTLS
  20657. fragSz = min(length, maxFragment);
  20658. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  20659. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  20660. #endif
  20661. }
  20662. if (IsEncryptionOn(ssl, 1))
  20663. sendSz += cipherExtraData(ssl);
  20664. /* check for available size */
  20665. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  20666. return ret;
  20667. /* get output buffer */
  20668. output = GetOutputBuffer(ssl);
  20669. /* Safe to use ssl->fragOffset since it will be incremented immediately
  20670. * after this block. This block needs to be entered only once to not
  20671. * hash the cert msg twice. */
  20672. if (ssl->fragOffset == 0) {
  20673. if (!ssl->options.dtls) {
  20674. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  20675. if (!IsEncryptionOn(ssl, 1))
  20676. HashRaw(ssl, output + RECORD_HEADER_SZ,
  20677. HANDSHAKE_HEADER_SZ);
  20678. }
  20679. else {
  20680. #ifdef WOLFSSL_DTLS
  20681. AddHeaders(output, payloadSz, certificate, ssl);
  20682. HashRaw(ssl,
  20683. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  20684. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  20685. /* Adding the headers increments these, decrement them for
  20686. * actual message header. */
  20687. ssl->keys.dtls_handshake_number--;
  20688. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  20689. ssl->keys.dtls_handshake_number--;
  20690. #endif /* WOLFSSL_DTLS */
  20691. }
  20692. /* list total */
  20693. #ifdef HAVE_RPK
  20694. if (!usingRpkTls12) {
  20695. #endif /* HAVE_RPK */
  20696. c32to24(listSz, output + i);
  20697. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  20698. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  20699. i += CERT_HEADER_SZ;
  20700. length -= CERT_HEADER_SZ;
  20701. fragSz -= CERT_HEADER_SZ;
  20702. #ifdef HAVE_RPK
  20703. }
  20704. #endif /* HAVE_RPK */
  20705. if (certSz) {
  20706. c32to24(certSz, output + i);
  20707. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  20708. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  20709. i += CERT_HEADER_SZ;
  20710. length -= CERT_HEADER_SZ;
  20711. fragSz -= CERT_HEADER_SZ;
  20712. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
  20713. HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  20714. if (certChainSz)
  20715. HashRaw(ssl, ssl->buffers.certChain->buffer,
  20716. certChainSz);
  20717. }
  20718. }
  20719. }
  20720. else {
  20721. if (!ssl->options.dtls) {
  20722. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  20723. }
  20724. else {
  20725. #ifdef WOLFSSL_DTLS
  20726. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  20727. payloadSz, certificate, ssl);
  20728. ssl->keys.dtls_handshake_number--;
  20729. #endif /* WOLFSSL_DTLS */
  20730. }
  20731. }
  20732. /* member */
  20733. if (certSz && ssl->fragOffset < certSz) {
  20734. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  20735. XMEMCPY(output + i,
  20736. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  20737. i += copySz;
  20738. ssl->fragOffset += copySz;
  20739. length -= copySz;
  20740. fragSz -= copySz;
  20741. }
  20742. if (certChainSz && fragSz) {
  20743. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  20744. XMEMCPY(output + i,
  20745. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  20746. copySz);
  20747. i += copySz;
  20748. ssl->fragOffset += copySz;
  20749. length -= copySz;
  20750. }
  20751. if (IsEncryptionOn(ssl, 1)) {
  20752. byte* input = NULL;
  20753. int inputSz = i; /* build msg adds rec hdr */
  20754. int recordHeaderSz = RECORD_HEADER_SZ;
  20755. if (ssl->options.dtls)
  20756. recordHeaderSz += DTLS_RECORD_EXTRA;
  20757. inputSz -= recordHeaderSz;
  20758. if (inputSz < 0) {
  20759. WOLFSSL_MSG("Send Cert bad inputSz");
  20760. return BUFFER_E;
  20761. }
  20762. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  20763. input = (byte*)XMALLOC(inputSz, ssl->heap,
  20764. DYNAMIC_TYPE_IN_BUFFER);
  20765. if (input == NULL)
  20766. return MEMORY_E;
  20767. XMEMCPY(input, output + recordHeaderSz, inputSz);
  20768. }
  20769. #ifndef WOLFSSL_DTLS
  20770. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  20771. handshake, 1, 0, 0, CUR_ORDER);
  20772. #else
  20773. if (!ssl->options.dtls)
  20774. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  20775. handshake, 1, 0, 0, CUR_ORDER);
  20776. else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
  20777. * calculate the hash ourselves above */ {
  20778. if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
  20779. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20780. return ret;
  20781. }
  20782. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  20783. handshake, 0, 0, 0, CUR_ORDER);
  20784. }
  20785. #endif
  20786. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20787. if (sendSz < 0)
  20788. return sendSz;
  20789. }
  20790. else {
  20791. sendSz = i;
  20792. #ifdef WOLFSSL_DTLS
  20793. if (IsDtlsNotSctpMode(ssl)) {
  20794. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
  20795. return ret;
  20796. }
  20797. if (ssl->options.dtls)
  20798. DtlsSEQIncrement(ssl, CUR_ORDER);
  20799. #endif
  20800. }
  20801. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20802. if (ssl->hsInfoOn)
  20803. AddPacketName(ssl, "Certificate");
  20804. if (ssl->toInfoOn) {
  20805. ret = AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  20806. WRITE_PROTO, 0, ssl->heap);
  20807. if (ret != 0)
  20808. return ret;
  20809. }
  20810. #endif
  20811. ssl->buffers.outputBuffer.length += sendSz;
  20812. if (!ssl->options.groupMessages)
  20813. ret = SendBuffered(ssl);
  20814. }
  20815. if (ret != WANT_WRITE) {
  20816. /* Clean up the fragment offset. */
  20817. ssl->options.buildingMsg = 0;
  20818. ssl->fragOffset = 0;
  20819. #ifdef WOLFSSL_DTLS
  20820. if (ssl->options.dtls)
  20821. ssl->keys.dtls_handshake_number++;
  20822. #endif
  20823. if (ssl->options.side == WOLFSSL_SERVER_END){
  20824. ssl->options.serverState = SERVER_CERT_COMPLETE;
  20825. }
  20826. }
  20827. WOLFSSL_LEAVE("SendCertificate", ret);
  20828. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  20829. return ret;
  20830. }
  20831. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  20832. /* handle generation of certificate_request (13) */
  20833. int SendCertificateRequest(WOLFSSL* ssl)
  20834. {
  20835. byte *output;
  20836. int ret;
  20837. int sendSz;
  20838. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  20839. word32 dnLen = 0;
  20840. #ifndef WOLFSSL_NO_CA_NAMES
  20841. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  20842. #endif
  20843. const Suites* suites = WOLFSSL_SUITES(ssl);
  20844. int typeTotal = 1; /* only 1 for now */
  20845. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  20846. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  20847. WOLFSSL_ENTER("SendCertificateRequest");
  20848. if (IsAtLeastTLSv1_2(ssl))
  20849. reqSz += LENGTH_SZ + suites->hashSigAlgoSz;
  20850. #ifndef WOLFSSL_NO_CA_NAMES
  20851. /* Certificate Authorities */
  20852. names = SSL_CA_NAMES(ssl);
  20853. while (names != NULL) {
  20854. byte seq[MAX_SEQ_SZ];
  20855. WOLFSSL_X509_NAME* name = names->data.name;
  20856. if (name != NULL) {
  20857. /* 16-bit length | SEQ | Len | DER of name */
  20858. dnLen += OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
  20859. name->rawLen;
  20860. }
  20861. names = names->next;
  20862. }
  20863. reqSz += dnLen;
  20864. #endif
  20865. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  20866. return 0; /* not needed */
  20867. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  20868. if (!ssl->options.dtls) {
  20869. if (IsEncryptionOn(ssl, 1))
  20870. sendSz += MAX_MSG_EXTRA;
  20871. }
  20872. else {
  20873. #ifdef WOLFSSL_DTLS
  20874. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  20875. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  20876. #endif
  20877. }
  20878. if (IsEncryptionOn(ssl, 1))
  20879. sendSz += cipherExtraData(ssl);
  20880. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  20881. * is not advanced yet */
  20882. ssl->options.buildingMsg = 1;
  20883. /* check for available size */
  20884. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  20885. return ret;
  20886. /* get output buffer */
  20887. output = GetOutputBuffer(ssl);
  20888. AddHeaders(output, reqSz, certificate_request, ssl);
  20889. /* write to output */
  20890. output[i++] = (byte)typeTotal; /* # of types */
  20891. #ifdef HAVE_ECC
  20892. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  20893. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  20894. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  20895. output[i++] = ecdsa_sign;
  20896. }
  20897. else
  20898. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \
  20899. (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \
  20900. defined(WOLFSSL_SM4_CCM))
  20901. if (ssl->options.cipherSuite0 == SM_BYTE && (0
  20902. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  20903. || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  20904. #endif
  20905. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  20906. || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  20907. #endif
  20908. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  20909. || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  20910. #endif
  20911. )) {
  20912. output[i++] = ecdsa_sign;
  20913. }
  20914. else
  20915. #endif
  20916. #endif /* HAVE_ECC */
  20917. {
  20918. output[i++] = rsa_sign;
  20919. }
  20920. /* supported hash/sig */
  20921. if (IsAtLeastTLSv1_2(ssl)) {
  20922. c16toa(suites->hashSigAlgoSz, &output[i]);
  20923. i += OPAQUE16_LEN;
  20924. XMEMCPY(&output[i], suites->hashSigAlgo, suites->hashSigAlgoSz);
  20925. i += suites->hashSigAlgoSz;
  20926. }
  20927. /* Certificate Authorities */
  20928. c16toa((word16)dnLen, &output[i]); /* auth's */
  20929. i += REQ_HEADER_SZ;
  20930. #ifndef WOLFSSL_NO_CA_NAMES
  20931. names = SSL_CA_NAMES(ssl);
  20932. while (names != NULL) {
  20933. byte seq[MAX_SEQ_SZ];
  20934. WOLFSSL_X509_NAME* name = names->data.name;
  20935. if (name != NULL) {
  20936. c16toa((word16)name->rawLen +
  20937. (word16)SetSequence(name->rawLen, seq), &output[i]);
  20938. i += OPAQUE16_LEN;
  20939. i += SetSequence(name->rawLen, output + i);
  20940. XMEMCPY(output + i, name->raw, name->rawLen);
  20941. i += name->rawLen;
  20942. }
  20943. names = names->next;
  20944. }
  20945. #endif
  20946. (void)i;
  20947. if (IsEncryptionOn(ssl, 1)) {
  20948. byte* input = NULL;
  20949. int inputSz = i; /* build msg adds rec hdr */
  20950. int recordHeaderSz = RECORD_HEADER_SZ;
  20951. if (ssl->options.dtls)
  20952. recordHeaderSz += DTLS_RECORD_EXTRA;
  20953. inputSz -= recordHeaderSz;
  20954. if (inputSz <= 0) {
  20955. WOLFSSL_MSG("Send Cert Req bad inputSz");
  20956. return BUFFER_E;
  20957. }
  20958. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20959. if (input == NULL)
  20960. return MEMORY_E;
  20961. XMEMCPY(input, output + recordHeaderSz, inputSz);
  20962. #ifdef WOLFSSL_DTLS
  20963. if (IsDtlsNotSctpMode(ssl) &&
  20964. (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
  20965. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20966. return ret;
  20967. }
  20968. #endif
  20969. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  20970. handshake, 1, 0, 0, CUR_ORDER);
  20971. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20972. if (sendSz < 0)
  20973. return sendSz;
  20974. } else {
  20975. sendSz = i;
  20976. #ifdef WOLFSSL_DTLS
  20977. if (IsDtlsNotSctpMode(ssl)) {
  20978. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
  20979. return ret;
  20980. }
  20981. if (ssl->options.dtls)
  20982. DtlsSEQIncrement(ssl, CUR_ORDER);
  20983. #endif
  20984. ret = HashOutput(ssl, output, sendSz, 0);
  20985. if (ret != 0)
  20986. return ret;
  20987. }
  20988. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20989. if (ssl->hsInfoOn)
  20990. AddPacketName(ssl, "CertificateRequest");
  20991. if (ssl->toInfoOn) {
  20992. ret = AddPacketInfo(ssl, "CertificateRequest", handshake, output,
  20993. sendSz, WRITE_PROTO, 0, ssl->heap);
  20994. if (ret != 0)
  20995. return ret;
  20996. }
  20997. #endif
  20998. ssl->buffers.outputBuffer.length += sendSz;
  20999. if (ssl->options.groupMessages)
  21000. ret = 0;
  21001. else
  21002. ret = SendBuffered(ssl);
  21003. ssl->options.buildingMsg = 0;
  21004. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  21005. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  21006. return ret;
  21007. }
  21008. #ifndef NO_WOLFSSL_SERVER
  21009. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  21010. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  21011. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  21012. byte count)
  21013. {
  21014. byte* output = NULL;
  21015. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  21016. word32 length = ENUM_LEN;
  21017. int sendSz = 0;
  21018. int ret = 0;
  21019. int i = 0;
  21020. WOLFSSL_ENTER("BuildCertificateStatus");
  21021. switch (type) {
  21022. case WOLFSSL_CSR2_OCSP_MULTI:
  21023. length += OPAQUE24_LEN;
  21024. FALL_THROUGH; /* followed by */
  21025. case WOLFSSL_CSR2_OCSP:
  21026. for (i = 0; i < count; i++)
  21027. length += OPAQUE24_LEN + status[i].length;
  21028. break;
  21029. default:
  21030. return 0;
  21031. }
  21032. sendSz = idx + length;
  21033. if (ssl->keys.encryptionOn)
  21034. sendSz += MAX_MSG_EXTRA;
  21035. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  21036. * is not advanced yet */
  21037. ssl->options.buildingMsg = 1;
  21038. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  21039. output = GetOutputBuffer(ssl);
  21040. AddHeaders(output, length, certificate_status, ssl);
  21041. output[idx++] = type;
  21042. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  21043. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  21044. idx += OPAQUE24_LEN;
  21045. }
  21046. for (i = 0; i < count; i++) {
  21047. c32to24(status[i].length, output + idx);
  21048. idx += OPAQUE24_LEN;
  21049. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  21050. idx += status[i].length;
  21051. }
  21052. if (IsEncryptionOn(ssl, 1)) {
  21053. byte* input;
  21054. int inputSz = idx; /* build msg adds rec hdr */
  21055. int recordHeaderSz = RECORD_HEADER_SZ;
  21056. if (ssl->options.dtls)
  21057. recordHeaderSz += DTLS_RECORD_EXTRA;
  21058. inputSz -= recordHeaderSz;
  21059. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21060. if (input == NULL)
  21061. return MEMORY_E;
  21062. XMEMCPY(input, output + recordHeaderSz, inputSz);
  21063. #ifdef WOLFSSL_DTLS
  21064. ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
  21065. #endif
  21066. if (ret == 0)
  21067. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  21068. handshake, 1, 0, 0, CUR_ORDER);
  21069. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  21070. if (sendSz < 0)
  21071. ret = sendSz;
  21072. }
  21073. else {
  21074. #ifdef WOLFSSL_DTLS
  21075. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  21076. ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
  21077. if (ret == 0 && ssl->options.dtls)
  21078. DtlsSEQIncrement(ssl, CUR_ORDER);
  21079. #endif
  21080. ret = HashOutput(ssl, output, sendSz, 0);
  21081. }
  21082. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  21083. if (ret == 0 && ssl->hsInfoOn)
  21084. AddPacketName(ssl, "CertificateStatus");
  21085. if (ret == 0 && ssl->toInfoOn) {
  21086. ret = AddPacketInfo(ssl, "CertificateStatus", handshake, output,
  21087. sendSz, WRITE_PROTO, 0, ssl->heap);
  21088. if (ret != 0)
  21089. return ret;
  21090. }
  21091. #endif
  21092. if (ret == 0) {
  21093. ssl->options.buildingMsg = 0;
  21094. ssl->buffers.outputBuffer.length += sendSz;
  21095. if (!ssl->options.groupMessages)
  21096. ret = SendBuffered(ssl);
  21097. }
  21098. }
  21099. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  21100. return ret;
  21101. }
  21102. #endif
  21103. #endif /* NO_WOLFSSL_SERVER */
  21104. /* handle generation of certificate_status (22) */
  21105. int SendCertificateStatus(WOLFSSL* ssl)
  21106. {
  21107. int ret = 0;
  21108. byte status_type = 0;
  21109. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  21110. WOLFSSL_ENTER("SendCertificateStatus");
  21111. (void) ssl;
  21112. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  21113. status_type = ssl->status_request;
  21114. #endif
  21115. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  21116. status_type = status_type ? status_type : ssl->status_request_v2;
  21117. #endif
  21118. switch (status_type) {
  21119. #ifndef NO_WOLFSSL_SERVER
  21120. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  21121. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  21122. /* case WOLFSSL_CSR_OCSP: */
  21123. case WOLFSSL_CSR2_OCSP:
  21124. {
  21125. OcspRequest* request = ssl->ctx->certOcspRequest;
  21126. buffer response;
  21127. ret = CreateOcspResponse(ssl, &request, &response);
  21128. /* if a request was successfully created and not stored in
  21129. * ssl->ctx then free it */
  21130. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  21131. FreeOcspRequest(request);
  21132. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  21133. request = NULL;
  21134. }
  21135. if (ret == 0 && response.buffer) {
  21136. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  21137. }
  21138. /* Let's not error out the connection if we can't verify our cert */
  21139. if (ret == ASN_SELF_SIGNED_E || ret == ASN_NO_SIGNER_E)
  21140. ret = 0;
  21141. if (response.buffer) {
  21142. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  21143. response.buffer = NULL;
  21144. }
  21145. break;
  21146. }
  21147. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  21148. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  21149. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  21150. case WOLFSSL_CSR2_OCSP_MULTI:
  21151. {
  21152. OcspRequest* request = ssl->ctx->certOcspRequest;
  21153. buffer responses[1 + MAX_CHAIN_DEPTH];
  21154. int i = 0;
  21155. XMEMSET(responses, 0, sizeof(responses));
  21156. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  21157. /* if a request was successfully created and not stored in
  21158. * ssl->ctx then free it */
  21159. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  21160. FreeOcspRequest(request);
  21161. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  21162. request = NULL;
  21163. }
  21164. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  21165. || ssl->buffers.weOwnCertChain)) {
  21166. buffer der;
  21167. word32 idx = 0;
  21168. #ifdef WOLFSSL_SMALL_STACK
  21169. DecodedCert* cert;
  21170. #else
  21171. DecodedCert cert[1];
  21172. #endif
  21173. DerBuffer* chain;
  21174. #ifdef WOLFSSL_SMALL_STACK
  21175. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  21176. DYNAMIC_TYPE_DCERT);
  21177. if (cert == NULL)
  21178. return MEMORY_E;
  21179. #endif
  21180. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  21181. DYNAMIC_TYPE_OCSP_REQUEST);
  21182. if (request == NULL) {
  21183. #ifdef WOLFSSL_SMALL_STACK
  21184. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  21185. #endif
  21186. return MEMORY_E;
  21187. }
  21188. /* use certChain if available, otherwise use peer certificate */
  21189. chain = ssl->buffers.certChain;
  21190. if (chain == NULL) {
  21191. chain = ssl->buffers.certificate;
  21192. }
  21193. if (chain && chain->buffer) {
  21194. while (idx + OPAQUE24_LEN < chain->length) {
  21195. c24to32(chain->buffer + idx, &der.length);
  21196. idx += OPAQUE24_LEN;
  21197. der.buffer = chain->buffer + idx;
  21198. idx += der.length;
  21199. if (idx > chain->length)
  21200. break;
  21201. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  21202. der.length);
  21203. if (ret == 0) {
  21204. request->ssl = ssl;
  21205. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  21206. request, &responses[i + 1], ssl->heap);
  21207. /* Suppressing, not critical */
  21208. if (ret == OCSP_CERT_REVOKED ||
  21209. ret == OCSP_CERT_UNKNOWN ||
  21210. ret == OCSP_LOOKUP_FAIL) {
  21211. ret = 0;
  21212. }
  21213. i++;
  21214. FreeOcspRequest(request);
  21215. }
  21216. }
  21217. }
  21218. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  21219. #ifdef WOLFSSL_SMALL_STACK
  21220. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  21221. #endif
  21222. }
  21223. else {
  21224. while (ret == 0 &&
  21225. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  21226. request->ssl = ssl;
  21227. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  21228. request, &responses[++i], ssl->heap);
  21229. /* Suppressing, not critical */
  21230. if (ret == OCSP_CERT_REVOKED ||
  21231. ret == OCSP_CERT_UNKNOWN ||
  21232. ret == OCSP_LOOKUP_FAIL) {
  21233. ret = 0;
  21234. }
  21235. }
  21236. }
  21237. if (responses[0].buffer) {
  21238. if (ret == 0) {
  21239. ret = BuildCertificateStatus(ssl, status_type, responses,
  21240. (byte)i + 1);
  21241. }
  21242. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  21243. if (responses[i].buffer) {
  21244. XFREE(responses[i].buffer, ssl->heap,
  21245. DYNAMIC_TYPE_OCSP_REQUEST);
  21246. }
  21247. }
  21248. }
  21249. /* Let's not error out the connection if we can't verify our cert */
  21250. if (ret == ASN_SELF_SIGNED_E || ret == ASN_NO_SIGNER_E)
  21251. ret = 0;
  21252. break;
  21253. }
  21254. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  21255. #endif /* NO_WOLFSSL_SERVER */
  21256. default:
  21257. break;
  21258. }
  21259. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  21260. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  21261. return ret;
  21262. }
  21263. #endif /* !NO_CERTS */
  21264. #endif /* WOLFSSL_NO_TLS12 */
  21265. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  21266. /**
  21267. * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
  21268. */
  21269. int DtlsSCRKeysSet(WOLFSSL* ssl)
  21270. {
  21271. return ssl->secure_renegotiation &&
  21272. ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
  21273. }
  21274. /**
  21275. * ssl->keys contains the current cipher parameters only for epoch 1. For
  21276. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  21277. * cipher parameters. This function checks if the message currently being
  21278. * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  21279. */
  21280. int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
  21281. {
  21282. return DtlsSCRKeysSet(ssl) &&
  21283. ssl->keys.curEpoch ==
  21284. ssl->secure_renegotiation->tmp_keys.dtls_epoch;
  21285. }
  21286. /**
  21287. * ssl->keys contains the current cipher parameters only for epoch 1. For
  21288. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  21289. * cipher parameters. This function checks if the message currently being
  21290. * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  21291. */
  21292. int DtlsUseSCRKeys(WOLFSSL* ssl)
  21293. {
  21294. return DtlsSCRKeysSet(ssl) &&
  21295. ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
  21296. ssl->keys.dtls_epoch;
  21297. }
  21298. /**
  21299. * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
  21300. * then PREV_ORDER refers to the current epoch.
  21301. * */
  21302. int DtlsCheckOrder(WOLFSSL* ssl, int order)
  21303. {
  21304. if (order == PREV_ORDER && ssl->secure_renegotiation &&
  21305. ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
  21306. return CUR_ORDER;
  21307. }
  21308. else {
  21309. return order;
  21310. }
  21311. }
  21312. #endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
  21313. /* If secure renegotiation is disabled, this will always return false.
  21314. * Otherwise it checks to see if we are currently renegotiating. */
  21315. int IsSCR(WOLFSSL* ssl)
  21316. {
  21317. #ifndef HAVE_SECURE_RENEGOTIATION
  21318. (void)ssl;
  21319. #else /* HAVE_SECURE_RENEGOTIATION */
  21320. if (ssl->secure_renegotiation &&
  21321. ssl->secure_renegotiation->enabled && /* Is SCR enabled? */
  21322. ssl->options.handShakeDone && /* At least one handshake done? */
  21323. ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
  21324. return 1;
  21325. #endif /* HAVE_SECURE_RENEGOTIATION */
  21326. return 0;
  21327. }
  21328. #ifdef WOLFSSL_DTLS
  21329. static int ModifyForMTU(WOLFSSL* ssl, int buffSz, int outputSz, int mtuSz)
  21330. {
  21331. int recordExtra = outputSz - buffSz;
  21332. (void)ssl;
  21333. if (recordExtra > 0 && outputSz > mtuSz) {
  21334. buffSz = mtuSz - recordExtra;
  21335. #ifndef WOLFSSL_AEAD_ONLY
  21336. /* Subtract a block size to be certain that returned fragment
  21337. * size won't get more padding. */
  21338. if (ssl->specs.cipher_type == block)
  21339. buffSz -= ssl->specs.block_size;
  21340. #endif
  21341. }
  21342. return buffSz;
  21343. }
  21344. #endif /* WOLFSSL_DTLS */
  21345. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  21346. /*
  21347. * Enforce limits specified in
  21348. * https://www.rfc-editor.org/rfc/rfc8446#section-5.5
  21349. */
  21350. static int CheckTLS13AEADSendLimit(WOLFSSL* ssl)
  21351. {
  21352. w64wrapper seq;
  21353. w64wrapper limit;
  21354. switch (ssl->specs.bulk_cipher_algorithm) {
  21355. #ifdef BUILD_AESGCM
  21356. case wolfssl_aes_gcm:
  21357. /* Limit is 2^24.5 */
  21358. limit = AEAD_AES_LIMIT;
  21359. break;
  21360. #endif
  21361. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  21362. case wolfssl_chacha:
  21363. /* For ChaCha20/Poly1305, the record sequence number would wrap
  21364. * before the safety limit is reached. */
  21365. return 0;
  21366. #endif
  21367. #ifdef HAVE_AESCCM
  21368. case wolfssl_aes_ccm:
  21369. /* Use the limits calculated in the DTLS 1.3 spec
  21370. * https://www.rfc-editor.org/rfc/rfc9147.html#name-analysis-of-limits-on-ccm-u */
  21371. #ifdef WOLFSSL_DTLS13
  21372. if (ssl->options.dtls)
  21373. limit = DTLS_AEAD_AES_CCM_LIMIT; /* Limit is 2^23 */
  21374. else
  21375. #endif
  21376. limit = AEAD_AES_LIMIT; /* Limit is 2^24.5 */
  21377. break;
  21378. #endif
  21379. #ifdef WOLFSSL_SM4_GCM
  21380. case wolfssl_sm4_gcm:
  21381. /* Limit is 2^22 - 1 */
  21382. limit = AEAD_SM4_GCM_LIMIT;
  21383. break;
  21384. #endif
  21385. #ifdef WOLFSSL_SM4_CCM
  21386. case wolfssl_sm4_ccm:
  21387. /* Limit is 2^10 - 1 */
  21388. limit = AEAD_SM4_CCM_LIMIT;
  21389. break;
  21390. #endif
  21391. case wolfssl_cipher_null:
  21392. /* No encryption being done */
  21393. return 0;
  21394. default:
  21395. WOLFSSL_MSG("Unrecognized ciphersuite for AEAD limit check");
  21396. return BAD_STATE_E;
  21397. }
  21398. #ifdef WOLFSSL_DTLS13
  21399. if (ssl->options.dtls) {
  21400. seq = ssl->dtls13EncryptEpoch->nextSeqNumber;
  21401. }
  21402. else
  21403. #endif
  21404. {
  21405. seq = w64From32(ssl->keys.sequence_number_hi,
  21406. ssl->keys.sequence_number_lo);
  21407. }
  21408. if (w64GTE(seq, limit)) { /* cppcheck-suppress uninitvar
  21409. * (false positive from cppcheck-2.13.0)
  21410. */
  21411. return Tls13UpdateKeys(ssl); /* Need to generate new keys */
  21412. }
  21413. return 0;
  21414. }
  21415. #endif /* WOLFSSL_TLS13 && !WOLFSSL_TLS13_IGNORE_AEAD_LIMITS */
  21416. /**
  21417. * ssl_in_handshake():
  21418. * Invoked in wolfSSL_read/wolfSSL_write to check if wolfSSL_negotiate() is
  21419. * needed in the handshake.
  21420. *
  21421. * In TLSv1.2 negotiate until the end of the handshake, unless:
  21422. * 1 in SCR and sending data or
  21423. * 2 in SCR and we have plain data ready
  21424. * Early data logic may bypass this logic in TLSv1.3 when appropriate.
  21425. */
  21426. static int ssl_in_handshake(WOLFSSL *ssl, int send)
  21427. {
  21428. if (IsSCR(ssl)) {
  21429. if (send) {
  21430. /* allow sending data in SCR */
  21431. return 0;
  21432. } else {
  21433. /* allow reading buffered data in SCR */
  21434. if (ssl->buffers.clearOutputBuffer.length != 0)
  21435. return 0;
  21436. }
  21437. return 1;
  21438. }
  21439. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  21440. return 1;
  21441. if (ssl->options.side == WOLFSSL_SERVER_END) {
  21442. if (IsAtLeastTLSv1_3(ssl->version))
  21443. return ssl->options.acceptState < TLS13_TICKET_SENT;
  21444. if (IsAtLeastTLSv1_2(ssl))
  21445. return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE;
  21446. return 0;
  21447. }
  21448. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  21449. if (IsAtLeastTLSv1_3(ssl->version))
  21450. return ssl->options.connectState < FINISHED_DONE;
  21451. if (IsAtLeastTLSv1_2(ssl))
  21452. return ssl->options.connectState < SECOND_REPLY_DONE;
  21453. return 0;
  21454. }
  21455. return 0;
  21456. }
  21457. int SendData(WOLFSSL* ssl, const void* data, int sz)
  21458. {
  21459. int sent = 0, /* plainText size */
  21460. sendSz,
  21461. ret;
  21462. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  21463. int groupMsgs = 0;
  21464. #endif
  21465. if (ssl->error == WANT_WRITE
  21466. #ifdef WOLFSSL_ASYNC_CRYPT
  21467. || ssl->error == WC_PENDING_E
  21468. #endif
  21469. ) {
  21470. ssl->error = 0;
  21471. }
  21472. /* don't allow write after decrypt or mac error */
  21473. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  21474. /* For DTLS allow these possible errors and allow the session
  21475. to continue despite them */
  21476. if (ssl->options.dtls) {
  21477. ssl->error = 0;
  21478. }
  21479. else {
  21480. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  21481. return WOLFSSL_FATAL_ERROR;
  21482. }
  21483. }
  21484. #ifdef WOLFSSL_EARLY_DATA
  21485. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  21486. ssl->earlyData != no_early_data &&
  21487. ssl->earlyData != done_early_data) {
  21488. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  21489. WOLFSSL_MSG("handshake complete, trying to send early data");
  21490. ssl->error = BUILD_MSG_ERROR;
  21491. return WOLFSSL_FATAL_ERROR;
  21492. }
  21493. #ifdef WOLFSSL_EARLY_DATA_GROUP
  21494. groupMsgs = 1;
  21495. #endif
  21496. }
  21497. else if (IsAtLeastTLSv1_3(ssl->version) &&
  21498. ssl->options.side == WOLFSSL_SERVER_END &&
  21499. ssl->options.acceptState >= TLS13_ACCEPT_FINISHED_SENT) {
  21500. /* We can send data without waiting on peer finished msg */
  21501. WOLFSSL_MSG("server sending data before receiving client finished");
  21502. }
  21503. else
  21504. #endif
  21505. if (ssl_in_handshake(ssl, 1)) {
  21506. int err;
  21507. WOLFSSL_MSG("handshake not complete, trying to finish");
  21508. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  21509. #ifdef WOLFSSL_ASYNC_CRYPT
  21510. /* if async would block return WANT_WRITE */
  21511. if (ssl->error == WC_PENDING_E) {
  21512. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  21513. }
  21514. #endif
  21515. return err;
  21516. }
  21517. }
  21518. /* last time system socket output buffer was full, try again to send */
  21519. if (ssl->buffers.outputBuffer.length > 0
  21520. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  21521. && !groupMsgs
  21522. #endif
  21523. ) {
  21524. WOLFSSL_MSG("output buffer was full, trying to send again");
  21525. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  21526. WOLFSSL_ERROR(ssl->error);
  21527. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  21528. ssl->options.isClosed)) {
  21529. ssl->error = SOCKET_PEER_CLOSED_E;
  21530. WOLFSSL_ERROR(ssl->error);
  21531. return 0; /* peer reset or closed */
  21532. }
  21533. return ssl->error;
  21534. }
  21535. else {
  21536. /* advance sent to previous sent + plain size just sent */
  21537. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  21538. WOLFSSL_MSG("sent write buffered data");
  21539. if (sent > sz) {
  21540. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  21541. return ssl->error = BAD_FUNC_ARG;
  21542. }
  21543. }
  21544. }
  21545. ret = RetrySendAlert(ssl);
  21546. if (ret != 0) {
  21547. ssl->error = ret;
  21548. return WOLFSSL_FATAL_ERROR;
  21549. }
  21550. for (;;) {
  21551. byte* out;
  21552. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  21553. int buffSz; /* may switch on comp */
  21554. int outputSz;
  21555. #ifdef HAVE_LIBZ
  21556. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  21557. #endif
  21558. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  21559. if (IsAtLeastTLSv1_3(ssl->version)) {
  21560. ret = CheckTLS13AEADSendLimit(ssl);
  21561. if (ret != 0) {
  21562. ssl->error = ret;
  21563. return WOLFSSL_FATAL_ERROR;
  21564. }
  21565. }
  21566. #endif
  21567. #ifdef WOLFSSL_DTLS13
  21568. if (ssl->options.dtls && ssl->options.tls1_3) {
  21569. byte isEarlyData = 0;
  21570. if (ssl->dtls13EncryptEpoch == NULL)
  21571. return ssl->error = BAD_STATE_E;
  21572. #ifdef WOLFSSL_EARLY_DATA
  21573. isEarlyData = ssl->options.side == WOLFSSL_CLIENT_END &&
  21574. ssl->earlyData != no_early_data &&
  21575. ssl->earlyData != done_early_data;
  21576. #endif
  21577. if (isEarlyData) {
  21578. #ifdef WOLFSSL_EARLY_DATA
  21579. ret = Dtls13SetEpochKeys(ssl,
  21580. w64From32(0x0, DTLS13_EPOCH_EARLYDATA), ENCRYPT_SIDE_ONLY);
  21581. if (ret != 0) {
  21582. WOLFSSL_MSG(
  21583. "trying to send early data without epoch 1");
  21584. ssl->error = BUILD_MSG_ERROR;
  21585. return WOLFSSL_FATAL_ERROR;
  21586. }
  21587. #endif /* WOLFSSL_EARLY_DATA */
  21588. }
  21589. else if (!w64Equal(
  21590. ssl->dtls13EncryptEpoch->epochNumber,
  21591. ssl->dtls13Epoch)) {
  21592. ret = Dtls13SetEpochKeys(
  21593. ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
  21594. if (ret != 0) {
  21595. ssl->error = BUILD_MSG_ERROR;
  21596. return WOLFSSL_FATAL_ERROR;
  21597. }
  21598. }
  21599. }
  21600. #endif /* WOLFSSL_DTLS13 */
  21601. #ifdef WOLFSSL_DTLS
  21602. if (ssl->options.dtls) {
  21603. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  21604. }
  21605. else
  21606. #endif
  21607. {
  21608. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  21609. }
  21610. if (sent == sz) break;
  21611. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
  21612. if (ssl->options.dtls && (buffSz < sz - sent)) {
  21613. ssl->error = DTLS_SIZE_ERROR;
  21614. WOLFSSL_ERROR(ssl->error);
  21615. return ssl->error;
  21616. }
  21617. #endif
  21618. outputSz = buffSz + COMP_EXTRA + DTLS_RECORD_HEADER_SZ;
  21619. if (IsEncryptionOn(ssl, 1) || ssl->options.tls1_3)
  21620. outputSz += cipherExtraData(ssl);
  21621. /* check for available size */
  21622. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  21623. return ssl->error = ret;
  21624. /* get output buffer */
  21625. out = GetOutputBuffer(ssl);
  21626. #ifdef HAVE_LIBZ
  21627. if (ssl->options.usingCompression) {
  21628. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  21629. if (buffSz < 0) {
  21630. return buffSz;
  21631. }
  21632. sendBuffer = comp;
  21633. }
  21634. #endif
  21635. if (!ssl->options.tls1_3) {
  21636. #ifdef WOLFSSL_ASYNC_CRYPT
  21637. if (ssl->async == NULL) {
  21638. ssl->async = (struct WOLFSSL_ASYNC*)
  21639. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  21640. DYNAMIC_TYPE_ASYNC);
  21641. if (ssl->async == NULL)
  21642. return MEMORY_E;
  21643. ssl->async->freeArgs = NULL;
  21644. }
  21645. #endif
  21646. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  21647. application_data, 0, 0, 1, CUR_ORDER);
  21648. }
  21649. else {
  21650. #ifdef WOLFSSL_TLS13
  21651. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  21652. application_data, 0, 0, 1);
  21653. #else
  21654. sendSz = BUFFER_ERROR;
  21655. #endif
  21656. }
  21657. if (sendSz < 0) {
  21658. #ifdef WOLFSSL_ASYNC_CRYPT
  21659. if (sendSz == WC_PENDING_E)
  21660. ssl->error = sendSz;
  21661. #endif
  21662. return BUILD_MSG_ERROR;
  21663. }
  21664. #ifdef WOLFSSL_ASYNC_CRYPT
  21665. FreeAsyncCtx(ssl, 0);
  21666. #endif
  21667. ssl->buffers.outputBuffer.length += sendSz;
  21668. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  21669. WOLFSSL_ERROR(ssl->error);
  21670. /* store for next call if WANT_WRITE or user embedSend() that
  21671. doesn't present like WANT_WRITE */
  21672. ssl->buffers.plainSz = buffSz;
  21673. ssl->buffers.prevSent = sent;
  21674. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  21675. ssl->options.isClosed)) {
  21676. ssl->error = SOCKET_PEER_CLOSED_E;
  21677. WOLFSSL_ERROR(ssl->error);
  21678. return 0; /* peer reset or closed */
  21679. }
  21680. return ssl->error;
  21681. }
  21682. sent += buffSz;
  21683. /* only one message per attempt */
  21684. if (ssl->options.partialWrite == 1) {
  21685. WOLFSSL_MSG("Partial Write on, only sending one record");
  21686. break;
  21687. }
  21688. }
  21689. return sent;
  21690. }
  21691. /* process input data */
  21692. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  21693. {
  21694. int size;
  21695. WOLFSSL_ENTER("ReceiveData");
  21696. /* reset error state */
  21697. if (ssl->error == WANT_READ || ssl->error == WOLFSSL_ERROR_WANT_READ) {
  21698. ssl->error = 0;
  21699. }
  21700. #ifdef WOLFSSL_DTLS
  21701. if (ssl->options.dtls) {
  21702. /* In DTLS mode, we forgive some errors and allow the session
  21703. * to continue despite them. */
  21704. if (ssl->error == VERIFY_MAC_ERROR ||
  21705. ssl->error == DECRYPT_ERROR ||
  21706. ssl->error == DTLS_SIZE_ERROR) {
  21707. ssl->error = 0;
  21708. }
  21709. }
  21710. #endif /* WOLFSSL_DTLS */
  21711. if (ssl->error != 0 && ssl->error != WANT_WRITE
  21712. #ifdef WOLFSSL_ASYNC_CRYPT
  21713. && ssl->error != WC_PENDING_E
  21714. #endif
  21715. #if defined(HAVE_SECURE_RENEGOTIATION) || defined(WOLFSSL_DTLS13)
  21716. && ssl->error != APP_DATA_READY
  21717. #endif
  21718. ) {
  21719. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  21720. return ssl->error;
  21721. }
  21722. #ifdef WOLFSSL_EARLY_DATA
  21723. if (ssl->options.side == WOLFSSL_SERVER_END &&
  21724. ssl->earlyData > early_data_ext && ssl->earlyData < done_early_data) {
  21725. }
  21726. else
  21727. #endif
  21728. {
  21729. if (ssl_in_handshake(ssl, 0)) {
  21730. int err;
  21731. WOLFSSL_MSG("Handshake not complete, trying to finish");
  21732. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  21733. #ifdef WOLFSSL_ASYNC_CRYPT
  21734. /* if async would block return WANT_WRITE */
  21735. if (ssl->error == WC_PENDING_E) {
  21736. return WOLFSSL_CBIO_ERR_WANT_READ;
  21737. }
  21738. #endif
  21739. return err;
  21740. }
  21741. }
  21742. }
  21743. #ifdef HAVE_SECURE_RENEGOTIATION
  21744. startScr:
  21745. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  21746. int ret;
  21747. WOLFSSL_MSG("Need to start scr, server requested");
  21748. ret = wolfSSL_Rehandshake(ssl);
  21749. ssl->secure_renegotiation->startScr = 0; /* only start once */
  21750. if (ret != WOLFSSL_SUCCESS)
  21751. return ret;
  21752. }
  21753. #endif
  21754. while (ssl->buffers.clearOutputBuffer.length == 0) {
  21755. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  21756. if (ssl->error == ZERO_RETURN) {
  21757. WOLFSSL_MSG("Zero return, no more data coming");
  21758. return 0; /* no more data coming */
  21759. }
  21760. if (ssl->error == SOCKET_ERROR_E) {
  21761. if (ssl->options.connReset || ssl->options.isClosed) {
  21762. WOLFSSL_MSG("Peer reset or closed, connection done");
  21763. ssl->error = SOCKET_PEER_CLOSED_E;
  21764. WOLFSSL_ERROR(ssl->error);
  21765. return 0; /* peer reset or closed */
  21766. }
  21767. }
  21768. WOLFSSL_ERROR(ssl->error);
  21769. return ssl->error;
  21770. }
  21771. #ifdef WOLFSSL_DTLS13
  21772. if (ssl->options.dtls) {
  21773. /* Dtls13DoScheduledWork(ssl) may return WANT_WRITE */
  21774. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  21775. WOLFSSL_ERROR(ssl->error);
  21776. return ssl->error;
  21777. }
  21778. }
  21779. #endif /* WOLFSSL_DTLS13 */
  21780. #ifdef HAVE_SECURE_RENEGOTIATION
  21781. if (ssl->secure_renegotiation &&
  21782. ssl->secure_renegotiation->startScr) {
  21783. goto startScr;
  21784. }
  21785. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  21786. ssl->options.handShakeState != HANDSHAKE_DONE
  21787. && ssl->buffers.clearOutputBuffer.length == 0) {
  21788. /* ProcessReply processed a handshake packet and not any APP DATA
  21789. * so let's move the handshake along */
  21790. int err;
  21791. WOLFSSL_MSG("Handshake not complete, trying to finish");
  21792. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  21793. #ifdef WOLFSSL_ASYNC_CRYPT
  21794. /* if async would block return WANT_WRITE */
  21795. if (ssl->error == WC_PENDING_E) {
  21796. return WOLFSSL_CBIO_ERR_WANT_READ;
  21797. }
  21798. #endif
  21799. return err;
  21800. }
  21801. }
  21802. #endif
  21803. #ifdef WOLFSSL_DTLS13
  21804. /* if wolfSSL_Peek() is invoked with sz == 0 it will not block (but
  21805. * it processes pending non-application records) */
  21806. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version) && peek &&
  21807. sz == 0 && ssl->buffers.inputBuffer.idx
  21808. - ssl->buffers.inputBuffer.length == 0) {
  21809. return 0;
  21810. }
  21811. #endif /* WOLFSSL_DTLS13 */
  21812. #ifndef WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
  21813. #ifdef WOLFSSL_TLS13
  21814. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
  21815. ssl->curRL.type == handshake && peek) {
  21816. WOLFSSL_MSG("Got Handshake Message in APP data");
  21817. if (ssl->buffers.inputBuffer.length == 0) {
  21818. ssl->error = WOLFSSL_ERROR_WANT_READ;
  21819. return 0;
  21820. }
  21821. }
  21822. #endif
  21823. #endif
  21824. }
  21825. size = min(sz, (int)ssl->buffers.clearOutputBuffer.length);
  21826. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  21827. if (peek == 0) {
  21828. ssl->buffers.clearOutputBuffer.length -= size;
  21829. ssl->buffers.clearOutputBuffer.buffer += size;
  21830. }
  21831. if (ssl->buffers.inputBuffer.dynamicFlag)
  21832. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  21833. WOLFSSL_LEAVE("ReceiveData()", size);
  21834. return size;
  21835. }
  21836. static int SendAlert_ex(WOLFSSL* ssl, int severity, int type)
  21837. {
  21838. byte input[ALERT_SIZE];
  21839. byte *output;
  21840. int sendSz;
  21841. int ret;
  21842. int outputSz;
  21843. int dtlsExtra = 0;
  21844. WOLFSSL_ENTER("SendAlert");
  21845. WOLFSSL_MSG_EX("SendAlert: %d %s", type, AlertTypeToString(type));
  21846. #ifdef WOLFSSL_QUIC
  21847. if (WOLFSSL_IS_QUIC(ssl)) {
  21848. ret = !ssl->quic.method->send_alert(ssl, ssl->quic.enc_level_write, (uint8_t)type);
  21849. if (ret) {
  21850. WOLFSSL_MSG("QUIC send_alert callback error");
  21851. }
  21852. return ret;
  21853. }
  21854. #endif
  21855. #ifdef HAVE_WRITE_DUP
  21856. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  21857. int notifyErr = 0;
  21858. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  21859. if (type == close_notify) {
  21860. notifyErr = ZERO_RETURN;
  21861. } else if (severity == alert_fatal) {
  21862. notifyErr = FATAL_ERROR;
  21863. }
  21864. if (notifyErr != 0) {
  21865. return NotifyWriteSide(ssl, notifyErr);
  21866. }
  21867. return 0;
  21868. }
  21869. #endif
  21870. ssl->pendingAlert.code = type;
  21871. ssl->pendingAlert.level = severity;
  21872. #ifdef OPENSSL_EXTRA
  21873. if (ssl->CBIS != NULL) {
  21874. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  21875. }
  21876. #endif
  21877. #ifdef WOLFSSL_DTLS
  21878. if (ssl->options.dtls)
  21879. dtlsExtra = DTLS_RECORD_EXTRA;
  21880. #endif
  21881. /* check for available size */
  21882. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  21883. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  21884. #ifdef WOLFSSL_DTLS
  21885. /* If CheckAvailableSize returned WANT_WRITE due to a blocking write
  21886. * then discard pending output and just send the alert. */
  21887. if (ssl->options.dtls) {
  21888. if (ret != WANT_WRITE || severity != alert_fatal)
  21889. return ret;
  21890. ShrinkOutputBuffer(ssl);
  21891. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  21892. return ret;
  21893. }
  21894. }
  21895. else {
  21896. return ret;
  21897. }
  21898. #else
  21899. return ret;
  21900. #endif
  21901. }
  21902. /* Check output buffer */
  21903. if (ssl->buffers.outputBuffer.buffer == NULL)
  21904. return BUFFER_E;
  21905. /* get output buffer */
  21906. output = GetOutputBuffer(ssl);
  21907. input[0] = (byte)severity;
  21908. input[1] = (byte)type;
  21909. ssl->alert_history.last_tx.code = type;
  21910. ssl->alert_history.last_tx.level = severity;
  21911. if (severity == alert_fatal) {
  21912. #ifdef WOLFSSL_DTLS
  21913. /* Mark as closed in dtls only once we enter stateful mode. */
  21914. if (!ssl->options.dtls || ssl->options.dtlsStateful)
  21915. #endif
  21916. ssl->options.isClosed = 1; /* Don't send close_notify */
  21917. }
  21918. /* send encrypted alert if encryption is on - can be a rehandshake over
  21919. * an existing encrypted channel.
  21920. * TLS 1.3 encrypts handshake packets after the ServerHello
  21921. */
  21922. if (IsEncryptionOn(ssl, 1)) {
  21923. #ifdef WOLFSSL_DTLS13
  21924. if (ssl->options.dtls
  21925. && IsAtLeastTLSv1_3(ssl->version)
  21926. && !w64Equal(ssl->dtls13EncryptEpoch->epochNumber, ssl->dtls13Epoch)) {
  21927. ret = Dtls13SetEpochKeys(ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
  21928. if (ret != 0)
  21929. return ret;
  21930. }
  21931. #endif /* WOLFSSL_DTLS13 */
  21932. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  21933. 0, 0, 0, CUR_ORDER);
  21934. }
  21935. else {
  21936. #ifdef WOLFSSL_DTLS13
  21937. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  21938. ret = Dtls13RlAddPlaintextHeader(ssl, output, alert, ALERT_SIZE);
  21939. if (ret != 0)
  21940. return ret;
  21941. }
  21942. else
  21943. #endif /* WOLFSSL_DTLS13 */
  21944. {
  21945. AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
  21946. }
  21947. output += RECORD_HEADER_SZ;
  21948. #ifdef WOLFSSL_DTLS
  21949. if (ssl->options.dtls)
  21950. output += DTLS_RECORD_EXTRA;
  21951. #endif
  21952. XMEMCPY(output, input, ALERT_SIZE);
  21953. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  21954. #ifdef WOLFSSL_DTLS
  21955. if (ssl->options.dtls)
  21956. sendSz += DTLS_RECORD_EXTRA;
  21957. #endif
  21958. }
  21959. if (sendSz < 0)
  21960. return BUILD_MSG_ERROR;
  21961. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  21962. if (ssl->hsInfoOn)
  21963. AddPacketName(ssl, "Alert");
  21964. if (ssl->toInfoOn) {
  21965. ret = AddPacketInfo(ssl, "Alert", alert, output, sendSz,
  21966. WRITE_PROTO, 0, ssl->heap);
  21967. if (ret != 0)
  21968. return ret;
  21969. }
  21970. #endif
  21971. ssl->buffers.outputBuffer.length += sendSz;
  21972. ret = SendBuffered(ssl);
  21973. ssl->pendingAlert.code = 0;
  21974. ssl->pendingAlert.level = alert_none;
  21975. WOLFSSL_LEAVE("SendAlert", ret);
  21976. return ret;
  21977. }
  21978. int RetrySendAlert(WOLFSSL* ssl)
  21979. {
  21980. int type;
  21981. int severity;
  21982. WOLFSSL_ENTER("RetrySendAlert");
  21983. if (ssl == NULL) {
  21984. return BAD_FUNC_ARG;
  21985. }
  21986. type = ssl->pendingAlert.code;
  21987. severity = ssl->pendingAlert.level;
  21988. if (severity == alert_none)
  21989. return 0;
  21990. ssl->pendingAlert.code = 0;
  21991. ssl->pendingAlert.level = alert_none;
  21992. return SendAlert_ex(ssl, severity, type);
  21993. }
  21994. /* send alert message */
  21995. int SendAlert(WOLFSSL* ssl, int severity, int type)
  21996. {
  21997. WOLFSSL_ENTER("SendAlert");
  21998. if (ssl == NULL) {
  21999. return BAD_FUNC_ARG;
  22000. }
  22001. if (ssl->pendingAlert.level != alert_none) {
  22002. int ret = RetrySendAlert(ssl);
  22003. if (ret != 0) {
  22004. if (ssl->pendingAlert.level == alert_none ||
  22005. (ssl->pendingAlert.level != alert_fatal &&
  22006. severity == alert_fatal)) {
  22007. /* Store current alert if pendingAlert is empty or if current
  22008. * is fatal and previous was not */
  22009. ssl->pendingAlert.code = type;
  22010. ssl->pendingAlert.level = severity;
  22011. }
  22012. return ret;
  22013. }
  22014. }
  22015. return SendAlert_ex(ssl, severity, type);
  22016. }
  22017. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  22018. {
  22019. #ifdef NO_ERROR_STRINGS
  22020. (void)e;
  22021. return "no support for error strings built in";
  22022. #else
  22023. int error = (int)e;
  22024. /* OpenSSL uses positive error codes */
  22025. if (error > 0) {
  22026. error = -error;
  22027. }
  22028. /* pass to wolfCrypt */
  22029. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  22030. return wc_GetErrorString(error);
  22031. }
  22032. switch (error) {
  22033. #ifdef OPENSSL_EXTRA
  22034. case 0 :
  22035. return "ok";
  22036. #endif
  22037. case UNSUPPORTED_SUITE :
  22038. return "unsupported cipher suite";
  22039. case INPUT_CASE_ERROR :
  22040. return "input state error";
  22041. case PREFIX_ERROR :
  22042. return "bad index to key rounds";
  22043. case MEMORY_ERROR :
  22044. return "out of memory";
  22045. case VERIFY_FINISHED_ERROR :
  22046. return "verify problem on finished";
  22047. case VERIFY_MAC_ERROR :
  22048. return "verify mac problem";
  22049. case PARSE_ERROR :
  22050. return "parse error on header";
  22051. case SIDE_ERROR :
  22052. return "wrong client/server type";
  22053. case NO_PEER_CERT : /* OpenSSL compatibility expects this exact text */
  22054. return "peer did not return a certificate";
  22055. case UNKNOWN_HANDSHAKE_TYPE :
  22056. return "weird handshake type";
  22057. case SOCKET_ERROR_E :
  22058. return "error state on socket";
  22059. case SOCKET_NODATA :
  22060. return "expected data, not there";
  22061. case INCOMPLETE_DATA :
  22062. return "don't have enough data to complete task";
  22063. case UNKNOWN_RECORD_TYPE :
  22064. return "unknown type in record hdr";
  22065. case DECRYPT_ERROR :
  22066. return "error during decryption";
  22067. case FATAL_ERROR :
  22068. return "received alert fatal error";
  22069. case ENCRYPT_ERROR :
  22070. return "error during encryption";
  22071. case FREAD_ERROR :
  22072. return "fread problem";
  22073. case NO_PEER_KEY :
  22074. return "need peer's key";
  22075. case NO_PRIVATE_KEY :
  22076. return "need the private key";
  22077. case NO_DH_PARAMS :
  22078. return "server missing DH params";
  22079. case RSA_PRIVATE_ERROR :
  22080. return "error during rsa priv op";
  22081. case MATCH_SUITE_ERROR :
  22082. return "can't match cipher suite";
  22083. case COMPRESSION_ERROR :
  22084. return "compression mismatch error";
  22085. case BUILD_MSG_ERROR :
  22086. return "build message failure";
  22087. case BAD_HELLO :
  22088. return "client hello malformed";
  22089. case DOMAIN_NAME_MISMATCH :
  22090. return "peer subject name mismatch";
  22091. case IPADDR_MISMATCH :
  22092. return "peer ip address mismatch";
  22093. case WANT_READ :
  22094. case -WOLFSSL_ERROR_WANT_READ :
  22095. return "non-blocking socket wants data to be read";
  22096. case NOT_READY_ERROR :
  22097. return "handshake layer not ready yet, complete first";
  22098. case VERSION_ERROR :
  22099. return "record layer version error";
  22100. case WANT_WRITE :
  22101. case -WOLFSSL_ERROR_WANT_WRITE :
  22102. return "non-blocking socket write buffer full";
  22103. case -WOLFSSL_ERROR_WANT_CONNECT:
  22104. case -WOLFSSL_ERROR_WANT_ACCEPT:
  22105. return "The underlying BIO was not yet connected";
  22106. case -WOLFSSL_ERROR_SYSCALL:
  22107. return "fatal I/O error in TLS layer";
  22108. case -WOLFSSL_ERROR_WANT_X509_LOOKUP:
  22109. return "application client cert callback asked to be called again";
  22110. case -WOLFSSL_ERROR_SSL:
  22111. return "fatal TLS protocol error";
  22112. case BUFFER_ERROR :
  22113. return "malformed buffer input error";
  22114. case VERIFY_CERT_ERROR :
  22115. return "verify problem on certificate";
  22116. case VERIFY_SIGN_ERROR :
  22117. return "verify problem based on signature";
  22118. case CLIENT_ID_ERROR :
  22119. return "psk client identity error";
  22120. case SERVER_HINT_ERROR:
  22121. return "psk server hint error";
  22122. case PSK_KEY_ERROR:
  22123. return "psk key callback error";
  22124. case GETTIME_ERROR:
  22125. return "gettimeofday() error";
  22126. case GETITIMER_ERROR:
  22127. return "getitimer() error";
  22128. case SIGACT_ERROR:
  22129. return "sigaction() error";
  22130. case SETITIMER_ERROR:
  22131. return "setitimer() error";
  22132. case LENGTH_ERROR:
  22133. return "record layer length error";
  22134. case PEER_KEY_ERROR:
  22135. return "can't decode peer key";
  22136. case ZERO_RETURN:
  22137. case -WOLFSSL_ERROR_ZERO_RETURN:
  22138. return "peer sent close notify alert";
  22139. case ECC_CURVETYPE_ERROR:
  22140. return "Bad ECC Curve Type or unsupported";
  22141. case ECC_CURVE_ERROR:
  22142. return "Bad ECC Curve or unsupported";
  22143. case ECC_PEERKEY_ERROR:
  22144. return "Bad ECC Peer Key";
  22145. case ECC_MAKEKEY_ERROR:
  22146. return "ECC Make Key failure";
  22147. case ECC_EXPORT_ERROR:
  22148. return "ECC Export Key failure";
  22149. case ECC_SHARED_ERROR:
  22150. return "ECC DHE shared failure";
  22151. case NOT_CA_ERROR:
  22152. return "Not a CA by basic constraint error";
  22153. case BAD_CERT_MANAGER_ERROR:
  22154. return "Bad Cert Manager error";
  22155. case OCSP_CERT_REVOKED:
  22156. return "OCSP Cert revoked";
  22157. case CRL_CERT_REVOKED:
  22158. #ifdef OPENSSL_EXTRA
  22159. return "certificate revoked";
  22160. #else
  22161. return "CRL Cert revoked";
  22162. #endif
  22163. case CRL_MISSING:
  22164. return "CRL missing, not loaded";
  22165. case MONITOR_SETUP_E:
  22166. return "CRL monitor setup error";
  22167. case THREAD_CREATE_E:
  22168. return "Thread creation problem";
  22169. case OCSP_NEED_URL:
  22170. return "OCSP need URL";
  22171. case OCSP_CERT_UNKNOWN:
  22172. return "OCSP Cert unknown";
  22173. case OCSP_LOOKUP_FAIL:
  22174. return "OCSP Responder lookup fail";
  22175. case MAX_CHAIN_ERROR:
  22176. return "Maximum Chain Depth Exceeded";
  22177. case COOKIE_ERROR:
  22178. return "DTLS Cookie Error";
  22179. case SEQUENCE_ERROR:
  22180. return "DTLS Sequence Error";
  22181. case SUITES_ERROR:
  22182. return "Suites Pointer Error";
  22183. case OUT_OF_ORDER_E:
  22184. return "Out of order message, fatal";
  22185. case BAD_KEA_TYPE_E:
  22186. return "Bad KEA type found";
  22187. case SANITY_CIPHER_E:
  22188. return "Sanity check on ciphertext failed";
  22189. case RECV_OVERFLOW_E:
  22190. return "Receive callback returned more than requested";
  22191. case GEN_COOKIE_E:
  22192. return "Generate Cookie Error";
  22193. case NO_PEER_VERIFY:
  22194. return "Need peer certificate verify Error";
  22195. case FWRITE_ERROR:
  22196. return "fwrite Error";
  22197. case CACHE_MATCH_ERROR:
  22198. return "Cache restore header match Error";
  22199. case UNKNOWN_SNI_HOST_NAME_E:
  22200. return "Unrecognized host name Error";
  22201. case UNKNOWN_MAX_FRAG_LEN_E:
  22202. return "Unrecognized max frag len Error";
  22203. case KEYUSE_SIGNATURE_E:
  22204. return "Key Use digitalSignature not set Error";
  22205. case KEYUSE_ENCIPHER_E:
  22206. return "Key Use keyEncipherment not set Error";
  22207. case EXTKEYUSE_AUTH_E:
  22208. return "Ext Key Use server/client auth not set Error";
  22209. case SEND_OOB_READ_E:
  22210. return "Send Callback Out of Bounds Read Error";
  22211. case SECURE_RENEGOTIATION_E:
  22212. return "Invalid Renegotiation Error";
  22213. case SESSION_TICKET_LEN_E:
  22214. return "Session Ticket Too Long Error";
  22215. case SESSION_TICKET_EXPECT_E:
  22216. return "Session Ticket Error";
  22217. case SESSION_SECRET_CB_E:
  22218. return "Session Secret Callback Error";
  22219. case NO_CHANGE_CIPHER_E:
  22220. return "Finished received from peer before Change Cipher Error";
  22221. case SANITY_MSG_E:
  22222. return "Sanity Check on message order Error";
  22223. case DUPLICATE_MSG_E:
  22224. return "Duplicate HandShake message Error";
  22225. case SNI_UNSUPPORTED:
  22226. return "Protocol version does not support SNI Error";
  22227. case SOCKET_PEER_CLOSED_E:
  22228. return "Peer closed underlying transport Error";
  22229. case BAD_TICKET_KEY_CB_SZ:
  22230. return "Bad user session ticket key callback Size Error";
  22231. case BAD_TICKET_MSG_SZ:
  22232. return "Bad session ticket message Size Error";
  22233. case BAD_TICKET_ENCRYPT:
  22234. return "Bad user ticket callback encrypt Error";
  22235. case DH_KEY_SIZE_E:
  22236. return "DH key too small Error";
  22237. case SNI_ABSENT_ERROR:
  22238. return "No Server Name Indication extension Error";
  22239. case RSA_SIGN_FAULT:
  22240. return "RSA Signature Fault Error";
  22241. case HANDSHAKE_SIZE_ERROR:
  22242. return "Handshake message too large Error";
  22243. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  22244. return "Unrecognized protocol name Error";
  22245. case BAD_CERTIFICATE_STATUS_ERROR:
  22246. return "Bad Certificate Status Message Error";
  22247. case OCSP_INVALID_STATUS:
  22248. return "Invalid OCSP Status Error";
  22249. case OCSP_WANT_READ:
  22250. return "OCSP nonblock wants read";
  22251. case RSA_KEY_SIZE_E:
  22252. return "RSA key too small";
  22253. case ECC_KEY_SIZE_E:
  22254. return "ECC key too small";
  22255. case DTLS_EXPORT_VER_E:
  22256. return "Version needs updated after code change or version mismatch";
  22257. case INPUT_SIZE_E:
  22258. return "Input size too large Error";
  22259. case CTX_INIT_MUTEX_E:
  22260. return "Initialize ctx mutex error";
  22261. case EXT_MASTER_SECRET_NEEDED_E:
  22262. return "Extended Master Secret must be enabled to resume EMS session";
  22263. case DTLS_POOL_SZ_E:
  22264. return "Maximum DTLS pool size exceeded";
  22265. case DECODE_E:
  22266. return "Decode handshake message error";
  22267. case WRITE_DUP_READ_E:
  22268. return "Write dup write side can't read error";
  22269. case WRITE_DUP_WRITE_E:
  22270. return "Write dup read side can't write error";
  22271. case INVALID_CERT_CTX_E:
  22272. return "Certificate context does not match request or not empty";
  22273. case BAD_KEY_SHARE_DATA:
  22274. return "The Key Share data contains group that wasn't in Client Hello";
  22275. case MISSING_HANDSHAKE_DATA:
  22276. return "The handshake message is missing required data";
  22277. case BAD_BINDER: /* OpenSSL compatibility expects this exact text */
  22278. return "binder does not verify";
  22279. case EXT_NOT_ALLOWED:
  22280. return "Extension type not allowed in handshake message type";
  22281. case INVALID_PARAMETER:
  22282. return "The security parameter is invalid";
  22283. case UNSUPPORTED_EXTENSION:
  22284. return "TLS Extension not requested by the client";
  22285. case PRF_MISSING:
  22286. return "Pseudo-random function is not enabled";
  22287. case KEY_SHARE_ERROR:
  22288. return "Key share extension did not contain a valid named group";
  22289. case POST_HAND_AUTH_ERROR:
  22290. return "Client will not do post handshake authentication";
  22291. case HRR_COOKIE_ERROR:
  22292. return "Cookie does not match one sent in HelloRetryRequest";
  22293. case MCAST_HIGHWATER_CB_E:
  22294. return "Multicast highwater callback returned error";
  22295. case ALERT_COUNT_E:
  22296. return "Alert Count exceeded error";
  22297. case EXT_MISSING:
  22298. return "Required TLS extension missing";
  22299. case DTLS_RETX_OVER_TX:
  22300. return "DTLS interrupting flight transmit with retransmit";
  22301. case DH_PARAMS_NOT_FFDHE_E:
  22302. return "Server DH parameters were not from the FFDHE set as required";
  22303. case TCA_INVALID_ID_TYPE:
  22304. return "TLS Extension Trusted CA ID type invalid";
  22305. case TCA_ABSENT_ERROR:
  22306. return "TLS Extension Trusted CA ID response absent";
  22307. case TSIP_MAC_DIGSZ_E:
  22308. return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
  22309. case CLIENT_CERT_CB_ERROR:
  22310. return "Error importing client cert or key from callback";
  22311. case SSL_SHUTDOWN_ALREADY_DONE_E:
  22312. return "Shutdown has already occurred";
  22313. case TLS13_SECRET_CB_E:
  22314. return "TLS1.3 Secret Callback Error";
  22315. case DTLS_SIZE_ERROR:
  22316. return "DTLS trying to send too much in single datagram error";
  22317. case NO_CERT_ERROR:
  22318. return "TLS1.3 No Certificate Set Error";
  22319. case APP_DATA_READY:
  22320. return "Application data is available for reading";
  22321. case TOO_MUCH_EARLY_DATA:
  22322. return "Too much early data";
  22323. case SOCKET_FILTERED_E:
  22324. return "Session stopped by network filter";
  22325. case UNSUPPORTED_CERTIFICATE:
  22326. return "Unsupported certificate type";
  22327. #ifdef HAVE_HTTP_CLIENT
  22328. case HTTP_TIMEOUT:
  22329. return "HTTP timeout for OCSP or CRL req";
  22330. case HTTP_RECV_ERR:
  22331. return "HTTP Receive error";
  22332. case HTTP_HEADER_ERR:
  22333. return "HTTP Header error";
  22334. case HTTP_PROTO_ERR:
  22335. return "HTTP Protocol error";
  22336. case HTTP_STATUS_ERR:
  22337. return "HTTP Status error";
  22338. case HTTP_VERSION_ERR:
  22339. return "HTTP Version error";
  22340. case HTTP_APPSTR_ERR:
  22341. return "HTTP Application string error";
  22342. #endif
  22343. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  22344. /* TODO: -WOLFSSL_X509_V_ERR_CERT_SIGNATURE_FAILURE. Conflicts with
  22345. * -WOLFSSL_ERROR_WANT_CONNECT. */
  22346. case -WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID:
  22347. return "certificate not yet valid";
  22348. case -WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED:
  22349. return "certificate has expired";
  22350. case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
  22351. return "certificate signature failure";
  22352. case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
  22353. return "format error in certificate's notAfter field";
  22354. case -WOLFSSL_X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
  22355. return "self-signed certificate in certificate chain";
  22356. case -WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
  22357. return "unable to get local issuer certificate";
  22358. case -WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
  22359. return "unable to verify the first certificate";
  22360. case -WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG:
  22361. return "certificate chain too long";
  22362. case -WOLFSSL_X509_V_ERR_CERT_REVOKED:
  22363. return "certificate revoked";
  22364. case -WOLFSSL_X509_V_ERR_INVALID_CA:
  22365. return "invalid CA certificate";
  22366. case -WOLFSSL_X509_V_ERR_PATH_LENGTH_EXCEEDED:
  22367. return "path length constraint exceeded";
  22368. case -WOLFSSL_X509_V_ERR_CERT_REJECTED:
  22369. return "certificate rejected";
  22370. case -WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH:
  22371. return "subject issuer mismatch";
  22372. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || HAVE_WEBSERVER */
  22373. case UNSUPPORTED_PROTO_VERSION:
  22374. #ifdef OPENSSL_EXTRA
  22375. return "WRONG_SSL_VERSION";
  22376. #else
  22377. return "bad/unsupported protocol version";
  22378. #endif
  22379. case FALCON_KEY_SIZE_E:
  22380. return "Wrong key size for Falcon.";
  22381. case DILITHIUM_KEY_SIZE_E:
  22382. return "Wrong key size for Dilithium.";
  22383. #ifdef WOLFSSL_QUIC
  22384. case QUIC_TP_MISSING_E:
  22385. return "QUIC transport parameter not set";
  22386. case QUIC_WRONG_ENC_LEVEL:
  22387. return "QUIC data received at wrong encryption level";
  22388. #endif
  22389. case DTLS_CID_ERROR:
  22390. return "DTLS ConnectionID mismatch or missing";
  22391. case DTLS_TOO_MANY_FRAGMENTS_E:
  22392. return "Received too many fragmented messages from peer error";
  22393. case DUPLICATE_TLS_EXT_E:
  22394. return "Duplicate TLS extension in message.";
  22395. default :
  22396. return "unknown error number";
  22397. }
  22398. #endif /* NO_ERROR_STRINGS */
  22399. }
  22400. const char* wolfSSL_ERR_func_error_string(unsigned long e)
  22401. {
  22402. (void)e;
  22403. WOLFSSL_MSG("wolfSSL_ERR_func_error_string does not return the name of "
  22404. "the function that failed. Please inspect the wolfSSL debug "
  22405. "logs to determine where the error occurred.");
  22406. return "";
  22407. }
  22408. /* return library name
  22409. * @param e error code
  22410. * @return text library name,
  22411. * if there is no suitable library found, returns empty string
  22412. */
  22413. const char* wolfSSL_ERR_lib_error_string(unsigned long e)
  22414. {
  22415. int libe = 0;
  22416. (void)libe;
  22417. (void)e;
  22418. #if defined(OPENSSL_EXTRA)
  22419. libe = wolfSSL_ERR_GET_LIB(e);
  22420. switch (libe) {
  22421. case ERR_LIB_PEM:
  22422. return "wolfSSL PEM routines";
  22423. case ERR_LIB_EVP:
  22424. return "wolfSSL digital envelope routines";
  22425. default:
  22426. return "";
  22427. }
  22428. #else
  22429. return "";
  22430. #endif
  22431. }
  22432. void SetErrorString(int error, char* str)
  22433. {
  22434. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  22435. str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
  22436. }
  22437. #ifdef NO_CIPHER_SUITE_ALIASES
  22438. #ifndef NO_ERROR_STRINGS
  22439. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  22440. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  22441. #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
  22442. #else
  22443. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  22444. #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
  22445. #endif
  22446. #else
  22447. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  22448. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  22449. #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
  22450. #else
  22451. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  22452. #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */
  22453. #endif
  22454. #endif
  22455. #else /* !NO_CIPHER_SUITE_ALIASES */
  22456. /* note that the comma is included at the end of the SUITE_ALIAS() macro
  22457. * definitions, to allow aliases to be gated out by the above null macros
  22458. * in the NO_CIPHER_SUITE_ALIASES section.
  22459. */
  22460. #ifndef NO_ERROR_STRINGS
  22461. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  22462. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  22463. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  22464. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  22465. #else
  22466. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  22467. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  22468. #endif
  22469. #else
  22470. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  22471. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  22472. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  22473. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  22474. #else
  22475. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  22476. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  22477. #endif
  22478. #endif
  22479. #endif /* NO_CIPHER_SUITE_ALIASES */
  22480. static const CipherSuiteInfo cipher_names[] =
  22481. {
  22482. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  22483. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  22484. #endif
  22485. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  22486. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
  22487. #endif
  22488. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  22489. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  22490. #endif
  22491. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  22492. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  22493. #endif
  22494. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  22495. 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),
  22496. SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
  22497. #endif
  22498. #ifdef BUILD_TLS_SM4_GCM_SM3
  22499. SUITE_INFO("TLS13-SM4-GCM-SM3","TLS_SM4_GCM_SM3",CIPHER_BYTE,TLS_SM4_GCM_SM3, TLSv1_3_MINOR, SSLv3_MAJOR),
  22500. #endif
  22501. #ifdef BUILD_TLS_SM4_CCM_SM3
  22502. SUITE_INFO("TLS13-SM4-CCM-SM3","TLS_SM4_CCM_SM3",CIPHER_BYTE,TLS_SM4_CCM_SM3, TLSv1_3_MINOR, SSLv3_MAJOR),
  22503. #endif
  22504. #ifdef BUILD_TLS_SHA256_SHA256
  22505. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  22506. #endif
  22507. #ifdef BUILD_TLS_SHA384_SHA384
  22508. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
  22509. #endif
  22510. #ifndef WOLFSSL_NO_TLS12
  22511. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  22512. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  22513. #endif
  22514. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  22515. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  22516. #endif
  22517. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  22518. 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),
  22519. #endif
  22520. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  22521. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  22522. #endif
  22523. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  22524. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  22525. #endif
  22526. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  22527. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  22528. #endif
  22529. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  22530. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  22531. #endif
  22532. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  22533. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  22534. #endif
  22535. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  22536. 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),
  22537. #endif
  22538. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  22539. 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),
  22540. #endif
  22541. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  22542. 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),
  22543. #endif
  22544. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  22545. 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),
  22546. #endif
  22547. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  22548. 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),
  22549. #endif
  22550. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  22551. 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),
  22552. #endif
  22553. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  22554. 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),
  22555. #endif
  22556. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  22557. 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),
  22558. #endif
  22559. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  22560. 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),
  22561. #endif
  22562. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  22563. 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),
  22564. #endif
  22565. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  22566. 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),
  22567. #endif
  22568. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  22569. 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),
  22570. #endif
  22571. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  22572. 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),
  22573. #endif
  22574. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  22575. 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),
  22576. #endif
  22577. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  22578. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  22579. #endif
  22580. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  22581. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  22582. #endif
  22583. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  22584. 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),
  22585. SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  22586. #endif
  22587. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  22588. 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),
  22589. SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  22590. #endif
  22591. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  22592. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  22593. #endif
  22594. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  22595. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  22596. #endif
  22597. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  22598. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  22599. #endif
  22600. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  22601. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  22602. #endif
  22603. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  22604. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  22605. #endif
  22606. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  22607. 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),
  22608. SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  22609. #endif
  22610. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  22611. 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),
  22612. SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  22613. #endif
  22614. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  22615. 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),
  22616. #endif
  22617. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  22618. 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),
  22619. SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  22620. #endif
  22621. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  22622. 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),
  22623. SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  22624. #endif
  22625. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  22626. 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),
  22627. #endif
  22628. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  22629. 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),
  22630. #endif
  22631. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  22632. 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),
  22633. #endif
  22634. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  22635. 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),
  22636. #endif
  22637. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  22638. 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),
  22639. #endif
  22640. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  22641. 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),
  22642. #endif
  22643. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  22644. 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),
  22645. #endif
  22646. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  22647. 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),
  22648. #endif
  22649. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  22650. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
  22651. #endif
  22652. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  22653. 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),
  22654. #endif
  22655. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  22656. 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),
  22657. #endif
  22658. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  22659. 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),
  22660. #endif
  22661. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  22662. 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),
  22663. #endif
  22664. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  22665. 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),
  22666. #endif
  22667. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  22668. 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),
  22669. #endif
  22670. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  22671. 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),
  22672. #endif
  22673. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  22674. 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),
  22675. #endif
  22676. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  22677. 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),
  22678. #endif
  22679. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  22680. 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),
  22681. #endif
  22682. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  22683. 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),
  22684. #endif
  22685. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  22686. 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),
  22687. #endif
  22688. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  22689. 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),
  22690. #endif
  22691. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  22692. 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),
  22693. #endif
  22694. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  22695. 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),
  22696. #endif
  22697. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  22698. 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),
  22699. #endif
  22700. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  22701. 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),
  22702. #endif
  22703. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  22704. 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),
  22705. #endif
  22706. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  22707. 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),
  22708. #endif
  22709. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  22710. 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),
  22711. #endif
  22712. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  22713. 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),
  22714. #endif
  22715. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  22716. 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),
  22717. #endif
  22718. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  22719. 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),
  22720. #endif
  22721. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  22722. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  22723. #endif
  22724. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  22725. 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),
  22726. #endif
  22727. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  22728. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  22729. #endif
  22730. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  22731. 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),
  22732. #endif
  22733. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  22734. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  22735. #endif
  22736. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  22737. 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),
  22738. #endif
  22739. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  22740. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  22741. #endif
  22742. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  22743. 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),
  22744. #endif
  22745. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  22746. 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),
  22747. #endif
  22748. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  22749. 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),
  22750. #endif
  22751. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  22752. 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),
  22753. #endif
  22754. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  22755. 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),
  22756. #endif
  22757. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  22758. 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),
  22759. #endif
  22760. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  22761. 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),
  22762. #endif
  22763. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  22764. 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),
  22765. #endif
  22766. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  22767. 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),
  22768. #endif
  22769. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  22770. 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),
  22771. #endif
  22772. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  22773. 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),
  22774. #endif
  22775. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  22776. 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),
  22777. #endif
  22778. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  22779. 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),
  22780. #endif
  22781. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  22782. 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),
  22783. #endif
  22784. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  22785. 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),
  22786. #endif
  22787. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  22788. 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),
  22789. #endif
  22790. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  22791. 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),
  22792. #endif
  22793. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  22794. 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),
  22795. #endif
  22796. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  22797. 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),
  22798. #endif
  22799. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  22800. 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),
  22801. #endif
  22802. #ifdef HAVE_RENEGOTIATION_INDICATION
  22803. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
  22804. #endif
  22805. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  22806. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  22807. #endif
  22808. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  22809. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  22810. #endif
  22811. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  22812. 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),
  22813. #endif
  22814. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
  22815. 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),
  22816. #endif
  22817. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  22818. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  22819. #endif
  22820. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  22821. 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),
  22822. #endif
  22823. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  22824. 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),
  22825. #endif
  22826. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  22827. 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),
  22828. #endif
  22829. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
  22830. 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),
  22831. #endif
  22832. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384
  22833. 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),
  22834. #endif
  22835. #ifdef BUILD_WDM_WITH_NULL_SHA256
  22836. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
  22837. #endif
  22838. #endif /* WOLFSSL_NO_TLS12 */
  22839. };
  22840. /* returns the cipher_names array */
  22841. const CipherSuiteInfo* GetCipherNames(void)
  22842. {
  22843. return cipher_names;
  22844. }
  22845. /* returns the number of elements in the cipher_names array */
  22846. int GetCipherNamesSize(void)
  22847. {
  22848. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  22849. }
  22850. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  22851. {
  22852. int i;
  22853. const char* nameInternal = "None";
  22854. for (i = 0; i < GetCipherNamesSize(); i++) {
  22855. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  22856. (cipher_names[i].cipherSuite == cipherSuite)
  22857. #ifndef NO_CIPHER_SUITE_ALIASES
  22858. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  22859. #endif
  22860. ) {
  22861. nameInternal = cipher_names[i].name;
  22862. break;
  22863. }
  22864. }
  22865. return nameInternal;
  22866. }
  22867. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  22868. /* Segment cipher name into n[n0,n1,n2,n4]
  22869. * @param cipher a pointer to WOLFSSL_CIPHER
  22870. * @param n return segment cipher name
  22871. * return cipher name if cipher is in the list,
  22872. * otherwise NULL
  22873. */
  22874. const char* GetCipherSegment(const WOLFSSL_CIPHER* cipher, char n[][MAX_SEGMENT_SZ])
  22875. {
  22876. int i,j,k;
  22877. int strLen;
  22878. unsigned long offset;
  22879. const char* name;
  22880. /* sanity check */
  22881. if (cipher == NULL || n == NULL)
  22882. return NULL;
  22883. offset = cipher->offset;
  22884. if (offset >= (unsigned long)GetCipherNamesSize())
  22885. return NULL;
  22886. name = cipher_names[offset].name;
  22887. if (name == NULL)
  22888. return NULL;
  22889. /* Segment cipher name into n[n0,n1,n2,n4]
  22890. * These are used later for comparisons to create:
  22891. * keaStr, authStr, encStr, macStr
  22892. *
  22893. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  22894. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  22895. * and n = [n0,n1,n2,n3,0]
  22896. */
  22897. strLen = (int)XSTRLEN(name);
  22898. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  22899. if (k >= MAX_SEGMENTS || j >= MAX_SEGMENT_SZ)
  22900. break;
  22901. if (name[i] != '-' && name[i] != '\0') {
  22902. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  22903. j++;
  22904. }
  22905. else {
  22906. n[k][j] = '\0';
  22907. j = 0;
  22908. k++;
  22909. }
  22910. }
  22911. return name;
  22912. }
  22913. /* gcc-12 and later, building with ASAN at -O2 and higher, generate spurious
  22914. * stringop-overread warnings on some (but not all...) reads of n[1] in
  22915. * GetCipherKeaStr().
  22916. */
  22917. #if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
  22918. PRAGMA_GCC_DIAG_PUSH
  22919. PRAGMA_GCC("GCC diagnostic ignored \"-Wstringop-overread\"")
  22920. #endif
  22921. const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
  22922. const char* keaStr = NULL;
  22923. if (XSTRCMP(n[0],"ECDHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  22924. keaStr = "ECDHEPSK";
  22925. else if ((XSTRCMP(n[0],"ECDH") == 0) || (XSTRCMP(n[0],"ECDHE") == 0))
  22926. keaStr = "ECDH";
  22927. else if (XSTRCMP(n[0],"DHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  22928. keaStr = "DHEPSK";
  22929. else if (XSTRCMP(n[0],"DHE") == 0)
  22930. keaStr = "DH";
  22931. else if (XSTRCMP(n[0],"RSA") == 0 && XSTRCMP(n[1],"PSK") == 0)
  22932. keaStr = "RSAPSK";
  22933. else if (XSTRCMP(n[0],"SRP") == 0)
  22934. keaStr = "SRP";
  22935. else if (XSTRCMP(n[0],"PSK") == 0)
  22936. keaStr = "PSK";
  22937. else if (XSTRCMP(n[0],"EDH") == 0)
  22938. keaStr = "EDH";
  22939. else if ((XSTRNCMP(n[1],"SHA", 3) == 0) || (XSTRNCMP(n[2],"SHA", 3) == 0) ||
  22940. (XSTRNCMP(n[3],"SHA", 3) == 0) || (XSTRNCMP(n[4],"SHA", 3) == 0) ||
  22941. (XSTRCMP(n[2],"RSA") == 0) || (XSTRCMP(n[0],"AES128") == 0) ||
  22942. (XSTRCMP(n[0],"AES256") == 0) || (XSTRCMP(n[1],"MD5") == 0))
  22943. keaStr = "RSA";
  22944. else if (XSTRCMP(n[0],"NULL") == 0)
  22945. keaStr = "None";
  22946. else
  22947. keaStr = "unknown";
  22948. return keaStr;
  22949. }
  22950. #if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
  22951. PRAGMA_GCC_DIAG_POP
  22952. #endif
  22953. const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
  22954. const char* authStr = NULL;
  22955. if ((XSTRCMP(n[0],"AES128") == 0) || (XSTRCMP(n[0],"AES256") == 0) ||
  22956. ((XSTRCMP(n[0],"TLS13") == 0) && ((XSTRCMP(n[1],"AES128") == 0) ||
  22957. (XSTRCMP(n[1],"AES256") == 0) || (XSTRCMP(n[1],"CHACHA20") == 0))) ||
  22958. (XSTRCMP(n[0],"RSA") == 0) || (XSTRCMP(n[1],"RSA") == 0) ||
  22959. (XSTRNCMP(n[1],"SHA", 3) == 0) || (XSTRNCMP(n[2],"SHA", 3) == 0) ||
  22960. (XSTRCMP(n[1],"MD5") == 0))
  22961. authStr = "RSA";
  22962. else if (XSTRCMP(n[0],"PSK") == 0 || XSTRCMP(n[1],"PSK") == 0)
  22963. authStr = "PSK";
  22964. else if (XSTRCMP(n[0],"SRP") == 0 && XSTRCMP(n[1],"AES") == 0)
  22965. authStr = "SRP";
  22966. else if (XSTRCMP(n[1],"ECDSA") == 0)
  22967. authStr = "ECDSA";
  22968. else if (XSTRCMP(n[0],"ADH") == 0 || XSTRCMP(n[0],"NULL") == 0)
  22969. authStr = "None";
  22970. else
  22971. authStr = "unknown";
  22972. return authStr;
  22973. }
  22974. const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
  22975. const char* encStr = NULL;
  22976. if ((XSTRCMP(n[0],"AES256") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  22977. (XSTRCMP(n[1],"AES256") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  22978. (XSTRCMP(n[2],"AES256") == 0 && XSTRCMP(n[3],"GCM") == 0))
  22979. encStr = "AESGCM(256)";
  22980. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  22981. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  22982. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"GCM") == 0))
  22983. encStr = "AESGCM(128)";
  22984. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"CCM") == 0) ||
  22985. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"CCM") == 0) ||
  22986. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"CCM") == 0))
  22987. encStr = "AESCCM(128)";
  22988. else if ((XSTRCMP(n[0],"AES128") == 0) ||
  22989. (XSTRCMP(n[1],"AES128") == 0) ||
  22990. (XSTRCMP(n[2],"AES128") == 0) ||
  22991. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"128") == 0) ||
  22992. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"128") == 0))
  22993. encStr = "AES(128)";
  22994. else if ((XSTRCMP(n[0],"AES256") == 0) ||
  22995. (XSTRCMP(n[1],"AES256") == 0) ||
  22996. (XSTRCMP(n[2],"AES256") == 0) ||
  22997. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"256") == 0) ||
  22998. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"256") == 0))
  22999. encStr = "AES(256)";
  23000. #ifdef HAVE_ARIA
  23001. else if ((XSTRCMP(n[0],"ARIA256") == 0) ||
  23002. (XSTRCMP(n[2],"ARIA256") == 0))
  23003. encStr = "ARIA(256)";
  23004. else if ((XSTRCMP(n[0],"ARIA128") == 0) ||
  23005. (XSTRCMP(n[2],"ARIA128") == 0))
  23006. encStr = "ARIA(128)";
  23007. #endif
  23008. else if ((XSTRCMP(n[0],"CAMELLIA256") == 0) ||
  23009. (XSTRCMP(n[2],"CAMELLIA256") == 0))
  23010. encStr = "CAMELLIA(256)";
  23011. else if ((XSTRCMP(n[0],"CAMELLIA128") == 0) ||
  23012. (XSTRCMP(n[2],"CAMELLIA128") == 0))
  23013. encStr = "CAMELLIA(128)";
  23014. #ifdef WOLFSSL_SM4_GCM
  23015. else if ((XSTRCMP(n[0],"SM4") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  23016. (XSTRCMP(n[1],"SM4") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  23017. (XSTRCMP(n[2],"SM4") == 0 && XSTRCMP(n[3],"GCM") == 0))
  23018. encStr = "SM4-GCM";
  23019. #endif
  23020. #ifdef WOLFSSL_SM4_CCM
  23021. else if ((XSTRCMP(n[0],"SM4") == 0 && XSTRCMP(n[1],"CCM") == 0) ||
  23022. (XSTRCMP(n[1],"SM4") == 0 && XSTRCMP(n[2],"CCM") == 0) ||
  23023. (XSTRCMP(n[2],"SM4") == 0 && XSTRCMP(n[3],"CCM") == 0))
  23024. encStr = "SM4-CCM";
  23025. #endif
  23026. #ifdef WOLFSSL_SM4_CBC
  23027. else if ((XSTRCMP(n[0],"SM4") == 0) ||
  23028. (XSTRCMP(n[2],"SM4") == 0))
  23029. encStr = "SM4";
  23030. #endif
  23031. else if ((XSTRCMP(n[0],"RC4") == 0) || (XSTRCMP(n[1],"RC4") == 0) ||
  23032. (XSTRCMP(n[2],"RC4") == 0))
  23033. encStr = "RC4";
  23034. else if (((XSTRCMP(n[0],"DES") == 0) || (XSTRCMP(n[1],"DES") == 0) ||
  23035. (XSTRCMP(n[2],"DES") == 0)) &&
  23036. ((XSTRCMP(n[1],"CBC3") == 0) || (XSTRCMP(n[2],"CBC3") == 0) ||
  23037. (XSTRCMP(n[3],"CBC3") == 0)))
  23038. encStr = "3DES";
  23039. else if ((XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  23040. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  23041. encStr = "CHACHA20/POLY1305(256)";
  23042. else if ((XSTRCMP(n[0],"NULL") == 0) || (XSTRCMP(n[1],"NULL") == 0) ||
  23043. (XSTRCMP(n[2],"NULL") == 0) ||
  23044. ((XSTRCMP(n[0],"TLS13") == 0) && (XSTRCMP(n[3],"") == 0)))
  23045. encStr = "None";
  23046. else
  23047. encStr = "unknown";
  23048. return encStr;
  23049. }
  23050. /* Check if a cipher is AEAD
  23051. * @param n return segment cipher name
  23052. * return 1 if the cipher is AEAD, otherwise 0
  23053. */
  23054. int IsCipherAEAD(char n[][MAX_SEGMENT_SZ])
  23055. {
  23056. WOLFSSL_ENTER("IsCipherAEAD");
  23057. if (n == NULL) {
  23058. WOLFSSL_MSG("bad function argument. n is NULL.");
  23059. return 0;
  23060. }
  23061. if ((XSTRCMP(n[2],"GCM") == 0) || (XSTRCMP(n[3],"GCM") == 0) ||
  23062. (XSTRCMP(n[1],"CCM") == 0) ||
  23063. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  23064. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  23065. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  23066. return 1;
  23067. return 0;
  23068. }
  23069. /* Returns the MAC string of a cipher or "unknown" on failure */
  23070. const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
  23071. const char* macStr = NULL;
  23072. if ((XSTRCMP(n[4],"SHA256") == 0) || (XSTRCMP(n[3],"SHA256") == 0) ||
  23073. (XSTRCMP(n[2],"SHA256") == 0) || (XSTRCMP(n[1],"SHA256") == 0))
  23074. macStr = "SHA256";
  23075. else if ((XSTRCMP(n[4],"SHA384") == 0) ||
  23076. (XSTRCMP(n[3],"SHA384") == 0) ||
  23077. (XSTRCMP(n[2],"SHA384") == 0) ||
  23078. (XSTRCMP(n[1],"SHA384") == 0))
  23079. macStr = "SHA384";
  23080. #ifdef WOLFSSL_SM3
  23081. else if ((XSTRCMP(n[4],"SM3") == 0) ||
  23082. (XSTRCMP(n[3],"SM3") == 0) ||
  23083. (XSTRCMP(n[2],"SM3") == 0) ||
  23084. (XSTRCMP(n[1],"SM3") == 0))
  23085. macStr = "SM3";
  23086. #endif
  23087. else if ((XSTRCMP(n[4],"SHA") == 0) || (XSTRCMP(n[3],"SHA") == 0) ||
  23088. (XSTRCMP(n[2],"SHA") == 0) || (XSTRCMP(n[1],"SHA") == 0) ||
  23089. (XSTRCMP(n[1],"MD5") == 0))
  23090. macStr = "SHA1";
  23091. else if ((XSTRCMP(n[3],"GCM") == 0) ||
  23092. (XSTRCMP(n[1],"CCM") == 0) ||
  23093. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  23094. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  23095. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  23096. macStr = "AEAD";
  23097. else
  23098. macStr = "unknown";
  23099. return macStr;
  23100. }
  23101. /* Returns the number of bits based on the cipher enc string, or 0 on failure */
  23102. int SetCipherBits(const char* enc) {
  23103. int ret = WOLFSSL_FAILURE;
  23104. if ((XSTRCMP(enc,"AESGCM(256)") == 0) ||
  23105. (XSTRCMP(enc,"AES(256)") == 0) ||
  23106. (XSTRCMP(enc,"CAMELLIA(256)") == 0) ||
  23107. (XSTRCMP(enc,"CHACHA20/POLY1305(256)") == 0))
  23108. ret = 256;
  23109. else if
  23110. ((XSTRCMP(enc,"3DES") == 0))
  23111. ret = 168;
  23112. else if
  23113. ((XSTRCMP(enc,"AESGCM(128)") == 0) ||
  23114. (XSTRCMP(enc,"AES(128)") == 0) ||
  23115. (XSTRCMP(enc,"CAMELLIA(128)") == 0) ||
  23116. (XSTRCMP(enc,"RC4") == 0))
  23117. ret = 128;
  23118. else if
  23119. ((XSTRCMP(enc,"DES") == 0))
  23120. ret = 56;
  23121. return ret;
  23122. }
  23123. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  23124. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  23125. {
  23126. #ifndef NO_ERROR_STRINGS
  23127. int i;
  23128. const char* nameIana = "NONE";
  23129. for (i = 0; i < GetCipherNamesSize(); i++) {
  23130. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  23131. (cipher_names[i].cipherSuite == cipherSuite)
  23132. #ifndef NO_CIPHER_SUITE_ALIASES
  23133. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  23134. #endif
  23135. ) {
  23136. nameIana = cipher_names[i].name_iana;
  23137. break;
  23138. }
  23139. }
  23140. return nameIana;
  23141. #else
  23142. (void)cipherSuite0;
  23143. (void)cipherSuite;
  23144. return NULL;
  23145. #endif
  23146. }
  23147. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  23148. {
  23149. if (ssl == NULL) {
  23150. return NULL;
  23151. }
  23152. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  23153. }
  23154. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  23155. {
  23156. if (ssl == NULL) {
  23157. return NULL;
  23158. }
  23159. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  23160. }
  23161. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  23162. byte* cipherSuite, int* flags)
  23163. {
  23164. int ret = BAD_FUNC_ARG;
  23165. int i;
  23166. unsigned long len;
  23167. const char* nameDelim;
  23168. /* Support trailing : */
  23169. nameDelim = XSTRSTR(name, ":");
  23170. if (nameDelim)
  23171. len = (unsigned long)(nameDelim - name);
  23172. else
  23173. len = (unsigned long)XSTRLEN(name);
  23174. for (i = 0; i < GetCipherNamesSize(); i++) {
  23175. int found = (XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
  23176. (cipher_names[i].name[len] == 0);
  23177. #ifndef NO_ERROR_STRINGS
  23178. if (!found)
  23179. found = (XSTRNCMP(name, cipher_names[i].name_iana, len) == 0) &&
  23180. (cipher_names[i].name_iana[len] == 0);
  23181. #endif
  23182. if (found) {
  23183. *cipherSuite0 = cipher_names[i].cipherSuite0;
  23184. *cipherSuite = cipher_names[i].cipherSuite;
  23185. *flags = cipher_names[i].flags;
  23186. ret = 0;
  23187. break;
  23188. }
  23189. }
  23190. return ret;
  23191. }
  23192. /**
  23193. Set the enabled cipher suites.
  23194. With OPENSSL_EXTRA we attempt to understand some of the available "bulk"
  23195. ciphersuites. We can not perfectly filter ciphersuites based on the "bulk"
  23196. names but we do what we can. Ciphersuites named explicitly take precedence to
  23197. ciphersuites introduced through the "bulk" ciphersuites.
  23198. @param [out] suites Suites structure.
  23199. @param [in] list List of cipher suites, only supports full name from
  23200. cipher_names[] delimited by ':'.
  23201. @return true on success, else false.
  23202. */
  23203. static int ParseCipherList(Suites* suites,
  23204. const char* list, ProtocolVersion version, int privateKeySz, byte side)
  23205. {
  23206. int ret = 0;
  23207. int idx = 0;
  23208. int haveSig = 0;
  23209. word16 haveRSA = 0;
  23210. #ifdef OPENSSL_EXTRA
  23211. word16 haveDH = 0;
  23212. word16 haveECC = 0;
  23213. word16 haveStaticRSA = 1; /* allowed by default if compiled in */
  23214. word16 haveStaticECC = 0;
  23215. word16 haveNull = 1; /* allowed by default if compiled in */
  23216. int callInitSuites = 0;
  23217. word16 havePSK = 0;
  23218. #endif
  23219. const int suiteSz = GetCipherNamesSize();
  23220. const char* next = list;
  23221. if (suites == NULL || list == NULL) {
  23222. WOLFSSL_MSG("SetCipherList parameter error");
  23223. return 0;
  23224. }
  23225. if (next[0] == 0 || XSTRCMP(next, "ALL") == 0 ||
  23226. XSTRCMP(next, "DEFAULT") == 0 || XSTRCMP(next, "HIGH") == 0) {
  23227. /* Add all ciphersuites except anonymous and null ciphers. Prefer RSA */
  23228. #ifndef NO_RSA
  23229. haveRSA = 1;
  23230. #endif
  23231. InitSuites(suites, version,
  23232. #ifndef NO_CERTS
  23233. privateKeySz,
  23234. #else
  23235. 0,
  23236. #endif
  23237. haveRSA, 1, 1, !haveRSA, 1, haveRSA, !haveRSA, 1, 1, 0, 0,
  23238. side);
  23239. return 1; /* wolfSSL default */
  23240. }
  23241. do {
  23242. const char* current = next;
  23243. char name[MAX_SUITE_NAME + 1];
  23244. int i;
  23245. word32 length;
  23246. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  23247. word16 allowing = 1;
  23248. #endif
  23249. next = XSTRSTR(next, ":");
  23250. length = MAX_SUITE_NAME;
  23251. if (next != NULL) {
  23252. word32 currLen = (word32)(next - current);
  23253. if (length > currLen) {
  23254. length = currLen;
  23255. }
  23256. }
  23257. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  23258. if (length > 1) {
  23259. if (*current == '!') {
  23260. allowing = 0;
  23261. current++;
  23262. length--;
  23263. }
  23264. }
  23265. #endif
  23266. XSTRNCPY(name, current, length);
  23267. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  23268. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  23269. if (length > 1) {
  23270. char* substr = NULL;
  23271. char* substrCurrent = name;
  23272. /* extract first public key type from a string like ECDHE+AESGCM */
  23273. substr = XSTRSTR(substrCurrent, "+");
  23274. if (substr != NULL) {
  23275. do {
  23276. if (substr) {
  23277. length = (word32)(substr - substrCurrent);
  23278. substrCurrent[length] = '\0';
  23279. }
  23280. else {
  23281. length = (int)XSTRLEN(substrCurrent);
  23282. }
  23283. /* check if is a public key type */
  23284. if (XSTRCMP(substrCurrent, "ECDHE") == 0 ||
  23285. XSTRCMP(substrCurrent, "RSA") == 0 ||
  23286. XSTRCMP(substrCurrent, "DHE") == 0) {
  23287. if (name != substrCurrent)
  23288. XMEMMOVE(name, substrCurrent, length);
  23289. name[length] = '\0';
  23290. break;
  23291. }
  23292. substrCurrent = substr;
  23293. if (substr) {
  23294. substrCurrent = substrCurrent + 1; /* +1 to skip over '+' */
  23295. substr = XSTRSTR(substrCurrent, "+");
  23296. }
  23297. } while (substrCurrent != NULL);
  23298. }
  23299. }
  23300. if (XSTRCMP(name, "DEFAULT") == 0 || XSTRCMP(name, "ALL") == 0) {
  23301. if (XSTRCMP(name, "ALL") == 0)
  23302. haveSig |= SIG_ANON;
  23303. else
  23304. haveSig &= ~SIG_ANON;
  23305. haveRSA = 1;
  23306. haveDH = 1;
  23307. haveECC = 1;
  23308. /* having static ECC will disable all RSA use, do not set
  23309. * static ECC suites here
  23310. * haveStaticECC = 1; */
  23311. haveStaticRSA = 1;
  23312. haveSig |= SIG_RSA;
  23313. havePSK = 1;
  23314. haveNull = 0;
  23315. callInitSuites = 1;
  23316. ret = 1;
  23317. continue;
  23318. }
  23319. /* We don't have a way to disallow high bit sizes. Only disable unsafe
  23320. * ciphersuites. */
  23321. if (XSTRCMP(name, "HIGH") == 0 && allowing) {
  23322. /* Disable static, anonymous, and null ciphers */
  23323. haveSig &= ~SIG_ANON;
  23324. haveRSA = 1;
  23325. haveDH = 1;
  23326. haveECC = 1;
  23327. haveStaticECC = 0;
  23328. haveStaticRSA = 0;
  23329. haveSig |= SIG_RSA;
  23330. havePSK = 1;
  23331. haveNull = 0;
  23332. callInitSuites = 1;
  23333. ret = 1;
  23334. continue;
  23335. }
  23336. if (XSTRCMP(name, "aNULL") == 0) {
  23337. if (allowing)
  23338. haveSig |= SIG_ANON;
  23339. else
  23340. haveSig &= ~SIG_ANON;
  23341. if (allowing) {
  23342. /* Allow RSA by default. */
  23343. if (!haveECC)
  23344. haveRSA = 1;
  23345. if ((haveSig & SIG_ECDSA) == 0)
  23346. haveSig |= SIG_RSA;
  23347. callInitSuites = 1;
  23348. ret = 1;
  23349. }
  23350. continue;
  23351. }
  23352. if (XSTRCMP(name, "eNULL") == 0 || XSTRCMP(name, "NULL") == 0) {
  23353. haveNull = allowing;
  23354. if (allowing) {
  23355. /* Allow RSA by default. */
  23356. if (!haveECC)
  23357. haveRSA = 1;
  23358. if ((haveSig & SIG_ECDSA) == 0)
  23359. haveSig |= SIG_RSA;
  23360. callInitSuites = 1;
  23361. ret = 1;
  23362. }
  23363. continue;
  23364. }
  23365. if (XSTRCMP(name, "kDH") == 0) {
  23366. if (allowing) {
  23367. haveDH = 1;
  23368. callInitSuites = 1;
  23369. ret = 1;
  23370. }
  23371. continue;
  23372. }
  23373. if (XSTRCMP(name, "DHE") == 0 || XSTRCMP(name, "EDH") == 0) {
  23374. if (allowing) {
  23375. haveDH = 1;
  23376. callInitSuites = 1;
  23377. ret = 1;
  23378. }
  23379. continue;
  23380. }
  23381. if (XSTRCMP(name, "ECDHE") == 0 || XSTRCMP(name, "EECDH") == 0) {
  23382. if (allowing) {
  23383. haveECC = 1;
  23384. haveSig |= SIG_ECDSA;
  23385. callInitSuites = 1;
  23386. ret = 1;
  23387. }
  23388. continue;
  23389. }
  23390. if (XSTRCMP(name, "kRSA") == 0 || XSTRCMP(name, "RSA") == 0) {
  23391. haveStaticRSA = allowing;
  23392. if (allowing) {
  23393. haveRSA = 1;
  23394. haveSig |= SIG_RSA;
  23395. callInitSuites = 1;
  23396. ret = 1;
  23397. }
  23398. continue;
  23399. }
  23400. if (XSTRCMP(name, "PSK") == 0) {
  23401. havePSK = allowing;
  23402. haveSig |= SIG_RSA;
  23403. if (allowing) {
  23404. /* Allow RSA by default. */
  23405. if (!haveECC)
  23406. haveRSA = 1;
  23407. if ((haveSig & SIG_ECDSA) == 0)
  23408. haveSig |= SIG_RSA;
  23409. callInitSuites = 1;
  23410. ret = 1;
  23411. }
  23412. continue;
  23413. }
  23414. if (XSTRCMP(name, "LOW") == 0 || XSTRCMP(name, "MEDIUM") == 0) {
  23415. /* No way to limit or allow low bit sizes */
  23416. if (allowing) {
  23417. /* Allow RSA by default */
  23418. haveRSA = 1;
  23419. haveSig |= SIG_RSA;
  23420. callInitSuites = 1;
  23421. ret = 1;
  23422. }
  23423. continue;
  23424. }
  23425. if (XSTRCMP(name, "DSS") == 0) {
  23426. /* No support for DSA ciphersuites */
  23427. continue;
  23428. }
  23429. if (XSTRCMP(name, "EXP") == 0 || XSTRCMP(name, "EXPORT") == 0) {
  23430. /* wolfSSL doesn't support "export" ciphers. We can skip this */
  23431. continue;
  23432. }
  23433. #endif /* OPENSSL_EXTRA */
  23434. for (i = 0; i < suiteSz; i++) {
  23435. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  23436. #ifndef NO_ERROR_STRINGS
  23437. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  23438. #endif
  23439. ) {
  23440. int j;
  23441. #ifdef WOLFSSL_DTLS
  23442. /* don't allow stream ciphers with DTLS */
  23443. if (version.major == DTLS_MAJOR) {
  23444. if (XSTRSTR(name, "RC4"))
  23445. {
  23446. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  23447. continue;
  23448. }
  23449. }
  23450. #endif /* WOLFSSL_DTLS */
  23451. for (j = 0; j < idx; j += 2) {
  23452. if ((suites->suites[j+0] == cipher_names[i].cipherSuite0) &&
  23453. (suites->suites[j+1] == cipher_names[i].cipherSuite)) {
  23454. break;
  23455. }
  23456. }
  23457. /* Silently drop duplicates from list. */
  23458. if (j != idx) {
  23459. break;
  23460. }
  23461. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  23462. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  23463. return 0; /* suites buffer not large enough, error out */
  23464. }
  23465. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  23466. suites->suites[idx++] = cipher_names[i].cipherSuite;
  23467. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  23468. * suites don't necessarily have RSA in the name. */
  23469. #ifdef WOLFSSL_TLS13
  23470. if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
  23471. (cipher_names[i].cipherSuite0 == ECC_BYTE &&
  23472. (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
  23473. cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
  23474. #ifndef NO_RSA
  23475. haveSig |= SIG_RSA;
  23476. #endif
  23477. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  23478. defined(HAVE_ED448)
  23479. haveSig |= SIG_ECDSA;
  23480. #endif
  23481. #if defined(HAVE_PQC)
  23482. #ifdef HAVE_FALCON
  23483. haveSig |= SIG_FALCON;
  23484. #endif /* HAVE_FALCON */
  23485. #ifdef HAVE_DILITHIUM
  23486. haveSig |= SIG_DILITHIUM;
  23487. #endif /* HAVE_DILITHIUM */
  23488. #endif /* HAVE_PQC */
  23489. }
  23490. else
  23491. #ifdef BUILD_TLS_SM4_GCM_SM3
  23492. if ((cipher_names[i].cipherSuite0 == CIPHER_BYTE) &&
  23493. (cipher_names[i].cipherSuite == TLS_SM4_GCM_SM3)) {
  23494. haveSig |= SIG_SM2;
  23495. }
  23496. else
  23497. #endif
  23498. #ifdef BUILD_TLS_SM4_CCM_SM3
  23499. if ((cipher_names[i].cipherSuite0 == CIPHER_BYTE) &&
  23500. (cipher_names[i].cipherSuite == TLS_SM4_CCM_SM3)) {
  23501. haveSig |= SIG_SM2;
  23502. }
  23503. else
  23504. #endif
  23505. #endif /* WOLFSSL_TLS13 */
  23506. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \
  23507. (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \
  23508. defined(WOLFSSL_SM4_CCM))
  23509. if ((cipher_names[i].cipherSuite0 == SM_BYTE) && (0
  23510. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
  23511. || (cipher_names[i].cipherSuite ==
  23512. TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3)
  23513. #endif
  23514. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3
  23515. || (cipher_names[i].cipherSuite ==
  23516. TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3)
  23517. #endif
  23518. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3
  23519. || (cipher_names[i].cipherSuite ==
  23520. TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3)
  23521. #endif
  23522. )) {
  23523. haveSig |= SIG_SM2;
  23524. }
  23525. else
  23526. #endif
  23527. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  23528. defined(HAVE_ED448)
  23529. if (XSTRSTR(name, "ECDSA"))
  23530. haveSig |= SIG_ECDSA;
  23531. else
  23532. #endif
  23533. #ifdef HAVE_ANON
  23534. if (XSTRSTR(name, "ADH"))
  23535. haveSig |= SIG_ANON;
  23536. else
  23537. #endif
  23538. #ifndef NO_PSK
  23539. if (XSTRSTR(name, "PSK") == NULL)
  23540. #endif
  23541. {
  23542. /* Fall back to RSA */
  23543. haveSig |= SIG_RSA;
  23544. }
  23545. ret = 1; /* found at least one */
  23546. break;
  23547. }
  23548. }
  23549. }
  23550. while (next++); /* ++ needed to skip ':' */
  23551. if (ret) {
  23552. int keySz = 0;
  23553. #ifndef NO_CERTS
  23554. keySz = privateKeySz;
  23555. #endif
  23556. #ifdef OPENSSL_EXTRA
  23557. if (callInitSuites) {
  23558. suites->setSuites = 0; /* Force InitSuites */
  23559. suites->hashSigAlgoSz = 0; /* Force InitSuitesHashSigAlgo call
  23560. * inside InitSuites */
  23561. InitSuites(suites, version, keySz, (word16)haveRSA,
  23562. (word16)havePSK, (word16)haveDH,
  23563. (word16)((haveSig & SIG_ECDSA) != 0),
  23564. (word16)haveECC, (word16)haveStaticRSA,
  23565. (word16)haveStaticECC,
  23566. (word16)((haveSig & SIG_FALCON) != 0),
  23567. (word16)((haveSig & SIG_DILITHIUM) != 0),
  23568. (word16)((haveSig & SIG_ANON) != 0),
  23569. (word16)haveNull, side);
  23570. /* Restore user ciphers ahead of defaults */
  23571. XMEMMOVE(suites->suites + idx, suites->suites,
  23572. min(suites->suiteSz, WOLFSSL_MAX_SUITE_SZ-idx));
  23573. suites->suiteSz += (word16)idx;
  23574. }
  23575. else
  23576. #endif
  23577. {
  23578. suites->suiteSz = (word16)idx;
  23579. InitSuitesHashSigAlgo_ex2(suites->hashSigAlgo, haveSig, 1, keySz,
  23580. &suites->hashSigAlgoSz);
  23581. }
  23582. #ifdef HAVE_RENEGOTIATION_INDICATION
  23583. if (side == WOLFSSL_CLIENT_END) {
  23584. if (suites->suiteSz > WOLFSSL_MAX_SUITE_SZ - 2) {
  23585. WOLFSSL_MSG("Too many ciphersuites");
  23586. return 0;
  23587. }
  23588. suites->suites[suites->suiteSz] = CIPHER_BYTE;
  23589. suites->suites[suites->suiteSz+1] =
  23590. TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  23591. suites->suiteSz += 2;
  23592. }
  23593. #endif
  23594. suites->setSuites = 1;
  23595. }
  23596. (void)privateKeySz;
  23597. return ret;
  23598. }
  23599. int SetCipherList_ex(const WOLFSSL_CTX* ctx, const WOLFSSL* ssl,
  23600. Suites* suites, const char* list)
  23601. {
  23602. ProtocolVersion version;
  23603. int privateKeySz = 0;
  23604. byte side;
  23605. if (ctx != NULL) {
  23606. version = ctx->method->version;
  23607. #ifndef NO_CERTS
  23608. privateKeySz = ctx->privateKeySz;
  23609. #endif
  23610. side = ctx->method->side;
  23611. }
  23612. else if (ssl != NULL) {
  23613. version = ssl->version;
  23614. #ifndef NO_CERTS
  23615. privateKeySz = ssl->buffers.keySz;
  23616. #endif
  23617. side = (byte)ssl->options.side;
  23618. }
  23619. else {
  23620. WOLFSSL_MSG("SetCipherList_ex parameter error");
  23621. return 0;
  23622. }
  23623. return ParseCipherList(suites, list, version, privateKeySz, side);
  23624. }
  23625. int SetCipherList(const WOLFSSL_CTX* ctx, Suites* suites,
  23626. const char* list)
  23627. {
  23628. return SetCipherList_ex(ctx, NULL, suites, list);
  23629. }
  23630. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
  23631. int SetCipherListFromBytes(WOLFSSL_CTX* ctx, Suites* suites, const byte* list,
  23632. const int listSz)
  23633. {
  23634. int ret = 0;
  23635. int idx = 0;
  23636. int i;
  23637. int haveRSAsig = 0;
  23638. int haveECDSAsig = 0;
  23639. int haveFalconSig = 0;
  23640. int haveDilithiumSig = 0;
  23641. int haveAnon = 0;
  23642. if (suites == NULL || list == NULL) {
  23643. WOLFSSL_MSG("SetCipherListFromBytes parameter error");
  23644. return 0;
  23645. }
  23646. if ((listSz % 2) != 0) {
  23647. return 0;
  23648. }
  23649. for (i = 0; (i + 1) < listSz; i += 2) {
  23650. const byte firstByte = list[i];
  23651. const byte secondByte = list[i + 1];
  23652. const char* name = NULL;
  23653. int j;
  23654. name = GetCipherNameInternal(firstByte, secondByte);
  23655. if (XSTRCMP(name, "None") == 0) {
  23656. /* bytes don't match any known cipher */
  23657. continue;
  23658. }
  23659. #ifdef WOLFSSL_DTLS
  23660. /* don't allow stream ciphers with DTLS */
  23661. if (ctx->method->version.major == DTLS_MAJOR) {
  23662. if (XSTRSTR(name, "RC4")) {
  23663. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  23664. continue;
  23665. }
  23666. }
  23667. #endif /* WOLFSSL_DTLS */
  23668. for (j = 0; j < idx; j += 2) {
  23669. if ((suites->suites[j+0] == firstByte) &&
  23670. (suites->suites[j+1] == secondByte)) {
  23671. break;
  23672. }
  23673. }
  23674. /* Silently drop duplicates from list. */
  23675. if (j != idx) {
  23676. continue;
  23677. }
  23678. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  23679. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  23680. return 0; /* suites buffer not large enough, error out */
  23681. }
  23682. suites->suites[idx++] = firstByte;
  23683. suites->suites[idx++] = secondByte;
  23684. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  23685. * suites don't necessarily have RSA in the name. */
  23686. #ifdef WOLFSSL_TLS13
  23687. if (firstByte == TLS13_BYTE || (firstByte == ECC_BYTE &&
  23688. (secondByte == TLS_SHA256_SHA256 ||
  23689. secondByte == TLS_SHA384_SHA384)) ||
  23690. (firstByte == CIPHER_BYTE && (secondByte == TLS_SM4_GCM_SM3 ||
  23691. secondByte == TLS_SM4_CCM_SM3))) {
  23692. #ifndef NO_RSA
  23693. haveRSAsig = 1;
  23694. #endif
  23695. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  23696. haveECDSAsig = 1;
  23697. #endif
  23698. #if defined(HAVE_PQC)
  23699. #ifdef HAVE_FALCON
  23700. haveFalconSig = 1;
  23701. #endif /* HAVE_FALCON */
  23702. #ifdef HAVE_DILITHIUM
  23703. haveDilithiumSig = 1;
  23704. #endif /* HAVE_DILITHIUM */
  23705. #endif /* HAVE_PQC */
  23706. }
  23707. else
  23708. #endif /* WOLFSSL_TLS13 */
  23709. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  23710. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  23711. haveECDSAsig = 1;
  23712. else
  23713. #endif
  23714. #ifdef HAVE_ANON
  23715. if (XSTRSTR(name, "ADH"))
  23716. haveAnon = 1;
  23717. else
  23718. #endif
  23719. if (haveRSAsig == 0
  23720. #ifndef NO_PSK
  23721. && (XSTRSTR(name, "PSK") == NULL)
  23722. #endif
  23723. ) {
  23724. haveRSAsig = 1;
  23725. }
  23726. ret = 1; /* found at least one */
  23727. }
  23728. if (ret) {
  23729. int keySz = 0;
  23730. int haveSig = 0;
  23731. #ifndef NO_CERTS
  23732. keySz = ctx->privateKeySz;
  23733. #endif
  23734. suites->suiteSz = (word16)idx;
  23735. haveSig |= haveECDSAsig ? SIG_ECDSA : 0;
  23736. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  23737. haveSig |= haveECDSAsig ? SIG_SM2 : 0;
  23738. #endif
  23739. haveSig |= haveRSAsig ? SIG_RSA : 0;
  23740. haveSig |= haveFalconSig ? SIG_FALCON : 0;
  23741. haveSig |= haveDilithiumSig ? SIG_DILITHIUM : 0;
  23742. haveSig |= haveAnon ? SIG_ANON : 0;
  23743. InitSuitesHashSigAlgo_ex2(suites->hashSigAlgo, haveSig, 1, keySz,
  23744. &suites->hashSigAlgoSz);
  23745. #ifdef HAVE_RENEGOTIATION_INDICATION
  23746. if (ctx->method->side == WOLFSSL_CLIENT_END) {
  23747. if (suites->suiteSz > WOLFSSL_MAX_SUITE_SZ - 2) {
  23748. WOLFSSL_MSG("Too many ciphersuites");
  23749. return 0;
  23750. }
  23751. suites->suites[suites->suiteSz] = CIPHER_BYTE;
  23752. suites->suites[suites->suiteSz+1] =
  23753. TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  23754. suites->suiteSz += 2;
  23755. }
  23756. #endif
  23757. suites->setSuites = 1;
  23758. }
  23759. (void)ctx;
  23760. return ret;
  23761. }
  23762. #endif /* OPENSSL_EXTRA */
  23763. #ifdef OPENSSL_EXTRA
  23764. struct mac_algs {
  23765. byte alg;
  23766. const char* name;
  23767. } mac_names[] = {
  23768. #ifndef NO_SHA256
  23769. { sha256_mac, "SHA256" },
  23770. #endif
  23771. #ifdef WOLFSSL_SHA384
  23772. { sha384_mac, "SHA384" },
  23773. #endif
  23774. #ifdef WOLFSSL_SHA512
  23775. { sha512_mac, "SHA512" },
  23776. #endif
  23777. #ifdef WOLFSSL_SHA224
  23778. { sha224_mac, "SHA224" },
  23779. #endif
  23780. #ifdef WOLFSSL_SM3
  23781. { sm3_mac, "SM3" },
  23782. #endif
  23783. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  23784. defined(WOLFSSL_ALLOW_TLS_SHA1))
  23785. { sha_mac, "SHA1" },
  23786. #endif
  23787. };
  23788. #define MAC_NAMES_SZ (int)(sizeof(mac_names)/sizeof(*mac_names))
  23789. /* Convert the hash algorithm string to a TLS MAC algorithm num. */
  23790. static byte GetMacAlgFromName(const char* name, int len)
  23791. {
  23792. byte alg = no_mac;
  23793. int i;
  23794. for (i = 0; i < MAC_NAMES_SZ; i++) {
  23795. if (((int)XSTRLEN(mac_names[i].name) == len) &&
  23796. (XMEMCMP(mac_names[i].name, name, len) == 0)) {
  23797. alg = mac_names[i].alg;
  23798. break;
  23799. }
  23800. }
  23801. return alg;
  23802. }
  23803. struct sig_algs {
  23804. byte alg;
  23805. const char* name;
  23806. } sig_names[] = {
  23807. #ifndef NO_RSA
  23808. { rsa_sa_algo, "RSA" },
  23809. #ifdef WC_RSA_PSS
  23810. { rsa_pss_sa_algo, "RSA-PSS" },
  23811. { rsa_pss_sa_algo, "PSS" },
  23812. #endif
  23813. #endif
  23814. #ifdef HAVE_ECC
  23815. { ecc_dsa_sa_algo, "ECDSA" },
  23816. #endif
  23817. #ifdef HAVE_ED25519
  23818. { ed25519_sa_algo, "ED25519" },
  23819. #endif
  23820. #ifdef HAVE_ED448
  23821. { ed448_sa_algo, "ED448" },
  23822. #endif
  23823. #ifndef NO_DSA
  23824. { dsa_sa_algo, "DSA" },
  23825. #endif
  23826. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  23827. { sm2_sa_algo, "SM2" },
  23828. #endif
  23829. };
  23830. #define SIG_NAMES_SZ (int)(sizeof(sig_names)/sizeof(*sig_names))
  23831. /* Convert the signature algorithm string to a TLS signature algorithm num. */
  23832. static byte GetSigAlgFromName(const char* name, int len)
  23833. {
  23834. byte alg = anonymous_sa_algo;
  23835. int i;
  23836. for (i = 0; i < SIG_NAMES_SZ; i++) {
  23837. if (((int)XSTRLEN(sig_names[i].name) == len) &&
  23838. (XMEMCMP(sig_names[i].name, name, len) == 0)) {
  23839. alg = sig_names[i].alg;
  23840. break;
  23841. }
  23842. }
  23843. return alg;
  23844. }
  23845. /* Set the hash/signature algorithms that are supported for certificate signing.
  23846. *
  23847. * suites [in,out] Cipher suites and signature algorithms.
  23848. * list [in] String representing hash/signature algorithms to set.
  23849. * returns 0 on failure.
  23850. * 1 on success.
  23851. */
  23852. int SetSuitesHashSigAlgo(Suites* suites, const char* list)
  23853. {
  23854. int ret = 1;
  23855. word16 idx = 0;
  23856. const char* s = list;
  23857. byte sig_alg = 0;
  23858. byte mac_alg = no_mac;
  23859. /* Setting is destructive on error. */
  23860. suites->hashSigAlgoSz = 0;
  23861. do {
  23862. if (*list == '+') {
  23863. if (mac_alg != 0) {
  23864. ret = 0;
  23865. break;
  23866. }
  23867. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  23868. if (sig_alg == 0) {
  23869. ret = 0;
  23870. break;
  23871. }
  23872. s = list + 1;
  23873. }
  23874. else if (*list == ':' || *list == '\0') {
  23875. if (sig_alg == 0) {
  23876. /* No signature algorithm set yet.
  23877. * Ed25519 and Ed448 have implied MAC algorithm.
  23878. */
  23879. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  23880. if (sig_alg != ed25519_sa_algo && sig_alg != ed448_sa_algo) {
  23881. ret = 0;
  23882. break;
  23883. }
  23884. }
  23885. else {
  23886. mac_alg = GetMacAlgFromName(s, (int)(list - s));
  23887. if (mac_alg == 0) {
  23888. ret = 0;
  23889. break;
  23890. }
  23891. }
  23892. AddSuiteHashSigAlgo(suites->hashSigAlgo, mac_alg, sig_alg, 0, &idx);
  23893. sig_alg = 0;
  23894. mac_alg = no_mac;
  23895. s = list + 1;
  23896. }
  23897. list++;
  23898. }
  23899. while (*(list-1) != '\0');
  23900. if (s != list && (sig_alg != 0 || mac_alg != 0)) {
  23901. ret = 0;
  23902. }
  23903. else {
  23904. suites->hashSigAlgoSz = idx;
  23905. }
  23906. return ret;
  23907. }
  23908. #endif /* OPENSSL_EXTRA */
  23909. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  23910. static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
  23911. {
  23912. #ifdef HAVE_ED25519
  23913. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  23914. /* Certificate has Ed25519 key, only match with Ed25519 sig alg */
  23915. return sigAlgo == ed25519_sa_algo;
  23916. }
  23917. #endif
  23918. #ifdef HAVE_ED448
  23919. if (ssl->pkCurveOID == ECC_ED448_OID) {
  23920. /* Certificate has Ed448 key, only match with Ed448 sig alg */
  23921. return sigAlgo == ed448_sa_algo;
  23922. }
  23923. #endif
  23924. #ifdef HAVE_PQC
  23925. #ifdef HAVE_FALCON
  23926. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1) {
  23927. /* Certificate has Falcon level 1 key, only match with Falcon level 1
  23928. * sig alg */
  23929. return sigAlgo == falcon_level1_sa_algo;
  23930. }
  23931. if (ssl->pkCurveOID == CTC_FALCON_LEVEL5) {
  23932. /* Certificate has Falcon level 5 key, only match with Falcon level 5
  23933. * sig alg */
  23934. return sigAlgo == falcon_level5_sa_algo;
  23935. }
  23936. #endif /* HAVE_FALCON */
  23937. #ifdef HAVE_DILITHIUM
  23938. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2) {
  23939. /* Certificate has Dilithium level 2 key, only match with it. */
  23940. return sigAlgo == dilithium_level2_sa_algo;
  23941. }
  23942. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3) {
  23943. /* Certificate has Dilithium level 3 key, only match with it. */
  23944. return sigAlgo == dilithium_level3_sa_algo;
  23945. }
  23946. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5) {
  23947. /* Certificate has Dilithium level 5 key, only match with it. */
  23948. return sigAlgo == dilithium_level5_sa_algo;
  23949. }
  23950. #endif /* HAVE_DILITHIUM */
  23951. #endif /* HAVE_PQC */
  23952. #ifdef WC_RSA_PSS
  23953. /* RSA certificate and PSS sig alg. */
  23954. if (ssl->options.sigAlgo == rsa_sa_algo) {
  23955. #if defined(WOLFSSL_TLS13)
  23956. /* TLS 1.3 only supports RSA-PSS. */
  23957. if (IsAtLeastTLSv1_3(ssl->version))
  23958. return sigAlgo == rsa_pss_sa_algo;
  23959. #endif
  23960. /* TLS 1.2 and below - RSA-PSS allowed. */
  23961. if (sigAlgo == rsa_pss_sa_algo)
  23962. return 1;
  23963. }
  23964. #endif
  23965. /* Signature algorithm matches certificate. */
  23966. return sigAlgo == ssl->options.sigAlgo;
  23967. }
  23968. #if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
  23969. defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  23970. static int CmpEccStrength(int hashAlgo, int curveSz)
  23971. {
  23972. int dgstSz = GetMacDigestSize((byte)hashAlgo);
  23973. if (dgstSz <= 0)
  23974. return -1;
  23975. return dgstSz - (curveSz & (~0x3));
  23976. }
  23977. #endif
  23978. static byte MinHashAlgo(WOLFSSL* ssl)
  23979. {
  23980. #ifdef WOLFSSL_TLS13
  23981. #ifndef NO_SHA256
  23982. if (IsAtLeastTLSv1_3(ssl->version)) {
  23983. return sha256_mac;
  23984. }
  23985. #elif defined(WOLFSSL_SM3)
  23986. if (IsAtLeastTLSv1_3(ssl->version)) {
  23987. return sm3_mac;
  23988. }
  23989. #endif
  23990. #endif
  23991. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
  23992. if (IsAtLeastTLSv1_2(ssl)) {
  23993. return sha256_mac;
  23994. }
  23995. #endif /* WOLFSSL_NO_TLS12 */
  23996. (void)ssl;
  23997. return sha_mac;
  23998. }
  23999. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  24000. {
  24001. word32 i;
  24002. int ret = MATCH_SUITE_ERROR;
  24003. byte minHash;
  24004. /* set defaults */
  24005. if (IsAtLeastTLSv1_3(ssl->version)) {
  24006. #ifndef NO_CERTS
  24007. /* TLS 1.3 cipher suites don't have public key algorithms in them.
  24008. * Using the one in the certificate - if any.
  24009. */
  24010. ssl->options.sigAlgo = ssl->buffers.keyType;
  24011. #endif
  24012. }
  24013. else {
  24014. ssl->options.sigAlgo = ssl->specs.sig_algo;
  24015. }
  24016. if (ssl->options.sigAlgo == anonymous_sa_algo) {
  24017. /* PSK ciphersuite - get digest to use from cipher suite */
  24018. ssl->options.hashAlgo = ssl->specs.mac_algorithm;
  24019. return 0;
  24020. }
  24021. ssl->options.hashAlgo = minHash = MinHashAlgo(ssl);
  24022. /* No list means go with the defaults. */
  24023. if (hashSigAlgoSz == 0)
  24024. return 0;
  24025. /* i+1 since two bytes used to describe hash and signature algorithm */
  24026. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  24027. byte hashAlgo = 0, sigAlgo = 0;
  24028. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  24029. /* Keep looking if hash algorithm not strong enough. */
  24030. if (hashAlgo < minHash)
  24031. continue;
  24032. /* Keep looking if signature algorithm isn't supported by cert. */
  24033. if (!MatchSigAlgo(ssl, sigAlgo))
  24034. continue;
  24035. #ifdef HAVE_ED25519
  24036. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  24037. /* Matched Ed25519 - set chosen and finished. */
  24038. ssl->options.sigAlgo = sigAlgo;
  24039. ssl->options.hashAlgo = hashAlgo;
  24040. ret = 0;
  24041. break;
  24042. }
  24043. #endif
  24044. #ifdef HAVE_ED448
  24045. if (ssl->pkCurveOID == ECC_ED448_OID) {
  24046. /* Matched Ed448 - set chosen and finished. */
  24047. ssl->options.sigAlgo = sigAlgo;
  24048. ssl->options.hashAlgo = hashAlgo;
  24049. ret = 0;
  24050. break;
  24051. }
  24052. #endif
  24053. #if defined(HAVE_PQC)
  24054. #if defined(HAVE_FALCON)
  24055. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1 ||
  24056. ssl->pkCurveOID == CTC_FALCON_LEVEL5 ) {
  24057. /* Matched Falcon - set chosen and finished. */
  24058. ssl->options.sigAlgo = sigAlgo;
  24059. ssl->options.hashAlgo = hashAlgo;
  24060. ret = 0;
  24061. break;
  24062. }
  24063. #endif /* HAVE_FALCON */
  24064. #if defined(HAVE_DILITHIUM)
  24065. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2 ||
  24066. ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3 ||
  24067. ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5) {
  24068. /* Matched Dilithium - set chosen and finished. */
  24069. ssl->options.sigAlgo = sigAlgo;
  24070. ssl->options.hashAlgo = hashAlgo;
  24071. ret = 0;
  24072. break;
  24073. }
  24074. #endif /* HAVE_DILITHIUM */
  24075. #endif /* HAVE_PQC */
  24076. #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  24077. #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
  24078. "be used together"
  24079. #endif
  24080. #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
  24081. defined(WOLFSSL_ECDSA_MATCH_HASH))
  24082. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  24083. if (sigAlgo == sm2_sa_algo && hashAlgo == sm3_mac
  24084. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  24085. && IsAtLeastTLSv1_3(ssl->version)
  24086. #endif
  24087. ) {
  24088. /* Must be exact match. */
  24089. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  24090. continue;
  24091. /* Matched SM2-SM3 - set chosen and finished. */
  24092. ssl->options.sigAlgo = sigAlgo;
  24093. ssl->options.hashAlgo = hashAlgo;
  24094. ret = 0;
  24095. break;
  24096. }
  24097. else
  24098. #endif
  24099. if (sigAlgo == ecc_dsa_sa_algo
  24100. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  24101. && IsAtLeastTLSv1_3(ssl->version)
  24102. #endif
  24103. ) {
  24104. /* Must be exact match. */
  24105. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  24106. continue;
  24107. /* Matched ECDSA exactly - set chosen and finished. */
  24108. ssl->options.hashAlgo = hashAlgo;
  24109. ssl->options.sigAlgo = sigAlgo;
  24110. ret = 0;
  24111. break;
  24112. }
  24113. #endif
  24114. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  24115. * algorithm that matches the ephemeral ECDHE key size or the next highest
  24116. * available. This workaround resolves issue with some peer's that do not
  24117. * properly support scenarios such as a P-256 key hashed with SHA512.
  24118. */
  24119. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  24120. if (sigAlgo == ecc_dsa_sa_algo) {
  24121. int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
  24122. /* Keep looking if digest not strong enough. */
  24123. if (cmp < 0)
  24124. continue;
  24125. /* Looking for exact match or next highest. */
  24126. if (ret != 0 || hashAlgo <= ssl->options.hashAlgo) {
  24127. ssl->options.hashAlgo = hashAlgo;
  24128. ssl->options.sigAlgo = sigAlgo;
  24129. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  24130. ssl->namedGroup = 0;
  24131. #endif
  24132. ret = 0;
  24133. }
  24134. /* Continue looking if not the same strength. */
  24135. if (cmp > 0)
  24136. continue;
  24137. /* Exact match - finished. */
  24138. break;
  24139. }
  24140. #endif
  24141. switch (hashAlgo) {
  24142. #ifndef NO_SHA
  24143. case sha_mac:
  24144. #endif
  24145. #ifdef WOLFSSL_SHA224
  24146. case sha224_mac:
  24147. #endif
  24148. #ifndef NO_SHA256
  24149. case sha256_mac:
  24150. #endif
  24151. #ifdef WOLFSSL_SHA384
  24152. case sha384_mac:
  24153. #endif
  24154. #ifdef WOLFSSL_SHA512
  24155. case sha512_mac:
  24156. #endif
  24157. #ifdef WOLFSSL_SM3
  24158. case sm3_mac:
  24159. #endif
  24160. #ifdef WOLFSSL_STRONGEST_HASH_SIG
  24161. /* Is hash algorithm weaker than chosen/min? */
  24162. if (hashAlgo < ssl->options.hashAlgo)
  24163. break;
  24164. #else
  24165. /* Is hash algorithm stronger than last chosen? */
  24166. if (ret == 0 && hashAlgo > ssl->options.hashAlgo)
  24167. break;
  24168. #endif
  24169. if (IsAtLeastTLSv1_2(ssl) && !IsAtLeastTLSv1_3(ssl->version) &&
  24170. (ssl->options.side == WOLFSSL_CLIENT_END)) {
  24171. /* TLS 1.2 client deciding hash algorithm for
  24172. * CertificateVerify. Hash must be one of the handshake
  24173. * hashes being maintained. */
  24174. if (1
  24175. #ifndef NO_SHA
  24176. && (hashAlgo != sha_mac)
  24177. #endif
  24178. #ifndef NO_SHA256
  24179. && (hashAlgo != sha256_mac)
  24180. #endif
  24181. #ifdef WOLFSSL_SHA384
  24182. && (hashAlgo != sha384_mac)
  24183. #endif
  24184. #ifdef WOLFSSL_SHA512
  24185. && (hashAlgo != sha512_mac)
  24186. #endif
  24187. #ifdef WOLFSSL_SM3
  24188. && (hashAlgo != sm3_mac)
  24189. #endif
  24190. )
  24191. {
  24192. break;
  24193. }
  24194. }
  24195. /* The chosen one - but keep looking. */
  24196. ssl->options.hashAlgo = hashAlgo;
  24197. ssl->options.sigAlgo = sigAlgo;
  24198. ret = 0;
  24199. break;
  24200. default:
  24201. /* Support for hash algorithm not compiled in. */
  24202. break;
  24203. }
  24204. }
  24205. return ret;
  24206. }
  24207. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  24208. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  24209. /* Initialize HandShakeInfo */
  24210. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  24211. {
  24212. int i;
  24213. info->ssl = ssl;
  24214. info->cipherName[0] = 0;
  24215. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  24216. info->packetNames[i][0] = 0;
  24217. info->numberPackets = 0;
  24218. info->negotiationError = 0;
  24219. }
  24220. /* Set Final HandShakeInfo parameters */
  24221. void FinishHandShakeInfo(HandShakeInfo* info)
  24222. {
  24223. int i;
  24224. int sz = GetCipherNamesSize();
  24225. for (i = 0; i < sz; i++) {
  24226. #ifndef NO_CIPHER_SUITE_ALIASES
  24227. if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  24228. continue;
  24229. #endif
  24230. if (info->ssl->options.cipherSuite ==
  24231. (byte)cipher_names[i].cipherSuite) {
  24232. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  24233. continue; /* ECC suites at end */
  24234. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  24235. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  24236. break;
  24237. }
  24238. }
  24239. /* error max and min are negative numbers */
  24240. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  24241. info->negotiationError = info->ssl->error;
  24242. }
  24243. /* Add name to info packet names, increase packet name count */
  24244. void AddPacketName(WOLFSSL* ssl, const char* name)
  24245. {
  24246. #ifdef WOLFSSL_CALLBACKS
  24247. HandShakeInfo* info = &ssl->handShakeInfo;
  24248. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  24249. char* packetName = info->packetNames[info->numberPackets];
  24250. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  24251. packetName[MAX_PACKETNAME_SZ] = '\0';
  24252. info->numberPackets++;
  24253. }
  24254. #endif
  24255. (void)ssl;
  24256. (void)name;
  24257. }
  24258. #ifdef WOLFSSL_CALLBACKS
  24259. /* Initialize TimeoutInfo */
  24260. void InitTimeoutInfo(TimeoutInfo* info)
  24261. {
  24262. XMEMSET(info, 0, sizeof(TimeoutInfo));
  24263. }
  24264. /* Free TimeoutInfo */
  24265. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  24266. {
  24267. int i;
  24268. (void)heap;
  24269. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  24270. if (info->packets[i].bufferValue) {
  24271. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  24272. info->packets[i].bufferValue = NULL;
  24273. }
  24274. }
  24275. }
  24276. /* Add packet name to previously added packet info */
  24277. void AddLateName(const char* name, TimeoutInfo* info)
  24278. {
  24279. /* make sure we have a valid previous one */
  24280. if (info->numberPackets > 0 && info->numberPackets <
  24281. MAX_PACKETS_HANDSHAKE) {
  24282. char* packetName = info->packets[info->numberPackets-1].packetName;
  24283. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  24284. packetName[MAX_PACKETNAME_SZ] = '\0';
  24285. }
  24286. }
  24287. /* Add record header to previously added packet info */
  24288. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  24289. {
  24290. /* make sure we have a valid previous one */
  24291. if (info->numberPackets > 0 && info->numberPackets <
  24292. MAX_PACKETS_HANDSHAKE) {
  24293. if (info->packets[info->numberPackets - 1].bufferValue)
  24294. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  24295. RECORD_HEADER_SZ);
  24296. else
  24297. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  24298. RECORD_HEADER_SZ);
  24299. }
  24300. }
  24301. #endif /* WOLFSSL_CALLBACKS */
  24302. /* Add PacketInfo to TimeoutInfo
  24303. *
  24304. * ssl WOLFSSL structure sending or receiving packet
  24305. * name name of packet being sent
  24306. * type type of packet being sent
  24307. * data data bing sent with packet
  24308. * sz size of data buffer
  24309. * lateRL save space for record layer in TimoutInfo struct
  24310. * written 1 if this packet is being written to wire, 0 if being read
  24311. * heap custom heap to use for mallocs/frees
  24312. */
  24313. int AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  24314. const byte* data, int sz, int written, int lateRL, void* heap)
  24315. {
  24316. #ifdef WOLFSSL_CALLBACKS
  24317. TimeoutInfo* info = &ssl->timeoutInfo;
  24318. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  24319. WOLFSSL_TIMEVAL currTime;
  24320. int totalSz;
  24321. /* add in space for post record layer */
  24322. totalSz = sz + lateRL;
  24323. /* may add name after */
  24324. if (name) {
  24325. char* packetName = info->packets[info->numberPackets].packetName;
  24326. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  24327. packetName[MAX_PACKETNAME_SZ] = '\0';
  24328. }
  24329. /* add data, put in buffer if bigger than static buffer */
  24330. info->packets[info->numberPackets].valueSz = totalSz;
  24331. if (totalSz < MAX_VALUE_SZ) {
  24332. XMEMCPY(info->packets[info->numberPackets].value + lateRL, data,
  24333. sz);
  24334. }
  24335. else {
  24336. info->packets[info->numberPackets].bufferValue =
  24337. (byte*)XMALLOC(totalSz, heap, DYNAMIC_TYPE_INFO);
  24338. if (!info->packets[info->numberPackets].bufferValue) {
  24339. /* let next alloc catch, just don't fill, not fatal here */
  24340. info->packets[info->numberPackets].valueSz = 0;
  24341. }
  24342. else {
  24343. /* copy over data (which has the handshake header), leaving
  24344. * room for post record layer header if set */
  24345. XMEMCPY(info->packets[info->numberPackets].bufferValue +
  24346. lateRL, data, sz);
  24347. }
  24348. }
  24349. if (gettimeofday(&currTime, 0) < 0)
  24350. return SYSLIB_FAILED_E;
  24351. info->packets[info->numberPackets].timestamp.tv_sec =
  24352. currTime.tv_sec;
  24353. info->packets[info->numberPackets].timestamp.tv_usec =
  24354. currTime.tv_usec;
  24355. info->numberPackets++;
  24356. }
  24357. #endif /* WOLFSSL_CALLBACKS */
  24358. #ifdef OPENSSL_EXTRA
  24359. if ((ssl->protoMsgCb != NULL) && (sz > 0) &&
  24360. (ssl->keys.encryptionOn != 1)) {
  24361. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  24362. 4096 from 16^3 */
  24363. int version = (ssl->version.minor & 0x0F) +
  24364. ((ssl->version.minor & 0xF0) << 4) +
  24365. ((ssl->version.major & 0x0F) << 8) +
  24366. ((ssl->version.major & 0xF0) << 12);
  24367. ssl->protoMsgCb(written, version, type,
  24368. (const void *)data, (size_t)sz,
  24369. ssl, ssl->protoMsgCtx);
  24370. }
  24371. #endif /* OPENSSL_EXTRA */
  24372. (void)written;
  24373. (void)name;
  24374. (void)heap;
  24375. (void)type;
  24376. (void)ssl;
  24377. (void)lateRL;
  24378. return 0;
  24379. }
  24380. #endif /* WOLFSSL_CALLBACKS */
  24381. #if !defined(NO_CERTS)
  24382. #if defined(WOLF_PRIVATE_KEY_ID) && !defined(NO_CHECK_PRIVATE_KEY)
  24383. /* Create a private key for a device.
  24384. *
  24385. * pkey Key object.
  24386. * data Data to identify key.
  24387. * length Length of data.
  24388. * hsType Type of the key to create.
  24389. * heap Custom heap to use for mallocs/frees
  24390. * devId Id for device.
  24391. * return 0 on success.
  24392. * return NOT_COMPILED_IN if algorithm type not supported.
  24393. * return MEMORY_E on memory allocation failure.
  24394. * return other internal error
  24395. */
  24396. int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
  24397. int label, int id, void* heap, int devId)
  24398. {
  24399. int ret = NOT_COMPILED_IN;
  24400. if (hsType == DYNAMIC_TYPE_RSA) {
  24401. #ifndef NO_RSA
  24402. RsaKey* rsaKey;
  24403. rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  24404. if (rsaKey == NULL) {
  24405. return MEMORY_E;
  24406. }
  24407. if (label) {
  24408. ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
  24409. }
  24410. else if (id) {
  24411. ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId);
  24412. }
  24413. if (ret == 0) {
  24414. *pkey = (void*)rsaKey;
  24415. }
  24416. else {
  24417. XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
  24418. }
  24419. #endif
  24420. }
  24421. else if (hsType == DYNAMIC_TYPE_ECC) {
  24422. #ifdef HAVE_ECC
  24423. ecc_key* ecKey;
  24424. ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  24425. if (ecKey == NULL) {
  24426. return MEMORY_E;
  24427. }
  24428. if (label) {
  24429. ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
  24430. }
  24431. else if (id) {
  24432. ret = wc_ecc_init_id(ecKey, data, length, heap, devId);
  24433. }
  24434. if (ret == 0) {
  24435. *pkey = (void*)ecKey;
  24436. }
  24437. else {
  24438. XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
  24439. }
  24440. #endif
  24441. }
  24442. else if (hsType == DYNAMIC_TYPE_DILITHIUM) {
  24443. #if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
  24444. dilithium_key* dilithiumKey;
  24445. dilithiumKey = (dilithium_key*)XMALLOC(sizeof(dilithium_key), heap,
  24446. DYNAMIC_TYPE_DILITHIUM);
  24447. if (dilithiumKey == NULL) {
  24448. return MEMORY_E;
  24449. }
  24450. if (label) {
  24451. ret = wc_dilithium_init_label(dilithiumKey, (char*)data,
  24452. heap, devId);
  24453. }
  24454. else if (id) {
  24455. ret = wc_dilithium_init_id(dilithiumKey, data, length, heap, devId);
  24456. }
  24457. if (ret == 0) {
  24458. *pkey = (void*)dilithiumKey;
  24459. }
  24460. else {
  24461. XFREE(dilithiumKey, heap, DYNAMIC_TYPE_DILITHIUM);
  24462. }
  24463. #endif
  24464. }
  24465. else if (hsType == DYNAMIC_TYPE_FALCON) {
  24466. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  24467. falcon_key* falconKey;
  24468. falconKey = (falcon_key*)XMALLOC(sizeof(falcon_key), heap,
  24469. DYNAMIC_TYPE_FALCON);
  24470. if (falconKey == NULL) {
  24471. return MEMORY_E;
  24472. }
  24473. if (label) {
  24474. ret = wc_falcon_init_label(falconKey, (char*)data, heap, devId);
  24475. }
  24476. else if (id) {
  24477. ret = wc_falcon_init_id(falconKey, data, length, heap, devId);
  24478. }
  24479. if (ret == 0) {
  24480. *pkey = (void*)falconKey;
  24481. }
  24482. else {
  24483. XFREE(falconKey, heap, DYNAMIC_TYPE_FALCON);
  24484. }
  24485. #endif
  24486. }
  24487. return ret;
  24488. }
  24489. #endif /* WOLF_PRIVATE_KEY_ID && !NO_CHECK_PRIVATE_KEY */
  24490. /* Decode the private key - RSA/ECC/Ed25519/Ed448/Falcon/Dilithium - and
  24491. * creates a key object.
  24492. *
  24493. * The signature type is set as well.
  24494. * The maximum length of a signature is returned.
  24495. *
  24496. * ssl The SSL/TLS object.
  24497. * length The length of a signature.
  24498. * returns 0 on success, otherwise failure.
  24499. */
  24500. int DecodePrivateKey(WOLFSSL *ssl, word32* length)
  24501. {
  24502. int ret = BAD_FUNC_ARG;
  24503. int keySz;
  24504. word32 idx;
  24505. /* make sure private key exists */
  24506. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  24507. /* allow no private key if using external */
  24508. #ifdef WOLF_PRIVATE_KEY_ID
  24509. if (ssl->devId != INVALID_DEVID
  24510. #ifdef HAVE_PK_CALLBACKS
  24511. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  24512. #endif
  24513. ) {
  24514. *length = GetPrivateKeySigSize(ssl);
  24515. return 0;
  24516. }
  24517. else
  24518. #endif
  24519. {
  24520. WOLFSSL_MSG("Private key missing!");
  24521. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  24522. }
  24523. }
  24524. #ifdef WOLF_PRIVATE_KEY_ID
  24525. if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
  24526. ssl->buffers.keyLabel)) {
  24527. if (ssl->buffers.keyType == rsa_sa_algo)
  24528. ssl->hsType = DYNAMIC_TYPE_RSA;
  24529. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  24530. ssl->hsType = DYNAMIC_TYPE_ECC;
  24531. else if ((ssl->buffers.keyType == falcon_level1_sa_algo) ||
  24532. (ssl->buffers.keyType == falcon_level5_sa_algo))
  24533. ssl->hsType = DYNAMIC_TYPE_FALCON;
  24534. else if ((ssl->buffers.keyType == dilithium_level2_sa_algo) ||
  24535. (ssl->buffers.keyType == dilithium_level3_sa_algo) ||
  24536. (ssl->buffers.keyType == dilithium_level5_sa_algo))
  24537. ssl->hsType = DYNAMIC_TYPE_DILITHIUM;
  24538. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24539. if (ret != 0) {
  24540. goto exit_dpk;
  24541. }
  24542. if (ssl->buffers.keyType == rsa_sa_algo) {
  24543. #ifndef NO_RSA
  24544. if (ssl->buffers.keyLabel) {
  24545. ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
  24546. (char*)ssl->buffers.key->buffer,
  24547. ssl->heap, ssl->buffers.keyDevId);
  24548. }
  24549. else if (ssl->buffers.keyId) {
  24550. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  24551. ssl->buffers.key->buffer,
  24552. ssl->buffers.key->length, ssl->heap,
  24553. ssl->buffers.keyDevId);
  24554. }
  24555. if (ret == 0) {
  24556. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  24557. WOLFSSL_MSG("RSA key size too small");
  24558. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  24559. }
  24560. /* Return the maximum signature length. */
  24561. *length = ssl->buffers.keySz;
  24562. }
  24563. #else
  24564. ret = NOT_COMPILED_IN;
  24565. #endif
  24566. }
  24567. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  24568. #ifdef HAVE_ECC
  24569. if (ssl->buffers.keyLabel) {
  24570. ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
  24571. (char*)ssl->buffers.key->buffer,
  24572. ssl->heap, ssl->buffers.keyDevId);
  24573. }
  24574. else if (ssl->buffers.keyId) {
  24575. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
  24576. ssl->buffers.key->buffer,
  24577. ssl->buffers.key->length, ssl->heap,
  24578. ssl->buffers.keyDevId);
  24579. }
  24580. if (ret == 0) {
  24581. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  24582. WOLFSSL_MSG("ECC key size too small");
  24583. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  24584. }
  24585. /* Return the maximum signature length. */
  24586. *length = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  24587. }
  24588. #else
  24589. ret = NOT_COMPILED_IN;
  24590. #endif
  24591. }
  24592. else if ((ssl->buffers.keyType == falcon_level1_sa_algo) ||
  24593. (ssl->buffers.keyType == falcon_level5_sa_algo)) {
  24594. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  24595. if (ssl->buffers.keyLabel) {
  24596. ret = wc_falcon_init_label((falcon_key*)ssl->hsKey,
  24597. (char*)ssl->buffers.key->buffer,
  24598. ssl->heap, ssl->buffers.keyDevId);
  24599. }
  24600. else if (ssl->buffers.keyId) {
  24601. ret = wc_falcon_init_id((falcon_key*)ssl->hsKey,
  24602. ssl->buffers.key->buffer,
  24603. ssl->buffers.key->length, ssl->heap,
  24604. ssl->buffers.keyDevId);
  24605. }
  24606. if (ret == 0) {
  24607. if (ssl->buffers.keyType == falcon_level1_sa_algo) {
  24608. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 1);
  24609. }
  24610. else if (ssl->buffers.keyType == falcon_level5_sa_algo) {
  24611. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 5);
  24612. }
  24613. }
  24614. if (ret == 0) {
  24615. if (ssl->buffers.keySz < ssl->options.minFalconKeySz) {
  24616. WOLFSSL_MSG("Falcon key size too small");
  24617. ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk);
  24618. }
  24619. /* Return the maximum signature length. */
  24620. *length = wc_falcon_sig_size((falcon_key*)ssl->hsKey);
  24621. }
  24622. #else
  24623. ret = NOT_COMPILED_IN;
  24624. #endif
  24625. }
  24626. else if ((ssl->buffers.keyType == dilithium_level2_sa_algo) ||
  24627. (ssl->buffers.keyType == dilithium_level3_sa_algo) ||
  24628. (ssl->buffers.keyType == dilithium_level5_sa_algo)) {
  24629. #if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
  24630. if (ssl->buffers.keyLabel) {
  24631. ret = wc_dilithium_init_label((dilithium_key*)ssl->hsKey,
  24632. (char*)ssl->buffers.key->buffer,
  24633. ssl->heap, ssl->buffers.keyDevId);
  24634. }
  24635. else if (ssl->buffers.keyId) {
  24636. ret = wc_dilithium_init_id((dilithium_key*)ssl->hsKey,
  24637. ssl->buffers.key->buffer,
  24638. ssl->buffers.key->length, ssl->heap,
  24639. ssl->buffers.keyDevId);
  24640. }
  24641. if (ret == 0) {
  24642. if (ssl->buffers.keyType == dilithium_level2_sa_algo) {
  24643. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 2);
  24644. }
  24645. else if (ssl->buffers.keyType == dilithium_level3_sa_algo) {
  24646. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 3);
  24647. }
  24648. else if (ssl->buffers.keyType == dilithium_level5_sa_algo) {
  24649. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 5);
  24650. }
  24651. }
  24652. if (ret == 0) {
  24653. if (ssl->buffers.keySz < ssl->options.minDilithiumKeySz) {
  24654. WOLFSSL_MSG("Dilithium key size too small");
  24655. ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk);
  24656. }
  24657. /* Return the maximum signature length. */
  24658. *length = wc_dilithium_sig_size(
  24659. (dilithium_key*)ssl->hsKey);
  24660. }
  24661. #else
  24662. ret = NOT_COMPILED_IN;
  24663. #endif
  24664. }
  24665. goto exit_dpk;
  24666. }
  24667. #endif /* WOLF_PRIVATE_KEY_ID */
  24668. #ifndef NO_RSA
  24669. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  24670. ssl->hsType = DYNAMIC_TYPE_RSA;
  24671. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24672. if (ret != 0) {
  24673. goto exit_dpk;
  24674. }
  24675. WOLFSSL_MSG("Trying RSA private key");
  24676. /* Set start of data to beginning of buffer. */
  24677. idx = 0;
  24678. /* Decode the key assuming it is an RSA private key. */
  24679. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  24680. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  24681. #ifdef WOLF_PRIVATE_KEY_ID
  24682. /* if using external key then allow using a public key */
  24683. if (ret != 0 && (ssl->devId != INVALID_DEVID
  24684. #ifdef HAVE_PK_CALLBACKS
  24685. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  24686. #endif
  24687. )) {
  24688. WOLFSSL_MSG("Trying RSA public key with crypto callbacks");
  24689. idx = 0;
  24690. ret = wc_RsaPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  24691. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  24692. }
  24693. #endif
  24694. if (ret == 0) {
  24695. WOLFSSL_MSG("Using RSA private key");
  24696. /* It worked so check it meets minimum key size requirements. */
  24697. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  24698. if (keySz < 0) { /* check if keySz has error case */
  24699. ERROR_OUT(keySz, exit_dpk);
  24700. }
  24701. if (keySz < ssl->options.minRsaKeySz) {
  24702. WOLFSSL_MSG("RSA key size too small");
  24703. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  24704. }
  24705. /* Return the maximum signature length. */
  24706. *length = keySz;
  24707. goto exit_dpk;
  24708. }
  24709. }
  24710. #endif /* !NO_RSA */
  24711. #ifdef HAVE_ECC
  24712. #ifndef NO_RSA
  24713. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  24714. #endif /* !NO_RSA */
  24715. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0
  24716. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  24717. || ssl->buffers.keyType == sm2_sa_algo
  24718. #endif
  24719. ) {
  24720. ssl->hsType = DYNAMIC_TYPE_ECC;
  24721. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24722. if (ret != 0) {
  24723. goto exit_dpk;
  24724. }
  24725. #ifndef NO_RSA
  24726. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  24727. #else
  24728. WOLFSSL_MSG("Trying ECC private key");
  24729. #endif
  24730. /* Set start of data to beginning of buffer. */
  24731. idx = 0;
  24732. /* Decode the key assuming it is an ECC private key. */
  24733. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  24734. (ecc_key*)ssl->hsKey,
  24735. ssl->buffers.key->length);
  24736. #ifdef WOLF_PRIVATE_KEY_ID
  24737. /* if using external key then allow using a public key */
  24738. if (ret != 0 && (ssl->devId != INVALID_DEVID
  24739. #ifdef HAVE_PK_CALLBACKS
  24740. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  24741. #endif
  24742. )) {
  24743. WOLFSSL_MSG("Trying ECC public key with crypto callbacks");
  24744. idx = 0;
  24745. ret = wc_EccPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  24746. (ecc_key*)ssl->hsKey,
  24747. ssl->buffers.key->length);
  24748. }
  24749. #endif
  24750. if (ret == 0) {
  24751. WOLFSSL_MSG("Using ECC private key");
  24752. /* Check it meets the minimum ECC key size requirements. */
  24753. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  24754. if (keySz < ssl->options.minEccKeySz) {
  24755. WOLFSSL_MSG("ECC key size too small");
  24756. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  24757. }
  24758. /* Return the maximum signature length. */
  24759. *length = wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  24760. goto exit_dpk;
  24761. }
  24762. }
  24763. #endif
  24764. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  24765. #if !defined(NO_RSA) || defined(HAVE_ECC)
  24766. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  24767. #endif
  24768. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  24769. ssl->hsType = DYNAMIC_TYPE_ED25519;
  24770. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24771. if (ret != 0) {
  24772. goto exit_dpk;
  24773. }
  24774. #ifdef HAVE_ECC
  24775. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  24776. #elif !defined(NO_RSA)
  24777. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  24778. #else
  24779. WOLFSSL_MSG("Trying ED25519 private key");
  24780. #endif
  24781. /* Set start of data to beginning of buffer. */
  24782. idx = 0;
  24783. /* Decode the key assuming it is an ED25519 private key. */
  24784. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  24785. (ed25519_key*)ssl->hsKey,
  24786. ssl->buffers.key->length);
  24787. #ifdef WOLF_PRIVATE_KEY_ID
  24788. /* if using external key then allow using a public key */
  24789. if (ret != 0 && (ssl->devId != INVALID_DEVID
  24790. #ifdef HAVE_PK_CALLBACKS
  24791. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  24792. #endif
  24793. )) {
  24794. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  24795. idx = 0;
  24796. ret = wc_Ed25519PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  24797. (ed25519_key*)ssl->hsKey,
  24798. ssl->buffers.key->length);
  24799. }
  24800. #endif
  24801. if (ret == 0) {
  24802. WOLFSSL_MSG("Using ED25519 private key");
  24803. /* Check it meets the minimum ECC key size requirements. */
  24804. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  24805. WOLFSSL_MSG("ED25519 key size too small");
  24806. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  24807. }
  24808. /* Return the maximum signature length. */
  24809. *length = ED25519_SIG_SIZE;
  24810. goto exit_dpk;
  24811. }
  24812. }
  24813. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  24814. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  24815. #if !defined(NO_RSA) || defined(HAVE_ECC)
  24816. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  24817. #endif
  24818. if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
  24819. ssl->hsType = DYNAMIC_TYPE_ED448;
  24820. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24821. if (ret != 0) {
  24822. goto exit_dpk;
  24823. }
  24824. #ifdef HAVE_ED25519
  24825. WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
  24826. #elif defined(HAVE_ECC)
  24827. WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
  24828. #elif !defined(NO_RSA)
  24829. WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
  24830. #else
  24831. WOLFSSL_MSG("Trying ED448 private key");
  24832. #endif
  24833. /* Set start of data to beginning of buffer. */
  24834. idx = 0;
  24835. /* Decode the key assuming it is an ED448 private key. */
  24836. ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  24837. (ed448_key*)ssl->hsKey,
  24838. ssl->buffers.key->length);
  24839. #ifdef WOLF_PRIVATE_KEY_ID
  24840. /* if using external key then allow using a public key */
  24841. if (ret != 0 && (ssl->devId != INVALID_DEVID
  24842. #ifdef HAVE_PK_CALLBACKS
  24843. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  24844. #endif
  24845. )) {
  24846. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  24847. idx = 0;
  24848. ret = wc_Ed448PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  24849. (ed448_key*)ssl->hsKey,
  24850. ssl->buffers.key->length);
  24851. }
  24852. #endif
  24853. if (ret == 0) {
  24854. WOLFSSL_MSG("Using ED448 private key");
  24855. /* Check it meets the minimum ECC key size requirements. */
  24856. if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  24857. WOLFSSL_MSG("ED448 key size too small");
  24858. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  24859. }
  24860. /* Return the maximum signature length. */
  24861. *length = ED448_SIG_SIZE;
  24862. goto exit_dpk;
  24863. }
  24864. }
  24865. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  24866. #if defined(HAVE_PQC)
  24867. #if defined(HAVE_FALCON)
  24868. #if !defined(NO_RSA) || defined(HAVE_ECC)
  24869. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  24870. #endif
  24871. if (ssl->buffers.keyType == falcon_level1_sa_algo ||
  24872. ssl->buffers.keyType == falcon_level5_sa_algo ||
  24873. ssl->buffers.keyType == 0) {
  24874. ssl->hsType = DYNAMIC_TYPE_FALCON;
  24875. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24876. if (ret != 0) {
  24877. goto exit_dpk;
  24878. }
  24879. if (ssl->buffers.keyType == falcon_level1_sa_algo) {
  24880. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 1);
  24881. }
  24882. else if (ssl->buffers.keyType == falcon_level5_sa_algo) {
  24883. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 5);
  24884. }
  24885. else {
  24886. /* What if ssl->buffers.keyType is 0? We might want to do something
  24887. * more graceful here. */
  24888. ret = ALGO_ID_E;
  24889. }
  24890. if (ret != 0) {
  24891. goto exit_dpk;
  24892. }
  24893. #if defined(HAVE_ED448)
  24894. WOLFSSL_MSG("Trying Falcon private key, ED448 didn't work");
  24895. #elif defined(HAVE_ED25519)
  24896. WOLFSSL_MSG("Trying Falcon private key, ED25519 didn't work");
  24897. #elif defined(HAVE_ECC)
  24898. WOLFSSL_MSG("Trying Falcon private key, ECC didn't work");
  24899. #elif !defined(NO_RSA)
  24900. WOLFSSL_MSG("Trying Falcon private key, RSA didn't work");
  24901. #else
  24902. WOLFSSL_MSG("Trying Falcon private key");
  24903. #endif
  24904. /* Set start of data to beginning of buffer. */
  24905. idx = 0;
  24906. /* Decode the key assuming it is a Falcon private key. */
  24907. ret = wc_falcon_import_private_only(ssl->buffers.key->buffer,
  24908. ssl->buffers.key->length,
  24909. (falcon_key*)ssl->hsKey);
  24910. if (ret == 0) {
  24911. WOLFSSL_MSG("Using Falcon private key");
  24912. /* Check it meets the minimum Falcon key size requirements. */
  24913. keySz = wc_falcon_size((falcon_key*)ssl->hsKey);
  24914. if (keySz < ssl->options.minFalconKeySz) {
  24915. WOLFSSL_MSG("Falcon key size too small");
  24916. ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk);
  24917. }
  24918. /* Return the maximum signature length. */
  24919. *length = wc_falcon_sig_size((falcon_key*)ssl->hsKey);
  24920. goto exit_dpk;
  24921. }
  24922. }
  24923. #endif /* HAVE_FALCON */
  24924. #if defined(HAVE_DILITHIUM)
  24925. #if !defined(NO_RSA) || defined(HAVE_ECC)
  24926. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  24927. #endif
  24928. if (ssl->buffers.keyType == dilithium_level2_sa_algo ||
  24929. ssl->buffers.keyType == dilithium_level3_sa_algo ||
  24930. ssl->buffers.keyType == dilithium_level5_sa_algo ||
  24931. ssl->buffers.keyType == 0) {
  24932. ssl->hsType = DYNAMIC_TYPE_DILITHIUM;
  24933. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24934. if (ret != 0) {
  24935. goto exit_dpk;
  24936. }
  24937. if (ssl->buffers.keyType == dilithium_level2_sa_algo) {
  24938. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 2);
  24939. }
  24940. else if (ssl->buffers.keyType == dilithium_level3_sa_algo) {
  24941. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 3);
  24942. }
  24943. else if (ssl->buffers.keyType == dilithium_level5_sa_algo) {
  24944. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 5);
  24945. }
  24946. else {
  24947. /* What if ssl->buffers.keyType is 0? We might want to do something
  24948. * more graceful here. */
  24949. ret = ALGO_ID_E;
  24950. }
  24951. if (ret != 0) {
  24952. goto exit_dpk;
  24953. }
  24954. #if defined(HAVE_ED448)
  24955. WOLFSSL_MSG("Trying Dilithium private key, ED448 didn't work");
  24956. #elif defined(HAVE_ED25519)
  24957. WOLFSSL_MSG("Trying Dilithium private key, ED25519 didn't work");
  24958. #elif defined(HAVE_ECC)
  24959. WOLFSSL_MSG("Trying Dilithium private key, ECC didn't work");
  24960. #elif !defined(NO_RSA)
  24961. WOLFSSL_MSG("Trying Dilithium private key, RSA didn't work");
  24962. #elif defined(HAVE_FALCON)
  24963. WOLFSSL_MSG("Trying Dilithium private key, Falcon didn't work");
  24964. #else
  24965. WOLFSSL_MSG("Trying Dilithium private key");
  24966. #endif
  24967. /* Set start of data to beginning of buffer. */
  24968. idx = 0;
  24969. /* Decode the key assuming it is a Dilithium private key. */
  24970. ret = wc_dilithium_import_private_only(ssl->buffers.key->buffer,
  24971. ssl->buffers.key->length,
  24972. (dilithium_key*)ssl->hsKey);
  24973. if (ret == 0) {
  24974. WOLFSSL_MSG("Using Dilithium private key");
  24975. /* Check it meets the minimum Dilithium key size requirements. */
  24976. keySz = wc_dilithium_size((dilithium_key*)ssl->hsKey);
  24977. if (keySz < ssl->options.minDilithiumKeySz) {
  24978. WOLFSSL_MSG("Dilithium key size too small");
  24979. ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk);
  24980. }
  24981. /* Return the maximum signature length. */
  24982. *length = wc_dilithium_sig_size((dilithium_key*)ssl->hsKey);
  24983. goto exit_dpk;
  24984. }
  24985. }
  24986. #endif /* HAVE_DILITHIUM */
  24987. #endif /* HAVE_PQC */
  24988. (void)idx;
  24989. (void)keySz;
  24990. (void)length;
  24991. exit_dpk:
  24992. if (ret != 0) {
  24993. WOLFSSL_ERROR_VERBOSE(ret);
  24994. }
  24995. return ret;
  24996. }
  24997. #if defined(WOLFSSL_DUAL_ALG_CERTS)
  24998. /* This is just like the above, but only consider RSA, ECC, Falcon and
  24999. * Dilthium; Furthermore, use the alternative key, not the native key.
  25000. */
  25001. int DecodeAltPrivateKey(WOLFSSL *ssl, word32* length)
  25002. {
  25003. int ret = BAD_FUNC_ARG;
  25004. int keySz;
  25005. word32 idx;
  25006. /* make sure alt private key exists */
  25007. if (ssl->buffers.altKey == NULL || ssl->buffers.altKey->buffer == NULL) {
  25008. WOLFSSL_MSG("Alternative Private key missing!");
  25009. ERROR_OUT(NO_PRIVATE_KEY, exit_dapk);
  25010. }
  25011. #ifdef WOLF_PRIVATE_KEY_ID
  25012. if (ssl->buffers.altKeyDevId != INVALID_DEVID &&
  25013. (ssl->buffers.altKeyId || ssl->buffers.altKeyLabel)) {
  25014. if (ssl->buffers.altKeyType == rsa_sa_algo)
  25015. ssl->hsAltType = DYNAMIC_TYPE_RSA;
  25016. else if (ssl->buffers.altKeyType == ecc_dsa_sa_algo)
  25017. ssl->hsAltType = DYNAMIC_TYPE_ECC;
  25018. else if ((ssl->buffers.altKeyType == falcon_level1_sa_algo) ||
  25019. (ssl->buffers.altKeyType == falcon_level5_sa_algo))
  25020. ssl->hsAltType = DYNAMIC_TYPE_FALCON;
  25021. else if ((ssl->buffers.altKeyType == dilithium_level2_sa_algo) ||
  25022. (ssl->buffers.altKeyType == dilithium_level3_sa_algo) ||
  25023. (ssl->buffers.altKeyType == dilithium_level5_sa_algo))
  25024. ssl->hsAltType = DYNAMIC_TYPE_DILITHIUM;
  25025. ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
  25026. if (ret != 0) {
  25027. goto exit_dapk;
  25028. }
  25029. if (ssl->buffers.altKeyType == rsa_sa_algo) {
  25030. #ifndef NO_RSA
  25031. if (ssl->buffers.altKeyLabel) {
  25032. ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsAltKey,
  25033. (char*)ssl->buffers.altKey->buffer,
  25034. ssl->heap, ssl->buffers.altKeyDevId);
  25035. }
  25036. else if (ssl->buffers.altKeyId) {
  25037. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsAltKey,
  25038. ssl->buffers.altKey->buffer,
  25039. ssl->buffers.altKey->length, ssl->heap,
  25040. ssl->buffers.altKeyDevId);
  25041. }
  25042. if (ret == 0) {
  25043. if (ssl->buffers.altKeySz < ssl->options.minRsaKeySz) {
  25044. WOLFSSL_MSG("RSA key size too small");
  25045. ERROR_OUT(RSA_KEY_SIZE_E, exit_dapk);
  25046. }
  25047. /* Return the maximum signature length. */
  25048. *length = ssl->buffers.altKeySz;
  25049. }
  25050. #else
  25051. ret = NOT_COMPILED_IN;
  25052. #endif
  25053. }
  25054. else if (ssl->buffers.altKeyType == ecc_dsa_sa_algo) {
  25055. #ifdef HAVE_ECC
  25056. if (ssl->buffers.altKeyLabel) {
  25057. ret = wc_ecc_init_label((ecc_key*)ssl->hsAltKey,
  25058. (char*)ssl->buffers.altKey->buffer,
  25059. ssl->heap, ssl->buffers.altKeyDevId);
  25060. }
  25061. else if (ssl->buffers.altKeyId) {
  25062. ret = wc_ecc_init_id((ecc_key*)ssl->hsAltKey,
  25063. ssl->buffers.altKey->buffer,
  25064. ssl->buffers.altKey->length, ssl->heap,
  25065. ssl->buffers.altKeyDevId);
  25066. }
  25067. if (ret == 0) {
  25068. if (ssl->buffers.altKeySz < ssl->options.minEccKeySz) {
  25069. WOLFSSL_MSG("ECC key size too small");
  25070. ERROR_OUT(ECC_KEY_SIZE_E, exit_dapk);
  25071. }
  25072. /* Return the maximum signature length. */
  25073. *length = wc_ecc_sig_size_calc(ssl->buffers.altKeySz);
  25074. }
  25075. #else
  25076. ret = NOT_COMPILED_IN;
  25077. #endif
  25078. }
  25079. else if ((ssl->buffers.altKeyType == falcon_level1_sa_algo) ||
  25080. (ssl->buffers.altKeyType == falcon_level5_sa_algo)) {
  25081. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  25082. if (ssl->buffers.altKeyLabel) {
  25083. ret = wc_falcon_init_label((falcon_key*)ssl->hsAltKey,
  25084. (char*)ssl->buffers.altKey->buffer,
  25085. ssl->heap, ssl->buffers.altKeyDevId);
  25086. }
  25087. else if (ssl->buffers.altKeyId) {
  25088. ret = wc_falcon_init_id((falcon_key*)ssl->hsAltKey,
  25089. ssl->buffers.altKey->buffer,
  25090. ssl->buffers.altKey->length, ssl->heap,
  25091. ssl->buffers.altKeyDevId);
  25092. }
  25093. if (ret == 0) {
  25094. if (ssl->buffers.altKeyType == falcon_level1_sa_algo) {
  25095. ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 1);
  25096. }
  25097. else if (ssl->buffers.altKeyType == falcon_level5_sa_algo) {
  25098. ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 5);
  25099. }
  25100. }
  25101. if (ret == 0) {
  25102. if (ssl->buffers.altKeySz < ssl->options.minFalconKeySz) {
  25103. WOLFSSL_MSG("Falcon key size too small");
  25104. ERROR_OUT(FALCON_KEY_SIZE_E, exit_dapk);
  25105. }
  25106. /* Return the maximum signature length. */
  25107. *length = wc_falcon_sig_size((falcon_key*)ssl->hsAltKey);
  25108. }
  25109. #else
  25110. ret = NOT_COMPILED_IN;
  25111. #endif
  25112. }
  25113. else if ((ssl->buffers.altKeyType == dilithium_level2_sa_algo) ||
  25114. (ssl->buffers.altKeyType == dilithium_level3_sa_algo) ||
  25115. (ssl->buffers.altKeyType == dilithium_level5_sa_algo)) {
  25116. #if defined(HAVE_PQC) && defined(HAVE_DILITHIUM)
  25117. if (ssl->buffers.altKeyLabel) {
  25118. ret = wc_dilithium_init_label((dilithium_key*)ssl->hsAltKey,
  25119. (char*)ssl->buffers.altKey->buffer,
  25120. ssl->heap, ssl->buffers.altKeyDevId);
  25121. }
  25122. else if (ssl->buffers.altKeyId) {
  25123. ret = wc_dilithium_init_id((dilithium_key*)ssl->hsAltKey,
  25124. ssl->buffers.altKey->buffer,
  25125. ssl->buffers.altKey->length, ssl->heap,
  25126. ssl->buffers.altKeyDevId);
  25127. }
  25128. if (ret == 0) {
  25129. if (ssl->buffers.altKeyType == dilithium_level2_sa_algo) {
  25130. ret = wc_dilithium_set_level(
  25131. (dilithium_key*)ssl->hsAltKey, 2);
  25132. }
  25133. else if (ssl->buffers.altKeyType == dilithium_level3_sa_algo) {
  25134. ret = wc_dilithium_set_level(
  25135. (dilithium_key*)ssl->hsAltKey, 3);
  25136. }
  25137. else if (ssl->buffers.altKeyType == dilithium_level5_sa_algo) {
  25138. ret = wc_dilithium_set_level(
  25139. (dilithium_key*)ssl->hsAltKey, 5);
  25140. }
  25141. }
  25142. if (ret == 0) {
  25143. if (ssl->buffers.altKeySz < ssl->options.minDilithiumKeySz) {
  25144. WOLFSSL_MSG("Dilithium key size too small");
  25145. ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dapk);
  25146. }
  25147. /* Return the maximum signature length. */
  25148. *length = wc_dilithium_sig_size(
  25149. (dilithium_key*)ssl->hsAltKey);
  25150. }
  25151. #else
  25152. ret = NOT_COMPILED_IN;
  25153. #endif
  25154. }
  25155. goto exit_dapk;
  25156. }
  25157. #endif /* WOLF_PRIVATE_KEY_ID */
  25158. #ifndef NO_RSA
  25159. if (ssl->buffers.altKeyType == rsa_sa_algo ||
  25160. ssl->buffers.altKeyType == 0) {
  25161. ssl->hsAltType = DYNAMIC_TYPE_RSA;
  25162. ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
  25163. if (ret != 0) {
  25164. goto exit_dapk;
  25165. }
  25166. WOLFSSL_MSG("Trying RSA private key");
  25167. /* Set start of data to beginning of buffer. */
  25168. idx = 0;
  25169. /* Decode the key assuming it is an RSA private key. */
  25170. ret = wc_RsaPrivateKeyDecode(ssl->buffers.altKey->buffer, &idx,
  25171. (RsaKey*)ssl->hsAltKey, ssl->buffers.altKey->length);
  25172. #ifdef WOLF_PRIVATE_KEY_ID
  25173. /* if using external key then allow using a public key */
  25174. if (ret != 0 && (ssl->devId != INVALID_DEVID
  25175. #ifdef HAVE_PK_CALLBACKS
  25176. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  25177. #endif
  25178. )) {
  25179. WOLFSSL_MSG("Trying RSA public key with crypto callbacks");
  25180. idx = 0;
  25181. ret = wc_RsaPublicKeyDecode(ssl->buffers.altKey->buffer, &idx,
  25182. (RsaKey*)ssl->hsAltKey, ssl->buffers.altKey->length);
  25183. }
  25184. #endif
  25185. if (ret == 0) {
  25186. WOLFSSL_MSG("Using RSA private key");
  25187. /* It worked so check it meets minimum key size requirements. */
  25188. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsAltKey);
  25189. if (keySz < 0) { /* check if keySz has error case */
  25190. ERROR_OUT(keySz, exit_dapk);
  25191. }
  25192. if (keySz < ssl->options.minRsaKeySz) {
  25193. WOLFSSL_MSG("RSA key size too small");
  25194. ERROR_OUT(RSA_KEY_SIZE_E, exit_dapk);
  25195. }
  25196. /* Return the maximum signature length. */
  25197. *length = keySz;
  25198. goto exit_dapk;
  25199. }
  25200. }
  25201. #endif /* !NO_RSA */
  25202. #ifdef HAVE_ECC
  25203. #ifndef NO_RSA
  25204. FreeKey(ssl, ssl->hsAltType, (void**)&ssl->hsAltKey);
  25205. #endif /* !NO_RSA */
  25206. if (ssl->buffers.altKeyType == ecc_dsa_sa_algo ||
  25207. ssl->buffers.altKeyType == 0
  25208. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  25209. || ssl->buffers.altKeyType == sm2_sa_algo
  25210. #endif
  25211. ) {
  25212. ssl->hsAltType = DYNAMIC_TYPE_ECC;
  25213. ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
  25214. if (ret != 0) {
  25215. goto exit_dapk;
  25216. }
  25217. #ifndef NO_RSA
  25218. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  25219. #else
  25220. WOLFSSL_MSG("Trying ECC private key");
  25221. #endif
  25222. /* Set start of data to beginning of buffer. */
  25223. idx = 0;
  25224. /* Decode the key assuming it is an ECC private key. */
  25225. ret = wc_EccPrivateKeyDecode(ssl->buffers.altKey->buffer, &idx,
  25226. (ecc_key*)ssl->hsAltKey,
  25227. ssl->buffers.altKey->length);
  25228. #ifdef WOLF_PRIVATE_KEY_ID
  25229. /* if using external key then allow using a public key */
  25230. if (ret != 0 && (ssl->devId != INVALID_DEVID
  25231. #ifdef HAVE_PK_CALLBACKS
  25232. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  25233. #endif
  25234. )) {
  25235. WOLFSSL_MSG("Trying ECC public key with crypto callbacks");
  25236. idx = 0;
  25237. ret = wc_EccPublicKeyDecode(ssl->buffers.altKey->buffer, &idx,
  25238. (ecc_key*)ssl->hsAltKey,
  25239. ssl->buffers.altKey->length);
  25240. }
  25241. #endif
  25242. if (ret == 0) {
  25243. WOLFSSL_MSG("Using ECC private key");
  25244. /* Check it meets the minimum ECC key size requirements. */
  25245. keySz = wc_ecc_size((ecc_key*)ssl->hsAltKey);
  25246. if (keySz < ssl->options.minEccKeySz) {
  25247. WOLFSSL_MSG("ECC key size too small");
  25248. ERROR_OUT(ECC_KEY_SIZE_E, exit_dapk);
  25249. }
  25250. /* Return the maximum signature length. */
  25251. *length = wc_ecc_sig_size((ecc_key*)ssl->hsAltKey);
  25252. goto exit_dapk;
  25253. }
  25254. }
  25255. #endif
  25256. #if defined(HAVE_PQC)
  25257. #if defined(HAVE_FALCON)
  25258. #if !defined(NO_RSA) || defined(HAVE_ECC)
  25259. FreeKey(ssl, ssl->hsAltType, (void**)&ssl->hsAltKey);
  25260. #endif
  25261. if (ssl->buffers.altKeyType == falcon_level1_sa_algo ||
  25262. ssl->buffers.altKeyType == falcon_level5_sa_algo ||
  25263. ssl->buffers.altKeyType == 0) {
  25264. ssl->hsAltType = DYNAMIC_TYPE_FALCON;
  25265. ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
  25266. if (ret != 0) {
  25267. goto exit_dapk;
  25268. }
  25269. if (ssl->buffers.altKeyType == falcon_level1_sa_algo) {
  25270. ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 1);
  25271. }
  25272. else if (ssl->buffers.altKeyType == falcon_level5_sa_algo) {
  25273. ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 5);
  25274. }
  25275. else {
  25276. /* What if ssl->buffers.keyType is 0? We might want to do something
  25277. * more graceful here. */
  25278. ret = ALGO_ID_E;
  25279. }
  25280. if (ret != 0) {
  25281. goto exit_dapk;
  25282. }
  25283. #if defined(HAVE_ECC)
  25284. WOLFSSL_MSG("Trying Falcon private key, ECC didn't work");
  25285. #elif !defined(NO_RSA)
  25286. WOLFSSL_MSG("Trying Falcon private key, RSA didn't work");
  25287. #else
  25288. WOLFSSL_MSG("Trying Falcon private key");
  25289. #endif
  25290. /* Set start of data to beginning of buffer. */
  25291. idx = 0;
  25292. /* Decode the key assuming it is a Falcon private key. */
  25293. ret = wc_falcon_import_private_only(ssl->buffers.altKey->buffer,
  25294. ssl->buffers.altKey->length,
  25295. (falcon_key*)ssl->hsAltKey);
  25296. if (ret == 0) {
  25297. WOLFSSL_MSG("Using Falcon private key");
  25298. /* Check it meets the minimum Falcon key size requirements. */
  25299. keySz = wc_falcon_size((falcon_key*)ssl->hsAltKey);
  25300. if (keySz < ssl->options.minFalconKeySz) {
  25301. WOLFSSL_MSG("Falcon key size too small");
  25302. ERROR_OUT(FALCON_KEY_SIZE_E, exit_dapk);
  25303. }
  25304. /* Return the maximum signature length. */
  25305. *length = wc_falcon_sig_size((falcon_key*)ssl->hsAltKey);
  25306. goto exit_dapk;
  25307. }
  25308. }
  25309. #endif /* HAVE_FALCON */
  25310. #if defined(HAVE_DILITHIUM)
  25311. #if !defined(NO_RSA) || defined(HAVE_ECC)
  25312. FreeKey(ssl, ssl->hsAltType, (void**)&ssl->hsAltKey);
  25313. #endif
  25314. if (ssl->buffers.altKeyType == dilithium_level2_sa_algo ||
  25315. ssl->buffers.altKeyType == dilithium_level3_sa_algo ||
  25316. ssl->buffers.altKeyType == dilithium_level5_sa_algo ||
  25317. ssl->buffers.altKeyType == 0) {
  25318. ssl->hsAltType = DYNAMIC_TYPE_DILITHIUM;
  25319. ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey);
  25320. if (ret != 0) {
  25321. goto exit_dapk;
  25322. }
  25323. if (ssl->buffers.altKeyType == dilithium_level2_sa_algo) {
  25324. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsAltKey, 2);
  25325. }
  25326. else if (ssl->buffers.altKeyType == dilithium_level3_sa_algo) {
  25327. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsAltKey, 3);
  25328. }
  25329. else if (ssl->buffers.altKeyType == dilithium_level5_sa_algo) {
  25330. ret = wc_dilithium_set_level((dilithium_key*)ssl->hsAltKey, 5);
  25331. }
  25332. else {
  25333. /* What if ssl->buffers.keyType is 0? We might want to do something
  25334. * more graceful here. */
  25335. ret = ALGO_ID_E;
  25336. }
  25337. if (ret != 0) {
  25338. goto exit_dapk;
  25339. }
  25340. #if defined(HAVE_FALCON)
  25341. WOLFSSL_MSG("Trying Dilithium private key, Falcon didn't work");
  25342. #elif defined(HAVE_ECC)
  25343. WOLFSSL_MSG("Trying Dilithium private key, ECC didn't work");
  25344. #elif !defined(NO_RSA)
  25345. WOLFSSL_MSG("Trying Dilithium private key, RSA didn't work");
  25346. #else
  25347. WOLFSSL_MSG("Trying Dilithium private key");
  25348. #endif
  25349. /* Set start of data to beginning of buffer. */
  25350. idx = 0;
  25351. /* Decode the key assuming it is a Dilithium private key. */
  25352. ret = wc_dilithium_import_private_only(ssl->buffers.altKey->buffer,
  25353. ssl->buffers.altKey->length,
  25354. (dilithium_key*)ssl->hsAltKey);
  25355. if (ret == 0) {
  25356. WOLFSSL_MSG("Using Dilithium private key");
  25357. /* Check it meets the minimum Dilithium key size requirements. */
  25358. keySz = wc_dilithium_size((dilithium_key*)ssl->hsAltKey);
  25359. if (keySz < ssl->options.minDilithiumKeySz) {
  25360. WOLFSSL_MSG("Dilithium key size too small");
  25361. ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dapk);
  25362. }
  25363. /* Return the maximum signature length. */
  25364. *length = wc_dilithium_sig_size((dilithium_key*)ssl->hsAltKey);
  25365. goto exit_dapk;
  25366. }
  25367. }
  25368. #endif /* HAVE_DILITHIUM */
  25369. #endif /* HAVE_PQC */
  25370. (void)idx;
  25371. (void)keySz;
  25372. (void)length;
  25373. exit_dapk:
  25374. if (ret != 0) {
  25375. WOLFSSL_ERROR_VERBOSE(ret);
  25376. }
  25377. return ret;
  25378. }
  25379. #endif /* WOLFSSL_DUAL_ALG_CERTS */
  25380. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  25381. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  25382. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  25383. int TLSv1_3_Capable(WOLFSSL* ssl)
  25384. {
  25385. #ifndef WOLFSSL_TLS13
  25386. return 0;
  25387. #else
  25388. int ret = 0;
  25389. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  25390. ret = 1;
  25391. }
  25392. if ((wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_3)) {
  25393. /* option set at run time to disable TLS 1.3 */
  25394. ret = 0;
  25395. }
  25396. return ret;
  25397. #endif
  25398. }
  25399. #endif /* WOLFSSL_TLS13 */
  25400. #ifndef WOLFSSL_NO_TLS12
  25401. #if (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC) || \
  25402. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))) || \
  25403. (!defined(NO_WOLFSSL_SERVER) && (defined(HAVE_ECC) || \
  25404. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  25405. (defined(HAVE_ED25519) || defined(HAVE_ED448) || !defined(NO_RSA)))) || \
  25406. (!defined(NO_DH) && (!defined(NO_RSA) || defined(HAVE_ANON))))
  25407. /* Returns whether the signature algorithm requires caching of messages.
  25408. *
  25409. * @param [in] sigAlgo Signature algorithm.
  25410. * @return 1 when caching required.
  25411. * @return 0 when caching not required.
  25412. */
  25413. static int SigAlgoCachesMsgs(int sigAlgo)
  25414. {
  25415. int ret;
  25416. (void)sigAlgo;
  25417. #ifdef HAVE_ED25519
  25418. if (sigAlgo == ed25519_sa_algo) {
  25419. ret = 1;
  25420. }
  25421. else
  25422. #endif
  25423. #ifdef HAVE_ED448
  25424. if (sigAlgo == ed448_sa_algo) {
  25425. ret = 1;
  25426. }
  25427. else
  25428. #endif
  25429. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  25430. if (sigAlgo == sm2_sa_algo) {
  25431. ret = 1;
  25432. }
  25433. else
  25434. #endif
  25435. {
  25436. ret = 0;
  25437. }
  25438. return ret;
  25439. }
  25440. static int HashSkeData(WOLFSSL* ssl, enum wc_HashType hashType,
  25441. const byte* data, word32 sz, byte sigAlgo)
  25442. {
  25443. int ret = 0;
  25444. int digest_sz = wc_HashGetDigestSize(hashType);
  25445. if (digest_sz <= 0) {
  25446. ret = BUFFER_ERROR;
  25447. }
  25448. if (ret == 0) {
  25449. word32 new_size = SEED_LEN;
  25450. /* buffer for signature */
  25451. if (! WC_SAFE_SUM_WORD32(new_size, sz, new_size))
  25452. ret = MEMORY_E;
  25453. else {
  25454. ssl->buffers.sig.buffer = (byte*)XMALLOC(new_size, ssl->heap,
  25455. DYNAMIC_TYPE_SIGNATURE);
  25456. if (ssl->buffers.sig.buffer == NULL) {
  25457. ret = MEMORY_E;
  25458. }
  25459. }
  25460. }
  25461. if (ret == 0) {
  25462. ssl->buffers.sig.length = SEED_LEN + sz;
  25463. /* build message to hash */
  25464. XMEMCPY(ssl->buffers.sig.buffer, ssl->arrays->clientRandom, RAN_LEN);
  25465. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN], ssl->arrays->serverRandom,
  25466. RAN_LEN);
  25467. /* message */
  25468. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2], data, sz);
  25469. }
  25470. if (ret == 0 && !SigAlgoCachesMsgs(sigAlgo)) {
  25471. ssl->buffers.digest.length = (unsigned int)digest_sz;
  25472. /* buffer for hash */
  25473. if (!ssl->buffers.digest.buffer) {
  25474. if (!ssl->options.dontFreeDigest) {
  25475. XFREE(ssl->buffers.digest.buffer, ssl->heap,
  25476. DYNAMIC_TYPE_DIGEST);
  25477. }
  25478. }
  25479. ssl->options.dontFreeDigest = 0;
  25480. ssl->buffers.digest.buffer = (byte*)XMALLOC(ssl->buffers.digest.length,
  25481. ssl->heap, DYNAMIC_TYPE_DIGEST);
  25482. if (ssl->buffers.digest.buffer == NULL) {
  25483. ret = MEMORY_E;
  25484. }
  25485. }
  25486. if (ret == 0 && !SigAlgoCachesMsgs(sigAlgo)) {
  25487. /* Perform hash. Only wc_Hash supports MD5_SHA1. */
  25488. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  25489. ssl->buffers.sig.length,
  25490. ssl->buffers.digest.buffer,
  25491. ssl->buffers.digest.length);
  25492. #ifdef HAVE_PK_CALLBACKS
  25493. if (ssl->ctx->ProcessServerSigKexCb == NULL)
  25494. #endif
  25495. {
  25496. /* No further processing will be done. It can be freed. */
  25497. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25498. ssl->buffers.sig.buffer = NULL;
  25499. }
  25500. }
  25501. return ret;
  25502. }
  25503. #endif
  25504. #endif /* !WOLFSSL_NO_TLS12 */
  25505. /* client only parts */
  25506. #ifndef NO_WOLFSSL_CLIENT
  25507. int HaveUniqueSessionObj(WOLFSSL* ssl)
  25508. {
  25509. if (ssl->session->ref.count > 1) {
  25510. WOLFSSL_SESSION* newSession = wolfSSL_SESSION_dup(ssl->session);
  25511. if (newSession == NULL) {
  25512. WOLFSSL_MSG("Session duplicate failed");
  25513. return 0;
  25514. }
  25515. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  25516. ssl->session = newSession;
  25517. }
  25518. return 1;
  25519. }
  25520. #ifndef WOLFSSL_NO_TLS12
  25521. /* handle generation of client_hello (1) */
  25522. int SendClientHello(WOLFSSL* ssl)
  25523. {
  25524. byte *output;
  25525. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  25526. int sendSz;
  25527. int idSz;
  25528. int ret;
  25529. word32 extSz = 0;
  25530. const Suites* suites;
  25531. if (ssl == NULL) {
  25532. return BAD_FUNC_ARG;
  25533. }
  25534. #ifdef WOLFSSL_TLS13
  25535. if (IsAtLeastTLSv1_3(ssl->version))
  25536. return SendTls13ClientHello(ssl);
  25537. #endif
  25538. #ifdef HAVE_SECURE_RENEGOTIATION
  25539. /* We don't want to resume in SCR */
  25540. if (IsSCR(ssl))
  25541. ssl->options.resuming = 0;
  25542. #endif
  25543. idSz = ssl->options.resuming ? ssl->session->sessionIDSz : 0;
  25544. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  25545. WOLFSSL_ENTER("SendClientHello");
  25546. suites = WOLFSSL_SUITES(ssl);
  25547. if (suites == NULL) {
  25548. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  25549. return SUITES_ERROR;
  25550. }
  25551. #ifdef HAVE_SESSION_TICKET
  25552. if (ssl->options.resuming && ssl->session->ticketLen > 0) {
  25553. SessionTicket* ticket;
  25554. ticket = TLSX_SessionTicket_Create(0, ssl->session->ticket,
  25555. ssl->session->ticketLen, ssl->heap);
  25556. if (ticket == NULL) return MEMORY_E;
  25557. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  25558. if (ret != WOLFSSL_SUCCESS) {
  25559. TLSX_SessionTicket_Free(ticket, ssl->heap);
  25560. return ret;
  25561. }
  25562. idSz = 0;
  25563. }
  25564. #endif
  25565. length = VERSION_SZ + RAN_LEN
  25566. + idSz + ENUM_LEN
  25567. + SUITE_LEN
  25568. + COMP_LEN + ENUM_LEN;
  25569. #ifndef NO_FORCE_SCR_SAME_SUITE
  25570. if (IsSCR(ssl))
  25571. length += SUITE_LEN;
  25572. else
  25573. #endif
  25574. length += suites->suiteSz;
  25575. #ifdef HAVE_TLS_EXTENSIONS
  25576. /* auto populate extensions supported unless user defined */
  25577. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  25578. return ret;
  25579. extSz = 0;
  25580. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  25581. if (ret != 0)
  25582. return ret;
  25583. length += extSz;
  25584. #else
  25585. if (IsAtLeastTLSv1_2(ssl) && suites->hashSigAlgoSz)
  25586. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  25587. + suites->hashSigAlgoSz;
  25588. #ifdef HAVE_EXTENDED_MASTER
  25589. if (ssl->options.haveEMS)
  25590. extSz += HELLO_EXT_SZ;
  25591. #endif
  25592. if (extSz != 0)
  25593. length += extSz + HELLO_EXT_SZ_SZ;
  25594. #endif
  25595. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  25596. if (ssl->arrays == NULL) {
  25597. return BAD_FUNC_ARG;
  25598. }
  25599. #ifdef WOLFSSL_DTLS
  25600. if (ssl->options.dtls) {
  25601. length += ENUM_LEN; /* cookie */
  25602. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  25603. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  25604. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  25605. }
  25606. #endif
  25607. if (IsEncryptionOn(ssl, 1))
  25608. sendSz += MAX_MSG_EXTRA;
  25609. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  25610. * is not advanced yet */
  25611. ssl->options.buildingMsg = 1;
  25612. /* check for available size */
  25613. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  25614. return ret;
  25615. /* get output buffer */
  25616. output = GetOutputBuffer(ssl);
  25617. AddHeaders(output, length, client_hello, ssl);
  25618. /* client hello, first version */
  25619. output[idx++] = ssl->version.major;
  25620. output[idx++] = ssl->version.minor;
  25621. ssl->chVersion = ssl->version; /* store in case changed */
  25622. /* then random */
  25623. if (ssl->options.connectState == CONNECT_BEGIN) {
  25624. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  25625. if (ret != 0)
  25626. return ret;
  25627. /* store random */
  25628. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  25629. } else {
  25630. #ifdef WOLFSSL_DTLS
  25631. /* send same random on hello again */
  25632. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  25633. #endif
  25634. }
  25635. idx += RAN_LEN;
  25636. /* then session id */
  25637. output[idx++] = (byte)idSz;
  25638. if (idSz) {
  25639. XMEMCPY(output + idx, ssl->session->sessionID,
  25640. ssl->session->sessionIDSz);
  25641. idx += ssl->session->sessionIDSz;
  25642. }
  25643. /* then DTLS cookie */
  25644. #ifdef WOLFSSL_DTLS
  25645. if (ssl->options.dtls) {
  25646. byte cookieSz = ssl->arrays->cookieSz;
  25647. output[idx++] = cookieSz;
  25648. if (cookieSz) {
  25649. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  25650. idx += cookieSz;
  25651. }
  25652. }
  25653. #endif
  25654. #ifndef NO_FORCE_SCR_SAME_SUITE
  25655. if (IsSCR(ssl)) {
  25656. c16toa(SUITE_LEN, output + idx);
  25657. idx += OPAQUE16_LEN;
  25658. output[idx++] = ssl->options.cipherSuite0;
  25659. output[idx++] = ssl->options.cipherSuite;
  25660. }
  25661. else
  25662. #endif
  25663. {
  25664. /* then cipher suites */
  25665. c16toa(suites->suiteSz, output + idx);
  25666. idx += OPAQUE16_LEN;
  25667. XMEMCPY(output + idx, &suites->suites, suites->suiteSz);
  25668. idx += suites->suiteSz;
  25669. }
  25670. /* last, compression */
  25671. output[idx++] = COMP_LEN;
  25672. if (ssl->options.usingCompression)
  25673. output[idx++] = ZLIB_COMPRESSION;
  25674. else
  25675. output[idx++] = NO_COMPRESSION;
  25676. #ifdef HAVE_TLS_EXTENSIONS
  25677. extSz = 0;
  25678. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  25679. if (ret != 0)
  25680. return ret;
  25681. idx += extSz;
  25682. (void)idx; /* suppress analyzer warning, keep idx current */
  25683. #else
  25684. if (extSz != 0) {
  25685. c16toa(extSz, output + idx);
  25686. idx += HELLO_EXT_SZ_SZ;
  25687. if (IsAtLeastTLSv1_2(ssl)) {
  25688. if (suites->hashSigAlgoSz) {
  25689. word16 i;
  25690. /* extension type */
  25691. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  25692. idx += HELLO_EXT_TYPE_SZ;
  25693. /* extension data length */
  25694. c16toa(HELLO_EXT_SIGALGO_SZ + suites->hashSigAlgoSz,
  25695. output + idx);
  25696. idx += HELLO_EXT_SZ_SZ;
  25697. /* sig algos length */
  25698. c16toa(suites->hashSigAlgoSz, output + idx);
  25699. idx += HELLO_EXT_SIGALGO_SZ;
  25700. for (i=0; i < suites->hashSigAlgoSz; i++, idx++) {
  25701. output[idx] = suites->hashSigAlgo[i];
  25702. }
  25703. }
  25704. }
  25705. #ifdef HAVE_EXTENDED_MASTER
  25706. if (ssl->options.haveEMS) {
  25707. c16toa(HELLO_EXT_EXTMS, output + idx);
  25708. idx += HELLO_EXT_TYPE_SZ;
  25709. c16toa(0, output + idx);
  25710. idx += HELLO_EXT_SZ_SZ;
  25711. }
  25712. #endif
  25713. }
  25714. #endif
  25715. if (IsEncryptionOn(ssl, 1)) {
  25716. byte* input;
  25717. int inputSz = idx; /* build msg adds rec hdr */
  25718. int recordHeaderSz = RECORD_HEADER_SZ;
  25719. if (ssl->options.dtls)
  25720. recordHeaderSz += DTLS_RECORD_EXTRA;
  25721. inputSz -= recordHeaderSz;
  25722. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25723. if (input == NULL)
  25724. return MEMORY_E;
  25725. XMEMCPY(input, output + recordHeaderSz, inputSz);
  25726. #ifdef WOLFSSL_DTLS
  25727. if (IsDtlsNotSctpMode(ssl) &&
  25728. (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
  25729. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25730. return ret;
  25731. }
  25732. #endif
  25733. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  25734. handshake, 1, 0, 0, CUR_ORDER);
  25735. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25736. if (sendSz < 0)
  25737. return sendSz;
  25738. } else {
  25739. #ifdef WOLFSSL_DTLS
  25740. if (IsDtlsNotSctpMode(ssl)) {
  25741. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
  25742. return ret;
  25743. }
  25744. if (ssl->options.dtls)
  25745. DtlsSEQIncrement(ssl, CUR_ORDER);
  25746. #endif
  25747. ret = HashOutput(ssl, output, sendSz, 0);
  25748. if (ret != 0)
  25749. return ret;
  25750. }
  25751. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  25752. #ifdef OPENSSL_EXTRA
  25753. ssl->cbmode = SSL_CB_MODE_WRITE;
  25754. if (ssl->CBIS != NULL)
  25755. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  25756. #endif
  25757. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  25758. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  25759. if (ssl->toInfoOn) {
  25760. ret = AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  25761. WRITE_PROTO, 0, ssl->heap);
  25762. if (ret != 0)
  25763. return ret;
  25764. }
  25765. #endif
  25766. ssl->options.buildingMsg = 0;
  25767. ssl->buffers.outputBuffer.length += sendSz;
  25768. ret = SendBuffered(ssl);
  25769. WOLFSSL_LEAVE("SendClientHello", ret);
  25770. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  25771. return ret;
  25772. }
  25773. /* handle processing of DTLS hello_verify_request (3) */
  25774. int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  25775. word32 size)
  25776. {
  25777. ProtocolVersion pv;
  25778. byte cookieSz;
  25779. word32 begin = *inOutIdx;
  25780. #ifdef WOLFSSL_CALLBACKS
  25781. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  25782. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  25783. #endif
  25784. #ifdef WOLFSSL_DTLS
  25785. if (ssl->options.dtls) {
  25786. DtlsMsgPoolReset(ssl);
  25787. }
  25788. #endif
  25789. if (OPAQUE16_LEN + OPAQUE8_LEN > size)
  25790. return BUFFER_ERROR;
  25791. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  25792. *inOutIdx += OPAQUE16_LEN;
  25793. if (pv.major != DTLS_MAJOR ||
  25794. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  25795. return VERSION_ERROR;
  25796. cookieSz = input[(*inOutIdx)++];
  25797. if (cookieSz) {
  25798. if ((*inOutIdx - begin) + cookieSz > size)
  25799. return BUFFER_ERROR;
  25800. #ifdef WOLFSSL_DTLS
  25801. if (cookieSz <= MAX_COOKIE_LEN) {
  25802. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  25803. ssl->arrays->cookieSz = cookieSz;
  25804. }
  25805. #endif
  25806. *inOutIdx += cookieSz;
  25807. }
  25808. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13)
  25809. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.dtls) {
  25810. /* we sent a TLSv1.3 ClientHello but received a
  25811. * HELLO_VERIFY_REQUEST. We only check if DTLSv1_3_MINOR is the
  25812. * min downgrade option as per the server_version field comments in
  25813. * https://www.rfc-editor.org/rfc/rfc6347#section-4.2.1 */
  25814. if (!ssl->options.downgrade ||
  25815. ssl->options.minDowngrade <= DTLSv1_3_MINOR)
  25816. return VERSION_ERROR;
  25817. /* Cannot be DTLS1.3 as HELLO_VERIFY_REQUEST */
  25818. ssl->options.tls1_3 = 0;
  25819. }
  25820. #endif /* defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13) */
  25821. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  25822. return 0;
  25823. }
  25824. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  25825. {
  25826. int ret = 0;
  25827. #ifdef HAVE_SECRET_CALLBACK
  25828. /* If a session secret callback exists, we are using that
  25829. * key instead of the saved session key. Requires a ticket. */
  25830. ret = ret || (ssl->sessionSecretCb != NULL
  25831. #ifdef HAVE_SESSION_TICKET
  25832. && ssl->session->ticketLen > 0
  25833. #endif
  25834. );
  25835. #endif
  25836. #ifdef HAVE_SESSION_TICKET
  25837. /* server may send blank ticket which may not be expected to indicate
  25838. * existing one ok but will also be sending a new one */
  25839. ret = ret || (ssl->session->ticketLen > 0);
  25840. #endif
  25841. ret = ret ||
  25842. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  25843. ssl->session->sessionID, ID_LEN) == 0);
  25844. return ret;
  25845. }
  25846. /* Check the version in the received message is valid and set protocol
  25847. * version to use.
  25848. *
  25849. * ssl The SSL/TLS object.
  25850. * pv The protocol version from the packet.
  25851. * returns 0 on success, otherwise failure.
  25852. */
  25853. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  25854. {
  25855. byte lowerVersion, higherVersion;
  25856. #ifdef WOLFSSL_TLS13_DRAFT
  25857. if (pv.major == TLS_DRAFT_MAJOR) {
  25858. pv.major = SSLv3_MAJOR;
  25859. pv.minor = TLSv1_3_MINOR;
  25860. }
  25861. #endif
  25862. #ifdef OPENSSL_EXTRA
  25863. if (ssl->CBIS != NULL) {
  25864. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, WOLFSSL_SUCCESS);
  25865. }
  25866. #endif
  25867. if (ssl->options.dtls) {
  25868. if (pv.major != DTLS_MAJOR || pv.minor == DTLS_BOGUS_MINOR) {
  25869. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  25870. return VERSION_ERROR;
  25871. }
  25872. lowerVersion = pv.minor > ssl->version.minor;
  25873. higherVersion = pv.minor < ssl->version.minor;
  25874. }
  25875. else {
  25876. if (pv.major != SSLv3_MAJOR) {
  25877. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  25878. return VERSION_ERROR;
  25879. }
  25880. lowerVersion = pv.minor < ssl->version.minor;
  25881. higherVersion = pv.minor > ssl->version.minor;
  25882. }
  25883. if (higherVersion) {
  25884. WOLFSSL_MSG("Server using higher version, fatal error");
  25885. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  25886. return VERSION_ERROR;
  25887. }
  25888. if (lowerVersion) {
  25889. WOLFSSL_MSG("server using lower version");
  25890. /* Check for downgrade attack. */
  25891. if (!ssl->options.downgrade) {
  25892. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  25893. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  25894. return VERSION_ERROR;
  25895. }
  25896. if ((!ssl->options.dtls && pv.minor < ssl->options.minDowngrade) ||
  25897. (ssl->options.dtls && pv.minor > ssl->options.minDowngrade)) {
  25898. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  25899. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  25900. return VERSION_ERROR;
  25901. }
  25902. #ifdef HAVE_SECURE_RENEGOTIATION
  25903. if (ssl->secure_renegotiation &&
  25904. ssl->secure_renegotiation->enabled &&
  25905. ssl->options.handShakeDone) {
  25906. WOLFSSL_MSG("Server changed version during scr");
  25907. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  25908. return VERSION_ERROR;
  25909. }
  25910. #endif
  25911. /* Checks made - OK to downgrade. */
  25912. ssl->version.minor = pv.minor;
  25913. switch(pv.minor) {
  25914. case SSLv3_MINOR:
  25915. /* turn off tls */
  25916. WOLFSSL_MSG("\tdowngrading to SSLv3");
  25917. ssl->options.tls = 0;
  25918. ssl->options.tls1_1 = 0;
  25919. break;
  25920. case TLSv1_MINOR:
  25921. /* turn off tls 1.1+ */
  25922. WOLFSSL_MSG("\tdowngrading to TLSv1");
  25923. ssl->options.tls1_1 = 0;
  25924. break;
  25925. case TLSv1_1_MINOR:
  25926. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  25927. break;
  25928. case DTLS_MINOR:
  25929. WOLFSSL_MSG("\tdowngrading to DTLSv1.1");
  25930. break;
  25931. case TLSv1_2_MINOR:
  25932. WOLFSSL_MSG("\tdowngrading to TLSv1.2");
  25933. break;
  25934. case DTLSv1_2_MINOR:
  25935. WOLFSSL_MSG("\tdowngrading to DTLSv1.2");
  25936. break;
  25937. default:
  25938. WOLFSSL_MSG("\tbad minor version");
  25939. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  25940. return VERSION_ERROR;
  25941. }
  25942. }
  25943. /* check if option is set to not allow the current version
  25944. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  25945. if (!ssl->options.dtls && ssl->options.downgrade &&
  25946. ssl->options.mask > 0) {
  25947. if (ssl->version.minor == TLSv1_2_MINOR &&
  25948. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
  25949. WOLFSSL_OP_NO_TLSv1_2) {
  25950. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  25951. ssl->version.minor = TLSv1_1_MINOR;
  25952. }
  25953. if (ssl->version.minor == TLSv1_1_MINOR &&
  25954. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
  25955. WOLFSSL_OP_NO_TLSv1_1) {
  25956. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  25957. ssl->options.tls1_1 = 0;
  25958. ssl->version.minor = TLSv1_MINOR;
  25959. }
  25960. if (ssl->version.minor == TLSv1_MINOR &&
  25961. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
  25962. WOLFSSL_OP_NO_TLSv1) {
  25963. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  25964. ssl->options.tls = 0;
  25965. ssl->options.tls1_1 = 0;
  25966. ssl->version.minor = SSLv3_MINOR;
  25967. }
  25968. if (ssl->version.minor == SSLv3_MINOR &&
  25969. (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
  25970. WOLFSSL_OP_NO_SSLv3) {
  25971. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  25972. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  25973. return VERSION_ERROR;
  25974. }
  25975. if (ssl->version.minor < ssl->options.minDowngrade) {
  25976. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  25977. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  25978. return VERSION_ERROR;
  25979. }
  25980. }
  25981. return 0;
  25982. }
  25983. /* handle processing of server_hello (2) */
  25984. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  25985. word32 helloSz)
  25986. {
  25987. byte cs0; /* cipher suite bytes 0, 1 */
  25988. byte cs1;
  25989. ProtocolVersion pv;
  25990. byte compression;
  25991. word32 i = *inOutIdx;
  25992. word32 begin = i;
  25993. int ret;
  25994. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  25995. WOLFSSL_ENTER("DoServerHello");
  25996. #ifdef WOLFSSL_CALLBACKS
  25997. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  25998. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  25999. #endif
  26000. /* protocol version, random and session id length check */
  26001. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  26002. return BUFFER_ERROR;
  26003. /* protocol version */
  26004. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  26005. i += OPAQUE16_LEN;
  26006. ret = CheckVersion(ssl, pv);
  26007. if (ret != 0) {
  26008. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  26009. return ret;
  26010. }
  26011. #ifdef WOLFSSL_TLS13
  26012. if (IsAtLeastTLSv1_3(pv)) {
  26013. byte type = server_hello;
  26014. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  26015. }
  26016. #endif
  26017. /* random */
  26018. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  26019. i += RAN_LEN;
  26020. /* session id */
  26021. ssl->arrays->sessionIDSz = input[i++];
  26022. if (ssl->arrays->sessionIDSz > ID_LEN) {
  26023. WOLFSSL_MSG("Invalid session ID size");
  26024. ssl->arrays->sessionIDSz = 0;
  26025. return BUFFER_ERROR;
  26026. }
  26027. else if (ssl->arrays->sessionIDSz) {
  26028. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  26029. return BUFFER_ERROR;
  26030. XMEMCPY(ssl->arrays->sessionID, input + i,
  26031. ssl->arrays->sessionIDSz);
  26032. i += ssl->arrays->sessionIDSz;
  26033. ssl->options.haveSessionId = 1;
  26034. }
  26035. /* suite and compression */
  26036. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  26037. return BUFFER_ERROR;
  26038. cs0 = input[i++];
  26039. cs1 = input[i++];
  26040. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  26041. #if defined(HAVE_SECURE_RENEGOTIATION) && !defined(NO_FORCE_SCR_SAME_SUITE)
  26042. if (IsSCR(ssl)) {
  26043. if (ssl->options.cipherSuite0 != cs0 ||
  26044. ssl->options.cipherSuite != cs1) {
  26045. WOLFSSL_MSG("Server changed cipher suite during scr");
  26046. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  26047. return MATCH_SUITE_ERROR;
  26048. }
  26049. }
  26050. else
  26051. #endif
  26052. {
  26053. word32 idx, found = 0;
  26054. const Suites* suites = WOLFSSL_SUITES(ssl);
  26055. /* confirm server_hello cipher suite is one sent in client_hello */
  26056. for (idx = 0; idx < suites->suiteSz; idx += 2) {
  26057. if (suites->suites[idx] == cs0 &&
  26058. suites->suites[idx+1] == cs1) {
  26059. found = 1;
  26060. break;
  26061. }
  26062. }
  26063. if (!found) {
  26064. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  26065. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  26066. return MATCH_SUITE_ERROR;
  26067. }
  26068. }
  26069. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  26070. ssl->options.cipherSuite0 = cs0;
  26071. ssl->options.cipherSuite = cs1;
  26072. #ifdef WOLFSSL_DEBUG_TLS
  26073. WOLFSSL_MSG("Chosen cipher suite:");
  26074. WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
  26075. ssl->options.cipherSuite));
  26076. #endif
  26077. compression = input[i++];
  26078. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  26079. WOLFSSL_MSG("Server forcing compression w/o support");
  26080. WOLFSSL_ERROR_VERBOSE(COMPRESSION_ERROR);
  26081. return COMPRESSION_ERROR;
  26082. }
  26083. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  26084. WOLFSSL_MSG("Server refused compression, turning off");
  26085. ssl->options.usingCompression = 0; /* turn off if server refused */
  26086. }
  26087. *inOutIdx = i;
  26088. #ifdef HAVE_TLS_EXTENSIONS
  26089. if ( (i - begin) < helloSz) {
  26090. if (TLSX_SupportExtensions(ssl)) {
  26091. word16 totalExtSz;
  26092. if ((i - begin) + OPAQUE16_LEN > helloSz)
  26093. return BUFFER_ERROR;
  26094. ato16(&input[i], &totalExtSz);
  26095. i += OPAQUE16_LEN;
  26096. if ((i - begin) + totalExtSz > helloSz)
  26097. return BUFFER_ERROR;
  26098. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  26099. server_hello, NULL)))
  26100. return ret;
  26101. i += totalExtSz;
  26102. *inOutIdx = i;
  26103. }
  26104. else
  26105. *inOutIdx = begin + helloSz; /* skip extensions */
  26106. }
  26107. else
  26108. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  26109. #else
  26110. {
  26111. byte pendingEMS = 0;
  26112. if ( (i - begin) < helloSz) {
  26113. int allowExt = 0;
  26114. if (ssl->version.major == SSLv3_MAJOR &&
  26115. ssl->version.minor >= TLSv1_MINOR) {
  26116. allowExt = 1;
  26117. }
  26118. #ifdef WOLFSSL_DTLS
  26119. if (ssl->version.major == DTLS_MAJOR)
  26120. allowExt = 1;
  26121. #endif
  26122. if (allowExt) {
  26123. word16 totalExtSz;
  26124. if ((i - begin) + OPAQUE16_LEN > helloSz)
  26125. return BUFFER_ERROR;
  26126. ato16(&input[i], &totalExtSz);
  26127. i += OPAQUE16_LEN;
  26128. if ((i - begin) + totalExtSz > helloSz)
  26129. return BUFFER_ERROR;
  26130. while (totalExtSz) {
  26131. word16 extId, extSz;
  26132. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  26133. return BUFFER_ERROR;
  26134. ato16(&input[i], &extId);
  26135. i += OPAQUE16_LEN;
  26136. ato16(&input[i], &extSz);
  26137. i += OPAQUE16_LEN;
  26138. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  26139. return BUFFER_ERROR;
  26140. if (extId == HELLO_EXT_EXTMS)
  26141. pendingEMS = 1;
  26142. else
  26143. i += extSz;
  26144. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  26145. }
  26146. *inOutIdx = i;
  26147. }
  26148. else
  26149. *inOutIdx = begin + helloSz; /* skip extensions */
  26150. }
  26151. if (!pendingEMS && ssl->options.haveEMS)
  26152. ssl->options.haveEMS = 0;
  26153. }
  26154. #endif
  26155. #if defined(WOLFSSL_HARDEN_TLS) && !defined(WOLFSSL_HARDEN_TLS_NO_SCR_CHECK)
  26156. if (ssl->secure_renegotiation == NULL ||
  26157. !ssl->secure_renegotiation->enabled) {
  26158. /* If the server does not acknowledge the extension, the client
  26159. * MUST generate a fatal handshake_failure alert prior to
  26160. * terminating the connection.
  26161. * https://www.rfc-editor.org/rfc/rfc9325#name-renegotiation-in-tls-12 */
  26162. WOLFSSL_MSG("ServerHello did not contain SCR extension");
  26163. return SECURE_RENEGOTIATION_E;
  26164. }
  26165. #endif
  26166. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  26167. if (IsEncryptionOn(ssl, 0)) {
  26168. *inOutIdx += ssl->keys.padSz;
  26169. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  26170. if (ssl->options.startedETMWrite &&
  26171. ssl->specs.cipher_type == block) {
  26172. *inOutIdx += MacSize(ssl);
  26173. }
  26174. #endif
  26175. }
  26176. #ifdef HAVE_SECRET_CALLBACK
  26177. if (ssl->sessionSecretCb != NULL
  26178. #ifdef HAVE_SESSION_TICKET
  26179. && ssl->session->ticketLen > 0
  26180. #endif
  26181. ) {
  26182. int secretSz = SECRET_LEN;
  26183. ret = ssl->sessionSecretCb(ssl, ssl->session->masterSecret,
  26184. &secretSz, ssl->sessionSecretCtx);
  26185. if (ret != 0 || secretSz != SECRET_LEN) {
  26186. WOLFSSL_ERROR_VERBOSE(SESSION_SECRET_CB_E);
  26187. return SESSION_SECRET_CB_E;
  26188. }
  26189. }
  26190. #endif /* HAVE_SECRET_CALLBACK */
  26191. ret = CompleteServerHello(ssl);
  26192. WOLFSSL_LEAVE("DoServerHello", ret);
  26193. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  26194. return ret;
  26195. }
  26196. int CompleteServerHello(WOLFSSL* ssl)
  26197. {
  26198. int ret;
  26199. if (!ssl->options.resuming) {
  26200. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  26201. TLS13_DOWNGRADE_SZ - 1;
  26202. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  26203. #ifdef WOLFSSL_TLS13
  26204. if (TLSv1_3_Capable(ssl)) {
  26205. /* TLS v1.3 capable client not allowed to downgrade when
  26206. * connecting to TLS v1.3 capable server unless cipher suite
  26207. * demands it.
  26208. */
  26209. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  26210. (vers == 0 || vers == 1)) {
  26211. SendAlert(ssl, alert_fatal, illegal_parameter);
  26212. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  26213. return VERSION_ERROR;
  26214. }
  26215. }
  26216. else
  26217. #endif
  26218. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  26219. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  26220. (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0) {
  26221. /* TLS v1.2 capable client not allowed to downgrade when
  26222. * connecting to TLS v1.2 capable server.
  26223. */
  26224. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  26225. vers == 0) {
  26226. SendAlert(ssl, alert_fatal, illegal_parameter);
  26227. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  26228. return VERSION_ERROR;
  26229. }
  26230. }
  26231. }
  26232. else {
  26233. if (DSH_CheckSessionId(ssl)) {
  26234. if (SetCipherSpecs(ssl) == 0) {
  26235. if (!HaveUniqueSessionObj(ssl)) {
  26236. WOLFSSL_MSG("Unable to have unique session object");
  26237. WOLFSSL_ERROR_VERBOSE(MEMORY_ERROR);
  26238. return MEMORY_ERROR;
  26239. }
  26240. XMEMCPY(ssl->arrays->masterSecret,
  26241. ssl->session->masterSecret, SECRET_LEN);
  26242. #ifdef NO_OLD_TLS
  26243. ret = DeriveTlsKeys(ssl);
  26244. #else
  26245. ret = -1; /* default value */
  26246. #ifndef NO_TLS
  26247. if (ssl->options.tls)
  26248. ret = DeriveTlsKeys(ssl);
  26249. #endif
  26250. if (!ssl->options.tls)
  26251. ret = DeriveKeys(ssl);
  26252. #endif /* NO_OLD_TLS */
  26253. /* SERVER: peer auth based on session secret. */
  26254. ssl->options.peerAuthGood = (ret == 0);
  26255. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  26256. return ret;
  26257. }
  26258. else {
  26259. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  26260. WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_SUITE);
  26261. return UNSUPPORTED_SUITE;
  26262. }
  26263. }
  26264. else {
  26265. WOLFSSL_MSG("Server denied resumption attempt");
  26266. ssl->options.resuming = 0; /* server denied resumption try */
  26267. }
  26268. }
  26269. return SetCipherSpecs(ssl);
  26270. }
  26271. #endif /* !WOLFSSL_NO_TLS12 */
  26272. /* Make sure client setup is valid for this suite, true on success */
  26273. int VerifyClientSuite(word16 havePSK, byte cipherSuite0, byte cipherSuite)
  26274. {
  26275. (void)havePSK;
  26276. WOLFSSL_ENTER("VerifyClientSuite");
  26277. if (CipherRequires(cipherSuite0, cipherSuite, REQUIRES_PSK)) {
  26278. WOLFSSL_MSG("Requires PSK");
  26279. #ifndef NO_PSK
  26280. if (havePSK == 0)
  26281. #endif
  26282. {
  26283. WOLFSSL_MSG("Don't have PSK");
  26284. return 0;
  26285. }
  26286. }
  26287. return 1; /* success */
  26288. }
  26289. #ifndef WOLFSSL_NO_TLS12
  26290. #ifndef NO_CERTS
  26291. /* handle processing of certificate_request (13) */
  26292. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  26293. inOutIdx, word32 size)
  26294. {
  26295. word16 len;
  26296. word32 begin = *inOutIdx;
  26297. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
  26298. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  26299. int ret;
  26300. #endif
  26301. #ifdef OPENSSL_EXTRA
  26302. WOLFSSL_X509* x509 = NULL;
  26303. WOLFSSL_EVP_PKEY* pkey = NULL;
  26304. #endif
  26305. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  26306. WOLFSSL_ENTER("DoCertificateRequest");
  26307. #ifdef WOLFSSL_CALLBACKS
  26308. if (ssl->hsInfoOn)
  26309. AddPacketName(ssl, "CertificateRequest");
  26310. if (ssl->toInfoOn)
  26311. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  26312. #endif
  26313. if (OPAQUE8_LEN > size)
  26314. return BUFFER_ERROR;
  26315. len = input[(*inOutIdx)++];
  26316. if ((*inOutIdx - begin) + len > size)
  26317. return BUFFER_ERROR;
  26318. /* types, read in here */
  26319. *inOutIdx += len;
  26320. /* signature and hash signature algorithm */
  26321. if (IsAtLeastTLSv1_2(ssl)) {
  26322. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  26323. return BUFFER_ERROR;
  26324. ato16(input + *inOutIdx, &len);
  26325. *inOutIdx += OPAQUE16_LEN;
  26326. if ((len > size) || ((*inOutIdx - begin) + len > size))
  26327. return BUFFER_ERROR;
  26328. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  26329. ssl->buffers.certificate &&
  26330. ssl->buffers.certificate->buffer) {
  26331. #ifdef HAVE_PK_CALLBACKS
  26332. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  26333. WOLFSSL_MSG("Using PK for client private key");
  26334. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  26335. return INVALID_PARAMETER;
  26336. }
  26337. #endif
  26338. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  26339. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  26340. return INVALID_PARAMETER;
  26341. }
  26342. }
  26343. *inOutIdx += len;
  26344. #ifdef WC_RSA_PSS
  26345. ssl->pssAlgo = 0;
  26346. if (ssl->options.sigAlgo == rsa_pss_sa_algo)
  26347. ssl->pssAlgo |= 1 << ssl->options.hashAlgo;
  26348. #endif
  26349. }
  26350. /* authorities */
  26351. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  26352. return BUFFER_ERROR;
  26353. /* DN seq length */
  26354. ato16(input + *inOutIdx, &len);
  26355. *inOutIdx += OPAQUE16_LEN;
  26356. if ((*inOutIdx - begin) + len > size)
  26357. return BUFFER_ERROR;
  26358. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  26359. if (ssl->client_ca_names != ssl->ctx->client_ca_names)
  26360. wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
  26361. ssl->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  26362. if (ssl->client_ca_names == NULL) {
  26363. return MEMORY_ERROR;
  26364. }
  26365. #endif
  26366. while (len) {
  26367. word16 dnSz;
  26368. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  26369. return BUFFER_ERROR;
  26370. ato16(input + *inOutIdx, &dnSz);
  26371. *inOutIdx += OPAQUE16_LEN;
  26372. if ((*inOutIdx - begin) + dnSz > size)
  26373. return BUFFER_ERROR;
  26374. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  26375. {
  26376. WOLFSSL_X509_NAME* name = NULL;
  26377. /* Use a DecodedCert struct to get access to GetName to
  26378. * parse DN name */
  26379. #ifdef WOLFSSL_SMALL_STACK
  26380. DecodedCert *cert = (DecodedCert *)XMALLOC(
  26381. sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
  26382. if (cert == NULL)
  26383. return MEMORY_ERROR;
  26384. #else
  26385. DecodedCert cert[1];
  26386. #endif
  26387. InitDecodedCert(cert, input + *inOutIdx, dnSz, ssl->heap);
  26388. ret = GetName(cert, SUBJECT, dnSz);
  26389. if (ret == 0) {
  26390. if ((name = wolfSSL_X509_NAME_new_ex(cert->heap)) == NULL)
  26391. ret = MEMORY_ERROR;
  26392. }
  26393. if (ret == 0) {
  26394. CopyDecodedName(name, cert, SUBJECT);
  26395. }
  26396. if (ret == 0) {
  26397. if (wolfSSL_sk_X509_NAME_push(ssl->client_ca_names, name)
  26398. == WOLFSSL_FAILURE)
  26399. {
  26400. ret = MEMORY_ERROR;
  26401. }
  26402. }
  26403. FreeDecodedCert(cert);
  26404. #ifdef WOLFSSL_SMALL_STACK
  26405. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  26406. #endif
  26407. if (ret != 0) {
  26408. if (name != NULL)
  26409. wolfSSL_X509_NAME_free(name);
  26410. return ret;
  26411. }
  26412. }
  26413. #endif
  26414. *inOutIdx += dnSz;
  26415. len -= OPAQUE16_LEN + dnSz;
  26416. }
  26417. #ifdef OPENSSL_EXTRA
  26418. /* call client cert callback if no cert has been loaded */
  26419. if ((ssl->ctx->CBClientCert != NULL) &&
  26420. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  26421. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  26422. if (ret == 1) {
  26423. if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
  26424. (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
  26425. WOLFSSL_ERROR_VERBOSE(CLIENT_CERT_CB_ERROR);
  26426. return CLIENT_CERT_CB_ERROR;
  26427. }
  26428. wolfSSL_X509_free(x509);
  26429. wolfSSL_EVP_PKEY_free(pkey);
  26430. }
  26431. else if (ret < 0) {
  26432. return WOLFSSL_ERROR_WANT_X509_LOOKUP;
  26433. }
  26434. }
  26435. if ((ret = CertSetupCbWrapper(ssl)) != 0)
  26436. return ret;
  26437. #endif
  26438. /* don't send client cert or cert verify if user hasn't provided
  26439. cert and private key */
  26440. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  26441. #ifdef HAVE_PK_CALLBACKS
  26442. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  26443. WOLFSSL_MSG("Using PK for client private key");
  26444. ssl->options.sendVerify = SEND_CERT;
  26445. }
  26446. #endif
  26447. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  26448. ssl->options.sendVerify = SEND_CERT;
  26449. }
  26450. }
  26451. #ifdef OPENSSL_EXTRA
  26452. else
  26453. #else
  26454. else if (IsTLS(ssl) || ssl->options.dtls)
  26455. #endif
  26456. {
  26457. ssl->options.sendVerify = SEND_BLANK_CERT;
  26458. }
  26459. if (IsEncryptionOn(ssl, 0)) {
  26460. *inOutIdx += ssl->keys.padSz;
  26461. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  26462. if (ssl->options.startedETMRead)
  26463. *inOutIdx += MacSize(ssl);
  26464. #endif
  26465. }
  26466. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  26467. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  26468. return 0;
  26469. }
  26470. #endif /* !NO_CERTS */
  26471. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  26472. static int CheckCurveId(int tlsCurveId)
  26473. {
  26474. int ret = ECC_CURVE_ERROR;
  26475. switch (tlsCurveId) {
  26476. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  26477. #ifndef NO_ECC_SECP
  26478. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  26479. #endif /* !NO_ECC_SECP */
  26480. #ifdef HAVE_ECC_SECPR2
  26481. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  26482. #endif /* HAVE_ECC_SECPR2 */
  26483. #ifdef HAVE_ECC_KOBLITZ
  26484. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  26485. #endif /* HAVE_ECC_KOBLITZ */
  26486. #endif
  26487. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  26488. #ifndef NO_ECC_SECP
  26489. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  26490. #endif /* !NO_ECC_SECP */
  26491. #ifdef HAVE_ECC_KOBLITZ
  26492. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  26493. #endif /* HAVE_ECC_KOBLITZ */
  26494. #endif
  26495. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  26496. #ifndef NO_ECC_SECP
  26497. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  26498. #endif /* !NO_ECC_SECP */
  26499. #ifdef HAVE_ECC_KOBLITZ
  26500. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  26501. #endif /* HAVE_ECC_KOBLITZ */
  26502. #endif
  26503. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  26504. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  26505. #endif
  26506. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  26507. #ifndef NO_ECC_SECP
  26508. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  26509. #endif /* !NO_ECC_SECP */
  26510. #ifdef HAVE_ECC_KOBLITZ
  26511. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  26512. #endif /* HAVE_ECC_KOBLITZ */
  26513. #ifdef HAVE_ECC_BRAINPOOL
  26514. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  26515. #endif /* HAVE_ECC_BRAINPOOL */
  26516. #ifdef WOLFSSL_SM2
  26517. case WOLFSSL_ECC_SM2P256V1: return ECC_SM2P256V1_OID;
  26518. #endif /* WOLFSSL_SM2 */
  26519. #endif
  26520. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  26521. case WOLFSSL_ECC_X448: return ECC_X448_OID;
  26522. #endif
  26523. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  26524. #ifndef NO_ECC_SECP
  26525. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  26526. #endif /* !NO_ECC_SECP */
  26527. #ifdef HAVE_ECC_BRAINPOOL
  26528. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  26529. #endif /* HAVE_ECC_BRAINPOOL */
  26530. #endif
  26531. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  26532. #ifdef HAVE_ECC_BRAINPOOL
  26533. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  26534. #endif /* HAVE_ECC_BRAINPOOL */
  26535. #endif
  26536. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  26537. #ifndef NO_ECC_SECP
  26538. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  26539. #endif /* !NO_ECC_SECP */
  26540. #endif
  26541. default: break;
  26542. }
  26543. return ret;
  26544. }
  26545. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26546. /* Persistable DoServerKeyExchange arguments */
  26547. typedef struct DskeArgs {
  26548. byte* output; /* not allocated */
  26549. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26550. defined(HAVE_CURVE448)
  26551. byte* verifySig;
  26552. #endif
  26553. word32 idx;
  26554. word32 begin;
  26555. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26556. defined(HAVE_CURVE448)
  26557. word16 verifySigSz;
  26558. #endif
  26559. word16 sigSz;
  26560. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  26561. int bits;
  26562. #endif
  26563. } DskeArgs;
  26564. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  26565. {
  26566. DskeArgs* args = (DskeArgs*)pArgs;
  26567. (void)ssl;
  26568. (void)args;
  26569. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26570. defined(HAVE_CURVE448)
  26571. if (args->verifySig) {
  26572. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26573. args->verifySig = NULL;
  26574. }
  26575. #endif
  26576. }
  26577. #ifndef NO_DH
  26578. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  26579. DskeArgs* args)
  26580. {
  26581. int ret = 0;
  26582. word16 length;
  26583. #ifdef HAVE_FFDHE
  26584. #ifdef HAVE_PUBLIC_FFDHE
  26585. const DhParams* params = NULL;
  26586. #endif
  26587. word16 group = 0;
  26588. #endif
  26589. if (ssl->buffers.weOwnDH) {
  26590. if (ssl->buffers.serverDH_P.buffer) {
  26591. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  26592. DYNAMIC_TYPE_PUBLIC_KEY);
  26593. ssl->buffers.serverDH_P.buffer = NULL;
  26594. }
  26595. if (ssl->buffers.serverDH_G.buffer) {
  26596. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  26597. DYNAMIC_TYPE_PUBLIC_KEY);
  26598. ssl->buffers.serverDH_G.buffer = NULL;
  26599. }
  26600. }
  26601. if (ssl->buffers.serverDH_Pub.buffer) {
  26602. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
  26603. DYNAMIC_TYPE_PUBLIC_KEY);
  26604. ssl->buffers.serverDH_Pub.buffer = NULL;
  26605. }
  26606. /* p */
  26607. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26608. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  26609. }
  26610. ato16(input + args->idx, &length);
  26611. args->idx += OPAQUE16_LEN;
  26612. if ((args->idx - args->begin) + length > size) {
  26613. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  26614. }
  26615. if (length < ssl->options.minDhKeySz) {
  26616. WOLFSSL_MSG("Server using a DH key that is too small");
  26617. SendAlert(ssl, alert_fatal, handshake_failure);
  26618. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  26619. }
  26620. if (length > ssl->options.maxDhKeySz) {
  26621. WOLFSSL_MSG("Server using a DH key that is too big");
  26622. SendAlert(ssl, alert_fatal, handshake_failure);
  26623. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  26624. }
  26625. ssl->buffers.serverDH_P.buffer =
  26626. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26627. if (ssl->buffers.serverDH_P.buffer) {
  26628. ssl->buffers.serverDH_P.length = length;
  26629. }
  26630. else {
  26631. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  26632. }
  26633. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  26634. length);
  26635. args->idx += length;
  26636. ssl->options.dhKeySz = length;
  26637. /* g */
  26638. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26639. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  26640. DYNAMIC_TYPE_PUBLIC_KEY);
  26641. ssl->buffers.serverDH_P.buffer = NULL;
  26642. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  26643. }
  26644. ato16(input + args->idx, &length);
  26645. args->idx += OPAQUE16_LEN;
  26646. if ((args->idx - args->begin) + length > size) {
  26647. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  26648. DYNAMIC_TYPE_PUBLIC_KEY);
  26649. ssl->buffers.serverDH_P.buffer = NULL;
  26650. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  26651. }
  26652. if (length > ssl->options.maxDhKeySz) {
  26653. WOLFSSL_MSG("Server using a DH key generator that is too big");
  26654. SendAlert(ssl, alert_fatal, handshake_failure);
  26655. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  26656. DYNAMIC_TYPE_PUBLIC_KEY);
  26657. ssl->buffers.serverDH_P.buffer = NULL;
  26658. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  26659. }
  26660. ssl->buffers.serverDH_G.buffer =
  26661. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26662. if (ssl->buffers.serverDH_G.buffer) {
  26663. ssl->buffers.serverDH_G.length = length;
  26664. }
  26665. else {
  26666. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  26667. DYNAMIC_TYPE_PUBLIC_KEY);
  26668. ssl->buffers.serverDH_P.buffer = NULL;
  26669. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  26670. }
  26671. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  26672. length);
  26673. args->idx += length;
  26674. /* pub */
  26675. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26676. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  26677. DYNAMIC_TYPE_PUBLIC_KEY);
  26678. ssl->buffers.serverDH_P.buffer = NULL;
  26679. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  26680. DYNAMIC_TYPE_PUBLIC_KEY);
  26681. ssl->buffers.serverDH_G.buffer = NULL;
  26682. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  26683. }
  26684. ato16(input + args->idx, &length);
  26685. args->idx += OPAQUE16_LEN;
  26686. if ((args->idx - args->begin) + length > size) {
  26687. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  26688. DYNAMIC_TYPE_PUBLIC_KEY);
  26689. ssl->buffers.serverDH_P.buffer = NULL;
  26690. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  26691. DYNAMIC_TYPE_PUBLIC_KEY);
  26692. ssl->buffers.serverDH_G.buffer = NULL;
  26693. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  26694. }
  26695. if (length > ssl->options.maxDhKeySz) {
  26696. WOLFSSL_MSG("Server using a public DH key that is too big");
  26697. SendAlert(ssl, alert_fatal, handshake_failure);
  26698. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  26699. DYNAMIC_TYPE_PUBLIC_KEY);
  26700. ssl->buffers.serverDH_P.buffer = NULL;
  26701. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  26702. DYNAMIC_TYPE_PUBLIC_KEY);
  26703. ssl->buffers.serverDH_G.buffer = NULL;
  26704. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  26705. }
  26706. ssl->buffers.serverDH_Pub.buffer =
  26707. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26708. if (ssl->buffers.serverDH_Pub.buffer) {
  26709. ssl->buffers.serverDH_Pub.length = length;
  26710. }
  26711. else {
  26712. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  26713. DYNAMIC_TYPE_PUBLIC_KEY);
  26714. ssl->buffers.serverDH_P.buffer = NULL;
  26715. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  26716. DYNAMIC_TYPE_PUBLIC_KEY);
  26717. ssl->buffers.serverDH_G.buffer = NULL;
  26718. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  26719. }
  26720. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  26721. length);
  26722. ssl->buffers.weOwnDH = 1;
  26723. args->idx += length;
  26724. #ifdef HAVE_FFDHE
  26725. switch (ssl->options.dhKeySz) {
  26726. #ifdef HAVE_FFDHE_2048
  26727. case 2048/8:
  26728. #ifdef HAVE_PUBLIC_FFDHE
  26729. params = wc_Dh_ffdhe2048_Get();
  26730. #endif
  26731. group = WOLFSSL_FFDHE_2048;
  26732. break;
  26733. #endif
  26734. #ifdef HAVE_FFDHE_3072
  26735. case 3072/8:
  26736. #ifdef HAVE_PUBLIC_FFDHE
  26737. params = wc_Dh_ffdhe3072_Get();
  26738. #endif
  26739. group = WOLFSSL_FFDHE_3072;
  26740. break;
  26741. #endif
  26742. #ifdef HAVE_FFDHE_4096
  26743. case 4096/8:
  26744. #ifdef HAVE_PUBLIC_FFDHE
  26745. params = wc_Dh_ffdhe4096_Get();
  26746. #endif
  26747. group = WOLFSSL_FFDHE_4096;
  26748. break;
  26749. #endif
  26750. #ifdef HAVE_FFDHE_6144
  26751. case 6144/8:
  26752. #ifdef HAVE_PUBLIC_FFDHE
  26753. params = wc_Dh_ffdhe6144_Get();
  26754. #endif
  26755. group = WOLFSSL_FFDHE_6144;
  26756. break;
  26757. #endif
  26758. #ifdef HAVE_FFDHE_8192
  26759. case 8192/8:
  26760. #ifdef HAVE_PUBLIC_FFDHE
  26761. params = wc_Dh_ffdhe8192_Get();
  26762. #endif
  26763. group = WOLFSSL_FFDHE_8192;
  26764. break;
  26765. #endif
  26766. default:
  26767. break;
  26768. }
  26769. #ifdef HAVE_PUBLIC_FFDHE
  26770. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  26771. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  26772. params->g_len) != 0) ||
  26773. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  26774. params->p_len) != 0))
  26775. #else
  26776. if (!wc_DhCmpNamedKey(group, 1,
  26777. ssl->buffers.serverDH_P.buffer, ssl->buffers.serverDH_P.length,
  26778. ssl->buffers.serverDH_G.buffer, ssl->buffers.serverDH_G.length,
  26779. NULL, 0))
  26780. #endif
  26781. {
  26782. WOLFSSL_MSG("Server not using FFDHE parameters");
  26783. #ifdef WOLFSSL_REQUIRE_FFDHE
  26784. SendAlert(ssl, alert_fatal, handshake_failure);
  26785. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  26786. #endif
  26787. }
  26788. else {
  26789. ssl->namedGroup = group;
  26790. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  26791. !defined(HAVE_SELFTEST)
  26792. ssl->options.dhDoKeyTest = 0;
  26793. #endif
  26794. }
  26795. #endif /* HAVE_FFDHE */
  26796. exit_gdpk:
  26797. if (ret != 0) {
  26798. WOLFSSL_ERROR_VERBOSE(ret);
  26799. }
  26800. return ret;
  26801. }
  26802. #endif
  26803. /* handle processing of server_key_exchange (12) */
  26804. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  26805. word32* inOutIdx, word32 size)
  26806. {
  26807. int ret = 0;
  26808. #ifdef WOLFSSL_ASYNC_CRYPT
  26809. DskeArgs* args = NULL;
  26810. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  26811. #else
  26812. DskeArgs args[1];
  26813. #endif
  26814. (void)input;
  26815. (void)size;
  26816. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  26817. WOLFSSL_ENTER("DoServerKeyExchange");
  26818. #ifdef WOLFSSL_ASYNC_CRYPT
  26819. if (ssl->async == NULL) {
  26820. ssl->async = (struct WOLFSSL_ASYNC*)
  26821. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  26822. DYNAMIC_TYPE_ASYNC);
  26823. if (ssl->async == NULL)
  26824. ERROR_OUT(MEMORY_E, exit_dske);
  26825. }
  26826. args = (DskeArgs*)ssl->async->args;
  26827. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  26828. if (ret != WC_NO_PENDING_E) {
  26829. /* Check for error */
  26830. if (ret < 0)
  26831. goto exit_dske;
  26832. }
  26833. else
  26834. #endif
  26835. {
  26836. /* Reset state */
  26837. ret = 0;
  26838. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  26839. XMEMSET(args, 0, sizeof(DskeArgs));
  26840. args->idx = *inOutIdx;
  26841. args->begin = *inOutIdx;
  26842. ssl->options.peerSigAlgo = ssl->specs.sig_algo;
  26843. ssl->options.peerHashAlgo = sha_mac;
  26844. #ifdef WOLFSSL_ASYNC_CRYPT
  26845. ssl->async->freeArgs = FreeDskeArgs;
  26846. #endif
  26847. }
  26848. switch(ssl->options.asyncState)
  26849. {
  26850. case TLS_ASYNC_BEGIN:
  26851. {
  26852. #ifdef WOLFSSL_CALLBACKS
  26853. if (ssl->hsInfoOn)
  26854. AddPacketName(ssl, "ServerKeyExchange");
  26855. if (ssl->toInfoOn)
  26856. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  26857. #endif
  26858. switch(ssl->specs.kea)
  26859. {
  26860. #ifndef NO_PSK
  26861. case psk_kea:
  26862. {
  26863. int srvHintLen;
  26864. word16 length;
  26865. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26866. ERROR_OUT(BUFFER_ERROR, exit_dske);
  26867. }
  26868. ato16(input + args->idx, &length);
  26869. args->idx += OPAQUE16_LEN;
  26870. if ((args->idx - args->begin) + length > size) {
  26871. ERROR_OUT(BUFFER_ERROR, exit_dske);
  26872. }
  26873. /* get PSK server hint from the wire */
  26874. srvHintLen = min(length, MAX_PSK_ID_LEN);
  26875. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  26876. srvHintLen);
  26877. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  26878. args->idx += length;
  26879. break;
  26880. }
  26881. #endif /* !NO_PSK */
  26882. #ifndef NO_DH
  26883. case diffie_hellman_kea:
  26884. {
  26885. ret = GetDhPublicKey(ssl, input, size, args);
  26886. if (ret != 0)
  26887. goto exit_dske;
  26888. break;
  26889. }
  26890. #endif /* !NO_DH */
  26891. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26892. defined(HAVE_CURVE448)
  26893. case ecc_diffie_hellman_kea:
  26894. {
  26895. byte b;
  26896. #ifdef HAVE_ECC
  26897. int curveId;
  26898. #endif
  26899. int curveOid;
  26900. word16 length;
  26901. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  26902. OPAQUE8_LEN > size) {
  26903. ERROR_OUT(BUFFER_ERROR, exit_dske);
  26904. }
  26905. b = input[args->idx++];
  26906. if (b != named_curve) {
  26907. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  26908. }
  26909. args->idx += 1; /* curve type, eat leading 0 */
  26910. b = input[args->idx++];
  26911. if ((curveOid = CheckCurveId(b)) < 0) {
  26912. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  26913. }
  26914. ssl->ecdhCurveOID = curveOid;
  26915. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  26916. ssl->namedGroup = 0;
  26917. #endif
  26918. length = input[args->idx++];
  26919. if ((args->idx - args->begin) + length > size) {
  26920. ERROR_OUT(BUFFER_ERROR, exit_dske);
  26921. }
  26922. #ifdef HAVE_CURVE25519
  26923. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26924. if (ssl->peerX25519Key == NULL) {
  26925. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26926. (void**)&ssl->peerX25519Key);
  26927. if (ret != 0) {
  26928. goto exit_dske;
  26929. }
  26930. } else if (ssl->peerX25519KeyPresent) {
  26931. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26932. ssl->peerX25519Key);
  26933. ssl->peerX25519KeyPresent = 0;
  26934. if (ret != 0) {
  26935. goto exit_dske;
  26936. }
  26937. }
  26938. if ((ret = wc_curve25519_check_public(
  26939. input + args->idx, length,
  26940. EC25519_LITTLE_ENDIAN)) != 0) {
  26941. #ifdef WOLFSSL_EXTRA_ALERTS
  26942. if (ret == BUFFER_E)
  26943. SendAlert(ssl, alert_fatal, decode_error);
  26944. else if (ret == ECC_OUT_OF_RANGE_E)
  26945. SendAlert(ssl, alert_fatal, bad_record_mac);
  26946. else {
  26947. SendAlert(ssl, alert_fatal, illegal_parameter);
  26948. }
  26949. #endif
  26950. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  26951. }
  26952. if (wc_curve25519_import_public_ex(input + args->idx,
  26953. length, ssl->peerX25519Key,
  26954. EC25519_LITTLE_ENDIAN) != 0) {
  26955. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  26956. }
  26957. args->idx += length;
  26958. ssl->peerX25519KeyPresent = 1;
  26959. break;
  26960. }
  26961. #endif
  26962. #ifdef HAVE_CURVE448
  26963. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  26964. if (ssl->peerX448Key == NULL) {
  26965. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  26966. (void**)&ssl->peerX448Key);
  26967. if (ret != 0) {
  26968. goto exit_dske;
  26969. }
  26970. } else if (ssl->peerX448KeyPresent) {
  26971. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  26972. ssl->peerX448Key);
  26973. ssl->peerX448KeyPresent = 0;
  26974. if (ret != 0) {
  26975. goto exit_dske;
  26976. }
  26977. }
  26978. if ((ret = wc_curve448_check_public(
  26979. input + args->idx, length,
  26980. EC448_LITTLE_ENDIAN)) != 0) {
  26981. #ifdef WOLFSSL_EXTRA_ALERTS
  26982. if (ret == BUFFER_E)
  26983. SendAlert(ssl, alert_fatal, decode_error);
  26984. else if (ret == ECC_OUT_OF_RANGE_E)
  26985. SendAlert(ssl, alert_fatal, bad_record_mac);
  26986. else {
  26987. SendAlert(ssl, alert_fatal, illegal_parameter);
  26988. }
  26989. #endif
  26990. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  26991. }
  26992. if (wc_curve448_import_public_ex(input + args->idx,
  26993. length, ssl->peerX448Key,
  26994. EC448_LITTLE_ENDIAN) != 0) {
  26995. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  26996. }
  26997. args->idx += length;
  26998. ssl->peerX448KeyPresent = 1;
  26999. break;
  27000. }
  27001. #endif
  27002. #ifdef HAVE_ECC
  27003. if (ssl->peerEccKey == NULL) {
  27004. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  27005. (void**)&ssl->peerEccKey);
  27006. if (ret != 0) {
  27007. goto exit_dske;
  27008. }
  27009. } else if (ssl->peerEccKeyPresent) {
  27010. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  27011. ssl->peerEccKeyPresent = 0;
  27012. if (ret != 0) {
  27013. goto exit_dske;
  27014. }
  27015. }
  27016. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  27017. if (wc_ecc_import_x963_ex(input + args->idx, length,
  27018. ssl->peerEccKey, curveId) != 0) {
  27019. #ifdef WOLFSSL_EXTRA_ALERTS
  27020. SendAlert(ssl, alert_fatal, illegal_parameter);
  27021. #endif
  27022. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  27023. }
  27024. args->idx += length;
  27025. ssl->peerEccKeyPresent = 1;
  27026. #endif
  27027. break;
  27028. }
  27029. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27030. #if !defined(NO_DH) && !defined(NO_PSK)
  27031. case dhe_psk_kea:
  27032. {
  27033. int srvHintLen;
  27034. word16 length;
  27035. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  27036. ERROR_OUT(BUFFER_ERROR, exit_dske);
  27037. }
  27038. ato16(input + args->idx, &length);
  27039. args->idx += OPAQUE16_LEN;
  27040. if ((args->idx - args->begin) + length > size) {
  27041. ERROR_OUT(BUFFER_ERROR, exit_dske);
  27042. }
  27043. /* get PSK server hint from the wire */
  27044. srvHintLen = min(length, MAX_PSK_ID_LEN);
  27045. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  27046. srvHintLen);
  27047. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  27048. args->idx += length;
  27049. ret = GetDhPublicKey(ssl, input, size, args);
  27050. if (ret != 0)
  27051. goto exit_dske;
  27052. break;
  27053. }
  27054. #endif /* !NO_DH && !NO_PSK */
  27055. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27056. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27057. case ecdhe_psk_kea:
  27058. {
  27059. byte b;
  27060. int curveOid, curveId;
  27061. int srvHintLen;
  27062. word16 length;
  27063. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  27064. ERROR_OUT(BUFFER_ERROR, exit_dske);
  27065. }
  27066. ato16(input + args->idx, &length);
  27067. args->idx += OPAQUE16_LEN;
  27068. if ((args->idx - args->begin) + length > size) {
  27069. ERROR_OUT(BUFFER_ERROR, exit_dske);
  27070. }
  27071. /* get PSK server hint from the wire */
  27072. srvHintLen = min(length, MAX_PSK_ID_LEN);
  27073. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  27074. srvHintLen);
  27075. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  27076. args->idx += length;
  27077. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  27078. OPAQUE8_LEN > size) {
  27079. ERROR_OUT(BUFFER_ERROR, exit_dske);
  27080. }
  27081. /* Check curve name and ID */
  27082. b = input[args->idx++];
  27083. if (b != named_curve) {
  27084. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  27085. }
  27086. args->idx += 1; /* curve type, eat leading 0 */
  27087. b = input[args->idx++];
  27088. if ((curveOid = CheckCurveId(b)) < 0) {
  27089. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  27090. }
  27091. ssl->ecdhCurveOID = curveOid;
  27092. length = input[args->idx++];
  27093. if ((args->idx - args->begin) + length > size) {
  27094. ERROR_OUT(BUFFER_ERROR, exit_dske);
  27095. }
  27096. #ifdef HAVE_CURVE25519
  27097. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27098. if (ssl->peerX25519Key == NULL) {
  27099. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27100. (void**)&ssl->peerX25519Key);
  27101. if (ret != 0) {
  27102. goto exit_dske;
  27103. }
  27104. } else if (ssl->peerEccKeyPresent) {
  27105. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27106. ssl->peerX25519Key);
  27107. ssl->peerX25519KeyPresent = 0;
  27108. if (ret != 0) {
  27109. goto exit_dske;
  27110. }
  27111. }
  27112. if ((ret = wc_curve25519_check_public(
  27113. input + args->idx, length,
  27114. EC25519_LITTLE_ENDIAN)) != 0) {
  27115. #ifdef WOLFSSL_EXTRA_ALERTS
  27116. if (ret == BUFFER_E)
  27117. SendAlert(ssl, alert_fatal, decode_error);
  27118. else if (ret == ECC_OUT_OF_RANGE_E)
  27119. SendAlert(ssl, alert_fatal, bad_record_mac);
  27120. else {
  27121. SendAlert(ssl, alert_fatal, illegal_parameter);
  27122. }
  27123. #endif
  27124. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  27125. }
  27126. if (wc_curve25519_import_public_ex(input + args->idx,
  27127. length, ssl->peerX25519Key,
  27128. EC25519_LITTLE_ENDIAN) != 0) {
  27129. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  27130. }
  27131. args->idx += length;
  27132. ssl->peerX25519KeyPresent = 1;
  27133. break;
  27134. }
  27135. #endif
  27136. #ifdef HAVE_CURVE448
  27137. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27138. if (ssl->peerX448Key == NULL) {
  27139. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  27140. (void**)&ssl->peerX448Key);
  27141. if (ret != 0) {
  27142. goto exit_dske;
  27143. }
  27144. } else if (ssl->peerEccKeyPresent) {
  27145. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  27146. ssl->peerX448Key);
  27147. ssl->peerX448KeyPresent = 0;
  27148. if (ret != 0) {
  27149. goto exit_dske;
  27150. }
  27151. }
  27152. if ((ret = wc_curve448_check_public(
  27153. input + args->idx, length,
  27154. EC448_LITTLE_ENDIAN)) != 0) {
  27155. #ifdef WOLFSSL_EXTRA_ALERTS
  27156. if (ret == BUFFER_E)
  27157. SendAlert(ssl, alert_fatal, decode_error);
  27158. else if (ret == ECC_OUT_OF_RANGE_E)
  27159. SendAlert(ssl, alert_fatal, bad_record_mac);
  27160. else {
  27161. SendAlert(ssl, alert_fatal, illegal_parameter);
  27162. }
  27163. #endif
  27164. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  27165. }
  27166. if (wc_curve448_import_public_ex(input + args->idx,
  27167. length, ssl->peerX448Key,
  27168. EC448_LITTLE_ENDIAN) != 0) {
  27169. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  27170. }
  27171. args->idx += length;
  27172. ssl->peerX448KeyPresent = 1;
  27173. break;
  27174. }
  27175. #endif
  27176. if (ssl->peerEccKey == NULL) {
  27177. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  27178. (void**)&ssl->peerEccKey);
  27179. if (ret != 0) {
  27180. goto exit_dske;
  27181. }
  27182. } else if (ssl->peerEccKeyPresent) {
  27183. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  27184. ssl->peerEccKeyPresent = 0;
  27185. if (ret != 0) {
  27186. goto exit_dske;
  27187. }
  27188. }
  27189. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  27190. if (wc_ecc_import_x963_ex(input + args->idx, length,
  27191. ssl->peerEccKey, curveId) != 0) {
  27192. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  27193. }
  27194. args->idx += length;
  27195. ssl->peerEccKeyPresent = 1;
  27196. break;
  27197. }
  27198. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  27199. default:
  27200. ret = BAD_KEA_TYPE_E;
  27201. } /* switch(ssl->specs.kea) */
  27202. /* Check for error */
  27203. if (ret != 0) {
  27204. goto exit_dske;
  27205. }
  27206. /* Advance state and proceed */
  27207. ssl->options.asyncState = TLS_ASYNC_BUILD;
  27208. } /* case TLS_ASYNC_BEGIN */
  27209. FALL_THROUGH;
  27210. case TLS_ASYNC_BUILD:
  27211. {
  27212. switch(ssl->specs.kea)
  27213. {
  27214. case psk_kea:
  27215. case dhe_psk_kea:
  27216. case ecdhe_psk_kea:
  27217. {
  27218. /* Nothing to do in this sub-state */
  27219. break;
  27220. }
  27221. case diffie_hellman_kea:
  27222. case ecc_diffie_hellman_kea:
  27223. {
  27224. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  27225. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  27226. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  27227. #else
  27228. enum wc_HashType hashType;
  27229. word32 verifySz;
  27230. byte sigAlgo;
  27231. if (ssl->options.usingAnon_cipher) {
  27232. break;
  27233. }
  27234. verifySz = (args->idx - args->begin);
  27235. if (verifySz > MAX_DH_SZ) {
  27236. ERROR_OUT(BUFFER_ERROR, exit_dske);
  27237. }
  27238. if (IsAtLeastTLSv1_2(ssl)) {
  27239. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  27240. size) {
  27241. ERROR_OUT(BUFFER_ERROR, exit_dske);
  27242. }
  27243. DecodeSigAlg(&input[args->idx], &ssl->options.peerHashAlgo,
  27244. &sigAlgo);
  27245. #ifndef NO_RSA
  27246. if (sigAlgo == rsa_pss_sa_algo &&
  27247. ssl->options.peerSigAlgo == rsa_sa_algo) {
  27248. ssl->options.peerSigAlgo = sigAlgo;
  27249. }
  27250. else
  27251. #endif
  27252. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  27253. if (sigAlgo == sm2_sa_algo &&
  27254. ssl->options.peerSigAlgo == ecc_dsa_sa_algo) {
  27255. ssl->options.peerSigAlgo = sigAlgo;
  27256. }
  27257. else
  27258. #endif
  27259. #ifdef HAVE_ED25519
  27260. if (sigAlgo == ed25519_sa_algo &&
  27261. ssl->options.peerSigAlgo == ecc_dsa_sa_algo) {
  27262. ssl->options.peerSigAlgo = sigAlgo;
  27263. }
  27264. else
  27265. #endif
  27266. #ifdef HAVE_ED448
  27267. if (sigAlgo == ed448_sa_algo &&
  27268. ssl->options.peerSigAlgo == ecc_dsa_sa_algo) {
  27269. ssl->options.peerSigAlgo = sigAlgo;
  27270. }
  27271. else
  27272. #endif
  27273. /* Signature algorithm from message must match signature
  27274. * algorithm in cipher suite. */
  27275. if (sigAlgo != ssl->options.peerSigAlgo) {
  27276. ERROR_OUT(ALGO_ID_E, exit_dske);
  27277. }
  27278. args->idx += 2;
  27279. hashType = HashAlgoToType(ssl->options.peerHashAlgo);
  27280. if (hashType == WC_HASH_TYPE_NONE) {
  27281. ERROR_OUT(ALGO_ID_E, exit_dske);
  27282. }
  27283. } else {
  27284. /* only using sha and md5 for rsa */
  27285. #ifndef NO_OLD_TLS
  27286. hashType = WC_HASH_TYPE_SHA;
  27287. if (ssl->options.peerSigAlgo == rsa_sa_algo) {
  27288. hashType = WC_HASH_TYPE_MD5_SHA;
  27289. }
  27290. #else
  27291. ERROR_OUT(ALGO_ID_E, exit_dske);
  27292. #endif
  27293. }
  27294. /* signature */
  27295. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  27296. ERROR_OUT(BUFFER_ERROR, exit_dske);
  27297. }
  27298. ato16(input + args->idx, &args->verifySigSz);
  27299. args->idx += OPAQUE16_LEN;
  27300. if ((args->idx - args->begin) + args->verifySigSz > size) {
  27301. ERROR_OUT(BUFFER_ERROR, exit_dske);
  27302. }
  27303. ret = HashSkeData(ssl, hashType, input + args->begin,
  27304. verifySz, ssl->options.peerSigAlgo);
  27305. if (ret != 0) {
  27306. goto exit_dske;
  27307. }
  27308. switch (ssl->options.peerSigAlgo)
  27309. {
  27310. #ifndef NO_RSA
  27311. #ifdef WC_RSA_PSS
  27312. case rsa_pss_sa_algo:
  27313. #endif
  27314. case rsa_sa_algo:
  27315. {
  27316. if (ssl->peerRsaKey == NULL ||
  27317. !ssl->peerRsaKeyPresent) {
  27318. ERROR_OUT(NO_PEER_KEY, exit_dske);
  27319. }
  27320. break;
  27321. }
  27322. #endif /* !NO_RSA */
  27323. #ifdef HAVE_ECC
  27324. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  27325. case sm2_sa_algo:
  27326. #endif
  27327. case ecc_dsa_sa_algo:
  27328. {
  27329. if (!ssl->peerEccDsaKeyPresent) {
  27330. ERROR_OUT(NO_PEER_KEY, exit_dske);
  27331. }
  27332. break;
  27333. }
  27334. #endif /* HAVE_ECC */
  27335. #if defined(HAVE_ED25519)
  27336. case ed25519_sa_algo:
  27337. {
  27338. if (!ssl->peerEd25519KeyPresent) {
  27339. ERROR_OUT(NO_PEER_KEY, exit_dske);
  27340. }
  27341. break;
  27342. }
  27343. #endif /* HAVE_ED25519 */
  27344. #if defined(HAVE_ED448)
  27345. case ed448_sa_algo:
  27346. {
  27347. if (!ssl->peerEd448KeyPresent) {
  27348. ERROR_OUT(NO_PEER_KEY, exit_dske);
  27349. }
  27350. break;
  27351. }
  27352. #endif /* HAVE_ED448 */
  27353. default:
  27354. ret = ALGO_ID_E;
  27355. } /* switch (ssl->options.peerSigAlgo) */
  27356. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  27357. break;
  27358. }
  27359. default:
  27360. ret = BAD_KEA_TYPE_E;
  27361. } /* switch(ssl->specs.kea) */
  27362. /* Check for error */
  27363. if (ret != 0) {
  27364. goto exit_dske;
  27365. }
  27366. /* Advance state and proceed */
  27367. ssl->options.asyncState = TLS_ASYNC_DO;
  27368. } /* case TLS_ASYNC_BUILD */
  27369. FALL_THROUGH;
  27370. case TLS_ASYNC_DO:
  27371. {
  27372. switch(ssl->specs.kea)
  27373. {
  27374. case psk_kea:
  27375. case dhe_psk_kea:
  27376. case ecdhe_psk_kea:
  27377. {
  27378. /* Nothing to do in this sub-state */
  27379. break;
  27380. }
  27381. case diffie_hellman_kea:
  27382. case ecc_diffie_hellman_kea:
  27383. {
  27384. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  27385. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  27386. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  27387. #else
  27388. if (ssl->options.usingAnon_cipher) {
  27389. break;
  27390. }
  27391. if (args->verifySig == NULL) {
  27392. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  27393. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  27394. if (args->verifySig == NULL) {
  27395. ERROR_OUT(MEMORY_E, exit_dske);
  27396. }
  27397. XMEMCPY(args->verifySig, input + args->idx,
  27398. args->verifySigSz);
  27399. }
  27400. switch (ssl->options.peerSigAlgo)
  27401. {
  27402. #ifndef NO_RSA
  27403. #ifdef WC_RSA_PSS
  27404. case rsa_pss_sa_algo:
  27405. #endif
  27406. case rsa_sa_algo:
  27407. {
  27408. ret = RsaVerify(ssl,
  27409. args->verifySig, args->verifySigSz,
  27410. &args->output,
  27411. ssl->options.peerSigAlgo, ssl->options.peerHashAlgo,
  27412. ssl->peerRsaKey,
  27413. #ifdef HAVE_PK_CALLBACKS
  27414. &ssl->buffers.peerRsaKey
  27415. #else
  27416. NULL
  27417. #endif
  27418. );
  27419. if (ret >= 0) {
  27420. args->sigSz = (word16)ret;
  27421. #ifdef WC_RSA_PSS
  27422. args->bits = mp_count_bits(&ssl->peerRsaKey->n);
  27423. #endif
  27424. ret = 0;
  27425. }
  27426. #ifdef WOLFSSL_ASYNC_CRYPT
  27427. if (ret != WC_PENDING_E)
  27428. #endif
  27429. {
  27430. /* peerRsaKey */
  27431. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  27432. (void**)&ssl->peerRsaKey);
  27433. ssl->peerRsaKeyPresent = 0;
  27434. }
  27435. break;
  27436. }
  27437. #endif /* !NO_RSA */
  27438. #ifdef HAVE_ECC
  27439. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  27440. case sm2_sa_algo:
  27441. #endif
  27442. case ecc_dsa_sa_algo:
  27443. {
  27444. ret = NOT_COMPILED_IN;
  27445. #ifdef HAVE_PK_CALLBACKS
  27446. if (ssl->ctx && ssl->ctx->ProcessServerSigKexCb) {
  27447. ret = ssl->ctx->ProcessServerSigKexCb(ssl,
  27448. ssl->options.peerSigAlgo,
  27449. args->verifySig, args->verifySigSz,
  27450. ssl->buffers.sig.buffer, SEED_LEN,
  27451. &ssl->buffers.sig.buffer[SEED_LEN],
  27452. (ssl->buffers.sig.length - SEED_LEN));
  27453. }
  27454. #endif /* HAVE_PK_CALLBACKS */
  27455. if (ret == NOT_COMPILED_IN) {
  27456. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  27457. if (ssl->options.peerSigAlgo == sm2_sa_algo) {
  27458. ret = Sm2wSm3Verify(ssl,
  27459. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  27460. args->verifySig, args->verifySigSz,
  27461. ssl->buffers.sig.buffer,
  27462. ssl->buffers.sig.length,
  27463. ssl->peerEccDsaKey,
  27464. #ifdef HAVE_PK_CALLBACKS
  27465. &ssl->buffers.peerEccDsaKey
  27466. #else
  27467. NULL
  27468. #endif
  27469. );
  27470. }
  27471. else
  27472. #endif
  27473. {
  27474. ret = EccVerify(ssl,
  27475. args->verifySig, args->verifySigSz,
  27476. ssl->buffers.digest.buffer,
  27477. ssl->buffers.digest.length,
  27478. ssl->peerEccDsaKey,
  27479. #ifdef HAVE_PK_CALLBACKS
  27480. &ssl->buffers.peerEccDsaKey
  27481. #else
  27482. NULL
  27483. #endif
  27484. );
  27485. }
  27486. }
  27487. #ifdef WOLFSSL_ASYNC_CRYPT
  27488. if (ret != WC_PENDING_E)
  27489. #endif
  27490. {
  27491. /* peerEccDsaKey */
  27492. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  27493. (void**)&ssl->peerEccDsaKey);
  27494. ssl->peerEccDsaKeyPresent = 0;
  27495. }
  27496. /* CLIENT: Data verified with cert's public key. */
  27497. ssl->options.peerAuthGood =
  27498. ssl->options.havePeerCert && (ret == 0);
  27499. break;
  27500. }
  27501. #endif /* HAVE_ECC */
  27502. #if defined(HAVE_ED25519)
  27503. case ed25519_sa_algo:
  27504. {
  27505. ret = Ed25519Verify(ssl,
  27506. args->verifySig, args->verifySigSz,
  27507. ssl->buffers.sig.buffer,
  27508. ssl->buffers.sig.length,
  27509. ssl->peerEd25519Key,
  27510. #ifdef HAVE_PK_CALLBACKS
  27511. &ssl->buffers.peerEd25519Key
  27512. #else
  27513. NULL
  27514. #endif
  27515. );
  27516. #ifdef WOLFSSL_ASYNC_CRYPT
  27517. if (ret != WC_PENDING_E)
  27518. #endif
  27519. {
  27520. /* peerEccDsaKey */
  27521. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  27522. (void**)&ssl->peerEd25519Key);
  27523. ssl->peerEd25519KeyPresent = 0;
  27524. }
  27525. /* CLIENT: Data verified with cert's public key. */
  27526. ssl->options.peerAuthGood =
  27527. ssl->options.havePeerCert && (ret == 0);
  27528. break;
  27529. }
  27530. #endif /* HAVE_ED25519 */
  27531. #if defined(HAVE_ED448)
  27532. case ed448_sa_algo:
  27533. {
  27534. ret = Ed448Verify(ssl,
  27535. args->verifySig, args->verifySigSz,
  27536. ssl->buffers.sig.buffer,
  27537. ssl->buffers.sig.length,
  27538. ssl->peerEd448Key,
  27539. #ifdef HAVE_PK_CALLBACKS
  27540. &ssl->buffers.peerEd448Key
  27541. #else
  27542. NULL
  27543. #endif
  27544. );
  27545. #ifdef WOLFSSL_ASYNC_CRYPT
  27546. if (ret != WC_PENDING_E)
  27547. #endif
  27548. {
  27549. /* peerEccDsaKey */
  27550. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  27551. (void**)&ssl->peerEd448Key);
  27552. ssl->peerEd448KeyPresent = 0;
  27553. }
  27554. /* CLIENT: Data verified with cert's public key. */
  27555. ssl->options.peerAuthGood =
  27556. ssl->options.havePeerCert && (ret == 0);
  27557. break;
  27558. }
  27559. #endif /* HAVE_ED448 */
  27560. default:
  27561. ret = ALGO_ID_E;
  27562. } /* switch (sigAlgo) */
  27563. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  27564. break;
  27565. }
  27566. default:
  27567. ret = BAD_KEA_TYPE_E;
  27568. } /* switch(ssl->specs.kea) */
  27569. /* Check for error */
  27570. if (ret != 0) {
  27571. goto exit_dske;
  27572. }
  27573. /* Advance state and proceed */
  27574. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  27575. } /* case TLS_ASYNC_DO */
  27576. FALL_THROUGH;
  27577. case TLS_ASYNC_VERIFY:
  27578. {
  27579. switch(ssl->specs.kea)
  27580. {
  27581. case psk_kea:
  27582. case dhe_psk_kea:
  27583. case ecdhe_psk_kea:
  27584. {
  27585. /* Nothing to do in this sub-state */
  27586. break;
  27587. }
  27588. case diffie_hellman_kea:
  27589. case ecc_diffie_hellman_kea:
  27590. {
  27591. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  27592. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  27593. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  27594. #else
  27595. if (ssl->options.usingAnon_cipher) {
  27596. break;
  27597. }
  27598. /* increment index after verify is done */
  27599. args->idx += args->verifySigSz;
  27600. switch(ssl->options.peerSigAlgo)
  27601. {
  27602. #ifndef NO_RSA
  27603. #ifdef WC_RSA_PSS
  27604. case rsa_pss_sa_algo:
  27605. #ifdef HAVE_SELFTEST
  27606. ret = wc_RsaPSS_CheckPadding(
  27607. ssl->buffers.digest.buffer,
  27608. ssl->buffers.digest.length,
  27609. args->output, args->sigSz,
  27610. HashAlgoToType(ssl->options.peerHashAlgo));
  27611. #else
  27612. ret = wc_RsaPSS_CheckPadding_ex(
  27613. ssl->buffers.digest.buffer,
  27614. ssl->buffers.digest.length,
  27615. args->output, args->sigSz,
  27616. HashAlgoToType(ssl->options.peerHashAlgo),
  27617. -1, args->bits);
  27618. #endif
  27619. if (ret != 0)
  27620. goto exit_dske;
  27621. /* CLIENT: Data verified with cert's public key. */
  27622. ssl->options.peerAuthGood =
  27623. ssl->options.havePeerCert;
  27624. break;
  27625. #endif
  27626. case rsa_sa_algo:
  27627. {
  27628. #if (defined(WOLFSSL_RENESAS_FSPSM_TLS) && \
  27629. defined(WOLFSSL_RENESAS_FSPSM_ECC)) || \
  27630. defined(WOLFSSL_RENESAS_TSIP_TLS)
  27631. /* already checked signature result by SCE */
  27632. /* skip the sign checks below */
  27633. if (Renesas_cmn_usable(ssl, 0)) {
  27634. break;
  27635. }
  27636. #endif
  27637. if (IsAtLeastTLSv1_2(ssl)) {
  27638. #ifdef WOLFSSL_SMALL_STACK
  27639. byte* encodedSig;
  27640. #else
  27641. byte encodedSig[MAX_ENCODED_SIG_SZ];
  27642. #endif
  27643. word32 encSigSz;
  27644. #ifdef WOLFSSL_SMALL_STACK
  27645. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  27646. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  27647. if (encodedSig == NULL) {
  27648. ERROR_OUT(MEMORY_E, exit_dske);
  27649. }
  27650. #endif
  27651. encSigSz = wc_EncodeSignature(encodedSig,
  27652. ssl->buffers.digest.buffer,
  27653. ssl->buffers.digest.length,
  27654. TypeHash(ssl->options.peerHashAlgo));
  27655. if (encSigSz != args->sigSz || !args->output ||
  27656. XMEMCMP(args->output, encodedSig,
  27657. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  27658. ret = VERIFY_SIGN_ERROR;
  27659. }
  27660. #ifdef WOLFSSL_SMALL_STACK
  27661. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  27662. #endif
  27663. if (ret != 0) {
  27664. goto exit_dske;
  27665. }
  27666. }
  27667. else if (args->sigSz != FINISHED_SZ ||
  27668. !args->output ||
  27669. XMEMCMP(args->output,
  27670. ssl->buffers.digest.buffer,
  27671. FINISHED_SZ) != 0) {
  27672. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  27673. }
  27674. /* CLIENT: Data verified with cert's public key. */
  27675. ssl->options.peerAuthGood =
  27676. ssl->options.havePeerCert;
  27677. break;
  27678. }
  27679. #endif /* !NO_RSA */
  27680. #ifdef HAVE_ECC
  27681. case ecc_dsa_sa_algo:
  27682. /* Nothing to do in this algo */
  27683. break;
  27684. #endif /* HAVE_ECC */
  27685. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  27686. case sm2_sa_algo:
  27687. /* Nothing to do in this algo */
  27688. break;
  27689. #endif /* WOLFSSL_SM2 && WOLFSSL_SM3 */
  27690. #if defined(HAVE_ED25519)
  27691. case ed25519_sa_algo:
  27692. /* Nothing to do in this algo */
  27693. break;
  27694. #endif /* HAVE_ED25519 */
  27695. #if defined(HAVE_ED448)
  27696. case ed448_sa_algo:
  27697. /* Nothing to do in this algo */
  27698. break;
  27699. #endif /* HAVE_ED448 */
  27700. default:
  27701. ret = ALGO_ID_E;
  27702. } /* switch (sigAlgo) */
  27703. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  27704. break;
  27705. }
  27706. default:
  27707. ret = BAD_KEA_TYPE_E;
  27708. } /* switch(ssl->specs.kea) */
  27709. /* Check for error */
  27710. if (ret != 0) {
  27711. goto exit_dske;
  27712. }
  27713. /* Advance state and proceed */
  27714. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  27715. } /* case TLS_ASYNC_VERIFY */
  27716. FALL_THROUGH;
  27717. case TLS_ASYNC_FINALIZE:
  27718. {
  27719. if (IsEncryptionOn(ssl, 0)) {
  27720. args->idx += ssl->keys.padSz;
  27721. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  27722. if (ssl->options.startedETMRead)
  27723. args->idx += MacSize(ssl);
  27724. #endif
  27725. }
  27726. /* Advance state and proceed */
  27727. ssl->options.asyncState = TLS_ASYNC_END;
  27728. } /* case TLS_ASYNC_FINALIZE */
  27729. FALL_THROUGH;
  27730. case TLS_ASYNC_END:
  27731. {
  27732. /* return index */
  27733. *inOutIdx = args->idx;
  27734. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  27735. break;
  27736. }
  27737. default:
  27738. ret = INPUT_CASE_ERROR;
  27739. } /* switch(ssl->options.asyncState) */
  27740. exit_dske:
  27741. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  27742. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  27743. #ifdef WOLFSSL_ASYNC_CRYPT
  27744. /* Handle async operation */
  27745. if (ret == WC_PENDING_E) {
  27746. /* Mark message as not received so it can process again */
  27747. ssl->msgsReceived.got_server_key_exchange = 0;
  27748. return ret;
  27749. }
  27750. /* Cleanup async */
  27751. FreeAsyncCtx(ssl, 0);
  27752. #else
  27753. FreeDskeArgs(ssl, args);
  27754. #endif /* WOLFSSL_ASYNC_CRYPT */
  27755. /* Final cleanup */
  27756. FreeKeyExchange(ssl);
  27757. if (ret != 0) {
  27758. WOLFSSL_ERROR_VERBOSE(ret);
  27759. }
  27760. return ret;
  27761. }
  27762. typedef struct SckeArgs {
  27763. byte* output; /* not allocated */
  27764. byte* encSecret;
  27765. byte* input;
  27766. word32 encSz;
  27767. word32 length;
  27768. int sendSz;
  27769. int inputSz;
  27770. } SckeArgs;
  27771. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  27772. {
  27773. SckeArgs* args = (SckeArgs*)pArgs;
  27774. (void)ssl;
  27775. if (args->encSecret) {
  27776. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  27777. args->encSecret = NULL;
  27778. }
  27779. if (args->input) {
  27780. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27781. args->input = NULL;
  27782. }
  27783. }
  27784. /* handle generation client_key_exchange (16) */
  27785. int SendClientKeyExchange(WOLFSSL* ssl)
  27786. {
  27787. int ret = 0;
  27788. #ifdef WOLFSSL_ASYNC_IO
  27789. SckeArgs* args = NULL;
  27790. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  27791. #else
  27792. SckeArgs args[1];
  27793. #endif
  27794. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  27795. WOLFSSL_ENTER("SendClientKeyExchange");
  27796. #ifdef OPENSSL_EXTRA
  27797. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  27798. ssl->cbmode = SSL_CB_MODE_WRITE;
  27799. if (ssl->CBIS != NULL)
  27800. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, WOLFSSL_SUCCESS);
  27801. #endif
  27802. #ifdef WOLFSSL_ASYNC_IO
  27803. if (ssl->async == NULL) {
  27804. ssl->async = (struct WOLFSSL_ASYNC*)
  27805. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  27806. DYNAMIC_TYPE_ASYNC);
  27807. if (ssl->async == NULL)
  27808. ERROR_OUT(MEMORY_E, exit_scke);
  27809. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  27810. }
  27811. args = (SckeArgs*)ssl->async->args;
  27812. #ifdef WOLFSSL_ASYNC_CRYPT
  27813. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  27814. if (ret != WC_NO_PENDING_E) {
  27815. /* Check for error */
  27816. if (ret < 0)
  27817. goto exit_scke;
  27818. }
  27819. else
  27820. #endif
  27821. if (ssl->options.buildingMsg) {
  27822. /* Continue building the message */
  27823. }
  27824. else
  27825. #endif
  27826. {
  27827. /* Reset state */
  27828. ret = 0;
  27829. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  27830. XMEMSET(args, 0, sizeof(SckeArgs));
  27831. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  27832. * is not advanced yet */
  27833. ssl->options.buildingMsg = 1;
  27834. #ifdef WOLFSSL_ASYNC_IO
  27835. ssl->async->freeArgs = FreeSckeArgs;
  27836. #endif
  27837. }
  27838. switch(ssl->options.asyncState)
  27839. {
  27840. case TLS_ASYNC_BEGIN:
  27841. {
  27842. switch (ssl->specs.kea) {
  27843. #ifndef NO_RSA
  27844. case rsa_kea:
  27845. if (ssl->peerRsaKey == NULL ||
  27846. ssl->peerRsaKeyPresent == 0) {
  27847. ERROR_OUT(NO_PEER_KEY, exit_scke);
  27848. }
  27849. break;
  27850. #endif
  27851. #ifndef NO_DH
  27852. case diffie_hellman_kea:
  27853. if (ssl->buffers.serverDH_P.buffer == NULL ||
  27854. ssl->buffers.serverDH_G.buffer == NULL ||
  27855. ssl->buffers.serverDH_Pub.buffer == NULL) {
  27856. ERROR_OUT(NO_PEER_KEY, exit_scke);
  27857. }
  27858. break;
  27859. #endif /* NO_DH */
  27860. #ifndef NO_PSK
  27861. case psk_kea:
  27862. /* sanity check that PSK client callback has been set */
  27863. if (ssl->options.client_psk_cb == NULL) {
  27864. WOLFSSL_MSG("No client PSK callback set");
  27865. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  27866. }
  27867. break;
  27868. #endif /* NO_PSK */
  27869. #if !defined(NO_DH) && !defined(NO_PSK)
  27870. case dhe_psk_kea:
  27871. if (ssl->buffers.serverDH_P.buffer == NULL ||
  27872. ssl->buffers.serverDH_G.buffer == NULL ||
  27873. ssl->buffers.serverDH_Pub.buffer == NULL) {
  27874. ERROR_OUT(NO_PEER_KEY, exit_scke);
  27875. }
  27876. /* sanity check that PSK client callback has been set */
  27877. if (ssl->options.client_psk_cb == NULL) {
  27878. WOLFSSL_MSG("No client PSK callback set");
  27879. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  27880. }
  27881. break;
  27882. #endif /* !NO_DH && !NO_PSK */
  27883. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27884. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27885. case ecdhe_psk_kea:
  27886. /* sanity check that PSK client callback has been set */
  27887. if (ssl->options.client_psk_cb == NULL) {
  27888. WOLFSSL_MSG("No client PSK callback set");
  27889. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  27890. }
  27891. #ifdef HAVE_CURVE25519
  27892. if (ssl->peerX25519KeyPresent) {
  27893. /* Check client ECC public key */
  27894. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  27895. ERROR_OUT(NO_PEER_KEY, exit_scke);
  27896. }
  27897. #ifdef HAVE_PK_CALLBACKS
  27898. /* if callback then use it for shared secret */
  27899. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  27900. break;
  27901. }
  27902. #endif
  27903. /* create private key */
  27904. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  27905. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  27906. if (ret != 0) {
  27907. goto exit_scke;
  27908. }
  27909. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  27910. ssl->peerX25519Key);
  27911. break;
  27912. }
  27913. #endif
  27914. #ifdef HAVE_CURVE448
  27915. if (ssl->peerX448KeyPresent) {
  27916. /* Check client ECC public key */
  27917. if (!ssl->peerX448Key) {
  27918. ERROR_OUT(NO_PEER_KEY, exit_scke);
  27919. }
  27920. #ifdef HAVE_PK_CALLBACKS
  27921. /* if callback then use it for shared secret */
  27922. if (ssl->ctx->X448SharedSecretCb != NULL) {
  27923. break;
  27924. }
  27925. #endif
  27926. /* create private key */
  27927. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  27928. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  27929. if (ret != 0) {
  27930. goto exit_scke;
  27931. }
  27932. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  27933. ssl->peerX448Key);
  27934. break;
  27935. }
  27936. #endif
  27937. /* Check client ECC public key */
  27938. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  27939. !ssl->peerEccKey->dp) {
  27940. ERROR_OUT(NO_PEER_KEY, exit_scke);
  27941. }
  27942. #ifdef HAVE_PK_CALLBACKS
  27943. /* if callback then use it for shared secret */
  27944. if (ssl->ctx->EccSharedSecretCb != NULL) {
  27945. break;
  27946. }
  27947. #endif
  27948. /* create ephemeral private key */
  27949. ssl->hsType = DYNAMIC_TYPE_ECC;
  27950. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  27951. if (ret != 0) {
  27952. goto exit_scke;
  27953. }
  27954. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  27955. break;
  27956. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  27957. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27958. defined(HAVE_CURVE448)
  27959. case ecc_diffie_hellman_kea:
  27960. {
  27961. #ifdef HAVE_ECC
  27962. ecc_key* peerKey;
  27963. #endif
  27964. #ifdef HAVE_PK_CALLBACKS
  27965. /* if callback then use it for shared secret */
  27966. #ifdef HAVE_CURVE25519
  27967. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27968. if (ssl->ctx->X25519SharedSecretCb != NULL)
  27969. break;
  27970. }
  27971. else
  27972. #endif
  27973. #ifdef HAVE_CURVE448
  27974. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27975. if (ssl->ctx->X448SharedSecretCb != NULL)
  27976. break;
  27977. }
  27978. else
  27979. #endif
  27980. #ifdef HAVE_ECC
  27981. if (ssl->ctx->EccSharedSecretCb != NULL) {
  27982. break;
  27983. }
  27984. else
  27985. #endif
  27986. {
  27987. }
  27988. #endif /* HAVE_PK_CALLBACKS */
  27989. #ifdef HAVE_CURVE25519
  27990. if (ssl->peerX25519KeyPresent) {
  27991. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  27992. ERROR_OUT(NO_PEER_KEY, exit_scke);
  27993. }
  27994. /* create private key */
  27995. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  27996. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  27997. if (ret != 0) {
  27998. goto exit_scke;
  27999. }
  28000. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  28001. ssl->peerX25519Key);
  28002. break;
  28003. }
  28004. #endif
  28005. #ifdef HAVE_CURVE448
  28006. if (ssl->peerX448KeyPresent) {
  28007. if (!ssl->peerX448Key) {
  28008. ERROR_OUT(NO_PEER_KEY, exit_scke);
  28009. }
  28010. /* create private key */
  28011. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  28012. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  28013. if (ret != 0) {
  28014. goto exit_scke;
  28015. }
  28016. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  28017. ssl->peerX448Key);
  28018. break;
  28019. }
  28020. #endif
  28021. #ifdef HAVE_ECC
  28022. if (ssl->specs.static_ecdh) {
  28023. /* Note: EccDsa is really fixed Ecc key here */
  28024. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
  28025. ERROR_OUT(NO_PEER_KEY, exit_scke);
  28026. }
  28027. peerKey = ssl->peerEccDsaKey;
  28028. }
  28029. else {
  28030. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
  28031. ERROR_OUT(NO_PEER_KEY, exit_scke);
  28032. }
  28033. peerKey = ssl->peerEccKey;
  28034. }
  28035. if (peerKey == NULL) {
  28036. ERROR_OUT(NO_PEER_KEY, exit_scke);
  28037. }
  28038. /* create ephemeral private key */
  28039. ssl->hsType = DYNAMIC_TYPE_ECC;
  28040. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  28041. if (ret != 0) {
  28042. goto exit_scke;
  28043. }
  28044. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  28045. #endif /* HAVE_ECC */
  28046. break;
  28047. }
  28048. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28049. default:
  28050. ret = BAD_KEA_TYPE_E;
  28051. } /* switch(ssl->specs.kea) */
  28052. /* Check for error */
  28053. if (ret != 0) {
  28054. goto exit_scke;
  28055. }
  28056. /* Advance state and proceed */
  28057. ssl->options.asyncState = TLS_ASYNC_BUILD;
  28058. } /* case TLS_ASYNC_BEGIN */
  28059. FALL_THROUGH;
  28060. case TLS_ASYNC_BUILD:
  28061. {
  28062. args->encSz = MAX_ENCRYPT_SZ;
  28063. args->encSecret = (byte*)XMALLOC(MAX_ENCRYPT_SZ, ssl->heap,
  28064. DYNAMIC_TYPE_SECRET);
  28065. if (args->encSecret == NULL) {
  28066. ERROR_OUT(MEMORY_E, exit_scke);
  28067. }
  28068. if (ssl->arrays->preMasterSecret == NULL) {
  28069. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  28070. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  28071. ssl->heap, DYNAMIC_TYPE_SECRET);
  28072. if (ssl->arrays->preMasterSecret == NULL) {
  28073. ERROR_OUT(MEMORY_E, exit_scke);
  28074. }
  28075. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  28076. }
  28077. switch(ssl->specs.kea)
  28078. {
  28079. #ifndef NO_RSA
  28080. case rsa_kea:
  28081. {
  28082. #ifdef HAVE_PK_CALLBACKS
  28083. if (ssl->ctx->GenPreMasterCb) {
  28084. void* ctx = wolfSSL_GetGenPreMasterCtx(ssl);
  28085. ret = ssl->ctx->GenPreMasterCb(ssl,
  28086. ssl->arrays->preMasterSecret, ENCRYPT_LEN, ctx);
  28087. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  28088. goto exit_scke;
  28089. }
  28090. }
  28091. if (!ssl->ctx->GenPreMasterCb || ret == PROTOCOLCB_UNAVAILABLE)
  28092. #endif
  28093. {
  28094. /* build PreMasterSecret with RNG data */
  28095. ret = wc_RNG_GenerateBlock(ssl->rng,
  28096. &ssl->arrays->preMasterSecret[VERSION_SZ],
  28097. SECRET_LEN - VERSION_SZ);
  28098. if (ret != 0) {
  28099. goto exit_scke;
  28100. }
  28101. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  28102. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  28103. ssl->arrays->preMasterSz = SECRET_LEN;
  28104. }
  28105. break;
  28106. }
  28107. #endif /* !NO_RSA */
  28108. #ifndef NO_DH
  28109. case diffie_hellman_kea:
  28110. {
  28111. ssl->buffers.sig.length = ENCRYPT_LEN;
  28112. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  28113. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  28114. if (ssl->buffers.sig.buffer == NULL) {
  28115. ERROR_OUT(MEMORY_E, exit_scke);
  28116. }
  28117. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  28118. (void**)&ssl->buffers.serverDH_Key);
  28119. if (ret != 0) {
  28120. goto exit_scke;
  28121. }
  28122. #if defined(HAVE_FFDHE) && !defined(HAVE_PUBLIC_FFDHE)
  28123. if (ssl->namedGroup) {
  28124. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  28125. ssl->namedGroup);
  28126. if (ret != 0) {
  28127. goto exit_scke;
  28128. }
  28129. ssl->buffers.sig.length =
  28130. wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  28131. }
  28132. else
  28133. #endif
  28134. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  28135. !defined(WOLFSSL_OLD_PRIME_CHECK)
  28136. if (ssl->options.dhDoKeyTest &&
  28137. !ssl->options.dhKeyTested)
  28138. {
  28139. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  28140. ssl->buffers.serverDH_P.buffer,
  28141. ssl->buffers.serverDH_P.length,
  28142. ssl->buffers.serverDH_G.buffer,
  28143. ssl->buffers.serverDH_G.length,
  28144. NULL, 0, 0, ssl->rng);
  28145. if (ret != 0) {
  28146. goto exit_scke;
  28147. }
  28148. ssl->options.dhKeyTested = 1;
  28149. }
  28150. else
  28151. #endif
  28152. {
  28153. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  28154. ssl->buffers.serverDH_P.buffer,
  28155. ssl->buffers.serverDH_P.length,
  28156. ssl->buffers.serverDH_G.buffer,
  28157. ssl->buffers.serverDH_G.length);
  28158. if (ret != 0) {
  28159. goto exit_scke;
  28160. }
  28161. }
  28162. /* for DH, encSecret is Yc, agree is pre-master */
  28163. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  28164. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  28165. args->encSecret, &args->encSz);
  28166. /* set the max agree result size */
  28167. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  28168. break;
  28169. }
  28170. #endif /* !NO_DH */
  28171. #ifndef NO_PSK
  28172. case psk_kea:
  28173. {
  28174. byte* pms = ssl->arrays->preMasterSecret;
  28175. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  28176. ssl->arrays->server_hint, ssl->arrays->client_identity,
  28177. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  28178. if (ssl->arrays->psk_keySz == 0 ||
  28179. (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
  28180. (int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
  28181. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  28182. }
  28183. /* Ensure the buffer is null-terminated. */
  28184. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
  28185. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  28186. if (args->encSz > MAX_PSK_ID_LEN) {
  28187. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  28188. }
  28189. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  28190. args->encSz);
  28191. ssl->options.peerAuthGood = 1;
  28192. if ((int)ssl->arrays->psk_keySz > 0) {
  28193. /* CLIENT: Pre-shared Key for peer authentication. */
  28194. /* make psk pre master secret */
  28195. /* length of key + length 0s + length of key + key */
  28196. c16toa((word16)ssl->arrays->psk_keySz, pms);
  28197. pms += OPAQUE16_LEN;
  28198. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  28199. pms += ssl->arrays->psk_keySz;
  28200. c16toa((word16)ssl->arrays->psk_keySz, pms);
  28201. pms += OPAQUE16_LEN;
  28202. XMEMCPY(pms, ssl->arrays->psk_key,
  28203. ssl->arrays->psk_keySz);
  28204. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2)
  28205. + (2 * OPAQUE16_LEN);
  28206. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  28207. }
  28208. ssl->arrays->psk_keySz = 0; /* No further need */
  28209. break;
  28210. }
  28211. #endif /* !NO_PSK */
  28212. #if !defined(NO_DH) && !defined(NO_PSK)
  28213. case dhe_psk_kea:
  28214. {
  28215. word32 esSz = 0;
  28216. args->output = args->encSecret;
  28217. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  28218. ssl->arrays->server_hint, ssl->arrays->client_identity,
  28219. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  28220. if (ssl->arrays->psk_keySz == 0 ||
  28221. (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
  28222. (int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
  28223. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  28224. }
  28225. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  28226. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  28227. if (esSz > MAX_PSK_ID_LEN) {
  28228. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  28229. }
  28230. /* CLIENT: Pre-shared Key for peer authentication. */
  28231. ssl->options.peerAuthGood = 1;
  28232. ssl->buffers.sig.length = ENCRYPT_LEN;
  28233. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  28234. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  28235. if (ssl->buffers.sig.buffer == NULL) {
  28236. ERROR_OUT(MEMORY_E, exit_scke);
  28237. }
  28238. c16toa((word16)esSz, args->output);
  28239. args->output += OPAQUE16_LEN;
  28240. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  28241. args->output += esSz;
  28242. args->length = args->encSz - esSz - OPAQUE16_LEN;
  28243. args->encSz = esSz + OPAQUE16_LEN;
  28244. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  28245. (void**)&ssl->buffers.serverDH_Key);
  28246. if (ret != 0) {
  28247. goto exit_scke;
  28248. }
  28249. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  28250. !defined(WOLFSSL_OLD_PRIME_CHECK)
  28251. if (ssl->options.dhDoKeyTest &&
  28252. !ssl->options.dhKeyTested)
  28253. {
  28254. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  28255. ssl->buffers.serverDH_P.buffer,
  28256. ssl->buffers.serverDH_P.length,
  28257. ssl->buffers.serverDH_G.buffer,
  28258. ssl->buffers.serverDH_G.length,
  28259. NULL, 0, 0, ssl->rng);
  28260. if (ret != 0) {
  28261. goto exit_scke;
  28262. }
  28263. ssl->options.dhKeyTested = 1;
  28264. }
  28265. else
  28266. #endif
  28267. {
  28268. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  28269. ssl->buffers.serverDH_P.buffer,
  28270. ssl->buffers.serverDH_P.length,
  28271. ssl->buffers.serverDH_G.buffer,
  28272. ssl->buffers.serverDH_G.length);
  28273. if (ret != 0) {
  28274. goto exit_scke;
  28275. }
  28276. }
  28277. /* for DH, encSecret is Yc, agree is pre-master */
  28278. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  28279. ssl->buffers.sig.buffer,
  28280. (word32*)&ssl->buffers.sig.length,
  28281. args->output + OPAQUE16_LEN, &args->length);
  28282. break;
  28283. }
  28284. #endif /* !NO_DH && !NO_PSK */
  28285. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28286. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28287. case ecdhe_psk_kea:
  28288. {
  28289. word32 esSz = 0;
  28290. args->output = args->encSecret;
  28291. /* Send PSK client identity */
  28292. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  28293. ssl->arrays->server_hint, ssl->arrays->client_identity,
  28294. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  28295. if (ssl->arrays->psk_keySz == 0 ||
  28296. (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
  28297. (int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
  28298. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  28299. }
  28300. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  28301. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  28302. if (esSz > MAX_PSK_ID_LEN) {
  28303. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  28304. }
  28305. /* CLIENT: Pre-shared Key for peer authentication. */
  28306. ssl->options.peerAuthGood = 1;
  28307. /* place size and identity in output buffer sz:identity */
  28308. c16toa((word16)esSz, args->output);
  28309. args->output += OPAQUE16_LEN;
  28310. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  28311. args->output += esSz;
  28312. args->encSz = esSz + OPAQUE16_LEN;
  28313. /* length is used for public key size */
  28314. args->length = MAX_ENCRYPT_SZ;
  28315. /* Create shared ECC key leaving room at the beginning
  28316. * of buffer for size of shared key. */
  28317. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  28318. #ifdef HAVE_CURVE25519
  28319. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  28320. #ifdef HAVE_PK_CALLBACKS
  28321. /* if callback then use it for shared secret */
  28322. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  28323. break;
  28324. }
  28325. #endif
  28326. ret = wc_curve25519_export_public_ex(
  28327. (curve25519_key*)ssl->hsKey,
  28328. args->output + OPAQUE8_LEN, &args->length,
  28329. EC25519_LITTLE_ENDIAN);
  28330. if (ret != 0) {
  28331. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  28332. }
  28333. break;
  28334. }
  28335. #endif
  28336. #ifdef HAVE_CURVE448
  28337. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  28338. #ifdef HAVE_PK_CALLBACKS
  28339. /* if callback then use it for shared secret */
  28340. if (ssl->ctx->X448SharedSecretCb != NULL) {
  28341. break;
  28342. }
  28343. #endif
  28344. ret = wc_curve448_export_public_ex(
  28345. (curve448_key*)ssl->hsKey,
  28346. args->output + OPAQUE8_LEN, &args->length,
  28347. EC448_LITTLE_ENDIAN);
  28348. if (ret != 0) {
  28349. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  28350. }
  28351. break;
  28352. }
  28353. #endif
  28354. #ifdef HAVE_PK_CALLBACKS
  28355. /* if callback then use it for shared secret */
  28356. if (ssl->ctx->EccSharedSecretCb != NULL) {
  28357. break;
  28358. }
  28359. #endif
  28360. /* Place ECC key in output buffer, leaving room for size */
  28361. PRIVATE_KEY_UNLOCK();
  28362. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  28363. args->output + OPAQUE8_LEN, &args->length);
  28364. PRIVATE_KEY_LOCK();
  28365. if (ret != 0) {
  28366. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  28367. }
  28368. break;
  28369. }
  28370. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  28371. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28372. defined(HAVE_CURVE448)
  28373. case ecc_diffie_hellman_kea:
  28374. {
  28375. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  28376. #ifdef HAVE_CURVE25519
  28377. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  28378. #ifdef HAVE_PK_CALLBACKS
  28379. /* if callback then use it for shared secret */
  28380. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  28381. break;
  28382. }
  28383. #endif
  28384. ret = wc_curve25519_export_public_ex(
  28385. (curve25519_key*)ssl->hsKey,
  28386. args->encSecret + OPAQUE8_LEN, &args->encSz,
  28387. EC25519_LITTLE_ENDIAN);
  28388. if (ret != 0) {
  28389. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  28390. }
  28391. break;
  28392. }
  28393. #endif
  28394. #ifdef HAVE_CURVE448
  28395. if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
  28396. #ifdef HAVE_PK_CALLBACKS
  28397. /* if callback then use it for shared secret */
  28398. if (ssl->ctx->X448SharedSecretCb != NULL) {
  28399. break;
  28400. }
  28401. #endif
  28402. ret = wc_curve448_export_public_ex(
  28403. (curve448_key*)ssl->hsKey,
  28404. args->encSecret + OPAQUE8_LEN, &args->encSz,
  28405. EC448_LITTLE_ENDIAN);
  28406. if (ret != 0) {
  28407. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  28408. }
  28409. break;
  28410. }
  28411. #endif
  28412. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  28413. #ifdef HAVE_PK_CALLBACKS
  28414. /* if callback then use it for shared secret */
  28415. if (ssl->ctx->EccSharedSecretCb != NULL) {
  28416. break;
  28417. }
  28418. #endif
  28419. /* Place ECC key in buffer, leaving room for size */
  28420. PRIVATE_KEY_UNLOCK();
  28421. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  28422. args->encSecret + OPAQUE8_LEN, &args->encSz);
  28423. PRIVATE_KEY_LOCK();
  28424. if (ret != 0) {
  28425. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  28426. }
  28427. #endif /* HAVE_ECC */
  28428. break;
  28429. }
  28430. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28431. default:
  28432. ret = BAD_KEA_TYPE_E;
  28433. } /* switch(ssl->specs.kea) */
  28434. /* Check for error */
  28435. if (ret != 0) {
  28436. goto exit_scke;
  28437. }
  28438. /* Advance state and proceed */
  28439. ssl->options.asyncState = TLS_ASYNC_DO;
  28440. } /* case TLS_ASYNC_BUILD */
  28441. FALL_THROUGH;
  28442. case TLS_ASYNC_DO:
  28443. {
  28444. switch(ssl->specs.kea)
  28445. {
  28446. #ifndef NO_RSA
  28447. case rsa_kea:
  28448. {
  28449. ret = RsaEnc(ssl,
  28450. ssl->arrays->preMasterSecret, SECRET_LEN,
  28451. args->encSecret, &args->encSz,
  28452. ssl->peerRsaKey,
  28453. #if defined(HAVE_PK_CALLBACKS)
  28454. &ssl->buffers.peerRsaKey
  28455. #else
  28456. NULL
  28457. #endif
  28458. );
  28459. break;
  28460. }
  28461. #endif /* !NO_RSA */
  28462. #ifndef NO_DH
  28463. case diffie_hellman_kea:
  28464. {
  28465. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  28466. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  28467. ssl->buffers.serverDH_Pub.buffer,
  28468. ssl->buffers.serverDH_Pub.length,
  28469. ssl->arrays->preMasterSecret,
  28470. &ssl->arrays->preMasterSz,
  28471. ssl->buffers.serverDH_P.buffer,
  28472. ssl->buffers.serverDH_P.length);
  28473. break;
  28474. }
  28475. #endif /* !NO_DH */
  28476. #ifndef NO_PSK
  28477. case psk_kea:
  28478. {
  28479. break;
  28480. }
  28481. #endif /* !NO_PSK */
  28482. #if !defined(NO_DH) && !defined(NO_PSK)
  28483. case dhe_psk_kea:
  28484. {
  28485. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  28486. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  28487. ssl->buffers.serverDH_Pub.buffer,
  28488. ssl->buffers.serverDH_Pub.length,
  28489. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  28490. &ssl->arrays->preMasterSz,
  28491. ssl->buffers.serverDH_P.buffer,
  28492. ssl->buffers.serverDH_P.length);
  28493. break;
  28494. }
  28495. #endif /* !NO_DH && !NO_PSK */
  28496. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28497. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28498. case ecdhe_psk_kea:
  28499. {
  28500. #ifdef HAVE_CURVE25519
  28501. if (ssl->peerX25519KeyPresent) {
  28502. ret = X25519SharedSecret(ssl,
  28503. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  28504. args->output + OPAQUE8_LEN, &args->length,
  28505. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  28506. &ssl->arrays->preMasterSz,
  28507. WOLFSSL_CLIENT_END
  28508. );
  28509. if (!ssl->specs.static_ecdh
  28510. #ifdef WOLFSSL_ASYNC_CRYPT
  28511. && ret != WC_PENDING_E
  28512. #endif
  28513. ) {
  28514. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  28515. (void**)&ssl->peerX25519Key);
  28516. ssl->peerX25519KeyPresent = 0;
  28517. }
  28518. break;
  28519. }
  28520. #endif
  28521. #ifdef HAVE_CURVE448
  28522. if (ssl->peerX448KeyPresent) {
  28523. ret = X448SharedSecret(ssl,
  28524. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  28525. args->output + OPAQUE8_LEN, &args->length,
  28526. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  28527. &ssl->arrays->preMasterSz,
  28528. WOLFSSL_CLIENT_END
  28529. );
  28530. if (!ssl->specs.static_ecdh
  28531. #ifdef WOLFSSL_ASYNC_CRYPT
  28532. && ret != WC_PENDING_E
  28533. #endif
  28534. ) {
  28535. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  28536. (void**)&ssl->peerX448Key);
  28537. ssl->peerX448KeyPresent = 0;
  28538. }
  28539. break;
  28540. }
  28541. #endif
  28542. ret = EccSharedSecret(ssl,
  28543. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  28544. args->output + OPAQUE8_LEN, &args->length,
  28545. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  28546. &ssl->arrays->preMasterSz,
  28547. WOLFSSL_CLIENT_END
  28548. );
  28549. #ifdef WOLFSSL_ASYNC_CRYPT
  28550. if (ret != WC_PENDING_E)
  28551. #endif
  28552. {
  28553. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  28554. (void**)&ssl->peerEccKey);
  28555. ssl->peerEccKeyPresent = 0;
  28556. }
  28557. break;
  28558. }
  28559. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  28560. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28561. defined(HAVE_CURVE448)
  28562. case ecc_diffie_hellman_kea:
  28563. {
  28564. #ifdef HAVE_ECC
  28565. ecc_key* peerKey;
  28566. #endif
  28567. #ifdef HAVE_CURVE25519
  28568. if (ssl->peerX25519KeyPresent) {
  28569. ret = X25519SharedSecret(ssl,
  28570. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  28571. args->encSecret + OPAQUE8_LEN, &args->encSz,
  28572. ssl->arrays->preMasterSecret,
  28573. &ssl->arrays->preMasterSz,
  28574. WOLFSSL_CLIENT_END
  28575. );
  28576. if (!ssl->specs.static_ecdh
  28577. #ifdef WOLFSSL_ASYNC_CRYPT
  28578. && ret != WC_PENDING_E
  28579. #endif
  28580. ) {
  28581. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  28582. (void**)&ssl->peerX25519Key);
  28583. ssl->peerX25519KeyPresent = 0;
  28584. }
  28585. break;
  28586. }
  28587. #endif
  28588. #ifdef HAVE_CURVE448
  28589. if (ssl->peerX448KeyPresent) {
  28590. ret = X448SharedSecret(ssl,
  28591. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  28592. args->encSecret + OPAQUE8_LEN, &args->encSz,
  28593. ssl->arrays->preMasterSecret,
  28594. &ssl->arrays->preMasterSz,
  28595. WOLFSSL_CLIENT_END
  28596. );
  28597. if (!ssl->specs.static_ecdh
  28598. #ifdef WOLFSSL_ASYNC_CRYPT
  28599. && ret != WC_PENDING_E
  28600. #endif
  28601. ) {
  28602. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  28603. (void**)&ssl->peerX448Key);
  28604. ssl->peerX448KeyPresent = 0;
  28605. }
  28606. break;
  28607. }
  28608. #endif
  28609. #ifdef HAVE_ECC
  28610. peerKey = (ssl->specs.static_ecdh) ?
  28611. ssl->peerEccDsaKey : ssl->peerEccKey;
  28612. ret = EccSharedSecret(ssl,
  28613. (ecc_key*)ssl->hsKey, peerKey,
  28614. args->encSecret + OPAQUE8_LEN, &args->encSz,
  28615. ssl->arrays->preMasterSecret,
  28616. &ssl->arrays->preMasterSz,
  28617. WOLFSSL_CLIENT_END);
  28618. if (!ssl->specs.static_ecdh
  28619. #ifdef WOLFSSL_ASYNC_CRYPT
  28620. && ret != WC_PENDING_E
  28621. #endif
  28622. && !ssl->options.keepResources) {
  28623. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  28624. (void**)&ssl->peerEccKey);
  28625. ssl->peerEccKeyPresent = 0;
  28626. }
  28627. #endif
  28628. break;
  28629. }
  28630. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28631. default:
  28632. ret = BAD_KEA_TYPE_E;
  28633. } /* switch(ssl->specs.kea) */
  28634. /* Check for error */
  28635. if (ret != 0) {
  28636. goto exit_scke;
  28637. }
  28638. /* Advance state and proceed */
  28639. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  28640. } /* case TLS_ASYNC_DO */
  28641. FALL_THROUGH;
  28642. case TLS_ASYNC_VERIFY:
  28643. {
  28644. switch(ssl->specs.kea)
  28645. {
  28646. #ifndef NO_RSA
  28647. case rsa_kea:
  28648. {
  28649. break;
  28650. }
  28651. #endif /* !NO_RSA */
  28652. #ifndef NO_DH
  28653. case diffie_hellman_kea:
  28654. {
  28655. break;
  28656. }
  28657. #endif /* !NO_DH */
  28658. #ifndef NO_PSK
  28659. case psk_kea:
  28660. {
  28661. break;
  28662. }
  28663. #endif /* !NO_PSK */
  28664. #if !defined(NO_DH) && !defined(NO_PSK)
  28665. case dhe_psk_kea:
  28666. {
  28667. byte* pms = ssl->arrays->preMasterSecret;
  28668. /* validate args */
  28669. if (args->output == NULL || args->length == 0) {
  28670. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  28671. }
  28672. c16toa((word16)args->length, args->output);
  28673. args->encSz += args->length + OPAQUE16_LEN;
  28674. c16toa((word16)ssl->arrays->preMasterSz, pms);
  28675. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  28676. pms += ssl->arrays->preMasterSz;
  28677. /* make psk pre master secret */
  28678. if ((int)ssl->arrays->psk_keySz > 0) {
  28679. /* length of key + length 0s + length of key + key */
  28680. c16toa((word16)ssl->arrays->psk_keySz, pms);
  28681. pms += OPAQUE16_LEN;
  28682. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  28683. ssl->arrays->preMasterSz +=
  28684. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  28685. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  28686. }
  28687. ssl->arrays->psk_keySz = 0; /* No further need */
  28688. break;
  28689. }
  28690. #endif /* !NO_DH && !NO_PSK */
  28691. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28692. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28693. case ecdhe_psk_kea:
  28694. {
  28695. byte* pms = ssl->arrays->preMasterSecret;
  28696. /* validate args */
  28697. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  28698. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  28699. }
  28700. /* place size of public key in output buffer */
  28701. *args->output = (byte)args->length;
  28702. args->encSz += args->length + OPAQUE8_LEN;
  28703. /* Create pre master secret is the concatenation of
  28704. * eccSize + eccSharedKey + pskSize + pskKey */
  28705. c16toa((word16)ssl->arrays->preMasterSz, pms);
  28706. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  28707. pms += ssl->arrays->preMasterSz;
  28708. if ((int)ssl->arrays->psk_keySz > 0) {
  28709. c16toa((word16)ssl->arrays->psk_keySz, pms);
  28710. pms += OPAQUE16_LEN;
  28711. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  28712. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
  28713. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  28714. }
  28715. ssl->arrays->psk_keySz = 0; /* No further need */
  28716. break;
  28717. }
  28718. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  28719. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28720. defined(HAVE_CURVE448)
  28721. case ecc_diffie_hellman_kea:
  28722. {
  28723. if (args->encSecret == NULL) {
  28724. ret = BAD_STATE_E;
  28725. goto exit_scke;
  28726. }
  28727. else {
  28728. /* place size of public key in buffer */
  28729. *args->encSecret = (byte)args->encSz;
  28730. args->encSz += OPAQUE8_LEN;
  28731. }
  28732. break;
  28733. }
  28734. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28735. default:
  28736. ret = BAD_KEA_TYPE_E;
  28737. } /* switch(ssl->specs.kea) */
  28738. /* Check for error */
  28739. if (ret != 0) {
  28740. goto exit_scke;
  28741. }
  28742. /* Advance state and proceed */
  28743. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  28744. } /* case TLS_ASYNC_VERIFY */
  28745. FALL_THROUGH;
  28746. case TLS_ASYNC_FINALIZE:
  28747. {
  28748. word32 tlsSz = 0;
  28749. word32 idx = 0;
  28750. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  28751. tlsSz = 2;
  28752. }
  28753. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  28754. ssl->specs.kea == dhe_psk_kea ||
  28755. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  28756. tlsSz = 0;
  28757. }
  28758. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  28759. args->sendSz = args->encSz + tlsSz + idx;
  28760. #ifdef WOLFSSL_DTLS
  28761. if (ssl->options.dtls) {
  28762. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  28763. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  28764. }
  28765. #endif
  28766. if (IsEncryptionOn(ssl, 1)) {
  28767. args->sendSz += MAX_MSG_EXTRA;
  28768. }
  28769. /* check for available size */
  28770. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0)
  28771. goto exit_scke;
  28772. /* get output buffer */
  28773. args->output = GetOutputBuffer(ssl);
  28774. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  28775. if (tlsSz) {
  28776. c16toa((word16)args->encSz, &args->output[idx]);
  28777. idx += OPAQUE16_LEN;
  28778. }
  28779. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  28780. idx += args->encSz;
  28781. if (IsEncryptionOn(ssl, 1)) {
  28782. int recordHeaderSz = RECORD_HEADER_SZ;
  28783. if (ssl->options.dtls)
  28784. recordHeaderSz += DTLS_RECORD_EXTRA;
  28785. args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
  28786. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  28787. DYNAMIC_TYPE_IN_BUFFER);
  28788. if (args->input == NULL) {
  28789. ERROR_OUT(MEMORY_E, exit_scke);
  28790. }
  28791. XMEMCPY(args->input, args->output + recordHeaderSz,
  28792. args->inputSz);
  28793. }
  28794. /* Advance state and proceed */
  28795. ssl->options.asyncState = TLS_ASYNC_END;
  28796. } /* case TLS_ASYNC_FINALIZE */
  28797. FALL_THROUGH;
  28798. case TLS_ASYNC_END:
  28799. {
  28800. if (IsEncryptionOn(ssl, 1)) {
  28801. #ifdef WOLFSSL_DTLS
  28802. if (IsDtlsNotSctpMode(ssl) &&
  28803. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
  28804. goto exit_scke;
  28805. }
  28806. #endif
  28807. ret = BuildMessage(ssl, args->output, args->sendSz,
  28808. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  28809. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28810. args->input = NULL; /* make sure its not double free'd on cleanup */
  28811. if (ret >= 0) {
  28812. args->sendSz = ret;
  28813. ret = 0;
  28814. }
  28815. }
  28816. else {
  28817. #ifdef WOLFSSL_DTLS
  28818. if (IsDtlsNotSctpMode(ssl)) {
  28819. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
  28820. goto exit_scke;
  28821. }
  28822. }
  28823. if (ssl->options.dtls)
  28824. DtlsSEQIncrement(ssl, CUR_ORDER);
  28825. #endif
  28826. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  28827. }
  28828. if (ret != 0) {
  28829. goto exit_scke;
  28830. }
  28831. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  28832. if (ssl->hsInfoOn)
  28833. AddPacketName(ssl, "ClientKeyExchange");
  28834. if (ssl->toInfoOn) {
  28835. ret = AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  28836. args->output, args->sendSz, WRITE_PROTO, 0, ssl->heap);
  28837. if (ret != 0) {
  28838. goto exit_scke;
  28839. }
  28840. }
  28841. #endif
  28842. ssl->buffers.outputBuffer.length += args->sendSz;
  28843. if (!ssl->options.groupMessages) {
  28844. ret = SendBuffered(ssl);
  28845. }
  28846. if (ret == 0 || ret == WANT_WRITE) {
  28847. int tmpRet = MakeMasterSecret(ssl);
  28848. if (tmpRet != 0) {
  28849. ret = tmpRet; /* save WANT_WRITE unless more serious */
  28850. }
  28851. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  28852. ssl->options.buildingMsg = 0;
  28853. }
  28854. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  28855. if (ssl->keyLogCb != NULL) {
  28856. int secretSz = SECRET_LEN;
  28857. ret = ssl->keyLogCb(ssl, ssl->arrays->masterSecret, &secretSz,
  28858. NULL);
  28859. if (ret != 0 || secretSz != SECRET_LEN)
  28860. return SESSION_SECRET_CB_E;
  28861. }
  28862. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  28863. break;
  28864. }
  28865. default:
  28866. ret = INPUT_CASE_ERROR;
  28867. } /* switch(ssl->options.asyncState) */
  28868. exit_scke:
  28869. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  28870. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  28871. #ifdef WOLFSSL_ASYNC_IO
  28872. /* Handle async operation */
  28873. if (ret == WC_PENDING_E || ret == WANT_WRITE) {
  28874. if (ssl->options.buildingMsg)
  28875. return ret;
  28876. /* If we have completed all states then we will not enter this function
  28877. * again. We need to do clean up now. */
  28878. }
  28879. #endif
  28880. /* No further need for PMS */
  28881. if (ssl->arrays->preMasterSecret != NULL) {
  28882. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  28883. }
  28884. ssl->arrays->preMasterSz = 0;
  28885. /* Final cleanup */
  28886. #ifdef WOLFSSL_ASYNC_IO
  28887. /* Cleanup async */
  28888. FreeAsyncCtx(ssl, 0);
  28889. #else
  28890. FreeSckeArgs(ssl, args);
  28891. #endif
  28892. FreeKeyExchange(ssl);
  28893. if (ret != 0) {
  28894. WOLFSSL_ERROR_VERBOSE(ret);
  28895. }
  28896. return ret;
  28897. }
  28898. #endif /* !WOLFSSL_NO_TLS12 */
  28899. #ifndef NO_CERTS
  28900. #ifndef WOLFSSL_NO_TLS12
  28901. #ifndef WOLFSSL_NO_CLIENT_AUTH
  28902. typedef struct ScvArgs {
  28903. byte* output; /* not allocated */
  28904. #ifndef NO_RSA
  28905. byte* verifySig;
  28906. #endif
  28907. byte* verify; /* not allocated */
  28908. byte* input;
  28909. word32 idx;
  28910. word32 extraSz;
  28911. word32 sigSz;
  28912. int sendSz;
  28913. int inputSz;
  28914. word32 length;
  28915. byte sigAlgo;
  28916. } ScvArgs;
  28917. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  28918. {
  28919. ScvArgs* args = (ScvArgs*)pArgs;
  28920. (void)ssl;
  28921. #ifndef NO_RSA
  28922. if (args->verifySig) {
  28923. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  28924. args->verifySig = NULL;
  28925. }
  28926. #endif
  28927. if (args->input) {
  28928. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28929. args->input = NULL;
  28930. }
  28931. }
  28932. /* handle generation of certificate_verify (15) */
  28933. int SendCertificateVerify(WOLFSSL* ssl)
  28934. {
  28935. int ret = 0;
  28936. #ifdef WOLFSSL_ASYNC_IO
  28937. ScvArgs* args = NULL;
  28938. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  28939. #else
  28940. ScvArgs args[1];
  28941. #endif
  28942. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  28943. WOLFSSL_ENTER("SendCertificateVerify");
  28944. #ifdef WOLFSSL_ASYNC_IO
  28945. if (ssl->async == NULL) {
  28946. ssl->async = (struct WOLFSSL_ASYNC*)
  28947. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  28948. DYNAMIC_TYPE_ASYNC);
  28949. if (ssl->async == NULL)
  28950. ERROR_OUT(MEMORY_E, exit_scv);
  28951. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  28952. }
  28953. args = (ScvArgs*)ssl->async->args;
  28954. #ifdef WOLFSSL_ASYNC_CRYPT
  28955. /* BuildMessage does its own Pop */
  28956. if (ssl->error != WC_PENDING_E ||
  28957. ssl->options.asyncState != TLS_ASYNC_END)
  28958. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  28959. if (ret != WC_NO_PENDING_E) {
  28960. /* Check for error */
  28961. if (ret < 0)
  28962. goto exit_scv;
  28963. }
  28964. else
  28965. #endif
  28966. if (ssl->options.buildingMsg) {
  28967. /* We should be in the sending state. */
  28968. if (ssl->options.asyncState != TLS_ASYNC_END) {
  28969. ret = BAD_STATE_E;
  28970. goto exit_scv;
  28971. }
  28972. }
  28973. else
  28974. #endif
  28975. {
  28976. /* Reset state */
  28977. ret = 0;
  28978. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  28979. XMEMSET(args, 0, sizeof(ScvArgs));
  28980. #ifdef WOLFSSL_ASYNC_IO
  28981. ssl->async->freeArgs = FreeScvArgs;
  28982. #endif
  28983. }
  28984. switch(ssl->options.asyncState)
  28985. {
  28986. case TLS_ASYNC_BEGIN:
  28987. {
  28988. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  28989. return 0; /* sent blank cert, can't verify */
  28990. }
  28991. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  28992. if (IsEncryptionOn(ssl, 1)) {
  28993. args->sendSz += MAX_MSG_EXTRA;
  28994. }
  28995. /* Use tmp buffer */
  28996. args->input = (byte*)XMALLOC(args->sendSz,
  28997. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28998. if (args->input == NULL)
  28999. ERROR_OUT(MEMORY_E, exit_scv);
  29000. args->output = args->input;
  29001. /* Advance state and proceed */
  29002. ssl->options.asyncState = TLS_ASYNC_BUILD;
  29003. } /* case TLS_ASYNC_BEGIN */
  29004. FALL_THROUGH;
  29005. case TLS_ASYNC_BUILD:
  29006. {
  29007. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  29008. if (ret != 0) {
  29009. goto exit_scv;
  29010. }
  29011. if (ssl->buffers.key == NULL) {
  29012. #ifdef HAVE_PK_CALLBACKS
  29013. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  29014. args->length = (word16)GetPrivateKeySigSize(ssl);
  29015. else
  29016. #endif
  29017. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  29018. }
  29019. else {
  29020. /* Decode private key. */
  29021. ret = DecodePrivateKey(ssl, &args->length);
  29022. if (ret != 0) {
  29023. goto exit_scv;
  29024. }
  29025. }
  29026. if (args->length == 0) {
  29027. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  29028. }
  29029. /* idx is used to track verify pointer offset to output */
  29030. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  29031. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  29032. args->extraSz = 0; /* tls 1.2 hash/sig */
  29033. /* build encoded signature buffer */
  29034. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  29035. ssl->buffers.sig.buffer = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  29036. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  29037. if (ssl->buffers.sig.buffer == NULL) {
  29038. ERROR_OUT(MEMORY_E, exit_scv);
  29039. }
  29040. #ifdef WOLFSSL_DTLS
  29041. if (ssl->options.dtls) {
  29042. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29043. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29044. }
  29045. #endif
  29046. if (!IsAtLeastTLSv1_2(ssl)) {
  29047. #ifndef NO_OLD_TLS
  29048. #ifndef NO_SHA
  29049. /* old tls default */
  29050. SetDigest(ssl, sha_mac);
  29051. #endif
  29052. #else
  29053. #ifndef NO_SHA256
  29054. /* new tls default */
  29055. SetDigest(ssl, sha256_mac);
  29056. #endif
  29057. #endif /* !NO_OLD_TLS */
  29058. }
  29059. else {
  29060. SetDigest(ssl, ssl->options.hashAlgo);
  29061. }
  29062. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  29063. #ifdef WC_RSA_PSS
  29064. if (IsAtLeastTLSv1_2(ssl) &&
  29065. (ssl->pssAlgo & (1 << ssl->options.hashAlgo))) {
  29066. args->sigAlgo = rsa_pss_sa_algo;
  29067. }
  29068. else
  29069. #endif
  29070. args->sigAlgo = rsa_sa_algo;
  29071. }
  29072. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  29073. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  29074. if (ssl->buffers.keyType == sm2_sa_algo) {
  29075. args->sigAlgo = sm2_sa_algo;
  29076. }
  29077. else
  29078. #endif
  29079. {
  29080. args->sigAlgo = ecc_dsa_sa_algo;
  29081. }
  29082. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  29083. args->sigAlgo = ed25519_sa_algo;
  29084. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  29085. args->sigAlgo = ed448_sa_algo;
  29086. if (IsAtLeastTLSv1_2(ssl)) {
  29087. EncodeSigAlg(ssl->options.hashAlgo, args->sigAlgo,
  29088. args->verify);
  29089. args->extraSz = HASH_SIG_SIZE;
  29090. SetDigest(ssl, ssl->options.hashAlgo);
  29091. }
  29092. #ifndef NO_OLD_TLS
  29093. else {
  29094. /* if old TLS load MD5 and SHA hash as value to sign
  29095. * MD5 and SHA must be first two buffers in structure */
  29096. XMEMCPY(ssl->buffers.sig.buffer,
  29097. (byte*)&ssl->hsHashes->certHashes, FINISHED_SZ);
  29098. }
  29099. #endif
  29100. #ifndef NO_RSA
  29101. if (args->sigAlgo == rsa_sa_algo) {
  29102. ssl->buffers.sig.length = FINISHED_SZ;
  29103. args->sigSz = ENCRYPT_LEN;
  29104. if (IsAtLeastTLSv1_2(ssl)) {
  29105. ssl->buffers.sig.length = wc_EncodeSignature(
  29106. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  29107. ssl->buffers.digest.length,
  29108. TypeHash(ssl->options.hashAlgo));
  29109. }
  29110. /* prepend hdr */
  29111. c16toa((word16)args->length, args->verify + args->extraSz);
  29112. }
  29113. #ifdef WC_RSA_PSS
  29114. else if (args->sigAlgo == rsa_pss_sa_algo) {
  29115. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  29116. ssl->buffers.digest.length);
  29117. ssl->buffers.sig.length = ssl->buffers.digest.length;
  29118. args->sigSz = ENCRYPT_LEN;
  29119. /* prepend hdr */
  29120. c16toa((word16)args->length, args->verify + args->extraSz);
  29121. }
  29122. #endif
  29123. #endif /* !NO_RSA */
  29124. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  29125. if (args->sigAlgo == ed25519_sa_algo) {
  29126. ret = Ed25519CheckPubKey(ssl);
  29127. if (ret != 0)
  29128. goto exit_scv;
  29129. }
  29130. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  29131. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  29132. if (args->sigAlgo == ed448_sa_algo) {
  29133. ret = Ed448CheckPubKey(ssl);
  29134. if (ret != 0)
  29135. goto exit_scv;
  29136. }
  29137. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  29138. /* Advance state and proceed */
  29139. ssl->options.asyncState = TLS_ASYNC_DO;
  29140. } /* case TLS_ASYNC_BUILD */
  29141. FALL_THROUGH;
  29142. case TLS_ASYNC_DO:
  29143. {
  29144. #ifdef HAVE_ECC
  29145. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  29146. ecc_key* key = (ecc_key*)ssl->hsKey;
  29147. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  29148. if (args->sigAlgo == sm2_sa_algo) {
  29149. ret = Sm2wSm3Sign(ssl,
  29150. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  29151. ssl->hsHashes->messages, ssl->hsHashes->length,
  29152. ssl->buffers.sig.buffer,
  29153. (word32*)&ssl->buffers.sig.length,
  29154. key,
  29155. #ifdef HAVE_PK_CALLBACKS
  29156. ssl->buffers.key
  29157. #else
  29158. NULL
  29159. #endif
  29160. );
  29161. }
  29162. else
  29163. #endif
  29164. {
  29165. ret = EccSign(ssl,
  29166. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  29167. ssl->buffers.sig.buffer,
  29168. (word32*)&ssl->buffers.sig.length,
  29169. key,
  29170. #ifdef HAVE_PK_CALLBACKS
  29171. ssl->buffers.key
  29172. #else
  29173. NULL
  29174. #endif
  29175. );
  29176. }
  29177. }
  29178. #endif /* HAVE_ECC */
  29179. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  29180. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  29181. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  29182. ret = Ed25519Sign(ssl,
  29183. ssl->hsHashes->messages, ssl->hsHashes->length,
  29184. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  29185. key,
  29186. #ifdef HAVE_PK_CALLBACKS
  29187. ssl->buffers.key
  29188. #else
  29189. NULL
  29190. #endif
  29191. );
  29192. }
  29193. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  29194. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  29195. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  29196. ed448_key* key = (ed448_key*)ssl->hsKey;
  29197. ret = Ed448Sign(ssl,
  29198. ssl->hsHashes->messages, ssl->hsHashes->length,
  29199. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  29200. key,
  29201. #ifdef HAVE_PK_CALLBACKS
  29202. ssl->buffers.key
  29203. #else
  29204. NULL
  29205. #endif
  29206. );
  29207. }
  29208. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  29209. #ifndef NO_RSA
  29210. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  29211. RsaKey* key = (RsaKey*)ssl->hsKey;
  29212. /* restore verify pointer */
  29213. args->verify = &args->output[args->idx];
  29214. ret = RsaSign(ssl,
  29215. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  29216. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  29217. args->sigAlgo, ssl->options.hashAlgo, key,
  29218. ssl->buffers.key
  29219. );
  29220. }
  29221. #endif /* !NO_RSA */
  29222. /* Check for error */
  29223. if (ret != 0) {
  29224. goto exit_scv;
  29225. }
  29226. /* Advance state and proceed */
  29227. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  29228. } /* case TLS_ASYNC_DO */
  29229. FALL_THROUGH;
  29230. case TLS_ASYNC_VERIFY:
  29231. {
  29232. /* restore verify pointer */
  29233. args->verify = &args->output[args->idx];
  29234. switch (ssl->hsType) {
  29235. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  29236. #ifdef HAVE_ECC
  29237. case DYNAMIC_TYPE_ECC:
  29238. #ifdef WOLFSSL_CHECK_SIG_FAULTS
  29239. {
  29240. ecc_key* key = (ecc_key*)ssl->hsKey;
  29241. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  29242. if (ssl->buffers.keyType == sm2_sa_algo) {
  29243. ret = Sm3wSm2Verify(ssl,
  29244. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  29245. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  29246. ssl->buffers.digest.buffer,
  29247. ssl->buffers.digest.length, key,
  29248. #ifdef HAVE_PK_CALLBACKS
  29249. ssl->buffers.key
  29250. #else
  29251. NULL
  29252. #endif
  29253. );
  29254. }
  29255. else
  29256. #endif
  29257. {
  29258. ret = EccVerify(ssl,
  29259. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  29260. ssl->buffers.digest.buffer,
  29261. ssl->buffers.digest.length, key,
  29262. #ifdef HAVE_PK_CALLBACKS
  29263. ssl->buffers.key
  29264. #else
  29265. NULL
  29266. #endif
  29267. );
  29268. }
  29269. if (ret != 0) {
  29270. WOLFSSL_MSG("Failed to verify ECC signature");
  29271. goto exit_scv;
  29272. }
  29273. }
  29274. #if defined(HAVE_ED25519) || defined(HAVE_ED448)
  29275. FALL_THROUGH;
  29276. #endif
  29277. #endif /* WOLFSSL_CHECK_SIG_FAULTS */
  29278. #endif /* HAVE_ECC */
  29279. #ifdef HAVE_ED25519
  29280. case DYNAMIC_TYPE_ED25519:
  29281. #endif
  29282. #ifdef HAVE_ED448
  29283. case DYNAMIC_TYPE_ED448:
  29284. #endif
  29285. args->length = (word16)ssl->buffers.sig.length;
  29286. /* prepend hdr */
  29287. c16toa((word16)args->length, args->verify + args->extraSz);
  29288. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  29289. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  29290. break;
  29291. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  29292. #ifndef NO_RSA
  29293. case DYNAMIC_TYPE_RSA:
  29294. {
  29295. RsaKey* key = (RsaKey*)ssl->hsKey;
  29296. if (args->verifySig == NULL) {
  29297. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  29298. DYNAMIC_TYPE_SIGNATURE);
  29299. if (args->verifySig == NULL) {
  29300. ERROR_OUT(MEMORY_E, exit_scv);
  29301. }
  29302. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  29303. VERIFY_HEADER, args->sigSz);
  29304. }
  29305. /* check for signature faults */
  29306. ret = VerifyRsaSign(ssl,
  29307. args->verifySig, args->sigSz,
  29308. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  29309. args->sigAlgo, ssl->options.hashAlgo, key,
  29310. ssl->buffers.key
  29311. );
  29312. /* free temporary buffer now */
  29313. if (ret != WC_PENDING_E) {
  29314. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  29315. args->verifySig = NULL;
  29316. }
  29317. break;
  29318. }
  29319. #endif /* !NO_RSA */
  29320. default:
  29321. break;
  29322. }
  29323. /* Check for error */
  29324. if (ret != 0) {
  29325. goto exit_scv;
  29326. }
  29327. /* Advance state and proceed */
  29328. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  29329. } /* case TLS_ASYNC_VERIFY */
  29330. FALL_THROUGH;
  29331. case TLS_ASYNC_FINALIZE:
  29332. {
  29333. if (args->output == NULL) {
  29334. ERROR_OUT(BUFFER_ERROR, exit_scv);
  29335. }
  29336. AddHeaders(args->output, (word32)args->length + args->extraSz +
  29337. VERIFY_HEADER, certificate_verify, ssl);
  29338. /* Advance state and proceed */
  29339. ssl->options.asyncState = TLS_ASYNC_END;
  29340. } /* case TLS_ASYNC_FINALIZE */
  29341. FALL_THROUGH;
  29342. case TLS_ASYNC_END:
  29343. {
  29344. ret = SendHandshakeMsg(ssl, args->output,
  29345. (word32)args->length + args->extraSz + VERIFY_HEADER,
  29346. certificate_verify, "CertificateVerify");
  29347. if (ret != 0)
  29348. goto exit_scv;
  29349. break;
  29350. }
  29351. default:
  29352. ret = INPUT_CASE_ERROR;
  29353. } /* switch(ssl->options.asyncState) */
  29354. exit_scv:
  29355. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  29356. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  29357. #ifdef WOLFSSL_ASYNC_IO
  29358. /* Handle async operation */
  29359. if (ret == WANT_WRITE
  29360. #ifdef WOLFSSL_ASYNC_CRYPT
  29361. || ret == WC_PENDING_E
  29362. #endif
  29363. )
  29364. return ret;
  29365. #endif /* WOLFSSL_ASYNC_IO */
  29366. /* Digest is not allocated, so do this to prevent free */
  29367. if(ssl->buffers.digest.buffer) {
  29368. if (!ssl->options.dontFreeDigest) {
  29369. /*This should not happen*/
  29370. XFREE(ssl->buffers.digest.buffer,
  29371. ssl->heap, DYNAMIC_TYPE_DIGEST);
  29372. }
  29373. }
  29374. ssl->buffers.digest.buffer = NULL;
  29375. ssl->buffers.digest.length = 0;
  29376. ssl->options.dontFreeDigest = 0;
  29377. /* Final cleanup */
  29378. #ifdef WOLFSSL_ASYNC_IO
  29379. /* Cleanup async */
  29380. FreeAsyncCtx(ssl, 0);
  29381. #else
  29382. FreeScvArgs(ssl, args);
  29383. #endif
  29384. FreeKeyExchange(ssl);
  29385. if (ret != 0) {
  29386. WOLFSSL_ERROR_VERBOSE(ret);
  29387. }
  29388. return ret;
  29389. }
  29390. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  29391. #endif /* WOLFSSL_NO_TLS12 */
  29392. #endif /* NO_CERTS */
  29393. #ifdef HAVE_SESSION_TICKET
  29394. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  29395. {
  29396. if (!HaveUniqueSessionObj(ssl))
  29397. return MEMORY_ERROR;
  29398. /* Free old dynamic ticket if we already had one */
  29399. if (ssl->session->ticketLenAlloc > 0) {
  29400. XFREE(ssl->session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  29401. ssl->session->ticket = ssl->session->staticTicket;
  29402. ssl->session->ticketLenAlloc = 0;
  29403. }
  29404. if (length > sizeof(ssl->session->staticTicket)) {
  29405. byte* sessionTicket =
  29406. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  29407. if (sessionTicket == NULL)
  29408. return MEMORY_E;
  29409. ssl->session->ticket = sessionTicket;
  29410. ssl->session->ticketLenAlloc = (word16)length;
  29411. }
  29412. ssl->session->ticketLen = (word16)length;
  29413. if (length > 0) {
  29414. XMEMCPY(ssl->session->ticket, ticket, length);
  29415. if (ssl->session_ticket_cb != NULL) {
  29416. ssl->session_ticket_cb(ssl,
  29417. ssl->session->ticket, ssl->session->ticketLen,
  29418. ssl->session_ticket_ctx);
  29419. }
  29420. /* Create a fake sessionID based on the ticket, this will
  29421. * supersede the existing session cache info. */
  29422. ssl->options.haveSessionId = 1;
  29423. #ifdef WOLFSSL_TLS13
  29424. if (ssl->options.tls1_3) {
  29425. XMEMCPY(ssl->session->sessionID,
  29426. ssl->session->ticket + length - ID_LEN, ID_LEN);
  29427. ssl->session->sessionIDSz = ID_LEN;
  29428. }
  29429. else
  29430. #endif
  29431. {
  29432. XMEMCPY(ssl->arrays->sessionID,
  29433. ssl->session->ticket + length - ID_LEN, ID_LEN);
  29434. ssl->arrays->sessionIDSz = ID_LEN;
  29435. }
  29436. }
  29437. return 0;
  29438. }
  29439. #ifndef WOLFSSL_NO_TLS12
  29440. /* handle processing of session_ticket (4) */
  29441. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  29442. word32 size)
  29443. {
  29444. word32 begin = *inOutIdx;
  29445. word32 lifetime;
  29446. word16 length;
  29447. int ret;
  29448. if (ssl->expect_session_ticket == 0) {
  29449. WOLFSSL_MSG("Unexpected session ticket");
  29450. WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
  29451. return SESSION_TICKET_EXPECT_E;
  29452. }
  29453. if (OPAQUE32_LEN > size)
  29454. return BUFFER_ERROR;
  29455. ato32(input + *inOutIdx, &lifetime);
  29456. *inOutIdx += OPAQUE32_LEN;
  29457. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  29458. return BUFFER_ERROR;
  29459. ato16(input + *inOutIdx, &length);
  29460. *inOutIdx += OPAQUE16_LEN;
  29461. if ((*inOutIdx - begin) + length > size)
  29462. return BUFFER_ERROR;
  29463. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  29464. return ret;
  29465. *inOutIdx += length;
  29466. if (length > 0) {
  29467. ssl->timeout = lifetime;
  29468. SetupSession(ssl);
  29469. #ifndef NO_SESSION_CACHE
  29470. AddSession(ssl);
  29471. #endif
  29472. }
  29473. if (IsEncryptionOn(ssl, 0)) {
  29474. *inOutIdx += ssl->keys.padSz;
  29475. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  29476. if (ssl->options.startedETMRead)
  29477. *inOutIdx += MacSize(ssl);
  29478. #endif
  29479. }
  29480. ssl->expect_session_ticket = 0;
  29481. return 0;
  29482. }
  29483. #endif /* !WOLFSSL_NO_TLS12 */
  29484. #endif /* HAVE_SESSION_TICKET */
  29485. #endif /* NO_WOLFSSL_CLIENT */
  29486. #ifndef NO_CERTS
  29487. #ifdef WOLF_PRIVATE_KEY_ID
  29488. int GetPrivateKeySigSize(WOLFSSL* ssl)
  29489. {
  29490. int sigSz = 0;
  29491. if (ssl == NULL)
  29492. return 0;
  29493. switch (ssl->buffers.keyType) {
  29494. #ifndef NO_RSA
  29495. #ifdef WC_RSA_PSS
  29496. case rsa_pss_sa_algo:
  29497. #endif
  29498. case rsa_sa_algo:
  29499. sigSz = ssl->buffers.keySz;
  29500. ssl->hsType = DYNAMIC_TYPE_RSA;
  29501. break;
  29502. #endif
  29503. #ifdef HAVE_ECC
  29504. case ecc_dsa_sa_algo:
  29505. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  29506. ssl->hsType = DYNAMIC_TYPE_ECC;
  29507. break;
  29508. #endif
  29509. #ifdef HAVE_ED25519
  29510. case ed25519_sa_algo:
  29511. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  29512. ssl->hsType = DYNAMIC_TYPE_ED25519;
  29513. break;
  29514. #endif
  29515. #ifdef HAVE_ED448
  29516. case ed448_sa_algo:
  29517. sigSz = ED448_SIG_SIZE; /* fixed known value */
  29518. ssl->hsType = DYNAMIC_TYPE_ED448;
  29519. break;
  29520. #endif
  29521. default:
  29522. break;
  29523. }
  29524. return sigSz;
  29525. }
  29526. #endif /* HAVE_PK_CALLBACKS */
  29527. #endif /* NO_CERTS */
  29528. #ifdef HAVE_ECC
  29529. /* returns the WOLFSSL_* version of the curve from the OID sum */
  29530. word16 GetCurveByOID(int oidSum) {
  29531. switch(oidSum) {
  29532. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  29533. #ifndef NO_ECC_SECP
  29534. case ECC_SECP160R1_OID:
  29535. return WOLFSSL_ECC_SECP160R1;
  29536. #endif /* !NO_ECC_SECP */
  29537. #ifdef HAVE_ECC_SECPR2
  29538. case ECC_SECP160R2_OID:
  29539. return WOLFSSL_ECC_SECP160R2;
  29540. #endif /* HAVE_ECC_SECPR2 */
  29541. #ifdef HAVE_ECC_KOBLITZ
  29542. case ECC_SECP160K1_OID:
  29543. return WOLFSSL_ECC_SECP160K1;
  29544. #endif /* HAVE_ECC_KOBLITZ */
  29545. #endif
  29546. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  29547. #ifndef NO_ECC_SECP
  29548. case ECC_SECP192R1_OID:
  29549. return WOLFSSL_ECC_SECP192R1;
  29550. #endif /* !NO_ECC_SECP */
  29551. #ifdef HAVE_ECC_KOBLITZ
  29552. case ECC_SECP192K1_OID:
  29553. return WOLFSSL_ECC_SECP192K1;
  29554. #endif /* HAVE_ECC_KOBLITZ */
  29555. #endif
  29556. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  29557. #ifndef NO_ECC_SECP
  29558. case ECC_SECP224R1_OID:
  29559. return WOLFSSL_ECC_SECP224R1;
  29560. #endif /* !NO_ECC_SECP */
  29561. #ifdef HAVE_ECC_KOBLITZ
  29562. case ECC_SECP224K1_OID:
  29563. return WOLFSSL_ECC_SECP224K1;
  29564. #endif /* HAVE_ECC_KOBLITZ */
  29565. #endif
  29566. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  29567. #ifndef NO_ECC_SECP
  29568. case ECC_SECP256R1_OID:
  29569. return WOLFSSL_ECC_SECP256R1;
  29570. #endif /* !NO_ECC_SECP */
  29571. #ifdef HAVE_ECC_KOBLITZ
  29572. case ECC_SECP256K1_OID:
  29573. return WOLFSSL_ECC_SECP256K1;
  29574. #endif /* HAVE_ECC_KOBLITZ */
  29575. #ifdef HAVE_ECC_BRAINPOOL
  29576. case ECC_BRAINPOOLP256R1_OID:
  29577. return WOLFSSL_ECC_BRAINPOOLP256R1;
  29578. #endif /* HAVE_ECC_BRAINPOOL */
  29579. #ifdef WOLFSSL_SM2
  29580. case ECC_SM2P256V1_OID:
  29581. return WOLFSSL_ECC_SM2P256V1;
  29582. #endif /* WOLFSSL_SM2 */
  29583. #endif
  29584. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  29585. #ifndef NO_ECC_SECP
  29586. case ECC_SECP384R1_OID:
  29587. return WOLFSSL_ECC_SECP384R1;
  29588. #endif /* !NO_ECC_SECP */
  29589. #ifdef HAVE_ECC_BRAINPOOL
  29590. case ECC_BRAINPOOLP384R1_OID:
  29591. return WOLFSSL_ECC_BRAINPOOLP384R1;
  29592. #endif /* HAVE_ECC_BRAINPOOL */
  29593. #endif
  29594. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  29595. #ifdef HAVE_ECC_BRAINPOOL
  29596. case ECC_BRAINPOOLP512R1_OID:
  29597. return WOLFSSL_ECC_BRAINPOOLP512R1;
  29598. #endif /* HAVE_ECC_BRAINPOOL */
  29599. #endif
  29600. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  29601. #ifndef NO_ECC_SECP
  29602. case ECC_SECP521R1_OID:
  29603. return WOLFSSL_ECC_SECP521R1;
  29604. #endif /* !NO_ECC_SECP */
  29605. #endif
  29606. default:
  29607. WOLFSSL_MSG("Curve OID not compiled in or implemented");
  29608. return 0;
  29609. }
  29610. }
  29611. #endif /* HAVE_ECC */
  29612. int TranslateErrorToAlert(int err)
  29613. {
  29614. switch (err) {
  29615. case BUFFER_ERROR:
  29616. return decode_error;
  29617. case EXT_NOT_ALLOWED:
  29618. case PEER_KEY_ERROR:
  29619. case ECC_PEERKEY_ERROR:
  29620. case BAD_KEY_SHARE_DATA:
  29621. case PSK_KEY_ERROR:
  29622. case INVALID_PARAMETER:
  29623. case HRR_COOKIE_ERROR:
  29624. case BAD_BINDER:
  29625. return illegal_parameter;
  29626. case INCOMPLETE_DATA:
  29627. return missing_extension;
  29628. case MATCH_SUITE_ERROR:
  29629. case MISSING_HANDSHAKE_DATA:
  29630. return handshake_failure;
  29631. case VERSION_ERROR:
  29632. return wolfssl_alert_protocol_version;
  29633. default:
  29634. return invalid_alert;
  29635. }
  29636. }
  29637. #ifndef NO_WOLFSSL_SERVER
  29638. #ifndef WOLFSSL_NO_TLS12
  29639. /* handle generation of server_hello (2) */
  29640. int SendServerHello(WOLFSSL* ssl)
  29641. {
  29642. int ret;
  29643. byte *output;
  29644. word16 length;
  29645. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  29646. int sendSz;
  29647. byte sessIdSz = ID_LEN;
  29648. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  29649. byte echoId = 0; /* ticket echo id flag */
  29650. #endif
  29651. byte cacheOff = 0; /* session cache off flag */
  29652. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  29653. WOLFSSL_ENTER("SendServerHello");
  29654. length = VERSION_SZ + RAN_LEN
  29655. + ID_LEN + ENUM_LEN
  29656. + SUITE_LEN
  29657. + ENUM_LEN;
  29658. #ifdef HAVE_TLS_EXTENSIONS
  29659. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  29660. if (ret != 0)
  29661. return ret;
  29662. #ifdef HAVE_SESSION_TICKET
  29663. if (ssl->options.useTicket) {
  29664. /* echo session id sz can be 0,32 or bogus len in between */
  29665. sessIdSz = ssl->arrays->sessionIDSz;
  29666. if (sessIdSz > ID_LEN) {
  29667. WOLFSSL_MSG("Bad bogus session id len");
  29668. return BUFFER_ERROR;
  29669. }
  29670. if (!IsAtLeastTLSv1_3(ssl->version))
  29671. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  29672. echoId = 1;
  29673. }
  29674. #endif /* HAVE_SESSION_TICKET */
  29675. #else
  29676. if (ssl->options.haveEMS) {
  29677. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  29678. }
  29679. #endif
  29680. /* is the session cache off at build or runtime */
  29681. #ifdef NO_SESSION_CACHE
  29682. cacheOff = 1;
  29683. #else
  29684. if (ssl->options.sessionCacheOff == 1) {
  29685. cacheOff = 1;
  29686. }
  29687. #endif
  29688. /* if no session cache don't send a session ID unless we're echoing
  29689. * an ID as part of session tickets */
  29690. if (cacheOff == 1
  29691. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  29692. && echoId == 0
  29693. #endif
  29694. ) {
  29695. length -= ID_LEN; /* adjust ID_LEN assumption */
  29696. sessIdSz = 0;
  29697. }
  29698. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  29699. #ifdef WOLFSSL_DTLS
  29700. if (ssl->options.dtls) {
  29701. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29702. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29703. }
  29704. #endif /* WOLFSSL_DTLS */
  29705. if (IsEncryptionOn(ssl, 1))
  29706. sendSz += MAX_MSG_EXTRA;
  29707. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  29708. * is not advanced yet */
  29709. ssl->options.buildingMsg = 1;
  29710. /* check for available size */
  29711. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  29712. return ret;
  29713. /* get output buffer */
  29714. output = GetOutputBuffer(ssl);
  29715. AddHeaders(output, length, server_hello, ssl);
  29716. /* now write to output */
  29717. /* first version */
  29718. output[idx++] = (byte)ssl->version.major;
  29719. output[idx++] = (byte)ssl->version.minor;
  29720. /* then random and session id */
  29721. if (!ssl->options.resuming) {
  29722. /* generate random part and session id */
  29723. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  29724. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  29725. if (ret != 0)
  29726. return ret;
  29727. #ifdef WOLFSSL_TLS13
  29728. if (TLSv1_3_Capable(ssl)) {
  29729. /* TLS v1.3 capable server downgraded. */
  29730. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  29731. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  29732. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  29733. }
  29734. else
  29735. #endif
  29736. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  29737. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  29738. (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0 &&
  29739. !IsAtLeastTLSv1_2(ssl)) {
  29740. /* TLS v1.2 capable server downgraded. */
  29741. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  29742. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  29743. output[idx + RAN_LEN - 1] = 0;
  29744. }
  29745. /* store info in SSL for later */
  29746. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  29747. idx += RAN_LEN;
  29748. output[idx++] = sessIdSz;
  29749. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  29750. ssl->arrays->sessionIDSz = sessIdSz;
  29751. }
  29752. else {
  29753. /* If resuming, use info from SSL */
  29754. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  29755. idx += RAN_LEN;
  29756. output[idx++] = sessIdSz;
  29757. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  29758. }
  29759. idx += sessIdSz;
  29760. #ifdef SHOW_SECRETS
  29761. {
  29762. int j;
  29763. printf("server random: ");
  29764. for (j = 0; j < RAN_LEN; j++)
  29765. printf("%02x", ssl->arrays->serverRandom[j]);
  29766. printf("\n");
  29767. }
  29768. #endif
  29769. /* then cipher suite */
  29770. output[idx++] = ssl->options.cipherSuite0;
  29771. output[idx++] = ssl->options.cipherSuite;
  29772. /* then compression */
  29773. if (ssl->options.usingCompression)
  29774. output[idx++] = ZLIB_COMPRESSION;
  29775. else
  29776. output[idx++] = NO_COMPRESSION;
  29777. /* last, extensions */
  29778. #ifdef HAVE_TLS_EXTENSIONS
  29779. {
  29780. word16 offset = 0;
  29781. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  29782. if (ret != 0)
  29783. return ret;
  29784. idx += offset;
  29785. }
  29786. #else
  29787. #ifdef HAVE_EXTENDED_MASTER
  29788. if (ssl->options.haveEMS) {
  29789. c16toa(HELLO_EXT_SZ, output + idx);
  29790. idx += HELLO_EXT_SZ_SZ;
  29791. c16toa(HELLO_EXT_EXTMS, output + idx);
  29792. idx += HELLO_EXT_TYPE_SZ;
  29793. c16toa(0, output + idx);
  29794. /*idx += HELLO_EXT_SZ_SZ;*/
  29795. /* idx is not used after this point. uncomment the line above
  29796. * if adding any more extensions in the future. */
  29797. }
  29798. #endif
  29799. #endif
  29800. if (IsEncryptionOn(ssl, 1)) {
  29801. byte* input;
  29802. int inputSz = idx; /* build msg adds rec hdr */
  29803. int recordHeaderSz = RECORD_HEADER_SZ;
  29804. if (ssl->options.dtls)
  29805. recordHeaderSz += DTLS_RECORD_EXTRA;
  29806. inputSz -= recordHeaderSz;
  29807. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29808. if (input == NULL)
  29809. return MEMORY_E;
  29810. XMEMCPY(input, output + recordHeaderSz, inputSz);
  29811. #ifdef WOLFSSL_DTLS
  29812. if (IsDtlsNotSctpMode(ssl) &&
  29813. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
  29814. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29815. return ret;
  29816. }
  29817. #endif
  29818. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  29819. handshake, 1, 0, 0, CUR_ORDER);
  29820. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29821. if (sendSz < 0)
  29822. return sendSz;
  29823. } else {
  29824. #ifdef WOLFSSL_DTLS
  29825. if (IsDtlsNotSctpMode(ssl)) {
  29826. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
  29827. return ret;
  29828. }
  29829. if (ssl->options.dtls)
  29830. DtlsSEQIncrement(ssl, CUR_ORDER);
  29831. #endif
  29832. ret = HashOutput(ssl, output, sendSz, 0);
  29833. if (ret != 0)
  29834. return ret;
  29835. }
  29836. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  29837. if (ssl->hsInfoOn)
  29838. AddPacketName(ssl, "ServerHello");
  29839. if (ssl->toInfoOn) {
  29840. ret = AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  29841. WRITE_PROTO, 0, ssl->heap);
  29842. if (ret != 0)
  29843. return ret;
  29844. }
  29845. #endif
  29846. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  29847. ssl->options.buildingMsg = 0;
  29848. ssl->buffers.outputBuffer.length += sendSz;
  29849. if (ssl->options.groupMessages)
  29850. ret = 0;
  29851. else
  29852. ret = SendBuffered(ssl);
  29853. WOLFSSL_LEAVE("SendServerHello", ret);
  29854. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  29855. return ret;
  29856. }
  29857. #if defined(HAVE_ECC)
  29858. static byte SetCurveId(ecc_key* key)
  29859. {
  29860. if (key == NULL || key->dp == NULL) {
  29861. WOLFSSL_MSG("SetCurveId: Invalid key!");
  29862. return 0;
  29863. }
  29864. return (byte)GetCurveByOID(key->dp->oidSum);
  29865. }
  29866. #endif /* HAVE_ECC */
  29867. typedef struct SskeArgs {
  29868. byte* output; /* not allocated */
  29869. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  29870. byte* exportBuf;
  29871. #endif
  29872. #ifndef NO_RSA
  29873. byte* verifySig;
  29874. #endif
  29875. byte* input;
  29876. word32 idx;
  29877. word32 tmpSigSz;
  29878. word32 length;
  29879. word32 sigSz;
  29880. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  29881. !defined(NO_RSA)
  29882. word32 sigDataSz;
  29883. #endif
  29884. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  29885. word32 exportSz;
  29886. #endif
  29887. word32 sendSz;
  29888. int inputSz;
  29889. } SskeArgs;
  29890. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  29891. {
  29892. SskeArgs* args = (SskeArgs*)pArgs;
  29893. (void)ssl;
  29894. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  29895. if (args->exportBuf) {
  29896. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  29897. args->exportBuf = NULL;
  29898. }
  29899. #endif
  29900. #ifndef NO_RSA
  29901. if (args->verifySig) {
  29902. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  29903. args->verifySig = NULL;
  29904. }
  29905. #endif
  29906. (void)args;
  29907. }
  29908. /* handle generation of server_key_exchange (12) */
  29909. int SendServerKeyExchange(WOLFSSL* ssl)
  29910. {
  29911. int ret = 0;
  29912. #ifdef WOLFSSL_ASYNC_IO
  29913. SskeArgs* args = NULL;
  29914. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  29915. #else
  29916. SskeArgs args[1];
  29917. #endif
  29918. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  29919. WOLFSSL_ENTER("SendServerKeyExchange");
  29920. #ifdef WOLFSSL_ASYNC_IO
  29921. if (ssl->async == NULL) {
  29922. ssl->async = (struct WOLFSSL_ASYNC*)
  29923. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  29924. DYNAMIC_TYPE_ASYNC);
  29925. if (ssl->async == NULL)
  29926. ERROR_OUT(MEMORY_E, exit_sske);
  29927. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  29928. }
  29929. args = (SskeArgs*)ssl->async->args;
  29930. #ifdef WOLFSSL_ASYNC_CRYPT
  29931. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  29932. if (ret != WC_NO_PENDING_E) {
  29933. /* Check for error */
  29934. if (ret < 0)
  29935. goto exit_sske;
  29936. }
  29937. else
  29938. #endif
  29939. if (ssl->options.buildingMsg) {
  29940. /* We should be in the sending state. */
  29941. if (ssl->options.asyncState != TLS_ASYNC_END) {
  29942. ret = BAD_STATE_E;
  29943. goto exit_sske;
  29944. }
  29945. }
  29946. else
  29947. #endif
  29948. {
  29949. /* Reset state */
  29950. ret = 0;
  29951. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  29952. XMEMSET(args, 0, sizeof(SskeArgs));
  29953. #ifdef WOLFSSL_ASYNC_IO
  29954. ssl->async->freeArgs = FreeSskeArgs;
  29955. #endif
  29956. }
  29957. switch(ssl->options.asyncState)
  29958. {
  29959. case TLS_ASYNC_BEGIN:
  29960. {
  29961. /* Do some checks / debug msgs */
  29962. switch(ssl->specs.kea)
  29963. {
  29964. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  29965. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  29966. case ecdhe_psk_kea:
  29967. {
  29968. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  29969. break;
  29970. }
  29971. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  29972. #if defined(HAVE_ECC)
  29973. case ecc_diffie_hellman_kea:
  29974. {
  29975. if (ssl->specs.static_ecdh) {
  29976. WOLFSSL_MSG("Using Static ECDH, not sending "
  29977. "ServerKeyExchange");
  29978. ERROR_OUT(0, exit_sske);
  29979. }
  29980. WOLFSSL_MSG("Using ephemeral ECDH");
  29981. break;
  29982. }
  29983. #endif /* HAVE_ECC */
  29984. }
  29985. /* Preparing keys */
  29986. switch(ssl->specs.kea)
  29987. {
  29988. #ifndef NO_PSK
  29989. case psk_kea:
  29990. {
  29991. /* Nothing to do in this sub-state */
  29992. break;
  29993. }
  29994. #endif /* !NO_PSK */
  29995. #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA) \
  29996. || (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  29997. #if !defined(NO_PSK)
  29998. case dhe_psk_kea:
  29999. #endif
  30000. #if !defined(NO_RSA) || (defined(HAVE_ANON) && \
  30001. !defined(WOLFSSL_NO_TLS12))
  30002. case diffie_hellman_kea:
  30003. #endif
  30004. #if (defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)) && !defined(HAVE_PUBLIC_FFDHE)
  30005. if (ssl->namedGroup) {
  30006. word32 pSz = 0;
  30007. ret = wc_DhGetNamedKeyParamSize(ssl->namedGroup, &pSz,
  30008. NULL, NULL);
  30009. if (ret != 0)
  30010. goto exit_sske;
  30011. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  30012. /* Free'd in SSL_ResourceFree and
  30013. * FreeHandshakeResources */
  30014. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  30015. pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  30016. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  30017. ERROR_OUT(MEMORY_E, exit_sske);
  30018. }
  30019. ssl->buffers.serverDH_Pub.length = pSz;
  30020. }
  30021. ssl->options.dhKeySz =(word16)pSz;
  30022. pSz = wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  30023. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  30024. /* Free'd in SSL_ResourceFree and
  30025. * FreeHandshakeResources */
  30026. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  30027. pSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  30028. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  30029. ERROR_OUT(MEMORY_E, exit_sske);
  30030. }
  30031. ssl->buffers.serverDH_Priv.length = pSz;
  30032. }
  30033. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  30034. (void**)&ssl->buffers.serverDH_Key);
  30035. if (ret != 0) {
  30036. goto exit_sske;
  30037. }
  30038. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  30039. ssl->namedGroup);
  30040. if (ret != 0) {
  30041. goto exit_sske;
  30042. }
  30043. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  30044. !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  30045. ssl->options.dhKeyTested = 1;
  30046. #endif
  30047. #ifdef HAVE_SECURE_RENEGOTIATION
  30048. /* Check that the DH public key buffer is large
  30049. * enough to hold the key. This may occur on a
  30050. * renegotiation when the key generated in the
  30051. * initial handshake is shorter than the key
  30052. * generated in the renegotiation. */
  30053. if (ssl->buffers.serverDH_Pub.length <
  30054. ssl->buffers.serverDH_P.length) {
  30055. byte* tmp = (byte*)XREALLOC(
  30056. ssl->buffers.serverDH_Pub.buffer,
  30057. ssl->buffers.serverDH_P.length +
  30058. OPAQUE16_LEN,
  30059. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  30060. if (tmp == NULL)
  30061. ERROR_OUT(MEMORY_E, exit_sske);
  30062. ssl->buffers.serverDH_Pub.buffer = tmp;
  30063. ssl->buffers.serverDH_Pub.length =
  30064. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  30065. }
  30066. #endif
  30067. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  30068. ssl->buffers.serverDH_Priv.buffer,
  30069. (word32*)&ssl->buffers.serverDH_Priv.length,
  30070. ssl->buffers.serverDH_Pub.buffer,
  30071. (word32*)&ssl->buffers.serverDH_Pub.length);
  30072. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30073. wc_MemZero_Add("DH private key buffer",
  30074. ssl->buffers.serverDH_Priv.buffer,
  30075. ssl->buffers.serverDH_Priv.length);
  30076. #endif
  30077. break;
  30078. }
  30079. else
  30080. #endif
  30081. {
  30082. /* Allocate DH key buffers and generate key */
  30083. if (ssl->buffers.serverDH_P.buffer == NULL ||
  30084. ssl->buffers.serverDH_G.buffer == NULL) {
  30085. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  30086. }
  30087. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  30088. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  30089. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  30090. ssl->buffers.serverDH_P.length,
  30091. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  30092. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  30093. ERROR_OUT(MEMORY_E, exit_sske);
  30094. }
  30095. ssl->buffers.serverDH_Pub.length =
  30096. ssl->buffers.serverDH_P.length;
  30097. }
  30098. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  30099. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  30100. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  30101. ssl->buffers.serverDH_P.length,
  30102. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  30103. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  30104. ERROR_OUT(MEMORY_E, exit_sske);
  30105. }
  30106. ssl->buffers.serverDH_Priv.length =
  30107. ssl->buffers.serverDH_P.length;
  30108. }
  30109. ssl->options.dhKeySz =
  30110. (word16)ssl->buffers.serverDH_P.length;
  30111. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  30112. (void**)&ssl->buffers.serverDH_Key);
  30113. if (ret != 0) {
  30114. goto exit_sske;
  30115. }
  30116. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  30117. !defined(HAVE_FIPS) && \
  30118. !defined(HAVE_SELFTEST)
  30119. if (ssl->options.dhDoKeyTest &&
  30120. !ssl->options.dhKeyTested)
  30121. {
  30122. ret = wc_DhSetCheckKey(
  30123. ssl->buffers.serverDH_Key,
  30124. ssl->buffers.serverDH_P.buffer,
  30125. ssl->buffers.serverDH_P.length,
  30126. ssl->buffers.serverDH_G.buffer,
  30127. ssl->buffers.serverDH_G.length,
  30128. NULL, 0, 0, ssl->rng);
  30129. if (ret != 0) {
  30130. goto exit_sske;
  30131. }
  30132. ssl->options.dhKeyTested = 1;
  30133. }
  30134. else
  30135. #endif
  30136. {
  30137. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  30138. ssl->buffers.serverDH_P.buffer,
  30139. ssl->buffers.serverDH_P.length,
  30140. ssl->buffers.serverDH_G.buffer,
  30141. ssl->buffers.serverDH_G.length);
  30142. if (ret != 0) {
  30143. goto exit_sske;
  30144. }
  30145. }
  30146. #ifdef HAVE_SECURE_RENEGOTIATION
  30147. /* Check that the DH public key buffer is large
  30148. * enough to hold the key. This may occur on a
  30149. * renegotiation when the key generated in the
  30150. * initial handshake is shorter than the key
  30151. * generated in the renegotiation. */
  30152. if (ssl->buffers.serverDH_Pub.length <
  30153. ssl->buffers.serverDH_P.length) {
  30154. byte* tmp = (byte*)XREALLOC(
  30155. ssl->buffers.serverDH_Pub.buffer,
  30156. ssl->buffers.serverDH_P.length +
  30157. OPAQUE16_LEN,
  30158. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  30159. if (tmp == NULL)
  30160. ERROR_OUT(MEMORY_E, exit_sske);
  30161. ssl->buffers.serverDH_Pub.buffer = tmp;
  30162. ssl->buffers.serverDH_Pub.length =
  30163. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  30164. }
  30165. #endif
  30166. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  30167. ssl->buffers.serverDH_Priv.buffer,
  30168. (word32*)&ssl->buffers.serverDH_Priv.length,
  30169. ssl->buffers.serverDH_Pub.buffer,
  30170. (word32*)&ssl->buffers.serverDH_Pub.length);
  30171. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30172. wc_MemZero_Add("DH private key buffer",
  30173. ssl->buffers.serverDH_Priv.buffer,
  30174. ssl->buffers.serverDH_Priv.length);
  30175. #endif
  30176. break;
  30177. }
  30178. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  30179. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  30180. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  30181. case ecdhe_psk_kea:
  30182. /* Fall through to create temp ECC key */
  30183. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  30184. #if defined(HAVE_ECC) || \
  30185. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  30186. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  30187. !defined(NO_RSA)))
  30188. case ecc_diffie_hellman_kea:
  30189. {
  30190. #ifdef HAVE_CURVE25519
  30191. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  30192. /* need ephemeral key now, create it if missing */
  30193. if (ssl->eccTempKey == NULL) {
  30194. /* alloc/init on demand */
  30195. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  30196. (void**)&ssl->eccTempKey);
  30197. if (ret != 0) {
  30198. goto exit_sske;
  30199. }
  30200. }
  30201. if (ssl->eccTempKeyPresent == 0) {
  30202. ret = X25519MakeKey(ssl,
  30203. (curve25519_key*)ssl->eccTempKey, NULL);
  30204. if (ret == 0 || ret == WC_PENDING_E) {
  30205. ssl->eccTempKeyPresent =
  30206. DYNAMIC_TYPE_CURVE25519;
  30207. }
  30208. else {
  30209. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  30210. (void**)&ssl->eccTempKey);
  30211. }
  30212. }
  30213. break;
  30214. }
  30215. #endif
  30216. #ifdef HAVE_CURVE448
  30217. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  30218. /* need ephemeral key now, create it if missing */
  30219. if (ssl->eccTempKey == NULL) {
  30220. /* alloc/init on demand */
  30221. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  30222. (void**)&ssl->eccTempKey);
  30223. if (ret != 0) {
  30224. goto exit_sske;
  30225. }
  30226. }
  30227. if (ssl->eccTempKeyPresent == 0) {
  30228. ret = X448MakeKey(ssl,
  30229. (curve448_key*)ssl->eccTempKey, NULL);
  30230. if (ret == 0 || ret == WC_PENDING_E) {
  30231. ssl->eccTempKeyPresent =
  30232. DYNAMIC_TYPE_CURVE448;
  30233. }
  30234. else {
  30235. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  30236. (void**)&ssl->eccTempKey);
  30237. }
  30238. }
  30239. break;
  30240. }
  30241. #endif
  30242. #ifdef HAVE_ECC
  30243. /* need ephemeral key now, create it if missing */
  30244. if (ssl->eccTempKey == NULL) {
  30245. /* alloc/init on demand */
  30246. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  30247. (void**)&ssl->eccTempKey);
  30248. if (ret != 0) {
  30249. goto exit_sske;
  30250. }
  30251. }
  30252. if (ssl->eccTempKeyPresent == 0) {
  30253. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  30254. if (ret == 0 || ret == WC_PENDING_E) {
  30255. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  30256. }
  30257. }
  30258. #endif
  30259. break;
  30260. }
  30261. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  30262. default:
  30263. /* Skip ServerKeyExchange */
  30264. goto exit_sske;
  30265. } /* switch(ssl->specs.kea) */
  30266. /* Check for error */
  30267. if (ret != 0) {
  30268. goto exit_sske;
  30269. }
  30270. /* Advance state and proceed */
  30271. ssl->options.asyncState = TLS_ASYNC_BUILD;
  30272. } /* case TLS_ASYNC_BEGIN */
  30273. FALL_THROUGH;
  30274. case TLS_ASYNC_BUILD:
  30275. {
  30276. switch(ssl->specs.kea)
  30277. {
  30278. #ifndef NO_PSK
  30279. case psk_kea:
  30280. {
  30281. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  30282. if (ssl->arrays->server_hint[0] == 0) {
  30283. ERROR_OUT(0, exit_sske); /* don't send */
  30284. }
  30285. /* include size part */
  30286. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  30287. if (args->length > MAX_PSK_ID_LEN) {
  30288. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  30289. }
  30290. args->length += HINT_LEN_SZ;
  30291. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  30292. RECORD_HEADER_SZ;
  30293. #ifdef WOLFSSL_DTLS
  30294. if (ssl->options.dtls) {
  30295. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30296. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30297. }
  30298. #endif
  30299. if (IsEncryptionOn(ssl, 1)) {
  30300. args->sendSz += MAX_MSG_EXTRA;
  30301. }
  30302. /* Use tmp buffer */
  30303. args->input = (byte*)XMALLOC(args->sendSz,
  30304. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30305. if (args->input == NULL)
  30306. ERROR_OUT(MEMORY_E, exit_sske);
  30307. args->output = args->input;
  30308. AddHeaders(args->output, args->length,
  30309. server_key_exchange, ssl);
  30310. /* key data */
  30311. c16toa((word16)(args->length - HINT_LEN_SZ),
  30312. args->output + args->idx);
  30313. args->idx += HINT_LEN_SZ;
  30314. XMEMCPY(args->output + args->idx,
  30315. ssl->arrays->server_hint,
  30316. args->length - HINT_LEN_SZ);
  30317. break;
  30318. }
  30319. #endif /* !NO_PSK */
  30320. #if !defined(NO_DH) && !defined(NO_PSK)
  30321. case dhe_psk_kea:
  30322. {
  30323. word32 hintLen;
  30324. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  30325. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  30326. ssl->buffers.serverDH_P.length +
  30327. ssl->buffers.serverDH_G.length +
  30328. ssl->buffers.serverDH_Pub.length;
  30329. /* include size part */
  30330. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  30331. if (hintLen > MAX_PSK_ID_LEN) {
  30332. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  30333. }
  30334. args->length += hintLen + HINT_LEN_SZ;
  30335. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  30336. RECORD_HEADER_SZ;
  30337. #ifdef WOLFSSL_DTLS
  30338. if (ssl->options.dtls) {
  30339. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30340. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30341. }
  30342. #endif
  30343. if (IsEncryptionOn(ssl, 1)) {
  30344. args->sendSz += MAX_MSG_EXTRA;
  30345. }
  30346. /* Use tmp buffer */
  30347. args->input = (byte*)XMALLOC(args->sendSz,
  30348. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30349. if (args->input == NULL)
  30350. ERROR_OUT(MEMORY_E, exit_sske);
  30351. args->output = args->input;
  30352. AddHeaders(args->output, args->length,
  30353. server_key_exchange, ssl);
  30354. /* key data */
  30355. c16toa((word16)hintLen, args->output + args->idx);
  30356. args->idx += HINT_LEN_SZ;
  30357. XMEMCPY(args->output + args->idx,
  30358. ssl->arrays->server_hint, hintLen);
  30359. args->idx += hintLen;
  30360. /* add p, g, pub */
  30361. c16toa((word16)ssl->buffers.serverDH_P.length,
  30362. args->output + args->idx);
  30363. args->idx += LENGTH_SZ;
  30364. XMEMCPY(args->output + args->idx,
  30365. ssl->buffers.serverDH_P.buffer,
  30366. ssl->buffers.serverDH_P.length);
  30367. args->idx += ssl->buffers.serverDH_P.length;
  30368. /* g */
  30369. c16toa((word16)ssl->buffers.serverDH_G.length,
  30370. args->output + args->idx);
  30371. args->idx += LENGTH_SZ;
  30372. XMEMCPY(args->output + args->idx,
  30373. ssl->buffers.serverDH_G.buffer,
  30374. ssl->buffers.serverDH_G.length);
  30375. args->idx += ssl->buffers.serverDH_G.length;
  30376. /* pub */
  30377. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  30378. args->output + args->idx);
  30379. args->idx += LENGTH_SZ;
  30380. XMEMCPY(args->output + args->idx,
  30381. ssl->buffers.serverDH_Pub.buffer,
  30382. ssl->buffers.serverDH_Pub.length);
  30383. /* No need to update idx, since sizes are already set */
  30384. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  30385. break;
  30386. }
  30387. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  30388. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  30389. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  30390. case ecdhe_psk_kea:
  30391. {
  30392. word32 hintLen;
  30393. /* curve type, named curve, length(1) */
  30394. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  30395. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  30396. args->exportSz = MAX_EXPORT_ECC_SZ;
  30397. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  30398. ssl->heap, DYNAMIC_TYPE_DER);
  30399. if (args->exportBuf == NULL) {
  30400. ERROR_OUT(MEMORY_E, exit_sske);
  30401. }
  30402. #ifdef HAVE_CURVE25519
  30403. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  30404. if (wc_curve25519_export_public_ex(
  30405. (curve25519_key*)ssl->eccTempKey,
  30406. args->exportBuf, &args->exportSz,
  30407. EC25519_LITTLE_ENDIAN) != 0) {
  30408. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  30409. }
  30410. }
  30411. else
  30412. #endif
  30413. #ifdef HAVE_CURVE448
  30414. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  30415. if (wc_curve448_export_public_ex(
  30416. (curve448_key*)ssl->eccTempKey,
  30417. args->exportBuf, &args->exportSz,
  30418. EC448_LITTLE_ENDIAN) != 0) {
  30419. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  30420. }
  30421. }
  30422. else
  30423. #endif
  30424. {
  30425. PRIVATE_KEY_UNLOCK();
  30426. ret = wc_ecc_export_x963(ssl->eccTempKey,
  30427. args->exportBuf, &args->exportSz);
  30428. PRIVATE_KEY_LOCK();
  30429. if (ret != 0) {
  30430. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  30431. }
  30432. }
  30433. args->length += args->exportSz;
  30434. /* include size part */
  30435. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  30436. if (hintLen > MAX_PSK_ID_LEN) {
  30437. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  30438. }
  30439. args->length += hintLen + HINT_LEN_SZ;
  30440. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  30441. #ifdef WOLFSSL_DTLS
  30442. if (ssl->options.dtls) {
  30443. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30444. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30445. }
  30446. #endif
  30447. if (IsEncryptionOn(ssl, 1)) {
  30448. args->sendSz += MAX_MSG_EXTRA;
  30449. }
  30450. /* Use tmp buffer */
  30451. args->input = (byte*)XMALLOC(args->sendSz,
  30452. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30453. if (args->input == NULL)
  30454. ERROR_OUT(MEMORY_E, exit_sske);
  30455. args->output = args->input;
  30456. /* key data */
  30457. c16toa((word16)hintLen, args->output + args->idx);
  30458. args->idx += HINT_LEN_SZ;
  30459. XMEMCPY(args->output + args->idx,
  30460. ssl->arrays->server_hint, hintLen);
  30461. args->idx += hintLen;
  30462. /* ECC key exchange data */
  30463. args->output[args->idx++] = named_curve;
  30464. args->output[args->idx++] = 0x00; /* leading zero */
  30465. #ifdef HAVE_CURVE25519
  30466. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  30467. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  30468. else
  30469. #endif
  30470. #ifdef HAVE_CURVE448
  30471. if (ssl->ecdhCurveOID == ECC_X448_OID)
  30472. args->output[args->idx++] = WOLFSSL_ECC_X448;
  30473. else
  30474. #endif
  30475. {
  30476. #ifdef HAVE_ECC
  30477. args->output[args->idx++] =
  30478. SetCurveId(ssl->eccTempKey);
  30479. #endif
  30480. }
  30481. args->output[args->idx++] = (byte)args->exportSz;
  30482. XMEMCPY(args->output + args->idx, args->exportBuf,
  30483. args->exportSz);
  30484. break;
  30485. }
  30486. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  30487. #if defined(HAVE_ECC) || \
  30488. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  30489. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  30490. !defined(NO_RSA)))
  30491. case ecc_diffie_hellman_kea:
  30492. {
  30493. enum wc_HashType hashType;
  30494. word32 preSigSz, preSigIdx;
  30495. /* curve type, named curve, length(1) */
  30496. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  30497. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  30498. /* Export temp ECC key and add to length */
  30499. args->exportSz = MAX_EXPORT_ECC_SZ;
  30500. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  30501. ssl->heap, DYNAMIC_TYPE_DER);
  30502. if (args->exportBuf == NULL) {
  30503. ERROR_OUT(MEMORY_E, exit_sske);
  30504. }
  30505. #ifdef HAVE_CURVE25519
  30506. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  30507. if (wc_curve25519_export_public_ex(
  30508. (curve25519_key*)ssl->eccTempKey,
  30509. args->exportBuf, &args->exportSz,
  30510. EC25519_LITTLE_ENDIAN) != 0) {
  30511. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  30512. }
  30513. }
  30514. else
  30515. #endif
  30516. #ifdef HAVE_CURVE448
  30517. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  30518. if (wc_curve448_export_public_ex(
  30519. (curve448_key*)ssl->eccTempKey,
  30520. args->exportBuf, &args->exportSz,
  30521. EC448_LITTLE_ENDIAN) != 0) {
  30522. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  30523. }
  30524. }
  30525. else
  30526. #endif
  30527. {
  30528. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  30529. PRIVATE_KEY_UNLOCK();
  30530. ret = wc_ecc_export_x963(ssl->eccTempKey,
  30531. args->exportBuf, &args->exportSz);
  30532. PRIVATE_KEY_LOCK();
  30533. if (ret != 0) {
  30534. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  30535. }
  30536. #endif
  30537. }
  30538. args->length += args->exportSz;
  30539. preSigSz = args->length;
  30540. preSigIdx = args->idx;
  30541. if (ssl->buffers.key == NULL) {
  30542. #ifdef HAVE_PK_CALLBACKS
  30543. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  30544. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  30545. if (args->tmpSigSz == 0) {
  30546. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  30547. }
  30548. }
  30549. else
  30550. #endif
  30551. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  30552. }
  30553. else {
  30554. switch(ssl->options.sigAlgo) {
  30555. #ifndef NO_RSA
  30556. #ifdef WC_RSA_PSS
  30557. case rsa_pss_sa_algo:
  30558. #endif
  30559. case rsa_sa_algo:
  30560. {
  30561. word32 keySz;
  30562. ssl->buffers.keyType = rsa_sa_algo;
  30563. ret = DecodePrivateKey(ssl, &keySz);
  30564. if (ret != 0) {
  30565. goto exit_sske;
  30566. }
  30567. args->tmpSigSz = (word32)keySz;
  30568. break;
  30569. }
  30570. #endif /* !NO_RSA */
  30571. #ifdef HAVE_ECC
  30572. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  30573. case sm2_sa_algo:
  30574. #endif
  30575. case ecc_dsa_sa_algo:
  30576. {
  30577. word32 keySz;
  30578. ssl->buffers.keyType = ecc_dsa_sa_algo;
  30579. ret = DecodePrivateKey(ssl, &keySz);
  30580. if (ret != 0) {
  30581. goto exit_sske;
  30582. }
  30583. /* worst case estimate */
  30584. args->tmpSigSz = keySz;
  30585. break;
  30586. }
  30587. #endif
  30588. #ifdef HAVE_ED25519
  30589. case ed25519_sa_algo:
  30590. {
  30591. word32 keySz;
  30592. ssl->buffers.keyType = ed25519_sa_algo;
  30593. ret = DecodePrivateKey(ssl, &keySz);
  30594. if (ret != 0) {
  30595. goto exit_sske;
  30596. }
  30597. /* worst case estimate */
  30598. args->tmpSigSz = ED25519_SIG_SIZE;
  30599. break;
  30600. }
  30601. #endif /* HAVE_ED25519 */
  30602. #ifdef HAVE_ED448
  30603. case ed448_sa_algo:
  30604. {
  30605. word32 keySz;
  30606. ssl->buffers.keyType = ed448_sa_algo;
  30607. ret = DecodePrivateKey(ssl, &keySz);
  30608. if (ret != 0) {
  30609. goto exit_sske;
  30610. }
  30611. /* worst case estimate */
  30612. args->tmpSigSz = ED448_SIG_SIZE;
  30613. break;
  30614. }
  30615. #endif /* HAVE_ED448 */
  30616. default:
  30617. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  30618. } /* switch(ssl->specs.sig_algo) */
  30619. }
  30620. /* sig length */
  30621. args->length += LENGTH_SZ;
  30622. args->length += args->tmpSigSz;
  30623. if (IsAtLeastTLSv1_2(ssl)) {
  30624. args->length += HASH_SIG_SIZE;
  30625. }
  30626. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  30627. #ifdef WOLFSSL_DTLS
  30628. if (ssl->options.dtls) {
  30629. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30630. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30631. preSigIdx = args->idx;
  30632. }
  30633. #endif
  30634. if (IsEncryptionOn(ssl, 1)) {
  30635. args->sendSz += MAX_MSG_EXTRA;
  30636. }
  30637. /* Use tmp buffer */
  30638. args->input = (byte*)XMALLOC(args->sendSz,
  30639. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30640. if (args->input == NULL)
  30641. ERROR_OUT(MEMORY_E, exit_sske);
  30642. args->output = args->input;
  30643. /* record and message headers will be added below, when we're sure
  30644. of the sig length */
  30645. /* key exchange data */
  30646. args->output[args->idx++] = named_curve;
  30647. args->output[args->idx++] = 0x00; /* leading zero */
  30648. #ifdef HAVE_CURVE25519
  30649. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  30650. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  30651. else
  30652. #endif
  30653. #ifdef HAVE_CURVE448
  30654. if (ssl->ecdhCurveOID == ECC_X448_OID)
  30655. args->output[args->idx++] = WOLFSSL_ECC_X448;
  30656. else
  30657. #endif
  30658. {
  30659. #ifdef HAVE_ECC
  30660. args->output[args->idx++] =
  30661. SetCurveId(ssl->eccTempKey);
  30662. #endif
  30663. }
  30664. args->output[args->idx++] = (byte)args->exportSz;
  30665. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  30666. args->idx += args->exportSz;
  30667. /* Determine hash type */
  30668. if (IsAtLeastTLSv1_2(ssl)) {
  30669. EncodeSigAlg(ssl->options.hashAlgo,
  30670. ssl->options.sigAlgo,
  30671. &args->output[args->idx]);
  30672. args->idx += 2;
  30673. hashType = HashAlgoToType(ssl->options.hashAlgo);
  30674. if (hashType == WC_HASH_TYPE_NONE) {
  30675. ERROR_OUT(ALGO_ID_E, exit_sske);
  30676. }
  30677. } else {
  30678. /* only using sha and md5 for rsa */
  30679. #ifndef NO_OLD_TLS
  30680. hashType = WC_HASH_TYPE_SHA;
  30681. if (ssl->options.sigAlgo == rsa_sa_algo) {
  30682. hashType = WC_HASH_TYPE_MD5_SHA;
  30683. }
  30684. #else
  30685. ERROR_OUT(ALGO_ID_E, exit_sske);
  30686. #endif
  30687. }
  30688. /* Signature length will be written later, when we're sure what it is */
  30689. #ifdef HAVE_FUZZER
  30690. if (ssl->fuzzerCb) {
  30691. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  30692. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  30693. }
  30694. #endif
  30695. ret = HashSkeData(ssl, hashType,
  30696. args->output + preSigIdx, preSigSz,
  30697. ssl->options.sigAlgo);
  30698. if (ret != 0) {
  30699. goto exit_sske;
  30700. }
  30701. args->sigSz = args->tmpSigSz;
  30702. /* Sign hash to create signature */
  30703. switch (ssl->options.sigAlgo)
  30704. {
  30705. #ifndef NO_RSA
  30706. case rsa_sa_algo:
  30707. {
  30708. /* For TLS 1.2 re-encode signature */
  30709. if (IsAtLeastTLSv1_2(ssl)) {
  30710. byte* encodedSig = (byte*)XMALLOC(
  30711. MAX_ENCODED_SIG_SZ, ssl->heap,
  30712. DYNAMIC_TYPE_DIGEST);
  30713. if (encodedSig == NULL) {
  30714. ERROR_OUT(MEMORY_E, exit_sske);
  30715. }
  30716. ssl->buffers.digest.length =
  30717. wc_EncodeSignature(encodedSig,
  30718. ssl->buffers.digest.buffer,
  30719. ssl->buffers.digest.length,
  30720. TypeHash(ssl->options.hashAlgo));
  30721. /* Replace sig buffer with new one */
  30722. if (!ssl->options.dontFreeDigest) {
  30723. XFREE(ssl->buffers.digest.buffer,
  30724. ssl->heap, DYNAMIC_TYPE_DIGEST);
  30725. }
  30726. ssl->options.dontFreeDigest = 0;
  30727. ssl->buffers.digest.buffer = encodedSig;
  30728. }
  30729. /* write sig size here */
  30730. c16toa((word16)args->sigSz,
  30731. args->output + args->idx);
  30732. args->idx += LENGTH_SZ;
  30733. break;
  30734. }
  30735. #ifdef WC_RSA_PSS
  30736. case rsa_pss_sa_algo:
  30737. /* write sig size here */
  30738. c16toa((word16)args->sigSz,
  30739. args->output + args->idx);
  30740. args->idx += LENGTH_SZ;
  30741. break;
  30742. #endif
  30743. #endif /* !NO_RSA */
  30744. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  30745. case sm2_sa_algo:
  30746. #endif
  30747. case ecc_dsa_sa_algo:
  30748. {
  30749. break;
  30750. }
  30751. #ifdef HAVE_ED25519
  30752. case ed25519_sa_algo:
  30753. ret = Ed25519CheckPubKey(ssl);
  30754. if (ret != 0)
  30755. goto exit_sske;
  30756. break;
  30757. #endif /* HAVE_ED25519 */
  30758. #ifdef HAVE_ED448
  30759. case ed448_sa_algo:
  30760. ret = Ed448CheckPubKey(ssl);
  30761. if (ret != 0)
  30762. goto exit_sske;
  30763. break;
  30764. #endif /* HAVE_ED448 */
  30765. default:
  30766. break;
  30767. } /* switch(ssl->specs.sig_algo) */
  30768. break;
  30769. }
  30770. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  30771. #if !defined(NO_DH) && (!defined(NO_RSA) || \
  30772. (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  30773. case diffie_hellman_kea:
  30774. {
  30775. enum wc_HashType hashType;
  30776. word32 preSigSz, preSigIdx;
  30777. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  30778. args->length = LENGTH_SZ * 3; /* p, g, pub */
  30779. args->length += ssl->buffers.serverDH_P.length +
  30780. ssl->buffers.serverDH_G.length +
  30781. ssl->buffers.serverDH_Pub.length;
  30782. preSigIdx = args->idx;
  30783. preSigSz = args->length;
  30784. if (!ssl->options.usingAnon_cipher) {
  30785. word32 keySz = 0;
  30786. /* sig length */
  30787. args->length += LENGTH_SZ;
  30788. if (ssl->buffers.key == NULL) {
  30789. #ifdef HAVE_PK_CALLBACKS
  30790. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  30791. keySz = (word16)GetPrivateKeySigSize(ssl);
  30792. else
  30793. #endif
  30794. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  30795. }
  30796. else
  30797. {
  30798. if (ssl->buffers.keyType == 0)
  30799. ssl->buffers.keyType = rsa_sa_algo;
  30800. ret = DecodePrivateKey(ssl, &keySz);
  30801. if (ret != 0) {
  30802. goto exit_sske;
  30803. }
  30804. }
  30805. /* test if keySz has error */
  30806. if (keySz == 0) {
  30807. ERROR_OUT(keySz, exit_sske);
  30808. }
  30809. args->tmpSigSz = (word32)keySz;
  30810. args->length += args->tmpSigSz;
  30811. if (IsAtLeastTLSv1_2(ssl)) {
  30812. args->length += HASH_SIG_SIZE;
  30813. }
  30814. }
  30815. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  30816. RECORD_HEADER_SZ;
  30817. #ifdef WOLFSSL_DTLS
  30818. if (ssl->options.dtls) {
  30819. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30820. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30821. preSigIdx = args->idx;
  30822. }
  30823. #endif
  30824. if (IsEncryptionOn(ssl, 1)) {
  30825. args->sendSz += MAX_MSG_EXTRA;
  30826. }
  30827. /* Use tmp buffer */
  30828. args->input = (byte*)XMALLOC(args->sendSz,
  30829. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30830. if (args->input == NULL)
  30831. ERROR_OUT(MEMORY_E, exit_sske);
  30832. args->output = args->input;
  30833. AddHeaders(args->output, args->length,
  30834. server_key_exchange, ssl);
  30835. /* add p, g, pub */
  30836. c16toa((word16)ssl->buffers.serverDH_P.length,
  30837. args->output + args->idx);
  30838. args->idx += LENGTH_SZ;
  30839. XMEMCPY(args->output + args->idx,
  30840. ssl->buffers.serverDH_P.buffer,
  30841. ssl->buffers.serverDH_P.length);
  30842. args->idx += ssl->buffers.serverDH_P.length;
  30843. /* g */
  30844. c16toa((word16)ssl->buffers.serverDH_G.length,
  30845. args->output + args->idx);
  30846. args->idx += LENGTH_SZ;
  30847. XMEMCPY(args->output + args->idx,
  30848. ssl->buffers.serverDH_G.buffer,
  30849. ssl->buffers.serverDH_G.length);
  30850. args->idx += ssl->buffers.serverDH_G.length;
  30851. /* pub */
  30852. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  30853. args->output + args->idx);
  30854. args->idx += LENGTH_SZ;
  30855. XMEMCPY(args->output + args->idx,
  30856. ssl->buffers.serverDH_Pub.buffer,
  30857. ssl->buffers.serverDH_Pub.length);
  30858. args->idx += ssl->buffers.serverDH_Pub.length;
  30859. #ifdef HAVE_FUZZER
  30860. if (ssl->fuzzerCb) {
  30861. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  30862. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  30863. }
  30864. #endif
  30865. if (ssl->options.usingAnon_cipher) {
  30866. break;
  30867. }
  30868. /* Determine hash type */
  30869. if (IsAtLeastTLSv1_2(ssl)) {
  30870. EncodeSigAlg(ssl->options.hashAlgo,
  30871. ssl->options.sigAlgo,
  30872. &args->output[args->idx]);
  30873. args->idx += 2;
  30874. hashType = HashAlgoToType(ssl->options.hashAlgo);
  30875. if (hashType == WC_HASH_TYPE_NONE) {
  30876. ERROR_OUT(ALGO_ID_E, exit_sske);
  30877. }
  30878. } else {
  30879. /* only using sha and md5 for rsa */
  30880. #ifndef NO_OLD_TLS
  30881. hashType = WC_HASH_TYPE_SHA;
  30882. if (ssl->options.sigAlgo == rsa_sa_algo) {
  30883. hashType = WC_HASH_TYPE_MD5_SHA;
  30884. }
  30885. #else
  30886. ERROR_OUT(ALGO_ID_E, exit_sske);
  30887. #endif
  30888. }
  30889. /* signature size */
  30890. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  30891. args->idx += LENGTH_SZ;
  30892. ret = HashSkeData(ssl, hashType,
  30893. args->output + preSigIdx, preSigSz,
  30894. ssl->options.sigAlgo);
  30895. if (ret != 0) {
  30896. goto exit_sske;
  30897. }
  30898. args->sigSz = args->tmpSigSz;
  30899. /* Sign hash to create signature */
  30900. switch (ssl->options.sigAlgo)
  30901. {
  30902. #ifndef NO_RSA
  30903. case rsa_sa_algo:
  30904. {
  30905. /* For TLS 1.2 re-encode signature */
  30906. if (IsAtLeastTLSv1_2(ssl)) {
  30907. byte* encodedSig = (byte*)XMALLOC(
  30908. MAX_ENCODED_SIG_SZ, ssl->heap,
  30909. DYNAMIC_TYPE_DIGEST);
  30910. if (encodedSig == NULL) {
  30911. ERROR_OUT(MEMORY_E, exit_sske);
  30912. }
  30913. ssl->buffers.digest.length =
  30914. wc_EncodeSignature(encodedSig,
  30915. ssl->buffers.digest.buffer,
  30916. ssl->buffers.digest.length,
  30917. TypeHash(ssl->options.hashAlgo));
  30918. /* Replace sig buffer with new one */
  30919. if (!ssl->options.dontFreeDigest) {
  30920. XFREE(ssl->buffers.digest.buffer,
  30921. ssl->heap, DYNAMIC_TYPE_DIGEST);
  30922. }
  30923. ssl->options.dontFreeDigest = 0;
  30924. ssl->buffers.digest.buffer = encodedSig;
  30925. }
  30926. break;
  30927. }
  30928. #endif /* NO_RSA */
  30929. default:
  30930. break;
  30931. } /* switch (ssl->options.sigAlgo) */
  30932. break;
  30933. }
  30934. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  30935. default:
  30936. break;
  30937. } /* switch(ssl->specs.kea) */
  30938. /* Check for error */
  30939. if (ret != 0) {
  30940. goto exit_sske;
  30941. }
  30942. /* Advance state and proceed */
  30943. ssl->options.asyncState = TLS_ASYNC_DO;
  30944. } /* case TLS_ASYNC_BUILD */
  30945. FALL_THROUGH;
  30946. case TLS_ASYNC_DO:
  30947. {
  30948. switch(ssl->specs.kea)
  30949. {
  30950. #ifndef NO_PSK
  30951. case psk_kea:
  30952. {
  30953. break;
  30954. }
  30955. #endif /* !NO_PSK */
  30956. #if !defined(NO_DH) && !defined(NO_PSK)
  30957. case dhe_psk_kea:
  30958. {
  30959. break;
  30960. }
  30961. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  30962. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  30963. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  30964. case ecdhe_psk_kea:
  30965. {
  30966. break;
  30967. }
  30968. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  30969. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  30970. defined(HAVE_CURVE448)
  30971. case ecc_diffie_hellman_kea:
  30972. {
  30973. /* Sign hash to create signature */
  30974. switch (ssl->options.sigAlgo)
  30975. {
  30976. #ifndef NO_RSA
  30977. #ifdef WC_RSA_PSS
  30978. case rsa_pss_sa_algo:
  30979. #endif
  30980. case rsa_sa_algo:
  30981. {
  30982. RsaKey* key = (RsaKey*)ssl->hsKey;
  30983. ret = RsaSign(ssl,
  30984. ssl->buffers.digest.buffer,
  30985. ssl->buffers.digest.length,
  30986. args->output + args->idx,
  30987. &args->sigSz,
  30988. ssl->options.sigAlgo, ssl->options.hashAlgo,
  30989. key,
  30990. ssl->buffers.key
  30991. );
  30992. break;
  30993. }
  30994. #endif /* !NO_RSA */
  30995. #ifdef HAVE_ECC
  30996. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  30997. case sm2_sa_algo:
  30998. {
  30999. ecc_key* key = (ecc_key*)ssl->hsKey;
  31000. ret = Sm2wSm3Sign(ssl,
  31001. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  31002. ssl->buffers.sig.buffer,
  31003. ssl->buffers.sig.length,
  31004. args->output + LENGTH_SZ + args->idx,
  31005. &args->sigSz,
  31006. key,
  31007. #ifdef HAVE_PK_CALLBACKS
  31008. ssl->buffers.key
  31009. #else
  31010. NULL
  31011. #endif
  31012. );
  31013. break;
  31014. }
  31015. #endif
  31016. case ecc_dsa_sa_algo:
  31017. {
  31018. ecc_key* key = (ecc_key*)ssl->hsKey;
  31019. ret = EccSign(ssl,
  31020. ssl->buffers.digest.buffer,
  31021. ssl->buffers.digest.length,
  31022. args->output + LENGTH_SZ + args->idx,
  31023. &args->sigSz,
  31024. key,
  31025. #ifdef HAVE_PK_CALLBACKS
  31026. ssl->buffers.key
  31027. #else
  31028. NULL
  31029. #endif
  31030. );
  31031. break;
  31032. }
  31033. #endif /* HAVE_ECC */
  31034. #ifdef HAVE_ED25519
  31035. case ed25519_sa_algo:
  31036. {
  31037. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  31038. ret = Ed25519Sign(ssl,
  31039. ssl->buffers.sig.buffer,
  31040. ssl->buffers.sig.length,
  31041. args->output + LENGTH_SZ + args->idx,
  31042. &args->sigSz,
  31043. key,
  31044. #ifdef HAVE_PK_CALLBACKS
  31045. ssl->buffers.key
  31046. #else
  31047. NULL
  31048. #endif
  31049. );
  31050. break;
  31051. }
  31052. #endif
  31053. #ifdef HAVE_ED448
  31054. case ed448_sa_algo:
  31055. {
  31056. ed448_key* key = (ed448_key*)ssl->hsKey;
  31057. ret = Ed448Sign(ssl,
  31058. ssl->buffers.sig.buffer,
  31059. ssl->buffers.sig.length,
  31060. args->output + LENGTH_SZ + args->idx,
  31061. &args->sigSz,
  31062. key,
  31063. #ifdef HAVE_PK_CALLBACKS
  31064. ssl->buffers.key
  31065. #else
  31066. NULL
  31067. #endif
  31068. );
  31069. break;
  31070. }
  31071. #endif
  31072. default:
  31073. ERROR_OUT(ALGO_ID_E, exit_sske);
  31074. } /* switch(ssl->specs.sig_algo) */
  31075. break;
  31076. }
  31077. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  31078. #if !defined(NO_DH) && !defined(NO_RSA)
  31079. case diffie_hellman_kea:
  31080. {
  31081. /* Sign hash to create signature */
  31082. switch (ssl->options.sigAlgo)
  31083. {
  31084. #ifndef NO_RSA
  31085. #ifdef WC_RSA_PSS
  31086. case rsa_pss_sa_algo:
  31087. #endif
  31088. case rsa_sa_algo:
  31089. {
  31090. RsaKey* key = (RsaKey*)ssl->hsKey;
  31091. if (ssl->options.usingAnon_cipher) {
  31092. break;
  31093. }
  31094. ret = RsaSign(ssl,
  31095. ssl->buffers.digest.buffer,
  31096. ssl->buffers.digest.length,
  31097. args->output + args->idx,
  31098. &args->sigSz,
  31099. ssl->options.sigAlgo, ssl->options.hashAlgo,
  31100. key,
  31101. ssl->buffers.key
  31102. );
  31103. break;
  31104. }
  31105. #endif /* NO_RSA */
  31106. default:
  31107. break;
  31108. } /* switch (ssl->options.sigAlgo) */
  31109. break;
  31110. }
  31111. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  31112. default:
  31113. break;
  31114. } /* switch(ssl->specs.kea) */
  31115. /* Check for error */
  31116. if (ret != 0) {
  31117. goto exit_sske;
  31118. }
  31119. /* Advance state and proceed */
  31120. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  31121. } /* case TLS_ASYNC_DO */
  31122. FALL_THROUGH;
  31123. case TLS_ASYNC_VERIFY:
  31124. {
  31125. switch(ssl->specs.kea)
  31126. {
  31127. #ifndef NO_PSK
  31128. case psk_kea:
  31129. {
  31130. /* Nothing to do in this sub-state */
  31131. break;
  31132. }
  31133. #endif /* !NO_PSK */
  31134. #if !defined(NO_DH) && !defined(NO_PSK)
  31135. case dhe_psk_kea:
  31136. {
  31137. /* Nothing to do in this sub-state */
  31138. break;
  31139. }
  31140. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  31141. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31142. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  31143. case ecdhe_psk_kea:
  31144. {
  31145. /* Nothing to do in this sub-state */
  31146. break;
  31147. }
  31148. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  31149. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31150. defined(HAVE_CURVE448)
  31151. case ecc_diffie_hellman_kea:
  31152. {
  31153. switch(ssl->options.sigAlgo)
  31154. {
  31155. #ifndef NO_RSA
  31156. #ifdef WC_RSA_PSS
  31157. case rsa_pss_sa_algo:
  31158. #endif
  31159. case rsa_sa_algo:
  31160. {
  31161. RsaKey* key = (RsaKey*)ssl->hsKey;
  31162. if (args->verifySig == NULL) {
  31163. if (args->sigSz == 0) {
  31164. ERROR_OUT(BAD_COND_E, exit_sske);
  31165. }
  31166. args->verifySig = (byte*)XMALLOC(
  31167. args->sigSz, ssl->heap,
  31168. DYNAMIC_TYPE_SIGNATURE);
  31169. if (!args->verifySig) {
  31170. ERROR_OUT(MEMORY_E, exit_sske);
  31171. }
  31172. XMEMCPY(args->verifySig,
  31173. args->output + args->idx, args->sigSz);
  31174. }
  31175. /* check for signature faults */
  31176. ret = VerifyRsaSign(ssl,
  31177. args->verifySig, args->sigSz,
  31178. ssl->buffers.digest.buffer,
  31179. ssl->buffers.digest.length,
  31180. ssl->options.sigAlgo, ssl->options.hashAlgo,
  31181. key, ssl->buffers.key
  31182. );
  31183. break;
  31184. }
  31185. #endif
  31186. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  31187. case sm2_sa_algo:
  31188. #endif /* WOLFSSL_SM2 */
  31189. case ecc_dsa_sa_algo:
  31190. #ifdef WOLFSSL_CHECK_SIG_FAULTS
  31191. {
  31192. ecc_key* key = (ecc_key*)ssl->hsKey;
  31193. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  31194. if (ssl->options.sigAlgo == sm2_sa_algo) {
  31195. ret = Sm2wSm3Verify(ssl,
  31196. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  31197. args->output + LENGTH_SZ + args->idx,
  31198. args->sigSz,
  31199. ssl->buffers.sig.buffer,
  31200. ssl->buffers.sig.length,
  31201. key,
  31202. #ifdef HAVE_PK_CALLBACKS
  31203. ssl->buffers.key
  31204. #else
  31205. NULL
  31206. #endif
  31207. );
  31208. }
  31209. else
  31210. #endif /* WOLFSSL_SM2 */
  31211. {
  31212. ret = EccVerify(ssl,
  31213. args->output + LENGTH_SZ + args->idx,
  31214. args->sigSz,
  31215. ssl->buffers.digest.buffer,
  31216. ssl->buffers.digest.length,
  31217. key,
  31218. #ifdef HAVE_PK_CALLBACKS
  31219. ssl->buffers.key
  31220. #else
  31221. NULL
  31222. #endif
  31223. );
  31224. }
  31225. if (ret != 0) {
  31226. WOLFSSL_MSG(
  31227. "Failed to verify ECC signature");
  31228. goto exit_sske;
  31229. }
  31230. }
  31231. #if defined(HAVE_E25519) || defined(HAVE_ED448)
  31232. FALL_THROUGH;
  31233. #endif
  31234. #endif /* WOLFSSL_CHECK_SIG_FAULTS */
  31235. #ifdef HAVE_ED25519
  31236. case ed25519_sa_algo:
  31237. #endif
  31238. #ifdef HAVE_ED448
  31239. case ed448_sa_algo:
  31240. #endif
  31241. {
  31242. /* Now that we know the real sig size, write it. */
  31243. c16toa((word16)args->sigSz,
  31244. args->output + args->idx);
  31245. /* And adjust length and sendSz from estimates */
  31246. args->length += args->sigSz - args->tmpSigSz;
  31247. args->sendSz += args->sigSz - args->tmpSigSz;
  31248. break;
  31249. }
  31250. default:
  31251. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  31252. } /* switch(ssl->specs.sig_algo) */
  31253. break;
  31254. }
  31255. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  31256. #if !defined(NO_DH) && !defined(NO_RSA)
  31257. case diffie_hellman_kea:
  31258. {
  31259. switch (ssl->options.sigAlgo)
  31260. {
  31261. #ifndef NO_RSA
  31262. #ifndef WC_RSA_PSS
  31263. case rsa_pss_sa_algo:
  31264. #endif
  31265. case rsa_sa_algo:
  31266. {
  31267. RsaKey* key = (RsaKey*)ssl->hsKey;
  31268. if (ssl->options.usingAnon_cipher) {
  31269. break;
  31270. }
  31271. if (args->verifySig == NULL) {
  31272. if (args->sigSz == 0) {
  31273. ERROR_OUT(BAD_COND_E, exit_sske);
  31274. }
  31275. args->verifySig = (byte*)XMALLOC(
  31276. args->sigSz, ssl->heap,
  31277. DYNAMIC_TYPE_SIGNATURE);
  31278. if (!args->verifySig) {
  31279. ERROR_OUT(MEMORY_E, exit_sske);
  31280. }
  31281. XMEMCPY(args->verifySig,
  31282. args->output + args->idx, args->sigSz);
  31283. }
  31284. /* check for signature faults */
  31285. ret = VerifyRsaSign(ssl,
  31286. args->verifySig, args->sigSz,
  31287. ssl->buffers.digest.buffer,
  31288. ssl->buffers.digest.length,
  31289. ssl->options.sigAlgo, ssl->options.hashAlgo,
  31290. key, ssl->buffers.key
  31291. );
  31292. break;
  31293. }
  31294. #endif
  31295. } /* switch (ssl->options.sigAlgo) */
  31296. break;
  31297. }
  31298. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  31299. default:
  31300. break;
  31301. } /* switch(ssl->specs.kea) */
  31302. /* Check for error */
  31303. if (ret != 0) {
  31304. goto exit_sske;
  31305. }
  31306. /* Advance state and proceed */
  31307. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  31308. } /* case TLS_ASYNC_VERIFY */
  31309. FALL_THROUGH;
  31310. case TLS_ASYNC_FINALIZE:
  31311. {
  31312. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31313. defined(HAVE_CURVE448)
  31314. if (ssl->specs.kea == ecdhe_psk_kea ||
  31315. ssl->specs.kea == ecc_diffie_hellman_kea) {
  31316. /* Check output to make sure it was set */
  31317. if (args->output) {
  31318. AddHeaders(args->output, args->length,
  31319. server_key_exchange, ssl);
  31320. }
  31321. else {
  31322. ERROR_OUT(BUFFER_ERROR, exit_sske);
  31323. }
  31324. }
  31325. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  31326. /* Advance state and proceed */
  31327. ssl->options.asyncState = TLS_ASYNC_END;
  31328. } /* case TLS_ASYNC_FINALIZE */
  31329. FALL_THROUGH;
  31330. case TLS_ASYNC_END:
  31331. {
  31332. ret = SendHandshakeMsg(ssl, args->output, args->length,
  31333. server_key_exchange, "ServerKeyExchange");
  31334. if (ret != 0)
  31335. goto exit_sske;
  31336. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  31337. break;
  31338. }
  31339. default:
  31340. ret = INPUT_CASE_ERROR;
  31341. } /* switch(ssl->options.asyncState) */
  31342. exit_sske:
  31343. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  31344. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  31345. #ifdef WOLFSSL_ASYNC_IO
  31346. /* Handle async operation */
  31347. if (ret == WANT_WRITE
  31348. #ifdef WOLFSSL_ASYNC_CRYPT
  31349. || ret == WC_PENDING_E
  31350. #endif
  31351. )
  31352. return ret;
  31353. #endif /* WOLFSSL_ASYNC_IO */
  31354. /* Final cleanup */
  31355. if (
  31356. #ifdef WOLFSSL_ASYNC_IO
  31357. args != NULL &&
  31358. #endif
  31359. args->input != NULL) {
  31360. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  31361. args->input = NULL;
  31362. }
  31363. #ifdef WOLFSSL_ASYNC_IO
  31364. /* Cleanup async */
  31365. FreeAsyncCtx(ssl, 0);
  31366. #else
  31367. FreeSskeArgs(ssl, args);
  31368. #endif
  31369. FreeKeyExchange(ssl);
  31370. if (ret != 0) {
  31371. WOLFSSL_ERROR_VERBOSE(ret);
  31372. }
  31373. return ret;
  31374. }
  31375. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  31376. defined(OPENSSL_ALL)
  31377. /* search suites for specific one, idx on success, negative on error */
  31378. static int FindSuite(Suites* suites, byte first, byte second)
  31379. {
  31380. int i;
  31381. if (suites == NULL || suites->suiteSz == 0) {
  31382. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  31383. return SUITES_ERROR;
  31384. }
  31385. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  31386. if (suites->suites[i] == first &&
  31387. suites->suites[i+1] == second )
  31388. return i;
  31389. }
  31390. return MATCH_SUITE_ERROR;
  31391. }
  31392. #endif
  31393. #endif /* !WOLFSSL_NO_TLS12 */
  31394. /* Make sure server cert/key are valid for this suite, true on success
  31395. * Returns 1 for valid server suite or 0 if not found
  31396. * For asynchronous this can return WC_PENDING_E
  31397. */
  31398. static int VerifyServerSuite(const WOLFSSL* ssl, const Suites* suites,
  31399. word16 idx, CipherSuite* cs, TLSX* extensions)
  31400. {
  31401. #ifndef NO_PSK
  31402. int havePSK = ssl->options.havePSK;
  31403. #endif
  31404. byte first;
  31405. byte second;
  31406. (void)cs;
  31407. (void)extensions;
  31408. WOLFSSL_ENTER("VerifyServerSuite");
  31409. if (suites == NULL) {
  31410. WOLFSSL_MSG("Suites pointer error");
  31411. return 0;
  31412. }
  31413. first = suites->suites[idx];
  31414. second = suites->suites[idx+1];
  31415. if (CipherRequires(first, second, REQUIRES_RSA)) {
  31416. WOLFSSL_MSG("Requires RSA");
  31417. if (ssl->options.haveRSA == 0) {
  31418. WOLFSSL_MSG("Don't have RSA");
  31419. return 0;
  31420. }
  31421. }
  31422. if (CipherRequires(first, second, REQUIRES_DHE)) {
  31423. WOLFSSL_MSG("Requires DHE");
  31424. if (ssl->options.haveDH == 0) {
  31425. WOLFSSL_MSG("Don't have DHE");
  31426. return 0;
  31427. }
  31428. }
  31429. if (CipherRequires(first, second, REQUIRES_ECC)) {
  31430. WOLFSSL_MSG("Requires ECC");
  31431. if (ssl->options.haveECC == 0) {
  31432. WOLFSSL_MSG("Don't have ECC");
  31433. return 0;
  31434. }
  31435. }
  31436. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  31437. WOLFSSL_MSG("Requires static ECC");
  31438. if (ssl->options.haveStaticECC == 0) {
  31439. WOLFSSL_MSG("Don't have static ECC");
  31440. return 0;
  31441. }
  31442. }
  31443. if (CipherRequires(first, second, REQUIRES_PSK)) {
  31444. WOLFSSL_MSG("Requires PSK");
  31445. #ifndef NO_PSK
  31446. if (havePSK == 0)
  31447. #endif
  31448. {
  31449. WOLFSSL_MSG("Don't have PSK");
  31450. return 0;
  31451. }
  31452. }
  31453. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  31454. WOLFSSL_MSG("Requires RSA Signature");
  31455. if (ssl->options.side == WOLFSSL_SERVER_END &&
  31456. ssl->options.haveECDSAsig == 1) {
  31457. WOLFSSL_MSG("Don't have RSA Signature");
  31458. return 0;
  31459. }
  31460. }
  31461. #if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
  31462. if (CipherRequires(first, second, REQUIRES_AEAD)) {
  31463. WOLFSSL_MSG("Requires AEAD");
  31464. if (ssl->version.major == SSLv3_MAJOR &&
  31465. ssl->version.minor < TLSv1_2_MINOR) {
  31466. WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
  31467. return 0;
  31468. }
  31469. }
  31470. #endif
  31471. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31472. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  31473. if (!TLSX_ValidateSupportedCurves(ssl, first, second,
  31474. &cs->ecdhCurveOID)) {
  31475. WOLFSSL_MSG("Don't have matching curves");
  31476. return 0;
  31477. }
  31478. #endif
  31479. #ifdef WOLFSSL_TLS13
  31480. if (IsAtLeastTLSv1_3(ssl->version) &&
  31481. ssl->options.side == WOLFSSL_SERVER_END) {
  31482. #ifdef HAVE_SUPPORTED_CURVES
  31483. byte searched = 0;
  31484. int ret = TLSX_KeyShare_Choose(ssl, extensions, first, second,
  31485. &cs->clientKSE, &searched);
  31486. if (ret == MEMORY_E) {
  31487. WOLFSSL_MSG("TLSX_KeyShare_Choose() failed in "
  31488. "VerifyServerSuite() with MEMORY_E");
  31489. return 0;
  31490. }
  31491. if (cs->clientKSE == NULL && searched) {
  31492. #ifdef WOLFSSL_SEND_HRR_COOKIE
  31493. /* If the CH contains a cookie then we need to send an alert to
  31494. * start from scratch. */
  31495. if (TLSX_Find(extensions, TLSX_COOKIE) != NULL)
  31496. return INVALID_PARAMETER;
  31497. #endif
  31498. cs->doHelloRetry = 1;
  31499. }
  31500. #ifdef WOLFSSL_ASYNC_CRYPT
  31501. if (ret == WC_PENDING_E)
  31502. return ret;
  31503. #endif
  31504. if (!cs->doHelloRetry && ret != 0)
  31505. return 0; /* not found */
  31506. #endif /* HAVE_SUPPORTED_CURVES */
  31507. }
  31508. else if ((first == TLS13_BYTE) || ((first == ECC_BYTE) &&
  31509. ((second == TLS_SHA256_SHA256) ||
  31510. (second == TLS_SHA384_SHA384))) ||
  31511. ((first == CIPHER_BYTE) && ((second == TLS_SM4_GCM_SM3) ||
  31512. (second == TLS_SM4_CCM_SM3)))) {
  31513. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  31514. * version. */
  31515. return 0;
  31516. }
  31517. #endif /* WOLFSSL_TLS13 */
  31518. return 1;
  31519. }
  31520. static int CompareSuites(const WOLFSSL* ssl, const Suites* suites,
  31521. Suites* peerSuites, word16 i, word16 j,
  31522. CipherSuite* cs, TLSX* extensions)
  31523. {
  31524. if (suites->suites[i] == peerSuites->suites[j] &&
  31525. suites->suites[i+1] == peerSuites->suites[j+1] ) {
  31526. int ret = VerifyServerSuite(ssl, suites, i, cs, extensions);
  31527. if (ret < 0) {
  31528. return ret;
  31529. }
  31530. if (ret) {
  31531. WOLFSSL_MSG("Verified suite validity");
  31532. cs->cipherSuite0 = suites->suites[i];
  31533. cs->cipherSuite = suites->suites[i+1];
  31534. return 0;
  31535. }
  31536. else {
  31537. WOLFSSL_MSG("Could not verify suite validity, continue");
  31538. }
  31539. }
  31540. return MATCH_SUITE_ERROR;
  31541. }
  31542. int MatchSuite_ex(const WOLFSSL* ssl, Suites* peerSuites, CipherSuite* cs,
  31543. TLSX* extensions)
  31544. {
  31545. int ret;
  31546. word16 i, j;
  31547. const Suites* suites = WOLFSSL_SUITES(ssl);
  31548. WOLFSSL_ENTER("MatchSuite");
  31549. /* & 0x1 equivalent % 2 */
  31550. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  31551. return BUFFER_ERROR;
  31552. if (suites == NULL)
  31553. return SUITES_ERROR;
  31554. if (!ssl->options.useClientOrder) {
  31555. /* Server order */
  31556. for (i = 0; i < suites->suiteSz; i += 2) {
  31557. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  31558. ret = CompareSuites(ssl, suites, peerSuites, i, j, cs, extensions);
  31559. if (ret != MATCH_SUITE_ERROR)
  31560. return ret;
  31561. }
  31562. }
  31563. }
  31564. else {
  31565. /* Client order */
  31566. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  31567. for (i = 0; i < suites->suiteSz; i += 2) {
  31568. ret = CompareSuites(ssl, suites, peerSuites, i, j, cs, extensions);
  31569. if (ret != MATCH_SUITE_ERROR)
  31570. return ret;
  31571. }
  31572. }
  31573. }
  31574. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  31575. return MATCH_SUITE_ERROR;
  31576. }
  31577. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  31578. {
  31579. int ret;
  31580. CipherSuite cs;
  31581. XMEMSET(&cs, 0, sizeof(cs));
  31582. ret = MatchSuite_ex(ssl, peerSuites, &cs,
  31583. #ifdef HAVE_TLS_EXTENSIONS
  31584. ssl->extensions
  31585. #else
  31586. NULL
  31587. #endif
  31588. );
  31589. if (ret != 0)
  31590. return ret;
  31591. ssl->options.cipherSuite0 = cs.cipherSuite0;
  31592. ssl->options.cipherSuite = cs.cipherSuite;
  31593. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_CURVE25519) || \
  31594. defined(HAVE_ED448) || defined(HAVE_CURVE448)
  31595. ssl->ecdhCurveOID = cs.ecdhCurveOID;
  31596. #endif
  31597. ret = SetCipherSpecs(ssl);
  31598. if (ret != 0)
  31599. return ret;
  31600. ret = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  31601. peerSuites->hashSigAlgoSz);
  31602. if (ret != 0)
  31603. return ret;
  31604. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  31605. if (cs.doHelloRetry) {
  31606. /* Make sure we don't send HRR twice */
  31607. if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
  31608. return INVALID_PARAMETER;
  31609. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  31610. return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
  31611. }
  31612. #endif
  31613. #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
  31614. if (IsAtLeastTLSv1_3(ssl->version) &&
  31615. ssl->options.side == WOLFSSL_SERVER_END) {
  31616. ret = TLSX_KeyShare_Setup(ssl, cs.clientKSE);
  31617. if (ret != 0)
  31618. return ret;
  31619. }
  31620. #endif
  31621. return ret;
  31622. }
  31623. #ifdef OLD_HELLO_ALLOWED
  31624. /* process old style client hello, deprecate? */
  31625. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  31626. word32 inSz, word16 sz)
  31627. {
  31628. word32 idx = *inOutIdx;
  31629. word16 sessionSz;
  31630. word16 randomSz;
  31631. word16 i, j;
  31632. ProtocolVersion pv;
  31633. Suites clSuites;
  31634. int ret = -1;
  31635. (void)inSz;
  31636. WOLFSSL_MSG("Got old format client hello");
  31637. #ifdef WOLFSSL_CALLBACKS
  31638. if (ssl->hsInfoOn)
  31639. AddPacketName(ssl, "ClientHello");
  31640. if (ssl->toInfoOn)
  31641. AddLateName("ClientHello", &ssl->timeoutInfo);
  31642. #endif
  31643. /* manually hash input since different format */
  31644. #ifndef NO_OLD_TLS
  31645. #ifndef NO_MD5
  31646. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  31647. #endif
  31648. #ifndef NO_SHA
  31649. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  31650. #endif
  31651. #endif /* !NO_OLD_TLS */
  31652. #ifndef NO_SHA256
  31653. if (IsAtLeastTLSv1_2(ssl)) {
  31654. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  31655. input + idx, sz);
  31656. if (shaRet != 0)
  31657. return shaRet;
  31658. }
  31659. #endif
  31660. /* does this value mean client_hello? */
  31661. idx++;
  31662. /* version */
  31663. pv.major = input[idx++];
  31664. pv.minor = input[idx++];
  31665. ssl->chVersion = pv; /* store */
  31666. if (ssl->version.minor > pv.minor) {
  31667. byte haveRSA = 0;
  31668. byte havePSK = 0;
  31669. int keySz = 0;
  31670. if (!ssl->options.downgrade) {
  31671. WOLFSSL_MSG("Client trying to connect with lesser version");
  31672. return VERSION_ERROR;
  31673. }
  31674. if (pv.minor < ssl->options.minDowngrade) {
  31675. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  31676. return VERSION_ERROR;
  31677. }
  31678. if (pv.minor == SSLv3_MINOR) {
  31679. /* turn off tls */
  31680. WOLFSSL_MSG("\tdowngrading to SSLv3");
  31681. ssl->options.tls = 0;
  31682. ssl->options.tls1_1 = 0;
  31683. ssl->version.minor = SSLv3_MINOR;
  31684. }
  31685. else if (pv.minor == TLSv1_MINOR) {
  31686. WOLFSSL_MSG("\tdowngrading to TLSv1");
  31687. /* turn off tls 1.1+ */
  31688. ssl->options.tls1_1 = 0;
  31689. ssl->version.minor = TLSv1_MINOR;
  31690. }
  31691. else if (pv.minor == TLSv1_1_MINOR) {
  31692. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  31693. ssl->version.minor = TLSv1_1_MINOR;
  31694. }
  31695. else if (pv.minor == TLSv1_2_MINOR) {
  31696. WOLFSSL_MSG(" downgrading to TLSv1.2");
  31697. ssl->version.minor = TLSv1_2_MINOR;
  31698. }
  31699. #ifndef NO_RSA
  31700. haveRSA = 1;
  31701. #endif
  31702. #ifndef NO_PSK
  31703. havePSK = ssl->options.havePSK;
  31704. #endif
  31705. #ifndef NO_CERTS
  31706. keySz = ssl->buffers.keySz;
  31707. #endif
  31708. ret = AllocateSuites(ssl);
  31709. if (ret != 0)
  31710. return ret;
  31711. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  31712. ssl->options.haveDH, ssl->options.haveECDSAsig,
  31713. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  31714. ssl->options.haveFalconSig,
  31715. ssl->options.haveDilithiumSig, ssl->options.useAnon,
  31716. TRUE, ssl->options.side);
  31717. }
  31718. /* suite size */
  31719. ato16(&input[idx], &clSuites.suiteSz);
  31720. idx += OPAQUE16_LEN;
  31721. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  31722. return BUFFER_ERROR;
  31723. /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
  31724. if (clSuites.suiteSz % 3 != 0)
  31725. return BUFFER_ERROR;
  31726. clSuites.hashSigAlgoSz = 0;
  31727. /* session size */
  31728. ato16(&input[idx], &sessionSz);
  31729. idx += OPAQUE16_LEN;
  31730. if (sessionSz > ID_LEN)
  31731. return BUFFER_ERROR;
  31732. /* random size */
  31733. ato16(&input[idx], &randomSz);
  31734. idx += OPAQUE16_LEN;
  31735. if (randomSz > RAN_LEN)
  31736. return BUFFER_ERROR;
  31737. /* suites */
  31738. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  31739. byte first = input[idx++];
  31740. if (!first) { /* implicit: skip sslv2 type */
  31741. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  31742. j += SUITE_LEN;
  31743. }
  31744. idx += SUITE_LEN;
  31745. }
  31746. clSuites.suiteSz = j;
  31747. /* session id */
  31748. if (sessionSz) {
  31749. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  31750. ssl->arrays->sessionIDSz = (byte)sessionSz;
  31751. idx += sessionSz;
  31752. ssl->options.resuming = 1;
  31753. }
  31754. /* random */
  31755. if (randomSz < RAN_LEN)
  31756. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  31757. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  31758. randomSz);
  31759. idx += randomSz;
  31760. if (ssl->options.usingCompression)
  31761. ssl->options.usingCompression = 0; /* turn off */
  31762. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  31763. ssl->cbmode = SSL_CB_MODE_WRITE;
  31764. *inOutIdx = idx;
  31765. ssl->options.haveSessionId = 1;
  31766. /* DoClientHello uses same resume code */
  31767. if (ssl->options.resuming) { /* let's try */
  31768. WOLFSSL_SESSION* session;
  31769. #ifdef HAVE_SESSION_TICKET
  31770. if (ssl->options.useTicket == 1) {
  31771. session = ssl->session;
  31772. }
  31773. else
  31774. #endif
  31775. {
  31776. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  31777. }
  31778. if (!session) {
  31779. WOLFSSL_MSG("Session lookup for resume failed");
  31780. ssl->options.resuming = 0;
  31781. } else {
  31782. if (MatchSuite(ssl, &clSuites) < 0) {
  31783. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  31784. return UNSUPPORTED_SUITE;
  31785. }
  31786. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  31787. RAN_LEN);
  31788. if (ret != 0)
  31789. return ret;
  31790. #ifdef NO_OLD_TLS
  31791. ret = DeriveTlsKeys(ssl);
  31792. #else
  31793. #ifndef NO_TLS
  31794. if (ssl->options.tls)
  31795. ret = DeriveTlsKeys(ssl);
  31796. #endif
  31797. if (!ssl->options.tls)
  31798. ret = DeriveKeys(ssl);
  31799. #endif
  31800. /* SERVER: peer auth based on session secret. */
  31801. ssl->options.peerAuthGood = (ret == 0);
  31802. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  31803. return ret;
  31804. }
  31805. }
  31806. ret = MatchSuite(ssl, &clSuites);
  31807. if (ret != 0)return ret;
  31808. return SanityCheckMsgReceived(ssl, client_hello);
  31809. }
  31810. #endif /* OLD_HELLO_ALLOWED */
  31811. #ifndef WOLFSSL_NO_TLS12
  31812. /**
  31813. * Handles session resumption.
  31814. * Session tickets are checked for validity based on the time each ticket
  31815. * was created, timeout value and the current time. If the tickets are
  31816. * judged expired, falls back to full-handshake. If you want disable this
  31817. * session ticket validation check in TLS1.2 and below, define
  31818. * WOLFSSL_NO_TICKET_EXPIRE.
  31819. */
  31820. int HandleTlsResumption(WOLFSSL* ssl, Suites* clSuites)
  31821. {
  31822. int ret = 0;
  31823. WOLFSSL_SESSION* session;
  31824. #ifdef HAVE_SESSION_TICKET
  31825. if (ssl->options.useTicket == 1) {
  31826. session = ssl->session;
  31827. }
  31828. else
  31829. #endif
  31830. {
  31831. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  31832. }
  31833. if (!session) {
  31834. WOLFSSL_MSG("Session lookup for resume failed");
  31835. ssl->options.resuming = 0;
  31836. return ret;
  31837. }
  31838. #if !defined(WOLFSSL_NO_TICKET_EXPIRE) && !defined(NO_ASN_TIME)
  31839. /* check if the ticket is valid */
  31840. if (LowResTimer() > session->bornOn + ssl->timeout) {
  31841. WOLFSSL_MSG("Expired session, fall back to full handshake.");
  31842. ssl->options.resuming = 0;
  31843. }
  31844. #endif /* !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
  31845. else if (session->haveEMS != ssl->options.haveEMS) {
  31846. /* RFC 7627, 5.3, server-side */
  31847. /* if old sess didn't have EMS, but new does, full handshake */
  31848. if (!session->haveEMS && ssl->options.haveEMS) {
  31849. WOLFSSL_MSG("Attempting to resume a session that didn't "
  31850. "use EMS with a new session with EMS. Do full "
  31851. "handshake.");
  31852. ssl->options.resuming = 0;
  31853. }
  31854. /* if old sess used EMS, but new doesn't, MUST abort */
  31855. else if (session->haveEMS && !ssl->options.haveEMS) {
  31856. WOLFSSL_MSG("Trying to resume a session with EMS without "
  31857. "using EMS");
  31858. #ifdef WOLFSSL_EXTRA_ALERTS
  31859. SendAlert(ssl, alert_fatal, handshake_failure);
  31860. #endif
  31861. ret = EXT_MASTER_SECRET_NEEDED_E;
  31862. WOLFSSL_ERROR_VERBOSE(ret);
  31863. }
  31864. }
  31865. else {
  31866. #ifndef NO_RESUME_SUITE_CHECK
  31867. int j;
  31868. /* Check client suites include the one in session */
  31869. for (j = 0; j < clSuites->suiteSz; j += 2) {
  31870. if (clSuites->suites[j] == session->cipherSuite0 &&
  31871. clSuites->suites[j+1] == session->cipherSuite) {
  31872. break;
  31873. }
  31874. }
  31875. if (j == clSuites->suiteSz) {
  31876. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  31877. #ifdef WOLFSSL_EXTRA_ALERTS
  31878. SendAlert(ssl, alert_fatal, illegal_parameter);
  31879. #endif
  31880. ret = UNSUPPORTED_SUITE;
  31881. WOLFSSL_ERROR_VERBOSE(ret);
  31882. }
  31883. #endif
  31884. if (ret == 0 && ssl->options.resuming) {
  31885. /* for resumption use the cipher suite from session */
  31886. ssl->options.cipherSuite0 = session->cipherSuite0;
  31887. ssl->options.cipherSuite = session->cipherSuite;
  31888. ret = SetCipherSpecs(ssl);
  31889. if (ret == 0) {
  31890. ret = PickHashSigAlgo(ssl, clSuites->hashSigAlgo,
  31891. clSuites->hashSigAlgoSz);
  31892. }
  31893. }
  31894. else if (ret == 0) {
  31895. if (MatchSuite(ssl, clSuites) < 0) {
  31896. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  31897. ret = UNSUPPORTED_SUITE;
  31898. WOLFSSL_ERROR_VERBOSE(ret);
  31899. }
  31900. }
  31901. if (ret == 0) {
  31902. ret = wc_RNG_GenerateBlock(ssl->rng,
  31903. ssl->arrays->serverRandom, RAN_LEN);
  31904. }
  31905. if (ret == 0) {
  31906. #ifdef NO_OLD_TLS
  31907. ret = DeriveTlsKeys(ssl);
  31908. #else
  31909. #ifndef NO_TLS
  31910. if (ssl->options.tls)
  31911. ret = DeriveTlsKeys(ssl);
  31912. #endif
  31913. if (!ssl->options.tls)
  31914. ret = DeriveKeys(ssl);
  31915. #endif
  31916. /* SERVER: peer auth based on session secret. */
  31917. ssl->options.peerAuthGood = (ret == 0);
  31918. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  31919. }
  31920. }
  31921. return ret;
  31922. }
  31923. /* handle processing of client_hello (1) */
  31924. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  31925. word32 helloSz)
  31926. {
  31927. byte b;
  31928. ProtocolVersion pv;
  31929. #ifdef WOLFSSL_SMALL_STACK
  31930. Suites* clSuites = NULL;
  31931. #else
  31932. Suites clSuites[1];
  31933. #endif
  31934. word32 i = *inOutIdx;
  31935. word32 begin = i;
  31936. int ret = 0;
  31937. byte lesserVersion;
  31938. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  31939. WOLFSSL_ENTER("DoClientHello");
  31940. #ifdef WOLFSSL_CALLBACKS
  31941. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  31942. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  31943. #endif
  31944. /* do not change state in the SSL object before the next region of code
  31945. * to be able to statelessly compute a DTLS cookie */
  31946. #ifdef WOLFSSL_DTLS
  31947. /* Update the ssl->options.dtlsStateful setting `if` statement in
  31948. * wolfSSL_accept when changing this one. */
  31949. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl) &&
  31950. !ssl->options.dtlsStateful) {
  31951. DtlsSetSeqNumForReply(ssl);
  31952. ret = DoClientHelloStateless(ssl, input + *inOutIdx, helloSz, 0,
  31953. NULL);
  31954. if (ret != 0 || !ssl->options.dtlsStateful) {
  31955. int alertType = TranslateErrorToAlert(ret);
  31956. if (alertType != invalid_alert) {
  31957. int err;
  31958. /* propagate socket errors to avoid re-calling send alert */
  31959. err = SendAlert(ssl, alert_fatal, alertType);
  31960. if (err == SOCKET_ERROR_E)
  31961. ret = SOCKET_ERROR_E;
  31962. }
  31963. *inOutIdx += helloSz;
  31964. DtlsResetState(ssl);
  31965. if (DtlsIgnoreError(ret))
  31966. ret = 0;
  31967. return ret;
  31968. }
  31969. if (ssl->chGoodCb != NULL) {
  31970. int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx);
  31971. if (cbret < 0) {
  31972. ssl->error = cbret;
  31973. WOLFSSL_MSG("ClientHello Good Cb don't continue error");
  31974. return WOLFSSL_FATAL_ERROR;
  31975. }
  31976. }
  31977. }
  31978. ssl->options.dtlsStateful = 1;
  31979. #endif /* WOLFSSL_DTLS */
  31980. /* Reset to sane value for SCR */
  31981. ssl->options.resuming = 0;
  31982. ssl->arrays->sessionIDSz = 0;
  31983. /* protocol version, random and session id length check */
  31984. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  31985. return BUFFER_ERROR;
  31986. /* protocol version */
  31987. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  31988. ssl->chVersion = pv; /* store */
  31989. i += OPAQUE16_LEN;
  31990. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  31991. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  31992. pv.minor = TLSv1_2_MINOR;
  31993. lesserVersion = !ssl->options.dtls && ssl->version.minor > pv.minor;
  31994. lesserVersion |= ssl->options.dtls && ssl->version.minor < pv.minor;
  31995. if (lesserVersion) {
  31996. byte belowMinDowngrade;
  31997. word16 haveRSA = 0;
  31998. word16 havePSK = 0;
  31999. int keySz = 0;
  32000. if (!ssl->options.downgrade) {
  32001. WOLFSSL_MSG("Client trying to connect with lesser version");
  32002. ret = VERSION_ERROR;
  32003. goto out;
  32004. }
  32005. belowMinDowngrade = pv.minor < ssl->options.minDowngrade;
  32006. /* DTLS versions increase backwards (-1,-2,-3) ecc */
  32007. if (ssl->options.dtls)
  32008. belowMinDowngrade = ssl->options.dtls
  32009. && pv.minor > ssl->options.minDowngrade;
  32010. if (belowMinDowngrade) {
  32011. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  32012. ret = VERSION_ERROR;
  32013. goto out;
  32014. }
  32015. if (!ssl->options.dtls) {
  32016. if (pv.minor == SSLv3_MINOR) {
  32017. /* turn off tls */
  32018. WOLFSSL_MSG("\tdowngrading to SSLv3");
  32019. ssl->options.tls = 0;
  32020. ssl->options.tls1_1 = 0;
  32021. ssl->version.minor = SSLv3_MINOR;
  32022. }
  32023. else if (pv.minor == TLSv1_MINOR) {
  32024. /* turn off tls 1.1+ */
  32025. WOLFSSL_MSG("\tdowngrading to TLSv1");
  32026. ssl->options.tls1_1 = 0;
  32027. ssl->version.minor = TLSv1_MINOR;
  32028. }
  32029. else if (pv.minor == TLSv1_1_MINOR) {
  32030. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  32031. ssl->version.minor = TLSv1_1_MINOR;
  32032. }
  32033. else if (pv.minor == TLSv1_2_MINOR) {
  32034. WOLFSSL_MSG(" downgrading to TLSv1.2");
  32035. ssl->version.minor = TLSv1_2_MINOR;
  32036. }
  32037. }
  32038. else {
  32039. if (pv.minor == DTLSv1_2_MINOR) {
  32040. WOLFSSL_MSG("\tDowngrading to DTLSv1.2");
  32041. ssl->options.tls1_3 = 0;
  32042. ssl->version.minor = DTLSv1_2_MINOR;
  32043. }
  32044. else if (pv.minor == DTLS_MINOR) {
  32045. WOLFSSL_MSG("\tDowngrading to DTLSv1.0");
  32046. ssl->options.tls1_3 = 0;
  32047. ssl->version.minor = DTLS_MINOR;
  32048. }
  32049. }
  32050. #ifndef NO_RSA
  32051. haveRSA = 1;
  32052. #endif
  32053. #ifndef NO_PSK
  32054. havePSK = ssl->options.havePSK;
  32055. #endif
  32056. #ifndef NO_CERTS
  32057. keySz = ssl->buffers.keySz;
  32058. #endif
  32059. ret = AllocateSuites(ssl);
  32060. if (ret != 0)
  32061. goto out;
  32062. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  32063. ssl->options.haveDH, ssl->options.haveECDSAsig,
  32064. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  32065. ssl->options.haveFalconSig,
  32066. ssl->options.haveDilithiumSig, ssl->options.useAnon,
  32067. TRUE, ssl->options.side);
  32068. }
  32069. /* check if option is set to not allow the current version
  32070. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  32071. if (!ssl->options.dtls && ssl->options.downgrade &&
  32072. ssl->options.mask > 0) {
  32073. int reset = 0;
  32074. if (ssl->version.minor == TLSv1_2_MINOR &&
  32075. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
  32076. WOLFSSL_OP_NO_TLSv1_2) {
  32077. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  32078. ssl->version.minor = TLSv1_1_MINOR;
  32079. reset = 1;
  32080. }
  32081. if (ssl->version.minor == TLSv1_1_MINOR &&
  32082. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
  32083. WOLFSSL_OP_NO_TLSv1_1) {
  32084. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  32085. ssl->options.tls1_1 = 0;
  32086. ssl->version.minor = TLSv1_MINOR;
  32087. reset = 1;
  32088. }
  32089. if (ssl->version.minor == TLSv1_MINOR &&
  32090. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
  32091. WOLFSSL_OP_NO_TLSv1) {
  32092. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  32093. ssl->options.tls = 0;
  32094. ssl->options.tls1_1 = 0;
  32095. ssl->version.minor = SSLv3_MINOR;
  32096. reset = 1;
  32097. }
  32098. if (ssl->version.minor == SSLv3_MINOR &&
  32099. (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
  32100. WOLFSSL_OP_NO_SSLv3) {
  32101. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  32102. ret = VERSION_ERROR;
  32103. #ifdef WOLFSSL_EXTRA_ALERTS
  32104. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  32105. #endif
  32106. goto out;
  32107. }
  32108. if (ssl->version.minor < ssl->options.minDowngrade) {
  32109. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  32110. ret = VERSION_ERROR;
  32111. goto out;
  32112. }
  32113. if (reset) {
  32114. word16 haveRSA = 0;
  32115. word16 havePSK = 0;
  32116. int keySz = 0;
  32117. #ifndef NO_RSA
  32118. haveRSA = 1;
  32119. #endif
  32120. #ifndef NO_PSK
  32121. havePSK = ssl->options.havePSK;
  32122. #endif
  32123. #ifndef NO_CERTS
  32124. keySz = ssl->buffers.keySz;
  32125. #endif
  32126. ret = AllocateSuites(ssl);
  32127. if (ret != 0)
  32128. goto out;
  32129. /* reset cipher suites to account for TLS version change */
  32130. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  32131. ssl->options.haveDH, ssl->options.haveECDSAsig,
  32132. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  32133. ssl->options.haveFalconSig,
  32134. ssl->options.haveDilithiumSig, ssl->options.useAnon,
  32135. TRUE, ssl->options.side);
  32136. }
  32137. }
  32138. /* random */
  32139. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  32140. i += RAN_LEN;
  32141. #ifdef SHOW_SECRETS
  32142. {
  32143. int j;
  32144. printf("client random: ");
  32145. for (j = 0; j < RAN_LEN; j++)
  32146. printf("%02x", ssl->arrays->clientRandom[j]);
  32147. printf("\n");
  32148. }
  32149. #endif
  32150. /* session id */
  32151. b = input[i++];
  32152. if (b > ID_LEN) {
  32153. WOLFSSL_MSG("Invalid session ID size");
  32154. ret = BUFFER_ERROR; /* session ID greater than 32 bytes long */
  32155. goto out;
  32156. }
  32157. else if (b > 0 && !IsSCR(ssl)) {
  32158. if ((i - begin) + b > helloSz) {
  32159. ret = BUFFER_ERROR;
  32160. goto out;
  32161. }
  32162. /* Always save session ID in case we want to echo it. */
  32163. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  32164. ssl->arrays->sessionIDSz = b;
  32165. if (b == ID_LEN)
  32166. ssl->options.resuming = 1; /* client wants to resume */
  32167. WOLFSSL_MSG("Client wants to resume session");
  32168. }
  32169. i += b;
  32170. #ifdef WOLFSSL_DTLS
  32171. /* cookie */
  32172. if (ssl->options.dtls) {
  32173. word8 peerCookieSz;
  32174. if ((i - begin) + OPAQUE8_LEN > helloSz) {
  32175. ret = BUFFER_ERROR;
  32176. goto out;
  32177. }
  32178. peerCookieSz = input[i++];
  32179. if (peerCookieSz) {
  32180. if (peerCookieSz > MAX_COOKIE_LEN) {
  32181. ret = BUFFER_ERROR;
  32182. goto out;
  32183. }
  32184. if ((i - begin) + peerCookieSz > helloSz) {
  32185. ret = BUFFER_ERROR;
  32186. goto out;
  32187. }
  32188. i += peerCookieSz;
  32189. }
  32190. }
  32191. #endif /* WOLFSSL_DTLS */
  32192. /* suites */
  32193. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  32194. ret = BUFFER_ERROR;
  32195. goto out;
  32196. }
  32197. #ifdef WOLFSSL_SMALL_STACK
  32198. clSuites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  32199. DYNAMIC_TYPE_SUITES);
  32200. if (clSuites == NULL) {
  32201. ret = MEMORY_E;
  32202. goto out;
  32203. }
  32204. #endif
  32205. XMEMSET(clSuites, 0, sizeof(Suites));
  32206. ato16(&input[i], &clSuites->suiteSz);
  32207. i += OPAQUE16_LEN;
  32208. /* Cipher suite lists are always multiples of two in length. */
  32209. if (clSuites->suiteSz % 2 != 0) {
  32210. ret = BUFFER_ERROR;
  32211. goto out;
  32212. }
  32213. /* suites and compression length check */
  32214. if ((i - begin) + clSuites->suiteSz + OPAQUE8_LEN > helloSz) {
  32215. ret = BUFFER_ERROR;
  32216. goto out;
  32217. }
  32218. if (clSuites->suiteSz > WOLFSSL_MAX_SUITE_SZ) {
  32219. ret = BUFFER_ERROR;
  32220. goto out;
  32221. }
  32222. XMEMCPY(clSuites->suites, input + i, clSuites->suiteSz);
  32223. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  32224. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  32225. if (FindSuite(clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  32226. TLSX* extension;
  32227. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  32228. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  32229. if (ret != WOLFSSL_SUCCESS)
  32230. goto out;
  32231. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  32232. if (extension) {
  32233. ssl->secure_renegotiation =
  32234. (SecureRenegotiation*)extension->data;
  32235. ssl->secure_renegotiation->enabled = 1;
  32236. }
  32237. }
  32238. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  32239. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  32240. /* check for TLS_FALLBACK_SCSV suite */
  32241. if (FindSuite(clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  32242. WOLFSSL_MSG("Found Fallback SCSV");
  32243. if (ssl->ctx->method->version.minor > pv.minor) {
  32244. WOLFSSL_MSG("Client trying to connect with lesser version");
  32245. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  32246. ret = VERSION_ERROR;
  32247. goto out;
  32248. }
  32249. }
  32250. #endif
  32251. i += clSuites->suiteSz;
  32252. clSuites->hashSigAlgoSz = 0;
  32253. /* compression length */
  32254. b = input[i++];
  32255. if ((i - begin) + b > helloSz) {
  32256. ret = BUFFER_ERROR;
  32257. goto out;
  32258. }
  32259. if (b == 0) {
  32260. WOLFSSL_MSG("No compression types in list");
  32261. #ifdef WOLFSSL_EXTRA_ALERTS
  32262. SendAlert(ssl, alert_fatal, decode_error);
  32263. #endif
  32264. ret = COMPRESSION_ERROR;
  32265. goto out;
  32266. }
  32267. {
  32268. /* compression match types */
  32269. int matchNo = 0;
  32270. int matchZlib = 0;
  32271. while (b--) {
  32272. byte comp = input[i++];
  32273. if (comp == NO_COMPRESSION) {
  32274. matchNo = 1;
  32275. }
  32276. if (comp == ZLIB_COMPRESSION) {
  32277. matchZlib = 1;
  32278. }
  32279. }
  32280. if (ssl->options.usingCompression == 0 && matchNo) {
  32281. WOLFSSL_MSG("Matched No Compression");
  32282. } else if (ssl->options.usingCompression && matchZlib) {
  32283. WOLFSSL_MSG("Matched zlib Compression");
  32284. } else if (ssl->options.usingCompression && matchNo) {
  32285. WOLFSSL_MSG("Could only match no compression, turning off");
  32286. ssl->options.usingCompression = 0; /* turn off */
  32287. } else {
  32288. WOLFSSL_MSG("Could not match compression");
  32289. #ifdef WOLFSSL_EXTRA_ALERTS
  32290. SendAlert(ssl, alert_fatal, illegal_parameter);
  32291. #endif
  32292. ret = COMPRESSION_ERROR;
  32293. goto out;
  32294. }
  32295. }
  32296. *inOutIdx = i;
  32297. /* tls extensions */
  32298. if ((i - begin) < helloSz) {
  32299. #ifdef HAVE_TLS_EXTENSIONS
  32300. if (TLSX_SupportExtensions(ssl))
  32301. #else
  32302. if (IsAtLeastTLSv1_2(ssl))
  32303. #endif
  32304. {
  32305. /* Process the hello extension. Skip unsupported. */
  32306. word16 totalExtSz;
  32307. #ifdef HAVE_TLS_EXTENSIONS
  32308. /* auto populate extensions supported unless user defined */
  32309. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  32310. goto out;
  32311. #endif
  32312. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  32313. ret = BUFFER_ERROR;
  32314. goto out;
  32315. }
  32316. ato16(&input[i], &totalExtSz);
  32317. i += OPAQUE16_LEN;
  32318. if ((i - begin) + totalExtSz > helloSz) {
  32319. ret = BUFFER_ERROR;
  32320. goto out;
  32321. }
  32322. #ifdef HAVE_TLS_EXTENSIONS
  32323. /* tls extensions */
  32324. if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, client_hello,
  32325. clSuites)))
  32326. goto out;
  32327. #ifdef WOLFSSL_TLS13
  32328. if (TLSX_Find(ssl->extensions,
  32329. TLSX_SUPPORTED_VERSIONS) != NULL) {
  32330. WOLFSSL_MSG(
  32331. "Client attempting to connect with higher version");
  32332. ret = VERSION_ERROR;
  32333. goto out;
  32334. }
  32335. #endif
  32336. #ifdef HAVE_SNI
  32337. if((ret=SNI_Callback(ssl)))
  32338. goto out;
  32339. #endif
  32340. #ifdef HAVE_ALPN
  32341. if((ret=ALPN_Select(ssl)))
  32342. goto out;
  32343. #endif
  32344. i += totalExtSz;
  32345. #else
  32346. while (totalExtSz) {
  32347. word16 extId, extSz;
  32348. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
  32349. ret = BUFFER_ERROR;
  32350. goto out;
  32351. }
  32352. ato16(&input[i], &extId);
  32353. i += OPAQUE16_LEN;
  32354. ato16(&input[i], &extSz);
  32355. i += OPAQUE16_LEN;
  32356. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
  32357. ret = BUFFER_ERROR;
  32358. goto out;
  32359. }
  32360. if (extId == HELLO_EXT_SIG_ALGO) {
  32361. word16 hashSigAlgoSz;
  32362. ato16(&input[i], &hashSigAlgoSz);
  32363. i += OPAQUE16_LEN;
  32364. if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
  32365. ret = BUFFER_ERROR;
  32366. goto out;
  32367. }
  32368. if (hashSigAlgoSz % 2 != 0) {
  32369. ret = BUFFER_ERROR;
  32370. goto out;
  32371. }
  32372. clSuites->hashSigAlgoSz = hashSigAlgoSz;
  32373. if (clSuites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  32374. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  32375. "truncating");
  32376. clSuites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  32377. }
  32378. XMEMCPY(clSuites->hashSigAlgo, &input[i],
  32379. clSuites->hashSigAlgoSz);
  32380. i += hashSigAlgoSz;
  32381. }
  32382. #ifdef HAVE_EXTENDED_MASTER
  32383. else if (extId == HELLO_EXT_EXTMS)
  32384. ssl->options.haveEMS = 1;
  32385. #endif
  32386. else
  32387. i += extSz;
  32388. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  32389. }
  32390. #endif
  32391. *inOutIdx = i;
  32392. }
  32393. else
  32394. *inOutIdx = begin + helloSz; /* skip extensions */
  32395. }
  32396. #ifdef WOLFSSL_DTLS_CID
  32397. if (ssl->options.useDtlsCID)
  32398. DtlsCIDOnExtensionsParsed(ssl);
  32399. #endif /* WOLFSSL_DTLS_CID */
  32400. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  32401. ssl->options.haveSessionId = 1;
  32402. /* ProcessOld uses same resume code */
  32403. if (ssl->options.resuming) {
  32404. ret = HandleTlsResumption(ssl, clSuites);
  32405. if (ret != 0)
  32406. goto out;
  32407. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  32408. !defined(WOLFSSL_AEAD_ONLY)
  32409. if (ssl->options.encThenMac && ssl->specs.cipher_type == block) {
  32410. ret = TLSX_EncryptThenMac_Respond(ssl);
  32411. if (ret != 0)
  32412. goto out;
  32413. }
  32414. else
  32415. ssl->options.encThenMac = 0;
  32416. #endif
  32417. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  32418. WOLFSSL_LEAVE("DoClientHello", ret);
  32419. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  32420. goto out;
  32421. }
  32422. }
  32423. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
  32424. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  32425. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  32426. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  32427. * present and no matches in the server's list. */
  32428. ret = TLSX_SupportedFFDHE_Set(ssl);
  32429. if (ret != 0)
  32430. goto out;
  32431. }
  32432. #endif
  32433. #endif
  32434. #ifdef OPENSSL_EXTRA
  32435. ssl->clSuites = clSuites; /* cppcheck-suppress autoVariables
  32436. *
  32437. * (suppress warning that ssl, a persistent
  32438. * non-local allocation, has its ->clSuites
  32439. * set to clSuites, a local stack allocation.
  32440. * we clear this assignment before returning.)
  32441. */
  32442. /* Give user last chance to provide a cert for cipher selection */
  32443. if (ret == 0 && ssl->ctx->certSetupCb != NULL)
  32444. ret = CertSetupCbWrapper(ssl);
  32445. #endif
  32446. if (ret == 0)
  32447. ret = MatchSuite(ssl, clSuites);
  32448. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  32449. !defined(WOLFSSL_AEAD_ONLY)
  32450. if (ret == 0 && ssl->options.encThenMac &&
  32451. ssl->specs.cipher_type == block) {
  32452. ret = TLSX_EncryptThenMac_Respond(ssl);
  32453. }
  32454. else
  32455. ssl->options.encThenMac = 0;
  32456. #endif
  32457. #ifdef WOLFSSL_DTLS
  32458. if (ret == 0 && ssl->options.dtls)
  32459. DtlsMsgPoolReset(ssl);
  32460. #endif
  32461. out:
  32462. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  32463. ssl->clSuites = NULL;
  32464. #endif
  32465. #ifdef WOLFSSL_SMALL_STACK
  32466. if (clSuites != NULL)
  32467. XFREE(clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
  32468. #endif
  32469. WOLFSSL_LEAVE("DoClientHello", ret);
  32470. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  32471. if (ret != 0) {
  32472. WOLFSSL_ERROR_VERBOSE(ret);
  32473. }
  32474. return ret;
  32475. }
  32476. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  32477. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  32478. typedef struct DcvArgs {
  32479. byte* output; /* not allocated */
  32480. word32 sendSz;
  32481. word16 sz;
  32482. word32 sigSz;
  32483. word32 idx;
  32484. word32 begin;
  32485. } DcvArgs;
  32486. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  32487. {
  32488. DcvArgs* args = (DcvArgs*)pArgs;
  32489. (void)ssl;
  32490. (void)args;
  32491. }
  32492. /* handle processing of certificate_verify (15) */
  32493. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  32494. word32* inOutIdx, word32 size)
  32495. {
  32496. int ret = 0;
  32497. #ifdef WOLFSSL_ASYNC_CRYPT
  32498. DcvArgs* args = NULL;
  32499. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  32500. #else
  32501. DcvArgs args[1];
  32502. #endif
  32503. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  32504. WOLFSSL_ENTER("DoCertificateVerify");
  32505. #ifdef WOLFSSL_ASYNC_CRYPT
  32506. if (ssl->async == NULL) {
  32507. ssl->async = (struct WOLFSSL_ASYNC*)
  32508. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  32509. DYNAMIC_TYPE_ASYNC);
  32510. if (ssl->async == NULL)
  32511. ERROR_OUT(MEMORY_E, exit_dcv);
  32512. }
  32513. args = (DcvArgs*)ssl->async->args;
  32514. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  32515. if (ret != WC_NO_PENDING_E) {
  32516. /* Check for error */
  32517. if (ret < 0)
  32518. goto exit_dcv;
  32519. }
  32520. else
  32521. #endif
  32522. {
  32523. /* Reset state */
  32524. ret = 0;
  32525. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  32526. XMEMSET(args, 0, sizeof(DcvArgs));
  32527. ssl->options.peerHashAlgo = sha_mac;
  32528. ssl->options.peerSigAlgo = anonymous_sa_algo;
  32529. args->idx = *inOutIdx;
  32530. args->begin = *inOutIdx;
  32531. #ifdef WOLFSSL_ASYNC_CRYPT
  32532. ssl->async->freeArgs = FreeDcvArgs;
  32533. #endif
  32534. }
  32535. switch(ssl->options.asyncState)
  32536. {
  32537. case TLS_ASYNC_BEGIN:
  32538. {
  32539. #ifdef WOLFSSL_CALLBACKS
  32540. if (ssl->hsInfoOn)
  32541. AddPacketName(ssl, "CertificateVerify");
  32542. if (ssl->toInfoOn)
  32543. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  32544. #endif
  32545. /* Advance state and proceed */
  32546. ssl->options.asyncState = TLS_ASYNC_BUILD;
  32547. } /* case TLS_ASYNC_BEGIN */
  32548. FALL_THROUGH;
  32549. case TLS_ASYNC_BUILD:
  32550. {
  32551. if (IsAtLeastTLSv1_2(ssl)) {
  32552. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  32553. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  32554. }
  32555. DecodeSigAlg(&input[args->idx], &ssl->options.peerHashAlgo,
  32556. &ssl->options.peerSigAlgo);
  32557. args->idx += 2;
  32558. }
  32559. #ifndef NO_RSA
  32560. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  32561. ssl->options.peerSigAlgo = rsa_sa_algo;
  32562. #endif
  32563. #ifdef HAVE_ECC
  32564. else if (ssl->peerEccDsaKeyPresent) {
  32565. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  32566. if (ssl->peerEccDsaKey->dp->id == ECC_SM2P256V1) {
  32567. ssl->options.peerSigAlgo = sm2_sa_algo;
  32568. }
  32569. else
  32570. #endif
  32571. {
  32572. ssl->options.peerSigAlgo = ecc_dsa_sa_algo;
  32573. }
  32574. }
  32575. #endif
  32576. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  32577. else if (ssl->peerEd25519KeyPresent)
  32578. ssl->options.peerSigAlgo = ed25519_sa_algo;
  32579. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  32580. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  32581. else if (ssl->peerEd448KeyPresent)
  32582. ssl->options.peerSigAlgo = ed448_sa_algo;
  32583. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  32584. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  32585. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  32586. }
  32587. ato16(input + args->idx, &args->sz);
  32588. args->idx += OPAQUE16_LEN;
  32589. if ((args->idx - args->begin) + args->sz > size ||
  32590. args->sz > ENCRYPT_LEN) {
  32591. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  32592. }
  32593. #ifdef HAVE_ECC
  32594. if (ssl->peerEccDsaKeyPresent) {
  32595. WOLFSSL_MSG("Doing ECC peer cert verify");
  32596. /* make sure a default is defined */
  32597. #if !defined(NO_SHA)
  32598. SetDigest(ssl, sha_mac);
  32599. #elif !defined(NO_SHA256)
  32600. SetDigest(ssl, sha256_mac);
  32601. #elif defined(WOLFSSL_SM3)
  32602. SetDigest(ssl, sm3_mac);
  32603. #elif defined(WOLFSSL_SHA384)
  32604. SetDigest(ssl, sha384_mac);
  32605. #elif defined(WOLFSSL_SHA512)
  32606. SetDigest(ssl, sha512_mac);
  32607. #else
  32608. #error No digest enabled for ECC sig verify
  32609. #endif
  32610. if (IsAtLeastTLSv1_2(ssl)) {
  32611. if (ssl->options.peerSigAlgo != ecc_dsa_sa_algo
  32612. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  32613. && ssl->options.peerSigAlgo != sm2_sa_algo
  32614. #endif
  32615. ) {
  32616. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  32617. }
  32618. SetDigest(ssl, ssl->options.peerHashAlgo);
  32619. }
  32620. }
  32621. #endif /* HAVE_ECC */
  32622. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  32623. if (ssl->peerEd25519KeyPresent) {
  32624. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  32625. if (IsAtLeastTLSv1_2(ssl) &&
  32626. ssl->options.peerSigAlgo != ed25519_sa_algo) {
  32627. WOLFSSL_MSG(
  32628. "Oops, peer sent ED25519 key but not in verify");
  32629. }
  32630. }
  32631. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  32632. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  32633. if (ssl->peerEd448KeyPresent) {
  32634. WOLFSSL_MSG("Doing ED448 peer cert verify");
  32635. if (IsAtLeastTLSv1_2(ssl) &&
  32636. ssl->options.peerSigAlgo != ed448_sa_algo) {
  32637. WOLFSSL_MSG(
  32638. "Oops, peer sent ED448 key but not in verify");
  32639. }
  32640. }
  32641. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  32642. /* Advance state and proceed */
  32643. ssl->options.asyncState = TLS_ASYNC_DO;
  32644. } /* case TLS_ASYNC_BUILD */
  32645. FALL_THROUGH;
  32646. case TLS_ASYNC_DO:
  32647. {
  32648. #ifndef NO_RSA
  32649. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  32650. WOLFSSL_MSG("Doing RSA peer cert verify");
  32651. ret = RsaVerify(ssl,
  32652. input + args->idx,
  32653. args->sz,
  32654. &args->output,
  32655. ssl->options.peerSigAlgo, ssl->options.peerHashAlgo,
  32656. ssl->peerRsaKey,
  32657. #ifdef HAVE_PK_CALLBACKS
  32658. &ssl->buffers.peerRsaKey
  32659. #else
  32660. NULL
  32661. #endif
  32662. );
  32663. if (ret >= 0) {
  32664. if (ssl->options.peerSigAlgo == rsa_sa_algo)
  32665. args->sendSz = ret;
  32666. else {
  32667. args->sigSz = ret;
  32668. args->sendSz = ssl->buffers.digest.length;
  32669. }
  32670. ret = 0;
  32671. }
  32672. }
  32673. #endif /* !NO_RSA */
  32674. #ifdef HAVE_ECC
  32675. if (ssl->peerEccDsaKeyPresent) {
  32676. WOLFSSL_MSG("Doing ECC peer cert verify");
  32677. #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)
  32678. if (ssl->options.peerSigAlgo == sm2_sa_algo) {
  32679. ret = Sm2wSm3Verify(ssl,
  32680. TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ,
  32681. input + args->idx, args->sz,
  32682. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  32683. ssl->peerEccDsaKey,
  32684. #ifdef HAVE_PK_CALLBACKS
  32685. &ssl->buffers.peerEccDsaKey
  32686. #else
  32687. NULL
  32688. #endif
  32689. );
  32690. }
  32691. else
  32692. #endif
  32693. {
  32694. ret = EccVerify(ssl,
  32695. input + args->idx, args->sz,
  32696. ssl->buffers.digest.buffer,
  32697. ssl->buffers.digest.length,
  32698. ssl->peerEccDsaKey,
  32699. #ifdef HAVE_PK_CALLBACKS
  32700. &ssl->buffers.peerEccDsaKey
  32701. #else
  32702. NULL
  32703. #endif
  32704. );
  32705. }
  32706. /* SERVER: Data verified with certificate's public key. */
  32707. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  32708. (ret == 0);
  32709. }
  32710. #endif /* HAVE_ECC */
  32711. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  32712. if (ssl->peerEd25519KeyPresent) {
  32713. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  32714. ret = Ed25519Verify(ssl,
  32715. input + args->idx, args->sz,
  32716. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  32717. ssl->peerEd25519Key,
  32718. #ifdef HAVE_PK_CALLBACKS
  32719. &ssl->buffers.peerEd25519Key
  32720. #else
  32721. NULL
  32722. #endif
  32723. );
  32724. /* SERVER: Data verified with certificate's public key. */
  32725. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  32726. (ret == 0);
  32727. }
  32728. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  32729. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  32730. if (ssl->peerEd448KeyPresent) {
  32731. WOLFSSL_MSG("Doing Ed448 peer cert verify");
  32732. ret = Ed448Verify(ssl,
  32733. input + args->idx, args->sz,
  32734. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  32735. ssl->peerEd448Key,
  32736. #ifdef HAVE_PK_CALLBACKS
  32737. &ssl->buffers.peerEd448Key
  32738. #else
  32739. NULL
  32740. #endif
  32741. );
  32742. /* SERVER: Data verified with certificate's public key. */
  32743. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  32744. (ret == 0);
  32745. }
  32746. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  32747. #ifdef WOLFSSL_ASYNC_CRYPT
  32748. /* handle async pending */
  32749. if (ret == WC_PENDING_E)
  32750. goto exit_dcv;
  32751. #endif
  32752. /* Check for error */
  32753. if (ret != 0) {
  32754. ret = SIG_VERIFY_E;
  32755. goto exit_dcv;
  32756. }
  32757. /* Advance state and proceed */
  32758. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  32759. } /* case TLS_ASYNC_DO */
  32760. FALL_THROUGH;
  32761. case TLS_ASYNC_VERIFY:
  32762. {
  32763. #ifndef NO_RSA
  32764. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  32765. if (IsAtLeastTLSv1_2(ssl)) {
  32766. #ifdef WC_RSA_PSS
  32767. if (ssl->options.peerSigAlgo == rsa_pss_sa_algo) {
  32768. SetDigest(ssl, ssl->options.peerHashAlgo);
  32769. #ifdef HAVE_SELFTEST
  32770. ret = wc_RsaPSS_CheckPadding(
  32771. ssl->buffers.digest.buffer,
  32772. ssl->buffers.digest.length,
  32773. args->output, args->sigSz,
  32774. HashAlgoToType(ssl->options.peerHashAlgo));
  32775. #else
  32776. ret = wc_RsaPSS_CheckPadding_ex(
  32777. ssl->buffers.digest.buffer,
  32778. ssl->buffers.digest.length,
  32779. args->output, args->sigSz,
  32780. HashAlgoToType(ssl->options.peerHashAlgo), -1,
  32781. mp_count_bits(&ssl->peerRsaKey->n));
  32782. #endif
  32783. if (ret != 0) {
  32784. ret = SIG_VERIFY_E;
  32785. goto exit_dcv;
  32786. }
  32787. }
  32788. else
  32789. #endif
  32790. {
  32791. #ifndef WOLFSSL_SMALL_STACK
  32792. byte encodedSig[MAX_ENCODED_SIG_SZ];
  32793. #else
  32794. byte* encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  32795. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  32796. if (encodedSig == NULL) {
  32797. ERROR_OUT(MEMORY_E, exit_dcv);
  32798. }
  32799. #endif
  32800. if (ssl->options.peerSigAlgo != rsa_sa_algo) {
  32801. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  32802. "in verify");
  32803. }
  32804. SetDigest(ssl, ssl->options.peerHashAlgo);
  32805. args->sigSz = wc_EncodeSignature(encodedSig,
  32806. ssl->buffers.digest.buffer,
  32807. ssl->buffers.digest.length,
  32808. TypeHash(ssl->options.peerHashAlgo));
  32809. if (args->sendSz != args->sigSz || !args->output ||
  32810. XMEMCMP(args->output, encodedSig,
  32811. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  32812. ret = VERIFY_CERT_ERROR;
  32813. }
  32814. #ifdef WOLFSSL_SMALL_STACK
  32815. XFREE(encodedSig, ssl->heap,
  32816. DYNAMIC_TYPE_SIGNATURE);
  32817. #endif
  32818. }
  32819. }
  32820. else {
  32821. if (args->sendSz != FINISHED_SZ || !args->output ||
  32822. XMEMCMP(args->output,
  32823. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  32824. ret = VERIFY_CERT_ERROR;
  32825. }
  32826. }
  32827. if (ret == 0) {
  32828. /* SERVER: Data verified with cert's public key. */
  32829. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  32830. (ret == 0);
  32831. }
  32832. }
  32833. #endif /* !NO_RSA */
  32834. if (ret != 0)
  32835. break;
  32836. /* Advance state and proceed */
  32837. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  32838. } /* case TLS_ASYNC_VERIFY */
  32839. FALL_THROUGH;
  32840. case TLS_ASYNC_FINALIZE:
  32841. {
  32842. if (IsEncryptionOn(ssl, 0)) {
  32843. args->idx += ssl->keys.padSz;
  32844. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  32845. if (ssl->options.startedETMRead)
  32846. args->idx += MacSize(ssl);
  32847. #endif
  32848. }
  32849. ssl->options.havePeerVerify = 1;
  32850. /* Set final index */
  32851. args->idx += args->sz;
  32852. *inOutIdx = args->idx;
  32853. /* Advance state and proceed */
  32854. ssl->options.asyncState = TLS_ASYNC_END;
  32855. } /* case TLS_ASYNC_FINALIZE */
  32856. FALL_THROUGH;
  32857. case TLS_ASYNC_END:
  32858. {
  32859. break;
  32860. }
  32861. default:
  32862. ret = INPUT_CASE_ERROR;
  32863. } /* switch(ssl->options.asyncState) */
  32864. exit_dcv:
  32865. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  32866. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  32867. #ifdef WOLFSSL_ASYNC_CRYPT
  32868. /* Handle async operation */
  32869. if (ret == WC_PENDING_E) {
  32870. /* Mark message as not received so it can process again */
  32871. ssl->msgsReceived.got_certificate_verify = 0;
  32872. return ret;
  32873. }
  32874. #endif /* WOLFSSL_ASYNC_CRYPT */
  32875. #ifdef WOLFSSL_EXTRA_ALERTS
  32876. if (ret == BUFFER_ERROR)
  32877. SendAlert(ssl, alert_fatal, decode_error);
  32878. else if (ret == SIG_VERIFY_E)
  32879. SendAlert(ssl, alert_fatal, decrypt_error);
  32880. else if (ret != 0)
  32881. SendAlert(ssl, alert_fatal, bad_certificate);
  32882. #endif
  32883. /* Digest is not allocated, so do this to prevent free */
  32884. if(ssl->buffers.digest.buffer) {
  32885. if (!ssl->options.dontFreeDigest) {
  32886. /*This should not happen*/
  32887. XFREE(ssl->buffers.digest.buffer,
  32888. ssl->heap, DYNAMIC_TYPE_DIGEST);
  32889. }
  32890. }
  32891. ssl->buffers.digest.buffer = NULL;
  32892. ssl->buffers.digest.length = 0;
  32893. ssl->options.dontFreeDigest = 0;
  32894. #ifdef WOLFSSL_ASYNC_CRYPT
  32895. /* Cleanup async */
  32896. FreeAsyncCtx(ssl, 0);
  32897. #else
  32898. FreeDcvArgs(ssl, args);
  32899. #endif
  32900. /* Final cleanup */
  32901. FreeKeyExchange(ssl);
  32902. if (ret != 0) {
  32903. WOLFSSL_ERROR_VERBOSE(ret);
  32904. }
  32905. return ret;
  32906. }
  32907. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  32908. /* handle generation of server_hello_done (14) */
  32909. int SendServerHelloDone(WOLFSSL* ssl)
  32910. {
  32911. byte* output;
  32912. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  32913. int ret;
  32914. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  32915. WOLFSSL_ENTER("SendServerHelloDone");
  32916. #ifdef WOLFSSL_DTLS
  32917. if (ssl->options.dtls)
  32918. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  32919. #endif
  32920. if (IsEncryptionOn(ssl, 1))
  32921. sendSz += MAX_MSG_EXTRA;
  32922. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  32923. * is not advanced yet */
  32924. ssl->options.buildingMsg = 1;
  32925. /* check for available size */
  32926. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  32927. return ret;
  32928. /* get output buffer */
  32929. output = GetOutputBuffer(ssl);
  32930. AddHeaders(output, 0, server_hello_done, ssl);
  32931. if (IsEncryptionOn(ssl, 1)) {
  32932. byte* input;
  32933. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  32934. int recordHeaderSz = RECORD_HEADER_SZ;
  32935. if (ssl->options.dtls) {
  32936. recordHeaderSz += DTLS_RECORD_EXTRA;
  32937. inputSz += DTLS_HANDSHAKE_EXTRA;
  32938. }
  32939. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  32940. if (input == NULL)
  32941. return MEMORY_E;
  32942. XMEMCPY(input, output + recordHeaderSz, inputSz);
  32943. #ifdef WOLFSSL_DTLS
  32944. if (IsDtlsNotSctpMode(ssl) &&
  32945. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
  32946. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  32947. return ret;
  32948. }
  32949. #endif
  32950. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  32951. handshake, 1, 0, 0, CUR_ORDER);
  32952. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  32953. if (sendSz < 0)
  32954. return sendSz;
  32955. } else {
  32956. #ifdef WOLFSSL_DTLS
  32957. if (IsDtlsNotSctpMode(ssl)) {
  32958. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
  32959. return ret;
  32960. }
  32961. if (ssl->options.dtls)
  32962. DtlsSEQIncrement(ssl, CUR_ORDER);
  32963. #endif
  32964. ret = HashOutput(ssl, output, sendSz, 0);
  32965. if (ret != 0)
  32966. return ret;
  32967. }
  32968. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  32969. if (ssl->hsInfoOn)
  32970. AddPacketName(ssl, "ServerHelloDone");
  32971. if (ssl->toInfoOn) {
  32972. ret = AddPacketInfo(ssl, "ServerHelloDone", handshake, output,
  32973. sendSz, WRITE_PROTO, 0, ssl->heap);
  32974. if (ret != 0)
  32975. return ret;
  32976. }
  32977. #endif
  32978. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  32979. ssl->options.buildingMsg = 0;
  32980. ssl->buffers.outputBuffer.length += sendSz;
  32981. ret = SendBuffered(ssl);
  32982. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  32983. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  32984. return ret;
  32985. }
  32986. #endif /* !WOLFSSL_NO_TLS12 */
  32987. #ifdef HAVE_SESSION_TICKET
  32988. #ifdef WOLFSSL_TICKET_HAVE_ID
  32989. static void GetRealSessionID(WOLFSSL* ssl, const byte** id, byte* idSz)
  32990. {
  32991. if (ssl->session->haveAltSessionID) {
  32992. *id = ssl->session->altSessionID;
  32993. *idSz = ID_LEN;
  32994. }
  32995. else if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
  32996. *id = ssl->arrays->sessionID;
  32997. *idSz = ssl->arrays->sessionIDSz;
  32998. }
  32999. else {
  33000. *id = ssl->session->sessionID;
  33001. *idSz = ssl->session->sessionIDSz;
  33002. }
  33003. }
  33004. #endif
  33005. int SetupTicket(WOLFSSL* ssl)
  33006. {
  33007. int ret = 0;
  33008. (void)ssl;
  33009. #ifdef WOLFSSL_TLS13
  33010. {
  33011. /* Client adds to ticket age to obfuscate. */
  33012. byte ageAdd[AGEADD_LEN]; /* Obfuscation of age */
  33013. ret = wc_RNG_GenerateBlock(ssl->rng, ageAdd, AGEADD_LEN);
  33014. if (ret != 0)
  33015. return ret;
  33016. ato32(ageAdd, &ssl->session->ticketAdd);
  33017. }
  33018. #endif
  33019. #ifdef WOLFSSL_TICKET_HAVE_ID
  33020. {
  33021. const byte* id = NULL;
  33022. byte idSz = 0;
  33023. GetRealSessionID(ssl, &id, &idSz);
  33024. if (idSz == 0) {
  33025. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID,
  33026. ID_LEN);
  33027. if (ret != 0)
  33028. return ret;
  33029. ssl->session->haveAltSessionID = 1;
  33030. }
  33031. }
  33032. #endif
  33033. return ret;
  33034. }
  33035. /* create a new session ticket, 0 on success
  33036. * Do any kind of setup in SetupTicket */
  33037. int CreateTicket(WOLFSSL* ssl)
  33038. {
  33039. InternalTicket* it;
  33040. ExternalTicket* et;
  33041. int encLen;
  33042. int ret;
  33043. int error;
  33044. word32 itHash = 0;
  33045. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  33046. WOLFSSL_ASSERT_SIZEOF_GE(ssl->session->staticTicket, *et);
  33047. WOLFSSL_ASSERT_SIZEOF_GE(et->enc_ticket, *it);
  33048. if (ssl->session->ticket != ssl->session->staticTicket) {
  33049. /* Always use the static ticket buffer */
  33050. XFREE(ssl->session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  33051. ssl->session->ticket = ssl->session->staticTicket;
  33052. ssl->session->ticketLenAlloc = 0;
  33053. }
  33054. et = (ExternalTicket*)ssl->session->ticket;
  33055. it = (InternalTicket*)et->enc_ticket;
  33056. #ifdef WOLFSSL_ASYNC_CRYPT
  33057. if (ssl->error != WC_PENDING_E)
  33058. #endif
  33059. {
  33060. XMEMSET(et, 0, sizeof(*et));
  33061. }
  33062. /* build internal */
  33063. it->pv.major = ssl->version.major;
  33064. it->pv.minor = ssl->version.minor;
  33065. it->suite[0] = ssl->options.cipherSuite0;
  33066. it->suite[1] = ssl->options.cipherSuite;
  33067. #ifdef WOLFSSL_EARLY_DATA
  33068. c32toa(ssl->options.maxEarlyDataSz, it->maxEarlyDataSz);
  33069. #endif
  33070. if (!ssl->options.tls1_3) {
  33071. if (ssl->arrays == NULL) {
  33072. WOLFSSL_MSG("CreateTicket called with null arrays");
  33073. ret = BAD_FUNC_ARG;
  33074. goto error;
  33075. }
  33076. XMEMCPY(it->msecret, ssl->arrays->masterSecret, SECRET_LEN);
  33077. #ifndef NO_ASN_TIME
  33078. c32toa(LowResTimer(), it->timestamp);
  33079. #endif
  33080. it->haveEMS = (byte) ssl->options.haveEMS;
  33081. }
  33082. else {
  33083. #ifdef WOLFSSL_TLS13
  33084. #ifdef WOLFSSL_32BIT_MILLI_TIME
  33085. word32 now = TimeNowInMilliseconds();
  33086. #else
  33087. sword64 now = TimeNowInMilliseconds();
  33088. #endif
  33089. if (now == 0) {
  33090. ret = GETTIME_ERROR;
  33091. goto error;
  33092. }
  33093. c32toa(ssl->session->ticketAdd, it->ageAdd);
  33094. c16toa(ssl->session->namedGroup, it->namedGroup);
  33095. #ifdef WOLFSSL_32BIT_MILLI_TIME
  33096. c32toa(now, it->timestamp);
  33097. #else
  33098. c32toa((word32)(now >> 32), it->timestamp);
  33099. c32toa((word32)now , it->timestamp + OPAQUE32_LEN);
  33100. #endif
  33101. /* Resumption master secret. */
  33102. XMEMCPY(it->msecret, ssl->session->masterSecret, SECRET_LEN);
  33103. if (ssl->session->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ) {
  33104. WOLFSSL_MSG("Bad ticket nonce value");
  33105. ret = BAD_TICKET_MSG_SZ;
  33106. goto error;
  33107. }
  33108. XMEMCPY(it->ticketNonce, ssl->session->ticketNonce.data,
  33109. ssl->session->ticketNonce.len);
  33110. it->ticketNonceLen = ssl->session->ticketNonce.len;
  33111. #endif
  33112. }
  33113. #ifdef OPENSSL_EXTRA
  33114. it->sessionCtxSz = ssl->sessionCtxSz;
  33115. XMEMCPY(it->sessionCtx, ssl->sessionCtx, ID_LEN);
  33116. #endif
  33117. #ifdef WOLFSSL_TICKET_HAVE_ID
  33118. {
  33119. const byte* id = NULL;
  33120. byte idSz = 0;
  33121. GetRealSessionID(ssl, &id, &idSz);
  33122. /* make sure idSz is not larger than ID_LEN */
  33123. if (idSz > ID_LEN)
  33124. idSz = ID_LEN;
  33125. XMEMCPY(it->id, id, idSz);
  33126. }
  33127. #endif
  33128. /* encrypt */
  33129. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  33130. if (ssl->ctx->ticketEncCb == NULL
  33131. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  33132. ||
  33133. /* SSL_OP_NO_TICKET turns off tickets in <= 1.2. Forces
  33134. * "stateful" tickets for 1.3 so just use the regular
  33135. * stateless ones. */
  33136. (!IsAtLeastTLSv1_3(ssl->version) &&
  33137. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  33138. #endif
  33139. ) {
  33140. /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
  33141. ret = BAD_TICKET_ENCRYPT;
  33142. }
  33143. else {
  33144. itHash = HashObject((byte*)it, sizeof(*it), &error);
  33145. if (error == 0) {
  33146. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac,
  33147. 1, et->enc_ticket, sizeof(InternalTicket), &encLen,
  33148. SSL_TICKET_CTX(ssl));
  33149. }
  33150. else {
  33151. ret = WOLFSSL_TICKET_RET_FATAL;
  33152. }
  33153. }
  33154. if (ret != WOLFSSL_TICKET_RET_OK) {
  33155. #ifdef WOLFSSL_ASYNC_CRYPT
  33156. if (ret == WC_PENDING_E) {
  33157. return ret;
  33158. }
  33159. #endif
  33160. goto error;
  33161. }
  33162. if (encLen < (int)sizeof(InternalTicket) ||
  33163. encLen > (int)WOLFSSL_TICKET_ENC_SZ) {
  33164. WOLFSSL_MSG("Bad user ticket encrypt size");
  33165. ret = BAD_TICKET_KEY_CB_SZ;
  33166. }
  33167. /* sanity checks on encrypt callback */
  33168. /* internal ticket can't be the same if encrypted */
  33169. if (itHash == HashObject((byte*)it, sizeof(*it), &error) || error != 0)
  33170. {
  33171. WOLFSSL_MSG("User ticket encrypt didn't encrypt or hash failed");
  33172. ret = BAD_TICKET_ENCRYPT;
  33173. goto error;
  33174. }
  33175. XMEMSET(zeros, 0, sizeof(zeros));
  33176. /* name */
  33177. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  33178. WOLFSSL_MSG("User ticket encrypt didn't set name");
  33179. ret = BAD_TICKET_ENCRYPT;
  33180. goto error;
  33181. }
  33182. /* iv */
  33183. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  33184. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  33185. ret = BAD_TICKET_ENCRYPT;
  33186. goto error;
  33187. }
  33188. /* mac */
  33189. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  33190. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  33191. ret = BAD_TICKET_ENCRYPT;
  33192. goto error;
  33193. }
  33194. /* set size */
  33195. c16toa((word16)encLen, et->enc_len);
  33196. if (encLen < (int)WOLFSSL_TICKET_ENC_SZ) {
  33197. /* move mac up since whole enc buffer not used */
  33198. XMEMMOVE(et->enc_ticket + encLen, et->mac,
  33199. WOLFSSL_TICKET_MAC_SZ);
  33200. }
  33201. ssl->session->ticketLen =
  33202. (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  33203. return ret;
  33204. error:
  33205. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33206. /* Ticket has sensitive data in it now. */
  33207. wc_MemZero_Add("Create Ticket internal", it, sizeof(InternalTicket));
  33208. #endif
  33209. ForceZero(it, sizeof(*it));
  33210. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33211. wc_MemZero_Check(it, sizeof(InternalTicket));
  33212. #endif
  33213. WOLFSSL_ERROR_VERBOSE(ret);
  33214. return ret;
  33215. }
  33216. int DoDecryptTicket(const WOLFSSL* ssl, const byte* input, word32 len,
  33217. InternalTicket **it)
  33218. {
  33219. ExternalTicket* et;
  33220. int ret;
  33221. int outLen;
  33222. word16 inLen;
  33223. WOLFSSL_START(WC_FUNC_TICKET_DO);
  33224. WOLFSSL_ENTER("DoDecryptTicket");
  33225. if (len > SESSION_TICKET_LEN ||
  33226. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  33227. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
  33228. return WOLFSSL_TICKET_RET_REJECT;
  33229. }
  33230. et = (ExternalTicket*)input;
  33231. /* decrypt */
  33232. ato16(et->enc_len, &inLen);
  33233. if (inLen > WOLFSSL_TICKET_ENC_SZ) {
  33234. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
  33235. return WOLFSSL_TICKET_RET_REJECT;
  33236. }
  33237. outLen = (int)inLen; /* may be reduced by user padding */
  33238. if (ssl->ctx->ticketEncCb == NULL
  33239. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  33240. ||
  33241. /* SSL_OP_NO_TICKET turns off tickets in < 1.2. Forces
  33242. * "stateful" tickets for 1.3 so just use the regular
  33243. * stateless ones. */
  33244. (!IsAtLeastTLSv1_3(ssl->version) &&
  33245. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  33246. #endif
  33247. ) {
  33248. /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
  33249. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_ENCRYPT);
  33250. ret = WOLFSSL_TICKET_RET_REJECT;
  33251. }
  33252. else {
  33253. /* Callback uses ssl without const but for DTLS, it really shouldn't
  33254. * modify its state. */
  33255. ret = ssl->ctx->ticketEncCb((WOLFSSL*)ssl, et->key_name, et->iv,
  33256. et->enc_ticket + inLen, 0,
  33257. et->enc_ticket, inLen, &outLen,
  33258. SSL_TICKET_CTX(ssl));
  33259. }
  33260. if (ret != WOLFSSL_TICKET_RET_OK) {
  33261. #ifdef WOLFSSL_ASYNC_CRYPT
  33262. if (ret == WC_PENDING_E) {
  33263. return ret;
  33264. }
  33265. #endif /* WOLFSSL_ASYNC_CRYPT */
  33266. if (ret != WOLFSSL_TICKET_RET_CREATE) {
  33267. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
  33268. return WOLFSSL_TICKET_RET_REJECT;
  33269. }
  33270. }
  33271. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  33272. WOLFSSL_MSG("Bad user ticket decrypt len");
  33273. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
  33274. return BAD_TICKET_KEY_CB_SZ;
  33275. }
  33276. *it = (InternalTicket*)et->enc_ticket;
  33277. return ret;
  33278. }
  33279. static int DoClientTicketCheckVersion(const WOLFSSL* ssl,
  33280. InternalTicket* it)
  33281. {
  33282. if (ssl->version.minor < it->pv.minor) {
  33283. WOLFSSL_MSG("Ticket has greater version");
  33284. return VERSION_ERROR;
  33285. }
  33286. else if (ssl->version.minor > it->pv.minor) {
  33287. if (IsAtLeastTLSv1_3(it->pv) != IsAtLeastTLSv1_3(ssl->version)) {
  33288. WOLFSSL_MSG("Tickets cannot be shared between "
  33289. "TLS 1.3 and TLS 1.2 and lower");
  33290. return VERSION_ERROR;
  33291. }
  33292. if (!ssl->options.downgrade) {
  33293. WOLFSSL_MSG("Ticket has lesser version");
  33294. return VERSION_ERROR;
  33295. }
  33296. WOLFSSL_MSG("Downgrading protocol due to ticket");
  33297. if (it->pv.minor < ssl->options.minDowngrade) {
  33298. WOLFSSL_MSG("Ticket has lesser version than allowed");
  33299. return VERSION_ERROR;
  33300. }
  33301. }
  33302. #ifdef WOLFSSL_TLS13
  33303. /* Check resumption master secret. */
  33304. if (IsAtLeastTLSv1_3(it->pv) &&
  33305. it->ticketNonceLen > MAX_TICKET_NONCE_STATIC_SZ) {
  33306. WOLFSSL_MSG("Unsupported ticketNonce len in ticket");
  33307. return BAD_TICKET_ENCRYPT;
  33308. }
  33309. #endif
  33310. return 0;
  33311. }
  33312. #if defined(WOLFSSL_TLS13)
  33313. /* Return 0 when check successful. <0 on failure. */
  33314. int DoClientTicketCheck(const WOLFSSL* ssl, const PreSharedKey* psk,
  33315. sword64 timeout, const byte* suite)
  33316. {
  33317. word32 ticketAdd;
  33318. #ifdef WOLFSSL_32BIT_MILLI_TIME
  33319. word32 now;
  33320. sword64 diff;
  33321. word32 ticketSeen; /* Time ticket seen (ms) */
  33322. ato32(psk->it->timestamp, &ticketSeen);
  33323. now = TimeNowInMilliseconds();
  33324. if (now == 0)
  33325. return GETTIME_ERROR;
  33326. /* Difference between now and time ticket constructed
  33327. * (from decrypted ticket). */
  33328. diff = now;
  33329. diff -= ticketSeen;
  33330. if (diff > timeout * 1000 ||
  33331. diff > (sword64)TLS13_MAX_TICKET_AGE * 1000)
  33332. return -1;
  33333. #else
  33334. sword64 diff;
  33335. sword64 ticketSeen; /* Time ticket seen (ms) */
  33336. word32 seenHi, seenLo;
  33337. ato32(psk->it->timestamp , &seenHi);
  33338. ato32(psk->it->timestamp + OPAQUE32_LEN, &seenLo);
  33339. ticketSeen = ((sword64)seenHi << 32) + seenLo;
  33340. diff = TimeNowInMilliseconds();
  33341. if (diff == 0)
  33342. return GETTIME_ERROR;
  33343. /* Difference between now and time ticket constructed
  33344. * (from decrypted ticket). */
  33345. diff -= ticketSeen;
  33346. if (diff > timeout * 1000 ||
  33347. diff > (sword64)TLS13_MAX_TICKET_AGE * 1000)
  33348. return -1;
  33349. #endif
  33350. ato32(psk->it->ageAdd, &ticketAdd);
  33351. /* Subtract client's ticket age and unobfuscate. */
  33352. diff -= psk->ticketAge;
  33353. diff += ticketAdd;
  33354. /* Check session and ticket age timeout.
  33355. * Allow +/- 1000 milliseconds on ticket age.
  33356. */
  33357. if (diff < -1000 || diff - MAX_TICKET_AGE_DIFF * 1000 > 1000)
  33358. return -1;
  33359. #if !defined(WOLFSSL_PSK_ONE_ID) && !defined(WOLFSSL_PRIORITIZE_PSK)
  33360. /* Check whether resumption is possible based on suites in SSL and
  33361. * ciphersuite in ticket.
  33362. */
  33363. (void)ssl;
  33364. if (XMEMCMP(suite, psk->it->suite, SUITE_LEN) != 0)
  33365. return -1;
  33366. #else
  33367. (void)suite;
  33368. if (!FindSuiteSSL(ssl, psk->it->suite))
  33369. return -1;
  33370. #endif
  33371. #ifdef OPENSSL_EXTRA
  33372. if (ssl->sessionCtxSz > 0 &&
  33373. (psk->it->sessionCtxSz != ssl->sessionCtxSz ||
  33374. XMEMCMP(psk->it->sessionCtx, ssl->sessionCtx,
  33375. ssl->sessionCtxSz) != 0))
  33376. return -1;
  33377. #endif
  33378. return 0;
  33379. }
  33380. #endif /* WOLFSSL_SLT13 */
  33381. void DoClientTicketFinalize(WOLFSSL* ssl, InternalTicket* it,
  33382. const WOLFSSL_SESSION* sess)
  33383. {
  33384. #ifdef WOLFSSL_TICKET_HAVE_ID
  33385. ssl->session->haveAltSessionID = 1;
  33386. XMEMCPY(ssl->session->altSessionID, it->id, ID_LEN);
  33387. #endif
  33388. if (sess != NULL) {
  33389. byte bogusID[ID_LEN];
  33390. byte bogusIDSz = ssl->session->sessionIDSz;
  33391. XMEMCPY(bogusID, ssl->session->sessionID, ID_LEN);
  33392. /* Failure here should not interrupt the resumption. We already have
  33393. * all the cipher material we need in `it` */
  33394. WOLFSSL_MSG("Copying in session from passed in arg");
  33395. (void)wolfSSL_DupSession(sess, ssl->session, 1);
  33396. /* Restore the fake ID */
  33397. XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN);
  33398. ssl->session->sessionIDSz= bogusIDSz;
  33399. }
  33400. #ifdef WOLFSSL_TICKET_HAVE_ID
  33401. else {
  33402. if (wolfSSL_GetSession(ssl, NULL, 1) != NULL) {
  33403. WOLFSSL_MSG("Found session matching the session id"
  33404. " found in the ticket");
  33405. }
  33406. else {
  33407. WOLFSSL_MSG("Can't find session matching the session id"
  33408. " found in the ticket");
  33409. }
  33410. }
  33411. #endif
  33412. if (!IsAtLeastTLSv1_3(ssl->version)) {
  33413. XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN);
  33414. /* Copy the haveExtendedMasterSecret property from the ticket to
  33415. * the saved session, so the property may be checked later. */
  33416. ssl->session->haveEMS = it->haveEMS;
  33417. ato32((const byte*)&it->timestamp, &ssl->session->bornOn);
  33418. #ifndef NO_RESUME_SUITE_CHECK
  33419. ssl->session->cipherSuite0 = it->suite[0];
  33420. ssl->session->cipherSuite = it->suite[1];
  33421. #endif
  33422. }
  33423. else {
  33424. #ifdef WOLFSSL_TLS13
  33425. /* This should have been already checked in
  33426. * DoClientTicketCheckVersion */
  33427. if (it->ticketNonceLen > MAX_TICKET_NONCE_STATIC_SZ) {
  33428. WOLFSSL_MSG("Unsupported ticketNonce len in ticket");
  33429. return;
  33430. }
  33431. /* Restore information to renegotiate. */
  33432. #ifdef WOLFSSL_32BIT_MILLI_TIME
  33433. ato32(it->timestamp, &ssl->session->ticketSeen);
  33434. #else
  33435. {
  33436. word32 seenHi, seenLo;
  33437. ato32(it->timestamp , &seenHi);
  33438. ato32(it->timestamp + OPAQUE32_LEN, &seenLo);
  33439. ssl->session->ticketSeen = ((sword64)seenHi << 32) + seenLo;
  33440. }
  33441. #endif
  33442. ato32(it->ageAdd, &ssl->session->ticketAdd);
  33443. ssl->session->cipherSuite0 = it->suite[0];
  33444. ssl->session->cipherSuite = it->suite[1];
  33445. #ifdef WOLFSSL_EARLY_DATA
  33446. ato32(it->maxEarlyDataSz, &ssl->session->maxEarlyDataSz);
  33447. #endif
  33448. /* Resumption master secret. */
  33449. XMEMCPY(ssl->session->masterSecret, it->msecret, SECRET_LEN);
  33450. #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  33451. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  33452. if (ssl->session->ticketNonce.data
  33453. != ssl->session->ticketNonce.dataStatic) {
  33454. XFREE(ssl->session->ticketNonce.data, ssl->heap,
  33455. DYNAMIC_TYPE_SESSION_TICK);
  33456. ssl->session->ticketNonce.data =
  33457. ssl->session->ticketNonce.dataStatic;
  33458. }
  33459. #endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
  33460. XMEMCPY(ssl->session->ticketNonce.data, it->ticketNonce,
  33461. it->ticketNonceLen);
  33462. ssl->session->ticketNonce.len = it->ticketNonceLen;
  33463. ato16(it->namedGroup, &ssl->session->namedGroup);
  33464. #endif
  33465. }
  33466. ssl->version.minor = it->pv.minor;
  33467. }
  33468. #if defined(WOLFSSL_TLS13)
  33469. static void PopulateInternalTicketFromSession(const WOLFSSL_SESSION* sess,
  33470. InternalTicket* it)
  33471. {
  33472. #ifdef WOLFSSL_32BIT_MILLI_TIME
  33473. word32 milliBornOn = sess->bornOn;
  33474. #else
  33475. sword64 milliBornOn = (sword64)sess->bornOn;
  33476. #endif
  33477. /* Convert to milliseconds */
  33478. milliBornOn *= 1000;
  33479. it->pv = sess->version;
  33480. it->suite[0] = sess->cipherSuite0;
  33481. it->suite[1] = sess->cipherSuite;
  33482. XMEMCPY(it->msecret, sess->masterSecret, SECRET_LEN);
  33483. #ifdef WOLFSSL_32BIT_MILLI_TIME
  33484. c32toa(milliBornOn, it->timestamp);
  33485. #else
  33486. c32toa((word32)(milliBornOn >> 32), it->timestamp);
  33487. c32toa((word32)milliBornOn , it->timestamp + OPAQUE32_LEN);
  33488. #endif
  33489. it->haveEMS = (byte)sess->haveEMS;
  33490. c32toa(sess->ticketAdd, it->ageAdd);
  33491. c16toa(sess->namedGroup, it->namedGroup);
  33492. if (sess->ticketNonce.len <= MAX_TICKET_NONCE_STATIC_SZ) {
  33493. it->ticketNonceLen = sess->ticketNonce.len;
  33494. XMEMCPY(it->ticketNonce, sess->ticketNonce.data,
  33495. sess->ticketNonce.len);
  33496. }
  33497. #ifdef WOLFSSL_EARLY_DATA
  33498. c32toa(sess->maxEarlyDataSz, it->maxEarlyDataSz);
  33499. #endif
  33500. #ifdef WOLFSSL_TICKET_HAVE_ID
  33501. if (sess->haveAltSessionID)
  33502. XMEMCPY(it->id, sess->altSessionID, ID_LEN);
  33503. else
  33504. XMEMCPY(it->id, sess->sessionID, ID_LEN);
  33505. #endif
  33506. #ifdef OPENSSL_EXTRA
  33507. it->sessionCtxSz = sess->sessionCtxSz;
  33508. XMEMCPY(it->sessionCtx, sess->sessionCtx, sess->sessionCtxSz);
  33509. #endif
  33510. }
  33511. static const WOLFSSL_SESSION* GetSesionFromCacheOrExt(const WOLFSSL* ssl,
  33512. const byte* id, psk_sess_free_cb_ctx* freeCtx)
  33513. {
  33514. const WOLFSSL_SESSION* sess = NULL;
  33515. int ret;
  33516. XMEMSET(freeCtx, 0, sizeof(*freeCtx));
  33517. #ifdef HAVE_EXT_CACHE
  33518. if (ssl->ctx->get_sess_cb != NULL) {
  33519. int copy = 0;
  33520. sess = ssl->ctx->get_sess_cb((WOLFSSL*)ssl,
  33521. id, ID_LEN, &copy);
  33522. if (sess != NULL) {
  33523. freeCtx->extCache = 1;
  33524. /* If copy not set then free immediately */
  33525. if (!copy)
  33526. freeCtx->freeSess = 1;
  33527. }
  33528. }
  33529. #endif
  33530. if (sess == NULL) {
  33531. ret = TlsSessionCacheGetAndRdLock(id, &sess, &freeCtx->row,
  33532. ssl->options.side);
  33533. if (ret != 0)
  33534. sess = NULL;
  33535. }
  33536. return sess;
  33537. }
  33538. static void FreeSessionFromCacheOrExt(const WOLFSSL* ssl,
  33539. const WOLFSSL_SESSION* sess, psk_sess_free_cb_ctx* freeCtx)
  33540. {
  33541. (void)ssl;
  33542. (void)sess;
  33543. #ifdef HAVE_EXT_CACHE
  33544. if (freeCtx->extCache) {
  33545. if (freeCtx->freeSess)
  33546. /* In this case sess is not longer const and the external cache
  33547. * wants us to free it. */
  33548. wolfSSL_FreeSession(ssl->ctx, (WOLFSSL_SESSION*)sess);
  33549. }
  33550. else
  33551. #endif
  33552. TlsSessionCacheUnlockRow(freeCtx->row);
  33553. }
  33554. /* Parse ticket sent by client, returns callback return value. Doesn't
  33555. * modify ssl and stores the InternalTicket inside psk */
  33556. int DoClientTicket_ex(const WOLFSSL* ssl, PreSharedKey* psk, int retainSess)
  33557. {
  33558. int ret;
  33559. int decryptRet = WOLFSSL_TICKET_RET_REJECT;
  33560. WOLFSSL_START(WC_FUNC_TICKET_DO);
  33561. WOLFSSL_ENTER("DoClientTicket_ex");
  33562. if (psk->identityLen == ID_LEN && IsAtLeastTLSv1_3(ssl->version)) {
  33563. /* This is a stateful ticket. We can be sure about this because
  33564. * stateless tickets are much longer. */
  33565. const WOLFSSL_SESSION* sess = NULL;
  33566. sess = GetSesionFromCacheOrExt(ssl, psk->identity,
  33567. &psk->sess_free_cb_ctx);
  33568. if (sess != NULL) {
  33569. /* Session found in cache. Copy in relevant info to psk */
  33570. byte* tmp;
  33571. WOLFSSL_MSG("Found session matching the session id"
  33572. " found in the ticket");
  33573. /* Allocate and populate an InternalTicket */
  33574. tmp = (byte*)XREALLOC(psk->identity, sizeof(InternalTicket),
  33575. ssl->heap, DYNAMIC_TYPE_TLSX);
  33576. if (tmp != NULL) {
  33577. XMEMSET(tmp, 0, sizeof(InternalTicket));
  33578. psk->identity = tmp;
  33579. psk->identityLen = sizeof(InternalTicket);
  33580. psk->it = (InternalTicket*)tmp;
  33581. PopulateInternalTicketFromSession(sess, psk->it);
  33582. decryptRet = WOLFSSL_TICKET_RET_OK;
  33583. if (retainSess) {
  33584. psk->sess = sess;
  33585. psk->sess_free_cb = FreeSessionFromCacheOrExt;
  33586. }
  33587. }
  33588. if (psk->sess == NULL) {
  33589. FreeSessionFromCacheOrExt(ssl, sess,
  33590. &psk->sess_free_cb_ctx);
  33591. XMEMSET(&psk->sess_free_cb_ctx, 0,
  33592. sizeof(psk_sess_free_cb_ctx));
  33593. }
  33594. }
  33595. }
  33596. else {
  33597. decryptRet = DoDecryptTicket(ssl, psk->identity, psk->identityLen,
  33598. &psk->it);
  33599. }
  33600. switch (decryptRet) {
  33601. case WOLFSSL_TICKET_RET_OK:
  33602. psk->decryptRet = PSK_DECRYPT_OK;
  33603. break;
  33604. case WOLFSSL_TICKET_RET_CREATE:
  33605. psk->decryptRet = PSK_DECRYPT_CREATE;
  33606. break;
  33607. default:
  33608. psk->decryptRet = PSK_DECRYPT_FAIL;
  33609. WOLFSSL_LEAVE("DoClientTicket_ex", decryptRet);
  33610. return decryptRet;
  33611. }
  33612. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33613. /* Internal ticket successfully decrypted. */
  33614. wc_MemZero_Add("Do Client Ticket internal", psk->it,
  33615. sizeof(InternalTicket));
  33616. #endif
  33617. ret = DoClientTicketCheckVersion(ssl, psk->it);
  33618. if (ret != 0) {
  33619. psk->decryptRet = PSK_DECRYPT_FAIL;
  33620. ForceZero(psk->identity, psk->identityLen);
  33621. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33622. wc_MemZero_Check(psk->it, sizeof(InternalTicket));
  33623. #endif
  33624. WOLFSSL_LEAVE("DoClientTicket_ex", ret);
  33625. return ret;
  33626. }
  33627. WOLFSSL_LEAVE("DoClientTicket_ex", decryptRet);
  33628. return decryptRet;
  33629. }
  33630. #endif /* WOLFSL_TLS13 */
  33631. /* Parse ticket sent by client, returns callback return value */
  33632. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  33633. {
  33634. int decryptRet = WOLFSSL_TICKET_RET_REJECT;
  33635. int ret;
  33636. InternalTicket* it = NULL;
  33637. #ifdef WOLFSSL_TLS13
  33638. InternalTicket staticIt;
  33639. const WOLFSSL_SESSION* sess = NULL;
  33640. psk_sess_free_cb_ctx freeCtx;
  33641. XMEMSET(&freeCtx, 0, sizeof(psk_sess_free_cb_ctx));
  33642. #endif
  33643. WOLFSSL_START(WC_FUNC_TICKET_DO);
  33644. WOLFSSL_ENTER("DoClientTicket");
  33645. #ifdef WOLFSSL_TLS13
  33646. if (len == ID_LEN && IsAtLeastTLSv1_3(ssl->version)) {
  33647. /* This is a stateful ticket. We can be sure about this because
  33648. * stateless tickets are much longer. */
  33649. sess = GetSesionFromCacheOrExt(ssl, input, &freeCtx);
  33650. if (sess != NULL) {
  33651. it = &staticIt;
  33652. XMEMSET(it, 0, sizeof(InternalTicket));
  33653. PopulateInternalTicketFromSession(sess, it);
  33654. decryptRet = WOLFSSL_TICKET_RET_OK;
  33655. }
  33656. }
  33657. else
  33658. #endif
  33659. decryptRet = DoDecryptTicket(ssl, input, len, &it);
  33660. if (decryptRet != WOLFSSL_TICKET_RET_OK &&
  33661. decryptRet != WOLFSSL_TICKET_RET_CREATE) {
  33662. it = NULL;
  33663. goto cleanup;
  33664. }
  33665. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33666. /* Internal ticket successfully decrypted. */
  33667. wc_MemZero_Add("Do Client Ticket internal", it, sizeof(InternalTicket));
  33668. #endif
  33669. ret = DoClientTicketCheckVersion(ssl, it);
  33670. if (ret != 0) {
  33671. decryptRet = ret;
  33672. goto cleanup;
  33673. }
  33674. DoClientTicketFinalize(ssl, it, NULL);
  33675. cleanup:
  33676. if (it != NULL) {
  33677. ForceZero(it, sizeof(*it));
  33678. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33679. wc_MemZero_Check(it, sizeof(InternalTicket));
  33680. #endif
  33681. }
  33682. #ifdef WOLFSSL_TLS13
  33683. if (sess != NULL)
  33684. FreeSessionFromCacheOrExt(ssl, sess, &freeCtx);
  33685. #endif
  33686. return decryptRet;
  33687. }
  33688. #ifdef WOLFSSL_TLS13
  33689. void CleanupClientTickets(PreSharedKey* psk)
  33690. {
  33691. for (; psk != NULL; psk = psk->next) {
  33692. if (psk->decryptRet == PSK_DECRYPT_OK ||
  33693. psk->decryptRet == PSK_DECRYPT_CREATE) {
  33694. psk->decryptRet = PSK_DECRYPT_NONE;
  33695. ForceZero(psk->identity, psk->identityLen);
  33696. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33697. /* We want to check the InternalTicket area since that is what
  33698. * we registered in DoClientTicket_ex */
  33699. wc_MemZero_Check((((ExternalTicket*)psk->identity)->enc_ticket),
  33700. sizeof(InternalTicket));
  33701. #endif
  33702. }
  33703. }
  33704. }
  33705. #endif /* WOLFSSL_TLS13 */
  33706. /* send Session Ticket */
  33707. int SendTicket(WOLFSSL* ssl)
  33708. {
  33709. byte* output;
  33710. int ret;
  33711. int sendSz;
  33712. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  33713. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  33714. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  33715. WOLFSSL_ENTER("SendTicket");
  33716. if (ssl->options.createTicket) {
  33717. ret = SetupTicket(ssl);
  33718. if (ret != 0)
  33719. return ret;
  33720. ret = CreateTicket(ssl);
  33721. if (ret != 0)
  33722. return ret;
  33723. }
  33724. length += ssl->session->ticketLen;
  33725. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  33726. if (!ssl->options.dtls) {
  33727. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  33728. sendSz += MAX_MSG_EXTRA;
  33729. }
  33730. else {
  33731. #ifdef WOLFSSL_DTLS
  33732. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  33733. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  33734. #endif
  33735. }
  33736. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  33737. sendSz += cipherExtraData(ssl);
  33738. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  33739. * is not advanced yet */
  33740. ssl->options.buildingMsg = 1;
  33741. /* check for available size */
  33742. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  33743. return ret;
  33744. /* get output buffer */
  33745. output = GetOutputBuffer(ssl);
  33746. AddHeaders(output, length, session_ticket, ssl);
  33747. /* hint */
  33748. c32toa(ssl->ctx->ticketHint, output + idx);
  33749. idx += SESSION_HINT_SZ;
  33750. /* length */
  33751. c16toa(ssl->session->ticketLen, output + idx);
  33752. idx += LENGTH_SZ;
  33753. /* ticket */
  33754. XMEMCPY(output + idx, ssl->session->ticket, ssl->session->ticketLen);
  33755. idx += ssl->session->ticketLen;
  33756. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  33757. byte* input;
  33758. int inputSz = idx; /* build msg adds rec hdr */
  33759. int recordHeaderSz = RECORD_HEADER_SZ;
  33760. if (ssl->options.dtls)
  33761. recordHeaderSz += DTLS_RECORD_EXTRA;
  33762. inputSz -= recordHeaderSz;
  33763. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  33764. if (input == NULL)
  33765. return MEMORY_E;
  33766. XMEMCPY(input, output + recordHeaderSz, inputSz);
  33767. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  33768. handshake, 1, 0, 0, CUR_ORDER);
  33769. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  33770. if (sendSz < 0)
  33771. return sendSz;
  33772. }
  33773. else {
  33774. #ifdef WOLFSSL_DTLS
  33775. if (ssl->options.dtls) {
  33776. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
  33777. return ret;
  33778. DtlsSEQIncrement(ssl, CUR_ORDER);
  33779. }
  33780. #endif
  33781. ret = HashOutput(ssl, output, sendSz, 0);
  33782. if (ret != 0)
  33783. return ret;
  33784. }
  33785. ssl->buffers.outputBuffer.length += sendSz;
  33786. ssl->options.buildingMsg = 0;
  33787. if (!ssl->options.groupMessages)
  33788. ret = SendBuffered(ssl);
  33789. WOLFSSL_LEAVE("SendTicket", ret);
  33790. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  33791. return ret;
  33792. }
  33793. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  33794. /* Initialize the context for session ticket encryption.
  33795. *
  33796. * @param [in] ctx SSL context.
  33797. * @param [in] keyCtx Context for session ticket encryption.
  33798. * @return 0 on success.
  33799. * @return BAD_MUTEX_E when initializing mutex fails.
  33800. */
  33801. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
  33802. {
  33803. int ret = 0;
  33804. XMEMSET(keyCtx, 0, sizeof(*keyCtx));
  33805. keyCtx->ctx = ctx;
  33806. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33807. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->name", keyCtx->name,
  33808. sizeof(keyCtx->name));
  33809. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[0]", keyCtx->key[0],
  33810. sizeof(keyCtx->key[0]));
  33811. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[1]", keyCtx->key[1],
  33812. sizeof(keyCtx->key[1]));
  33813. #endif
  33814. #ifndef SINGLE_THREADED
  33815. ret = wc_InitMutex(&keyCtx->mutex);
  33816. #endif
  33817. return ret;
  33818. }
  33819. /* Setup the session ticket encryption context for this.
  33820. *
  33821. * Initialize RNG, generate name, generate primary key and set primary key
  33822. * expirary.
  33823. *
  33824. * @param [in] keyCtx Context for session ticket encryption.
  33825. * @param [in] heap Dynamic memory allocation hint.
  33826. * @param [in] devId Device identifier.
  33827. * @return 0 on success.
  33828. * @return Other value when random number generator fails.
  33829. */
  33830. static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
  33831. {
  33832. int ret;
  33833. #ifndef SINGLE_THREADED
  33834. ret = 0;
  33835. /* Check that key wasn't set up while waiting. */
  33836. if (keyCtx->expirary[0] == 0)
  33837. #endif
  33838. {
  33839. ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
  33840. if (ret == 0) {
  33841. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
  33842. sizeof(keyCtx->name));
  33843. }
  33844. if (ret == 0) {
  33845. /* Mask of the bottom bit - used for index of key. */
  33846. keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
  33847. /* Generate initial primary key. */
  33848. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
  33849. WOLFSSL_TICKET_KEY_SZ);
  33850. }
  33851. if (ret == 0) {
  33852. keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
  33853. }
  33854. }
  33855. return ret;
  33856. }
  33857. /* Free the context for session ticket encryption.
  33858. *
  33859. * Zeroize keys and name.
  33860. *
  33861. * @param [in] keyCtx Context for session ticket encryption.
  33862. */
  33863. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
  33864. {
  33865. /* Zeroize sensitive data. */
  33866. ForceZero(keyCtx->name, sizeof(keyCtx->name));
  33867. ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
  33868. ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
  33869. #ifdef WOLFSSL_CHECK_MEM_ZERO
  33870. wc_MemZero_Check(keyCtx->name, sizeof(keyCtx->name));
  33871. wc_MemZero_Check(keyCtx->key[0], sizeof(keyCtx->key[0]));
  33872. wc_MemZero_Check(keyCtx->key[1], sizeof(keyCtx->key[1]));
  33873. #endif
  33874. #ifndef SINGLE_THREADED
  33875. wc_FreeMutex(&keyCtx->mutex);
  33876. #endif
  33877. wc_FreeRng(&keyCtx->rng);
  33878. }
  33879. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  33880. !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
  33881. !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
  33882. /* Ticket encryption/decryption implementation.
  33883. *
  33884. * @param [in] key Key for encryption/decryption.
  33885. * @param [in] keyLen Length of key in bytes.
  33886. * @param [in] iv IV/Nonce for encryption/decryption.
  33887. * @param [in] aad Additional authentication data.
  33888. * @param [in] aadSz Length of additional authentication data.
  33889. * @param [in] in Data to encrypt/decrypt.
  33890. * @param [in] inLen Length of encrypted data.
  33891. * @param [out] out Resulting data from encrypt/decrypt.
  33892. * @param [out] outLen Size of resulting data.
  33893. * @param [in] tag Authentication tag for encrypted data.
  33894. * @param [in] heap Dynamic memory allocation data hint.
  33895. * @param [in] enc 1 when encrypting, 0 when decrypting.
  33896. * @return 0 on success.
  33897. * @return Other value when encryption/decryption fails.
  33898. */
  33899. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  33900. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  33901. void* heap, int enc)
  33902. {
  33903. int ret;
  33904. (void)keyLen;
  33905. (void)heap;
  33906. if (enc) {
  33907. ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
  33908. tag);
  33909. }
  33910. else {
  33911. ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
  33912. out);
  33913. }
  33914. *outLen = inLen;
  33915. return ret;
  33916. }
  33917. #elif defined(HAVE_AESGCM)
  33918. /* Ticket encryption/decryption implementation.
  33919. *
  33920. * @param [in] key Key for encryption/decryption.
  33921. * @param [in] keyLen Length of key in bytes.
  33922. * @param [in] iv IV/Nonce for encryption/decryption.
  33923. * @param [in] aad Additional authentication data.
  33924. * @param [in] aadSz Length of additional authentication data.
  33925. * @param [in] in Data to encrypt/decrypt.
  33926. * @param [in] inLen Length of encrypted data.
  33927. * @param [out] out Resulting data from encrypt/decrypt.
  33928. * @param [out] outLen Size of resulting data.
  33929. * @param [in] tag Authentication tag for encrypted data.
  33930. * @param [in] heap Dynamic memory allocation data hint.
  33931. * @param [in] enc 1 when encrypting, 0 when decrypting.
  33932. * @return 0 on success.
  33933. * @return MEMORY_E when dynamic memory allocation fails.
  33934. * @return Other value when encryption/decryption fails.
  33935. */
  33936. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  33937. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  33938. void* heap, int enc)
  33939. {
  33940. int ret;
  33941. #ifdef WOLFSSL_SMALL_STACK
  33942. Aes* aes;
  33943. #else
  33944. Aes aes[1];
  33945. #endif
  33946. (void)heap;
  33947. #ifdef WOLFSSL_SMALL_STACK
  33948. aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
  33949. if (aes == NULL)
  33950. return MEMORY_E;
  33951. #endif
  33952. if (enc) {
  33953. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  33954. if (ret == 0) {
  33955. ret = wc_AesGcmSetKey(aes, key, keyLen);
  33956. }
  33957. if (ret == 0) {
  33958. ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  33959. tag, AES_BLOCK_SIZE, aad, aadSz);
  33960. }
  33961. wc_AesFree(aes);
  33962. }
  33963. else {
  33964. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  33965. if (ret == 0) {
  33966. ret = wc_AesGcmSetKey(aes, key, keyLen);
  33967. }
  33968. if (ret == 0) {
  33969. ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  33970. tag, AES_BLOCK_SIZE, aad, aadSz);
  33971. }
  33972. wc_AesFree(aes);
  33973. }
  33974. #ifdef WOLFSSL_SMALL_STACK
  33975. XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
  33976. #endif
  33977. *outLen = inLen;
  33978. return ret;
  33979. }
  33980. #elif defined(WOLFSSL_SM4_GCM)
  33981. /* Ticket encryption/decryption implementation.
  33982. *
  33983. * @param [in] key Key for encryption/decryption.
  33984. * @param [in] keyLen Length of key in bytes.
  33985. * @param [in] iv IV/Nonce for encryption/decryption.
  33986. * @param [in] aad Additional authentication data.
  33987. * @param [in] aadSz Length of additional authentication data.
  33988. * @param [in] in Data to encrypt/decrypt.
  33989. * @param [in] inLen Length of encrypted data.
  33990. * @param [out] out Resulting data from encrypt/decrypt.
  33991. * @param [out] outLen Size of resulting data.
  33992. * @param [in] tag Authentication tag for encrypted data.
  33993. * @param [in] heap Dynamic memory allocation data hint.
  33994. * @param [in] enc 1 when encrypting, 0 when decrypting.
  33995. * @return 0 on success.
  33996. * @return MEMORY_E when dynamic memory allocation fails.
  33997. * @return Other value when encryption/decryption fails.
  33998. */
  33999. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  34000. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  34001. void* heap, int enc)
  34002. {
  34003. int ret;
  34004. #ifdef WOLFSSL_SMALL_STACK
  34005. wc_Sm4* sm4;
  34006. #else
  34007. wc_Sm4 sm4[1];
  34008. #endif
  34009. (void)heap;
  34010. #ifdef WOLFSSL_SMALL_STACK
  34011. sm4 = (wc_Sm4*)XMALLOC(sizeof(wc_Sm4), heap, DYNAMIC_TYPE_TMP_BUFFER);
  34012. if (sm4 == NULL)
  34013. return MEMORY_E;
  34014. #endif
  34015. if (enc) {
  34016. ret = wc_Sm4Init(sm4, NULL, INVALID_DEVID);
  34017. if (ret == 0) {
  34018. ret = wc_Sm4GcmSetKey(sm4, key, keyLen);
  34019. }
  34020. if (ret == 0) {
  34021. ret = wc_Sm4GcmEncrypt(sm4, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  34022. tag, SM4_BLOCK_SIZE, aad, aadSz);
  34023. }
  34024. wc_Sm4Free(sm4);
  34025. }
  34026. else {
  34027. ret = wc_Sm4Init(sm4, NULL, INVALID_DEVID);
  34028. if (ret == 0) {
  34029. ret = wc_Sm4GcmSetKey(sm4, key, keyLen);
  34030. }
  34031. if (ret == 0) {
  34032. ret = wc_Sm4GcmDecrypt(sm4, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  34033. tag, SM$_BLOCK_SIZE, aad, aadSz);
  34034. }
  34035. wc_Sm4Free(sm4);
  34036. }
  34037. #ifdef WOLFSSL_SMALL_STACK
  34038. XFREE(sm4, heap, DYNAMIC_TYPE_TMP_BUFFER);
  34039. #endif
  34040. *outLen = inLen;
  34041. return ret;
  34042. }
  34043. #else
  34044. #error "No encryption algorithm available for default ticket encryption."
  34045. #endif
  34046. /* Choose a key to use for encryption.
  34047. *
  34048. * Generate a new key if the current ones are expired.
  34049. * If the secondary key has not been used and the primary key has expired then
  34050. * generate a new primary key.
  34051. *
  34052. * @param [in] Ticket encryption callback context.
  34053. * @param [in] Session ticket lifetime.
  34054. * @param [out] Index of key to use for encryption.
  34055. * @return 0 on success.
  34056. * @return Other value when random number generation fails.
  34057. */
  34058. static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
  34059. int* keyIdx)
  34060. {
  34061. int ret = 0;
  34062. /* Get new current time as lock may have taken some time. */
  34063. word32 now = LowResTimer();
  34064. /* Check expirary of primary key for encrypt. */
  34065. if (keyCtx->expirary[0] >= now + ticketHint) {
  34066. *keyIdx = 0;
  34067. }
  34068. /* Check expirary of primary key for encrypt. */
  34069. else if (keyCtx->expirary[1] >= now + ticketHint) {
  34070. *keyIdx = 1;
  34071. }
  34072. /* No key available to use. */
  34073. else {
  34074. int genKey;
  34075. /* Generate which ever key is expired for decrypt - primary first. */
  34076. if (keyCtx->expirary[0] < now) {
  34077. genKey = 0;
  34078. }
  34079. else if (keyCtx->expirary[1] < now) {
  34080. genKey = 1;
  34081. }
  34082. /* Timeouts and expirary should not allow this to happen. */
  34083. else {
  34084. return BAD_STATE_E;
  34085. }
  34086. /* Generate the required key */
  34087. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
  34088. WOLFSSL_TICKET_KEY_SZ);
  34089. if (ret == 0) {
  34090. keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
  34091. *keyIdx = genKey;
  34092. }
  34093. }
  34094. return ret;
  34095. }
  34096. /* Default Session Ticket encryption/decryption callback.
  34097. *
  34098. * Use ChaCha20-Poly1305, AES-GCM or SM4-GCM to encrypt/decrypt the ticket.
  34099. * Two keys are used:
  34100. * - When the first expires for encryption, then use the other.
  34101. * - Don't encrypt with key if the ticket lifetime will go beyond expirary.
  34102. * - Generate a new primary key when primary key expired for decrypt and
  34103. * no secondary key is activate for encryption.
  34104. * - Generate a new secondary key when expired and needed.
  34105. * - Calculate expirary starting from first encrypted ticket.
  34106. * - Key name has last bit set to indicate index of key.
  34107. * Keys expire for decryption after ticket key lifetime from the first encrypted
  34108. * ticket.
  34109. * Keys can only be use for encryption while the ticket hint does not exceed
  34110. * the key lifetime.
  34111. * Lifetime of a key must be greater than the lifetime of a ticket. This means
  34112. * that if one ticket is only valid for decryption, then the other will be
  34113. * valid for encryption.
  34114. * AAD = key_name | iv | ticket len (16-bits network order)
  34115. *
  34116. * @param [in] ssl SSL connection.
  34117. * @param [in,out] key_name Name of key from client.
  34118. * Encrypt: name of key returned.
  34119. * Decrypt: name from ticket message to check.
  34120. * @param [in] iv IV to use in encryption/decryption.
  34121. * @param [in] mac MAC for authentication of encrypted data.
  34122. * @param [in] enc 1 when encrypting ticket, 0 when decrypting.
  34123. * @param [in,out] ticket Encrypted/decrypted session ticket bytes.
  34124. * @param [in] inLen Length of incoming ticket.
  34125. * @param [out] outLen Length of outgoing ticket.
  34126. * @param [in] userCtx Context for encryption/decryption of ticket.
  34127. * @return WOLFSSL_TICKET_RET_OK when successful.
  34128. * @return WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
  34129. * be created for TLS 1.2 and below.
  34130. * @return WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
  34131. * decrypted ticket.
  34132. * @return WOLFSSL_TICKET_RET_FATAL when key name does not match.
  34133. */
  34134. static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
  34135. byte iv[WOLFSSL_TICKET_IV_SZ],
  34136. byte mac[WOLFSSL_TICKET_MAC_SZ],
  34137. int enc, byte* ticket, int inLen, int* outLen,
  34138. void* userCtx)
  34139. {
  34140. int ret;
  34141. TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
  34142. WOLFSSL_CTX* ctx = keyCtx->ctx;
  34143. word16 sLen = XHTONS((word16)inLen);
  34144. byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
  34145. int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
  34146. byte* p = aad;
  34147. int keyIdx = 0;
  34148. WOLFSSL_ENTER("DefTicketEncCb");
  34149. /* Check we have setup the RNG, name and primary key. */
  34150. if (keyCtx->expirary[0] == 0) {
  34151. #ifndef SINGLE_THREADED
  34152. /* Lock around access to expirary and key - stop initial key being
  34153. * generated twice at the same time. */
  34154. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  34155. WOLFSSL_MSG("Couldn't lock key context mutex");
  34156. return WOLFSSL_TICKET_RET_REJECT;
  34157. }
  34158. #endif
  34159. /* Sets expirary of primary key in setup. */
  34160. ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
  34161. #ifndef SINGLE_THREADED
  34162. wc_UnLockMutex(&keyCtx->mutex);
  34163. #endif
  34164. if (ret != 0)
  34165. return ret;
  34166. }
  34167. if (enc) {
  34168. /* Return the name of the key - missing key index. */
  34169. XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  34170. /* Generate a new IV into buffer to be returned.
  34171. * Don't use the RNG in keyCtx as it's for generating private data. */
  34172. ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
  34173. if (ret != 0) {
  34174. return WOLFSSL_TICKET_RET_REJECT;
  34175. }
  34176. }
  34177. else {
  34178. /* Mask of last bit that is the key index. */
  34179. byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
  34180. /* For decryption, see if we know this key - check all but last byte. */
  34181. if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
  34182. return WOLFSSL_TICKET_RET_FATAL;
  34183. }
  34184. /* Ensure last byte without index bit matches too. */
  34185. if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
  34186. return WOLFSSL_TICKET_RET_FATAL;
  34187. }
  34188. }
  34189. /* Build AAD from: key name, iv, and length of ticket. */
  34190. XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  34191. p += WOLFSSL_TICKET_NAME_SZ;
  34192. XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
  34193. p += WOLFSSL_TICKET_IV_SZ;
  34194. XMEMCPY(p, &sLen, sizeof(sLen));
  34195. /* Encrypt ticket. */
  34196. if (enc) {
  34197. word32 now;
  34198. now = LowResTimer();
  34199. /* As long as encryption expirary isn't imminent - no lock. */
  34200. if (keyCtx->expirary[0] > now + ctx->ticketHint) {
  34201. keyIdx = 0;
  34202. }
  34203. else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
  34204. keyIdx = 1;
  34205. }
  34206. else {
  34207. #ifndef SINGLE_THREADED
  34208. /* Lock around access to expirary and key - stop key being generated
  34209. * twice at the same time. */
  34210. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  34211. WOLFSSL_MSG("Couldn't lock key context mutex");
  34212. return WOLFSSL_TICKET_RET_REJECT;
  34213. }
  34214. #endif
  34215. ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
  34216. #ifndef SINGLE_THREADED
  34217. wc_UnLockMutex(&keyCtx->mutex);
  34218. #endif
  34219. if (ret != 0) {
  34220. return WOLFSSL_TICKET_RET_REJECT;
  34221. }
  34222. }
  34223. /* Set the name of the key to the index chosen. */
  34224. key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  34225. /* Update AAD too. */
  34226. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  34227. /* Encrypt ticket data. */
  34228. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  34229. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  34230. 1);
  34231. if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
  34232. }
  34233. /* Decrypt ticket. */
  34234. else {
  34235. /* Get index of key from name. */
  34236. keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
  34237. /* Update AAD with index. */
  34238. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  34239. /* Check expirary */
  34240. if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
  34241. return WOLFSSL_TICKET_RET_REJECT;
  34242. }
  34243. /* Decrypt ticket data. */
  34244. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  34245. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  34246. 0);
  34247. if (ret != 0) {
  34248. return WOLFSSL_TICKET_RET_REJECT;
  34249. }
  34250. }
  34251. #ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
  34252. if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
  34253. return WOLFSSL_TICKET_RET_CREATE;
  34254. #endif
  34255. return WOLFSSL_TICKET_RET_OK;
  34256. }
  34257. #endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
  34258. #endif /* HAVE_SESSION_TICKET */
  34259. #ifndef WOLFSSL_NO_TLS12
  34260. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  34261. !defined(NO_WOLFSSL_SERVER)
  34262. /* handle generation of server's hello_request (0) */
  34263. int SendHelloRequest(WOLFSSL* ssl)
  34264. {
  34265. byte* output;
  34266. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  34267. int ret;
  34268. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  34269. WOLFSSL_ENTER("SendHelloRequest");
  34270. if (IsEncryptionOn(ssl, 1))
  34271. sendSz += MAX_MSG_EXTRA;
  34272. if (ssl->options.dtls)
  34273. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  34274. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  34275. * is not advanced yet */
  34276. ssl->options.buildingMsg = 1;
  34277. /* check for available size */
  34278. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  34279. return ret;
  34280. /* get output buffer */
  34281. output = GetOutputBuffer(ssl);
  34282. AddHeaders(output, 0, hello_request, ssl);
  34283. if (IsEncryptionOn(ssl, 1)) {
  34284. byte* input;
  34285. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  34286. int recordHeaderSz = RECORD_HEADER_SZ;
  34287. if (ssl->options.dtls) {
  34288. recordHeaderSz += DTLS_RECORD_EXTRA;
  34289. inputSz += DTLS_HANDSHAKE_EXTRA;
  34290. }
  34291. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  34292. if (input == NULL)
  34293. return MEMORY_E;
  34294. XMEMCPY(input, output + recordHeaderSz, inputSz);
  34295. #ifdef WOLFSSL_DTLS
  34296. if (IsDtlsNotSctpMode(ssl) &&
  34297. (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
  34298. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  34299. return ret;
  34300. }
  34301. #endif
  34302. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  34303. handshake, 0, 0, 0, CUR_ORDER);
  34304. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  34305. if (sendSz < 0)
  34306. return sendSz;
  34307. }
  34308. ssl->buffers.outputBuffer.length += sendSz;
  34309. ssl->options.buildingMsg = 0;
  34310. ret = SendBuffered(ssl);
  34311. WOLFSSL_LEAVE("SendHelloRequest", ret);
  34312. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  34313. return ret;
  34314. }
  34315. #endif /* HAVE_SECURE_RENEGOTIATION && !NO_WOLFSSL_SERVER */
  34316. #ifdef WOLFSSL_DTLS
  34317. /* handle generation of DTLS hello_verify_request (3) */
  34318. int SendHelloVerifyRequest(WOLFSSL* ssl,
  34319. const byte* cookie, byte cookieSz)
  34320. {
  34321. byte* output;
  34322. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  34323. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  34324. int sendSz = length + idx;
  34325. int ret;
  34326. /* are we in scr */
  34327. if (IsEncryptionOn(ssl, 1)) {
  34328. sendSz += MAX_MSG_EXTRA;
  34329. }
  34330. /* reset hashes */
  34331. ret = InitHandshakeHashes(ssl);
  34332. if (ret != 0)
  34333. return ret;
  34334. /* check for available size */
  34335. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  34336. return ret;
  34337. /* get output buffer */
  34338. output = GetOutputBuffer(ssl);
  34339. /* Hello Verify Request should use the same sequence number
  34340. * as the Client Hello unless we are in renegotiation then
  34341. * don't change numbers */
  34342. #ifdef HAVE_SECURE_RENEGOTIATION
  34343. if (!IsSCR(ssl))
  34344. #endif
  34345. {
  34346. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  34347. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  34348. }
  34349. AddHeaders(output, length, hello_verify_request, ssl);
  34350. output[idx++] = DTLS_MAJOR;
  34351. output[idx++] = DTLS_MINOR;
  34352. output[idx++] = cookieSz;
  34353. if (cookie == NULL || cookieSz == 0)
  34354. return COOKIE_ERROR;
  34355. XMEMCPY(output + idx, cookie, cookieSz);
  34356. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  34357. if (ssl->hsInfoOn)
  34358. AddPacketName(ssl, "HelloVerifyRequest");
  34359. if (ssl->toInfoOn) {
  34360. ret = AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  34361. sendSz, WRITE_PROTO, 0, ssl->heap);
  34362. if (ret != 0)
  34363. return ret;
  34364. }
  34365. #endif
  34366. /* are we in scr */
  34367. if (IsEncryptionOn(ssl, 1)) {
  34368. byte* input;
  34369. int inputSz = DTLS_HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
  34370. int recordHeaderSz = DTLS_RECORD_HEADER_SZ;
  34371. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  34372. if (input == NULL)
  34373. return MEMORY_E;
  34374. XMEMCPY(input, output + recordHeaderSz, inputSz);
  34375. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  34376. handshake, 0, 0, 0, CUR_ORDER);
  34377. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  34378. if (sendSz < 0)
  34379. return sendSz;
  34380. }
  34381. ssl->buffers.outputBuffer.length += sendSz;
  34382. return SendBuffered(ssl);
  34383. }
  34384. #endif /* WOLFSSL_DTLS */
  34385. typedef struct DckeArgs {
  34386. byte* output; /* not allocated */
  34387. word32 length;
  34388. word32 idx;
  34389. word32 begin;
  34390. word32 sigSz;
  34391. #ifndef NO_RSA
  34392. int lastErr;
  34393. #endif
  34394. } DckeArgs;
  34395. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  34396. {
  34397. DckeArgs* args = (DckeArgs*)pArgs;
  34398. (void)ssl;
  34399. (void)args;
  34400. }
  34401. /* handle processing client_key_exchange (16) */
  34402. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  34403. word32 size)
  34404. {
  34405. int ret;
  34406. #ifdef WOLFSSL_ASYNC_CRYPT
  34407. DckeArgs* args = NULL;
  34408. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  34409. #else
  34410. DckeArgs args[1];
  34411. #endif
  34412. (void)size;
  34413. (void)input;
  34414. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  34415. WOLFSSL_ENTER("DoClientKeyExchange");
  34416. #ifdef WOLFSSL_ASYNC_CRYPT
  34417. if (ssl->async == NULL) {
  34418. ssl->async = (struct WOLFSSL_ASYNC*)
  34419. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  34420. DYNAMIC_TYPE_ASYNC);
  34421. if (ssl->async == NULL)
  34422. ERROR_OUT(MEMORY_E, exit_dcke);
  34423. }
  34424. args = (DckeArgs*)ssl->async->args;
  34425. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  34426. if (ret != WC_NO_PENDING_E) {
  34427. /* Check for error */
  34428. if (ret < 0)
  34429. goto exit_dcke;
  34430. }
  34431. else
  34432. #endif /* WOLFSSL_ASYNC_CRYPT */
  34433. {
  34434. /* Reset state */
  34435. ret = 0;
  34436. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  34437. XMEMSET(args, 0, sizeof(DckeArgs));
  34438. args->idx = *inOutIdx;
  34439. args->begin = *inOutIdx;
  34440. #ifdef WOLFSSL_ASYNC_CRYPT
  34441. ssl->async->freeArgs = FreeDckeArgs;
  34442. #endif
  34443. }
  34444. /* Do Client Key Exchange State Machine */
  34445. switch(ssl->options.asyncState)
  34446. {
  34447. case TLS_ASYNC_BEGIN:
  34448. {
  34449. /* Sanity checks */
  34450. /* server side checked in SanityCheckMsgReceived */
  34451. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  34452. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  34453. SendAlert(ssl, alert_fatal, unexpected_message);
  34454. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  34455. }
  34456. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  34457. if (ssl->options.verifyPeer &&
  34458. (ssl->options.mutualAuth || ssl->options.failNoCert)) {
  34459. if (!ssl->options.havePeerCert) {
  34460. WOLFSSL_MSG("client didn't present peer cert");
  34461. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  34462. }
  34463. }
  34464. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  34465. if (!ssl->options.havePeerCert &&
  34466. !ssl->options.usingPSK_cipher) {
  34467. WOLFSSL_MSG("client didn't present peer cert");
  34468. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  34469. }
  34470. }
  34471. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  34472. #if defined(WOLFSSL_CALLBACKS)
  34473. if (ssl->hsInfoOn) {
  34474. AddPacketName(ssl, "ClientKeyExchange");
  34475. }
  34476. if (ssl->toInfoOn) {
  34477. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  34478. }
  34479. #endif
  34480. if (ssl->arrays->preMasterSecret == NULL) {
  34481. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  34482. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  34483. ssl->heap, DYNAMIC_TYPE_SECRET);
  34484. if (ssl->arrays->preMasterSecret == NULL) {
  34485. ERROR_OUT(MEMORY_E, exit_dcke);
  34486. }
  34487. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  34488. }
  34489. switch (ssl->specs.kea) {
  34490. #ifndef NO_RSA
  34491. case rsa_kea:
  34492. {
  34493. break;
  34494. } /* rsa_kea */
  34495. #endif /* !NO_RSA */
  34496. #ifndef NO_PSK
  34497. case psk_kea:
  34498. {
  34499. /* sanity check that PSK server callback has been set */
  34500. if (ssl->options.server_psk_cb == NULL) {
  34501. WOLFSSL_MSG("No server PSK callback set");
  34502. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  34503. }
  34504. break;
  34505. }
  34506. #endif /* !NO_PSK */
  34507. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  34508. defined(HAVE_CURVE448)
  34509. case ecc_diffie_hellman_kea:
  34510. {
  34511. break;
  34512. }
  34513. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  34514. #ifndef NO_DH
  34515. case diffie_hellman_kea:
  34516. {
  34517. break;
  34518. }
  34519. #endif /* !NO_DH */
  34520. #if !defined(NO_DH) && !defined(NO_PSK)
  34521. case dhe_psk_kea:
  34522. {
  34523. /* sanity check that PSK server callback has been set */
  34524. if (ssl->options.server_psk_cb == NULL) {
  34525. WOLFSSL_MSG("No server PSK callback set");
  34526. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  34527. }
  34528. break;
  34529. }
  34530. #endif /* !NO_DH && !NO_PSK */
  34531. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  34532. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  34533. case ecdhe_psk_kea:
  34534. {
  34535. /* sanity check that PSK server callback has been set */
  34536. if (ssl->options.server_psk_cb == NULL) {
  34537. WOLFSSL_MSG("No server PSK callback set");
  34538. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  34539. }
  34540. break;
  34541. }
  34542. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  34543. default:
  34544. WOLFSSL_MSG("Bad kea type");
  34545. ret = BAD_KEA_TYPE_E;
  34546. } /* switch (ssl->specs.kea) */
  34547. /* Check for error */
  34548. if (ret != 0) {
  34549. goto exit_dcke;
  34550. }
  34551. /* Advance state and proceed */
  34552. ssl->options.asyncState = TLS_ASYNC_BUILD;
  34553. } /* TLS_ASYNC_BEGIN */
  34554. FALL_THROUGH;
  34555. case TLS_ASYNC_BUILD:
  34556. {
  34557. switch (ssl->specs.kea) {
  34558. #ifndef NO_RSA
  34559. case rsa_kea:
  34560. {
  34561. word32 keySz;
  34562. ssl->buffers.keyType = rsa_sa_algo;
  34563. ret = DecodePrivateKey(ssl, &keySz);
  34564. if (ret != 0) {
  34565. goto exit_dcke;
  34566. }
  34567. args->length = (word32)keySz;
  34568. ssl->arrays->preMasterSz = SECRET_LEN;
  34569. if (ssl->options.tls) {
  34570. word16 check;
  34571. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  34572. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34573. }
  34574. ato16(input + args->idx, &check);
  34575. args->idx += OPAQUE16_LEN;
  34576. if ((word32)check != args->length) {
  34577. WOLFSSL_MSG("RSA explicit size doesn't match");
  34578. #ifdef WOLFSSL_EXTRA_ALERTS
  34579. SendAlert(ssl, alert_fatal, bad_record_mac);
  34580. #endif
  34581. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  34582. }
  34583. }
  34584. if ((args->idx - args->begin) + args->length > size) {
  34585. WOLFSSL_MSG("RSA message too big");
  34586. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34587. }
  34588. /* pre-load PreMasterSecret with RNG data */
  34589. ret = wc_RNG_GenerateBlock(ssl->rng,
  34590. &ssl->arrays->preMasterSecret[VERSION_SZ],
  34591. SECRET_LEN - VERSION_SZ);
  34592. if (ret != 0) {
  34593. goto exit_dcke;
  34594. }
  34595. args->output = NULL;
  34596. break;
  34597. } /* rsa_kea */
  34598. #endif /* !NO_RSA */
  34599. #ifndef NO_PSK
  34600. case psk_kea:
  34601. {
  34602. byte* pms = ssl->arrays->preMasterSecret;
  34603. word16 ci_sz;
  34604. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  34605. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34606. }
  34607. ato16(input + args->idx, &ci_sz);
  34608. args->idx += OPAQUE16_LEN;
  34609. if (ci_sz > MAX_PSK_ID_LEN) {
  34610. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  34611. }
  34612. if ((args->idx - args->begin) + ci_sz > size) {
  34613. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34614. }
  34615. XMEMCPY(ssl->arrays->client_identity,
  34616. input + args->idx, ci_sz);
  34617. args->idx += ci_sz;
  34618. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  34619. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  34620. ssl->arrays->client_identity, ssl->arrays->psk_key,
  34621. MAX_PSK_KEY_LEN);
  34622. if (ssl->arrays->psk_keySz == 0 ||
  34623. (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
  34624. (int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
  34625. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  34626. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  34627. SendAlert(ssl, alert_fatal,
  34628. unknown_psk_identity);
  34629. #endif
  34630. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  34631. }
  34632. /* SERVER: Pre-shared Key for peer authentication. */
  34633. ssl->options.peerAuthGood = 1;
  34634. /* make psk pre master secret */
  34635. if ((int)ssl->arrays->psk_keySz > 0) {
  34636. /* length of key + length 0s + length of key + key */
  34637. c16toa((word16) ssl->arrays->psk_keySz, pms);
  34638. pms += OPAQUE16_LEN;
  34639. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  34640. pms += ssl->arrays->psk_keySz;
  34641. c16toa((word16) ssl->arrays->psk_keySz, pms);
  34642. pms += OPAQUE16_LEN;
  34643. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  34644. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
  34645. (OPAQUE16_LEN * 2);
  34646. }
  34647. ssl->arrays->psk_keySz = 0; /* no further need */
  34648. break;
  34649. }
  34650. #endif /* !NO_PSK */
  34651. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  34652. defined(HAVE_CURVE448)
  34653. case ecc_diffie_hellman_kea:
  34654. {
  34655. #ifdef HAVE_ECC
  34656. ecc_key* private_key = ssl->eccTempKey;
  34657. /* handle static private key */
  34658. if (ssl->specs.static_ecdh &&
  34659. ssl->ecdhCurveOID != ECC_X25519_OID &&
  34660. ssl->ecdhCurveOID != ECC_X448_OID) {
  34661. word32 keySz;
  34662. ssl->buffers.keyType = ecc_dsa_sa_algo;
  34663. ret = DecodePrivateKey(ssl, &keySz);
  34664. if (ret != 0) {
  34665. goto exit_dcke;
  34666. }
  34667. private_key = (ecc_key*)ssl->hsKey;
  34668. }
  34669. #endif
  34670. /* import peer ECC key */
  34671. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  34672. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34673. }
  34674. args->length = input[args->idx++];
  34675. if ((args->idx - args->begin) + args->length > size) {
  34676. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34677. }
  34678. #ifdef HAVE_CURVE25519
  34679. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  34680. #ifdef HAVE_PK_CALLBACKS
  34681. /* if callback then use it for shared secret */
  34682. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  34683. break;
  34684. }
  34685. #endif
  34686. if (ssl->peerX25519Key == NULL) {
  34687. /* alloc/init on demand */
  34688. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  34689. (void**)&ssl->peerX25519Key);
  34690. if (ret != 0) {
  34691. goto exit_dcke;
  34692. }
  34693. } else if (ssl->peerX25519KeyPresent) {
  34694. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  34695. ssl->peerX25519Key);
  34696. ssl->peerX25519KeyPresent = 0;
  34697. if (ret != 0) {
  34698. goto exit_dcke;
  34699. }
  34700. }
  34701. if ((ret = wc_curve25519_check_public(
  34702. input + args->idx, args->length,
  34703. EC25519_LITTLE_ENDIAN)) != 0) {
  34704. #ifdef WOLFSSL_EXTRA_ALERTS
  34705. if (ret == BUFFER_E)
  34706. SendAlert(ssl, alert_fatal, decode_error);
  34707. else if (ret == ECC_OUT_OF_RANGE_E)
  34708. SendAlert(ssl, alert_fatal, bad_record_mac);
  34709. else {
  34710. SendAlert(ssl, alert_fatal,
  34711. illegal_parameter);
  34712. }
  34713. #endif
  34714. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  34715. }
  34716. if (wc_curve25519_import_public_ex(
  34717. input + args->idx, args->length,
  34718. ssl->peerX25519Key,
  34719. EC25519_LITTLE_ENDIAN)) {
  34720. #ifdef WOLFSSL_EXTRA_ALERTS
  34721. SendAlert(ssl, alert_fatal, illegal_parameter);
  34722. #endif
  34723. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  34724. }
  34725. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  34726. ssl->peerX25519KeyPresent = 1;
  34727. break;
  34728. }
  34729. #endif
  34730. #ifdef HAVE_CURVE448
  34731. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  34732. #ifdef HAVE_PK_CALLBACKS
  34733. /* if callback then use it for shared secret */
  34734. if (ssl->ctx->X448SharedSecretCb != NULL) {
  34735. break;
  34736. }
  34737. #endif
  34738. if (ssl->peerX448Key == NULL) {
  34739. /* alloc/init on demand */
  34740. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  34741. (void**)&ssl->peerX448Key);
  34742. if (ret != 0) {
  34743. goto exit_dcke;
  34744. }
  34745. } else if (ssl->peerX448KeyPresent) {
  34746. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  34747. ssl->peerX448Key);
  34748. ssl->peerX448KeyPresent = 0;
  34749. if (ret != 0) {
  34750. goto exit_dcke;
  34751. }
  34752. }
  34753. if ((ret = wc_curve448_check_public(
  34754. input + args->idx, args->length,
  34755. EC448_LITTLE_ENDIAN)) != 0) {
  34756. #ifdef WOLFSSL_EXTRA_ALERTS
  34757. if (ret == BUFFER_E)
  34758. SendAlert(ssl, alert_fatal, decode_error);
  34759. else if (ret == ECC_OUT_OF_RANGE_E)
  34760. SendAlert(ssl, alert_fatal, bad_record_mac);
  34761. else {
  34762. SendAlert(ssl, alert_fatal,
  34763. illegal_parameter);
  34764. }
  34765. #endif
  34766. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  34767. }
  34768. if (wc_curve448_import_public_ex(
  34769. input + args->idx, args->length,
  34770. ssl->peerX448Key,
  34771. EC448_LITTLE_ENDIAN)) {
  34772. #ifdef WOLFSSL_EXTRA_ALERTS
  34773. SendAlert(ssl, alert_fatal, illegal_parameter);
  34774. #endif
  34775. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  34776. }
  34777. ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
  34778. ssl->peerX448KeyPresent = 1;
  34779. break;
  34780. }
  34781. #endif
  34782. #ifdef HAVE_ECC
  34783. #ifdef HAVE_PK_CALLBACKS
  34784. /* if callback then use it for shared secret */
  34785. if (ssl->ctx->EccSharedSecretCb != NULL) {
  34786. break;
  34787. }
  34788. #endif
  34789. if (!ssl->specs.static_ecdh &&
  34790. ssl->eccTempKeyPresent == 0) {
  34791. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  34792. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  34793. }
  34794. if (ssl->peerEccKey == NULL) {
  34795. /* alloc/init on demand */
  34796. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  34797. (void**)&ssl->peerEccKey);
  34798. if (ret != 0) {
  34799. goto exit_dcke;
  34800. }
  34801. } else if (ssl->peerEccKeyPresent) {
  34802. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  34803. ssl->peerEccKey);
  34804. ssl->peerEccKeyPresent = 0;
  34805. if (ret != 0) {
  34806. goto exit_dcke;
  34807. }
  34808. }
  34809. if (wc_ecc_import_x963_ex(input + args->idx,
  34810. args->length, ssl->peerEccKey,
  34811. private_key->dp->id)) {
  34812. #ifdef WOLFSSL_EXTRA_ALERTS
  34813. SendAlert(ssl, alert_fatal, illegal_parameter);
  34814. #endif
  34815. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  34816. }
  34817. ssl->arrays->preMasterSz = private_key->dp->size;
  34818. ssl->peerEccKeyPresent = 1;
  34819. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  34820. /* client_hello may have sent FFEDH2048, which sets namedGroup,
  34821. but that is not being used, so clear it */
  34822. /* resolves issue with server side wolfSSL_get_curve_name */
  34823. ssl->namedGroup = 0;
  34824. #endif
  34825. #endif /* HAVE_ECC */
  34826. break;
  34827. }
  34828. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  34829. #ifndef NO_DH
  34830. case diffie_hellman_kea:
  34831. {
  34832. word16 clientPubSz;
  34833. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  34834. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34835. }
  34836. ato16(input + args->idx, &clientPubSz);
  34837. args->idx += OPAQUE16_LEN;
  34838. if ((args->idx - args->begin) + clientPubSz > size) {
  34839. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34840. }
  34841. args->sigSz = clientPubSz;
  34842. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  34843. (void**)&ssl->buffers.serverDH_Key);
  34844. if (ret != 0) {
  34845. goto exit_dcke;
  34846. }
  34847. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  34848. ssl->buffers.serverDH_P.buffer,
  34849. ssl->buffers.serverDH_P.length,
  34850. ssl->buffers.serverDH_G.buffer,
  34851. ssl->buffers.serverDH_G.length);
  34852. /* set the max agree result size */
  34853. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  34854. break;
  34855. }
  34856. #endif /* !NO_DH */
  34857. #if !defined(NO_DH) && !defined(NO_PSK)
  34858. case dhe_psk_kea:
  34859. {
  34860. word16 clientSz;
  34861. /* Read in the PSK hint */
  34862. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  34863. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34864. }
  34865. ato16(input + args->idx, &clientSz);
  34866. args->idx += OPAQUE16_LEN;
  34867. if (clientSz > MAX_PSK_ID_LEN) {
  34868. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  34869. }
  34870. if ((args->idx - args->begin) + clientSz > size) {
  34871. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34872. }
  34873. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  34874. clientSz);
  34875. args->idx += clientSz;
  34876. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  34877. /* Read in the DHE business */
  34878. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  34879. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34880. }
  34881. ato16(input + args->idx, &clientSz);
  34882. args->idx += OPAQUE16_LEN;
  34883. if ((args->idx - args->begin) + clientSz > size) {
  34884. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34885. }
  34886. args->sigSz = clientSz;
  34887. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  34888. (void**)&ssl->buffers.serverDH_Key);
  34889. if (ret != 0) {
  34890. goto exit_dcke;
  34891. }
  34892. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  34893. ssl->buffers.serverDH_P.buffer,
  34894. ssl->buffers.serverDH_P.length,
  34895. ssl->buffers.serverDH_G.buffer,
  34896. ssl->buffers.serverDH_G.length);
  34897. break;
  34898. }
  34899. #endif /* !NO_DH && !NO_PSK */
  34900. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  34901. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  34902. case ecdhe_psk_kea:
  34903. {
  34904. word16 clientSz;
  34905. /* Read in the PSK hint */
  34906. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  34907. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34908. }
  34909. ato16(input + args->idx, &clientSz);
  34910. args->idx += OPAQUE16_LEN;
  34911. if (clientSz > MAX_PSK_ID_LEN) {
  34912. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  34913. }
  34914. if ((args->idx - args->begin) + clientSz > size) {
  34915. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34916. }
  34917. XMEMCPY(ssl->arrays->client_identity,
  34918. input + args->idx, clientSz);
  34919. args->idx += clientSz;
  34920. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  34921. /* import peer ECC key */
  34922. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  34923. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34924. }
  34925. args->length = input[args->idx++];
  34926. if ((args->idx - args->begin) + args->length > size) {
  34927. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  34928. }
  34929. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  34930. #ifdef HAVE_CURVE25519
  34931. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  34932. #ifdef HAVE_PK_CALLBACKS
  34933. /* if callback then use it for shared secret */
  34934. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  34935. break;
  34936. }
  34937. #endif
  34938. if (ssl->eccTempKeyPresent == 0) {
  34939. WOLFSSL_MSG(
  34940. "X25519 ephemeral key not made correctly");
  34941. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  34942. }
  34943. if (ssl->peerX25519Key == NULL) {
  34944. /* alloc/init on demand */
  34945. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  34946. (void**)&ssl->peerX25519Key);
  34947. if (ret != 0) {
  34948. goto exit_dcke;
  34949. }
  34950. } else if (ssl->peerX25519KeyPresent) {
  34951. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  34952. ssl->peerX25519Key);
  34953. ssl->peerX25519KeyPresent = 0;
  34954. if (ret != 0) {
  34955. goto exit_dcke;
  34956. }
  34957. }
  34958. if ((ret = wc_curve25519_check_public(
  34959. input + args->idx, args->length,
  34960. EC25519_LITTLE_ENDIAN)) != 0) {
  34961. #ifdef WOLFSSL_EXTRA_ALERTS
  34962. if (ret == BUFFER_E)
  34963. SendAlert(ssl, alert_fatal, decode_error);
  34964. else if (ret == ECC_OUT_OF_RANGE_E)
  34965. SendAlert(ssl, alert_fatal, bad_record_mac);
  34966. else {
  34967. SendAlert(ssl, alert_fatal,
  34968. illegal_parameter);
  34969. }
  34970. #endif
  34971. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  34972. }
  34973. if (wc_curve25519_import_public_ex(
  34974. input + args->idx, args->length,
  34975. ssl->peerX25519Key,
  34976. EC25519_LITTLE_ENDIAN)) {
  34977. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  34978. }
  34979. ssl->peerX25519KeyPresent = 1;
  34980. break;
  34981. }
  34982. #endif
  34983. #ifdef HAVE_CURVE448
  34984. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  34985. #ifdef HAVE_PK_CALLBACKS
  34986. /* if callback then use it for shared secret */
  34987. if (ssl->ctx->X448SharedSecretCb != NULL) {
  34988. break;
  34989. }
  34990. #endif
  34991. if (ssl->eccTempKeyPresent == 0) {
  34992. WOLFSSL_MSG(
  34993. "X448 ephemeral key not made correctly");
  34994. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  34995. }
  34996. if (ssl->peerX448Key == NULL) {
  34997. /* alloc/init on demand */
  34998. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  34999. (void**)&ssl->peerX448Key);
  35000. if (ret != 0) {
  35001. goto exit_dcke;
  35002. }
  35003. } else if (ssl->peerX448KeyPresent) {
  35004. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  35005. ssl->peerX448Key);
  35006. ssl->peerX448KeyPresent = 0;
  35007. if (ret != 0) {
  35008. goto exit_dcke;
  35009. }
  35010. }
  35011. if ((ret = wc_curve448_check_public(
  35012. input + args->idx, args->length,
  35013. EC448_LITTLE_ENDIAN)) != 0) {
  35014. #ifdef WOLFSSL_EXTRA_ALERTS
  35015. if (ret == BUFFER_E)
  35016. SendAlert(ssl, alert_fatal, decode_error);
  35017. else if (ret == ECC_OUT_OF_RANGE_E)
  35018. SendAlert(ssl, alert_fatal, bad_record_mac);
  35019. else {
  35020. SendAlert(ssl, alert_fatal,
  35021. illegal_parameter);
  35022. }
  35023. #endif
  35024. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  35025. }
  35026. if (wc_curve448_import_public_ex(
  35027. input + args->idx, args->length,
  35028. ssl->peerX448Key,
  35029. EC448_LITTLE_ENDIAN)) {
  35030. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  35031. }
  35032. ssl->peerX448KeyPresent = 1;
  35033. break;
  35034. }
  35035. #endif
  35036. #ifdef HAVE_PK_CALLBACKS
  35037. /* if callback then use it for shared secret */
  35038. if (ssl->ctx->EccSharedSecretCb != NULL) {
  35039. break;
  35040. }
  35041. #endif
  35042. if (ssl->eccTempKeyPresent == 0) {
  35043. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  35044. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  35045. }
  35046. if (ssl->peerEccKey == NULL) {
  35047. /* alloc/init on demand */
  35048. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  35049. (void**)&ssl->peerEccKey);
  35050. if (ret != 0) {
  35051. goto exit_dcke;
  35052. }
  35053. }
  35054. else if (ssl->peerEccKeyPresent) {
  35055. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  35056. ssl->peerEccKey);
  35057. ssl->peerEccKeyPresent = 0;
  35058. if (ret != 0) {
  35059. goto exit_dcke;
  35060. }
  35061. }
  35062. if (wc_ecc_import_x963_ex(input + args->idx,
  35063. args->length, ssl->peerEccKey,
  35064. ssl->eccTempKey->dp->id)) {
  35065. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  35066. }
  35067. ssl->peerEccKeyPresent = 1;
  35068. break;
  35069. }
  35070. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  35071. default:
  35072. ret = BAD_KEA_TYPE_E;
  35073. } /* switch (ssl->specs.kea) */
  35074. /* Check for error */
  35075. if (ret != 0) {
  35076. goto exit_dcke;
  35077. }
  35078. /* Advance state and proceed */
  35079. ssl->options.asyncState = TLS_ASYNC_DO;
  35080. } /* TLS_ASYNC_BUILD */
  35081. FALL_THROUGH;
  35082. case TLS_ASYNC_DO:
  35083. {
  35084. switch (ssl->specs.kea) {
  35085. #ifndef NO_RSA
  35086. case rsa_kea:
  35087. {
  35088. RsaKey* key = (RsaKey*)ssl->hsKey;
  35089. int lenErrMask;
  35090. ret = RsaDec(ssl,
  35091. input + args->idx,
  35092. args->length,
  35093. &args->output,
  35094. &args->sigSz,
  35095. key,
  35096. #ifdef HAVE_PK_CALLBACKS
  35097. ssl->buffers.key
  35098. #else
  35099. NULL
  35100. #endif
  35101. );
  35102. /* Errors that can occur here that should be
  35103. * indistinguishable:
  35104. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  35105. */
  35106. #ifdef WOLFSSL_ASYNC_CRYPT
  35107. if (ret == WC_PENDING_E)
  35108. goto exit_dcke;
  35109. #endif
  35110. if (ret == BAD_FUNC_ARG)
  35111. goto exit_dcke;
  35112. lenErrMask = 0 - (SECRET_LEN != args->sigSz);
  35113. args->lastErr = (ret & (~lenErrMask)) |
  35114. (RSA_PAD_E & lenErrMask);
  35115. ret = 0;
  35116. break;
  35117. } /* rsa_kea */
  35118. #endif /* !NO_RSA */
  35119. #ifndef NO_PSK
  35120. case psk_kea:
  35121. {
  35122. break;
  35123. }
  35124. #endif /* !NO_PSK */
  35125. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  35126. defined(HAVE_CURVE448)
  35127. case ecc_diffie_hellman_kea:
  35128. {
  35129. void* private_key = ssl->eccTempKey;
  35130. (void)private_key;
  35131. #ifdef HAVE_CURVE25519
  35132. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  35133. ret = X25519SharedSecret(ssl,
  35134. (curve25519_key*)private_key,
  35135. ssl->peerX25519Key,
  35136. input + args->idx, &args->length,
  35137. ssl->arrays->preMasterSecret,
  35138. &ssl->arrays->preMasterSz,
  35139. WOLFSSL_SERVER_END
  35140. );
  35141. break;
  35142. }
  35143. #endif
  35144. #ifdef HAVE_CURVE448
  35145. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  35146. ret = X448SharedSecret(ssl,
  35147. (curve448_key*)private_key,
  35148. ssl->peerX448Key,
  35149. input + args->idx, &args->length,
  35150. ssl->arrays->preMasterSecret,
  35151. &ssl->arrays->preMasterSz,
  35152. WOLFSSL_SERVER_END
  35153. );
  35154. break;
  35155. }
  35156. #endif
  35157. #ifdef HAVE_ECC
  35158. if (ssl->specs.static_ecdh) {
  35159. private_key = ssl->hsKey;
  35160. }
  35161. /* Generate shared secret */
  35162. ret = EccSharedSecret(ssl,
  35163. (ecc_key*)private_key, ssl->peerEccKey,
  35164. input + args->idx, &args->length,
  35165. ssl->arrays->preMasterSecret,
  35166. &ssl->arrays->preMasterSz,
  35167. WOLFSSL_SERVER_END
  35168. );
  35169. #ifdef WOLFSSL_ASYNC_CRYPT
  35170. if (ret != WC_PENDING_E)
  35171. #endif
  35172. {
  35173. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  35174. (void**)&ssl->peerEccKey);
  35175. ssl->peerEccKeyPresent = 0;
  35176. }
  35177. #endif
  35178. break;
  35179. }
  35180. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  35181. #ifndef NO_DH
  35182. case diffie_hellman_kea:
  35183. {
  35184. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  35185. ssl->buffers.serverDH_Priv.buffer,
  35186. ssl->buffers.serverDH_Priv.length,
  35187. input + args->idx,
  35188. (word16)args->sigSz,
  35189. ssl->arrays->preMasterSecret,
  35190. &ssl->arrays->preMasterSz,
  35191. ssl->buffers.serverDH_P.buffer,
  35192. ssl->buffers.serverDH_P.length);
  35193. break;
  35194. }
  35195. #endif /* !NO_DH */
  35196. #if !defined(NO_DH) && !defined(NO_PSK)
  35197. case dhe_psk_kea:
  35198. {
  35199. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  35200. ssl->buffers.serverDH_Priv.buffer,
  35201. ssl->buffers.serverDH_Priv.length,
  35202. input + args->idx,
  35203. (word16)args->sigSz,
  35204. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  35205. &ssl->arrays->preMasterSz,
  35206. ssl->buffers.serverDH_P.buffer,
  35207. ssl->buffers.serverDH_P.length);
  35208. break;
  35209. }
  35210. #endif /* !NO_DH && !NO_PSK */
  35211. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  35212. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  35213. case ecdhe_psk_kea:
  35214. {
  35215. #ifdef HAVE_CURVE25519
  35216. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  35217. ret = X25519SharedSecret(ssl,
  35218. (curve25519_key*)ssl->eccTempKey,
  35219. ssl->peerX25519Key,
  35220. input + args->idx, &args->length,
  35221. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  35222. &args->sigSz,
  35223. WOLFSSL_SERVER_END
  35224. );
  35225. #ifdef WOLFSSL_ASYNC_CRYPT
  35226. if (ret != WC_PENDING_E)
  35227. #endif
  35228. {
  35229. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  35230. (void**)&ssl->peerX25519Key);
  35231. ssl->peerX25519KeyPresent = 0;
  35232. }
  35233. break;
  35234. }
  35235. #endif
  35236. #ifdef HAVE_CURVE448
  35237. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  35238. ret = X448SharedSecret(ssl,
  35239. (curve448_key*)ssl->eccTempKey,
  35240. ssl->peerX448Key,
  35241. input + args->idx, &args->length,
  35242. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  35243. &args->sigSz,
  35244. WOLFSSL_SERVER_END
  35245. );
  35246. #ifdef WOLFSSL_ASYNC_CRYPT
  35247. if (ret != WC_PENDING_E)
  35248. #endif
  35249. {
  35250. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  35251. (void**)&ssl->peerX448Key);
  35252. ssl->peerX448KeyPresent = 0;
  35253. }
  35254. break;
  35255. }
  35256. #endif
  35257. /* Generate shared secret */
  35258. ret = EccSharedSecret(ssl,
  35259. ssl->eccTempKey, ssl->peerEccKey,
  35260. input + args->idx, &args->length,
  35261. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  35262. &args->sigSz,
  35263. WOLFSSL_SERVER_END
  35264. );
  35265. if (!ssl->specs.static_ecdh
  35266. #ifdef WOLFSSL_ASYNC_CRYPT
  35267. && ret != WC_PENDING_E
  35268. #endif
  35269. ) {
  35270. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  35271. (void**)&ssl->peerEccKey);
  35272. ssl->peerEccKeyPresent = 0;
  35273. }
  35274. break;
  35275. }
  35276. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  35277. default:
  35278. ret = BAD_KEA_TYPE_E;
  35279. } /* switch (ssl->specs.kea) */
  35280. /* Check for error */
  35281. if (ret != 0) {
  35282. goto exit_dcke;
  35283. }
  35284. /* Advance state and proceed */
  35285. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  35286. } /* TLS_ASYNC_DO */
  35287. FALL_THROUGH;
  35288. case TLS_ASYNC_VERIFY:
  35289. {
  35290. switch (ssl->specs.kea) {
  35291. #ifndef NO_RSA
  35292. case rsa_kea:
  35293. {
  35294. byte *tmpRsa;
  35295. byte mask;
  35296. /* Add the signature length to idx */
  35297. args->idx += args->length;
  35298. #ifdef DEBUG_WOLFSSL
  35299. /* check version (debug warning message only) */
  35300. if (args->output != NULL) {
  35301. if (args->output[0] != ssl->chVersion.major ||
  35302. args->output[1] != ssl->chVersion.minor) {
  35303. WOLFSSL_MSG("preMasterSecret version mismatch");
  35304. }
  35305. }
  35306. #endif
  35307. /* RFC5246 7.4.7.1:
  35308. * Treat incorrectly formatted message blocks and/or
  35309. * mismatched version numbers in a manner
  35310. * indistinguishable from correctly formatted RSA blocks
  35311. */
  35312. ret = args->lastErr;
  35313. args->lastErr = 0; /* reset */
  35314. /* On error 'ret' will be negative */
  35315. mask = ((unsigned int)ret >>
  35316. ((sizeof(ret) * 8) - 1)) - 1;
  35317. /* build PreMasterSecret */
  35318. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  35319. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  35320. tmpRsa = input + args->idx - VERSION_SZ - SECRET_LEN;
  35321. ctMaskCopy(~mask, (byte*)&args->output, (byte*)&tmpRsa,
  35322. sizeof(args->output));
  35323. if (args->output != NULL) {
  35324. int i;
  35325. /* Use random secret on error */
  35326. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  35327. ssl->arrays->preMasterSecret[i] =
  35328. ctMaskSel(mask, args->output[i],
  35329. ssl->arrays->preMasterSecret[i]);
  35330. }
  35331. }
  35332. /* preMasterSecret has RNG and version set
  35333. * return proper length and ignore error
  35334. * error will be caught as decryption error
  35335. */
  35336. args->sigSz = SECRET_LEN;
  35337. ret = 0;
  35338. break;
  35339. } /* rsa_kea */
  35340. #endif /* !NO_RSA */
  35341. #ifndef NO_PSK
  35342. case psk_kea:
  35343. {
  35344. break;
  35345. }
  35346. #endif /* !NO_PSK */
  35347. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  35348. defined(HAVE_CURVE448)
  35349. case ecc_diffie_hellman_kea:
  35350. {
  35351. /* skip past the imported peer key */
  35352. args->idx += args->length;
  35353. break;
  35354. }
  35355. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  35356. #ifndef NO_DH
  35357. case diffie_hellman_kea:
  35358. {
  35359. args->idx += (word16)args->sigSz;
  35360. break;
  35361. }
  35362. #endif /* !NO_DH */
  35363. #if !defined(NO_DH) && !defined(NO_PSK)
  35364. case dhe_psk_kea:
  35365. {
  35366. byte* pms = ssl->arrays->preMasterSecret;
  35367. word16 clientSz = (word16)args->sigSz;
  35368. args->idx += clientSz;
  35369. c16toa((word16)ssl->arrays->preMasterSz, pms);
  35370. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  35371. pms += ssl->arrays->preMasterSz;
  35372. /* Use the PSK hint to look up the PSK and add it to the
  35373. * preMasterSecret here. */
  35374. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  35375. ssl->arrays->client_identity, ssl->arrays->psk_key,
  35376. MAX_PSK_KEY_LEN);
  35377. if (ssl->arrays->psk_keySz == 0 ||
  35378. (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
  35379. (int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
  35380. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  35381. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  35382. SendAlert(ssl, alert_fatal,
  35383. unknown_psk_identity);
  35384. #endif
  35385. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  35386. }
  35387. /* SERVER: Pre-shared Key for peer authentication. */
  35388. ssl->options.peerAuthGood = 1;
  35389. if ((int)ssl->arrays->psk_keySz > 0) {
  35390. c16toa((word16) ssl->arrays->psk_keySz, pms);
  35391. pms += OPAQUE16_LEN;
  35392. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  35393. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
  35394. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  35395. }
  35396. ssl->arrays->psk_keySz = 0; /* no further need */
  35397. break;
  35398. }
  35399. #endif /* !NO_DH && !NO_PSK */
  35400. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  35401. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  35402. case ecdhe_psk_kea:
  35403. {
  35404. byte* pms = ssl->arrays->preMasterSecret;
  35405. word16 clientSz = (word16)args->sigSz;
  35406. /* skip past the imported peer key */
  35407. args->idx += args->length;
  35408. /* Add preMasterSecret */
  35409. c16toa(clientSz, pms);
  35410. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  35411. pms += ssl->arrays->preMasterSz;
  35412. /* Use the PSK hint to look up the PSK and add it to the
  35413. * preMasterSecret here. */
  35414. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  35415. ssl->arrays->client_identity, ssl->arrays->psk_key,
  35416. MAX_PSK_KEY_LEN);
  35417. if (ssl->arrays->psk_keySz == 0 ||
  35418. (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
  35419. (int)ssl->arrays->psk_keySz != USE_HW_PSK)) {
  35420. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  35421. }
  35422. /* SERVER: Pre-shared Key for peer authentication. */
  35423. ssl->options.peerAuthGood = 1;
  35424. if ((int)ssl->arrays->psk_keySz > 0) {
  35425. c16toa((word16) ssl->arrays->psk_keySz, pms);
  35426. pms += OPAQUE16_LEN;
  35427. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  35428. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
  35429. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  35430. }
  35431. ssl->arrays->psk_keySz = 0; /* no further need */
  35432. break;
  35433. }
  35434. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  35435. default:
  35436. ret = BAD_KEA_TYPE_E;
  35437. } /* switch (ssl->specs.kea) */
  35438. /* Check for error */
  35439. if (ret != 0) {
  35440. goto exit_dcke;
  35441. }
  35442. /* Advance state and proceed */
  35443. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  35444. } /* TLS_ASYNC_VERIFY */
  35445. FALL_THROUGH;
  35446. case TLS_ASYNC_FINALIZE:
  35447. {
  35448. if (IsEncryptionOn(ssl, 0)) {
  35449. args->idx += ssl->keys.padSz;
  35450. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  35451. if (ssl->options.startedETMRead)
  35452. args->idx += MacSize(ssl);
  35453. #endif
  35454. }
  35455. ret = MakeMasterSecret(ssl);
  35456. /* Check for error */
  35457. if (ret != 0) {
  35458. goto exit_dcke;
  35459. }
  35460. /* Advance state and proceed */
  35461. ssl->options.asyncState = TLS_ASYNC_END;
  35462. } /* TLS_ASYNC_FINALIZE */
  35463. FALL_THROUGH;
  35464. case TLS_ASYNC_END:
  35465. {
  35466. /* Set final index */
  35467. *inOutIdx = args->idx;
  35468. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  35469. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  35470. if (ssl->options.verifyPeer) {
  35471. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  35472. }
  35473. #endif
  35474. break;
  35475. } /* TLS_ASYNC_END */
  35476. default:
  35477. ret = INPUT_CASE_ERROR;
  35478. } /* switch(ssl->options.asyncState) */
  35479. exit_dcke:
  35480. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  35481. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  35482. #ifdef WOLFSSL_ASYNC_CRYPT
  35483. /* Handle async operation */
  35484. if (ret == WC_PENDING_E) {
  35485. /* Mark message as not received so it can process again */
  35486. ssl->msgsReceived.got_client_key_exchange = 0;
  35487. return ret;
  35488. }
  35489. /* Cleanup async */
  35490. FreeAsyncCtx(ssl, 0);
  35491. #else
  35492. FreeDckeArgs(ssl, args);
  35493. #endif /* WOLFSSL_ASYNC_CRYPT */
  35494. #ifdef OPENSSL_ALL
  35495. /* add error ret value to error queue */
  35496. if (ret != 0) {
  35497. WOLFSSL_ERROR(ret);
  35498. }
  35499. #endif
  35500. /* Cleanup PMS */
  35501. if (ssl->arrays->preMasterSecret != NULL) {
  35502. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  35503. }
  35504. ssl->arrays->preMasterSz = 0;
  35505. /* Final cleanup */
  35506. FreeKeyExchange(ssl);
  35507. return ret;
  35508. }
  35509. #endif /* !WOLFSSL_NO_TLS12 */
  35510. #ifdef HAVE_SNI
  35511. int SNI_Callback(WOLFSSL* ssl)
  35512. {
  35513. int ad = 0;
  35514. int sniRet = 0;
  35515. int ret = 0;
  35516. /* OpenSSL defaults alert to SSL_AD_UNRECOGNIZED_NAME, use this if
  35517. WOLFSSL_EXTRA_ALERTS is defined, indicating user is OK with
  35518. potential information disclosure from alerts. */
  35519. #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_EXTRA_ALERTS)
  35520. ad = SSL_AD_UNRECOGNIZED_NAME;
  35521. #endif
  35522. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  35523. * when SNI is received. Call it now if exists */
  35524. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  35525. WOLFSSL_MSG("Calling custom sni callback");
  35526. sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg);
  35527. switch (sniRet) {
  35528. case warning_return:
  35529. WOLFSSL_MSG("Error in custom sni callback. Warning alert");
  35530. ret = SendAlert(ssl, alert_warning, ad);
  35531. break;
  35532. case fatal_return:
  35533. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  35534. SendAlert(ssl, alert_fatal, ad);
  35535. return FATAL_ERROR;
  35536. case noack_return:
  35537. WOLFSSL_MSG("Server quietly not acking servername.");
  35538. break;
  35539. default:
  35540. break;
  35541. }
  35542. }
  35543. return ret;
  35544. }
  35545. #endif /* HAVE_SNI */
  35546. #endif /* NO_WOLFSSL_SERVER */
  35547. #ifdef WOLFSSL_ASYNC_CRYPT
  35548. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  35549. {
  35550. int ret = 0;
  35551. WC_ASYNC_DEV* asyncDev;
  35552. WOLF_EVENT* event;
  35553. if (ssl == NULL) {
  35554. return BAD_FUNC_ARG;
  35555. }
  35556. /* check for pending async */
  35557. asyncDev = ssl->asyncDev;
  35558. if (asyncDev) {
  35559. /* grab event pointer */
  35560. event = &asyncDev->event;
  35561. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  35562. if (ret != WC_NO_PENDING_E && ret != WC_PENDING_E) {
  35563. /* advance key share state if doesn't need called again */
  35564. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  35565. (*state)++;
  35566. }
  35567. /* clear event and async device */
  35568. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  35569. ssl->asyncDev = NULL;
  35570. }
  35571. /* for crypto or PK callback, if pending remove from queue */
  35572. #if (defined(WOLF_CRYPTO_CB) || defined(HAVE_PK_CALLBACKS)) && \
  35573. !defined(WOLFSSL_ASYNC_CRYPT_SW) && !defined(HAVE_INTEL_QA) && \
  35574. !defined(HAVE_CAVIUM)
  35575. else if (ret == WC_PENDING_E) {
  35576. /* Allow the underlying crypto API to be called again to trigger the
  35577. * crypto or PK callback. The actual callback must be called, since
  35578. * the completion is not detected in the poll like Intel QAT or
  35579. * Nitrox */
  35580. ret = wolfEventQueue_Remove(&ssl->ctx->event_queue, event);
  35581. }
  35582. #endif
  35583. }
  35584. else {
  35585. ret = WC_NO_PENDING_E;
  35586. }
  35587. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  35588. return ret;
  35589. }
  35590. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  35591. {
  35592. int ret;
  35593. WOLF_EVENT* event;
  35594. if (ssl == NULL || asyncDev == NULL) {
  35595. return BAD_FUNC_ARG;
  35596. }
  35597. /* grab event pointer */
  35598. event = &asyncDev->event;
  35599. /* init event */
  35600. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  35601. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  35602. return ret;
  35603. }
  35604. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  35605. {
  35606. int ret;
  35607. WOLF_EVENT* event;
  35608. if (ssl == NULL || asyncDev == NULL) {
  35609. return BAD_FUNC_ARG;
  35610. }
  35611. /* grab event pointer */
  35612. event = &asyncDev->event;
  35613. /* store reference to active async operation */
  35614. ssl->asyncDev = asyncDev;
  35615. /* place event into queue */
  35616. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  35617. /* success means return WC_PENDING_E */
  35618. if (ret == 0) {
  35619. ret = WC_PENDING_E;
  35620. }
  35621. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  35622. return ret;
  35623. }
  35624. #endif /* WOLFSSL_ASYNC_CRYPT */
  35625. /**
  35626. * Return the max fragment size. This is essentially the maximum
  35627. * fragment_length available.
  35628. * @param ssl WOLFSSL object containing ciphersuite information.
  35629. * @param maxFragment The amount of space we want to check is available. This
  35630. * is only the fragment length WITHOUT the (D)TLS headers.
  35631. * @return Max fragment size
  35632. */
  35633. int wolfSSL_GetMaxFragSize(WOLFSSL* ssl, int maxFragment)
  35634. {
  35635. (void) ssl; /* Avoid compiler warnings */
  35636. if (maxFragment > MAX_RECORD_SIZE) {
  35637. maxFragment = MAX_RECORD_SIZE;
  35638. }
  35639. #ifdef HAVE_MAX_FRAGMENT
  35640. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  35641. maxFragment = ssl->max_fragment;
  35642. }
  35643. #endif /* HAVE_MAX_FRAGMENT */
  35644. #ifdef WOLFSSL_DTLS
  35645. if (IsDtlsNotSctpMode(ssl)) {
  35646. int outputSz, mtuSz;
  35647. /* Given a input buffer size of maxFragment, how big will the
  35648. * encrypted output be? */
  35649. if (IsEncryptionOn(ssl, 1)) {
  35650. outputSz = BuildMessage(ssl, NULL, 0, NULL,
  35651. maxFragment + DTLS_HANDSHAKE_HEADER_SZ,
  35652. application_data, 0, 1, 0, CUR_ORDER);
  35653. }
  35654. else {
  35655. outputSz = maxFragment + DTLS_RECORD_HEADER_SZ +
  35656. DTLS_HANDSHAKE_HEADER_SZ;
  35657. }
  35658. /* Readjust maxFragment for MTU size. */
  35659. #if defined(WOLFSSL_DTLS_MTU)
  35660. mtuSz = ssl->dtlsMtuSz;
  35661. #else
  35662. mtuSz = MAX_MTU;
  35663. #endif
  35664. maxFragment = ModifyForMTU(ssl, maxFragment, outputSz, mtuSz);
  35665. }
  35666. #endif
  35667. return maxFragment;
  35668. }
  35669. #if defined(WOLFSSL_IOTSAFE) && defined(HAVE_PK_CALLBACKS)
  35670. IOTSAFE *wolfSSL_get_iotsafe_ctx(WOLFSSL *ssl)
  35671. {
  35672. if (ssl == NULL)
  35673. return NULL;
  35674. return &ssl->iotsafe;
  35675. }
  35676. int wolfSSL_set_iotsafe_ctx(WOLFSSL *ssl, IOTSAFE *iotsafe)
  35677. {
  35678. if ((ssl == NULL) || (iotsafe == NULL))
  35679. return BAD_FUNC_ARG;
  35680. XMEMCPY(&ssl->iotsafe, iotsafe, sizeof(IOTSAFE));
  35681. return 0;
  35682. }
  35683. #endif
  35684. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  35685. /* create an instance of WOLFSSL_BY_DIR_HASH structure */
  35686. WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void)
  35687. {
  35688. WOLFSSL_BY_DIR_HASH* dir_hash;
  35689. WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new");
  35690. dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL,
  35691. DYNAMIC_TYPE_OPENSSL);
  35692. if (dir_hash) {
  35693. XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH));
  35694. }
  35695. return dir_hash;
  35696. }
  35697. /* release a WOLFSSL_BY_DIR_HASH resource */
  35698. void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash)
  35699. {
  35700. if (dir_hash == NULL)
  35701. return;
  35702. XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL);
  35703. }
  35704. /* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */
  35705. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void)
  35706. {
  35707. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  35708. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null");
  35709. if (sk) {
  35710. sk->type = STACK_TYPE_BY_DIR_hash;
  35711. }
  35712. return sk;
  35713. }
  35714. /* returns value less than 0 on fail to match
  35715. * On a successful match the priority level found is returned
  35716. */
  35717. int wolfSSL_sk_BY_DIR_HASH_find(
  35718. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind)
  35719. {
  35720. WOLFSSL_STACK* next;
  35721. int i, sz;
  35722. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find");
  35723. if (sk == NULL || toFind == NULL) {
  35724. return WOLFSSL_FAILURE;
  35725. }
  35726. sz = wolfSSL_sk_BY_DIR_HASH_num(sk);
  35727. next = sk;
  35728. for (i = 0; i < sz && next != NULL; i++) {
  35729. if (next->data.dir_hash->hash_value == toFind->hash_value) {
  35730. return sz - i; /* reverse because stack pushed highest on first */
  35731. }
  35732. next = next->next;
  35733. }
  35734. return -1;
  35735. }
  35736. /* return a number of WOLFSSL_BY_DIR_HASH in stack */
  35737. int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  35738. {
  35739. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num");
  35740. if (sk == NULL)
  35741. return -1;
  35742. return (int)sk->num;
  35743. }
  35744. /* return WOLFSSL_BY_DIR_HASH instance at i */
  35745. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value(
  35746. const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i)
  35747. {
  35748. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value");
  35749. for (; sk != NULL && i > 0; i--)
  35750. sk = sk->next;
  35751. if (i != 0 || sk == NULL)
  35752. return NULL;
  35753. return sk->data.dir_hash;
  35754. }
  35755. /* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */
  35756. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop(
  35757. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk)
  35758. {
  35759. WOLFSSL_STACK* node;
  35760. WOLFSSL_BY_DIR_HASH* hash;
  35761. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop");
  35762. if (sk == NULL) {
  35763. return NULL;
  35764. }
  35765. node = sk->next;
  35766. hash = sk->data.dir_hash;
  35767. if (node != NULL) { /* update sk and remove node from stack */
  35768. sk->data.dir_hash = node->data.dir_hash;
  35769. sk->next = node->next;
  35770. wolfSSL_sk_free_node(node);
  35771. }
  35772. else { /* last x509 in stack */
  35773. sk->data.dir_hash = NULL;
  35774. }
  35775. if (sk->num > 0) {
  35776. sk->num -= 1;
  35777. }
  35778. return hash;
  35779. }
  35780. /* release all contents in stack, and then release stack itself. */
  35781. /* Second argument is a function pointer to release resources. */
  35782. /* It calls the function to release resources when it is passed */
  35783. /* instead of wolfSSL_BY_DIR_HASH_free(). */
  35784. void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk,
  35785. void (*f) (WOLFSSL_BY_DIR_HASH*))
  35786. {
  35787. WOLFSSL_STACK* node;
  35788. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free");
  35789. if (sk == NULL) {
  35790. return;
  35791. }
  35792. /* parse through stack freeing each node */
  35793. node = sk->next;
  35794. while (node && sk->num > 1) {
  35795. WOLFSSL_STACK* tmp = node;
  35796. node = node->next;
  35797. if (f)
  35798. f(tmp->data.dir_hash);
  35799. else
  35800. wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash);
  35801. tmp->data.dir_hash = NULL;
  35802. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  35803. sk->num -= 1;
  35804. }
  35805. /* free head of stack */
  35806. if (sk->num == 1) {
  35807. if (f)
  35808. f(sk->data.dir_hash);
  35809. else
  35810. wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash);
  35811. sk->data.dir_hash = NULL;
  35812. }
  35813. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  35814. }
  35815. /* release all contents in stack, and then release stack itself */
  35816. void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  35817. {
  35818. wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL);
  35819. }
  35820. /* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and
  35821. * tries to free it when the stack is free'd.
  35822. *
  35823. * return 1 on success 0 on fail
  35824. */
  35825. int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk,
  35826. WOLFSSL_BY_DIR_HASH* in)
  35827. {
  35828. WOLFSSL_STACK* node;
  35829. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push");
  35830. if (sk == NULL || in == NULL) {
  35831. return WOLFSSL_FAILURE;
  35832. }
  35833. /* no previous values in stack */
  35834. if (sk->data.dir_hash == NULL) {
  35835. sk->data.dir_hash = in;
  35836. sk->num += 1;
  35837. return WOLFSSL_SUCCESS;
  35838. }
  35839. /* stack already has value(s) create a new node and add more */
  35840. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  35841. DYNAMIC_TYPE_OPENSSL);
  35842. if (node == NULL) {
  35843. WOLFSSL_MSG("Memory error");
  35844. return WOLFSSL_FAILURE;
  35845. }
  35846. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  35847. /* push new obj onto head of stack */
  35848. node->data.dir_hash = sk->data.dir_hash;
  35849. node->next = sk->next;
  35850. node->type = sk->type;
  35851. sk->next = node;
  35852. sk->data.dir_hash = in;
  35853. sk->num += 1;
  35854. return WOLFSSL_SUCCESS;
  35855. }
  35856. /* create an instance of WOLFSSL_BY_DIR_entry structure */
  35857. WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void)
  35858. {
  35859. WOLFSSL_BY_DIR_entry* entry;
  35860. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new");
  35861. entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL,
  35862. DYNAMIC_TYPE_OPENSSL);
  35863. if (entry) {
  35864. XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry));
  35865. }
  35866. return entry;
  35867. }
  35868. /* release a WOLFSSL_BY_DIR_entry resource */
  35869. void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry)
  35870. {
  35871. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free");
  35872. if (entry == NULL)
  35873. return;
  35874. if (entry->hashes) {
  35875. wolfSSL_sk_BY_DIR_HASH_free(entry->hashes);
  35876. }
  35877. if (entry->dir_name != NULL) {
  35878. XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL);
  35879. }
  35880. XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL);
  35881. }
  35882. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void)
  35883. {
  35884. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  35885. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null");
  35886. if (sk) {
  35887. sk->type = STACK_TYPE_BY_DIR_entry;
  35888. }
  35889. return sk;
  35890. }
  35891. /* return a number of WOLFSSL_BY_DIR_entry in stack */
  35892. int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk)
  35893. {
  35894. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num");
  35895. if (sk == NULL)
  35896. return -1;
  35897. return (int)sk->num;
  35898. }
  35899. /* return WOLFSSL_BY_DIR_entry instance at i */
  35900. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value(
  35901. const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i)
  35902. {
  35903. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value");
  35904. for (; sk != NULL && i > 0; i--)
  35905. sk = sk->next;
  35906. if (i != 0 || sk == NULL)
  35907. return NULL;
  35908. return sk->data.dir_entry;
  35909. }
  35910. /* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */
  35911. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop(
  35912. WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk)
  35913. {
  35914. WOLFSSL_STACK* node;
  35915. WOLFSSL_BY_DIR_entry* entry;
  35916. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop");
  35917. if (sk == NULL) {
  35918. return NULL;
  35919. }
  35920. node = sk->next;
  35921. entry = sk->data.dir_entry;
  35922. if (node != NULL) { /* update sk and remove node from stack */
  35923. sk->data.dir_entry = node->data.dir_entry;
  35924. sk->next = node->next;
  35925. wolfSSL_sk_free_node(node);
  35926. }
  35927. else { /* last x509 in stack */
  35928. sk->data.dir_entry = NULL;
  35929. }
  35930. if (sk->num > 0) {
  35931. sk->num -= 1;
  35932. }
  35933. return entry;
  35934. }
  35935. /* release all contents in stack, and then release stack itself. */
  35936. /* Second argument is a function pointer to release resources. */
  35937. /* It calls the function to release resources when it is passed */
  35938. /* instead of wolfSSL_BY_DIR_entry_free(). */
  35939. void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  35940. void (*f) (WOLFSSL_BY_DIR_entry*))
  35941. {
  35942. WOLFSSL_STACK* node;
  35943. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free");
  35944. if (sk == NULL) {
  35945. return;
  35946. }
  35947. /* parse through stack freeing each node */
  35948. node = sk->next;
  35949. while (node && sk->num > 1) {
  35950. WOLFSSL_STACK* tmp = node;
  35951. node = node->next;
  35952. if (f)
  35953. f(tmp->data.dir_entry);
  35954. else
  35955. wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry);
  35956. tmp->data.dir_entry = NULL;
  35957. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  35958. sk->num -= 1;
  35959. }
  35960. /* free head of stack */
  35961. if (sk->num == 1) {
  35962. if (f)
  35963. f(sk->data.dir_entry);
  35964. else
  35965. wolfSSL_BY_DIR_entry_free(sk->data.dir_entry);
  35966. sk->data.dir_entry = NULL;
  35967. }
  35968. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  35969. }
  35970. /* release all contents in stack, and then release stack itself */
  35971. void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk)
  35972. {
  35973. wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL);
  35974. }
  35975. /* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and
  35976. * tries to free it when the stack is free'd.
  35977. *
  35978. * return 1 on success 0 on fail
  35979. */
  35980. int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  35981. WOLFSSL_BY_DIR_entry* in)
  35982. {
  35983. WOLFSSL_STACK* node;
  35984. if (sk == NULL || in == NULL) {
  35985. return WOLFSSL_FAILURE;
  35986. }
  35987. /* no previous values in stack */
  35988. if (sk->data.dir_entry == NULL) {
  35989. sk->data.dir_entry = in;
  35990. sk->num += 1;
  35991. return WOLFSSL_SUCCESS;
  35992. }
  35993. /* stack already has value(s) create a new node and add more */
  35994. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  35995. DYNAMIC_TYPE_OPENSSL);
  35996. if (node == NULL) {
  35997. WOLFSSL_MSG("Memory error");
  35998. return WOLFSSL_FAILURE;
  35999. }
  36000. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  36001. /* push new obj onto head of stack */
  36002. node->data.dir_entry = sk->data.dir_entry;
  36003. node->next = sk->next;
  36004. node->type = sk->type;
  36005. sk->next = node;
  36006. sk->data.dir_entry = in;
  36007. sk->num += 1;
  36008. return WOLFSSL_SUCCESS;
  36009. }
  36010. #endif /* OPENSSL_ALL */
  36011. #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS)
  36012. /*
  36013. * Converts a DER formatted certificate to a SecCertificateRef
  36014. *
  36015. * @param derCert pointer to the DER formatted certificate
  36016. * @param derLen length of the DER formatted cert, in bytes
  36017. *
  36018. * @return The newly created SecCertificateRef. Must be freed by caller when
  36019. * no longer in use
  36020. */
  36021. static SecCertificateRef ConvertToSecCertificateRef(const byte* derCert,
  36022. int derLen)
  36023. {
  36024. CFDataRef derData = NULL;
  36025. SecCertificateRef secCert = NULL;
  36026. WOLFSSL_ENTER("ConvertToSecCertificateRef");
  36027. /* Create a CFDataRef from the DER encoded certificate */
  36028. derData = CFDataCreate(kCFAllocatorDefault, derCert, derLen);
  36029. if (!derData) {
  36030. WOLFSSL_MSG("Error: can't create CFDataRef object for DER cert");
  36031. goto cleanup;
  36032. }
  36033. /* Create a SecCertificateRef from the CFDataRef */
  36034. secCert = SecCertificateCreateWithData(kCFAllocatorDefault, derData);
  36035. if (!secCert) {
  36036. WOLFSSL_MSG("Error: can't create SecCertificateRef from CFDataRef");
  36037. goto cleanup;
  36038. }
  36039. cleanup:
  36040. if (derData) {
  36041. CFRelease(derData);
  36042. }
  36043. WOLFSSL_LEAVE("ConvertToSecCertificateRef", !!secCert);
  36044. return secCert;
  36045. }
  36046. /*
  36047. * Validates a chain of certificates using the Apple system trust APIs
  36048. *
  36049. * @param certs pointer to the certificate chain to validate
  36050. * @param totalCerts the number of certificates in certs
  36051. *
  36052. * @return 1 if chain is valid and trusted
  36053. * @return 0 if chain is invalid or untrusted
  36054. *
  36055. * As of MacOS 14.0 we are still able to access system certificates and load
  36056. * them manually into wolfSSL. For other apple devices, apple has removed the
  36057. * ability to obtain certificates from the trust store, so we can't use
  36058. * wolfSSL's built-in certificate validation mechanisms anymore. We instead
  36059. * must call into the Security Framework APIs to authenticate peer certificates
  36060. */
  36061. static int DoAppleNativeCertValidation(const WOLFSSL_BUFFER_INFO* certs,
  36062. int totalCerts)
  36063. {
  36064. int i;
  36065. int ret;
  36066. OSStatus status;
  36067. CFMutableArrayRef certArray = NULL;
  36068. SecCertificateRef secCert = NULL;
  36069. SecTrustRef trust = NULL;
  36070. SecPolicyRef policy = NULL ;
  36071. WOLFSSL_ENTER("DoAppleNativeCertValidation");
  36072. certArray = CFArrayCreateMutable(kCFAllocatorDefault,
  36073. totalCerts,
  36074. &kCFTypeArrayCallBacks);
  36075. if (!certArray) {
  36076. WOLFSSL_MSG("Error: can't allocate CFArray for certificates");
  36077. ret = 0;
  36078. goto cleanup;
  36079. }
  36080. for (i = 0; i < totalCerts; i++) {
  36081. secCert = ConvertToSecCertificateRef(certs[i].buffer, certs[i].length);
  36082. if (!secCert) {
  36083. WOLFSSL_MSG("Error: can't convert DER cert to SecCertificateRef");
  36084. ret = 0;
  36085. goto cleanup;
  36086. }
  36087. else {
  36088. CFArrayAppendValue(certArray, secCert);
  36089. /* Release, since the array now holds the reference */
  36090. CFRelease(secCert);
  36091. }
  36092. }
  36093. /* Create trust object for SecCertifiate Ref */
  36094. policy = SecPolicyCreateSSL(true, NULL);
  36095. status = SecTrustCreateWithCertificates(certArray, policy, &trust);
  36096. if (status != errSecSuccess) {
  36097. WOLFSSL_MSG_EX("Error creating trust object, "
  36098. "SecTrustCreateWithCertificates returned %d",status);
  36099. ret = 0;
  36100. goto cleanup;
  36101. }
  36102. /* Evaluate the certificate's authenticity */
  36103. if (SecTrustEvaluateWithError(trust, NULL) == 1) {
  36104. WOLFSSL_MSG("Cert chain is trusted");
  36105. ret = 1;
  36106. }
  36107. else {
  36108. WOLFSSL_MSG("Cert chain trust evaluation failed"
  36109. "SecTrustEvaluateWithError returned 0");
  36110. ret = 0;
  36111. }
  36112. /* Cleanup */
  36113. cleanup:
  36114. if (certArray) {
  36115. CFRelease(certArray);
  36116. }
  36117. if (trust) {
  36118. CFRelease(trust);
  36119. }
  36120. if (policy) {
  36121. CFRelease(policy);
  36122. }
  36123. WOLFSSL_LEAVE("DoAppleNativeCertValidation", ret);
  36124. return ret;
  36125. }
  36126. #endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
  36127. #undef ERROR_OUT
  36128. #endif /* WOLFCRYPT_ONLY */