internal.c 1.2 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023
  1. /* internal.c
  2. *
  3. * Copyright (C) 2006-2022 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_DTLS_NO_HVR_ON_RESUME
  64. * If defined, a DTLS server will not do a cookie exchange on successful
  65. * client resumption: the resumption will be faster (one RTT less) and
  66. * will consume less bandwidth (one ClientHello and one HelloVerifyRequest
  67. * less). On the other hand, if a valid SessionID is collected, forged
  68. * clientHello messages will consume resources on the server.
  69. * This define is turned off by default.
  70. * WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  71. * Verify hostname/ip address using alternate name (SAN) only and do not
  72. * use the common name. Forces use of the alternate name, so certificates
  73. * missing SAN will be rejected during the handshake
  74. * WOLFSSL_CHECK_SIG_FAULTS
  75. * Verifies the ECC signature after signing in case of faults in the
  76. * calculation of the signature. Useful when signature fault injection is a
  77. * possible attack.
  78. * WOLFSSL_TLS13_IGNORE_AEAD_LIMITS
  79. * Ignore the AEAD limits for messages specified in the RFC. After
  80. * reaching the limit, we initiate a key update. We enforce the AEAD limits
  81. * by default.
  82. * https://www.rfc-editor.org/rfc/rfc8446#section-5.5
  83. * https://www.rfc-editor.org/rfc/rfc9147.html#name-aead-limits
  84. */
  85. #ifdef EXTERNAL_OPTS_OPENVPN
  86. #error EXTERNAL_OPTS_OPENVPN should not be defined\
  87. when building wolfSSL
  88. #endif
  89. #ifndef WOLFCRYPT_ONLY
  90. #include <wolfssl/internal.h>
  91. #include <wolfssl/error-ssl.h>
  92. #include <wolfssl/wolfcrypt/asn.h>
  93. #include <wolfssl/wolfcrypt/dh.h>
  94. #ifdef NO_INLINE
  95. #include <wolfssl/wolfcrypt/misc.h>
  96. #else
  97. #define WOLFSSL_MISC_INCLUDED
  98. #include <wolfcrypt/src/misc.c>
  99. #endif
  100. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
  101. #include <wolfssl/wolfcrypt/srp.h>
  102. #endif
  103. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  104. #include <wolfssl/wolfcrypt/coding.h>
  105. #endif
  106. #ifdef HAVE_LIBZ
  107. #include "zlib.h"
  108. #endif
  109. #ifdef WOLFSSL_QNX_CAAM
  110. /* included to get CAAM devId value */
  111. #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
  112. #endif
  113. #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
  114. defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
  115. #ifndef NO_STDIO_FILESYSTEM
  116. #ifdef FUSION_RTOS
  117. #include <fclstdio.h>
  118. #else
  119. #include <stdio.h>
  120. #endif
  121. #endif
  122. #endif
  123. #ifdef __sun
  124. #include <sys/filio.h>
  125. #endif
  126. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  127. #ifdef _MSC_VER
  128. /* disable for while(0) cases at the .c level for now */
  129. #pragma warning(disable:4127)
  130. #endif
  131. #if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
  132. #error \
  133. WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
  134. #endif
  135. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
  136. #error Cannot use both secure-renegotiation and renegotiation-indication
  137. #endif
  138. #ifndef WOLFSSL_NO_TLS12
  139. #ifndef NO_WOLFSSL_CLIENT
  140. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  141. word32* inOutIdx, word32 size);
  142. #ifndef NO_CERTS
  143. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input,
  144. word32* inOutIdx, word32 size);
  145. #endif
  146. #ifdef HAVE_SESSION_TICKET
  147. static int DoSessionTicket(WOLFSSL* ssl, const byte* input,
  148. word32* inOutIdx, word32 size);
  149. #endif
  150. #endif
  151. #ifndef NO_WOLFSSL_SERVER
  152. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input,
  153. word32* inOutIdx, word32 size);
  154. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  155. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  156. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  157. word32* inOutIdx, word32 size);
  158. #endif
  159. #ifdef WOLFSSL_DTLS
  160. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  161. const byte* cookie, byte cookieSz);
  162. #endif /* WOLFSSL_DTLS */
  163. #endif /* !NO_WOLFSSL_SERVER */
  164. #endif /* !WOLFSSL_NO_TLS12 */
  165. #ifndef NO_WOLFSSL_SERVER
  166. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  167. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx,
  168. TicketEncCbCtx* keyCtx);
  169. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx);
  170. static int DefTicketEncCb(WOLFSSL* ssl,
  171. byte key_name[WOLFSSL_TICKET_NAME_SZ],
  172. byte iv[WOLFSSL_TICKET_IV_SZ],
  173. byte mac[WOLFSSL_TICKET_MAC_SZ],
  174. int enc, byte* ticket, int inLen, int* outLen,
  175. void* userCtx);
  176. #endif
  177. #endif
  178. #ifdef WOLFSSL_DTLS
  179. static int _DtlsCheckWindow(WOLFSSL* ssl);
  180. static int _DtlsUpdateWindow(WOLFSSL* ssl);
  181. #endif
  182. #ifdef WOLFSSL_DTLS13
  183. #ifndef WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT
  184. #define WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT 0
  185. #endif
  186. #endif /* WOLFSSL_DTLS13 */
  187. enum processReply {
  188. doProcessInit = 0,
  189. #ifndef NO_WOLFSSL_SERVER
  190. runProcessOldClientHello,
  191. #endif
  192. getRecordLayerHeader,
  193. getData,
  194. verifyEncryptedMessage,
  195. decryptMessage,
  196. verifyMessage,
  197. runProcessingOneRecord,
  198. runProcessingOneMessage
  199. };
  200. #ifndef WOLFSSL_NO_TLS12
  201. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  202. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  203. static const byte tls13Downgrade[7] = {
  204. 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
  205. };
  206. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  207. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  208. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  209. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  210. int padLen, int content, int verify, int epochOrder);
  211. #endif
  212. #endif /* !WOLFSSL_NO_TLS12 */
  213. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  214. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  215. #endif
  216. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  217. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  218. int* secretSz, void* ctx);
  219. #ifdef WOLFSSL_TLS13
  220. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  221. const unsigned char* secret, int secretSz, void* ctx);
  222. #endif
  223. /* Label string for client random. */
  224. #define SSC_CR "CLIENT_RANDOM"
  225. /*
  226. * This function builds up string for key-logging then call user's
  227. * key-log-callback to pass the string for TLS1.2 and older.
  228. * The user's key-logging callback has been set via
  229. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  230. * "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  231. * parameter
  232. * - ssl: WOLFSSL object
  233. * - secret: pointer to the buffer holding master-secret
  234. * - secretSz: size of secret
  235. * - ctx: not used
  236. * returns 0 on success, negative value on failure.
  237. */
  238. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  239. int* secretSz, void* ctx)
  240. {
  241. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  242. int msSz;
  243. int hasVal;
  244. int i;
  245. const char* label = SSC_CR;
  246. int labelSz = sizeof(SSC_CR);
  247. int buffSz;
  248. byte* log = NULL;
  249. word32 outSz;
  250. int idx;
  251. int ret;
  252. (void)ctx;
  253. if (ssl == NULL || secret == NULL || *secretSz == 0)
  254. return BAD_FUNC_ARG;
  255. if (ssl->arrays == NULL)
  256. return BAD_FUNC_ARG;
  257. /* get the user-callback func from CTX*/
  258. logCb = ssl->ctx->keyLogCb;
  259. if (logCb == NULL)
  260. return 0;
  261. /* need to make sure the given master-secret has a meaningful value */
  262. msSz = *secretSz;
  263. hasVal = 0;
  264. for (i = 0; i < msSz; i++) {
  265. if (*((byte*)secret) != 0) {
  266. hasVal = 1;
  267. break;
  268. }
  269. }
  270. if (hasVal == 0)
  271. return 0; /* master-secret looks invalid */
  272. /* build up a hex-decoded keylog string
  273. "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  274. note that each keylog string does not have CR/LF.
  275. */
  276. buffSz = labelSz + (RAN_LEN * 2) + 1 + ((*secretSz) * 2) + 1;
  277. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  278. if (log == NULL)
  279. return MEMORY_E;
  280. #ifdef WOLFSSL_CHECK_MEM_ZERO
  281. wc_MemZero_Add("SessionSecret log", log, buffSz);
  282. #endif
  283. XMEMSET(log, 0, buffSz);
  284. XMEMCPY(log, label, labelSz -1); /* put label w/o terminator */
  285. log[labelSz - 1] = ' '; /* '\0' -> ' ' */
  286. idx = labelSz;
  287. outSz = buffSz - idx;
  288. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  289. log + idx, &outSz)) == 0) {
  290. idx += (outSz - 1); /* reduce terminator byte */
  291. outSz = buffSz - idx;
  292. if (outSz > 1) {
  293. log[idx++] = ' '; /* add space*/
  294. outSz = buffSz - idx;
  295. if ((ret = Base16_Encode((byte*)secret, *secretSz,
  296. log + idx, &outSz)) == 0) {
  297. /* pass the log to the client callback*/
  298. logCb(ssl, (char*)log);
  299. ret = 0;
  300. }
  301. }
  302. else
  303. ret = MEMORY_E;
  304. }
  305. /* Zero out Base16 encoded secret and other data. */
  306. ForceZero(log, buffSz);
  307. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  308. return ret;
  309. }
  310. #if defined(WOLFSSL_TLS13)
  311. /* Label string for client early traffic secret. */
  312. #define SSC_TLS13_CETS "CLIENT_EARLY_TRAFFIC_SECRET"
  313. /* Label string for client handshake traffic secret. */
  314. #define SSC_TLS13_CHTS "CLIENT_HANDSHAKE_TRAFFIC_SECRET"
  315. /* Label string for server handshake traffic secret. */
  316. #define SSC_TLS13_SHTS "SERVER_HANDSHAKE_TRAFFIC_SECRET"
  317. /* Label string for client traffic secret. */
  318. #define SSC_TLS13_CTS "CLIENT_TRAFFIC_SECRET_0"
  319. /* Label string for server traffic secret. */
  320. #define SSC_TLS13_STS "SERVER_TRAFFIC_SECRET_0"
  321. /* Label string for early exporter secret. */
  322. #define SSC_TLS13_EES "EARLY_EXPORTER_SECRET"
  323. /* Label string for exporter secret. */
  324. #define SSC_TLS13_ES "EXPORTER_SECRET"
  325. /*
  326. * This function builds up string for key-logging then call user's
  327. * key-log-callback to pass the string for TLS1.3.
  328. * The user's key-logging callback has been set via
  329. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  330. * "<Label> <hex-encoded client random> <hex-encoded secret>"
  331. *
  332. * parameter
  333. * - ssl: WOLFSSL object
  334. * - id: type of secret for logging
  335. * - secret: pointer to the buffer holding secret
  336. * - secretSz: size of secret
  337. * - ctx: not used
  338. * returns 0 on success, negative value on failure.
  339. */
  340. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  341. const unsigned char* secret, int secretSz, void* ctx)
  342. {
  343. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  344. const char* label;
  345. int labelSz = 0;
  346. int buffSz = 0;
  347. byte* log = NULL;
  348. word32 outSz;
  349. int idx;
  350. int ret;
  351. (void)ctx;
  352. if (ssl == NULL || secret == NULL || secretSz == 0)
  353. return BAD_FUNC_ARG;
  354. if (ssl->arrays == NULL)
  355. return BAD_FUNC_ARG;
  356. /* get the user-callback func from CTX*/
  357. logCb = ssl->ctx->keyLogCb;
  358. if (logCb == NULL)
  359. return 0;
  360. switch (id) {
  361. case CLIENT_EARLY_TRAFFIC_SECRET:
  362. labelSz = sizeof(SSC_TLS13_CETS);
  363. label = SSC_TLS13_CETS;
  364. break;
  365. case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
  366. labelSz = sizeof(SSC_TLS13_CHTS);
  367. label = SSC_TLS13_CHTS;
  368. break;
  369. case SERVER_HANDSHAKE_TRAFFIC_SECRET:
  370. labelSz = sizeof(SSC_TLS13_SHTS);
  371. label = SSC_TLS13_SHTS;
  372. break;
  373. case CLIENT_TRAFFIC_SECRET:
  374. labelSz = sizeof(SSC_TLS13_CTS);
  375. label = SSC_TLS13_CTS;
  376. break;
  377. case SERVER_TRAFFIC_SECRET:
  378. labelSz = sizeof(SSC_TLS13_STS);
  379. label = SSC_TLS13_STS;
  380. break;
  381. case EARLY_EXPORTER_SECRET:
  382. labelSz = sizeof(SSC_TLS13_EES);
  383. label = SSC_TLS13_EES;
  384. break;
  385. case EXPORTER_SECRET:
  386. labelSz = sizeof(SSC_TLS13_ES);
  387. label = SSC_TLS13_ES;
  388. break;
  389. default:
  390. return BAD_FUNC_ARG;
  391. }
  392. /* prepare a log string for passing user callback
  393. * "<Label> <hex-encoded client random> <hex-encoded secret>" */
  394. buffSz = labelSz + (RAN_LEN * 2) + 1 + secretSz * 2 + 1;
  395. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  396. if (log == NULL)
  397. return MEMORY_E;
  398. #ifdef WOLFSSL_CHECK_MEM_ZERO
  399. wc_MemZero_Add("SessionSecret log", log, buffSz);
  400. #endif
  401. XMEMSET(log, 0, buffSz);
  402. XMEMCPY(log, label, labelSz - 1); /* put label w/o terminator */
  403. log[labelSz - 1] = ' '; /* '\0' -> ' ' */
  404. idx = labelSz;
  405. outSz = buffSz - idx;
  406. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  407. log + idx, &outSz)) == 0) {
  408. idx += (outSz - 1); /* reduce terminator byte */
  409. outSz = buffSz - idx;
  410. if (outSz >1) {
  411. log[idx++] = ' '; /* add space*/
  412. outSz = buffSz - idx;
  413. if ((ret = Base16_Encode((byte*)secret, secretSz,
  414. log + idx, &outSz)) == 0) {
  415. logCb(ssl, (char*)log);
  416. ret = 0;
  417. }
  418. }
  419. else
  420. ret = MEMORY_E;
  421. }
  422. /* Zero out Base16 encoded secret and other data. */
  423. ForceZero(log, buffSz);
  424. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  425. return ret;
  426. }
  427. #endif /* WOLFSSL_TLS13*/
  428. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK*/
  429. int IsTLS(const WOLFSSL* ssl)
  430. {
  431. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  432. return 1;
  433. return 0;
  434. }
  435. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  436. {
  437. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  438. return 1;
  439. #ifdef WOLFSSL_DTLS
  440. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  441. return 1;
  442. #endif
  443. return 0;
  444. }
  445. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  446. {
  447. int ret;
  448. ret = (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  449. #ifdef WOLFSSL_DTLS13
  450. if (ret == 0 && pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_3_MINOR)
  451. return 1;
  452. #endif
  453. return ret;
  454. }
  455. int IsEncryptionOn(WOLFSSL* ssl, int isSend)
  456. {
  457. #ifdef WOLFSSL_DTLS
  458. /* For DTLS, epoch 0 is always not encrypted. */
  459. if (ssl->options.dtls && !isSend) {
  460. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->keys.curEpoch == 0)
  461. return 0;
  462. #ifdef WOLFSSL_DTLS13
  463. else if (IsAtLeastTLSv1_3(ssl->version)
  464. && w64IsZero(ssl->keys.curEpoch64))
  465. return 0;
  466. #endif /* WOLFSSL_DTLS13 */
  467. }
  468. #endif /* WOLFSSL_DTLS */
  469. #ifdef WOLFSSL_QUIC
  470. if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version)) {
  471. return 0;
  472. }
  473. #endif
  474. return ssl->keys.encryptionOn &&
  475. (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
  476. }
  477. #ifdef WOLFSSL_DTLS
  478. /* Stream Control Transmission Protocol */
  479. /* If SCTP is not enabled returns the state of the dtls option.
  480. * If SCTP is enabled returns dtls && !sctp. */
  481. int IsDtlsNotSctpMode(WOLFSSL* ssl)
  482. {
  483. #ifdef WOLFSSL_SCTP
  484. return ssl->options.dtls && !ssl->options.dtlsSctp;
  485. #else
  486. return ssl->options.dtls;
  487. #endif
  488. }
  489. #if !defined(WOLFSSL_NO_TLS12) && !defined(NO_WOLFSSL_SERVER)
  490. /* Secure Real-time Transport Protocol */
  491. /* If SRTP is not enabled returns the state of the dtls option.
  492. * If SRTP is enabled returns dtls && !dtlsSrtpProfiles. */
  493. static WC_INLINE int IsDtlsNotSrtpMode(WOLFSSL* ssl)
  494. {
  495. #ifdef WOLFSSL_SRTP
  496. return ssl->options.dtls && !ssl->dtlsSrtpProfiles;
  497. #else
  498. return ssl->options.dtls;
  499. #endif
  500. }
  501. #endif /* !WOLFSSL_NO_TLS12 && !NO_WOLFSSL_SERVER */
  502. #endif /* WOLFSSL_DTLS */
  503. #ifdef HAVE_LIBZ
  504. /* alloc user allocs to work with zlib */
  505. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  506. {
  507. (void)opaque;
  508. return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  509. }
  510. static void myFree(void* opaque, void* memory)
  511. {
  512. (void)opaque;
  513. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  514. }
  515. /* init zlib comp/decomp streams, 0 on success */
  516. static int InitStreams(WOLFSSL* ssl)
  517. {
  518. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  519. ssl->c_stream.zfree = (free_func)myFree;
  520. ssl->c_stream.opaque = (voidpf)ssl->heap;
  521. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  522. return ZLIB_INIT_ERROR;
  523. ssl->didStreamInit = 1;
  524. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  525. ssl->d_stream.zfree = (free_func)myFree;
  526. ssl->d_stream.opaque = (voidpf)ssl->heap;
  527. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  528. return 0;
  529. }
  530. static void FreeStreams(WOLFSSL* ssl)
  531. {
  532. if (ssl->didStreamInit) {
  533. deflateEnd(&ssl->c_stream);
  534. inflateEnd(&ssl->d_stream);
  535. }
  536. }
  537. /* compress in to out, return out size or error */
  538. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  539. {
  540. int err;
  541. int currTotal = (int)ssl->c_stream.total_out;
  542. ssl->c_stream.next_in = in;
  543. ssl->c_stream.avail_in = inSz;
  544. ssl->c_stream.next_out = out;
  545. ssl->c_stream.avail_out = outSz;
  546. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  547. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  548. return (int)ssl->c_stream.total_out - currTotal;
  549. }
  550. /* decompress in to out, return out size or error */
  551. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  552. {
  553. int err;
  554. int currTotal = (int)ssl->d_stream.total_out;
  555. ssl->d_stream.next_in = in;
  556. ssl->d_stream.avail_in = inSz;
  557. ssl->d_stream.next_out = out;
  558. ssl->d_stream.avail_out = outSz;
  559. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  560. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  561. return (int)ssl->d_stream.total_out - currTotal;
  562. }
  563. #endif /* HAVE_LIBZ */
  564. #ifdef WOLFSSL_SESSION_EXPORT
  565. /**
  566. * serializes the cipher specs struct for exporting
  567. * @return the amount written to 'exp' buffer
  568. */
  569. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  570. int type)
  571. {
  572. word32 idx = 0;
  573. CipherSpecs* specs;
  574. WOLFSSL_ENTER("ExportCipherSpecState");
  575. if (exp == NULL || ssl == NULL) {
  576. return BAD_FUNC_ARG;
  577. }
  578. specs = &ssl->specs;
  579. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  580. return BUFFER_E;
  581. }
  582. XMEMSET(exp, 0, WOLFSSL_EXPORT_SPC_SZ);
  583. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  584. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  585. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  586. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  587. exp[idx++] = specs->bulk_cipher_algorithm;
  588. exp[idx++] = specs->cipher_type;
  589. exp[idx++] = specs->mac_algorithm;
  590. exp[idx++] = specs->kea;
  591. exp[idx++] = specs->sig_algo;
  592. exp[idx++] = specs->hash_size;
  593. exp[idx++] = specs->pad_size;
  594. exp[idx++] = specs->static_ecdh;
  595. if (idx != WOLFSSL_EXPORT_SPC_SZ) {
  596. WOLFSSL_MSG("WOLFSSL_EXPORT_SPC_SZ needs updated and export version");
  597. return DTLS_EXPORT_VER_E;
  598. }
  599. /* send over state of AES too */
  600. if (type == WOLFSSL_EXPORT_TLS &&
  601. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  602. byte *pt = (byte*)ssl->encrypt.aes->reg;
  603. if ((idx + 2*AES_BLOCK_SIZE) > len) {
  604. WOLFSSL_MSG("Can not fit AES state into buffer");
  605. return BUFFER_E;
  606. }
  607. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  608. idx += AES_BLOCK_SIZE;
  609. pt = (byte*)ssl->decrypt.aes->reg;
  610. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  611. idx += AES_BLOCK_SIZE;
  612. }
  613. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  614. (void)ver;
  615. return idx;
  616. }
  617. /* serializes the key struct for exporting */
  618. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  619. byte small, int type)
  620. {
  621. word32 idx = 0;
  622. byte sz;
  623. Keys* keys;
  624. WOLFSSL_ENTER("ExportKeyState");
  625. if (exp == NULL || ssl == NULL) {
  626. return BAD_FUNC_ARG;
  627. }
  628. keys = &(ssl->keys);
  629. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  630. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  631. return BUFFER_E;
  632. }
  633. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  634. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  635. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  636. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  637. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  638. #if defined(WOLFSSL_DTLS)
  639. if (type == WOLFSSL_EXPORT_DTLS) {
  640. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  641. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  642. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  643. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  644. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  645. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  646. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  647. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  648. c16toa(keys->dtls_peer_handshake_number, exp + idx);
  649. idx += OPAQUE16_LEN;
  650. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  651. idx += OPAQUE16_LEN;
  652. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  653. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  654. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx);
  655. idx += OPAQUE16_LEN;
  656. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx);
  657. idx += OPAQUE32_LEN;
  658. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  659. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  660. }
  661. #endif
  662. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  663. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  664. exp[idx++] = keys->encryptionOn;
  665. exp[idx++] = keys->decryptedCur;
  666. /* from here on the buffer needs checked because is variable length that
  667. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  668. #ifdef WOLFSSL_DTLS
  669. if (type == WOLFSSL_EXPORT_DTLS) {
  670. word32 i;
  671. if ((OPAQUE16_LEN * 2) + idx +
  672. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  673. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  674. return BUFFER_E;
  675. }
  676. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  677. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  678. c32toa(keys->peerSeq[0].window[i], exp + idx);
  679. idx += OPAQUE32_LEN;
  680. }
  681. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  682. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  683. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  684. idx += OPAQUE32_LEN;
  685. }
  686. }
  687. #endif
  688. if (idx >= len) {
  689. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  690. return BUFFER_E;
  691. }
  692. #ifdef HAVE_TRUNCATED_HMAC
  693. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  694. exp[idx++] = ssl->truncated_hmac;
  695. #else
  696. sz = ssl->specs.hash_size;
  697. exp[idx++] = 0; /* no truncated hmac */
  698. #endif
  699. sz = (small)? 0: sz;
  700. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  701. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  702. return BUFFER_E;
  703. }
  704. exp[idx++] = sz;
  705. if (sz > 0) {
  706. #ifndef WOLFSSL_AEAD_ONLY
  707. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  708. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  709. #else
  710. XMEMSET(exp + idx, 0, sz); idx += sz;
  711. XMEMSET(exp + idx, 0, sz); idx += sz;
  712. #endif
  713. }
  714. sz = (small)? 0: ssl->specs.key_size;
  715. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  716. WOLFSSL_MSG("Buffer not large enough for write key");
  717. return BUFFER_E;
  718. }
  719. exp[idx++] = sz;
  720. if (sz > 0) {
  721. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  722. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  723. }
  724. sz = (small)? 0: ssl->specs.iv_size;
  725. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  726. WOLFSSL_MSG("Buffer not large enough for IVs");
  727. return BUFFER_E;
  728. }
  729. exp[idx++] = sz;
  730. if (sz > 0) {
  731. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  732. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  733. }
  734. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  735. idx += AEAD_MAX_EXP_SZ;
  736. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  737. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  738. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  739. return BUFFER_E;
  740. }
  741. exp[idx++] = sz;
  742. if (sz > 0) {
  743. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  744. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  745. }
  746. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  747. if (idx > DTLS_EXPORT_KEY_SZ) {
  748. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  749. return DTLS_EXPORT_VER_E;
  750. }
  751. WOLFSSL_LEAVE("ExportKeyState", idx);
  752. (void)ver;
  753. (void)type;
  754. return idx;
  755. }
  756. /**
  757. * Imports the buffer 'exp' into the 'ssl' CipherSpec structure.
  758. * @param ssl WOLFSSL structure to import into
  759. * @param exp input buffer to read from
  760. * @param len length of exp buffer
  761. * @param ver version of import buffer found
  762. * @param type flag for importing a TLS session or DTLS
  763. *
  764. * @return size of exp buffer consumed on success and negative value on fail
  765. */
  766. static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len,
  767. byte ver, int type)
  768. {
  769. word32 idx = 0;
  770. CipherSpecs* specs;
  771. word32 tmp_seq_peer_lo;
  772. word32 tmp_seq_peer_hi;
  773. word32 tmp_seq_lo;
  774. word32 tmp_seq_hi;
  775. WOLFSSL_ENTER("ImportCipherSpecState");
  776. if (exp == NULL || ssl == NULL) {
  777. return BAD_FUNC_ARG;
  778. }
  779. specs= &(ssl->specs);
  780. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  781. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  782. return BUFFER_E;
  783. }
  784. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  785. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  786. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  787. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  788. specs->bulk_cipher_algorithm = exp[idx++];
  789. specs->cipher_type = exp[idx++];
  790. specs->mac_algorithm = exp[idx++];
  791. specs->kea = exp[idx++];
  792. specs->sig_algo = exp[idx++];
  793. specs->hash_size = exp[idx++];
  794. specs->pad_size = exp[idx++];
  795. specs->static_ecdh = exp[idx++];
  796. if (specs->pad_size != PAD_MD5 && specs->pad_size != PAD_SHA) {
  797. WOLFSSL_MSG("Importing bad or unknown pad size");
  798. return BAD_STATE_E;
  799. }
  800. /* temporarily save the sequence numbers */
  801. tmp_seq_peer_lo = ssl->keys.peer_sequence_number_lo;
  802. tmp_seq_peer_hi = ssl->keys.peer_sequence_number_hi;
  803. tmp_seq_lo = ssl->keys.sequence_number_lo;
  804. tmp_seq_hi = ssl->keys.sequence_number_hi;
  805. SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  806. /* reset sequence numbers after setting keys */
  807. ssl->keys.peer_sequence_number_lo = tmp_seq_peer_lo;
  808. ssl->keys.peer_sequence_number_hi = tmp_seq_peer_hi;
  809. ssl->keys.sequence_number_lo = tmp_seq_lo;
  810. ssl->keys.sequence_number_hi = tmp_seq_hi;
  811. if (type == WOLFSSL_EXPORT_TLS &&
  812. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  813. byte *pt = (byte*)ssl->encrypt.aes->reg;
  814. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  815. idx += AES_BLOCK_SIZE;
  816. pt = (byte*)ssl->decrypt.aes->reg;
  817. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  818. idx += AES_BLOCK_SIZE;
  819. }
  820. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  821. (void)ver;
  822. return idx;
  823. }
  824. /**
  825. * Import the Key structure
  826. *
  827. * @param ssl WOLFSSL structure to import into
  828. * @param exp buffer to read Key values from
  829. * @param len max length of buffer 'exp'
  830. * @param ver version of import buffer found
  831. * @param type flag for TLS vs DTLS
  832. *
  833. * @return amount of data read from exp on success or negative on fail
  834. */
  835. static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  836. int type)
  837. {
  838. word32 idx = 0;
  839. byte sz;
  840. Keys *keys;
  841. WOLFSSL_ENTER("ImportKeyState");
  842. if (exp == NULL || ssl == NULL) {
  843. return BAD_FUNC_ARG;
  844. }
  845. keys = &(ssl->keys);
  846. /* check minimum length -- includes byte used for size indicators */
  847. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  848. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  849. return BUFFER_E;
  850. }
  851. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  852. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  853. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  854. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  855. #if defined(WOLFSSL_DTLS)
  856. if (type == WOLFSSL_EXPORT_DTLS) {
  857. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  858. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  859. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  860. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  861. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  862. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  863. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  864. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  865. ato16(exp + idx, &keys->dtls_peer_handshake_number);
  866. idx += OPAQUE16_LEN;
  867. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  868. idx += OPAQUE16_LEN;
  869. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  870. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  871. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi);
  872. idx += OPAQUE16_LEN;
  873. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo);
  874. idx += OPAQUE32_LEN;
  875. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  876. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  877. }
  878. #endif
  879. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  880. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  881. keys->encryptionOn = exp[idx++];
  882. keys->decryptedCur = exp[idx++];
  883. #if defined(WOLFSSL_DTLS)
  884. if (type == WOLFSSL_EXPORT_DTLS) {
  885. word16 i, wordCount, wordAdj = 0;
  886. /* do window */
  887. ato16(exp + idx, &wordCount);
  888. idx += OPAQUE16_LEN;
  889. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  890. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  891. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  892. }
  893. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  894. for (i = 0; i < wordCount; i++) {
  895. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  896. idx += OPAQUE32_LEN;
  897. }
  898. idx += wordAdj;
  899. /* do prevWindow */
  900. ato16(exp + idx, &wordCount);
  901. idx += OPAQUE16_LEN;
  902. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  903. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  904. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  905. }
  906. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  907. for (i = 0; i < wordCount; i++) {
  908. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  909. idx += OPAQUE32_LEN;
  910. }
  911. idx += wordAdj;
  912. }
  913. #endif
  914. #ifdef HAVE_TRUNCATED_HMAC
  915. ssl->truncated_hmac = exp[idx++];
  916. #else
  917. idx++; /* no truncated hmac */
  918. #endif
  919. sz = exp[idx++];
  920. #ifndef WOLFSSL_AEAD_ONLY
  921. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  922. WOLFSSL_MSG("Buffer not large enough for MAC import");
  923. return BUFFER_E;
  924. }
  925. if (sz > 0) {
  926. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  927. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  928. }
  929. #else
  930. if (sz + idx > len) {
  931. return BUFFER_E;
  932. }
  933. idx += sz; idx += sz;
  934. #endif
  935. sz = exp[idx++];
  936. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  937. WOLFSSL_MSG("Buffer not large enough for key import");
  938. return BUFFER_E;
  939. }
  940. if (sz > 0) {
  941. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  942. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  943. }
  944. sz = exp[idx++];
  945. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  946. WOLFSSL_MSG("Buffer not large enough for write IV import");
  947. return BUFFER_E;
  948. }
  949. if (sz > 0) {
  950. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  951. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  952. }
  953. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  954. idx += AEAD_MAX_EXP_SZ;
  955. sz = exp[idx++];
  956. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  957. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  958. return BUFFER_E;
  959. }
  960. if (sz > 0) {
  961. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  962. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  963. }
  964. WOLFSSL_LEAVE("ImportKeyState", idx);
  965. (void)ver;
  966. (void)type;
  967. return idx;
  968. }
  969. /* copy over necessary information from Options struct to buffer
  970. * On success returns size of buffer used on failure returns a negative value */
  971. static int ExportOptions(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  972. int type)
  973. {
  974. int idx = 0;
  975. word16 zero = 0;
  976. Options *options;
  977. WOLFSSL_ENTER("ExportOptions");
  978. if (ssl == NULL || exp == NULL || len < DTLS_EXPORT_OPT_SZ) {
  979. return BAD_FUNC_ARG;
  980. }
  981. options = &ssl->options;
  982. if (options == NULL) {
  983. return BAD_FUNC_ARG;
  984. }
  985. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  986. /* these options are kept and sent to indicate verify status and strength
  987. * of handshake */
  988. exp[idx++] = options->sendVerify;
  989. exp[idx++] = options->verifyPeer;
  990. exp[idx++] = options->verifyNone;
  991. exp[idx++] = options->downgrade;
  992. #ifndef NO_DH
  993. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  994. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  995. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  996. #else
  997. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  998. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  999. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1000. #endif
  1001. #ifndef NO_RSA
  1002. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  1003. #else
  1004. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1005. #endif
  1006. #ifdef HAVE_ECC
  1007. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  1008. #else
  1009. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1010. #endif
  1011. /* these options are kept to indicate state and behavior */
  1012. #ifndef NO_PSK
  1013. exp[idx++] = options->havePSK;
  1014. #else
  1015. exp[idx++] = 0;
  1016. #endif
  1017. exp[idx++] = options->sessionCacheOff;
  1018. exp[idx++] = options->sessionCacheFlushOff;
  1019. exp[idx++] = options->side;
  1020. exp[idx++] = options->resuming;
  1021. exp[idx++] = options->haveSessionId;
  1022. exp[idx++] = options->tls;
  1023. exp[idx++] = options->tls1_1;
  1024. exp[idx++] = options->dtls;
  1025. exp[idx++] = options->connReset;
  1026. exp[idx++] = options->isClosed;
  1027. exp[idx++] = options->closeNotify;
  1028. exp[idx++] = options->sentNotify;
  1029. exp[idx++] = options->usingCompression;
  1030. exp[idx++] = options->haveRSA;
  1031. exp[idx++] = options->haveECC;
  1032. exp[idx++] = options->haveDH;
  1033. exp[idx++] = 0; /* Historical: haveNTRU */
  1034. exp[idx++] = 0; /* Historical: haveQSH */
  1035. exp[idx++] = options->haveECDSAsig;
  1036. exp[idx++] = options->haveStaticECC;
  1037. exp[idx++] = options->havePeerVerify;
  1038. exp[idx++] = options->usingPSK_cipher;
  1039. exp[idx++] = options->usingAnon_cipher;
  1040. exp[idx++] = 0; /* Historical: options->sendAlertState */
  1041. exp[idx++] = options->partialWrite;
  1042. exp[idx++] = options->quietShutdown;
  1043. exp[idx++] = options->groupMessages;
  1044. #ifdef HAVE_POLY1305
  1045. exp[idx++] = options->oldPoly;
  1046. #else
  1047. exp[idx++] = 0;
  1048. #endif
  1049. #ifdef HAVE_ANON
  1050. exp[idx++] = options->haveAnon;
  1051. #else
  1052. exp[idx++] = 0;
  1053. #endif
  1054. #ifdef HAVE_SESSION_TICKET
  1055. exp[idx++] = options->createTicket;
  1056. exp[idx++] = options->useTicket;
  1057. exp[idx++] = options->noTicketTls12;
  1058. #ifdef WOLFSSL_TLS13
  1059. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1060. exp[idx++] = options->noTicketTls13;
  1061. }
  1062. #else
  1063. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1064. exp[idx++] = 0;
  1065. }
  1066. #endif
  1067. #else
  1068. exp[idx++] = 0;
  1069. exp[idx++] = 0;
  1070. exp[idx++] = 0;
  1071. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1072. exp[idx++] = 0;
  1073. }
  1074. #endif
  1075. exp[idx++] = options->processReply;
  1076. exp[idx++] = options->cipherSuite0;
  1077. exp[idx++] = options->cipherSuite;
  1078. exp[idx++] = options->serverState;
  1079. exp[idx++] = options->clientState;
  1080. exp[idx++] = options->handShakeState;
  1081. exp[idx++] = options->handShakeDone;
  1082. exp[idx++] = options->minDowngrade;
  1083. exp[idx++] = options->connectState;
  1084. exp[idx++] = options->acceptState;
  1085. exp[idx++] = options->asyncState;
  1086. if (type == WOLFSSL_EXPORT_TLS) {
  1087. #ifdef HAVE_ENCRYPT_THEN_MAC
  1088. exp[idx++] = options->disallowEncThenMac;
  1089. exp[idx++] = options->encThenMac;
  1090. exp[idx++] = options->startedETMRead;
  1091. exp[idx++] = options->startedETMWrite;
  1092. #else
  1093. exp[idx++] = 0;
  1094. exp[idx++] = 0;
  1095. exp[idx++] = 0;
  1096. exp[idx++] = 0;
  1097. #endif
  1098. }
  1099. /* version of connection */
  1100. exp[idx++] = ssl->version.major;
  1101. exp[idx++] = ssl->version.minor;
  1102. (void)zero;
  1103. /* check if changes were made and notify of need to update export version */
  1104. switch (ver) {
  1105. case WOLFSSL_EXPORT_VERSION_3:
  1106. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  1107. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1108. return DTLS_EXPORT_VER_E;
  1109. }
  1110. break;
  1111. case WOLFSSL_EXPORT_VERSION:
  1112. if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) {
  1113. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1114. return DTLS_EXPORT_VER_E;
  1115. }
  1116. break;
  1117. default:
  1118. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  1119. return DTLS_EXPORT_VER_E;
  1120. }
  1121. WOLFSSL_LEAVE("ExportOptions", idx);
  1122. (void)type;
  1123. return idx;
  1124. }
  1125. /* copy items from Export struct to Options struct
  1126. * On success returns size of buffer used on failure returns a negative value */
  1127. static int ImportOptions(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  1128. int type)
  1129. {
  1130. int idx = 0;
  1131. Options* options = &ssl->options;
  1132. switch (ver) {
  1133. case WOLFSSL_EXPORT_VERSION:
  1134. if (len < DTLS_EXPORT_OPT_SZ) {
  1135. WOLFSSL_MSG("Sanity check on buffer size failed");
  1136. return BAD_FUNC_ARG;
  1137. }
  1138. break;
  1139. case WOLFSSL_EXPORT_VERSION_3:
  1140. if (len < DTLS_EXPORT_OPT_SZ_3) {
  1141. WOLFSSL_MSG("Sanity check on buffer size failed");
  1142. return BAD_FUNC_ARG;
  1143. }
  1144. break;
  1145. default:
  1146. WOLFSSL_MSG("Export version not supported");
  1147. return BAD_FUNC_ARG;
  1148. }
  1149. if (exp == NULL || options == NULL) {
  1150. return BAD_FUNC_ARG;
  1151. }
  1152. /* these options are kept and sent to indicate verify status and strength
  1153. * of handshake */
  1154. options->sendVerify = exp[idx++];
  1155. options->verifyPeer = exp[idx++];
  1156. options->verifyNone = exp[idx++];
  1157. options->downgrade = exp[idx++];
  1158. #ifndef NO_DH
  1159. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  1160. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  1161. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  1162. #else
  1163. idx += OPAQUE16_LEN;
  1164. idx += OPAQUE16_LEN;
  1165. idx += OPAQUE16_LEN;
  1166. #endif
  1167. #ifndef NO_RSA
  1168. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  1169. #else
  1170. idx += OPAQUE16_LEN;
  1171. #endif
  1172. #ifdef HAVE_ECC
  1173. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  1174. #else
  1175. idx += OPAQUE16_LEN;
  1176. #endif
  1177. /* these options are kept to indicate state and behavior */
  1178. #ifndef NO_PSK
  1179. options->havePSK = exp[idx++];
  1180. #else
  1181. idx++;
  1182. #endif
  1183. options->sessionCacheOff = exp[idx++];
  1184. options->sessionCacheFlushOff = exp[idx++];
  1185. options->side = exp[idx++];
  1186. options->resuming = exp[idx++];
  1187. options->haveSessionId = exp[idx++];
  1188. options->tls = exp[idx++];
  1189. options->tls1_1 = exp[idx++];
  1190. options->dtls = exp[idx++];
  1191. options->connReset = exp[idx++];
  1192. options->isClosed = exp[idx++];
  1193. options->closeNotify = exp[idx++];
  1194. options->sentNotify = exp[idx++];
  1195. options->usingCompression = exp[idx++];
  1196. options->haveRSA = exp[idx++];
  1197. options->haveECC = exp[idx++];
  1198. options->haveDH = exp[idx++];
  1199. idx++; /* Historical: haveNTRU */
  1200. idx++; /* Historical: haveQSH */
  1201. options->haveECDSAsig = exp[idx++];
  1202. options->haveStaticECC = exp[idx++];
  1203. options->havePeerVerify = exp[idx++];
  1204. options->usingPSK_cipher = exp[idx++];
  1205. options->usingAnon_cipher = exp[idx++];
  1206. idx++; /* Historical: options->sendAlertState */
  1207. options->partialWrite = exp[idx++];
  1208. options->quietShutdown = exp[idx++];
  1209. options->groupMessages = exp[idx++];
  1210. #ifdef HAVE_POLY1305
  1211. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  1212. #else
  1213. idx++;
  1214. #endif
  1215. #ifdef HAVE_ANON
  1216. options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */
  1217. #else
  1218. idx++;
  1219. #endif
  1220. #ifdef HAVE_SESSION_TICKET
  1221. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  1222. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  1223. options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
  1224. #ifdef WOLFSSL_TLS13
  1225. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1226. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  1227. }
  1228. #else
  1229. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1230. idx++;
  1231. }
  1232. #endif
  1233. #else
  1234. idx++;
  1235. idx++;
  1236. idx++;
  1237. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1238. idx++;
  1239. }
  1240. #endif
  1241. options->processReply = exp[idx++];
  1242. options->cipherSuite0 = exp[idx++];
  1243. options->cipherSuite = exp[idx++];
  1244. options->serverState = exp[idx++];
  1245. options->clientState = exp[idx++];
  1246. options->handShakeState = exp[idx++];
  1247. options->handShakeDone = exp[idx++];
  1248. options->minDowngrade = exp[idx++];
  1249. options->connectState = exp[idx++];
  1250. options->acceptState = exp[idx++];
  1251. options->asyncState = exp[idx++];
  1252. if (type == WOLFSSL_EXPORT_TLS) {
  1253. #ifdef HAVE_ENCRYPT_THEN_MAC
  1254. options->disallowEncThenMac = exp[idx++];
  1255. options->encThenMac = exp[idx++];
  1256. options->startedETMRead = exp[idx++];
  1257. options->startedETMWrite = exp[idx++];
  1258. #else
  1259. idx++;
  1260. idx++;
  1261. idx++;
  1262. idx++;
  1263. #endif
  1264. }
  1265. /* version of connection */
  1266. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  1267. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  1268. return VERSION_ERROR;
  1269. }
  1270. /* set TLS 1.3 flag in options if this was a TLS 1.3 connection */
  1271. if (ssl->version.major == SSLv3_MAJOR &&
  1272. ssl->version.minor == TLSv1_3_MINOR) {
  1273. options->tls1_3 = 1;
  1274. }
  1275. return idx;
  1276. }
  1277. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  1278. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  1279. {
  1280. int idx = 0;
  1281. int ipSz = MAX_EXPORT_IP; /* start as max size */
  1282. int fam = 0;
  1283. word16 port = 0;
  1284. char ip[MAX_EXPORT_IP];
  1285. if (ver != WOLFSSL_EXPORT_VERSION) {
  1286. WOLFSSL_MSG("Export version not supported");
  1287. return BAD_FUNC_ARG;
  1288. }
  1289. if (ssl == NULL || exp == NULL ||
  1290. len < (sizeof(ip) + 3 * WOLFSSL_EXPORT_LEN)) {
  1291. return BAD_FUNC_ARG;
  1292. }
  1293. if (ssl->ctx->CBGetPeer == NULL) {
  1294. WOLFSSL_MSG("No get peer call back set");
  1295. return BAD_FUNC_ARG;
  1296. }
  1297. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  1298. WOLFSSL_MSG("Get peer callback error");
  1299. return SOCKET_ERROR_E;
  1300. }
  1301. /* check that ipSz/fam is not negative or too large since user can set cb */
  1302. if (ipSz < 0 || ipSz > MAX_EXPORT_IP || fam < 0) {
  1303. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  1304. return SOCKET_ERROR_E;
  1305. }
  1306. c16toa((word16)fam, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1307. c16toa((word16)ipSz, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1308. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  1309. c16toa(port, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1310. return idx;
  1311. }
  1312. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  1313. static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
  1314. {
  1315. word16 idx = 0;
  1316. word16 ipSz;
  1317. word16 fam;
  1318. word16 port;
  1319. char ip[MAX_EXPORT_IP];
  1320. if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_3) {
  1321. WOLFSSL_MSG("Export version not supported");
  1322. return BAD_FUNC_ARG;
  1323. }
  1324. if (len == 0) {
  1325. WOLFSSL_MSG("No peer info sent");
  1326. return 0;
  1327. }
  1328. if (ssl == NULL || buf == NULL || len < 3 * WOLFSSL_EXPORT_LEN) {
  1329. return BAD_FUNC_ARG;
  1330. }
  1331. /* import sin family */
  1332. ato16(buf + idx, &fam); idx += WOLFSSL_EXPORT_LEN;
  1333. /* import ip address idx, and ipSz are unsigned but cast for enum */
  1334. ato16(buf + idx, &ipSz); idx += WOLFSSL_EXPORT_LEN;
  1335. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + WOLFSSL_EXPORT_LEN) > len) {
  1336. return BUFFER_E;
  1337. }
  1338. XMEMSET(ip, 0, sizeof(ip));
  1339. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  1340. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  1341. ato16(buf + idx, &port); idx += WOLFSSL_EXPORT_LEN;
  1342. /* sanity check for a function to call, then use it to import peer info */
  1343. if (ssl->ctx->CBSetPeer == NULL) {
  1344. WOLFSSL_MSG("No set peer function");
  1345. return BAD_FUNC_ARG;
  1346. }
  1347. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  1348. WOLFSSL_MSG("Error setting peer info");
  1349. return SOCKET_ERROR_E;
  1350. }
  1351. return idx;
  1352. }
  1353. #ifdef WOLFSSL_DTLS
  1354. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1355. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1356. * passed in.
  1357. * On success returns the size of serialized session state.*/
  1358. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1359. {
  1360. int ret;
  1361. word32 idx = 0;
  1362. word32 totalLen = 0;
  1363. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1364. if (buf == NULL || ssl == NULL) {
  1365. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1366. return BAD_FUNC_ARG;
  1367. }
  1368. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1369. /* each of the following have a 2 byte length before data */
  1370. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1371. if (totalLen > sz) {
  1372. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1373. return BUFFER_E;
  1374. }
  1375. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1376. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1377. ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1378. idx += WOLFSSL_EXPORT_LEN; /* leave room for total length */
  1379. /* export keys struct and dtls state -- variable length stored in ret */
  1380. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1381. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1382. WOLFSSL_EXPORT_VERSION, 1, WOLFSSL_EXPORT_DTLS)) < 0) {
  1383. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1384. return ret;
  1385. }
  1386. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1387. /* place total length of exported buffer minus 2 bytes protocol/version */
  1388. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1389. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1390. /* if compiled with debug options then print the version, protocol, size */
  1391. {
  1392. char debug[256];
  1393. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1394. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1395. , (int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1396. WOLFSSL_MSG(debug);
  1397. }
  1398. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1399. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1400. return idx;
  1401. }
  1402. /* On success return amount of buffer consumed */
  1403. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1404. {
  1405. word32 idx = 0;
  1406. word16 length = 0;
  1407. int version;
  1408. int ret;
  1409. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1410. /* check at least enough room for protocol and length */
  1411. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1412. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1413. return BAD_FUNC_ARG;
  1414. }
  1415. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1416. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1417. WOLFSSL_MSG("Incorrect protocol");
  1418. return BAD_FUNC_ARG;
  1419. }
  1420. version = buf[idx++] & 0x0F;
  1421. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1422. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1423. WOLFSSL_MSG("Buffer size sanity check failed");
  1424. return BUFFER_E;
  1425. }
  1426. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1427. /* if compiled with debug options then print the version, protocol, size */
  1428. {
  1429. char debug[256];
  1430. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1431. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1432. , (int)version, buf[0], (buf[1] >> 4), length);
  1433. WOLFSSL_MSG(debug);
  1434. }
  1435. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1436. /* perform sanity checks and extract Options information used */
  1437. switch (version) {
  1438. case WOLFSSL_EXPORT_VERSION:
  1439. break;
  1440. default:
  1441. WOLFSSL_MSG("Bad export state version");
  1442. return BAD_FUNC_ARG;
  1443. }
  1444. /* perform sanity checks and extract Keys struct */
  1445. if (WOLFSSL_EXPORT_LEN + idx > sz) {
  1446. WOLFSSL_MSG("Import Key struct error");
  1447. return BUFFER_E;
  1448. }
  1449. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1450. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1451. WOLFSSL_MSG("Import Key struct error");
  1452. return BUFFER_E;
  1453. }
  1454. if ((ret = ImportKeyState(ssl, buf + idx, length, version,
  1455. WOLFSSL_EXPORT_DTLS)) < 0) {
  1456. WOLFSSL_MSG("Import Key struct error");
  1457. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1458. return ret;
  1459. }
  1460. idx += ret;
  1461. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1462. return idx;
  1463. }
  1464. #endif /* WOLFSSL_DTLS */
  1465. /**
  1466. * Imports a serialized buffer (both TLS and DTLS)
  1467. *
  1468. * @param ssl WOLFSSL structure to import into
  1469. * @param buf buffer containing serialized session
  1470. * @param sz size of buffer 'buf'
  1471. * @param type flag for TLS or DTLS
  1472. *
  1473. * @return the size of serialized buffer on success
  1474. */
  1475. int wolfSSL_session_import_internal(WOLFSSL* ssl, const unsigned char* buf,
  1476. unsigned int sz, int type)
  1477. {
  1478. word32 idx = 0;
  1479. word16 length = 0;
  1480. int version = 0;
  1481. int ret = 0;
  1482. int optSz = 0;
  1483. int rc;
  1484. byte validProto = 0; /* did we find a valid protocol */
  1485. WOLFSSL_ENTER("wolfSSL_session_import_internal");
  1486. /* check at least enough room for protocol and length */
  1487. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1488. ret = BAD_FUNC_ARG;
  1489. }
  1490. /* Check if is TLS export protocol */
  1491. if (ret == 0) {
  1492. if (buf[idx] == (byte)TLS_EXPORT_PRO &&
  1493. (buf[idx + 1] & 0xF0) == ((byte)TLS_EXPORT_PRO & 0xF0)) {
  1494. validProto = 1;
  1495. }
  1496. /* Check if is DTLS export protocol */
  1497. if (buf[idx] == (byte)DTLS_EXPORT_PRO &&
  1498. (buf[idx + 1] & 0xF0) == ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1499. validProto = 1;
  1500. }
  1501. if (validProto == 0) {
  1502. #ifdef WOLFSSL_DTLS
  1503. /* check if importing state only */
  1504. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1505. #else
  1506. WOLFSSL_MSG("Invalid serialized session protocol value");
  1507. ret = BAD_FUNC_ARG;
  1508. #endif
  1509. }
  1510. idx += 1;
  1511. }
  1512. if (ret == 0) {
  1513. version = buf[idx++] & 0x0F;
  1514. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1515. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1516. ret = BUFFER_E;
  1517. }
  1518. }
  1519. /* if compiled with debug options then print the version, protocol, size */
  1520. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1521. {
  1522. char debug[256];
  1523. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1524. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1525. , (int)version, buf[0], (buf[1] >> 4), length);
  1526. WOLFSSL_MSG(debug);
  1527. }
  1528. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1529. /* perform sanity checks and extract Options information used */
  1530. if (ret == 0) {
  1531. switch (version) {
  1532. case WOLFSSL_EXPORT_VERSION:
  1533. if (type == WOLFSSL_EXPORT_DTLS) {
  1534. optSz = DTLS_EXPORT_OPT_SZ;
  1535. }
  1536. else {
  1537. optSz = TLS_EXPORT_OPT_SZ;
  1538. }
  1539. break;
  1540. case WOLFSSL_EXPORT_VERSION_3:
  1541. WOLFSSL_MSG("Importing older version 3");
  1542. optSz = DTLS_EXPORT_OPT_SZ_3;
  1543. break;
  1544. default:
  1545. WOLFSSL_MSG("Bad export version");
  1546. ret = BAD_FUNC_ARG;
  1547. }
  1548. }
  1549. if (ret == 0 && (WOLFSSL_EXPORT_LEN + optSz + idx > sz)) {
  1550. WOLFSSL_MSG("Import Options struct error");
  1551. ret = BUFFER_E;
  1552. }
  1553. if (ret == 0) {
  1554. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1555. if (length != optSz) {
  1556. WOLFSSL_MSG("Import Options struct error");
  1557. ret = BUFFER_E;
  1558. }
  1559. }
  1560. if (ret == 0) {
  1561. rc = ImportOptions(ssl, buf + idx, length, version, type);
  1562. if (rc < 0) {
  1563. WOLFSSL_MSG("Import Options struct error");
  1564. ret = rc;
  1565. }
  1566. else {
  1567. idx += length;
  1568. }
  1569. }
  1570. /* perform sanity checks and extract Keys struct */
  1571. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1572. WOLFSSL_MSG("Import Key struct error");
  1573. ret = BUFFER_E;
  1574. }
  1575. if (ret == 0) {
  1576. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1577. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1578. WOLFSSL_MSG("Import Key struct error");
  1579. ret = BUFFER_E;
  1580. }
  1581. }
  1582. if (ret == 0) {
  1583. rc = ImportKeyState(ssl, buf + idx, length, version, type);
  1584. if (rc < 0) {
  1585. WOLFSSL_MSG("Import Key struct error");
  1586. ret = rc;
  1587. }
  1588. else {
  1589. idx += rc;
  1590. }
  1591. }
  1592. /* perform sanity checks and extract CipherSpecs struct */
  1593. if (ret == 0 && (WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ + idx > sz)) {
  1594. WOLFSSL_MSG("Import CipherSpecs struct error");
  1595. ret = BUFFER_E;
  1596. }
  1597. if (ret == 0) {
  1598. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1599. if (length != WOLFSSL_EXPORT_SPC_SZ) {
  1600. WOLFSSL_MSG("Import CipherSpecs struct error");
  1601. ret = BUFFER_E;
  1602. }
  1603. }
  1604. if (ret == 0) {
  1605. rc = ImportCipherSpecState(ssl, buf + idx, length, version, type);
  1606. if (rc < 0) {
  1607. WOLFSSL_MSG("Import CipherSpecs struct error");
  1608. ret = rc;
  1609. }
  1610. else {
  1611. idx += rc;
  1612. }
  1613. }
  1614. /* perform sanity checks and extract DTLS peer info */
  1615. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1616. WOLFSSL_MSG("Import DTLS peer info error");
  1617. ret = BUFFER_E;
  1618. }
  1619. if (ret == 0) {
  1620. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1621. if (idx + length > sz) {
  1622. WOLFSSL_MSG("Import DTLS peer info error");
  1623. ret = BUFFER_E;
  1624. }
  1625. }
  1626. if (ret == 0) {
  1627. rc = ImportPeerInfo(ssl, buf + idx, length, version);
  1628. if (rc < 0) {
  1629. WOLFSSL_MSG("Import Peer Addr error");
  1630. ret = rc;
  1631. }
  1632. else {
  1633. idx += rc;
  1634. }
  1635. }
  1636. /* make sure is a valid suite used */
  1637. if (ret == 0 && wolfSSL_get_cipher(ssl) == NULL) {
  1638. WOLFSSL_MSG("Can not match cipher suite imported");
  1639. ret = MATCH_SUITE_ERROR;
  1640. }
  1641. #ifndef WOLFSSL_AEAD_ONLY
  1642. /* set hmac function to use when verifying */
  1643. if (ret == 0 && (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1644. ssl->options.dtls == 1)) {
  1645. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  1646. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  1647. ssl->hmac = TLS_hmac;
  1648. #else
  1649. ssl->hmac = Renesas_cmn_TLS_hmac;
  1650. #endif
  1651. }
  1652. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1653. if (ret == 0 && ssl->specs.cipher_type == stream &&
  1654. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1655. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1656. ret = SANITY_CIPHER_E;
  1657. }
  1658. #endif /* !WOLFSSL_AEAD_ONLY */
  1659. if (ret != 0) {
  1660. idx = ret;
  1661. }
  1662. WOLFSSL_LEAVE("wolfSSL_session_import_internal", idx);
  1663. return idx;
  1664. }
  1665. /**
  1666. * Handles serializing the session information.
  1667. *
  1668. * @param ssl WOLFSSL structure to serialize session from
  1669. * @param buf output buffer to hold serialized session
  1670. * @param sz the size of buffer 'buf', if too small then gets updated
  1671. * @param type if the input WOLFSSL structure is expected to be TLS or DTLS
  1672. * 1 for yes is TLS and 0 for no is DTLS
  1673. *
  1674. * @return the size of serialized buffer on success and negative values on fail
  1675. */
  1676. int wolfSSL_session_export_internal(WOLFSSL* ssl, byte* buf, word32* sz,
  1677. int type)
  1678. {
  1679. int ret = 0;
  1680. word32 idx = 0;
  1681. word32 totalLen = 0;
  1682. WOLFSSL_ENTER("wolfSSL_session_export_internal");
  1683. if (ssl == NULL) {
  1684. WOLFSSL_MSG("unexpected null argument");
  1685. ret = BAD_FUNC_ARG;
  1686. }
  1687. if (ret == 0) {
  1688. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1689. /* each of the following have a 2 byte length before data */
  1690. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1691. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1692. totalLen += WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ;
  1693. #ifdef WOLFSSL_DTLS
  1694. if (type == WOLFSSL_EXPORT_DTLS) {
  1695. totalLen += WOLFSSL_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1696. }
  1697. #endif
  1698. }
  1699. /* check is at least the minimum size needed, TLS cipher states add more */
  1700. if (ret == 0 && (totalLen > *sz || buf == NULL)) {
  1701. WOLFSSL_MSG("export buffer was too small or null");
  1702. *sz = totalLen;
  1703. /* possible AES state needed */
  1704. if (type == WOLFSSL_EXPORT_TLS) {
  1705. *sz += AES_BLOCK_SIZE*2;
  1706. }
  1707. ret = LENGTH_ONLY_E;
  1708. }
  1709. if (ret == 0) {
  1710. buf[idx++] = (byte)(type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1711. DTLS_EXPORT_PRO;
  1712. buf[idx++] = ((byte)((type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1713. DTLS_EXPORT_PRO) & 0xF0)
  1714. | ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1715. idx += WOLFSSL_EXPORT_LEN; /* leave spot for length of total buffer */
  1716. idx += WOLFSSL_EXPORT_LEN;
  1717. ret = ExportOptions(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1718. type);
  1719. if (ret >= 0) {
  1720. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1721. idx += ret;
  1722. ret = 0;
  1723. }
  1724. }
  1725. /* export keys struct and dtls state -- variable length stored in ret */
  1726. if (ret == 0) {
  1727. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1728. ret = ExportKeyState(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1729. 0, type);
  1730. if (ret >= 0) {
  1731. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1732. ret = 0;
  1733. }
  1734. }
  1735. /* export of cipher specs struct */
  1736. if (ret == 0) {
  1737. c16toa((word16)WOLFSSL_EXPORT_SPC_SZ, buf + idx);
  1738. idx += WOLFSSL_EXPORT_LEN;
  1739. ret = ExportCipherSpecState(ssl, buf + idx, *sz - idx,
  1740. WOLFSSL_EXPORT_VERSION, type);
  1741. if (ret >= 0) {
  1742. idx += ret;
  1743. ret = 0;
  1744. }
  1745. }
  1746. /* export of peer information */
  1747. if (ret == 0) {
  1748. idx += WOLFSSL_EXPORT_LEN;
  1749. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1750. ret = 0; /* not saving peer port/ip information */
  1751. #else
  1752. ret = ExportPeerInfo(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION);
  1753. #endif
  1754. if (ret >= 0) {
  1755. c16toa(ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1756. idx += ret;
  1757. ret = 0;
  1758. }
  1759. }
  1760. if (ret != 0 && buf != NULL) {
  1761. /*in a fail case clear the buffer which could contain partial key info*/
  1762. XMEMSET(buf, 0, *sz);
  1763. }
  1764. /* place total length of exported buffer minus 2 bytes protocol/version */
  1765. if (ret == 0) {
  1766. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1767. ret = idx;
  1768. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1769. {
  1770. char debug[256];
  1771. XSNPRINTF(debug, sizeof(debug), "Exporting TLS session\n"
  1772. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1773. ,(int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1774. WOLFSSL_MSG(debug);
  1775. }
  1776. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1777. }
  1778. if (ret >= 0) {
  1779. *sz = ret;
  1780. }
  1781. WOLFSSL_LEAVE("wolfSSL_session_export_internal", ret);
  1782. return ret;
  1783. }
  1784. #endif /* WOLFSSL_SESSION_EXPORT */
  1785. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1786. {
  1787. method->version = pv;
  1788. method->side = WOLFSSL_CLIENT_END;
  1789. method->downgrade = 0;
  1790. }
  1791. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) || \
  1792. defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  1793. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1794. {
  1795. if (ssl == NULL)
  1796. return BAD_FUNC_ARG;
  1797. /* set side */
  1798. ssl->options.side = side;
  1799. /* reset options that are side specific */
  1800. #ifdef HAVE_ECC
  1801. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1802. ssl->options.haveECDSAsig = 1; /* always on client side */
  1803. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1804. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1805. }
  1806. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1807. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1808. ssl->options.haveECDSAsig = 1; /* always on client side */
  1809. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1810. }
  1811. #endif
  1812. #ifdef HAVE_PQC
  1813. #ifdef HAVE_FALCON
  1814. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1815. ssl->options.haveFalconSig = 1; /* always on client side */
  1816. }
  1817. #endif /* HAVE_FALCON */
  1818. #ifdef HAVE_DILITHIUM
  1819. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1820. ssl->options.haveDilithiumSig = 1; /* always on client side */
  1821. }
  1822. #endif /* HAVE_DILITHIUM */
  1823. #endif /* HAVE_PQC */
  1824. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1825. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1826. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1827. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1828. ssl->options.haveEMS = 1;
  1829. }
  1830. #ifdef WOLFSSL_DTLS
  1831. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1832. ssl->options.haveEMS = 1;
  1833. #endif /* WOLFSSL_DTLS */
  1834. }
  1835. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1836. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  1837. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  1838. int ret;
  1839. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  1840. if (ret != 0) {
  1841. WOLFSSL_MSG("DTLS Cookie Secret error");
  1842. return ret;
  1843. }
  1844. }
  1845. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  1846. return InitSSL_Suites(ssl);
  1847. }
  1848. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1849. /* Initialize SSL context, return 0 on success */
  1850. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1851. {
  1852. int ret = 0;
  1853. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1854. ctx->method = method;
  1855. ctx->refCount = 1; /* so either CTX_free or SSL_free can release */
  1856. ctx->heap = ctx; /* defaults to self */
  1857. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1858. #ifdef WOLFSSL_DTLS
  1859. if (method->version.major == DTLS_MAJOR) {
  1860. ctx->minDowngrade = WOLFSSL_MIN_DTLS_DOWNGRADE;
  1861. }
  1862. else
  1863. #endif /* WOLFSSL_DTLS */
  1864. {
  1865. /* current default: TLSv1_MINOR */
  1866. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE;
  1867. }
  1868. if (wc_InitMutex(&ctx->countMutex) < 0) {
  1869. WOLFSSL_MSG("Mutex error on CTX init");
  1870. ctx->err = CTX_INIT_MUTEX_E;
  1871. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  1872. return BAD_MUTEX_E;
  1873. }
  1874. #ifndef NO_CERTS
  1875. ctx->privateKeyDevId = INVALID_DEVID;
  1876. #endif
  1877. #ifndef NO_DH
  1878. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1879. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1880. #endif
  1881. #ifndef NO_RSA
  1882. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1883. #endif
  1884. #ifdef HAVE_ECC
  1885. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1886. ctx->eccTempKeySz = ECDHE_SIZE;
  1887. #endif
  1888. #ifdef HAVE_PQC
  1889. #ifdef HAVE_FALCON
  1890. ctx->minFalconKeySz = MIN_FALCONKEY_SZ;
  1891. #endif /* HAVE_FALCON */
  1892. #ifdef HAVE_DILITHIUM
  1893. ctx->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ;
  1894. #endif /* HAVE_DILITHIUM */
  1895. #endif /* HAVE_PQC */
  1896. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1897. #ifdef OPENSSL_EXTRA
  1898. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1899. #endif
  1900. #ifdef HAVE_NETX
  1901. ctx->CBIORecv = NetX_Receive;
  1902. ctx->CBIOSend = NetX_Send;
  1903. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1904. ctx->CBIORecv = Mynewt_Receive;
  1905. ctx->CBIOSend = Mynewt_Send;
  1906. #elif defined WOLFSSL_LWIP_NATIVE
  1907. ctx->CBIORecv = LwIPNativeReceive;
  1908. ctx->CBIOSend = LwIPNativeSend;
  1909. #elif defined(WOLFSSL_GNRC)
  1910. ctx->CBIORecv = GNRC_ReceiveFrom;
  1911. ctx->CBIOSend = GNRC_SendTo;
  1912. #elif defined WOLFSSL_ISOTP
  1913. ctx->CBIORecv = ISOTP_Receive;
  1914. ctx->CBIOSend = ISOTP_Send;
  1915. #elif !defined(WOLFSSL_USER_IO)
  1916. #ifdef MICRIUM
  1917. ctx->CBIORecv = MicriumReceive;
  1918. ctx->CBIOSend = MicriumSend;
  1919. #ifdef WOLFSSL_DTLS
  1920. if (method->version.major == DTLS_MAJOR) {
  1921. ctx->CBIORecv = MicriumReceiveFrom;
  1922. ctx->CBIOSend = MicriumSendTo;
  1923. }
  1924. #ifdef WOLFSSL_SESSION_EXPORT
  1925. #error Micrium port does not support DTLS session export yet
  1926. #endif
  1927. #endif
  1928. #elif defined WOLFSSL_UIP
  1929. ctx->CBIORecv = uIPReceive;
  1930. ctx->CBIOSend = uIPSend;
  1931. #ifdef WOLFSSL_DTLS
  1932. if (method->version.major == DTLS_MAJOR) {
  1933. ctx->CBIOSendTo = uIPSendTo;
  1934. ctx->CBIORecvFrom = uIPRecvFrom;
  1935. }
  1936. #endif
  1937. #else
  1938. ctx->CBIORecv = EmbedReceive;
  1939. ctx->CBIOSend = EmbedSend;
  1940. #ifdef WOLFSSL_SESSION_EXPORT
  1941. ctx->CBGetPeer = EmbedGetPeer;
  1942. ctx->CBSetPeer = EmbedSetPeer;
  1943. #endif
  1944. #ifdef WOLFSSL_DTLS
  1945. if (method->version.major == DTLS_MAJOR) {
  1946. ctx->CBIORecv = EmbedReceiveFrom;
  1947. ctx->CBIOSend = EmbedSendTo;
  1948. }
  1949. #endif
  1950. #endif /* MICRIUM */
  1951. #endif /* WOLFSSL_USER_IO */
  1952. #ifdef HAVE_PQC
  1953. #ifdef HAVE_FALCON
  1954. if (method->side == WOLFSSL_CLIENT_END)
  1955. ctx->haveFalconSig = 1; /* always on client side */
  1956. /* server can turn on by loading key */
  1957. #endif /* HAVE_FALCON */
  1958. #ifdef HAVE_DILITHIUM
  1959. if (method->side == WOLFSSL_CLIENT_END)
  1960. ctx->haveDilithiumSig = 1; /* always on client side */
  1961. /* server can turn on by loading key */
  1962. #endif /* HAVE_DILITHIUM */
  1963. #endif /* HAVE_PQC */
  1964. #ifdef HAVE_ECC
  1965. if (method->side == WOLFSSL_CLIENT_END) {
  1966. ctx->haveECDSAsig = 1; /* always on client side */
  1967. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1968. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  1969. }
  1970. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1971. if (method->side == WOLFSSL_CLIENT_END) {
  1972. ctx->haveECDSAsig = 1; /* always on client side */
  1973. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1974. }
  1975. #endif
  1976. #ifdef WOLFSSL_QNX_CAAM
  1977. /* default to try using CAAM when built */
  1978. ctx->devId = WOLFSSL_CAAM_DEVID;
  1979. #else
  1980. ctx->devId = INVALID_DEVID;
  1981. #endif
  1982. #if defined(WOLFSSL_DTLS)
  1983. #ifdef WOLFSSL_SCTP
  1984. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  1985. #elif defined(WOLFSSL_DTLS_MTU)
  1986. ctx->dtlsMtuSz = MAX_MTU;
  1987. #endif
  1988. #endif
  1989. #ifndef NO_CERTS
  1990. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  1991. if (ctx->cm == NULL) {
  1992. WOLFSSL_MSG("Bad Cert Manager New");
  1993. WOLFSSL_ERROR_VERBOSE(BAD_CERT_MANAGER_ERROR);
  1994. return BAD_CERT_MANAGER_ERROR;
  1995. }
  1996. #ifdef OPENSSL_EXTRA
  1997. /* setup WOLFSSL_X509_STORE */
  1998. ctx->x509_store.cm = ctx->cm;
  1999. /* set pointer back to x509 store */
  2000. ctx->cm->x509_store_p = &ctx->x509_store;
  2001. /* WOLFSSL_X509_VERIFY_PARAM */
  2002. if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  2003. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  2004. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  2005. WOLFSSL_MSG("ctx->param memory error");
  2006. return MEMORY_E;
  2007. }
  2008. XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  2009. /* WOLFSSL_X509_LOOKUP */
  2010. if ((ctx->x509_store.lookup.dirs =
  2011. (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR),
  2012. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  2013. WOLFSSL_MSG("ctx-x509_store.lookup.dir memory allocation error");
  2014. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  2015. ctx->param = NULL;
  2016. return MEMORY_E;
  2017. }
  2018. XMEMSET(ctx->x509_store.lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
  2019. if (wc_InitMutex(&ctx->x509_store.lookup.dirs->lock) != 0) {
  2020. WOLFSSL_MSG("Bad mutex init");
  2021. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  2022. ctx->param = NULL;
  2023. XFREE(ctx->x509_store.lookup.dirs, heap, DYNAMIC_TYPE_OPENSSL);
  2024. ctx->x509_store.lookup.dirs = NULL;
  2025. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  2026. return BAD_MUTEX_E;
  2027. }
  2028. #endif
  2029. #endif
  2030. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  2031. if (method->side == WOLFSSL_CLIENT_END) {
  2032. if ((method->version.major == SSLv3_MAJOR) &&
  2033. (method->version.minor >= TLSv1_MINOR)) {
  2034. ctx->haveEMS = 1;
  2035. }
  2036. #ifdef WOLFSSL_DTLS
  2037. if (method->version.major == DTLS_MAJOR)
  2038. ctx->haveEMS = 1;
  2039. #endif /* WOLFSSL_DTLS */
  2040. }
  2041. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  2042. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  2043. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  2044. ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
  2045. if (ret != 0) return ret;
  2046. ctx->ticketEncCb = DefTicketEncCb;
  2047. ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
  2048. #endif
  2049. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  2050. #if defined(WOLFSSL_TLS13)
  2051. ctx->maxTicketTls13 = 1; /* default to sending a session ticket if compiled
  2052. in */
  2053. #endif
  2054. #endif
  2055. #ifdef WOLFSSL_EARLY_DATA
  2056. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  2057. #endif
  2058. #if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
  2059. ctx->noPskDheKe = 1;
  2060. #endif
  2061. #if defined(WOLFSSL_QT) && !defined(NO_PSK)
  2062. /* Qt retrieves supported cipher list at initialization
  2063. * from get_cipher_compat().
  2064. * Qt doesn't allow to use a cipher if it is not in the supported list.
  2065. * Therefore, we need to enable PSK cipher at the beginning.
  2066. */
  2067. ctx->havePSK = 1;
  2068. #endif
  2069. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  2070. #ifdef HAVE_WOLF_EVENT
  2071. ret = wolfEventQueue_Init(&ctx->event_queue);
  2072. #endif /* HAVE_WOLF_EVENT */
  2073. return ret;
  2074. }
  2075. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2076. void wolfSSL_CRYPTO_cleanup_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data)
  2077. {
  2078. int n_ex_data = (int)(sizeof ex_data->ex_data / sizeof ex_data->ex_data[0]);
  2079. for (--n_ex_data; n_ex_data >= 0; --n_ex_data) {
  2080. if (ex_data->ex_data[n_ex_data] != NULL)
  2081. (void)wolfSSL_CRYPTO_set_ex_data_with_cleanup(ex_data, n_ex_data,
  2082. NULL, NULL);
  2083. }
  2084. }
  2085. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  2086. /* In case contexts are held in array and don't want to free actual ctx. */
  2087. /* The allocations done in InitSSL_Ctx must be free'd with ctx->onHeapHint
  2088. * logic. A WOLFSSL_CTX can be assigned a static memory heap hint using
  2089. * wolfSSL_CTX_load_static_memory after CTX creation, which means variables
  2090. * allocated in InitSSL_Ctx were allocated from heap and should be free'd with
  2091. * a NULL heap hint. */
  2092. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  2093. {
  2094. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
  2095. defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
  2096. int i;
  2097. #endif
  2098. void* heapAtCTXInit = ctx->heap;
  2099. #ifdef WOLFSSL_STATIC_MEMORY
  2100. if (ctx->onHeapHint == 0) {
  2101. heapAtCTXInit = NULL;
  2102. }
  2103. #endif
  2104. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2105. wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
  2106. #endif
  2107. #ifdef HAVE_WOLF_EVENT
  2108. wolfEventQueue_Free(&ctx->event_queue);
  2109. #endif /* HAVE_WOLF_EVENT */
  2110. XFREE(ctx->method, heapAtCTXInit, DYNAMIC_TYPE_METHOD);
  2111. ctx->method = NULL;
  2112. if (ctx->suites) {
  2113. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  2114. ctx->suites = NULL;
  2115. }
  2116. #ifndef NO_DH
  2117. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2118. ctx->serverDH_G.buffer = NULL;
  2119. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2120. ctx->serverDH_P.buffer = NULL;
  2121. #endif /* !NO_DH */
  2122. #ifdef SINGLE_THREADED
  2123. if (ctx->rng) {
  2124. wc_FreeRng(ctx->rng);
  2125. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  2126. ctx->rng = NULL;
  2127. }
  2128. #endif /* SINGLE_THREADED */
  2129. #ifndef NO_CERTS
  2130. if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) {
  2131. ForceZero(ctx->privateKey->buffer, ctx->privateKey->length);
  2132. }
  2133. FreeDer(&ctx->privateKey);
  2134. #ifdef OPENSSL_ALL
  2135. wolfSSL_EVP_PKEY_free(ctx->privateKeyPKey);
  2136. #endif
  2137. FreeDer(&ctx->certificate);
  2138. #ifdef KEEP_OUR_CERT
  2139. if (ctx->ourCert && ctx->ownOurCert) {
  2140. wolfSSL_X509_free(ctx->ourCert);
  2141. ctx->ourCert = NULL;
  2142. }
  2143. #endif /* KEEP_OUR_CERT */
  2144. FreeDer(&ctx->certChain);
  2145. wolfSSL_CertManagerFree(ctx->cm);
  2146. ctx->cm = NULL;
  2147. #ifdef OPENSSL_ALL
  2148. if (ctx->x509_store.objs != NULL) {
  2149. wolfSSL_sk_X509_OBJECT_pop_free(ctx->x509_store.objs, NULL);
  2150. ctx->x509_store.objs = NULL;
  2151. }
  2152. #endif
  2153. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
  2154. defined(WOLFSSL_WPAS_SMALL)
  2155. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  2156. #endif
  2157. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  2158. wolfSSL_sk_X509_NAME_pop_free(ctx->ca_names, NULL);
  2159. ctx->ca_names = NULL;
  2160. #endif
  2161. #ifdef OPENSSL_EXTRA
  2162. if (ctx->x509Chain) {
  2163. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  2164. ctx->x509Chain = NULL;
  2165. }
  2166. #endif
  2167. #endif /* !NO_CERTS */
  2168. #ifdef HAVE_TLS_EXTENSIONS
  2169. #if !defined(NO_TLS)
  2170. TLSX_FreeAll(ctx->extensions, ctx->heap);
  2171. #endif /* !NO_TLS */
  2172. #ifndef NO_WOLFSSL_SERVER
  2173. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  2174. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  2175. if (ctx->certOcspRequest) {
  2176. FreeOcspRequest(ctx->certOcspRequest);
  2177. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2178. }
  2179. #endif
  2180. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2181. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  2182. if (ctx->chainOcspRequest[i]) {
  2183. FreeOcspRequest(ctx->chainOcspRequest[i]);
  2184. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2185. ctx->chainOcspRequest[i] = NULL;
  2186. }
  2187. }
  2188. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2189. #endif /* !NO_WOLFSSL_SERVER */
  2190. #endif /* HAVE_TLS_EXTENSIONS */
  2191. #ifdef OPENSSL_EXTRA
  2192. if (ctx->alpn_cli_protos) {
  2193. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  2194. ctx->alpn_cli_protos = NULL;
  2195. }
  2196. if (ctx->param) {
  2197. XFREE(ctx->param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2198. ctx->param = NULL;
  2199. }
  2200. if (ctx->x509_store.lookup.dirs) {
  2201. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  2202. if (ctx->x509_store.lookup.dirs->dir_entry) {
  2203. wolfSSL_sk_BY_DIR_entry_free(ctx->x509_store.lookup.dirs->dir_entry);
  2204. }
  2205. #endif
  2206. wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
  2207. XFREE(ctx->x509_store.lookup.dirs, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2208. }
  2209. #endif
  2210. #ifdef WOLFSSL_STATIC_EPHEMERAL
  2211. #ifndef NO_DH
  2212. FreeDer(&ctx->staticKE.dhKey);
  2213. #endif
  2214. #ifdef HAVE_ECC
  2215. FreeDer(&ctx->staticKE.ecKey);
  2216. #endif
  2217. #ifdef HAVE_CURVE25519
  2218. FreeDer(&ctx->staticKE.x25519Key);
  2219. #endif
  2220. #ifdef HAVE_CURVE448
  2221. FreeDer(&ctx->staticKE.x448Key);
  2222. #endif
  2223. #ifndef SINGLE_THREADED
  2224. if (ctx->staticKELockInit) {
  2225. wc_FreeMutex(&ctx->staticKELock);
  2226. ctx->staticKELockInit = 0;
  2227. }
  2228. #endif
  2229. #endif
  2230. (void)heapAtCTXInit;
  2231. }
  2232. #ifdef WOLFSSL_STATIC_MEMORY
  2233. static void SSL_CtxResourceFreeStaticMem(void* heap)
  2234. {
  2235. if (heap != NULL
  2236. #ifdef WOLFSSL_HEAP_TEST
  2237. /* avoid dereferencing a test value */
  2238. && heap != (void*)WOLFSSL_HEAP_TEST
  2239. #endif
  2240. ) {
  2241. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)heap;
  2242. WOLFSSL_HEAP* mem = hint->memory;
  2243. wc_FreeMutex(&mem->memory_mutex);
  2244. }
  2245. }
  2246. #endif /* WOLFSSL_STATIC_MEMORY */
  2247. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  2248. {
  2249. int refCount;
  2250. void* heap = ctx->heap;
  2251. #ifdef WOLFSSL_STATIC_MEMORY
  2252. if (ctx->onHeapHint == 0) {
  2253. heap = NULL;
  2254. }
  2255. #endif
  2256. /* decrement CTX reference count */
  2257. if ((refCount = SSL_CTX_RefCount(ctx, -1)) < 0) {
  2258. /* check error state, if mutex error code then mutex init failed but
  2259. * CTX was still malloc'd */
  2260. if (ctx->err == CTX_INIT_MUTEX_E) {
  2261. SSL_CtxResourceFree(ctx);
  2262. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2263. #ifdef WOLFSSL_STATIC_MEMORY
  2264. SSL_CtxResourceFreeStaticMem(heap);
  2265. #endif
  2266. }
  2267. return;
  2268. }
  2269. if (refCount == 0) {
  2270. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  2271. SSL_CtxResourceFree(ctx);
  2272. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  2273. !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  2274. TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
  2275. #endif
  2276. wc_FreeMutex(&ctx->countMutex);
  2277. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2278. #ifdef WOLFSSL_STATIC_MEMORY
  2279. SSL_CtxResourceFreeStaticMem(heap);
  2280. #endif
  2281. }
  2282. else {
  2283. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  2284. }
  2285. (void)heap; /* not used in some builds */
  2286. }
  2287. /* Set cipher pointers to null */
  2288. void InitCiphers(WOLFSSL* ssl)
  2289. {
  2290. #ifdef BUILD_ARC4
  2291. ssl->encrypt.arc4 = NULL;
  2292. ssl->decrypt.arc4 = NULL;
  2293. #endif
  2294. #ifdef BUILD_DES3
  2295. ssl->encrypt.des3 = NULL;
  2296. ssl->decrypt.des3 = NULL;
  2297. #endif
  2298. #ifdef BUILD_AES
  2299. ssl->encrypt.aes = NULL;
  2300. ssl->decrypt.aes = NULL;
  2301. #endif
  2302. #ifdef HAVE_CAMELLIA
  2303. ssl->encrypt.cam = NULL;
  2304. ssl->decrypt.cam = NULL;
  2305. #endif
  2306. #ifdef HAVE_CHACHA
  2307. ssl->encrypt.chacha = NULL;
  2308. ssl->decrypt.chacha = NULL;
  2309. #endif
  2310. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2311. ssl->auth.poly1305 = NULL;
  2312. #endif
  2313. ssl->encrypt.setup = 0;
  2314. ssl->decrypt.setup = 0;
  2315. #ifdef HAVE_ONE_TIME_AUTH
  2316. ssl->auth.setup = 0;
  2317. #endif
  2318. #ifdef WOLFSSL_DTLS13
  2319. XMEMSET(&ssl->dtlsRecordNumberEncrypt, 0,
  2320. sizeof(ssl->dtlsRecordNumberEncrypt));
  2321. XMEMSET(&ssl->dtlsRecordNumberDecrypt, 0,
  2322. sizeof(ssl->dtlsRecordNumberEncrypt));
  2323. #endif /* WOLFSSL_DTLS13 */
  2324. }
  2325. /* Free ciphers */
  2326. void FreeCiphers(WOLFSSL* ssl)
  2327. {
  2328. (void)ssl;
  2329. #ifdef BUILD_ARC4
  2330. wc_Arc4Free(ssl->encrypt.arc4);
  2331. wc_Arc4Free(ssl->decrypt.arc4);
  2332. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2333. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2334. #endif
  2335. #ifdef BUILD_DES3
  2336. wc_Des3Free(ssl->encrypt.des3);
  2337. wc_Des3Free(ssl->decrypt.des3);
  2338. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2339. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2340. #endif
  2341. #if defined(BUILD_AES) || defined(BUILD_AESGCM) /* See: InitKeys() in keys.c
  2342. * on addition of BUILD_AESGCM
  2343. * check (enc->aes, dec->aes) */
  2344. wc_AesFree(ssl->encrypt.aes);
  2345. wc_AesFree(ssl->decrypt.aes);
  2346. #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \
  2347. !defined(WOLFSSL_NO_TLS12)
  2348. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2349. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2350. #endif
  2351. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2352. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2353. #endif
  2354. #ifdef CIPHER_NONCE
  2355. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2356. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2357. #endif
  2358. #ifdef HAVE_CAMELLIA
  2359. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2360. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2361. #endif
  2362. #ifdef HAVE_CHACHA
  2363. if (ssl->encrypt.chacha)
  2364. ForceZero(ssl->encrypt.chacha, sizeof(ChaCha));
  2365. if (ssl->decrypt.chacha)
  2366. ForceZero(ssl->decrypt.chacha, sizeof(ChaCha));
  2367. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2368. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2369. #endif
  2370. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2371. if (ssl->auth.poly1305)
  2372. ForceZero(ssl->auth.poly1305, sizeof(Poly1305));
  2373. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2374. #endif
  2375. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  2376. wc_HmacFree(ssl->encrypt.hmac);
  2377. wc_HmacFree(ssl->decrypt.hmac);
  2378. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2379. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2380. #endif
  2381. #ifdef WOLFSSL_DTLS13
  2382. #ifdef BUILD_AES
  2383. if (ssl->dtlsRecordNumberEncrypt.aes != NULL) {
  2384. wc_AesFree(ssl->dtlsRecordNumberEncrypt.aes);
  2385. XFREE(ssl->dtlsRecordNumberEncrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2386. ssl->dtlsRecordNumberEncrypt.aes = NULL;
  2387. }
  2388. if (ssl->dtlsRecordNumberDecrypt.aes != NULL) {
  2389. wc_AesFree(ssl->dtlsRecordNumberDecrypt.aes);
  2390. XFREE(ssl->dtlsRecordNumberDecrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2391. ssl->dtlsRecordNumberDecrypt.aes = NULL;
  2392. }
  2393. #endif /* BUILD_AES */
  2394. #ifdef HAVE_CHACHA
  2395. XFREE(ssl->dtlsRecordNumberEncrypt.chacha,
  2396. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2397. XFREE(ssl->dtlsRecordNumberDecrypt.chacha,
  2398. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2399. ssl->dtlsRecordNumberEncrypt.chacha = NULL;
  2400. ssl->dtlsRecordNumberDecrypt.chacha = NULL;
  2401. #endif /* HAVE_CHACHA */
  2402. #endif /* WOLFSSL_DTLS13 */
  2403. }
  2404. void InitCipherSpecs(CipherSpecs* cs)
  2405. {
  2406. XMEMSET(cs, 0, sizeof(CipherSpecs));
  2407. cs->bulk_cipher_algorithm = INVALID_BYTE;
  2408. cs->cipher_type = INVALID_BYTE;
  2409. cs->mac_algorithm = INVALID_BYTE;
  2410. cs->kea = INVALID_BYTE;
  2411. cs->sig_algo = INVALID_BYTE;
  2412. }
  2413. #if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
  2414. defined(HAVE_ECC))
  2415. static int GetMacDigestSize(byte macAlgo)
  2416. {
  2417. switch (macAlgo) {
  2418. #ifndef NO_SHA
  2419. case sha_mac:
  2420. return WC_SHA_DIGEST_SIZE;
  2421. #endif
  2422. #ifndef NO_SHA256
  2423. case sha256_mac:
  2424. return WC_SHA256_DIGEST_SIZE;
  2425. #endif
  2426. #ifdef WOLFSSL_SHA384
  2427. case sha384_mac:
  2428. return WC_SHA384_DIGEST_SIZE;
  2429. #endif
  2430. #ifdef WOLFSSL_SHA512
  2431. case sha512_mac:
  2432. return WC_SHA512_DIGEST_SIZE;
  2433. #endif
  2434. default:
  2435. break;
  2436. }
  2437. return NOT_COMPILED_IN;
  2438. }
  2439. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2440. static WC_INLINE void AddSuiteHashSigAlgo(Suites* suites, byte macAlgo,
  2441. byte sigAlgo, int keySz, word16* inOutIdx)
  2442. {
  2443. int addSigAlgo = 1;
  2444. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  2445. if (sigAlgo == ecc_dsa_sa_algo) {
  2446. int digestSz = GetMacDigestSize(macAlgo);
  2447. /* do not add sig/algos with digest size larger than key size */
  2448. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  2449. addSigAlgo = 0;
  2450. }
  2451. }
  2452. #else
  2453. (void)keySz;
  2454. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2455. if (addSigAlgo) {
  2456. #ifdef HAVE_ED25519
  2457. if (sigAlgo == ed25519_sa_algo) {
  2458. suites->hashSigAlgo[*inOutIdx] = ED25519_SA_MAJOR;
  2459. *inOutIdx += 1;
  2460. suites->hashSigAlgo[*inOutIdx] = ED25519_SA_MINOR;
  2461. *inOutIdx += 1;
  2462. }
  2463. else
  2464. #endif
  2465. #ifdef HAVE_ED448
  2466. if (sigAlgo == ed448_sa_algo) {
  2467. suites->hashSigAlgo[*inOutIdx] = ED448_SA_MAJOR;
  2468. *inOutIdx += 1;
  2469. suites->hashSigAlgo[*inOutIdx] = ED448_SA_MINOR;
  2470. *inOutIdx += 1;
  2471. }
  2472. else
  2473. #endif
  2474. #ifdef HAVE_PQC
  2475. #ifdef HAVE_FALCON
  2476. if (sigAlgo == falcon_level1_sa_algo) {
  2477. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL1_SA_MAJOR;
  2478. *inOutIdx += 1;
  2479. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL1_SA_MINOR;
  2480. *inOutIdx += 1;
  2481. }
  2482. else
  2483. if (sigAlgo == falcon_level5_sa_algo) {
  2484. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL5_SA_MAJOR;
  2485. *inOutIdx += 1;
  2486. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL5_SA_MINOR;
  2487. *inOutIdx += 1;
  2488. }
  2489. else
  2490. #endif /* HAVE_FALCON */
  2491. #ifdef HAVE_DILITHIUM
  2492. if (sigAlgo == dilithium_level2_sa_algo) {
  2493. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL2_SA_MAJOR;
  2494. *inOutIdx += 1;
  2495. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL2_SA_MINOR;
  2496. *inOutIdx += 1;
  2497. }
  2498. else
  2499. if (sigAlgo == dilithium_level3_sa_algo) {
  2500. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL3_SA_MAJOR;
  2501. *inOutIdx += 1;
  2502. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL3_SA_MINOR;
  2503. *inOutIdx += 1;
  2504. }
  2505. else
  2506. if (sigAlgo == dilithium_level5_sa_algo) {
  2507. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL5_SA_MAJOR;
  2508. *inOutIdx += 1;
  2509. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL5_SA_MINOR;
  2510. *inOutIdx += 1;
  2511. }
  2512. else
  2513. if (sigAlgo == dilithium_aes_level2_sa_algo) {
  2514. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL2_SA_MAJOR;
  2515. *inOutIdx += 1;
  2516. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL2_SA_MINOR;
  2517. *inOutIdx += 1;
  2518. }
  2519. else
  2520. if (sigAlgo == dilithium_aes_level3_sa_algo) {
  2521. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL3_SA_MAJOR;
  2522. *inOutIdx += 1;
  2523. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL3_SA_MINOR;
  2524. *inOutIdx += 1;
  2525. }
  2526. else
  2527. if (sigAlgo == dilithium_aes_level5_sa_algo) {
  2528. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL5_SA_MAJOR;
  2529. *inOutIdx += 1;
  2530. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL5_SA_MINOR;
  2531. *inOutIdx += 1;
  2532. }
  2533. else
  2534. #endif /* HAVE_DILITHIUM */
  2535. #endif /* HAVE_PQC */
  2536. #ifdef WC_RSA_PSS
  2537. if (sigAlgo == rsa_pss_sa_algo) {
  2538. /* RSA PSS is sig then mac */
  2539. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2540. *inOutIdx += 1;
  2541. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  2542. *inOutIdx += 1;
  2543. #ifdef WOLFSSL_TLS13
  2544. /* Add the certificate algorithm as well */
  2545. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2546. *inOutIdx += 1;
  2547. suites->hashSigAlgo[*inOutIdx] = PSS_RSAE_TO_PSS_PSS(macAlgo);
  2548. *inOutIdx += 1;
  2549. #endif
  2550. }
  2551. else
  2552. #endif
  2553. {
  2554. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  2555. *inOutIdx += 1;
  2556. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2557. *inOutIdx += 1;
  2558. }
  2559. }
  2560. }
  2561. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  2562. int haveFalconSig, int haveDilithiumSig,
  2563. int haveAnon, int tls1_2, int keySz)
  2564. {
  2565. word16 idx = 0;
  2566. (void)tls1_2;
  2567. (void)keySz;
  2568. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  2569. if (haveECDSAsig) {
  2570. #ifdef HAVE_ECC
  2571. #ifdef WOLFSSL_SHA512
  2572. AddSuiteHashSigAlgo(suites, sha512_mac, ecc_dsa_sa_algo, keySz, &idx);
  2573. #endif
  2574. #ifdef WOLFSSL_SHA384
  2575. AddSuiteHashSigAlgo(suites, sha384_mac, ecc_dsa_sa_algo, keySz, &idx);
  2576. #endif
  2577. #ifndef NO_SHA256
  2578. AddSuiteHashSigAlgo(suites, sha256_mac, ecc_dsa_sa_algo, keySz, &idx);
  2579. #endif
  2580. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2581. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2582. AddSuiteHashSigAlgo(suites, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  2583. #endif
  2584. #endif
  2585. #ifdef HAVE_ED25519
  2586. AddSuiteHashSigAlgo(suites, no_mac, ed25519_sa_algo, keySz, &idx);
  2587. #endif
  2588. #ifdef HAVE_ED448
  2589. AddSuiteHashSigAlgo(suites, no_mac, ed448_sa_algo, keySz, &idx);
  2590. #endif
  2591. }
  2592. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  2593. if (haveFalconSig) {
  2594. #if defined(HAVE_PQC)
  2595. #ifdef HAVE_FALCON
  2596. AddSuiteHashSigAlgo(suites, no_mac, falcon_level1_sa_algo, keySz, &idx);
  2597. AddSuiteHashSigAlgo(suites, no_mac, falcon_level5_sa_algo, keySz, &idx);
  2598. #endif /* HAVE_FALCON */
  2599. #endif /* HAVE_PQC */
  2600. }
  2601. if (haveDilithiumSig) {
  2602. #if defined(HAVE_PQC)
  2603. #ifdef HAVE_DILITHIUM
  2604. AddSuiteHashSigAlgo(suites, no_mac, dilithium_level2_sa_algo, keySz,
  2605. &idx);
  2606. AddSuiteHashSigAlgo(suites, no_mac, dilithium_level3_sa_algo, keySz,
  2607. &idx);
  2608. AddSuiteHashSigAlgo(suites, no_mac, dilithium_level5_sa_algo, keySz,
  2609. &idx);
  2610. AddSuiteHashSigAlgo(suites, no_mac, dilithium_aes_level2_sa_algo, keySz,
  2611. &idx);
  2612. AddSuiteHashSigAlgo(suites, no_mac, dilithium_aes_level3_sa_algo, keySz,
  2613. &idx);
  2614. AddSuiteHashSigAlgo(suites, no_mac, dilithium_aes_level5_sa_algo, keySz,
  2615. &idx);
  2616. #endif /* HAVE_DILITHIUM */
  2617. #endif /* HAVE_PQC */
  2618. }
  2619. if (haveRSAsig) {
  2620. #ifdef WC_RSA_PSS
  2621. if (tls1_2) {
  2622. #ifdef WOLFSSL_SHA512
  2623. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_pss_sa_algo, keySz,
  2624. &idx);
  2625. #endif
  2626. #ifdef WOLFSSL_SHA384
  2627. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_pss_sa_algo, keySz,
  2628. &idx);
  2629. #endif
  2630. #ifndef NO_SHA256
  2631. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_pss_sa_algo, keySz,
  2632. &idx);
  2633. #endif
  2634. }
  2635. #endif
  2636. #ifdef WOLFSSL_SHA512
  2637. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_sa_algo, keySz, &idx);
  2638. #endif
  2639. #ifdef WOLFSSL_SHA384
  2640. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_sa_algo, keySz, &idx);
  2641. #endif
  2642. #ifndef NO_SHA256
  2643. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_sa_algo, keySz, &idx);
  2644. #endif
  2645. #ifdef WOLFSSL_SHA224
  2646. AddSuiteHashSigAlgo(suites, sha224_mac, rsa_sa_algo, keySz, &idx);
  2647. #endif
  2648. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2649. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2650. AddSuiteHashSigAlgo(suites, sha_mac, rsa_sa_algo, keySz, &idx);
  2651. #endif
  2652. }
  2653. #ifdef HAVE_ANON
  2654. if (haveAnon) {
  2655. AddSuiteHashSigAlgo(suites, sha_mac, anonymous_sa_algo, keySz, &idx);
  2656. }
  2657. #endif
  2658. (void)haveAnon;
  2659. (void)haveECDSAsig;
  2660. suites->hashSigAlgoSz = idx;
  2661. }
  2662. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  2663. word16 havePSK, word16 haveDH, word16 haveECDSAsig,
  2664. word16 haveECC, word16 haveStaticRSA, word16 haveStaticECC,
  2665. word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon,
  2666. word16 haveNull, int side)
  2667. {
  2668. word16 idx = 0;
  2669. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  2670. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  2671. #ifdef WOLFSSL_TLS13
  2672. int tls1_3 = IsAtLeastTLSv1_3(pv);
  2673. #endif
  2674. int dtls = 0;
  2675. int haveRSAsig = 1;
  2676. #ifdef WOLFSSL_DTLS
  2677. /* If DTLS v1.2 or later than set tls1_2 flag */
  2678. if (pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_2_MINOR) {
  2679. tls1_2 = 1;
  2680. }
  2681. #endif
  2682. (void)tls; /* shut up compiler */
  2683. (void)tls1_2;
  2684. (void)dtls;
  2685. (void)haveDH;
  2686. (void)havePSK;
  2687. (void)haveStaticRSA;
  2688. (void)haveStaticECC;
  2689. (void)haveECC;
  2690. (void)side;
  2691. (void)haveRSA; /* some builds won't read */
  2692. (void)haveRSAsig; /* non ecc builds won't read */
  2693. (void)haveAnon; /* anon ciphers optional */
  2694. (void)haveNull;
  2695. (void)haveFalconSig;
  2696. (void)haveDilithiumSig;
  2697. if (suites == NULL) {
  2698. WOLFSSL_MSG("InitSuites pointer error");
  2699. return;
  2700. }
  2701. if (suites->setSuites)
  2702. return; /* trust user settings, don't override */
  2703. #ifdef WOLFSSL_TLS13
  2704. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  2705. if (tls1_3) {
  2706. suites->suites[idx++] = TLS13_BYTE;
  2707. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  2708. }
  2709. #endif
  2710. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  2711. if (tls1_3) {
  2712. suites->suites[idx++] = TLS13_BYTE;
  2713. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  2714. }
  2715. #endif
  2716. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  2717. if (tls1_3) {
  2718. suites->suites[idx++] = TLS13_BYTE;
  2719. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  2720. }
  2721. #endif
  2722. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  2723. if (tls1_3) {
  2724. suites->suites[idx++] = TLS13_BYTE;
  2725. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  2726. }
  2727. #endif
  2728. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  2729. if (tls1_3) {
  2730. suites->suites[idx++] = TLS13_BYTE;
  2731. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  2732. }
  2733. #endif
  2734. #ifdef HAVE_NULL_CIPHER
  2735. #ifdef BUILD_TLS_SHA256_SHA256
  2736. if (tls1_3 && haveNull) {
  2737. suites->suites[idx++] = ECC_BYTE;
  2738. suites->suites[idx++] = TLS_SHA256_SHA256;
  2739. }
  2740. #endif
  2741. #ifdef BUILD_TLS_SHA384_SHA384
  2742. if (tls1_3 && haveNull) {
  2743. suites->suites[idx++] = ECC_BYTE;
  2744. suites->suites[idx++] = TLS_SHA384_SHA384;
  2745. }
  2746. #endif
  2747. #endif
  2748. #endif /* WOLFSSL_TLS13 */
  2749. #ifndef WOLFSSL_NO_TLS12
  2750. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  2751. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  2752. haveRSA = 0; /* can't do RSA with ECDSA key */
  2753. }
  2754. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  2755. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  2756. }
  2757. #endif /* !NO_WOLFSSL_SERVER */
  2758. #ifdef WOLFSSL_DTLS
  2759. if (pv.major == DTLS_MAJOR) {
  2760. dtls = 1;
  2761. tls = 1;
  2762. /* May be dead assignments dependent upon configuration */
  2763. (void) dtls;
  2764. (void) tls;
  2765. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  2766. }
  2767. #endif
  2768. #ifdef HAVE_RENEGOTIATION_INDICATION
  2769. if (side == WOLFSSL_CLIENT_END) {
  2770. suites->suites[idx++] = CIPHER_BYTE;
  2771. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  2772. }
  2773. #endif
  2774. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2775. if (tls1_2 && haveECC) {
  2776. suites->suites[idx++] = ECC_BYTE;
  2777. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2778. }
  2779. #endif
  2780. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2781. if (tls1_2 && haveECC) {
  2782. suites->suites[idx++] = ECC_BYTE;
  2783. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2784. }
  2785. #endif
  2786. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2787. if (tls1_2 && haveRSA) {
  2788. suites->suites[idx++] = ECC_BYTE;
  2789. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2790. }
  2791. #endif
  2792. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2793. if (tls1_2 && haveRSA) {
  2794. suites->suites[idx++] = ECC_BYTE;
  2795. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2796. }
  2797. #endif
  2798. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2799. if (tls1_2 && haveDH && haveRSA) {
  2800. suites->suites[idx++] = CIPHER_BYTE;
  2801. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2802. }
  2803. #endif
  2804. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2805. if (tls1_2 && haveDH && haveRSA) {
  2806. suites->suites[idx++] = CIPHER_BYTE;
  2807. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2808. }
  2809. #endif
  2810. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  2811. if (tls1_2 && haveRSA && haveStaticRSA) {
  2812. suites->suites[idx++] = CIPHER_BYTE;
  2813. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  2814. }
  2815. #endif
  2816. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  2817. if (tls1_2 && haveRSA && haveStaticRSA) {
  2818. suites->suites[idx++] = CIPHER_BYTE;
  2819. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  2820. }
  2821. #endif
  2822. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  2823. if (tls1_2 && haveECC && haveStaticECC) {
  2824. suites->suites[idx++] = ECC_BYTE;
  2825. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  2826. }
  2827. #endif
  2828. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  2829. if (tls1_2 && haveECC && haveStaticECC) {
  2830. suites->suites[idx++] = ECC_BYTE;
  2831. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  2832. }
  2833. #endif
  2834. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  2835. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2836. suites->suites[idx++] = ECC_BYTE;
  2837. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  2838. }
  2839. #endif
  2840. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  2841. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2842. suites->suites[idx++] = ECC_BYTE;
  2843. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  2844. }
  2845. #endif
  2846. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  2847. if (tls1_2 && haveDH && havePSK) {
  2848. suites->suites[idx++] = CIPHER_BYTE;
  2849. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  2850. }
  2851. #endif
  2852. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  2853. if (tls1_2 && haveDH && haveAnon) {
  2854. suites->suites[idx++] = CIPHER_BYTE;
  2855. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  2856. }
  2857. #endif
  2858. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  2859. if (tls1_2 && haveDH && haveAnon) {
  2860. suites->suites[idx++] = CIPHER_BYTE;
  2861. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  2862. }
  2863. #endif
  2864. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  2865. if (tls1_2 && haveDH && havePSK) {
  2866. suites->suites[idx++] = CIPHER_BYTE;
  2867. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  2868. }
  2869. #endif
  2870. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  2871. if (tls1_2 && havePSK) {
  2872. suites->suites[idx++] = CIPHER_BYTE;
  2873. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  2874. }
  2875. #endif
  2876. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  2877. if (tls1_2 && havePSK) {
  2878. suites->suites[idx++] = CIPHER_BYTE;
  2879. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  2880. }
  2881. #endif
  2882. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  2883. if (tls1_2 && haveECC) {
  2884. suites->suites[idx++] = CHACHA_BYTE;
  2885. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  2886. }
  2887. #endif
  2888. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2889. if (tls1_2 && haveRSA) {
  2890. suites->suites[idx++] = CHACHA_BYTE;
  2891. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2892. }
  2893. #endif
  2894. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2895. if (tls1_2 && haveRSA) {
  2896. suites->suites[idx++] = CHACHA_BYTE;
  2897. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2898. }
  2899. #endif
  2900. /* Place as higher priority for MYSQL */
  2901. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  2902. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2903. if (tls && haveDH && haveRSA) {
  2904. suites->suites[idx++] = CIPHER_BYTE;
  2905. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2906. }
  2907. #endif
  2908. #endif
  2909. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  2910. if (tls1_2 && haveRSA) {
  2911. suites->suites[idx++] = ECC_BYTE;
  2912. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  2913. }
  2914. #endif
  2915. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  2916. if (tls1_2 && haveECC) {
  2917. suites->suites[idx++] = ECC_BYTE;
  2918. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  2919. }
  2920. #endif
  2921. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  2922. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2923. suites->suites[idx++] = ECC_BYTE;
  2924. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  2925. }
  2926. #endif
  2927. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  2928. if (tls1_2 && haveECC && haveStaticECC) {
  2929. suites->suites[idx++] = ECC_BYTE;
  2930. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  2931. }
  2932. #endif
  2933. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  2934. if (tls1_2 && haveRSA) {
  2935. suites->suites[idx++] = ECC_BYTE;
  2936. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  2937. }
  2938. #endif
  2939. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2940. if (tls1_2 && haveECC) {
  2941. suites->suites[idx++] = ECC_BYTE;
  2942. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  2943. }
  2944. #endif
  2945. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  2946. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2947. suites->suites[idx++] = ECC_BYTE;
  2948. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  2949. }
  2950. #endif
  2951. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  2952. if (tls1_2 && haveECC && haveStaticECC) {
  2953. suites->suites[idx++] = ECC_BYTE;
  2954. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  2955. }
  2956. #endif
  2957. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  2958. if (tls && haveECC) {
  2959. suites->suites[idx++] = ECC_BYTE;
  2960. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  2961. }
  2962. #endif
  2963. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  2964. if (tls && haveECC && haveStaticECC) {
  2965. suites->suites[idx++] = ECC_BYTE;
  2966. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  2967. }
  2968. #endif
  2969. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  2970. if (tls && haveECC) {
  2971. suites->suites[idx++] = ECC_BYTE;
  2972. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  2973. }
  2974. #endif
  2975. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  2976. if (tls && haveECC && haveStaticECC) {
  2977. suites->suites[idx++] = ECC_BYTE;
  2978. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  2979. }
  2980. #endif
  2981. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  2982. if (!dtls && tls && haveECC) {
  2983. suites->suites[idx++] = ECC_BYTE;
  2984. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  2985. }
  2986. #endif
  2987. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  2988. if (!dtls && tls && haveECC && haveStaticECC) {
  2989. suites->suites[idx++] = ECC_BYTE;
  2990. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  2991. }
  2992. #endif
  2993. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  2994. if (tls && haveECC) {
  2995. suites->suites[idx++] = ECC_BYTE;
  2996. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2997. }
  2998. #endif
  2999. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  3000. if (tls && haveECC && haveStaticECC) {
  3001. suites->suites[idx++] = ECC_BYTE;
  3002. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  3003. }
  3004. #endif
  3005. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  3006. if (tls && haveRSA) {
  3007. suites->suites[idx++] = ECC_BYTE;
  3008. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  3009. }
  3010. #endif
  3011. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  3012. if (tls && haveRSAsig && haveStaticECC) {
  3013. suites->suites[idx++] = ECC_BYTE;
  3014. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  3015. }
  3016. #endif
  3017. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  3018. if (tls && haveRSA) {
  3019. suites->suites[idx++] = ECC_BYTE;
  3020. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  3021. }
  3022. #endif
  3023. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  3024. if (tls && haveRSAsig && haveStaticECC) {
  3025. suites->suites[idx++] = ECC_BYTE;
  3026. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  3027. }
  3028. #endif
  3029. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  3030. if (!dtls && tls && haveRSA) {
  3031. suites->suites[idx++] = ECC_BYTE;
  3032. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  3033. }
  3034. #endif
  3035. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  3036. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  3037. suites->suites[idx++] = ECC_BYTE;
  3038. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  3039. }
  3040. #endif
  3041. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  3042. if (tls && haveRSA) {
  3043. suites->suites[idx++] = ECC_BYTE;
  3044. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  3045. }
  3046. #endif
  3047. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  3048. if (tls && haveRSAsig && haveStaticECC) {
  3049. suites->suites[idx++] = ECC_BYTE;
  3050. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  3051. }
  3052. #endif
  3053. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  3054. if (tls1_2 && haveECC) {
  3055. suites->suites[idx++] = ECC_BYTE;
  3056. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  3057. }
  3058. #endif
  3059. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  3060. if (tls1_2 && haveECC) {
  3061. suites->suites[idx++] = ECC_BYTE;
  3062. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  3063. }
  3064. #endif
  3065. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  3066. if (tls1_2 && haveECC) {
  3067. suites->suites[idx++] = ECC_BYTE;
  3068. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  3069. }
  3070. #endif
  3071. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  3072. if (tls1_2 && haveRSA && haveStaticRSA) {
  3073. suites->suites[idx++] = ECC_BYTE;
  3074. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  3075. }
  3076. #endif
  3077. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  3078. if (tls1_2 && haveRSA && haveStaticRSA) {
  3079. suites->suites[idx++] = ECC_BYTE;
  3080. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  3081. }
  3082. #endif
  3083. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  3084. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3085. if (tls1_2 && haveDH && haveRSA)
  3086. #else
  3087. if (tls && haveDH && haveRSA)
  3088. #endif
  3089. {
  3090. suites->suites[idx++] = CIPHER_BYTE;
  3091. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  3092. }
  3093. #endif
  3094. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  3095. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3096. if (tls1_2 && haveDH && haveRSA)
  3097. #else
  3098. if (tls && haveDH && haveRSA)
  3099. #endif
  3100. {
  3101. suites->suites[idx++] = CIPHER_BYTE;
  3102. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  3103. }
  3104. #endif
  3105. /* Place as higher priority for MYSQL testing */
  3106. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  3107. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  3108. if (tls && haveDH && haveRSA) {
  3109. suites->suites[idx++] = CIPHER_BYTE;
  3110. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  3111. }
  3112. #endif
  3113. #endif
  3114. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  3115. if (tls && haveDH && haveRSA) {
  3116. suites->suites[idx++] = CIPHER_BYTE;
  3117. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  3118. }
  3119. #endif
  3120. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  3121. if (tls && haveDH && haveRSA) {
  3122. suites->suites[idx++] = CIPHER_BYTE;
  3123. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  3124. }
  3125. #endif
  3126. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  3127. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3128. if (tls1_2 && haveRSA && haveStaticRSA)
  3129. #else
  3130. if (tls && haveRSA && haveStaticRSA)
  3131. #endif
  3132. {
  3133. suites->suites[idx++] = CIPHER_BYTE;
  3134. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  3135. }
  3136. #endif
  3137. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  3138. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3139. if (tls1_2 && haveRSA && haveStaticRSA)
  3140. #else
  3141. if (tls && haveRSA && haveStaticRSA)
  3142. #endif
  3143. {
  3144. suites->suites[idx++] = CIPHER_BYTE;
  3145. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  3146. }
  3147. #endif
  3148. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  3149. if (tls && haveRSA && haveStaticRSA) {
  3150. suites->suites[idx++] = CIPHER_BYTE;
  3151. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  3152. }
  3153. #endif
  3154. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  3155. if (tls && haveRSA && haveStaticRSA) {
  3156. suites->suites[idx++] = CIPHER_BYTE;
  3157. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  3158. }
  3159. #endif
  3160. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3161. if (tls1_2 && haveECC) {
  3162. suites->suites[idx++] = CHACHA_BYTE;
  3163. suites->suites[idx++] =
  3164. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3165. }
  3166. #endif
  3167. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3168. if (tls1_2 && haveRSA) {
  3169. suites->suites[idx++] = CHACHA_BYTE;
  3170. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3171. }
  3172. #endif
  3173. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3174. if (tls1_2 && haveRSA) {
  3175. suites->suites[idx++] = CHACHA_BYTE;
  3176. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3177. }
  3178. #endif
  3179. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  3180. if (tls && haveECC && haveNull) {
  3181. suites->suites[idx++] = ECC_BYTE;
  3182. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  3183. }
  3184. #endif
  3185. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  3186. if (tls && haveRSA && haveNull && haveStaticRSA) {
  3187. suites->suites[idx++] = CIPHER_BYTE;
  3188. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  3189. }
  3190. #endif
  3191. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  3192. if (tls && haveRSA && haveNull && haveStaticRSA) {
  3193. suites->suites[idx++] = CIPHER_BYTE;
  3194. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  3195. }
  3196. #endif
  3197. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  3198. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3199. if (tls1_2 && haveRSA && haveNull && haveStaticRSA)
  3200. #else
  3201. if (tls && haveRSA && haveNull && haveStaticRSA)
  3202. #endif
  3203. {
  3204. suites->suites[idx++] = CIPHER_BYTE;
  3205. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  3206. }
  3207. #endif
  3208. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  3209. if (tls && havePSK) {
  3210. suites->suites[idx++] = CIPHER_BYTE;
  3211. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  3212. }
  3213. #endif
  3214. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  3215. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3216. if (tls1_2 && haveDH && havePSK)
  3217. #else
  3218. if (tls && haveDH && havePSK)
  3219. #endif
  3220. {
  3221. suites->suites[idx++] = CIPHER_BYTE;
  3222. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  3223. }
  3224. #endif
  3225. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  3226. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3227. if (tls1_2 && havePSK)
  3228. #else
  3229. if (tls && havePSK)
  3230. #endif
  3231. {
  3232. suites->suites[idx++] = CIPHER_BYTE;
  3233. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  3234. }
  3235. #endif
  3236. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  3237. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3238. if (tls1_2 && haveDH && havePSK)
  3239. #else
  3240. if (tls && haveDH && havePSK)
  3241. #endif
  3242. {
  3243. suites->suites[idx++] = CIPHER_BYTE;
  3244. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  3245. }
  3246. #endif
  3247. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  3248. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3249. if (tls1_2 && havePSK)
  3250. #else
  3251. if (tls1 && havePSK)
  3252. #endif
  3253. {
  3254. suites->suites[idx++] = CIPHER_BYTE;
  3255. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  3256. }
  3257. #endif
  3258. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  3259. if (tls && havePSK) {
  3260. suites->suites[idx++] = CIPHER_BYTE;
  3261. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  3262. }
  3263. #endif
  3264. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  3265. if (tls && haveDH && havePSK) {
  3266. suites->suites[idx++] = ECC_BYTE;
  3267. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  3268. }
  3269. #endif
  3270. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  3271. if (tls && haveDH && havePSK) {
  3272. suites->suites[idx++] = ECC_BYTE;
  3273. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  3274. }
  3275. #endif
  3276. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  3277. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3278. if (tls1_2 && havePSK)
  3279. #else
  3280. if (tls && havePSK)
  3281. #endif
  3282. {
  3283. suites->suites[idx++] = CHACHA_BYTE;
  3284. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3285. }
  3286. #endif
  3287. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3288. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3289. if (tls1_2 && havePSK)
  3290. #else
  3291. if (tls && havePSK)
  3292. #endif
  3293. {
  3294. suites->suites[idx++] = CHACHA_BYTE;
  3295. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3296. }
  3297. #endif
  3298. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3299. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3300. if (tls1_2 && havePSK)
  3301. #else
  3302. if (tls && havePSK)
  3303. #endif
  3304. {
  3305. suites->suites[idx++] = CHACHA_BYTE;
  3306. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3307. }
  3308. #endif
  3309. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  3310. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3311. if (tls1_2 && havePSK)
  3312. #else
  3313. if (tls && havePSK)
  3314. #endif
  3315. {
  3316. suites->suites[idx++] = ECC_BYTE;
  3317. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  3318. }
  3319. #endif
  3320. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
  3321. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3322. if (tls1_2 && havePSK)
  3323. #else
  3324. if (tls && havePSK)
  3325. #endif
  3326. {
  3327. suites->suites[idx++] = ECDHE_PSK_BYTE;
  3328. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256;
  3329. }
  3330. #endif
  3331. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  3332. if (tls && havePSK) {
  3333. suites->suites[idx++] = ECC_BYTE;
  3334. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  3335. }
  3336. #endif
  3337. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  3338. if (tls && havePSK) {
  3339. suites->suites[idx++] = ECC_BYTE;
  3340. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  3341. }
  3342. #endif
  3343. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  3344. if (tls && havePSK) {
  3345. suites->suites[idx++] = ECC_BYTE;
  3346. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  3347. }
  3348. #endif
  3349. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  3350. if (tls && havePSK) {
  3351. suites->suites[idx++] = ECC_BYTE;
  3352. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  3353. }
  3354. #endif
  3355. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  3356. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3357. if (tls1_2 && haveDH && havePSK)
  3358. #else
  3359. if (tls && haveDH && havePSK && haveNull)
  3360. #endif
  3361. {
  3362. suites->suites[idx++] = CIPHER_BYTE;
  3363. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  3364. }
  3365. #endif
  3366. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  3367. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3368. if (tls1_2 && havePSK && haveNull)
  3369. #else
  3370. if (tls && havePSK && haveNull)
  3371. #endif
  3372. {
  3373. suites->suites[idx++] = CIPHER_BYTE;
  3374. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  3375. }
  3376. #endif
  3377. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  3378. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3379. if (tls1_2 && havePSK && haveNull)
  3380. #else
  3381. if (tls && havePSK && haveNull)
  3382. #endif
  3383. {
  3384. suites->suites[idx++] = ECC_BYTE;
  3385. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  3386. }
  3387. #endif
  3388. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  3389. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3390. if (tls1_2 && haveDH && havePSK && haveNull)
  3391. #else
  3392. if (tls && haveDH && havePSK && haveNull)
  3393. #endif
  3394. {
  3395. suites->suites[idx++] = CIPHER_BYTE;
  3396. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  3397. }
  3398. #endif
  3399. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  3400. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3401. if (tls1_2 && havePSK && haveNull)
  3402. #else
  3403. if (tls && havePSK && haveNull)
  3404. #endif
  3405. {
  3406. suites->suites[idx++] = CIPHER_BYTE;
  3407. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  3408. }
  3409. #endif
  3410. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  3411. if (tls && havePSK && haveNull) {
  3412. suites->suites[idx++] = CIPHER_BYTE;
  3413. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  3414. }
  3415. #endif
  3416. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  3417. if (!dtls && haveRSA && haveStaticRSA) {
  3418. suites->suites[idx++] = CIPHER_BYTE;
  3419. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  3420. }
  3421. #endif
  3422. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  3423. if (!dtls && haveRSA && haveStaticRSA) {
  3424. suites->suites[idx++] = CIPHER_BYTE;
  3425. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  3426. }
  3427. #endif
  3428. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  3429. if (haveRSA && haveStaticRSA) {
  3430. suites->suites[idx++] = CIPHER_BYTE;
  3431. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  3432. }
  3433. #endif
  3434. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  3435. if (tls && haveRSA && haveStaticRSA) {
  3436. suites->suites[idx++] = CIPHER_BYTE;
  3437. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3438. }
  3439. #endif
  3440. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  3441. if (tls && haveDH && haveRSA && haveStaticRSA) {
  3442. suites->suites[idx++] = CIPHER_BYTE;
  3443. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3444. }
  3445. #endif
  3446. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  3447. if (tls && haveRSA && haveStaticRSA) {
  3448. suites->suites[idx++] = CIPHER_BYTE;
  3449. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3450. }
  3451. #endif
  3452. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  3453. if (tls && haveDH && haveRSA && haveStaticRSA) {
  3454. suites->suites[idx++] = CIPHER_BYTE;
  3455. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3456. }
  3457. #endif
  3458. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3459. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3460. if (tls1_2 && haveRSA && haveStaticRSA)
  3461. #else
  3462. if (tls && haveRSA && haveStaticRSA)
  3463. #endif
  3464. {
  3465. suites->suites[idx++] = CIPHER_BYTE;
  3466. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3467. }
  3468. #endif
  3469. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3470. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3471. if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
  3472. #else
  3473. if (tls && haveDH && haveRSA && haveStaticRSA)
  3474. #endif
  3475. {
  3476. suites->suites[idx++] = CIPHER_BYTE;
  3477. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3478. }
  3479. #endif
  3480. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3481. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3482. if (tls1_2 && haveRSA && haveStaticRSA)
  3483. #else
  3484. if (tls && haveRSA && haveStaticRSA)
  3485. #endif
  3486. {
  3487. suites->suites[idx++] = CIPHER_BYTE;
  3488. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3489. }
  3490. #endif
  3491. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3492. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3493. if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
  3494. #else
  3495. if (tls && haveDH && haveRSA && haveStaticRSA)
  3496. #endif
  3497. {
  3498. suites->suites[idx++] = CIPHER_BYTE;
  3499. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3500. }
  3501. #endif
  3502. #endif /* !WOLFSSL_NO_TLS12 */
  3503. suites->suiteSz = idx;
  3504. if (suites->hashSigAlgoSz == 0) {
  3505. InitSuitesHashSigAlgo(suites, haveECDSAsig | haveECC,
  3506. haveRSAsig | haveRSA, haveFalconSig,
  3507. haveDilithiumSig, 0, tls1_2, keySz);
  3508. }
  3509. }
  3510. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  3511. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  3512. /* Decode the signature algorithm.
  3513. *
  3514. * input The encoded signature algorithm.
  3515. * hashalgo The hash algorithm.
  3516. * hsType The signature type.
  3517. */
  3518. static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  3519. {
  3520. *hsType = invalid_sa_algo;
  3521. switch (input[0]) {
  3522. case NEW_SA_MAJOR:
  3523. #ifdef HAVE_ED25519
  3524. /* ED25519: 0x0807 */
  3525. if (input[1] == ED25519_SA_MINOR) {
  3526. *hsType = ed25519_sa_algo;
  3527. /* Hash performed as part of sign/verify operation. */
  3528. *hashAlgo = sha512_mac;
  3529. }
  3530. else
  3531. #endif
  3532. #ifdef HAVE_ED448
  3533. /* ED448: 0x0808 */
  3534. if (input[1] == ED448_SA_MINOR) {
  3535. *hsType = ed448_sa_algo;
  3536. /* Hash performed as part of sign/verify operation. */
  3537. *hashAlgo = sha512_mac;
  3538. }
  3539. else
  3540. #endif
  3541. #ifdef WC_RSA_PSS
  3542. /* PSS PSS signatures: 0x080[9-b] */
  3543. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  3544. *hsType = rsa_pss_pss_algo;
  3545. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  3546. }
  3547. else
  3548. #endif
  3549. {
  3550. *hsType = input[0];
  3551. *hashAlgo = input[1];
  3552. }
  3553. break;
  3554. #ifdef HAVE_PQC
  3555. case PQC_SA_MAJOR:
  3556. /* Hash performed as part of sign/verify operation. */
  3557. #ifdef HAVE_FALCON
  3558. if (input[1] == FALCON_LEVEL1_SA_MINOR) {
  3559. *hsType = falcon_level1_sa_algo;
  3560. *hashAlgo = sha512_mac;
  3561. }
  3562. else if (input[1] == FALCON_LEVEL5_SA_MINOR) {
  3563. *hsType = falcon_level5_sa_algo;
  3564. *hashAlgo = sha512_mac;
  3565. }
  3566. #endif /* HAVE_FALCON */
  3567. #ifdef HAVE_DILITHIUM
  3568. if (input[1] == DILITHIUM_LEVEL2_SA_MINOR) {
  3569. *hsType = dilithium_level2_sa_algo;
  3570. *hashAlgo = sha512_mac;
  3571. }
  3572. else if (input[1] == DILITHIUM_LEVEL3_SA_MINOR) {
  3573. *hsType = dilithium_level3_sa_algo;
  3574. *hashAlgo = sha512_mac;
  3575. }
  3576. else if (input[1] == DILITHIUM_LEVEL5_SA_MINOR) {
  3577. *hsType = dilithium_level5_sa_algo;
  3578. *hashAlgo = sha512_mac;
  3579. }
  3580. else if (input[1] == DILITHIUM_AES_LEVEL2_SA_MINOR) {
  3581. *hsType = dilithium_aes_level2_sa_algo;
  3582. *hashAlgo = sha512_mac;
  3583. }
  3584. else if (input[1] == DILITHIUM_AES_LEVEL3_SA_MINOR) {
  3585. *hsType = dilithium_aes_level3_sa_algo;
  3586. *hashAlgo = sha512_mac;
  3587. }
  3588. else if (input[1] == DILITHIUM_AES_LEVEL5_SA_MINOR) {
  3589. *hsType = dilithium_aes_level5_sa_algo;
  3590. *hashAlgo = sha512_mac;
  3591. }
  3592. #endif /* HAVE_DILITHIUM */
  3593. break;
  3594. #endif
  3595. default:
  3596. *hashAlgo = input[0];
  3597. *hsType = input[1];
  3598. break;
  3599. }
  3600. }
  3601. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  3602. #ifndef WOLFSSL_NO_TLS12
  3603. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3604. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  3605. defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
  3606. static enum wc_HashType HashAlgoToType(int hashAlgo)
  3607. {
  3608. switch (hashAlgo) {
  3609. #ifdef WOLFSSL_SHA512
  3610. case sha512_mac:
  3611. return WC_HASH_TYPE_SHA512;
  3612. #endif
  3613. #ifdef WOLFSSL_SHA384
  3614. case sha384_mac:
  3615. return WC_HASH_TYPE_SHA384;
  3616. #endif
  3617. #ifndef NO_SHA256
  3618. case sha256_mac:
  3619. return WC_HASH_TYPE_SHA256;
  3620. #endif
  3621. #ifdef WOLFSSL_SHA224
  3622. case sha224_mac:
  3623. return WC_HASH_TYPE_SHA224;
  3624. #endif
  3625. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  3626. defined(WOLFSSL_ALLOW_TLS_SHA1))
  3627. case sha_mac:
  3628. return WC_HASH_TYPE_SHA;
  3629. #endif
  3630. default:
  3631. WOLFSSL_MSG("Bad hash sig algo");
  3632. break;
  3633. }
  3634. return WC_HASH_TYPE_NONE;
  3635. }
  3636. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  3637. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3638. #endif /* !WOLFSSL_NO_TLS12 */
  3639. #ifndef NO_CERTS
  3640. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
  3641. {
  3642. (void)dynamicFlag;
  3643. if (name != NULL) {
  3644. XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME));
  3645. name->name = name->staticName;
  3646. name->heap = heap;
  3647. name->dynamicName = 0;
  3648. }
  3649. }
  3650. void FreeX509Name(WOLFSSL_X509_NAME* name)
  3651. {
  3652. if (name != NULL) {
  3653. if (name->dynamicName) {
  3654. XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
  3655. name->name = NULL;
  3656. }
  3657. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3658. {
  3659. int i;
  3660. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  3661. if (name->entry[i].object != NULL)
  3662. wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
  3663. if (name->entry[i].value != NULL)
  3664. wolfSSL_ASN1_STRING_free(name->entry[i].value);
  3665. XMEMSET(&name->entry[i], 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  3666. }
  3667. }
  3668. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3669. #ifdef OPENSSL_ALL
  3670. if (name->entries) {
  3671. wolfSSL_sk_X509_NAME_ENTRY_free(name->entries);
  3672. name->entries = NULL;
  3673. }
  3674. #endif
  3675. }
  3676. }
  3677. /* Initialize wolfSSL X509 type */
  3678. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  3679. {
  3680. if (x509 == NULL) {
  3681. WOLFSSL_MSG("Null parameter passed in!");
  3682. return;
  3683. }
  3684. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  3685. x509->heap = heap;
  3686. InitX509Name(&x509->issuer, 0, heap);
  3687. InitX509Name(&x509->subject, 0, heap);
  3688. x509->dynamicMemory = (byte)dynamicFlag;
  3689. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  3690. x509->refCount = 1;
  3691. #ifndef SINGLE_THREADED
  3692. (void)wc_InitMutex(&x509->refMutex);
  3693. #endif
  3694. #endif
  3695. }
  3696. /* Free wolfSSL X509 type */
  3697. void FreeX509(WOLFSSL_X509* x509)
  3698. {
  3699. if (x509 == NULL)
  3700. return;
  3701. FreeX509Name(&x509->issuer);
  3702. FreeX509Name(&x509->subject);
  3703. if (x509->pubKey.buffer) {
  3704. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  3705. x509->pubKey.buffer = NULL;
  3706. }
  3707. FreeDer(&x509->derCert);
  3708. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  3709. x509->sig.buffer = NULL;
  3710. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3711. if (x509->authKeyIdSrc != NULL) {
  3712. XFREE(x509->authKeyIdSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3713. }
  3714. else {
  3715. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3716. }
  3717. x509->authKeyIdSrc = NULL;
  3718. x509->authKeyId = NULL;
  3719. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3720. x509->subjKeyId = NULL;
  3721. if (x509->authInfo != NULL) {
  3722. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3723. x509->authInfo = NULL;
  3724. }
  3725. if (x509->rawCRLInfo != NULL) {
  3726. XFREE(x509->rawCRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3727. x509->rawCRLInfo = NULL;
  3728. }
  3729. if (x509->CRLInfo != NULL) {
  3730. XFREE(x509->CRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3731. x509->CRLInfo = NULL;
  3732. }
  3733. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  3734. defined(WOLFSSL_QT)
  3735. if (x509->authInfoCaIssuer != NULL) {
  3736. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3737. }
  3738. if (x509->ext_sk != NULL) {
  3739. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk, NULL);
  3740. }
  3741. if (x509->ext_sk_full != NULL) {
  3742. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk_full, NULL);
  3743. }
  3744. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  3745. #ifdef OPENSSL_EXTRA
  3746. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  3747. if (x509->serialNumber != NULL) {
  3748. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  3749. }
  3750. #endif
  3751. if (x509->extKeyUsageSrc != NULL) {
  3752. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3753. x509->extKeyUsageSrc= NULL;
  3754. }
  3755. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3756. #if defined(OPENSSL_ALL)
  3757. if (x509->algor.algorithm) {
  3758. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  3759. x509->algor.algorithm = NULL;
  3760. }
  3761. if (x509->key.algor) {
  3762. wolfSSL_X509_ALGOR_free(x509->key.algor);
  3763. x509->key.algor = NULL;
  3764. }
  3765. if (x509->key.pkey) {
  3766. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  3767. x509->key.pkey = NULL;
  3768. }
  3769. if (x509->subjAltNameSrc != NULL) {
  3770. XFREE(x509->subjAltNameSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3771. x509->subjAltNameSrc= NULL;
  3772. }
  3773. #endif /* OPENSSL_ALL */
  3774. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
  3775. if (x509->reqAttributes) {
  3776. wolfSSL_sk_pop_free(x509->reqAttributes, NULL);
  3777. }
  3778. #endif /* WOLFSSL_CERT_REQ */
  3779. if (x509->altNames) {
  3780. FreeAltNames(x509->altNames, x509->heap);
  3781. x509->altNames = NULL;
  3782. }
  3783. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3784. #ifndef SINGLE_THREADED
  3785. wc_FreeMutex(&x509->refMutex);
  3786. #endif
  3787. #endif
  3788. }
  3789. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3790. #if !defined(WOLFSSL_NO_TLS12)
  3791. /* Encode the signature algorithm into buffer.
  3792. *
  3793. * hashalgo The hash algorithm.
  3794. * hsType The signature type.
  3795. * output The buffer to encode into.
  3796. */
  3797. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  3798. {
  3799. switch (hsType) {
  3800. #ifdef HAVE_ECC
  3801. case ecc_dsa_sa_algo:
  3802. output[0] = hashAlgo;
  3803. output[1] = ecc_dsa_sa_algo;
  3804. break;
  3805. #endif
  3806. #ifdef HAVE_ED25519
  3807. case ed25519_sa_algo:
  3808. output[0] = ED25519_SA_MAJOR;
  3809. output[1] = ED25519_SA_MINOR;
  3810. (void)hashAlgo;
  3811. break;
  3812. #endif
  3813. #ifdef HAVE_ED448
  3814. case ed448_sa_algo:
  3815. output[0] = ED448_SA_MAJOR;
  3816. output[1] = ED448_SA_MINOR;
  3817. (void)hashAlgo;
  3818. break;
  3819. #endif
  3820. #ifndef NO_RSA
  3821. case rsa_sa_algo:
  3822. output[0] = hashAlgo;
  3823. output[1] = rsa_sa_algo;
  3824. break;
  3825. #ifdef WC_RSA_PSS
  3826. /* PSS signatures: 0x080[4-6] */
  3827. case rsa_pss_sa_algo:
  3828. output[0] = rsa_pss_sa_algo;
  3829. output[1] = hashAlgo;
  3830. break;
  3831. #endif
  3832. #endif
  3833. default:
  3834. break;
  3835. }
  3836. (void)hashAlgo;
  3837. (void)output;
  3838. }
  3839. #endif
  3840. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  3841. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  3842. {
  3843. switch (hashAlgo) {
  3844. #ifndef NO_SHA
  3845. case sha_mac:
  3846. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  3847. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  3848. break;
  3849. #endif /* !NO_SHA */
  3850. #ifndef NO_SHA256
  3851. case sha256_mac:
  3852. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  3853. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  3854. break;
  3855. #endif /* !NO_SHA256 */
  3856. #ifdef WOLFSSL_SHA384
  3857. case sha384_mac:
  3858. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  3859. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  3860. break;
  3861. #endif /* WOLFSSL_SHA384 */
  3862. #ifdef WOLFSSL_SHA512
  3863. case sha512_mac:
  3864. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  3865. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  3866. break;
  3867. #endif /* WOLFSSL_SHA512 */
  3868. default:
  3869. break;
  3870. } /* switch */
  3871. }
  3872. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  3873. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3874. #endif /* !NO_CERTS */
  3875. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3876. static word32 MacSize(WOLFSSL* ssl)
  3877. {
  3878. #ifdef HAVE_TRUNCATED_HMAC
  3879. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  3880. : ssl->specs.hash_size;
  3881. #else
  3882. word32 digestSz = ssl->specs.hash_size;
  3883. #endif
  3884. return digestSz;
  3885. }
  3886. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  3887. #ifndef NO_RSA
  3888. #if !defined(WOLFSSL_NO_TLS12) || \
  3889. (defined(WC_RSA_PSS) && defined(HAVE_PK_CALLBACKS))
  3890. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3891. static int TypeHash(int hashAlgo)
  3892. {
  3893. switch (hashAlgo) {
  3894. #ifdef WOLFSSL_SHA512
  3895. case sha512_mac:
  3896. return SHA512h;
  3897. #endif
  3898. #ifdef WOLFSSL_SHA384
  3899. case sha384_mac:
  3900. return SHA384h;
  3901. #endif
  3902. #ifndef NO_SHA256
  3903. case sha256_mac:
  3904. return SHA256h;
  3905. #endif
  3906. #ifdef WOLFSSL_SHA224
  3907. case sha224_mac:
  3908. return SHA224h;
  3909. #endif
  3910. #ifndef NO_SHA
  3911. case sha_mac:
  3912. return SHAh;
  3913. #endif
  3914. default:
  3915. break;
  3916. }
  3917. return 0;
  3918. }
  3919. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  3920. #endif /* !WOLFSSL_NO_TLS12 */
  3921. #if defined(WC_RSA_PSS)
  3922. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  3923. {
  3924. switch (hashAlgo) {
  3925. #ifdef WOLFSSL_SHA512
  3926. case sha512_mac:
  3927. *hashType = WC_HASH_TYPE_SHA512;
  3928. if (mgf != NULL)
  3929. *mgf = WC_MGF1SHA512;
  3930. break;
  3931. #endif
  3932. #ifdef WOLFSSL_SHA384
  3933. case sha384_mac:
  3934. *hashType = WC_HASH_TYPE_SHA384;
  3935. if (mgf != NULL)
  3936. *mgf = WC_MGF1SHA384;
  3937. break;
  3938. #endif
  3939. #ifndef NO_SHA256
  3940. case sha256_mac:
  3941. *hashType = WC_HASH_TYPE_SHA256;
  3942. if (mgf != NULL)
  3943. *mgf = WC_MGF1SHA256;
  3944. break;
  3945. #endif
  3946. default:
  3947. return BAD_FUNC_ARG;
  3948. }
  3949. return 0;
  3950. }
  3951. #endif
  3952. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3953. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3954. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3955. DerBuffer* keyBufInfo)
  3956. {
  3957. int ret;
  3958. #ifdef HAVE_PK_CALLBACKS
  3959. const byte* keyBuf = NULL;
  3960. word32 keySz = 0;
  3961. if (keyBufInfo) {
  3962. keyBuf = keyBufInfo->buffer;
  3963. keySz = keyBufInfo->length;
  3964. }
  3965. #endif
  3966. (void)ssl;
  3967. (void)keyBufInfo;
  3968. (void)sigAlgo;
  3969. (void)hashAlgo;
  3970. WOLFSSL_ENTER("RsaSign");
  3971. #ifdef WOLFSSL_ASYNC_CRYPT
  3972. /* initialize event */
  3973. if (key) {
  3974. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3975. if (ret != 0)
  3976. return ret;
  3977. }
  3978. #endif
  3979. #if defined(WC_RSA_PSS)
  3980. if (sigAlgo == rsa_pss_sa_algo) {
  3981. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3982. int mgf = 0;
  3983. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3984. if (ret != 0)
  3985. return ret;
  3986. #if defined(HAVE_PK_CALLBACKS)
  3987. if (ssl->ctx->RsaPssSignCb) {
  3988. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3989. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  3990. TypeHash(hashAlgo), mgf,
  3991. keyBuf, keySz, ctx);
  3992. }
  3993. else
  3994. #endif
  3995. {
  3996. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  3997. ssl->rng);
  3998. }
  3999. }
  4000. else
  4001. #endif
  4002. #if defined(HAVE_PK_CALLBACKS)
  4003. if (ssl->ctx->RsaSignCb) {
  4004. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  4005. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4006. ctx);
  4007. }
  4008. else
  4009. #endif /*HAVE_PK_CALLBACKS */
  4010. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  4011. /* Handle async pending response */
  4012. #ifdef WOLFSSL_ASYNC_CRYPT
  4013. if (key && ret == WC_PENDING_E) {
  4014. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4015. }
  4016. #endif /* WOLFSSL_ASYNC_CRYPT */
  4017. /* For positive response return in outSz */
  4018. if (ret > 0) {
  4019. *outSz = ret;
  4020. ret = 0;
  4021. }
  4022. WOLFSSL_LEAVE("RsaSign", ret);
  4023. return ret;
  4024. }
  4025. #endif
  4026. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  4027. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  4028. {
  4029. int ret = SIG_VERIFY_E;
  4030. #ifdef HAVE_PK_CALLBACKS
  4031. const byte* keyBuf = NULL;
  4032. word32 keySz = 0;
  4033. if (keyBufInfo) {
  4034. keyBuf = keyBufInfo->buffer;
  4035. keySz = keyBufInfo->length;
  4036. }
  4037. #endif
  4038. (void)ssl;
  4039. (void)keyBufInfo;
  4040. (void)sigAlgo;
  4041. (void)hashAlgo;
  4042. WOLFSSL_ENTER("RsaVerify");
  4043. #ifdef WOLFSSL_ASYNC_CRYPT
  4044. /* initialize event */
  4045. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4046. if (ret != 0)
  4047. return ret;
  4048. #endif
  4049. #if defined(WC_RSA_PSS)
  4050. if (sigAlgo == rsa_pss_sa_algo) {
  4051. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4052. int mgf = 0;
  4053. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4054. if (ret != 0)
  4055. return ret;
  4056. #ifdef HAVE_PK_CALLBACKS
  4057. if (ssl->ctx->RsaPssVerifyCb) {
  4058. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  4059. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  4060. TypeHash(hashAlgo), mgf,
  4061. keyBuf, keySz, ctx);
  4062. }
  4063. else
  4064. #endif /*HAVE_PK_CALLBACKS */
  4065. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  4066. }
  4067. else
  4068. #endif
  4069. #ifdef HAVE_PK_CALLBACKS
  4070. if (ssl->ctx->RsaVerifyCb) {
  4071. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  4072. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  4073. }
  4074. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4075. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4076. else
  4077. #else
  4078. if (!ssl->ctx->RsaVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4079. #endif
  4080. #endif /*HAVE_PK_CALLBACKS */
  4081. {
  4082. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  4083. }
  4084. /* Handle async pending response */
  4085. #ifdef WOLFSSL_ASYNC_CRYPT
  4086. if (ret == WC_PENDING_E) {
  4087. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4088. }
  4089. #endif /* WOLFSSL_ASYNC_CRYPT */
  4090. WOLFSSL_LEAVE("RsaVerify", ret);
  4091. return ret;
  4092. }
  4093. /* Verify RSA signature, 0 on success */
  4094. /* This function is used to check the sign result */
  4095. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  4096. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  4097. DerBuffer* keyBufInfo)
  4098. {
  4099. byte* out = NULL; /* inline result */
  4100. int ret;
  4101. #ifdef HAVE_PK_CALLBACKS
  4102. const byte* keyBuf = NULL;
  4103. word32 keySz = 0;
  4104. if (keyBufInfo) {
  4105. keyBuf = keyBufInfo->buffer;
  4106. keySz = keyBufInfo->length;
  4107. }
  4108. #endif
  4109. (void)ssl;
  4110. (void)keyBufInfo;
  4111. (void)sigAlgo;
  4112. (void)hashAlgo;
  4113. WOLFSSL_ENTER("VerifyRsaSign");
  4114. if (verifySig == NULL || plain == NULL) {
  4115. return BAD_FUNC_ARG;
  4116. }
  4117. if (sigSz > ENCRYPT_LEN) {
  4118. WOLFSSL_MSG("Signature buffer too big");
  4119. return BUFFER_E;
  4120. }
  4121. #ifdef WOLFSSL_ASYNC_CRYPT
  4122. /* initialize event */
  4123. if (key) {
  4124. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4125. if (ret != 0)
  4126. return ret;
  4127. }
  4128. #endif
  4129. #if defined(WC_RSA_PSS)
  4130. if (sigAlgo == rsa_pss_sa_algo) {
  4131. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4132. int mgf = 0;
  4133. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4134. if (ret != 0)
  4135. return ret;
  4136. #ifdef HAVE_PK_CALLBACKS
  4137. if (ssl->ctx->RsaPssSignCheckCb) {
  4138. /* The key buffer includes private/public portion,
  4139. but only public is used */
  4140. /* If HSM hardware is checking the signature result you can
  4141. optionally skip the sign check and return 0 */
  4142. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  4143. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  4144. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  4145. TypeHash(hashAlgo), mgf,
  4146. keyBuf, keySz, ctx);
  4147. if (ret > 0) {
  4148. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  4149. hashType);
  4150. if (ret != 0) {
  4151. ret = VERIFY_CERT_ERROR;
  4152. WOLFSSL_ERROR_VERBOSE(ret);
  4153. }
  4154. }
  4155. }
  4156. else
  4157. #endif /* HAVE_PK_CALLBACKS */
  4158. {
  4159. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  4160. key);
  4161. if (ret > 0) {
  4162. #ifdef HAVE_SELFTEST
  4163. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  4164. hashType);
  4165. #else
  4166. ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret,
  4167. hashType, -1,
  4168. mp_count_bits(&key->n));
  4169. #endif
  4170. if (ret != 0) {
  4171. ret = VERIFY_CERT_ERROR;
  4172. WOLFSSL_ERROR_VERBOSE(ret);
  4173. }
  4174. }
  4175. }
  4176. }
  4177. else
  4178. #endif /* WC_RSA_PSS */
  4179. {
  4180. #ifdef HAVE_PK_CALLBACKS
  4181. if (ssl->ctx->RsaSignCheckCb) {
  4182. /* The key buffer includes private/public portion,
  4183. but only public is used */
  4184. /* If HSM hardware is checking the signature result you can
  4185. optionally skip the sign check and return 0 */
  4186. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  4187. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  4188. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  4189. keyBuf, keySz, ctx);
  4190. }
  4191. else
  4192. #endif /* HAVE_PK_CALLBACKS */
  4193. {
  4194. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  4195. }
  4196. if (ret > 0) {
  4197. if (ret != (int)plainSz || !out ||
  4198. XMEMCMP(plain, out, plainSz) != 0) {
  4199. WOLFSSL_MSG("RSA Signature verification failed");
  4200. ret = RSA_SIGN_FAULT;
  4201. WOLFSSL_ERROR_VERBOSE(ret);
  4202. }
  4203. else {
  4204. ret = 0; /* RSA reset */
  4205. }
  4206. }
  4207. }
  4208. /* Handle async pending response */
  4209. #ifdef WOLFSSL_ASYNC_CRYPT
  4210. if (key && ret == WC_PENDING_E) {
  4211. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4212. }
  4213. #endif /* WOLFSSL_ASYNC_CRYPT */
  4214. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  4215. return ret;
  4216. }
  4217. #ifndef WOLFSSL_NO_TLS12
  4218. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  4219. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  4220. RsaKey* key, DerBuffer* keyBufInfo)
  4221. {
  4222. byte *outTmp;
  4223. byte mask;
  4224. int ret;
  4225. #ifdef HAVE_PK_CALLBACKS
  4226. const byte* keyBuf = NULL;
  4227. word32 keySz = 0;
  4228. if (keyBufInfo) {
  4229. keyBuf = keyBufInfo->buffer;
  4230. keySz = keyBufInfo->length;
  4231. }
  4232. #endif
  4233. (void)ssl;
  4234. (void)keyBufInfo;
  4235. WOLFSSL_ENTER("RsaDec");
  4236. outTmp = *out;
  4237. #ifdef WOLFSSL_ASYNC_CRYPT
  4238. /* initialize event */
  4239. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4240. if (ret != 0)
  4241. return ret;
  4242. #endif
  4243. #ifdef HAVE_PK_CALLBACKS
  4244. if (ssl->ctx->RsaDecCb) {
  4245. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  4246. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, &outTmp, keyBuf, keySz, ctx);
  4247. }
  4248. else
  4249. #endif /* HAVE_PK_CALLBACKS */
  4250. {
  4251. #ifdef WC_RSA_BLINDING
  4252. ret = wc_RsaSetRNG(key, ssl->rng);
  4253. if (ret != 0)
  4254. return ret;
  4255. #endif
  4256. ret = wc_RsaPrivateDecryptInline(in, inSz, &outTmp, key);
  4257. }
  4258. /* Handle async pending response */
  4259. #ifdef WOLFSSL_ASYNC_CRYPT
  4260. if (ret == WC_PENDING_E) {
  4261. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4262. }
  4263. #endif /* WOLFSSL_ASYNC_CRYPT */
  4264. mask = ctMaskGT(ret, 0);
  4265. *outSz = (word32)(ret & (int)(sword8)mask);
  4266. ret &= (int)(sword8)(~mask);
  4267. /* Copy pointer */
  4268. ctMaskCopy(mask, (byte*)out, (byte*)&outTmp, sizeof(*out));
  4269. WOLFSSL_LEAVE("RsaDec", ret);
  4270. return ret;
  4271. }
  4272. #endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
  4273. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  4274. RsaKey* key, buffer* keyBufInfo)
  4275. {
  4276. int ret = BAD_FUNC_ARG;
  4277. #ifdef HAVE_PK_CALLBACKS
  4278. const byte* keyBuf = NULL;
  4279. word32 keySz = 0;
  4280. if (keyBufInfo) {
  4281. keyBuf = keyBufInfo->buffer;
  4282. keySz = keyBufInfo->length;
  4283. }
  4284. #endif
  4285. (void)ssl;
  4286. (void)keyBufInfo;
  4287. WOLFSSL_ENTER("RsaEnc");
  4288. #ifdef WOLFSSL_ASYNC_CRYPT
  4289. /* initialize event */
  4290. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4291. if (ret != 0)
  4292. return ret;
  4293. #endif
  4294. #ifdef HAVE_PK_CALLBACKS
  4295. if (ssl->ctx->RsaEncCb) {
  4296. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  4297. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  4298. }
  4299. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4300. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4301. else
  4302. #else
  4303. if (!ssl->ctx->RsaEncCb || ret == CRYPTOCB_UNAVAILABLE)
  4304. #endif
  4305. #endif /* HAVE_PK_CALLBACKS */
  4306. {
  4307. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  4308. }
  4309. /* Handle async pending response */
  4310. #ifdef WOLFSSL_ASYNC_CRYPT
  4311. if (ret == WC_PENDING_E) {
  4312. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4313. }
  4314. #endif /* WOLFSSL_ASYNC_CRYPT */
  4315. /* For positive response return in outSz */
  4316. if (ret > 0) {
  4317. *outSz = ret;
  4318. ret = 0;
  4319. }
  4320. WOLFSSL_LEAVE("RsaEnc", ret);
  4321. return ret;
  4322. }
  4323. #endif /* !WOLFSSL_NO_TLS12 */
  4324. #endif /* NO_RSA */
  4325. #ifdef HAVE_ECC
  4326. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4327. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  4328. {
  4329. int ret;
  4330. #ifdef HAVE_PK_CALLBACKS
  4331. const byte* keyBuf = NULL;
  4332. word32 keySz = 0;
  4333. if (keyBufInfo) {
  4334. keyBuf = keyBufInfo->buffer;
  4335. keySz = keyBufInfo->length;
  4336. }
  4337. #endif
  4338. (void)ssl;
  4339. (void)keyBufInfo;
  4340. WOLFSSL_ENTER("EccSign");
  4341. #ifdef WOLFSSL_ASYNC_CRYPT
  4342. /* initialize event */
  4343. if (key) {
  4344. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4345. if (ret != 0)
  4346. return ret;
  4347. }
  4348. #endif
  4349. #if defined(HAVE_PK_CALLBACKS)
  4350. if (ssl->ctx->EccSignCb) {
  4351. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  4352. if (ctx == NULL) {
  4353. /* Try to get the WOLFSSL_CTX EccSignCtx*/
  4354. ctx = wolfSSL_CTX_GetEccSignCtx(ssl->ctx);
  4355. }
  4356. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  4357. keySz, ctx);
  4358. #if defined(WOLFSSL_RENESAS_TSIP_TLS)
  4359. if (ret == CRYPTOCB_UNAVAILABLE) {
  4360. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4361. }
  4362. #endif /* WOLFSSL_RENESAS_TSIP_TLS */
  4363. }
  4364. else
  4365. #endif /* HAVE_PK_CALLBACKS */
  4366. {
  4367. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4368. }
  4369. /* Handle async pending response */
  4370. #ifdef WOLFSSL_ASYNC_CRYPT
  4371. if (key && ret == WC_PENDING_E) {
  4372. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4373. }
  4374. #endif /* WOLFSSL_ASYNC_CRYPT */
  4375. WOLFSSL_LEAVE("EccSign", ret);
  4376. return ret;
  4377. }
  4378. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  4379. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  4380. {
  4381. int ret = SIG_VERIFY_E;
  4382. #ifdef HAVE_PK_CALLBACKS
  4383. const byte* keyBuf = NULL;
  4384. word32 keySz = 0;
  4385. if (keyBufInfo) {
  4386. keyBuf = keyBufInfo->buffer;
  4387. keySz = keyBufInfo->length;
  4388. }
  4389. #endif
  4390. (void)ssl;
  4391. (void)keyBufInfo;
  4392. WOLFSSL_ENTER("EccVerify");
  4393. #ifdef WOLFSSL_ASYNC_CRYPT
  4394. /* initialize event */
  4395. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4396. if (ret != 0)
  4397. return ret;
  4398. #endif
  4399. #ifdef HAVE_PK_CALLBACKS
  4400. if (ssl->ctx->EccVerifyCb) {
  4401. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  4402. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4403. &ssl->eccVerifyRes, ctx);
  4404. }
  4405. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4406. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4407. else
  4408. #else
  4409. if (!ssl->ctx->EccVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4410. #endif
  4411. #endif /* HAVE_PK_CALLBACKS */
  4412. {
  4413. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  4414. }
  4415. /* Handle async pending response */
  4416. #ifdef WOLFSSL_ASYNC_CRYPT
  4417. if (ret == WC_PENDING_E) {
  4418. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4419. }
  4420. else
  4421. #endif /* WOLFSSL_ASYNC_CRYPT */
  4422. {
  4423. if (ret != 0 || ssl->eccVerifyRes == 0) {
  4424. if (ret == 0) {
  4425. ret = VERIFY_SIGN_ERROR;
  4426. }
  4427. WOLFSSL_ERROR_VERBOSE(ret);
  4428. }
  4429. else {
  4430. ret = 0;
  4431. }
  4432. }
  4433. WOLFSSL_LEAVE("EccVerify", ret);
  4434. return ret;
  4435. }
  4436. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  4437. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  4438. int side)
  4439. {
  4440. int ret;
  4441. #ifdef WOLFSSL_ASYNC_CRYPT
  4442. WC_ASYNC_DEV* asyncDev = NULL;
  4443. #endif
  4444. (void)ssl;
  4445. (void)pubKeyDer;
  4446. (void)pubKeySz;
  4447. (void)side;
  4448. WOLFSSL_ENTER("EccSharedSecret");
  4449. #ifdef WOLFSSL_ASYNC_CRYPT
  4450. /* initialize event */
  4451. if (priv_key != NULL) {
  4452. asyncDev = &priv_key->asyncDev;
  4453. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4454. if (ret != 0)
  4455. return ret;
  4456. }
  4457. #endif
  4458. #ifdef HAVE_PK_CALLBACKS
  4459. if (ssl->ctx->EccSharedSecretCb) {
  4460. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  4461. ecc_key* otherKey = (side == WOLFSSL_CLIENT_END) ? pub_key : priv_key;
  4462. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  4463. pubKeySz, out, outlen, side, ctx);
  4464. }
  4465. else
  4466. #endif
  4467. {
  4468. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  4469. !defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2)) && \
  4470. !defined(HAVE_SELFTEST)
  4471. ret = wc_ecc_set_rng(priv_key, ssl->rng);
  4472. if (ret == 0)
  4473. #endif
  4474. {
  4475. PRIVATE_KEY_UNLOCK();
  4476. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  4477. PRIVATE_KEY_LOCK();
  4478. }
  4479. }
  4480. /* Handle async pending response */
  4481. #ifdef WOLFSSL_ASYNC_CRYPT
  4482. if (ret == WC_PENDING_E) {
  4483. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  4484. }
  4485. #endif /* WOLFSSL_ASYNC_CRYPT */
  4486. WOLFSSL_LEAVE("EccSharedSecret", ret);
  4487. return ret;
  4488. }
  4489. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  4490. {
  4491. int ret = 0;
  4492. int keySz = 0;
  4493. int ecc_curve = ECC_CURVE_DEF;
  4494. WOLFSSL_ENTER("EccMakeKey");
  4495. #ifdef WOLFSSL_ASYNC_CRYPT
  4496. /* initialize event */
  4497. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4498. if (ret != 0)
  4499. return ret;
  4500. #endif
  4501. /* get key size */
  4502. if (peer == NULL || peer->dp == NULL) {
  4503. keySz = ssl->eccTempKeySz;
  4504. /* get curve type */
  4505. if (ssl->ecdhCurveOID > 0) {
  4506. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  4507. }
  4508. }
  4509. else {
  4510. keySz = peer->dp->size;
  4511. ecc_curve = peer->dp->id;
  4512. }
  4513. #ifdef HAVE_PK_CALLBACKS
  4514. if (ssl->ctx->EccKeyGenCb) {
  4515. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  4516. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  4517. }
  4518. else
  4519. #endif
  4520. {
  4521. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  4522. }
  4523. /* make sure the curve is set for TLS */
  4524. if (ret == 0 && key->dp) {
  4525. ssl->ecdhCurveOID = key->dp->oidSum;
  4526. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4527. ssl->namedGroup = 0;
  4528. #endif
  4529. }
  4530. /* Handle async pending response */
  4531. #ifdef WOLFSSL_ASYNC_CRYPT
  4532. if (ret == WC_PENDING_E) {
  4533. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4534. }
  4535. #endif /* WOLFSSL_ASYNC_CRYPT */
  4536. WOLFSSL_LEAVE("EccMakeKey", ret);
  4537. return ret;
  4538. }
  4539. #endif /* HAVE_ECC */
  4540. #ifdef HAVE_ED25519
  4541. /* Check whether the key contains a public key.
  4542. * If not then pull it out of the leaf certificate.
  4543. *
  4544. * ssl SSL/TLS object.
  4545. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4546. * 0 on success.
  4547. */
  4548. int Ed25519CheckPubKey(WOLFSSL* ssl)
  4549. {
  4550. #ifndef HAVE_ED25519_KEY_IMPORT
  4551. (void)ssl;
  4552. return NOT_COMPILED_IN;
  4553. #else /* HAVE_ED25519_KEY_IMPORT */
  4554. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  4555. int ret = 0;
  4556. /* Public key required for signing. */
  4557. if (key != NULL && !key->pubKeySet) {
  4558. DerBuffer* leaf = ssl->buffers.certificate;
  4559. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert),
  4560. ssl->heap, DYNAMIC_TYPE_DCERT);
  4561. if (cert == NULL)
  4562. ret = MEMORY_E;
  4563. if (ret == 0) {
  4564. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4565. ret = DecodeToKey(cert, 0);
  4566. }
  4567. if (ret == 0) {
  4568. ret = wc_ed25519_import_public(cert->publicKey, cert->pubKeySize,
  4569. key);
  4570. }
  4571. if (cert != NULL) {
  4572. FreeDecodedCert(cert);
  4573. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4574. }
  4575. }
  4576. return ret;
  4577. #endif /* HAVE_ED25519_KEY_IMPORT */
  4578. }
  4579. /* Sign the data using EdDSA and key using Ed25519.
  4580. *
  4581. * ssl SSL object.
  4582. * in Data or message to sign.
  4583. * inSz Length of the data.
  4584. * out Buffer to hold signature.
  4585. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4586. * key The private Ed25519 key data.
  4587. * keySz The length of the private key data in bytes.
  4588. * ctx The callback context.
  4589. * returns 0 on success, otherwise the value is an error.
  4590. */
  4591. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4592. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  4593. {
  4594. #ifndef HAVE_ED25519_SIGN
  4595. (void)ssl;
  4596. (void)in;
  4597. (void)inSz;
  4598. (void)out;
  4599. (void)outSz;
  4600. (void)key;
  4601. (void)keyBufInfo;
  4602. return NOT_COMPILED_IN;
  4603. #else /* HAVE_ED25519_SIGN */
  4604. int ret;
  4605. #ifdef HAVE_PK_CALLBACKS
  4606. const byte* keyBuf = NULL;
  4607. word32 keySz = 0;
  4608. if (keyBufInfo) {
  4609. keyBuf = keyBufInfo->buffer;
  4610. keySz = keyBufInfo->length;
  4611. }
  4612. #endif
  4613. (void)ssl;
  4614. (void)keyBufInfo;
  4615. WOLFSSL_ENTER("Ed25519Sign");
  4616. #ifdef WOLFSSL_ASYNC_CRYPT
  4617. /* initialize event */
  4618. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4619. if (ret != 0)
  4620. return ret;
  4621. #endif
  4622. #if defined(HAVE_PK_CALLBACKS)
  4623. if (ssl->ctx->Ed25519SignCb) {
  4624. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  4625. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  4626. keySz, ctx);
  4627. }
  4628. else
  4629. #endif /* HAVE_PK_CALLBACKS */
  4630. {
  4631. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  4632. }
  4633. /* Handle async pending response */
  4634. #ifdef WOLFSSL_ASYNC_CRYPT
  4635. if (ret == WC_PENDING_E) {
  4636. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4637. }
  4638. #endif /* WOLFSSL_ASYNC_CRYPT */
  4639. WOLFSSL_LEAVE("Ed25519Sign", ret);
  4640. return ret;
  4641. #endif /* HAVE_ED25519_SIGN */
  4642. }
  4643. /* Verify the data using EdDSA and key using Ed25519.
  4644. *
  4645. * ssl SSL object.
  4646. * in Signature data.
  4647. * inSz Length of the signature data in bytes.
  4648. * msg Message to verify.
  4649. * outSz Length of message in bytes.
  4650. * key The public Ed25519 key data.
  4651. * keySz The length of the private key data in bytes.
  4652. * ctx The callback context.
  4653. * returns 0 on success, otherwise the value is an error.
  4654. */
  4655. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4656. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  4657. {
  4658. #ifndef HAVE_ED25519_VERIFY
  4659. (void)ssl;
  4660. (void)in;
  4661. (void)inSz;
  4662. (void)msg;
  4663. (void)msgSz;
  4664. (void)key;
  4665. (void)keyBufInfo;
  4666. return NOT_COMPILED_IN;
  4667. #else /* HAVE_ED25519_VERIFY */
  4668. int ret;
  4669. #ifdef HAVE_PK_CALLBACKS
  4670. const byte* keyBuf = NULL;
  4671. word32 keySz = 0;
  4672. if (keyBufInfo) {
  4673. keyBuf = keyBufInfo->buffer;
  4674. keySz = keyBufInfo->length;
  4675. }
  4676. #endif
  4677. (void)ssl;
  4678. (void)keyBufInfo;
  4679. WOLFSSL_ENTER("Ed25519Verify");
  4680. #ifdef WOLFSSL_ASYNC_CRYPT
  4681. /* initialize event */
  4682. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4683. if (ret != 0)
  4684. return ret;
  4685. #endif
  4686. #ifdef HAVE_PK_CALLBACKS
  4687. if (ssl->ctx->Ed25519VerifyCb) {
  4688. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  4689. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  4690. keySz, &ssl->eccVerifyRes, ctx);
  4691. }
  4692. else
  4693. #endif /* HAVE_PK_CALLBACKS */
  4694. {
  4695. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  4696. &ssl->eccVerifyRes, key);
  4697. }
  4698. /* Handle async pending response */
  4699. #ifdef WOLFSSL_ASYNC_CRYPT
  4700. if (ret == WC_PENDING_E) {
  4701. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4702. }
  4703. else
  4704. #endif /* WOLFSSL_ASYNC_CRYPT */
  4705. {
  4706. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4707. }
  4708. WOLFSSL_LEAVE("Ed25519Verify", ret);
  4709. return ret;
  4710. #endif /* HAVE_ED25519_VERIFY */
  4711. }
  4712. #endif /* HAVE_ED25519 */
  4713. #ifndef WOLFSSL_NO_TLS12
  4714. #ifdef HAVE_CURVE25519
  4715. #ifdef HAVE_PK_CALLBACKS
  4716. /* Gets X25519 key for shared secret callback testing
  4717. * Client side: returns peer key
  4718. * Server side: returns private key
  4719. */
  4720. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  4721. {
  4722. int ret = NO_PEER_KEY;
  4723. struct curve25519_key* tmpKey = NULL;
  4724. if (ssl == NULL || otherKey == NULL) {
  4725. return BAD_FUNC_ARG;
  4726. }
  4727. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4728. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  4729. !ssl->peerX25519Key->dp) {
  4730. return NO_PEER_KEY;
  4731. }
  4732. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  4733. }
  4734. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4735. if (!ssl->eccTempKeyPresent) {
  4736. return NO_PRIVATE_KEY;
  4737. }
  4738. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  4739. }
  4740. if (tmpKey) {
  4741. *otherKey = (curve25519_key *)tmpKey;
  4742. ret = 0;
  4743. }
  4744. return ret;
  4745. }
  4746. #endif /* HAVE_PK_CALLBACKS */
  4747. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  4748. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  4749. byte* out, word32* outlen, int side)
  4750. {
  4751. int ret;
  4752. (void)ssl;
  4753. (void)pubKeyDer;
  4754. (void)pubKeySz;
  4755. (void)side;
  4756. WOLFSSL_ENTER("X25519SharedSecret");
  4757. #ifdef WOLFSSL_ASYNC_CRYPT
  4758. /* initialize event */
  4759. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4760. if (ret != 0)
  4761. return ret;
  4762. #endif
  4763. #ifdef HAVE_PK_CALLBACKS
  4764. if (ssl->ctx->X25519SharedSecretCb) {
  4765. curve25519_key* otherKey = NULL;
  4766. ret = X25519GetKey(ssl, &otherKey);
  4767. if (ret == 0) {
  4768. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  4769. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  4770. pubKeySz, out, outlen, side, ctx);
  4771. }
  4772. }
  4773. else
  4774. #endif
  4775. {
  4776. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  4777. EC25519_LITTLE_ENDIAN);
  4778. }
  4779. /* Handle async pending response */
  4780. #ifdef WOLFSSL_ASYNC_CRYPT
  4781. if (ret == WC_PENDING_E) {
  4782. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4783. }
  4784. #endif /* WOLFSSL_ASYNC_CRYPT */
  4785. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  4786. return ret;
  4787. }
  4788. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  4789. curve25519_key* peer)
  4790. {
  4791. int ret = 0;
  4792. (void)peer;
  4793. WOLFSSL_ENTER("X25519MakeKey");
  4794. #ifdef WOLFSSL_ASYNC_CRYPT
  4795. /* initialize event */
  4796. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4797. if (ret != 0)
  4798. return ret;
  4799. #endif
  4800. #ifdef HAVE_PK_CALLBACKS
  4801. if (ssl->ctx->X25519KeyGenCb) {
  4802. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  4803. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  4804. }
  4805. else
  4806. #endif
  4807. {
  4808. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  4809. }
  4810. if (ret == 0) {
  4811. ssl->ecdhCurveOID = ECC_X25519_OID;
  4812. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4813. ssl->namedGroup = 0;
  4814. #endif
  4815. }
  4816. /* Handle async pending response */
  4817. #ifdef WOLFSSL_ASYNC_CRYPT
  4818. if (ret == WC_PENDING_E) {
  4819. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4820. }
  4821. #endif /* WOLFSSL_ASYNC_CRYPT */
  4822. WOLFSSL_LEAVE("X25519MakeKey", ret);
  4823. return ret;
  4824. }
  4825. #endif /* HAVE_CURVE25519 */
  4826. #endif /* !WOLFSSL_NO_TLS12 */
  4827. #ifdef HAVE_ED448
  4828. /* Check whether the key contains a public key.
  4829. * If not then pull it out of the leaf certificate.
  4830. *
  4831. * ssl SSL/TLS object.
  4832. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4833. * 0 on success.
  4834. */
  4835. int Ed448CheckPubKey(WOLFSSL* ssl)
  4836. {
  4837. #ifndef HAVE_ED448_KEY_IMPORT
  4838. (void)ssl;
  4839. return NOT_COMPILED_IN;
  4840. #else /* HAVE_ED448_KEY_IMPORT */
  4841. ed448_key* key = (ed448_key*)ssl->hsKey;
  4842. int ret = 0;
  4843. /* Public key required for signing. */
  4844. if (key != NULL && !key->pubKeySet) {
  4845. DerBuffer* leaf = ssl->buffers.certificate;
  4846. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert), ssl->heap,
  4847. DYNAMIC_TYPE_DCERT);
  4848. if (cert == NULL)
  4849. ret = MEMORY_E;
  4850. if (ret == 0) {
  4851. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4852. ret = DecodeToKey(cert, 0);
  4853. }
  4854. if (ret == 0) {
  4855. ret = wc_ed448_import_public(cert->publicKey, cert->pubKeySize,
  4856. key);
  4857. }
  4858. if (cert != NULL) {
  4859. FreeDecodedCert(cert);
  4860. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4861. }
  4862. }
  4863. return ret;
  4864. #endif /* HAVE_ED448_KEY_IMPORT */
  4865. }
  4866. /* Sign the data using EdDSA and key using Ed448.
  4867. *
  4868. * ssl SSL object.
  4869. * in Data or message to sign.
  4870. * inSz Length of the data.
  4871. * out Buffer to hold signature.
  4872. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4873. * key The private Ed448 key data.
  4874. * keySz The length of the private key data in bytes.
  4875. * ctx The callback context.
  4876. * returns 0 on success, otherwise the value is an error.
  4877. */
  4878. int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4879. word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
  4880. {
  4881. #ifndef HAVE_ED448_SIGN
  4882. (void)ssl;
  4883. (void)in;
  4884. (void)inSz;
  4885. (void)out;
  4886. (void)outSz;
  4887. (void)key;
  4888. (void)keyBufInfo;
  4889. return NOT_COMPILED_IN;
  4890. #else /* HAVE_ED448_SIGN */
  4891. int ret;
  4892. #ifdef HAVE_PK_CALLBACKS
  4893. const byte* keyBuf = NULL;
  4894. word32 keySz = 0;
  4895. if (keyBufInfo) {
  4896. keyBuf = keyBufInfo->buffer;
  4897. keySz = keyBufInfo->length;
  4898. }
  4899. #endif
  4900. (void)ssl;
  4901. (void)keyBufInfo;
  4902. WOLFSSL_ENTER("Ed448Sign");
  4903. #ifdef WOLFSSL_ASYNC_CRYPT
  4904. /* initialize event */
  4905. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4906. if (ret != 0)
  4907. return ret;
  4908. #endif
  4909. #if defined(HAVE_PK_CALLBACKS)
  4910. if (ssl->ctx->Ed448SignCb) {
  4911. void* ctx = wolfSSL_GetEd448SignCtx(ssl);
  4912. ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4913. ctx);
  4914. }
  4915. else
  4916. #endif /* HAVE_PK_CALLBACKS */
  4917. {
  4918. ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
  4919. }
  4920. /* Handle async pending response */
  4921. #ifdef WOLFSSL_ASYNC_CRYPT
  4922. if (ret == WC_PENDING_E) {
  4923. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4924. }
  4925. #endif /* WOLFSSL_ASYNC_CRYPT */
  4926. WOLFSSL_LEAVE("Ed448Sign", ret);
  4927. return ret;
  4928. #endif /* HAVE_ED448_SIGN */
  4929. }
  4930. /* Verify the data using EdDSA and key using Ed448.
  4931. *
  4932. * ssl SSL object.
  4933. * in Signature data.
  4934. * inSz Length of the signature data in bytes.
  4935. * msg Message to verify.
  4936. * outSz Length of message in bytes.
  4937. * key The public Ed448 key data.
  4938. * keySz The length of the private key data in bytes.
  4939. * ctx The callback context.
  4940. * returns 0 on success, otherwise the value is an error.
  4941. */
  4942. int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4943. word32 msgSz, ed448_key* key, buffer* keyBufInfo)
  4944. {
  4945. #ifndef HAVE_ED448_VERIFY
  4946. (void)ssl;
  4947. (void)in;
  4948. (void)inSz;
  4949. (void)msg;
  4950. (void)msgSz;
  4951. (void)key;
  4952. (void)keyBufInfo;
  4953. return NOT_COMPILED_IN;
  4954. #else /* HAVE_ED448_VERIFY */
  4955. int ret;
  4956. #ifdef HAVE_PK_CALLBACKS
  4957. const byte* keyBuf = NULL;
  4958. word32 keySz = 0;
  4959. if (keyBufInfo) {
  4960. keyBuf = keyBufInfo->buffer;
  4961. keySz = keyBufInfo->length;
  4962. }
  4963. #endif
  4964. (void)ssl;
  4965. (void)keyBufInfo;
  4966. WOLFSSL_ENTER("Ed448Verify");
  4967. #ifdef WOLFSSL_ASYNC_CRYPT
  4968. /* initialize event */
  4969. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4970. if (ret != 0)
  4971. return ret;
  4972. #endif
  4973. #ifdef HAVE_PK_CALLBACKS
  4974. if (ssl->ctx->Ed448VerifyCb) {
  4975. void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
  4976. ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
  4977. &ssl->eccVerifyRes, ctx);
  4978. }
  4979. else
  4980. #endif /* HAVE_PK_CALLBACKS */
  4981. {
  4982. ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
  4983. NULL, 0);
  4984. }
  4985. /* Handle async pending response */
  4986. #ifdef WOLFSSL_ASYNC_CRYPT
  4987. if (ret == WC_PENDING_E) {
  4988. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4989. }
  4990. else
  4991. #endif /* WOLFSSL_ASYNC_CRYPT */
  4992. {
  4993. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4994. }
  4995. WOLFSSL_LEAVE("Ed448Verify", ret);
  4996. return ret;
  4997. #endif /* HAVE_ED448_VERIFY */
  4998. }
  4999. #endif /* HAVE_ED448 */
  5000. #ifndef WOLFSSL_NO_TLS12
  5001. #ifdef HAVE_CURVE448
  5002. #ifdef HAVE_PK_CALLBACKS
  5003. /* Gets X448 key for shared secret callback testing
  5004. * Client side: returns peer key
  5005. * Server side: returns private key
  5006. */
  5007. static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
  5008. {
  5009. int ret = NO_PEER_KEY;
  5010. struct curve448_key* tmpKey = NULL;
  5011. if (ssl == NULL || otherKey == NULL) {
  5012. return BAD_FUNC_ARG;
  5013. }
  5014. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5015. if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
  5016. return NO_PEER_KEY;
  5017. }
  5018. tmpKey = (struct curve448_key*)ssl->peerX448Key;
  5019. }
  5020. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  5021. if (!ssl->eccTempKeyPresent) {
  5022. return NO_PRIVATE_KEY;
  5023. }
  5024. tmpKey = (struct curve448_key*)ssl->eccTempKey;
  5025. }
  5026. if (tmpKey) {
  5027. *otherKey = (curve448_key *)tmpKey;
  5028. ret = 0;
  5029. }
  5030. return ret;
  5031. }
  5032. #endif /* HAVE_PK_CALLBACKS */
  5033. static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
  5034. curve448_key* pub_key, byte* pubKeyDer,
  5035. word32* pubKeySz, byte* out, word32* outlen,
  5036. int side)
  5037. {
  5038. int ret;
  5039. (void)ssl;
  5040. (void)pubKeyDer;
  5041. (void)pubKeySz;
  5042. (void)side;
  5043. WOLFSSL_ENTER("X448SharedSecret");
  5044. #ifdef WOLFSSL_ASYNC_CRYPT
  5045. /* initialize event */
  5046. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5047. if (ret != 0)
  5048. return ret;
  5049. #endif
  5050. #ifdef HAVE_PK_CALLBACKS
  5051. if (ssl->ctx->X448SharedSecretCb) {
  5052. curve448_key* otherKey = NULL;
  5053. ret = X448GetKey(ssl, &otherKey);
  5054. if (ret == 0) {
  5055. void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
  5056. ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
  5057. pubKeySz, out, outlen, side, ctx);
  5058. }
  5059. }
  5060. else
  5061. #endif
  5062. {
  5063. ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
  5064. EC448_LITTLE_ENDIAN);
  5065. }
  5066. /* Handle async pending response */
  5067. #ifdef WOLFSSL_ASYNC_CRYPT
  5068. if (ret == WC_PENDING_E) {
  5069. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  5070. }
  5071. #endif /* WOLFSSL_ASYNC_CRYPT */
  5072. WOLFSSL_LEAVE("X448SharedSecret", ret);
  5073. return ret;
  5074. }
  5075. static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
  5076. {
  5077. int ret = 0;
  5078. (void)peer;
  5079. WOLFSSL_ENTER("X448MakeKey");
  5080. #ifdef WOLFSSL_ASYNC_CRYPT
  5081. /* initialize event */
  5082. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  5083. if (ret != 0)
  5084. return ret;
  5085. #endif
  5086. #ifdef HAVE_PK_CALLBACKS
  5087. if (ssl->ctx->X448KeyGenCb) {
  5088. void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
  5089. ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
  5090. }
  5091. else
  5092. #endif
  5093. {
  5094. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  5095. }
  5096. if (ret == 0) {
  5097. ssl->ecdhCurveOID = ECC_X448_OID;
  5098. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  5099. ssl->namedGroup = 0;
  5100. #endif
  5101. }
  5102. /* Handle async pending response */
  5103. #ifdef WOLFSSL_ASYNC_CRYPT
  5104. if (ret == WC_PENDING_E) {
  5105. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5106. }
  5107. #endif /* WOLFSSL_ASYNC_CRYPT */
  5108. WOLFSSL_LEAVE("X448MakeKey", ret);
  5109. return ret;
  5110. }
  5111. #endif /* HAVE_CURVE448 */
  5112. #endif /* !WOLFSSL_NO_TLS12 */
  5113. #if !defined(NO_CERTS) || !defined(NO_PSK)
  5114. #if !defined(NO_DH)
  5115. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  5116. byte* priv, word32* privSz,
  5117. byte* pub, word32* pubSz)
  5118. {
  5119. int ret;
  5120. WOLFSSL_ENTER("DhGenKeyPair");
  5121. #ifdef WOLFSSL_ASYNC_CRYPT
  5122. /* initialize event */
  5123. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5124. if (ret != 0)
  5125. return ret;
  5126. #endif
  5127. PRIVATE_KEY_UNLOCK();
  5128. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  5129. PRIVATE_KEY_LOCK();
  5130. /* Handle async pending response */
  5131. #ifdef WOLFSSL_ASYNC_CRYPT
  5132. if (ret == WC_PENDING_E) {
  5133. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  5134. }
  5135. #endif /* WOLFSSL_ASYNC_CRYPT */
  5136. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  5137. return ret;
  5138. }
  5139. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  5140. const byte* priv, word32 privSz,
  5141. const byte* otherPub, word32 otherPubSz,
  5142. byte* agree, word32* agreeSz,
  5143. const byte* prime, word32 primeSz)
  5144. {
  5145. int ret;
  5146. (void)ssl;
  5147. WOLFSSL_ENTER("DhAgree");
  5148. #ifdef WOLFSSL_ASYNC_CRYPT
  5149. /* initialize event */
  5150. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5151. if (ret != 0)
  5152. return ret;
  5153. #endif
  5154. #ifdef HAVE_PK_CALLBACKS
  5155. if (ssl->ctx->DhAgreeCb) {
  5156. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  5157. WOLFSSL_MSG("Calling DhAgree Callback Function");
  5158. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  5159. otherPub, otherPubSz, agree, agreeSz, ctx);
  5160. }
  5161. else
  5162. #endif
  5163. {
  5164. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  5165. /* check the public key has valid number */
  5166. if (dhKey != NULL && (prime == NULL || primeSz == 0)) {
  5167. /* wc_DhCheckPubKey does not do exponentiation */
  5168. ret = wc_DhCheckPubKey(dhKey, otherPub, otherPubSz);
  5169. }
  5170. else {
  5171. ret = wc_DhCheckPubValue(prime, primeSz, otherPub, otherPubSz);
  5172. }
  5173. if (ret != 0) {
  5174. /* translate to valid error (wc_DhCheckPubValue returns MP_VAL -1) */
  5175. ret = PEER_KEY_ERROR;
  5176. WOLFSSL_ERROR_VERBOSE(ret);
  5177. #ifdef OPENSSL_EXTRA
  5178. SendAlert(ssl, alert_fatal, illegal_parameter);
  5179. #endif
  5180. }
  5181. else
  5182. #endif
  5183. {
  5184. PRIVATE_KEY_UNLOCK();
  5185. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  5186. otherPubSz);
  5187. PRIVATE_KEY_LOCK();
  5188. }
  5189. }
  5190. /* Handle async pending response */
  5191. #ifdef WOLFSSL_ASYNC_CRYPT
  5192. if (ret == WC_PENDING_E) {
  5193. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  5194. }
  5195. #endif /* WOLFSSL_ASYNC_CRYPT */
  5196. WOLFSSL_LEAVE("DhAgree", ret);
  5197. (void)prime;
  5198. (void)primeSz;
  5199. return ret;
  5200. }
  5201. #endif /* !NO_DH */
  5202. #endif /* !NO_CERTS || !NO_PSK */
  5203. #ifdef HAVE_PK_CALLBACKS
  5204. int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
  5205. {
  5206. int pkcbset = 0;
  5207. (void)ssl;
  5208. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5209. !defined(NO_RSA)
  5210. if (0
  5211. #ifdef HAVE_ECC
  5212. || (ssl->ctx->EccSignCb != NULL &&
  5213. ssl->buffers.keyType == ecc_dsa_sa_algo)
  5214. #endif
  5215. #ifdef HAVE_ED25519
  5216. || (ssl->ctx->Ed25519SignCb != NULL &&
  5217. ssl->buffers.keyType == ed25519_sa_algo)
  5218. #endif
  5219. #ifdef HAVE_ED448
  5220. || (ssl->ctx->Ed448SignCb != NULL &&
  5221. ssl->buffers.keyType == ed448_sa_algo)
  5222. #endif
  5223. #ifndef NO_RSA
  5224. || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
  5225. || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
  5226. #ifdef WC_RSA_PSS
  5227. || (ssl->ctx->RsaPssSignCb != NULL &&
  5228. ssl->buffers.keyType == rsa_pss_sa_algo)
  5229. #endif
  5230. #endif
  5231. ) {
  5232. pkcbset = 1;
  5233. }
  5234. #endif
  5235. return pkcbset;
  5236. }
  5237. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  5238. {
  5239. int pkcbset = 0;
  5240. (void)ctx;
  5241. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5242. !defined(NO_RSA)
  5243. if (0
  5244. #ifdef HAVE_ECC
  5245. || ctx->EccSignCb != NULL
  5246. #endif
  5247. #ifdef HAVE_ED25519
  5248. || ctx->Ed25519SignCb != NULL
  5249. #endif
  5250. #ifdef HAVE_ED448
  5251. || ctx->Ed448SignCb != NULL
  5252. #endif
  5253. #ifndef NO_RSA
  5254. || ctx->RsaSignCb != NULL
  5255. || ctx->RsaDecCb != NULL
  5256. #ifdef WC_RSA_PSS
  5257. || ctx->RsaPssSignCb != NULL
  5258. #endif
  5259. #endif
  5260. ) {
  5261. pkcbset = 1;
  5262. }
  5263. #endif
  5264. return pkcbset;
  5265. }
  5266. #endif /* HAVE_PK_CALLBACKS */
  5267. int InitSSL_Suites(WOLFSSL* ssl)
  5268. {
  5269. int keySz = 0;
  5270. byte havePSK = 0;
  5271. byte haveAnon = 0;
  5272. byte haveRSA = 0;
  5273. byte haveMcast = 0;
  5274. (void)haveAnon; /* Squash unused var warnings */
  5275. (void)haveMcast;
  5276. if (!ssl)
  5277. return BAD_FUNC_ARG;
  5278. #ifndef NO_RSA
  5279. haveRSA = 1;
  5280. #endif
  5281. #ifndef NO_PSK
  5282. havePSK = (byte)ssl->options.havePSK;
  5283. #endif /* NO_PSK */
  5284. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5285. #ifdef HAVE_ANON
  5286. haveAnon = (byte)ssl->options.haveAnon;
  5287. #endif /* HAVE_ANON*/
  5288. #ifdef WOLFSSL_MULTICAST
  5289. haveMcast = (byte)ssl->options.haveMcast;
  5290. #endif /* WOLFSSL_MULTICAST */
  5291. #endif /* !NO_CERTS && !WOLFSSL_SESSION_EXPORT */
  5292. #ifdef WOLFSSL_EARLY_DATA
  5293. if (ssl->options.side == WOLFSSL_SERVER_END)
  5294. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  5295. #endif
  5296. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5297. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5298. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5299. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5300. ssl->buffers.keyType == ed25519_sa_algo ||
  5301. ssl->buffers.keyType == ed448_sa_algo;
  5302. #endif
  5303. #ifndef NO_CERTS
  5304. keySz = ssl->buffers.keySz;
  5305. #endif
  5306. /* make sure server has DH parms, and add PSK if there */
  5307. if (ssl->options.side == WOLFSSL_SERVER_END) {
  5308. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  5309. ssl->options.haveDH, ssl->options.haveECDSAsig,
  5310. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  5311. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  5312. ssl->options.haveAnon, TRUE, ssl->options.side);
  5313. }
  5314. else {
  5315. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, TRUE,
  5316. ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE,
  5317. ssl->options.haveStaticECC, ssl->options.haveFalconSig,
  5318. ssl->options.haveDilithiumSig, ssl->options.haveAnon, TRUE,
  5319. ssl->options.side);
  5320. }
  5321. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5322. /* make sure server has cert and key unless using PSK, Anon, or
  5323. * Multicast. This should be true even if just switching ssl ctx */
  5324. if (ssl->options.side == WOLFSSL_SERVER_END &&
  5325. !havePSK && !haveAnon && !haveMcast) {
  5326. /* server certificate must be loaded */
  5327. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  5328. WOLFSSL_MSG("Server missing certificate");
  5329. WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
  5330. return NO_PRIVATE_KEY;
  5331. }
  5332. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  5333. /* allow no private key if using existing key */
  5334. #ifdef WOLF_PRIVATE_KEY_ID
  5335. if (ssl->devId != INVALID_DEVID
  5336. #ifdef HAVE_PK_CALLBACKS
  5337. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  5338. #endif
  5339. ) {
  5340. WOLFSSL_MSG("Allowing no server private key (external)");
  5341. }
  5342. else
  5343. #endif
  5344. {
  5345. WOLFSSL_MSG("Server missing private key");
  5346. WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
  5347. return NO_PRIVATE_KEY;
  5348. }
  5349. }
  5350. }
  5351. #endif
  5352. return WOLFSSL_SUCCESS;
  5353. }
  5354. /* returns new reference count. Arg incr positive=up or negative=down */
  5355. int SSL_CTX_RefCount(WOLFSSL_CTX* ctx, int incr)
  5356. {
  5357. int refCount;
  5358. if (ctx == NULL) {
  5359. return BAD_FUNC_ARG;
  5360. }
  5361. if (wc_LockMutex(&ctx->countMutex) != 0) {
  5362. WOLFSSL_MSG("Couldn't lock CTX count mutex");
  5363. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  5364. return BAD_MUTEX_E;
  5365. }
  5366. ctx->refCount += incr;
  5367. /* make sure refCount is never negative */
  5368. if (ctx->refCount < 0) {
  5369. ctx->refCount = 0;
  5370. }
  5371. refCount = ctx->refCount;
  5372. wc_UnLockMutex(&ctx->countMutex);
  5373. return refCount;
  5374. }
  5375. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  5376. It is used during initialization and to switch an ssl's CTX with
  5377. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  5378. unless writeDup is on.
  5379. ssl object to initialize
  5380. ctx parent factory
  5381. writeDup flag indicating this is a write dup only
  5382. WOLFSSL_SUCCESS return value on success */
  5383. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5384. {
  5385. int ret;
  5386. byte newSSL;
  5387. if (!ssl || !ctx)
  5388. return BAD_FUNC_ARG;
  5389. #ifndef SINGLE_THREADED
  5390. if (ssl->suites == NULL && !writeDup)
  5391. return BAD_FUNC_ARG;
  5392. #endif
  5393. newSSL = ssl->ctx == NULL; /* Assign after null check */
  5394. #ifndef NO_PSK
  5395. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  5396. return BAD_FUNC_ARG; /* needed for copy below */
  5397. }
  5398. #endif
  5399. /* decrement previous CTX reference count if exists.
  5400. * This should only happen if switching ctxs!*/
  5401. if (!newSSL) {
  5402. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  5403. wolfSSL_CTX_free(ssl->ctx);
  5404. }
  5405. /* increment CTX reference count */
  5406. if ((ret = SSL_CTX_RefCount(ctx, 1)) < 0) {
  5407. return ret;
  5408. }
  5409. ret = WOLFSSL_SUCCESS; /* set default ret */
  5410. ssl->ctx = ctx; /* only for passing to calls, options could change */
  5411. /* Don't change version on a SSL object that has already started a
  5412. * handshake */
  5413. if (!ssl->msgsReceived.got_client_hello &&
  5414. !ssl->msgsReceived.got_server_hello)
  5415. ssl->version = ctx->method->version;
  5416. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  5417. ssl->options.mask = ctx->mask;
  5418. ssl->options.minProto = ctx->minProto;
  5419. ssl->options.maxProto = ctx->maxProto;
  5420. #endif
  5421. #ifdef OPENSSL_EXTRA
  5422. #ifdef WOLFSSL_TLS13
  5423. if (ssl->version.minor == TLSv1_3_MINOR &&
  5424. (ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  5425. if (!ctx->method->downgrade) {
  5426. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
  5427. "allowed and downgrading disabled.");
  5428. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5429. return VERSION_ERROR;
  5430. }
  5431. WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
  5432. ssl->version.minor = TLSv1_2_MINOR;
  5433. }
  5434. #endif
  5435. if (ssl->version.minor == TLSv1_2_MINOR &&
  5436. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  5437. if (!ctx->method->downgrade) {
  5438. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
  5439. "allowed and downgrading disabled.");
  5440. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5441. return VERSION_ERROR;
  5442. }
  5443. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  5444. ssl->version.minor = TLSv1_1_MINOR;
  5445. }
  5446. if (ssl->version.minor == TLSv1_1_MINOR &&
  5447. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  5448. if (!ctx->method->downgrade) {
  5449. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
  5450. "allowed and downgrading disabled.");
  5451. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5452. return VERSION_ERROR;
  5453. }
  5454. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  5455. ssl->options.tls1_1 = 0;
  5456. ssl->version.minor = TLSv1_MINOR;
  5457. }
  5458. if (ssl->version.minor == TLSv1_MINOR &&
  5459. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  5460. if (!ctx->method->downgrade) {
  5461. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
  5462. "allowed and downgrading disabled.");
  5463. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5464. return VERSION_ERROR;
  5465. }
  5466. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  5467. ssl->options.tls = 0;
  5468. ssl->options.tls1_1 = 0;
  5469. ssl->version.minor = SSLv3_MINOR;
  5470. }
  5471. if (ssl->version.minor == SSLv3_MINOR &&
  5472. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  5473. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  5474. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5475. return VERSION_ERROR;
  5476. }
  5477. if (ssl->version.minor < ssl->options.minDowngrade) {
  5478. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  5479. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5480. return VERSION_ERROR;
  5481. }
  5482. #endif
  5483. #ifdef HAVE_ECC
  5484. ssl->eccTempKeySz = ctx->eccTempKeySz;
  5485. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  5486. #endif
  5487. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  5488. ssl->pkCurveOID = ctx->pkCurveOID;
  5489. #endif
  5490. #ifdef OPENSSL_EXTRA
  5491. ssl->CBIS = ctx->CBIS;
  5492. #endif
  5493. ssl->timeout = ctx->timeout;
  5494. ssl->verifyCallback = ctx->verifyCallback;
  5495. /* If we are setting the ctx on an already initialized SSL object
  5496. * then we possibly already have a side defined. Don't overwrite unless
  5497. * the context has a well defined role. */
  5498. if (newSSL || ctx->method->side != WOLFSSL_NEITHER_END)
  5499. ssl->options.side = ctx->method->side;
  5500. ssl->options.downgrade = ctx->method->downgrade;
  5501. ssl->options.minDowngrade = ctx->minDowngrade;
  5502. ssl->options.haveRSA = ctx->haveRSA;
  5503. ssl->options.haveDH = ctx->haveDH;
  5504. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  5505. ssl->options.haveECC = ctx->haveECC;
  5506. ssl->options.haveStaticECC = ctx->haveStaticECC;
  5507. ssl->options.haveFalconSig = ctx->haveFalconSig;
  5508. ssl->options.haveDilithiumSig = ctx->haveDilithiumSig;
  5509. #ifndef NO_PSK
  5510. ssl->options.havePSK = ctx->havePSK;
  5511. ssl->options.client_psk_cb = ctx->client_psk_cb;
  5512. ssl->options.server_psk_cb = ctx->server_psk_cb;
  5513. ssl->options.psk_ctx = ctx->psk_ctx;
  5514. #ifdef WOLFSSL_TLS13
  5515. ssl->options.client_psk_cs_cb = ctx->client_psk_cs_cb;
  5516. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  5517. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  5518. #endif
  5519. #endif /* NO_PSK */
  5520. #ifdef WOLFSSL_EARLY_DATA
  5521. if (ssl->options.side == WOLFSSL_SERVER_END)
  5522. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  5523. #endif
  5524. #ifdef HAVE_ANON
  5525. ssl->options.haveAnon = ctx->haveAnon;
  5526. #endif
  5527. #ifndef NO_DH
  5528. ssl->options.minDhKeySz = ctx->minDhKeySz;
  5529. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  5530. #endif
  5531. #ifndef NO_RSA
  5532. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  5533. #endif
  5534. #ifdef HAVE_ECC
  5535. ssl->options.minEccKeySz = ctx->minEccKeySz;
  5536. #endif
  5537. #ifdef HAVE_PQC
  5538. #ifdef HAVE_FALCON
  5539. ssl->options.minFalconKeySz = ctx->minFalconKeySz;
  5540. #endif /* HAVE_FALCON */
  5541. #ifdef HAVE_DILITHIUM
  5542. ssl->options.minDilithiumKeySz = ctx->minDilithiumKeySz;
  5543. #endif /* HAVE_DILITHIUM */
  5544. #endif /* HAVE_PQC */
  5545. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  5546. ssl->options.verifyDepth = ctx->verifyDepth;
  5547. #endif
  5548. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  5549. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  5550. #ifdef HAVE_EXT_CACHE
  5551. ssl->options.internalCacheOff = ctx->internalCacheOff;
  5552. ssl->options.internalCacheLookupOff = ctx->internalCacheLookupOff;
  5553. #endif
  5554. ssl->options.verifyPeer = ctx->verifyPeer;
  5555. ssl->options.verifyNone = ctx->verifyNone;
  5556. ssl->options.failNoCert = ctx->failNoCert;
  5557. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  5558. ssl->options.sendVerify = ctx->sendVerify;
  5559. ssl->options.partialWrite = ctx->partialWrite;
  5560. ssl->options.quietShutdown = ctx->quietShutdown;
  5561. ssl->options.groupMessages = ctx->groupMessages;
  5562. #ifndef NO_DH
  5563. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5564. !defined(HAVE_SELFTEST)
  5565. ssl->options.dhKeyTested = ctx->dhKeyTested;
  5566. #endif
  5567. ssl->buffers.serverDH_P = ctx->serverDH_P;
  5568. ssl->buffers.serverDH_G = ctx->serverDH_G;
  5569. #endif
  5570. #ifndef NO_CERTS
  5571. /* ctx still owns certificate, certChain, key, dh, and cm */
  5572. ssl->buffers.certificate = ctx->certificate;
  5573. ssl->buffers.certChain = ctx->certChain;
  5574. #ifdef WOLFSSL_TLS13
  5575. ssl->buffers.certChainCnt = ctx->certChainCnt;
  5576. #endif
  5577. ssl->buffers.key = ctx->privateKey;
  5578. ssl->buffers.keyType = ctx->privateKeyType;
  5579. ssl->buffers.keyId = ctx->privateKeyId;
  5580. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  5581. ssl->buffers.keySz = ctx->privateKeySz;
  5582. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  5583. #endif
  5584. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5585. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5586. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5587. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5588. ssl->buffers.keyType == ed25519_sa_algo ||
  5589. ssl->buffers.keyType == ed448_sa_algo;
  5590. #endif
  5591. #ifdef WOLFSSL_ASYNC_CRYPT
  5592. ssl->devId = ctx->devId;
  5593. #endif
  5594. if (writeDup == 0) {
  5595. #ifndef NO_PSK
  5596. if (ctx->server_hint[0]) { /* set in CTX */
  5597. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  5598. sizeof(ssl->arrays->server_hint));
  5599. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  5600. }
  5601. #endif /* NO_PSK */
  5602. if (ctx->suites) {
  5603. #ifndef SINGLE_THREADED
  5604. *ssl->suites = *ctx->suites;
  5605. #else
  5606. ssl->suites = ctx->suites;
  5607. #endif
  5608. }
  5609. else {
  5610. XMEMSET(ssl->suites, 0, sizeof(Suites));
  5611. }
  5612. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  5613. /* Defer initializing suites until accept or connect */
  5614. ret = InitSSL_Suites(ssl);
  5615. }
  5616. } /* writeDup check */
  5617. if (ctx->mask != 0 && wolfSSL_set_options(ssl, ctx->mask) == 0) {
  5618. WOLFSSL_MSG("wolfSSL_set_options error");
  5619. return BAD_FUNC_ARG;
  5620. }
  5621. #ifdef WOLFSSL_SESSION_EXPORT
  5622. #ifdef WOLFSSL_DTLS
  5623. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  5624. #endif
  5625. #endif
  5626. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  5627. ssl->AcceptFilter = ctx->AcceptFilter;
  5628. ssl->AcceptFilter_arg = ctx->AcceptFilter_arg;
  5629. ssl->ConnectFilter = ctx->ConnectFilter;
  5630. ssl->ConnectFilter_arg = ctx->ConnectFilter_arg;
  5631. #endif
  5632. #ifdef OPENSSL_EXTRA
  5633. ssl->readAhead = ctx->readAhead;
  5634. #endif
  5635. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5636. /* Don't change recv callback if currently using BIO's */
  5637. if (ssl->CBIORecv != BioReceive)
  5638. #endif
  5639. ssl->CBIORecv = ctx->CBIORecv;
  5640. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5641. /* Don't change send callback if currently using BIO's */
  5642. if (ssl->CBIOSend != BioSend)
  5643. #endif
  5644. ssl->CBIOSend = ctx->CBIOSend;
  5645. ssl->verifyDepth = ctx->verifyDepth;
  5646. return ret;
  5647. }
  5648. int InitHandshakeHashes(WOLFSSL* ssl)
  5649. {
  5650. int ret;
  5651. /* make sure existing handshake hashes are free'd */
  5652. if (ssl->hsHashes != NULL) {
  5653. FreeHandshakeHashes(ssl);
  5654. }
  5655. /* allocate handshake hashes */
  5656. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  5657. DYNAMIC_TYPE_HASHES);
  5658. if (ssl->hsHashes == NULL) {
  5659. WOLFSSL_MSG("HS_Hashes Memory error");
  5660. return MEMORY_E;
  5661. }
  5662. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  5663. #ifndef NO_OLD_TLS
  5664. #ifndef NO_MD5
  5665. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  5666. if (ret != 0)
  5667. return ret;
  5668. #ifdef WOLFSSL_HASH_FLAGS
  5669. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  5670. #endif
  5671. #endif
  5672. #ifndef NO_SHA
  5673. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  5674. if (ret != 0)
  5675. return ret;
  5676. #ifdef WOLFSSL_HASH_FLAGS
  5677. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  5678. #endif
  5679. #endif
  5680. #endif /* !NO_OLD_TLS */
  5681. #ifndef NO_SHA256
  5682. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  5683. if (ret != 0)
  5684. return ret;
  5685. #ifdef WOLFSSL_HASH_FLAGS
  5686. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  5687. #endif
  5688. #endif
  5689. #ifdef WOLFSSL_SHA384
  5690. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  5691. if (ret != 0)
  5692. return ret;
  5693. #ifdef WOLFSSL_HASH_FLAGS
  5694. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  5695. #endif
  5696. #endif
  5697. #ifdef WOLFSSL_SHA512
  5698. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  5699. if (ret != 0)
  5700. return ret;
  5701. #ifdef WOLFSSL_HASH_FLAGS
  5702. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  5703. #endif
  5704. #endif
  5705. return ret;
  5706. }
  5707. void FreeHandshakeHashes(WOLFSSL* ssl)
  5708. {
  5709. if (ssl->hsHashes) {
  5710. #ifndef NO_OLD_TLS
  5711. #ifndef NO_MD5
  5712. wc_Md5Free(&ssl->hsHashes->hashMd5);
  5713. #endif
  5714. #ifndef NO_SHA
  5715. wc_ShaFree(&ssl->hsHashes->hashSha);
  5716. #endif
  5717. #endif /* !NO_OLD_TLS */
  5718. #ifndef NO_SHA256
  5719. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  5720. #endif
  5721. #ifdef WOLFSSL_SHA384
  5722. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  5723. #endif
  5724. #ifdef WOLFSSL_SHA512
  5725. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  5726. #endif
  5727. #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \
  5728. !defined(WOLFSSL_NO_CLIENT_AUTH)
  5729. if (ssl->hsHashes->messages != NULL) {
  5730. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  5731. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  5732. ssl->hsHashes->messages = NULL;
  5733. }
  5734. #endif
  5735. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  5736. ssl->hsHashes = NULL;
  5737. }
  5738. }
  5739. /* called if user attempts to re-use WOLFSSL object for a new session.
  5740. * For example wolfSSL_clear() is called then wolfSSL_connect or accept */
  5741. int ReinitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5742. {
  5743. int ret = 0;
  5744. /* arrays */
  5745. if (!writeDup && ssl->arrays == NULL) {
  5746. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  5747. DYNAMIC_TYPE_ARRAYS);
  5748. if (ssl->arrays == NULL) {
  5749. WOLFSSL_MSG("Arrays Memory error");
  5750. return MEMORY_E;
  5751. }
  5752. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5753. wc_MemZero_Add("SSL Arrays", ssl->arrays, sizeof(*ssl->arrays));
  5754. #endif
  5755. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  5756. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  5757. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  5758. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  5759. DYNAMIC_TYPE_SECRET);
  5760. if (ssl->arrays->preMasterSecret == NULL) {
  5761. return MEMORY_E;
  5762. }
  5763. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5764. wc_MemZero_Add("SSL Arrays", ssl->arrays->preMasterSecret, ENCRYPT_LEN);
  5765. #endif
  5766. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  5767. #endif
  5768. }
  5769. /* RNG */
  5770. #ifdef SINGLE_THREADED
  5771. if (ssl->rng == NULL) {
  5772. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  5773. }
  5774. #endif
  5775. if (ssl->rng == NULL) {
  5776. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  5777. if (ssl->rng == NULL) {
  5778. WOLFSSL_MSG("RNG Memory error");
  5779. return MEMORY_E;
  5780. }
  5781. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  5782. ssl->options.weOwnRng = 1;
  5783. /* FIPS RNG API does not accept a heap hint */
  5784. #ifndef HAVE_FIPS
  5785. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  5786. WOLFSSL_MSG("RNG Init error");
  5787. return ret;
  5788. }
  5789. #else
  5790. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  5791. WOLFSSL_MSG("RNG Init error");
  5792. return ret;
  5793. }
  5794. #endif
  5795. }
  5796. (void)ctx;
  5797. return ret;
  5798. }
  5799. /* init everything to 0, NULL, default values before calling anything that may
  5800. fail so that destructor has a "good" state to cleanup
  5801. ssl object to initialize
  5802. ctx parent factory
  5803. writeDup flag indicating this is a write dup only
  5804. 0 on success */
  5805. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5806. {
  5807. int ret;
  5808. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  5809. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5810. wc_MemZero_Add("SSL Keys", &ssl->keys, sizeof(ssl->keys));
  5811. #ifdef WOLFSSL_TLS13
  5812. wc_MemZero_Add("SSL client secret", &ssl->clientSecret,
  5813. sizeof(ssl->clientSecret));
  5814. wc_MemZero_Add("SSL client secret", &ssl->serverSecret,
  5815. sizeof(ssl->serverSecret));
  5816. #endif
  5817. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  5818. wc_MemZero_Add("ClientFinished hash", &ssl->clientFinished,
  5819. TLS_FINISHED_SZ_MAX);
  5820. wc_MemZero_Add("ServerFinished hash", &ssl->serverFinished,
  5821. TLS_FINISHED_SZ_MAX);
  5822. #endif
  5823. #endif
  5824. #if defined(WOLFSSL_STATIC_MEMORY)
  5825. if (ctx->heap != NULL) {
  5826. WOLFSSL_HEAP_HINT* ssl_hint;
  5827. WOLFSSL_HEAP_HINT* ctx_hint;
  5828. /* avoid dereferencing a test value */
  5829. #ifdef WOLFSSL_HEAP_TEST
  5830. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  5831. ssl->heap = ctx->heap;
  5832. }
  5833. else {
  5834. #endif
  5835. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  5836. ctx->heap, DYNAMIC_TYPE_SSL);
  5837. if (ssl->heap == NULL) {
  5838. return MEMORY_E;
  5839. }
  5840. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  5841. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  5842. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  5843. /* lock and check IO count / handshake count */
  5844. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5845. WOLFSSL_MSG("Bad memory_mutex lock");
  5846. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5847. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5848. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  5849. return BAD_MUTEX_E;
  5850. }
  5851. if (ctx_hint->memory->maxHa > 0 &&
  5852. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  5853. WOLFSSL_MSG("At max number of handshakes for static memory");
  5854. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5855. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5856. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5857. return MEMORY_E;
  5858. }
  5859. if (ctx_hint->memory->maxIO > 0 &&
  5860. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  5861. WOLFSSL_MSG("At max number of IO allowed for static memory");
  5862. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5863. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5864. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5865. return MEMORY_E;
  5866. }
  5867. ctx_hint->memory->curIO++;
  5868. ctx_hint->memory->curHa++;
  5869. ssl_hint->memory = ctx_hint->memory;
  5870. ssl_hint->haFlag = 1;
  5871. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5872. /* check if tracking stats */
  5873. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  5874. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  5875. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  5876. if (ssl_hint->stats == NULL) {
  5877. return MEMORY_E;
  5878. }
  5879. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  5880. }
  5881. /* check if using fixed IO buffers */
  5882. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  5883. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5884. WOLFSSL_MSG("Bad memory_mutex lock");
  5885. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  5886. return BAD_MUTEX_E;
  5887. }
  5888. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  5889. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5890. return MEMORY_E;
  5891. }
  5892. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  5893. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5894. return MEMORY_E;
  5895. }
  5896. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  5897. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  5898. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5899. return MEMORY_E;
  5900. }
  5901. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5902. }
  5903. #ifdef WOLFSSL_HEAP_TEST
  5904. }
  5905. #endif
  5906. }
  5907. else {
  5908. ssl->heap = ctx->heap;
  5909. }
  5910. #else
  5911. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  5912. #endif /* WOLFSSL_STATIC_MEMORY */
  5913. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  5914. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5915. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  5916. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5917. #ifdef KEEP_PEER_CERT
  5918. InitX509(&ssl->peerCert, 0, ssl->heap);
  5919. #endif
  5920. ssl->rfd = -1; /* set to invalid descriptor */
  5921. ssl->wfd = -1;
  5922. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  5923. /* initialize states */
  5924. ssl->options.serverState = NULL_STATE;
  5925. ssl->options.clientState = NULL_STATE;
  5926. ssl->options.connectState = CONNECT_BEGIN;
  5927. ssl->options.acceptState = ACCEPT_BEGIN;
  5928. ssl->options.handShakeState = NULL_STATE;
  5929. ssl->options.processReply = doProcessInit;
  5930. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  5931. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  5932. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  5933. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  5934. #ifndef NO_DH
  5935. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5936. !defined(HAVE_SELFTEST)
  5937. ssl->options.dhDoKeyTest = 1;
  5938. #endif
  5939. #endif
  5940. #ifdef WOLFSSL_DTLS
  5941. #ifdef WOLFSSL_SCTP
  5942. ssl->options.dtlsSctp = ctx->dtlsSctp;
  5943. #endif
  5944. #ifdef WOLFSSL_SRTP
  5945. ssl->dtlsSrtpProfiles = ctx->dtlsSrtpProfiles;
  5946. #endif
  5947. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  5948. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  5949. /* Add some bytes so that we can operate with slight difference
  5950. * in set MTU size on each peer */
  5951. ssl->dtls_expected_rx = ssl->dtlsMtuSz +
  5952. DTLS_MTU_ADDITIONAL_READ_BUFFER;
  5953. #else
  5954. ssl->dtls_expected_rx = MAX_MTU;
  5955. #endif
  5956. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  5957. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  5958. ssl->dtls_timeout = ssl->dtls_timeout_init;
  5959. ssl->buffers.dtlsCtx.rfd = -1;
  5960. ssl->buffers.dtlsCtx.wfd = -1;
  5961. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx; /* prevent invalid pointer access if not */
  5962. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx; /* correctly set */
  5963. #else
  5964. #ifdef HAVE_NETX
  5965. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  5966. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  5967. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  5968. ssl->mnCtx = mynewt_ctx_new();
  5969. if(!ssl->mnCtx) {
  5970. return MEMORY_E;
  5971. }
  5972. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  5973. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  5974. #elif defined (WOLFSSL_GNRC)
  5975. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  5976. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  5977. #else
  5978. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  5979. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  5980. #endif
  5981. #endif
  5982. #ifndef WOLFSSL_AEAD_ONLY
  5983. #ifndef NO_OLD_TLS
  5984. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  5985. #elif !defined(WOLFSSL_NO_TLS12) && !defined(NO_TLS)
  5986. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  5987. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  5988. ssl->hmac = TLS_hmac;
  5989. #else
  5990. ssl->hmac = Renesas_cmn_TLS_hmac;
  5991. #endif
  5992. #endif
  5993. #endif
  5994. #if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
  5995. /* Save arrays by default for OpenVPN */
  5996. ssl->options.saveArrays = 1;
  5997. #endif
  5998. ssl->cipher.ssl = ssl;
  5999. #ifdef HAVE_EXTENDED_MASTER
  6000. ssl->options.haveEMS = ctx->haveEMS;
  6001. #endif
  6002. ssl->options.useClientOrder = ctx->useClientOrder;
  6003. ssl->options.mutualAuth = ctx->mutualAuth;
  6004. #ifdef WOLFSSL_TLS13
  6005. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  6006. ssl->options.maxTicketTls13 = ctx->maxTicketTls13;
  6007. #endif
  6008. #ifdef HAVE_SESSION_TICKET
  6009. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  6010. #endif
  6011. ssl->options.noPskDheKe = ctx->noPskDheKe;
  6012. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6013. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  6014. ssl->options.verifyPostHandshake = ctx->verifyPostHandshake;
  6015. #endif
  6016. if (ctx->numGroups > 0) {
  6017. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  6018. ssl->numGroups = ctx->numGroups;
  6019. }
  6020. #endif
  6021. #ifdef HAVE_TLS_EXTENSIONS
  6022. #ifdef HAVE_MAX_FRAGMENT
  6023. ssl->max_fragment = MAX_RECORD_SIZE;
  6024. #endif
  6025. #ifdef HAVE_ALPN
  6026. ssl->alpn_peer_requested = NULL;
  6027. ssl->alpn_peer_requested_length = 0;
  6028. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  6029. ssl->alpnSelect = ctx->alpnSelect;
  6030. ssl->alpnSelectArg = ctx->alpnSelectArg;
  6031. #endif
  6032. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  6033. if (ctx->alpn_cli_protos != NULL && ctx->alpn_cli_protos_len > 0) {
  6034. ret = wolfSSL_set_alpn_protos(ssl, ctx->alpn_cli_protos,
  6035. ctx->alpn_cli_protos_len);
  6036. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  6037. if (ret) {
  6038. #else
  6039. if (!ret) {
  6040. #endif
  6041. WOLFSSL_MSG("failed to set alpn protos to ssl object");
  6042. return ret;
  6043. }
  6044. }
  6045. #endif
  6046. #endif
  6047. #ifdef HAVE_SUPPORTED_CURVES
  6048. ssl->options.userCurves = ctx->userCurves;
  6049. #endif
  6050. #endif /* HAVE_TLS_EXTENSIONS */
  6051. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  6052. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  6053. #endif
  6054. /* default alert state (none) */
  6055. ssl->alert_history.last_rx.code = -1;
  6056. ssl->alert_history.last_rx.level = -1;
  6057. ssl->alert_history.last_tx.code = -1;
  6058. ssl->alert_history.last_tx.level = -1;
  6059. #ifdef OPENSSL_EXTRA
  6060. /* copy over application session context ID */
  6061. ssl->sessionCtxSz = ctx->sessionCtxSz;
  6062. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  6063. ssl->cbioFlag = ctx->cbioFlag;
  6064. ssl->protoMsgCb = ctx->protoMsgCb;
  6065. ssl->protoMsgCtx = ctx->protoMsgCtx;
  6066. /* follow default behavior of setting toInfoOn similar to
  6067. * wolfSSL_set_msg_callback when the callback is set */
  6068. if (ctx->protoMsgCb != NULL) {
  6069. ssl->toInfoOn = 1;
  6070. }
  6071. ssl->disabledCurves = ctx->disabledCurves;
  6072. #endif
  6073. InitCiphers(ssl);
  6074. InitCipherSpecs(&ssl->specs);
  6075. /* all done with init, now can return errors, call other stuff */
  6076. if ((ret = ReinitSSL(ssl, ctx, writeDup)) != 0) {
  6077. return ret;
  6078. }
  6079. if (!writeDup) {
  6080. #ifdef OPENSSL_EXTRA
  6081. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  6082. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  6083. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  6084. WOLFSSL_MSG("ssl->param memory error");
  6085. return MEMORY_E;
  6086. }
  6087. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  6088. #endif
  6089. #ifdef SINGLE_THREADED
  6090. if (ctx->suites == NULL)
  6091. #endif
  6092. {
  6093. /* suites */
  6094. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  6095. DYNAMIC_TYPE_SUITES);
  6096. if (ssl->suites == NULL) {
  6097. WOLFSSL_MSG("Suites Memory error");
  6098. return MEMORY_E;
  6099. }
  6100. #ifdef OPENSSL_ALL
  6101. ssl->suites->stack = NULL;
  6102. #endif
  6103. #ifdef SINGLE_THREADED
  6104. ssl->options.ownSuites = 1;
  6105. #endif
  6106. }
  6107. #ifdef SINGLE_THREADED
  6108. else {
  6109. ssl->options.ownSuites = 0;
  6110. }
  6111. #endif
  6112. } /* !writeDup */
  6113. /* Initialize SSL with the appropriate fields from it's ctx */
  6114. /* requires valid arrays and suites unless writeDup ing */
  6115. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS)
  6116. return ret;
  6117. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  6118. #ifdef HAVE_WRITE_DUP
  6119. if (writeDup) {
  6120. /* all done */
  6121. return 0;
  6122. }
  6123. #endif
  6124. /* hsHashes */
  6125. ret = InitHandshakeHashes(ssl);
  6126. if (ret != 0)
  6127. return ret;
  6128. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  6129. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  6130. if (!IsAtLeastTLSv1_3(ssl->version)) {
  6131. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  6132. if (ret != 0) {
  6133. WOLFSSL_MSG("DTLS Cookie Secret error");
  6134. return ret;
  6135. }
  6136. }
  6137. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
  6138. else {
  6139. ret = wolfSSL_send_hrr_cookie(ssl, NULL, 0);
  6140. if (ret != WOLFSSL_SUCCESS) {
  6141. WOLFSSL_MSG("DTLS1.3 Cookie secret error");
  6142. return ret;
  6143. }
  6144. }
  6145. #endif /* WOLFSSL_DTLS13 && WOLFSSL_SEND_HRR_COOKIE */
  6146. }
  6147. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  6148. #ifdef HAVE_SECRET_CALLBACK
  6149. ssl->sessionSecretCb = NULL;
  6150. ssl->sessionSecretCtx = NULL;
  6151. #ifdef WOLFSSL_TLS13
  6152. ssl->tls13SecretCb = NULL;
  6153. ssl->tls13SecretCtx = NULL;
  6154. #endif
  6155. #endif
  6156. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  6157. if (ctx->keyLogCb != NULL) {
  6158. ssl->keyLogCb = SessionSecret_callback;
  6159. #if defined(WOLFSSL_TLS13)
  6160. ssl->tls13KeyLogCb = SessionSecret_callback_Tls13;
  6161. #endif /*WOLFSSL_TLS13*/
  6162. }
  6163. #endif /*OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  6164. ssl->session = wolfSSL_NewSession(ssl->heap);
  6165. if (ssl->session == NULL) {
  6166. WOLFSSL_MSG("SSL Session Memory error");
  6167. return MEMORY_E;
  6168. }
  6169. #ifdef HAVE_SESSION_TICKET
  6170. ssl->options.noTicketTls12 = ctx->noTicketTls12;
  6171. #endif
  6172. #ifdef WOLFSSL_MULTICAST
  6173. if (ctx->haveMcast) {
  6174. int i;
  6175. ssl->options.haveMcast = 1;
  6176. ssl->options.mcastID = ctx->mcastID;
  6177. /* Force the state to look like handshake has completed. */
  6178. /* Keying material is supplied externally. */
  6179. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  6180. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  6181. ssl->options.connectState = SECOND_REPLY_DONE;
  6182. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  6183. ssl->options.handShakeState = HANDSHAKE_DONE;
  6184. ssl->options.handShakeDone = 1;
  6185. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  6186. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  6187. }
  6188. #endif
  6189. #ifdef HAVE_SECURE_RENEGOTIATION
  6190. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  6191. int useSecureReneg = ssl->ctx->useSecureReneg;
  6192. /* use secure renegotiation by default (not recommend) */
  6193. #ifdef WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT
  6194. useSecureReneg = 1;
  6195. #endif
  6196. if (useSecureReneg) {
  6197. ret = wolfSSL_UseSecureRenegotiation(ssl);
  6198. if (ret != WOLFSSL_SUCCESS)
  6199. return ret;
  6200. }
  6201. }
  6202. #endif /* HAVE_SECURE_RENEGOTIATION */
  6203. #ifdef WOLFSSL_DTLS13
  6204. /* setup 0 (un-protected) epoch */
  6205. ssl->dtls13Epochs[0].isValid = 1;
  6206. ssl->dtls13Epochs[0].side = ENCRYPT_AND_DECRYPT_SIDE;
  6207. ssl->dtls13EncryptEpoch = &ssl->dtls13Epochs[0];
  6208. ssl->dtls13DecryptEpoch = &ssl->dtls13Epochs[0];
  6209. ssl->options.dtls13SendMoreAcks = WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT;
  6210. ssl->dtls13Rtx.rtxRecordTailPtr = &ssl->dtls13Rtx.rtxRecords;
  6211. #endif /* WOLFSSL_DTLS13 */
  6212. #ifdef WOLFSSL_QUIC
  6213. if (ctx->quic.method) {
  6214. ret = wolfSSL_set_quic_method(ssl, ctx->quic.method);
  6215. if (ret != WOLFSSL_SUCCESS)
  6216. return ret;
  6217. }
  6218. #endif
  6219. return 0;
  6220. }
  6221. /* free use of temporary arrays */
  6222. void FreeArrays(WOLFSSL* ssl, int keep)
  6223. {
  6224. if (ssl->arrays) {
  6225. if (keep && !IsAtLeastTLSv1_3(ssl->version)) {
  6226. /* keeps session id for user retrieval */
  6227. XMEMCPY(ssl->session->sessionID, ssl->arrays->sessionID, ID_LEN);
  6228. ssl->session->sessionIDSz = ssl->arrays->sessionIDSz;
  6229. }
  6230. if (ssl->arrays->preMasterSecret) {
  6231. ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
  6232. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  6233. ssl->arrays->preMasterSecret = NULL;
  6234. }
  6235. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  6236. ssl->arrays->pendingMsg = NULL;
  6237. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  6238. }
  6239. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  6240. ssl->arrays = NULL;
  6241. }
  6242. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  6243. {
  6244. if (ssl && pKey && *pKey) {
  6245. switch (type) {
  6246. #ifndef NO_RSA
  6247. case DYNAMIC_TYPE_RSA:
  6248. wc_FreeRsaKey((RsaKey*)*pKey);
  6249. break;
  6250. #endif /* ! NO_RSA */
  6251. #ifdef HAVE_ECC
  6252. case DYNAMIC_TYPE_ECC:
  6253. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6254. defined(WC_ASYNC_ENABLE_ECC)
  6255. if (((ecc_key*)*pKey)->nb_ctx != NULL) {
  6256. XFREE(((ecc_key*)*pKey)->nb_ctx, ((ecc_key*)*pKey)->heap,
  6257. DYNAMIC_TYPE_TMP_BUFFER);
  6258. }
  6259. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
  6260. WC_ASYNC_ENABLE_ECC */
  6261. wc_ecc_free((ecc_key*)*pKey);
  6262. break;
  6263. #endif /* HAVE_ECC */
  6264. #ifdef HAVE_ED25519
  6265. case DYNAMIC_TYPE_ED25519:
  6266. wc_ed25519_free((ed25519_key*)*pKey);
  6267. break;
  6268. #endif /* HAVE_ED25519 */
  6269. #ifdef HAVE_CURVE25519
  6270. case DYNAMIC_TYPE_CURVE25519:
  6271. wc_curve25519_free((curve25519_key*)*pKey);
  6272. break;
  6273. #endif /* HAVE_CURVE25519 */
  6274. #ifdef HAVE_ED448
  6275. case DYNAMIC_TYPE_ED448:
  6276. wc_ed448_free((ed448_key*)*pKey);
  6277. break;
  6278. #endif /* HAVE_ED448 */
  6279. #ifdef HAVE_CURVE448
  6280. case DYNAMIC_TYPE_CURVE448:
  6281. wc_curve448_free((curve448_key*)*pKey);
  6282. break;
  6283. #endif /* HAVE_CURVE448 */
  6284. #if defined(HAVE_PQC)
  6285. #if defined(HAVE_FALCON)
  6286. case DYNAMIC_TYPE_FALCON:
  6287. wc_falcon_free((falcon_key*)*pKey);
  6288. break;
  6289. #endif /* HAVE_FALCON */
  6290. #if defined(HAVE_DILITHIUM)
  6291. case DYNAMIC_TYPE_DILITHIUM:
  6292. wc_dilithium_free((dilithium_key*)*pKey);
  6293. break;
  6294. #endif /* HAVE_DILITHIUM */
  6295. #endif /* HAVE_PQC */
  6296. #ifndef NO_DH
  6297. case DYNAMIC_TYPE_DH:
  6298. wc_FreeDhKey((DhKey*)*pKey);
  6299. break;
  6300. #endif /* !NO_DH */
  6301. default:
  6302. break;
  6303. }
  6304. XFREE(*pKey, ssl->heap, type);
  6305. /* Reset pointer */
  6306. *pKey = NULL;
  6307. }
  6308. }
  6309. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  6310. {
  6311. int ret = BAD_FUNC_ARG;
  6312. int sz = 0;
  6313. #ifdef HAVE_ECC
  6314. ecc_key* eccKey;
  6315. #endif /* HAVE_ECC */
  6316. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6317. defined(WC_ASYNC_ENABLE_ECC)
  6318. ecc_nb_ctx_t* nbCtx;
  6319. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW && WC_ASYNC_ENABLE_ECC*/
  6320. if (ssl == NULL || pKey == NULL) {
  6321. return BAD_FUNC_ARG;
  6322. }
  6323. /* Sanity check key destination */
  6324. if (*pKey != NULL) {
  6325. WOLFSSL_MSG("Key already present!");
  6326. return BAD_STATE_E;
  6327. }
  6328. /* Determine size */
  6329. switch (type) {
  6330. #ifndef NO_RSA
  6331. case DYNAMIC_TYPE_RSA:
  6332. sz = sizeof(RsaKey);
  6333. break;
  6334. #endif /* ! NO_RSA */
  6335. #ifdef HAVE_ECC
  6336. case DYNAMIC_TYPE_ECC:
  6337. sz = sizeof(ecc_key);
  6338. break;
  6339. #endif /* HAVE_ECC */
  6340. #ifdef HAVE_ED25519
  6341. case DYNAMIC_TYPE_ED25519:
  6342. sz = sizeof(ed25519_key);
  6343. break;
  6344. #endif /* HAVE_ED25519 */
  6345. #ifdef HAVE_CURVE25519
  6346. case DYNAMIC_TYPE_CURVE25519:
  6347. sz = sizeof(curve25519_key);
  6348. break;
  6349. #endif /* HAVE_CURVE25519 */
  6350. #ifdef HAVE_ED448
  6351. case DYNAMIC_TYPE_ED448:
  6352. sz = sizeof(ed448_key);
  6353. break;
  6354. #endif /* HAVE_ED448 */
  6355. #ifdef HAVE_CURVE448
  6356. case DYNAMIC_TYPE_CURVE448:
  6357. sz = sizeof(curve448_key);
  6358. break;
  6359. #endif /* HAVE_CURVE448 */
  6360. #if defined(HAVE_PQC)
  6361. #if defined(HAVE_FALCON)
  6362. case DYNAMIC_TYPE_FALCON:
  6363. sz = sizeof(falcon_key);
  6364. break;
  6365. #endif /* HAVE_FALCON */
  6366. #if defined(HAVE_DILITHIUM)
  6367. case DYNAMIC_TYPE_DILITHIUM:
  6368. sz = sizeof(dilithium_key);
  6369. break;
  6370. #endif /* HAVE_DILITHIUM */
  6371. #endif /* HAVE_PQC */
  6372. #ifndef NO_DH
  6373. case DYNAMIC_TYPE_DH:
  6374. sz = sizeof(DhKey);
  6375. break;
  6376. #endif /* !NO_DH */
  6377. default:
  6378. return BAD_FUNC_ARG;
  6379. }
  6380. /* Allocate memory for key */
  6381. *pKey = (void *)XMALLOC(sz, ssl->heap, type);
  6382. if (*pKey == NULL) {
  6383. return MEMORY_E;
  6384. }
  6385. /* Initialize key */
  6386. switch (type) {
  6387. #ifndef NO_RSA
  6388. case DYNAMIC_TYPE_RSA:
  6389. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  6390. break;
  6391. #endif /* ! NO_RSA */
  6392. #ifdef HAVE_ECC
  6393. case DYNAMIC_TYPE_ECC:
  6394. eccKey = (ecc_key*)*pKey;
  6395. ret = wc_ecc_init_ex(eccKey, ssl->heap, ssl->devId);
  6396. if (ret == 0) {
  6397. #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
  6398. defined(WC_ASYNC_ENABLE_ECC)
  6399. nbCtx = (ecc_nb_ctx_t*)XMALLOC(sizeof(ecc_nb_ctx_t),
  6400. eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6401. if (nbCtx == NULL) {
  6402. ret = MEMORY_E;
  6403. }
  6404. else {
  6405. ret = wc_ecc_set_nonblock(eccKey, nbCtx);
  6406. if (ret != 0) {
  6407. XFREE(nbCtx, eccKey->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6408. }
  6409. }
  6410. #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
  6411. WC_ASYNC_ENABLE_ECC */
  6412. }
  6413. break;
  6414. #endif /* HAVE_ECC */
  6415. #ifdef HAVE_ED25519
  6416. case DYNAMIC_TYPE_ED25519:
  6417. wc_ed25519_init_ex((ed25519_key*)*pKey, ssl->heap, ssl->devId);
  6418. ret = 0;
  6419. break;
  6420. #endif /* HAVE_CURVE25519 */
  6421. #ifdef HAVE_CURVE25519
  6422. case DYNAMIC_TYPE_CURVE25519:
  6423. wc_curve25519_init_ex((curve25519_key*)*pKey, ssl->heap, ssl->devId);
  6424. ret = 0;
  6425. break;
  6426. #endif /* HAVE_CURVE25519 */
  6427. #ifdef HAVE_ED448
  6428. case DYNAMIC_TYPE_ED448:
  6429. wc_ed448_init_ex((ed448_key*)*pKey, ssl->heap, ssl->devId);
  6430. ret = 0;
  6431. break;
  6432. #endif /* HAVE_CURVE448 */
  6433. #if defined(HAVE_PQC)
  6434. #if defined(HAVE_FALCON)
  6435. case DYNAMIC_TYPE_FALCON:
  6436. wc_falcon_init((falcon_key*)*pKey);
  6437. ret = 0;
  6438. break;
  6439. #endif /* HAVE_FALCON */
  6440. #if defined(HAVE_DILITHIUM)
  6441. case DYNAMIC_TYPE_DILITHIUM:
  6442. wc_dilithium_init((dilithium_key*)*pKey);
  6443. ret = 0;
  6444. break;
  6445. #endif /* HAVE_DILITHIUM */
  6446. #endif /* HAVE_PQC */
  6447. #ifdef HAVE_CURVE448
  6448. case DYNAMIC_TYPE_CURVE448:
  6449. wc_curve448_init((curve448_key*)*pKey);
  6450. ret = 0;
  6451. break;
  6452. #endif /* HAVE_CURVE448 */
  6453. #ifndef NO_DH
  6454. case DYNAMIC_TYPE_DH:
  6455. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  6456. break;
  6457. #endif /* !NO_DH */
  6458. default:
  6459. return BAD_FUNC_ARG;
  6460. }
  6461. /* On error free handshake key */
  6462. if (ret != 0) {
  6463. FreeKey(ssl, type, pKey);
  6464. }
  6465. return ret;
  6466. }
  6467. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  6468. defined(HAVE_CURVE25519) || defined(HAVE_ED448) || \
  6469. defined(HAVE_CURVE448) || (defined(HAVE_PQC) && defined(HAVE_FALCON)) || \
  6470. (defined(HAVE_PQC) && defined(HAVE_DILITHIUM))
  6471. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  6472. {
  6473. int ret = 0;
  6474. (void)ssl;
  6475. switch (type) {
  6476. #ifndef NO_RSA
  6477. case DYNAMIC_TYPE_RSA:
  6478. wc_FreeRsaKey((RsaKey*)pKey);
  6479. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  6480. break;
  6481. #endif /* ! NO_RSA */
  6482. #ifdef HAVE_ECC
  6483. case DYNAMIC_TYPE_ECC:
  6484. wc_ecc_free((ecc_key*)pKey);
  6485. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  6486. break;
  6487. #endif /* HAVE_ECC */
  6488. #ifdef HAVE_ED25519
  6489. case DYNAMIC_TYPE_ED25519:
  6490. wc_ed25519_free((ed25519_key*)pKey);
  6491. ret = wc_ed25519_init_ex((ed25519_key*)pKey, ssl->heap,
  6492. ssl->devId);
  6493. break;
  6494. #endif /* HAVE_CURVE25519 */
  6495. #ifdef HAVE_CURVE25519
  6496. case DYNAMIC_TYPE_CURVE25519:
  6497. wc_curve25519_free((curve25519_key*)pKey);
  6498. ret = wc_curve25519_init_ex((curve25519_key*)pKey, ssl->heap,
  6499. ssl->devId);
  6500. break;
  6501. #endif /* HAVE_CURVE25519 */
  6502. #ifdef HAVE_ED448
  6503. case DYNAMIC_TYPE_ED448:
  6504. wc_ed448_free((ed448_key*)pKey);
  6505. ret = wc_ed448_init_ex((ed448_key*)pKey, ssl->heap, ssl->devId);
  6506. break;
  6507. #endif /* HAVE_CURVE448 */
  6508. #ifdef HAVE_CURVE448
  6509. case DYNAMIC_TYPE_CURVE448:
  6510. wc_curve448_free((curve448_key*)pKey);
  6511. ret = wc_curve448_init((curve448_key*)pKey);
  6512. break;
  6513. #endif /* HAVE_CURVE448 */
  6514. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  6515. case DYNAMIC_TYPE_FALCON:
  6516. wc_falcon_free((falcon_key*)pKey);
  6517. ret = wc_falcon_init((falcon_key*)pKey);
  6518. break;
  6519. #endif /* HAVE_PQC && HAVE_FALCON */
  6520. #ifndef NO_DH
  6521. case DYNAMIC_TYPE_DH:
  6522. wc_FreeDhKey((DhKey*)pKey);
  6523. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  6524. break;
  6525. #endif /* !NO_DH */
  6526. default:
  6527. return BAD_FUNC_ARG;
  6528. }
  6529. return ret;
  6530. }
  6531. #endif
  6532. #ifdef WOLFSSL_ASYNC_IO
  6533. void FreeAsyncCtx(WOLFSSL* ssl, byte freeAsync)
  6534. {
  6535. if (ssl->async != NULL) {
  6536. if (ssl->async->freeArgs != NULL) {
  6537. ssl->async->freeArgs(ssl, ssl->async->args);
  6538. ssl->async->freeArgs = NULL;
  6539. }
  6540. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WOLFSSL_NO_TLS12)
  6541. if (ssl->options.buildArgsSet) {
  6542. FreeBuildMsgArgs(ssl, &ssl->async->buildArgs);
  6543. ssl->options.buildArgsSet = 0;
  6544. }
  6545. #endif
  6546. if (freeAsync) {
  6547. XFREE(ssl->async, ssl->heap, DYNAMIC_TYPE_ASYNC);
  6548. ssl->async = NULL;
  6549. }
  6550. }
  6551. }
  6552. #endif
  6553. void FreeKeyExchange(WOLFSSL* ssl)
  6554. {
  6555. /* Cleanup signature buffer */
  6556. if (ssl->buffers.sig.buffer) {
  6557. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  6558. ssl->buffers.sig.buffer = NULL;
  6559. ssl->buffers.sig.length = 0;
  6560. }
  6561. /* Cleanup digest buffer */
  6562. if (ssl->buffers.digest.buffer) {
  6563. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  6564. ssl->buffers.digest.buffer = NULL;
  6565. ssl->buffers.digest.length = 0;
  6566. }
  6567. /* Free handshake key */
  6568. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  6569. #ifndef NO_DH
  6570. /* Free temp DH key */
  6571. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  6572. #endif
  6573. }
  6574. /* Free up all memory used by Suites structure from WOLFSSL */
  6575. void FreeSuites(WOLFSSL* ssl)
  6576. {
  6577. #ifdef SINGLE_THREADED
  6578. if (ssl->options.ownSuites)
  6579. #endif
  6580. {
  6581. #ifdef OPENSSL_ALL
  6582. if (ssl->suites != NULL) {
  6583. /* Enough to free stack structure since WOLFSSL_CIPHER
  6584. * isn't allocated separately. */
  6585. wolfSSL_sk_SSL_CIPHER_free(ssl->suites->stack);
  6586. }
  6587. #endif
  6588. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  6589. }
  6590. ssl->suites = NULL;
  6591. }
  6592. /* In case holding SSL object in array and don't want to free actual ssl */
  6593. void SSL_ResourceFree(WOLFSSL* ssl)
  6594. {
  6595. /* Note: any resources used during the handshake should be released in the
  6596. * function FreeHandshakeResources(). Be careful with the special cases
  6597. * like the RNG which may optionally be kept for the whole session. (For
  6598. * example with the RNG, it isn't used beyond the handshake except when
  6599. * using stream ciphers where it is retained. */
  6600. if (ssl->options.side == WOLFSSL_SERVER_END) {
  6601. WOLFSSL_MSG("Free'ing server ssl");
  6602. }
  6603. else {
  6604. WOLFSSL_MSG("Free'ing client ssl");
  6605. }
  6606. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  6607. wolfSSL_CRYPTO_cleanup_ex_data(&ssl->ex_data);
  6608. #endif
  6609. FreeCiphers(ssl);
  6610. FreeArrays(ssl, 0);
  6611. FreeKeyExchange(ssl);
  6612. #ifdef WOLFSSL_ASYNC_IO
  6613. /* Cleanup async */
  6614. FreeAsyncCtx(ssl, 1);
  6615. #endif
  6616. if (ssl->options.weOwnRng) {
  6617. wc_FreeRng(ssl->rng);
  6618. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  6619. }
  6620. FreeSuites(ssl);
  6621. FreeHandshakeHashes(ssl);
  6622. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  6623. /* clear keys struct after session */
  6624. ForceZero(&ssl->keys, sizeof(Keys));
  6625. #ifdef WOLFSSL_TLS13
  6626. if (ssl->options.tls1_3) {
  6627. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  6628. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  6629. }
  6630. #endif
  6631. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  6632. ForceZero(&ssl->clientFinished, TLS_FINISHED_SZ_MAX);
  6633. ForceZero(&ssl->serverFinished, TLS_FINISHED_SZ_MAX);
  6634. ssl->serverFinished_len = 0;
  6635. ssl->clientFinished_len = 0;
  6636. #endif
  6637. #ifndef NO_DH
  6638. if (ssl->buffers.serverDH_Priv.buffer != NULL) {
  6639. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  6640. ssl->buffers.serverDH_Priv.length);
  6641. }
  6642. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6643. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6644. /* parameters (p,g) may be owned by ctx */
  6645. if (ssl->buffers.weOwnDH) {
  6646. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6647. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6648. }
  6649. #endif /* !NO_DH */
  6650. #ifndef NO_CERTS
  6651. ssl->keepCert = 0; /* make sure certificate is free'd */
  6652. wolfSSL_UnloadCertsKeys(ssl);
  6653. #endif
  6654. #ifndef NO_RSA
  6655. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  6656. ssl->peerRsaKeyPresent = 0;
  6657. #endif
  6658. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT)
  6659. XFREE(ssl->peerSceTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
  6660. Renesas_cmn_Cleanup(ssl);
  6661. #endif
  6662. if (ssl->buffers.inputBuffer.dynamicFlag)
  6663. ShrinkInputBuffer(ssl, FORCED_FREE);
  6664. if (ssl->buffers.outputBuffer.dynamicFlag)
  6665. ShrinkOutputBuffer(ssl);
  6666. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  6667. if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
  6668. ForceZero(ssl->buffers.tls13CookieSecret.buffer,
  6669. ssl->buffers.tls13CookieSecret.length);
  6670. }
  6671. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  6672. DYNAMIC_TYPE_COOKIE_PWD);
  6673. #endif
  6674. #ifdef WOLFSSL_DTLS
  6675. DtlsMsgPoolReset(ssl);
  6676. if (ssl->dtls_rx_msg_list != NULL) {
  6677. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  6678. ssl->dtls_rx_msg_list = NULL;
  6679. ssl->dtls_rx_msg_list_sz = 0;
  6680. }
  6681. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  6682. ssl->buffers.dtlsCtx.peer.sa = NULL;
  6683. #ifndef NO_WOLFSSL_SERVER
  6684. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  6685. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  6686. ssl->buffers.dtlsCookieSecret.length);
  6687. }
  6688. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  6689. DYNAMIC_TYPE_COOKIE_PWD);
  6690. #endif
  6691. #ifdef WOLFSSL_DTLS13
  6692. if (ssl->dtls13ClientHello != NULL) {
  6693. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  6694. ssl->dtls13ClientHello = NULL;
  6695. ssl->dtls13ClientHelloSz = 0;
  6696. }
  6697. #endif /* WOLFSSL_DTLS13 */
  6698. #endif /* WOLFSSL_DTLS */
  6699. #ifdef OPENSSL_EXTRA
  6700. #ifndef NO_BIO
  6701. /* Don't free if there was/is a previous element in the chain.
  6702. * This means that this BIO was part of a chain that will be
  6703. * free'd separately. */
  6704. if (ssl->biord != ssl->biowr) /* only free write if different */
  6705. if (ssl->biowr != NULL && ssl->biowr->prev == NULL)
  6706. wolfSSL_BIO_free(ssl->biowr);
  6707. if (ssl->biord != NULL && ssl->biord->prev == NULL)
  6708. wolfSSL_BIO_free(ssl->biord);
  6709. ssl->biowr = NULL;
  6710. ssl->biord = NULL;
  6711. #endif
  6712. #endif
  6713. #ifdef HAVE_LIBZ
  6714. FreeStreams(ssl);
  6715. #endif
  6716. #ifdef HAVE_ECC
  6717. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  6718. ssl->peerEccKeyPresent = 0;
  6719. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  6720. ssl->peerEccDsaKeyPresent = 0;
  6721. #endif
  6722. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
  6723. {
  6724. int dtype = 0;
  6725. #ifdef HAVE_ECC
  6726. dtype = DYNAMIC_TYPE_ECC;
  6727. #endif
  6728. #ifdef HAVE_CURVE25519
  6729. if (ssl->peerX25519KeyPresent
  6730. #ifdef HAVE_ECC
  6731. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
  6732. #endif /* HAVE_ECC */
  6733. )
  6734. {
  6735. dtype = DYNAMIC_TYPE_CURVE25519;
  6736. }
  6737. #endif /* HAVE_CURVE25519 */
  6738. #ifdef HAVE_CURVE448
  6739. if (ssl->peerX448KeyPresent
  6740. #ifdef HAVE_ECC
  6741. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
  6742. #endif /* HAVE_ECC */
  6743. )
  6744. {
  6745. dtype = DYNAMIC_TYPE_CURVE448;
  6746. }
  6747. #endif /* HAVE_CURVE448 */
  6748. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  6749. ssl->eccTempKeyPresent = 0;
  6750. }
  6751. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  6752. #ifdef HAVE_CURVE25519
  6753. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  6754. ssl->peerX25519KeyPresent = 0;
  6755. #endif
  6756. #ifdef HAVE_ED25519
  6757. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  6758. ssl->peerEd25519KeyPresent = 0;
  6759. #ifdef HAVE_PK_CALLBACKS
  6760. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  6761. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  6762. DYNAMIC_TYPE_ED25519);
  6763. ssl->buffers.peerEd25519Key.buffer = NULL;
  6764. }
  6765. #endif
  6766. #endif
  6767. #ifdef HAVE_CURVE448
  6768. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  6769. ssl->peerX448KeyPresent = 0;
  6770. #endif
  6771. #ifdef HAVE_ED448
  6772. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  6773. ssl->peerEd448KeyPresent = 0;
  6774. #ifdef HAVE_PK_CALLBACKS
  6775. if (ssl->buffers.peerEd448Key.buffer != NULL) {
  6776. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
  6777. DYNAMIC_TYPE_ED448);
  6778. ssl->buffers.peerEd448Key.buffer = NULL;
  6779. }
  6780. #endif
  6781. #endif
  6782. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  6783. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  6784. ssl->peerFalconKeyPresent = 0;
  6785. #endif
  6786. #ifdef HAVE_PK_CALLBACKS
  6787. #ifdef HAVE_ECC
  6788. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  6789. #endif /* HAVE_ECC */
  6790. #ifndef NO_RSA
  6791. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  6792. #endif /* NO_RSA */
  6793. #endif /* HAVE_PK_CALLBACKS */
  6794. #ifdef HAVE_TLS_EXTENSIONS
  6795. #if !defined(NO_TLS)
  6796. TLSX_FreeAll(ssl->extensions, ssl->heap);
  6797. #endif /* !NO_TLS */
  6798. #ifdef HAVE_ALPN
  6799. if (ssl->alpn_peer_requested != NULL) {
  6800. XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
  6801. ssl->alpn_peer_requested = NULL;
  6802. ssl->alpn_peer_requested_length = 0;
  6803. }
  6804. #endif
  6805. #endif /* HAVE_TLS_EXTENSIONS */
  6806. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  6807. if (ssl->mnCtx) {
  6808. mynewt_ctx_clear(ssl->mnCtx);
  6809. ssl->mnCtx = NULL;
  6810. }
  6811. #endif
  6812. #ifdef HAVE_NETX
  6813. if (ssl->nxCtx.nxPacket)
  6814. nx_packet_release(ssl->nxCtx.nxPacket);
  6815. #endif
  6816. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  6817. if (ssl->x509_store_pt)
  6818. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  6819. #endif
  6820. #ifdef KEEP_PEER_CERT
  6821. FreeX509(&ssl->peerCert);
  6822. #endif
  6823. if (ssl->session != NULL)
  6824. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  6825. #ifdef HAVE_WRITE_DUP
  6826. if (ssl->dupWrite) {
  6827. FreeWriteDup(ssl);
  6828. }
  6829. #endif
  6830. #ifdef OPENSSL_EXTRA
  6831. if (ssl->param) {
  6832. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  6833. }
  6834. #endif
  6835. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6836. while (ssl->certReqCtx != NULL) {
  6837. CertReqCtx* curr = ssl->certReqCtx;
  6838. ssl->certReqCtx = curr->next;
  6839. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6840. }
  6841. #endif
  6842. #ifdef WOLFSSL_STATIC_EPHEMERAL
  6843. #ifndef NO_DH
  6844. FreeDer(&ssl->staticKE.dhKey);
  6845. #endif
  6846. #ifdef HAVE_ECC
  6847. FreeDer(&ssl->staticKE.ecKey);
  6848. #endif
  6849. #ifdef HAVE_CURVE25519
  6850. FreeDer(&ssl->staticKE.x25519Key);
  6851. #endif
  6852. #ifdef HAVE_CURVE448
  6853. FreeDer(&ssl->staticKE.x448Key);
  6854. #endif
  6855. #endif
  6856. #ifdef WOLFSSL_STATIC_MEMORY
  6857. /* check if using fixed io buffers and free them */
  6858. if (ssl->heap != NULL) {
  6859. #ifdef WOLFSSL_HEAP_TEST
  6860. /* avoid dereferencing a test value */
  6861. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  6862. #endif
  6863. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  6864. WOLFSSL_HEAP* ctx_heap;
  6865. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  6866. ctx_heap = ssl_hint->memory;
  6867. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  6868. WOLFSSL_MSG("Bad memory_mutex lock");
  6869. }
  6870. ctx_heap->curIO--;
  6871. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  6872. WOLFSSL_MSG("Error freeing fixed output buffer");
  6873. }
  6874. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  6875. WOLFSSL_MSG("Error freeing fixed output buffer");
  6876. }
  6877. if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/
  6878. ctx_heap->curHa--;
  6879. }
  6880. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  6881. /* check if tracking stats */
  6882. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  6883. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  6884. }
  6885. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  6886. #ifdef WOLFSSL_HEAP_TEST
  6887. }
  6888. #endif
  6889. }
  6890. #endif /* WOLFSSL_STATIC_MEMORY */
  6891. #ifdef OPENSSL_EXTRA
  6892. /* Enough to free stack structure since WOLFSSL_CIPHER
  6893. * isn't allocated separately. */
  6894. wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
  6895. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  6896. #ifdef KEEP_OUR_CERT
  6897. wolfSSL_sk_X509_pop_free(ssl->ourCertChain, NULL);
  6898. #endif
  6899. #endif
  6900. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  6901. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  6902. ssl->ca_names = NULL;
  6903. #endif
  6904. #ifdef WOLFSSL_DTLS13
  6905. Dtls13FreeFsmResources(ssl);
  6906. #endif /* WOLFSSL_DTLS13 */
  6907. #ifdef WOLFSSL_QUIC
  6908. wolfSSL_quic_free(ssl);
  6909. #endif
  6910. }
  6911. /* Free any handshake resources no longer needed */
  6912. void FreeHandshakeResources(WOLFSSL* ssl)
  6913. {
  6914. WOLFSSL_ENTER("FreeHandshakeResources");
  6915. #ifdef WOLFSSL_DTLS
  6916. if (ssl->options.dtls) {
  6917. /* DTLS_POOL (DTLSv1.3 flushes the queue autonomously) */
  6918. if(!IsAtLeastTLSv1_3(ssl->version)) {
  6919. DtlsMsgPoolReset(ssl);
  6920. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  6921. ssl->dtls_rx_msg_list = NULL;
  6922. ssl->dtls_rx_msg_list_sz = 0;
  6923. }
  6924. #ifdef WOLFSSL_DTLS13
  6925. if (ssl->dtls13ClientHello != NULL) {
  6926. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  6927. ssl->dtls13ClientHello = NULL;
  6928. ssl->dtls13ClientHelloSz = 0;
  6929. }
  6930. #endif /* WOLFSSL_DTLS13 */
  6931. }
  6932. #endif
  6933. #ifdef HAVE_SECURE_RENEGOTIATION
  6934. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  6935. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  6936. return;
  6937. }
  6938. #endif
  6939. /* input buffer */
  6940. if (ssl->buffers.inputBuffer.dynamicFlag)
  6941. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  6942. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6943. if (!ssl->options.tls1_3)
  6944. #endif
  6945. {
  6946. #ifndef OPENSSL_EXTRA
  6947. /* free suites unless using compatibility layer */
  6948. FreeSuites(ssl);
  6949. #endif
  6950. /* hsHashes */
  6951. FreeHandshakeHashes(ssl);
  6952. }
  6953. /* RNG */
  6954. if (ssl->options.tls1_1 == 0
  6955. #ifndef WOLFSSL_AEAD_ONLY
  6956. || ssl->specs.cipher_type == stream
  6957. #endif
  6958. #if defined(WOLFSSL_TLS13)
  6959. /* Post-handshake auth requires random on client side for TLS 1.3.
  6960. * Session ticket requires random on server side.
  6961. */
  6962. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && !defined(HAVE_SESSION_TICKET)
  6963. || ssl->options.tls1_3
  6964. #elif !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && defined(HAVE_SESSION_TICKET)
  6965. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_CLIENT_END)
  6966. #elif !defined(HAVE_SESSION_TICKET)
  6967. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  6968. #endif
  6969. #endif
  6970. ) {
  6971. if (ssl->options.weOwnRng) {
  6972. wc_FreeRng(ssl->rng);
  6973. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  6974. ssl->rng = NULL;
  6975. ssl->options.weOwnRng = 0;
  6976. }
  6977. }
  6978. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  6979. defined(HAVE_SESSION_TICKET)
  6980. if (!ssl->options.tls1_3)
  6981. #endif
  6982. /* arrays */
  6983. if (ssl->options.saveArrays == 0)
  6984. FreeArrays(ssl, 1);
  6985. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6986. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  6987. #endif
  6988. {
  6989. #ifndef NO_RSA
  6990. /* peerRsaKey */
  6991. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  6992. ssl->peerRsaKeyPresent = 0;
  6993. #endif
  6994. #ifdef HAVE_ECC
  6995. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  6996. ssl->peerEccDsaKeyPresent = 0;
  6997. #endif /* HAVE_ECC */
  6998. #ifdef HAVE_ED25519
  6999. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  7000. ssl->peerEd25519KeyPresent = 0;
  7001. #endif /* HAVE_ED25519 */
  7002. #ifdef HAVE_ED448
  7003. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  7004. ssl->peerEd448KeyPresent = 0;
  7005. #endif /* HAVE_ED448 */
  7006. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  7007. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  7008. ssl->peerFalconKeyPresent = 0;
  7009. #endif /* HAVE_PQC */
  7010. }
  7011. #ifdef HAVE_ECC
  7012. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  7013. ssl->peerEccKeyPresent = 0;
  7014. #endif
  7015. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  7016. {
  7017. int dtype;
  7018. #ifdef HAVE_ECC
  7019. dtype = DYNAMIC_TYPE_ECC;
  7020. #elif defined(HAVE_CURVE25519)
  7021. dtype = DYNAMIC_TYPE_CURVE25519;
  7022. #else
  7023. dtype = DYNAMIC_TYPE_CURVE448;
  7024. #endif
  7025. #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
  7026. if (ssl->peerX25519KeyPresent ||
  7027. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  7028. {
  7029. dtype = DYNAMIC_TYPE_CURVE25519;
  7030. }
  7031. #endif
  7032. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  7033. defined(HAVE_CURVE448)
  7034. if (ssl->peerX448KeyPresent ||
  7035. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
  7036. {
  7037. dtype = DYNAMIC_TYPE_CURVE448;
  7038. }
  7039. #endif
  7040. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  7041. ssl->eccTempKeyPresent = 0;
  7042. }
  7043. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  7044. #ifdef HAVE_CURVE25519
  7045. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  7046. ssl->peerX25519KeyPresent = 0;
  7047. #endif
  7048. #ifdef HAVE_CURVE448
  7049. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  7050. ssl->peerX448KeyPresent = 0;
  7051. #endif
  7052. #ifndef NO_DH
  7053. if (ssl->buffers.serverDH_Priv.buffer) {
  7054. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  7055. ssl->buffers.serverDH_Priv.length);
  7056. }
  7057. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  7058. ssl->buffers.serverDH_Priv.buffer = NULL;
  7059. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7060. ssl->buffers.serverDH_Pub.buffer = NULL;
  7061. /* parameters (p,g) may be owned by ctx */
  7062. if (ssl->buffers.weOwnDH) {
  7063. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7064. ssl->buffers.serverDH_G.buffer = NULL;
  7065. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7066. ssl->buffers.serverDH_P.buffer = NULL;
  7067. }
  7068. #endif /* !NO_DH */
  7069. #ifndef NO_CERTS
  7070. wolfSSL_UnloadCertsKeys(ssl);
  7071. #endif
  7072. #ifdef HAVE_PK_CALLBACKS
  7073. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7074. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  7075. #endif
  7076. {
  7077. #ifdef HAVE_ECC
  7078. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  7079. ssl->buffers.peerEccDsaKey.buffer = NULL;
  7080. #endif /* HAVE_ECC */
  7081. #ifndef NO_RSA
  7082. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  7083. ssl->buffers.peerRsaKey.buffer = NULL;
  7084. #endif /* NO_RSA */
  7085. #ifdef HAVE_ED25519
  7086. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  7087. DYNAMIC_TYPE_ED25519);
  7088. ssl->buffers.peerEd25519Key.buffer = NULL;
  7089. #endif
  7090. #ifdef HAVE_ED448
  7091. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
  7092. ssl->buffers.peerEd448Key.buffer = NULL;
  7093. #endif
  7094. }
  7095. #endif /* HAVE_PK_CALLBACKS */
  7096. #if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \
  7097. !defined(NO_TLS) && !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  7098. !defined(WOLFSSL_DTLS_CID)
  7099. /* Some extensions need to be kept for post-handshake querying. */
  7100. TLSX_FreeAll(ssl->extensions, ssl->heap);
  7101. ssl->extensions = NULL;
  7102. #endif
  7103. #ifdef WOLFSSL_STATIC_MEMORY
  7104. /* when done with handshake decrement current handshake count */
  7105. if (ssl->heap != NULL) {
  7106. #ifdef WOLFSSL_HEAP_TEST
  7107. /* avoid dereferencing a test value */
  7108. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  7109. #endif
  7110. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  7111. WOLFSSL_HEAP* ctx_heap;
  7112. ctx_heap = ssl_hint->memory;
  7113. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  7114. WOLFSSL_MSG("Bad memory_mutex lock");
  7115. }
  7116. ctx_heap->curHa--;
  7117. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  7118. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  7119. #ifdef WOLFSSL_HEAP_TEST
  7120. }
  7121. #endif
  7122. }
  7123. #endif /* WOLFSSL_STATIC_MEMORY */
  7124. }
  7125. /* heap argument is the heap hint used when creating SSL */
  7126. void FreeSSL(WOLFSSL* ssl, void* heap)
  7127. {
  7128. WOLFSSL_CTX* ctx = ssl->ctx;
  7129. SSL_ResourceFree(ssl);
  7130. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  7131. if (ctx)
  7132. FreeSSL_Ctx(ctx); /* will decrement and free underlying CTX if 0 */
  7133. (void)heap;
  7134. #ifdef WOLFSSL_CHECK_MEM_ZERO
  7135. wc_MemZero_Check(ssl, sizeof(*ssl));
  7136. #endif
  7137. }
  7138. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  7139. !defined(WOLFSSL_NO_TLS12) || \
  7140. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \
  7141. && defined(HAVE_AEAD))
  7142. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  7143. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  7144. {
  7145. if (verify) {
  7146. seq[0] = ssl->keys.peer_sequence_number_hi;
  7147. seq[1] = ssl->keys.peer_sequence_number_lo++;
  7148. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  7149. /* handle rollover */
  7150. ssl->keys.peer_sequence_number_hi++;
  7151. }
  7152. }
  7153. else {
  7154. seq[0] = ssl->keys.sequence_number_hi;
  7155. seq[1] = ssl->keys.sequence_number_lo++;
  7156. if (seq[1] > ssl->keys.sequence_number_lo) {
  7157. /* handle rollover */
  7158. ssl->keys.sequence_number_hi++;
  7159. }
  7160. }
  7161. }
  7162. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  7163. #ifdef WOLFSSL_DTLS
  7164. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  7165. {
  7166. #ifdef HAVE_SECURE_RENEGOTIATION
  7167. order = DtlsCheckOrder(ssl, order);
  7168. #endif
  7169. if (order == PREV_ORDER) {
  7170. /* Previous epoch case */
  7171. if (ssl->options.haveMcast) {
  7172. #ifdef WOLFSSL_MULTICAST
  7173. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  7174. (ssl->options.mcastID << 8) |
  7175. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  7176. #endif
  7177. }
  7178. else
  7179. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  7180. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  7181. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  7182. }
  7183. else if (order == PEER_ORDER) {
  7184. if (ssl->options.haveMcast) {
  7185. #ifdef WOLFSSL_MULTICAST
  7186. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  7187. (ssl->keys.curPeerId << 8) |
  7188. (ssl->keys.curSeq_hi & 0xFF);
  7189. #endif
  7190. }
  7191. else
  7192. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  7193. (ssl->keys.curSeq_hi & 0xFFFF);
  7194. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  7195. }
  7196. else {
  7197. if (ssl->options.haveMcast) {
  7198. #ifdef WOLFSSL_MULTICAST
  7199. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  7200. (ssl->options.mcastID << 8) |
  7201. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  7202. #endif
  7203. }
  7204. else
  7205. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  7206. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  7207. seq[1] = ssl->keys.dtls_sequence_number_lo;
  7208. }
  7209. }
  7210. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  7211. {
  7212. word32 seq;
  7213. #ifdef HAVE_SECURE_RENEGOTIATION
  7214. order = DtlsCheckOrder(ssl, order);
  7215. #endif
  7216. if (order == PREV_ORDER) {
  7217. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  7218. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  7219. /* handle rollover */
  7220. ssl->keys.dtls_prev_sequence_number_hi++;
  7221. }
  7222. }
  7223. else if (order == PEER_ORDER) {
  7224. seq = ssl->keys.peer_sequence_number_lo++;
  7225. if (seq > ssl->keys.peer_sequence_number_lo) {
  7226. /* handle rollover */
  7227. ssl->keys.peer_sequence_number_hi++;
  7228. }
  7229. }
  7230. else {
  7231. seq = ssl->keys.dtls_sequence_number_lo++;
  7232. if (seq > ssl->keys.dtls_sequence_number_lo) {
  7233. /* handle rollover */
  7234. ssl->keys.dtls_sequence_number_hi++;
  7235. }
  7236. }
  7237. }
  7238. #endif /* WOLFSSL_DTLS */
  7239. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  7240. void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  7241. {
  7242. word32 seq[2] = {0, 0};
  7243. if (!ssl->options.dtls) {
  7244. GetSEQIncrement(ssl, verifyOrder, seq);
  7245. }
  7246. else {
  7247. #ifdef WOLFSSL_DTLS
  7248. DtlsGetSEQ(ssl, verifyOrder, seq);
  7249. #endif
  7250. }
  7251. c32toa(seq[0], out);
  7252. c32toa(seq[1], out + OPAQUE32_LEN);
  7253. }
  7254. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  7255. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
  7256. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */
  7257. #ifdef WOLFSSL_DTLS
  7258. /* functions for managing DTLS datagram reordering */
  7259. /* Need to allocate space for the handshake message header. The hashing
  7260. * routines assume the message pointer is still within the buffer that
  7261. * has the headers, and will include those headers in the hash. The store
  7262. * routines need to take that into account as well. New will allocate
  7263. * extra space for the headers. */
  7264. DtlsMsg* DtlsMsgNew(word32 sz, byte tx, void* heap)
  7265. {
  7266. DtlsMsg* msg;
  7267. WOLFSSL_ENTER("DtlsMsgNew()");
  7268. (void)heap;
  7269. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  7270. if (msg != NULL) {
  7271. XMEMSET(msg, 0, sizeof(DtlsMsg));
  7272. msg->sz = sz;
  7273. msg->type = no_shake;
  7274. if (tx) {
  7275. msg->raw = msg->fullMsg =
  7276. (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ, heap,
  7277. DYNAMIC_TYPE_DTLS_FRAG);
  7278. msg->ready = 1;
  7279. if (msg->raw == NULL) {
  7280. DtlsMsgDelete(msg, heap);
  7281. msg = NULL;
  7282. }
  7283. }
  7284. }
  7285. return msg;
  7286. }
  7287. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  7288. {
  7289. (void)heap;
  7290. WOLFSSL_ENTER("DtlsMsgDelete()");
  7291. if (item != NULL) {
  7292. while (item->fragBucketList != NULL) {
  7293. DtlsFragBucket* next = item->fragBucketList->m.m.next;
  7294. DtlsMsgDestroyFragBucket(item->fragBucketList, heap);
  7295. item->fragBucketList = next;
  7296. }
  7297. if (item->raw != NULL)
  7298. XFREE(item->raw, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7299. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  7300. }
  7301. }
  7302. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  7303. {
  7304. DtlsMsg* next;
  7305. WOLFSSL_ENTER("DtlsMsgListDelete()");
  7306. while (head) {
  7307. next = head->next;
  7308. DtlsMsgDelete(head, heap);
  7309. head = next;
  7310. }
  7311. }
  7312. /**
  7313. * Drop messages when they are no longer going to be retransmitted
  7314. */
  7315. void DtlsTxMsgListClean(WOLFSSL* ssl)
  7316. {
  7317. DtlsMsg* head = ssl->dtls_tx_msg_list;
  7318. DtlsMsg* next;
  7319. WOLFSSL_ENTER("DtlsTxMsgListClean()");
  7320. while (head) {
  7321. next = head->next;
  7322. if (VerifyForTxDtlsMsgDelete(ssl, head))
  7323. DtlsMsgDelete(head, ssl->heap);
  7324. else
  7325. /* Stored packets should be in order so break on first failed
  7326. * verify */
  7327. break;
  7328. ssl->dtls_tx_msg_list_sz--;
  7329. head = next;
  7330. }
  7331. ssl->dtls_tx_msg_list = head;
  7332. }
  7333. static DtlsFragBucket* DtlsMsgCreateFragBucket(word32 offset, const byte* data,
  7334. word32 dataSz, void* heap)
  7335. {
  7336. DtlsFragBucket* bucket =
  7337. (DtlsFragBucket*)XMALLOC(sizeof(DtlsFragBucket) + dataSz, heap,
  7338. DYNAMIC_TYPE_DTLS_FRAG);
  7339. if (bucket != NULL) {
  7340. XMEMSET(bucket, 0, sizeof(*bucket));
  7341. bucket->m.m.next = NULL;
  7342. bucket->m.m.offset = offset;
  7343. bucket->m.m.sz = dataSz;
  7344. if (data != NULL)
  7345. XMEMCPY(bucket->buf, data, dataSz);
  7346. }
  7347. return bucket;
  7348. }
  7349. void DtlsMsgDestroyFragBucket(DtlsFragBucket* fragBucket, void* heap)
  7350. {
  7351. (void)heap;
  7352. XFREE(fragBucket, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7353. }
  7354. /*
  7355. * data overlaps with cur but is before next.
  7356. * data + dataSz has to end before or inside next. next can be NULL.
  7357. */
  7358. static DtlsFragBucket* DtlsMsgCombineFragBuckets(DtlsMsg* msg,
  7359. DtlsFragBucket* cur, DtlsFragBucket* next, word32 offset,
  7360. const byte* data, word32 dataSz, void* heap)
  7361. {
  7362. word32 offsetEnd = offset + dataSz;
  7363. word32 newOffset = min(cur->m.m.offset, offset);
  7364. word32 newOffsetEnd;
  7365. word32 newSz;
  7366. word32 overlapSz = cur->m.m.sz;
  7367. DtlsFragBucket** chosenBucket;
  7368. DtlsFragBucket* newBucket;
  7369. DtlsFragBucket* otherBucket;
  7370. byte combineNext = FALSE;
  7371. if (next != NULL && offsetEnd >= next->m.m.offset)
  7372. combineNext = TRUE;
  7373. if (combineNext)
  7374. newOffsetEnd = next->m.m.offset + next->m.m.sz;
  7375. else
  7376. newOffsetEnd = max(cur->m.m.offset + cur->m.m.sz, offsetEnd);
  7377. newSz = newOffsetEnd - newOffset;
  7378. /* Expand the larger bucket if data bridges the gap between cur and next */
  7379. if (!combineNext || cur->m.m.sz >= next->m.m.sz) {
  7380. chosenBucket = &cur;
  7381. otherBucket = next;
  7382. }
  7383. else {
  7384. chosenBucket = &next;
  7385. otherBucket = cur;
  7386. }
  7387. {
  7388. DtlsFragBucket* tmp = (DtlsFragBucket*)XREALLOC(*chosenBucket,
  7389. sizeof(DtlsFragBucket) + newSz, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7390. if (tmp == NULL)
  7391. return NULL;
  7392. if (chosenBucket == &next) {
  7393. /* Update the link */
  7394. DtlsFragBucket* beforeNext = cur;
  7395. while (beforeNext->m.m.next != next)
  7396. beforeNext = beforeNext->m.m.next;
  7397. beforeNext->m.m.next = tmp;
  7398. }
  7399. newBucket = *chosenBucket = tmp;
  7400. }
  7401. if (combineNext) {
  7402. /* Put next first since it will always be at the end. Use memmove since
  7403. * newBucket may be next. */
  7404. XMEMMOVE(newBucket->buf + (next->m.m.offset - newOffset), next->buf,
  7405. next->m.m.sz);
  7406. /* memory after newOffsetEnd is already copied. Don't do extra work. */
  7407. newOffsetEnd = next->m.m.offset;
  7408. }
  7409. if (newOffset == offset) {
  7410. /* data comes first */
  7411. if (newOffsetEnd <= offsetEnd) {
  7412. /* data encompasses cur. only copy data */
  7413. XMEMCPY(newBucket->buf, data,
  7414. min(dataSz, newOffsetEnd - newOffset));
  7415. }
  7416. else {
  7417. /* data -> cur. memcpy as much possible as its faster. */
  7418. XMEMMOVE(newBucket->buf + dataSz, cur->buf,
  7419. cur->m.m.sz - (offsetEnd - cur->m.m.offset));
  7420. XMEMCPY(newBucket->buf, data, dataSz);
  7421. }
  7422. }
  7423. else {
  7424. /* cur -> data */
  7425. word32 curOffsetEnd = cur->m.m.offset + cur->m.m.sz;
  7426. if (newBucket != cur)
  7427. XMEMCPY(newBucket->buf, cur->buf, cur->m.m.sz);
  7428. XMEMCPY(newBucket->buf + cur->m.m.sz,
  7429. data + (curOffsetEnd - offset),
  7430. newOffsetEnd - curOffsetEnd);
  7431. }
  7432. /* FINALLY the newBucket is populated correctly */
  7433. /* All buckets up to and including next (if combining) have to be free'd */
  7434. {
  7435. DtlsFragBucket* toFree = cur->m.m.next;
  7436. while (toFree != next) {
  7437. DtlsFragBucket* n = toFree->m.m.next;
  7438. overlapSz += toFree->m.m.sz;
  7439. DtlsMsgDestroyFragBucket(toFree, heap);
  7440. msg->fragBucketListCount--;
  7441. toFree = n;
  7442. }
  7443. if (combineNext) {
  7444. newBucket->m.m.next = next->m.m.next;
  7445. overlapSz += next->m.m.sz;
  7446. DtlsMsgDestroyFragBucket(otherBucket, heap);
  7447. msg->fragBucketListCount--;
  7448. }
  7449. else {
  7450. newBucket->m.m.next = next;
  7451. }
  7452. }
  7453. /* Adjust size in msg */
  7454. msg->bytesReceived += newSz - overlapSz;
  7455. newBucket->m.m.offset = newOffset;
  7456. newBucket->m.m.sz = newSz;
  7457. return newBucket;
  7458. }
  7459. static void DtlsMsgAssembleCompleteMessage(DtlsMsg* msg)
  7460. {
  7461. DtlsHandShakeHeader* dtls;
  7462. /* We have received all necessary fragments. Reconstruct the header. */
  7463. if (msg->fragBucketListCount != 1 || msg->fragBucketList->m.m.offset != 0 ||
  7464. msg->fragBucketList->m.m.sz != msg->sz) {
  7465. WOLFSSL_MSG("Major error in fragment assembly logic");
  7466. return;
  7467. }
  7468. /* Re-cycle the DtlsFragBucket as the buffer that holds the complete
  7469. * handshake message and the header. */
  7470. msg->raw = (byte*)msg->fragBucketList;
  7471. msg->fullMsg = msg->fragBucketList->buf;
  7472. msg->ready = 1;
  7473. /* frag->padding makes sure we can fit the entire DTLS handshake header
  7474. * before frag->buf */
  7475. /* note the dtls pointer needs to be computed from msg->fragBucketList, not
  7476. * from msg->fragBucketList->buf, to avoid a pointerOutOfBounds access
  7477. * detected by cppcheck.
  7478. *
  7479. * also note, the (void *) intermediate cast is necessary to avoid a
  7480. * potential -Wcast-align around alignment of DtlsHandShakeHeader exceeding
  7481. * alignment of char.
  7482. */
  7483. dtls = (DtlsHandShakeHeader*)(void *)((char *)msg->fragBucketList
  7484. + OFFSETOF(DtlsFragBucket,buf)
  7485. - DTLS_HANDSHAKE_HEADER_SZ);
  7486. msg->fragBucketList = NULL;
  7487. msg->fragBucketListCount = 0;
  7488. dtls->type = msg->type;
  7489. c32to24(msg->sz, dtls->length);
  7490. c16toa((word16)msg->seq, dtls->message_seq);
  7491. c32to24(0, dtls->fragment_offset);
  7492. c32to24(msg->sz, dtls->fragment_length);
  7493. }
  7494. int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
  7495. word32 fragOffset, word32 fragSz, void* heap, word32 totalLen)
  7496. {
  7497. word32 fragOffsetEnd = fragOffset + fragSz;
  7498. WOLFSSL_ENTER("DtlsMsgSet()");
  7499. if (msg == NULL || data == NULL || msg->sz != totalLen ||
  7500. fragOffsetEnd > totalLen) {
  7501. WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
  7502. return BAD_FUNC_ARG;
  7503. }
  7504. if (msg->ready)
  7505. return 0; /* msg is already complete */
  7506. if (msg->type != no_shake) {
  7507. /* msg is already populated with the correct seq, epoch, and type */
  7508. if (msg->type != type || msg->epoch != epoch || msg->seq != seq) {
  7509. WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
  7510. return SEQUENCE_ERROR;
  7511. }
  7512. }
  7513. else {
  7514. msg->type = type;
  7515. msg->epoch = epoch;
  7516. msg->seq = seq;
  7517. }
  7518. if (msg->fragBucketList == NULL) {
  7519. /* Clean list. Create first fragment. */
  7520. msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data, fragSz, heap);
  7521. if (msg->fragBucketList != NULL) {
  7522. msg->bytesReceived = fragSz;
  7523. msg->fragBucketListCount++;
  7524. }
  7525. else {
  7526. return MEMORY_ERROR;
  7527. }
  7528. }
  7529. else {
  7530. /* See if we can expand any existing bucket to fit this new data into */
  7531. DtlsFragBucket* prev = NULL;
  7532. DtlsFragBucket* cur = msg->fragBucketList;
  7533. byte done = 0;
  7534. for (; cur != NULL; prev = cur, cur = cur->m.m.next) {
  7535. word32 curOffset = cur->m.m.offset;
  7536. word32 curEnd = cur->m.m.offset + cur->m.m.sz;
  7537. if (fragOffset >= curOffset && fragOffsetEnd <= curEnd) {
  7538. /* We already have this fragment */
  7539. done = 1;
  7540. break;
  7541. }
  7542. else if (fragOffset <= curEnd) {
  7543. /* found place to store fragment */
  7544. break;
  7545. }
  7546. }
  7547. if (!done) {
  7548. if (cur == NULL) {
  7549. /* We reached the end of the list. data is after and disjointed
  7550. * from anything we have received so far. */
  7551. if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
  7552. WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
  7553. return DTLS_TOO_MANY_FRAGMENTS_E;
  7554. }
  7555. prev->m.m.next =
  7556. DtlsMsgCreateFragBucket(fragOffset, data, fragSz, heap);
  7557. if (prev->m.m.next != NULL) {
  7558. msg->bytesReceived += fragSz;
  7559. msg->fragBucketListCount++;
  7560. }
  7561. }
  7562. else if (prev == NULL && fragOffsetEnd < cur->m.m.offset) {
  7563. /* This is the new first fragment we have received */
  7564. if (msg->fragBucketListCount >= DTLS_FRAG_POOL_SZ) {
  7565. WOLFSSL_ERROR_VERBOSE(DTLS_TOO_MANY_FRAGMENTS_E);
  7566. return DTLS_TOO_MANY_FRAGMENTS_E;
  7567. }
  7568. msg->fragBucketList = DtlsMsgCreateFragBucket(fragOffset, data,
  7569. fragSz, heap);
  7570. if (msg->fragBucketList != NULL) {
  7571. msg->fragBucketList->m.m.next = cur;
  7572. msg->bytesReceived += fragSz;
  7573. msg->fragBucketListCount++;
  7574. }
  7575. else {
  7576. /* reset on error */
  7577. msg->fragBucketList = cur;
  7578. }
  7579. }
  7580. else {
  7581. /* Find if this fragment overlaps with any more */
  7582. DtlsFragBucket* next = cur->m.m.next;
  7583. DtlsFragBucket** prev_next = prev != NULL
  7584. ? &prev->m.m.next : &msg->fragBucketList;
  7585. while (next != NULL &&
  7586. (next->m.m.offset + next->m.m.sz) <= fragOffsetEnd)
  7587. next = next->m.m.next;
  7588. /* We can combine the buckets */
  7589. *prev_next = DtlsMsgCombineFragBuckets(msg, cur, next,
  7590. fragOffset, data, fragSz, heap);
  7591. if (*prev_next == NULL) /* reset on error */
  7592. *prev_next = cur;
  7593. }
  7594. }
  7595. }
  7596. if (msg->bytesReceived == msg->sz)
  7597. DtlsMsgAssembleCompleteMessage(msg);
  7598. return 0;
  7599. }
  7600. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word16 epoch, word32 seq)
  7601. {
  7602. WOLFSSL_ENTER("DtlsMsgFind()");
  7603. while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
  7604. head = head->next;
  7605. }
  7606. return head;
  7607. }
  7608. void DtlsMsgStore(WOLFSSL* ssl, word16 epoch, word32 seq, const byte* data,
  7609. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  7610. {
  7611. /* See if seq exists in the list. If it isn't in the list, make
  7612. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  7613. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  7614. * the seq is in the list and it isn't full, copy fragSz bytes from
  7615. * data to msg->msg starting at offset fragOffset, and add fragSz to
  7616. * msg->fragSz. Insertions take into account data already in the list
  7617. * in case there are overlaps in the handshake message due to retransmit
  7618. * messages. The new item should be inserted into the list in its
  7619. * proper position.
  7620. *
  7621. * 1. Find seq in list, or where seq should go in list. If seq not in
  7622. * list, create new item and insert into list. Either case, keep
  7623. * pointer to item.
  7624. * 2. Copy the data from the message to the stored message where it
  7625. * belongs without overlaps.
  7626. */
  7627. DtlsMsg* head = ssl->dtls_rx_msg_list;
  7628. WOLFSSL_ENTER("DtlsMsgStore()");
  7629. if (head != NULL) {
  7630. DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
  7631. if (cur == NULL) {
  7632. cur = DtlsMsgNew(dataSz, 0, heap);
  7633. if (cur != NULL) {
  7634. if (DtlsMsgSet(cur, seq, epoch, data, type,
  7635. fragOffset, fragSz, heap, dataSz) < 0) {
  7636. DtlsMsgDelete(cur, heap);
  7637. }
  7638. else {
  7639. ssl->dtls_rx_msg_list_sz++;
  7640. head = DtlsMsgInsert(head, cur);
  7641. }
  7642. }
  7643. }
  7644. else {
  7645. /* If this fails, the data is just dropped. */
  7646. DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
  7647. fragSz, heap, dataSz);
  7648. }
  7649. }
  7650. else {
  7651. head = DtlsMsgNew(dataSz, 0, heap);
  7652. if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
  7653. fragSz, heap, dataSz) < 0) {
  7654. DtlsMsgDelete(head, heap);
  7655. head = NULL;
  7656. }
  7657. else {
  7658. ssl->dtls_rx_msg_list_sz++;
  7659. }
  7660. }
  7661. ssl->dtls_rx_msg_list = head;
  7662. }
  7663. /* DtlsMsgInsert() is an in-order insert. */
  7664. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  7665. {
  7666. WOLFSSL_ENTER("DtlsMsgInsert()");
  7667. if (head == NULL || (item->epoch <= head->epoch &&
  7668. item->seq < head->seq)) {
  7669. item->next = head;
  7670. head = item;
  7671. }
  7672. else if (head->next == NULL) {
  7673. head->next = item;
  7674. }
  7675. else {
  7676. DtlsMsg* cur = head->next;
  7677. DtlsMsg* prev = head;
  7678. while (cur) {
  7679. if (item->epoch <= cur->epoch &&
  7680. item->seq < cur->seq) {
  7681. item->next = cur;
  7682. prev->next = item;
  7683. break;
  7684. }
  7685. prev = cur;
  7686. cur = cur->next;
  7687. }
  7688. if (cur == NULL) {
  7689. prev->next = item;
  7690. }
  7691. }
  7692. return head;
  7693. }
  7694. /**
  7695. * DtlsMsgPoolSave() adds the message to the end of the stored transmit
  7696. * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
  7697. * anything else that increments ssl->keys.dtls_handshake_number.
  7698. */
  7699. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
  7700. enum HandShakeType type)
  7701. {
  7702. DtlsMsg* item;
  7703. int ret = 0;
  7704. WOLFSSL_ENTER("DtlsMsgPoolSave()");
  7705. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  7706. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  7707. return DTLS_POOL_SZ_E;
  7708. }
  7709. item = DtlsMsgNew(dataSz, 1, ssl->heap);
  7710. if (item != NULL) {
  7711. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  7712. XMEMCPY(item->raw, data, dataSz);
  7713. item->epoch = ssl->keys.dtls_epoch;
  7714. item->seq = ssl->keys.dtls_handshake_number;
  7715. item->type = type;
  7716. if (cur == NULL)
  7717. ssl->dtls_tx_msg_list = item;
  7718. else {
  7719. while (cur->next)
  7720. cur = cur->next;
  7721. cur->next = item;
  7722. }
  7723. ssl->dtls_tx_msg_list_sz++;
  7724. }
  7725. else
  7726. ret = MEMORY_E;
  7727. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  7728. return ret;
  7729. }
  7730. /* DtlsMsgPoolTimeout() updates the timeout time. */
  7731. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  7732. {
  7733. int result = -1;
  7734. WOLFSSL_ENTER("DtlsMsgPoolTimeout()");
  7735. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  7736. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  7737. result = 0;
  7738. }
  7739. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  7740. return result;
  7741. }
  7742. /* DtlsMsgPoolReset() deletes the stored transmit list. */
  7743. void DtlsMsgPoolReset(WOLFSSL* ssl)
  7744. {
  7745. WOLFSSL_ENTER("DtlsMsgPoolReset()");
  7746. if (ssl->dtls_tx_msg_list) {
  7747. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  7748. ssl->dtls_tx_msg_list = NULL;
  7749. ssl->dtls_tx_msg = NULL;
  7750. ssl->dtls_tx_msg_list_sz = 0;
  7751. }
  7752. }
  7753. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  7754. {
  7755. /**
  7756. * only the first message from previous flight should be valid
  7757. * to be used for triggering retransmission of whole DtlsMsgPool.
  7758. * change cipher suite type is not verified here
  7759. */
  7760. return ((fragOffset == 0) &&
  7761. (((ssl->options.side == WOLFSSL_SERVER_END) &&
  7762. ((type == client_hello) ||
  7763. ((ssl->options.verifyPeer) && (type == certificate)) ||
  7764. ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
  7765. ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  7766. (type == hello_request || type == server_hello))));
  7767. }
  7768. /**
  7769. * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
  7770. * depending on the current state of the handshake negotiation.
  7771. */
  7772. int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
  7773. {
  7774. WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete()");
  7775. if (item->epoch < ssl->keys.dtls_epoch - 1)
  7776. /* Messages not from current or previous epoch can be deleted */
  7777. return 1;
  7778. switch (ssl->options.side) {
  7779. case WOLFSSL_CLIENT_END:
  7780. if (item->type == client_hello &&
  7781. ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
  7782. return 1; /* client can forget first client_hello if received full
  7783. * flight of packets from server */
  7784. else
  7785. return 0;
  7786. case WOLFSSL_SERVER_END:
  7787. if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
  7788. item->type == hello_request)
  7789. return 1; /* Server can forget HelloRequest if client sent a valid
  7790. * ClientHello */
  7791. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
  7792. item->type <= server_hello_done)
  7793. return 1; /* server can forget everything up to ServerHelloDone if
  7794. * a client finished message has been received and
  7795. * successfully processed */
  7796. else
  7797. return 0;
  7798. default:
  7799. return 0;
  7800. }
  7801. }
  7802. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  7803. * updated with new sequence numbers, and will be re-encrypted if needed. */
  7804. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  7805. {
  7806. int ret = 0;
  7807. DtlsMsg* pool;
  7808. int epochOrder;
  7809. WOLFSSL_ENTER("DtlsMsgPoolSend()");
  7810. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  7811. if (pool != NULL) {
  7812. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  7813. !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
  7814. ssl->options.acceptState == SERVER_HELLO_DONE ||
  7815. ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
  7816. ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
  7817. (ssl->options.side == WOLFSSL_CLIENT_END &&
  7818. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  7819. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  7820. ssl->options.connectState == FINISHED_DONE ||
  7821. ssl->options.connectState == SECOND_REPLY_DONE))) {
  7822. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  7823. ssl->error = DTLS_RETX_OVER_TX;
  7824. return WOLFSSL_FATAL_ERROR;
  7825. }
  7826. while (pool != NULL) {
  7827. if (pool->epoch == 0) {
  7828. DtlsRecordLayerHeader* dtls;
  7829. dtls = (DtlsRecordLayerHeader*)pool->raw;
  7830. /* If the stored record's epoch is 0, and the currently set
  7831. * epoch is 0, use the "current order" sequence number.
  7832. * If the stored record's epoch is 0 and the currently set
  7833. * epoch is not 0, the stored record is considered a "previous
  7834. * order" sequence number. */
  7835. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  7836. CUR_ORDER : PREV_ORDER;
  7837. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  7838. DtlsSEQIncrement(ssl, epochOrder);
  7839. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  7840. WOLFSSL_ERROR(ret);
  7841. return ret;
  7842. }
  7843. XMEMCPY(ssl->buffers.outputBuffer.buffer +
  7844. ssl->buffers.outputBuffer.idx +
  7845. ssl->buffers.outputBuffer.length,
  7846. pool->raw, pool->sz);
  7847. ssl->buffers.outputBuffer.length += pool->sz;
  7848. }
  7849. else {
  7850. /* Handle sending packets from previous epoch */
  7851. byte* input;
  7852. byte* output;
  7853. int inputSz, sendSz;
  7854. input = pool->raw;
  7855. inputSz = pool->sz;
  7856. sendSz = inputSz + cipherExtraData(ssl);
  7857. #ifdef HAVE_SECURE_RENEGOTIATION
  7858. /*
  7859. * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
  7860. * ssl->keys otherwise
  7861. * PREV_ORDER will always use ssl->keys
  7862. */
  7863. if (DtlsSCRKeysSet(ssl)) {
  7864. if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  7865. epochOrder = CUR_ORDER;
  7866. else
  7867. epochOrder = PREV_ORDER;
  7868. }
  7869. else {
  7870. epochOrder = CUR_ORDER;
  7871. }
  7872. #else
  7873. epochOrder = CUR_ORDER;
  7874. #endif
  7875. /* add back in header space from saved pool size */
  7876. sendSz += DTLS_HANDSHAKE_EXTRA;
  7877. sendSz += DTLS_RECORD_EXTRA;
  7878. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  7879. WOLFSSL_ERROR(ret);
  7880. return ret;
  7881. }
  7882. output = ssl->buffers.outputBuffer.buffer +
  7883. ssl->buffers.outputBuffer.length;
  7884. if (inputSz != ENUM_LEN)
  7885. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  7886. handshake, 0, 0, 0, epochOrder);
  7887. else
  7888. /* inputSz == ENUM_LEN must mean that this is a change cipher
  7889. * spec message */
  7890. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  7891. change_cipher_spec, 0, 0, 0, epochOrder);
  7892. if (sendSz < 0) {
  7893. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  7894. return BUILD_MSG_ERROR;
  7895. }
  7896. ssl->buffers.outputBuffer.length += sendSz;
  7897. }
  7898. if (!ssl->options.groupMessages)
  7899. ret = SendBuffered(ssl);
  7900. /**
  7901. * on server side, retransmission is being triggered only by sending
  7902. * first message of given flight, in order to trigger client
  7903. * to retransmit its whole flight. Sending the whole previous flight
  7904. * could lead to retransmission of previous client flight for each
  7905. * server message from previous flight. Therefore one message should
  7906. * be enough to do the trick.
  7907. */
  7908. if (sendOnlyFirstPacket &&
  7909. ssl->options.side == WOLFSSL_SERVER_END)
  7910. pool = NULL;
  7911. else
  7912. pool = pool->next;
  7913. ssl->dtls_tx_msg = pool;
  7914. }
  7915. if (ret == 0 && ssl->options.groupMessages)
  7916. ret = SendBuffered(ssl);
  7917. }
  7918. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  7919. return ret;
  7920. }
  7921. #endif /* WOLFSSL_DTLS */
  7922. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  7923. ProtocolVersion MakeSSLv3(void)
  7924. {
  7925. ProtocolVersion pv;
  7926. pv.major = SSLv3_MAJOR;
  7927. pv.minor = SSLv3_MINOR;
  7928. return pv;
  7929. }
  7930. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  7931. #ifdef WOLFSSL_DTLS
  7932. ProtocolVersion MakeDTLSv1(void)
  7933. {
  7934. ProtocolVersion pv;
  7935. pv.major = DTLS_MAJOR;
  7936. pv.minor = DTLS_MINOR;
  7937. return pv;
  7938. }
  7939. #ifndef WOLFSSL_NO_TLS12
  7940. ProtocolVersion MakeDTLSv1_2(void)
  7941. {
  7942. ProtocolVersion pv;
  7943. pv.major = DTLS_MAJOR;
  7944. pv.minor = DTLSv1_2_MINOR;
  7945. return pv;
  7946. }
  7947. #endif /* !WOLFSSL_NO_TLS12 */
  7948. #ifdef WOLFSSL_DTLS13
  7949. ProtocolVersion MakeDTLSv1_3(void)
  7950. {
  7951. ProtocolVersion pv;
  7952. pv.major = DTLS_MAJOR;
  7953. pv.minor = DTLSv1_3_MINOR;
  7954. return pv;
  7955. }
  7956. #endif /* WOLFSSL_DTLS13 */
  7957. #endif /* WOLFSSL_DTLS */
  7958. #ifndef NO_ASN_TIME
  7959. #if defined(USER_TICKS)
  7960. #if 0
  7961. word32 LowResTimer(void)
  7962. {
  7963. /*
  7964. write your own clock tick function if don't want time(0)
  7965. needs second accuracy but doesn't have to correlated to EPOCH
  7966. */
  7967. }
  7968. #endif
  7969. #elif defined(TIME_OVERRIDES)
  7970. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  7971. /* use same asn time overrides unless user wants tick override above */
  7972. word32 LowResTimer(void)
  7973. {
  7974. return (word32) wc_Time(0);
  7975. }
  7976. #else
  7977. #ifndef HAVE_TIME_T_TYPE
  7978. typedef long time_t;
  7979. #endif
  7980. extern time_t XTIME(time_t * timer);
  7981. word32 LowResTimer(void)
  7982. {
  7983. return (word32) XTIME(0);
  7984. }
  7985. #endif
  7986. #elif defined(USE_WINDOWS_API)
  7987. word32 LowResTimer(void)
  7988. {
  7989. static int init = 0;
  7990. static LARGE_INTEGER freq;
  7991. LARGE_INTEGER count;
  7992. if (!init) {
  7993. QueryPerformanceFrequency(&freq);
  7994. init = 1;
  7995. }
  7996. QueryPerformanceCounter(&count);
  7997. return (word32)(count.QuadPart / freq.QuadPart);
  7998. }
  7999. #elif defined(HAVE_RTP_SYS)
  8000. #include "rtptime.h"
  8001. word32 LowResTimer(void)
  8002. {
  8003. return (word32)rtp_get_system_sec();
  8004. }
  8005. #elif defined(WOLFSSL_DEOS)
  8006. word32 LowResTimer(void)
  8007. {
  8008. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  8009. const volatile word32 *systemTickPtr = systemTickPointer();
  8010. return (word32) *systemTickPtr/systemTickTimeInHz;
  8011. }
  8012. #elif defined(MICRIUM)
  8013. word32 LowResTimer(void)
  8014. {
  8015. OS_TICK ticks = 0;
  8016. OS_ERR err;
  8017. ticks = OSTimeGet(&err);
  8018. return (word32) (ticks / OSCfg_TickRate_Hz);
  8019. }
  8020. #elif defined(MICROCHIP_TCPIP_V5)
  8021. word32 LowResTimer(void)
  8022. {
  8023. return (word32) (TickGet() / TICKS_PER_SECOND);
  8024. }
  8025. #elif defined(MICROCHIP_TCPIP)
  8026. #if defined(MICROCHIP_MPLAB_HARMONY)
  8027. #include <system/tmr/sys_tmr.h>
  8028. word32 LowResTimer(void)
  8029. {
  8030. return (word32) (SYS_TMR_TickCountGet() /
  8031. SYS_TMR_TickCounterFrequencyGet());
  8032. }
  8033. #else
  8034. word32 LowResTimer(void)
  8035. {
  8036. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  8037. }
  8038. #endif
  8039. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  8040. word32 LowResTimer(void)
  8041. {
  8042. TIME_STRUCT mqxTime;
  8043. _time_get_elapsed(&mqxTime);
  8044. return (word32) mqxTime.SECONDS;
  8045. }
  8046. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  8047. #include "include/task.h"
  8048. unsigned int LowResTimer(void)
  8049. {
  8050. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  8051. }
  8052. #elif defined(FREERTOS)
  8053. #include "task.h"
  8054. unsigned int LowResTimer(void)
  8055. {
  8056. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  8057. }
  8058. #elif defined(FREESCALE_KSDK_BM)
  8059. #include "lwip/sys.h" /* lwIP */
  8060. word32 LowResTimer(void)
  8061. {
  8062. return sys_now()/1000;
  8063. }
  8064. #elif defined(WOLFSSL_TIRTOS)
  8065. word32 LowResTimer(void)
  8066. {
  8067. return (word32) Seconds_get();
  8068. }
  8069. #elif defined(WOLFSSL_XILINX)
  8070. #include "xrtcpsu.h"
  8071. word32 LowResTimer(void)
  8072. {
  8073. XRtcPsu_Config* con;
  8074. XRtcPsu rtc;
  8075. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  8076. if (con != NULL) {
  8077. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  8078. == XST_SUCCESS) {
  8079. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  8080. }
  8081. else {
  8082. WOLFSSL_MSG("Unable to initialize RTC");
  8083. }
  8084. }
  8085. return 0;
  8086. }
  8087. #elif defined(WOLFSSL_UTASKER)
  8088. word32 LowResTimer(void)
  8089. {
  8090. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  8091. }
  8092. #elif defined(WOLFSSL_NUCLEUS_1_2)
  8093. #define NU_TICKS_PER_SECOND 100
  8094. word32 LowResTimer(void)
  8095. {
  8096. /* returns number of 10ms ticks, so 100 ticks/sec */
  8097. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  8098. }
  8099. #elif defined(WOLFSSL_APACHE_MYNEWT)
  8100. #include "os/os_time.h"
  8101. word32 LowResTimer(void)
  8102. {
  8103. word32 now;
  8104. struct os_timeval tv;
  8105. os_gettimeofday(&tv, NULL);
  8106. now = (word32)tv.tv_sec;
  8107. return now;
  8108. }
  8109. #elif defined(WOLFSSL_ZEPHYR)
  8110. word32 LowResTimer(void)
  8111. {
  8112. return k_uptime_get() / 1000;
  8113. }
  8114. #elif defined(WOLFSSL_LINUXKM)
  8115. word32 LowResTimer(void)
  8116. {
  8117. return (word32)time(NULL);
  8118. }
  8119. #else
  8120. /* Posix style time */
  8121. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  8122. #include <time.h>
  8123. #endif
  8124. word32 LowResTimer(void)
  8125. {
  8126. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  8127. return (word32)wc_Time(0);
  8128. #else
  8129. return (word32)XTIME(0);
  8130. #endif
  8131. }
  8132. #endif
  8133. #else
  8134. /* user must supply timer function to return elapsed seconds:
  8135. * word32 LowResTimer(void);
  8136. */
  8137. #endif /* !NO_ASN_TIME */
  8138. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  8139. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  8140. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  8141. /* Store the message for use with CertificateVerify using EdDSA.
  8142. *
  8143. * ssl SSL/TLS object.
  8144. * data Message to store.
  8145. * sz Size of message to store.
  8146. * returns MEMORY_E if not able to reallocate, otherwise 0.
  8147. */
  8148. static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
  8149. {
  8150. int ret = 0;
  8151. byte* msgs;
  8152. if (ssl->options.cacheMessages) {
  8153. msgs = (byte*)XMALLOC(ssl->hsHashes->length + sz, ssl->heap,
  8154. DYNAMIC_TYPE_HASHES);
  8155. if (msgs == NULL)
  8156. ret = MEMORY_E;
  8157. if ((ret == 0) && (ssl->hsHashes->messages != NULL)) {
  8158. XMEMCPY(msgs, ssl->hsHashes->messages, ssl->hsHashes->length);
  8159. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  8160. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  8161. }
  8162. if (ret == 0) {
  8163. #ifdef WOLFSSL_CHECK_MEM_ZERO
  8164. wc_MemZero_Add("Handshake messages", msgs,
  8165. ssl->hsHashes->length + sz);
  8166. #endif
  8167. ssl->hsHashes->messages = msgs;
  8168. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  8169. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  8170. ssl->hsHashes->length += sz;
  8171. }
  8172. }
  8173. return ret;
  8174. }
  8175. #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  8176. int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
  8177. {
  8178. int ret = 0;
  8179. #ifdef WOLFSSL_DEBUG_TLS
  8180. byte digest[WC_MAX_DIGEST_SIZE];
  8181. WOLFSSL_MSG("HashRaw:");
  8182. WOLFSSL_MSG("Data:");
  8183. WOLFSSL_BUFFER(data, sz);
  8184. WOLFSSL_MSG("Hashes:");
  8185. #endif
  8186. (void)data;
  8187. (void)sz;
  8188. if (ssl->hsHashes == NULL) {
  8189. return BAD_FUNC_ARG;
  8190. }
  8191. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && (WOLFSSL_RENESAS_TSIP_VER >= 115)
  8192. ret = tsip_StoreMessage(ssl, data, sz);
  8193. if (ret != 0 && ret != CRYPTOCB_UNAVAILABLE) {
  8194. return ret;
  8195. }
  8196. #endif /* WOLFSSL_RENESAS_TSIP_TLS && WOLFSSL_RENESAS_TSIP_VER >= 115 */
  8197. #ifndef NO_OLD_TLS
  8198. #ifndef NO_SHA
  8199. wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
  8200. #endif
  8201. #ifndef NO_MD5
  8202. wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
  8203. #endif
  8204. #endif /* NO_OLD_TLS */
  8205. if (IsAtLeastTLSv1_2(ssl)) {
  8206. #ifndef NO_SHA256
  8207. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
  8208. if (ret != 0)
  8209. return ret;
  8210. #ifdef WOLFSSL_DEBUG_TLS
  8211. WOLFSSL_MSG("Sha256");
  8212. wc_Sha256GetHash(&ssl->hsHashes->hashSha256, digest);
  8213. WOLFSSL_BUFFER(digest, WC_SHA256_DIGEST_SIZE);
  8214. #endif
  8215. #endif
  8216. #ifdef WOLFSSL_SHA384
  8217. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
  8218. if (ret != 0)
  8219. return ret;
  8220. #ifdef WOLFSSL_DEBUG_TLS
  8221. WOLFSSL_MSG("Sha384");
  8222. wc_Sha384GetHash(&ssl->hsHashes->hashSha384, digest);
  8223. WOLFSSL_BUFFER(digest, WC_SHA384_DIGEST_SIZE);
  8224. #endif
  8225. #endif
  8226. #ifdef WOLFSSL_SHA512
  8227. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
  8228. if (ret != 0)
  8229. return ret;
  8230. #ifdef WOLFSSL_DEBUG_TLS
  8231. WOLFSSL_MSG("Sha512");
  8232. wc_Sha512GetHash(&ssl->hsHashes->hashSha512, digest);
  8233. WOLFSSL_BUFFER(digest, WC_SHA512_DIGEST_SIZE);
  8234. #endif
  8235. #endif
  8236. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  8237. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  8238. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  8239. ret = EdDSA_Update(ssl, data, sz);
  8240. if (ret != 0)
  8241. return ret;
  8242. #endif
  8243. }
  8244. return ret;
  8245. }
  8246. /* add output to md5 and sha handshake hashes, exclude record header */
  8247. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  8248. {
  8249. const byte* adj;
  8250. if (ssl->hsHashes == NULL)
  8251. return BAD_FUNC_ARG;
  8252. adj = output + RECORD_HEADER_SZ + ivSz;
  8253. sz -= RECORD_HEADER_SZ;
  8254. #ifdef HAVE_FUZZER
  8255. if (ssl->fuzzerCb)
  8256. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  8257. #endif
  8258. #ifdef WOLFSSL_DTLS
  8259. if (ssl->options.dtls) {
  8260. if (IsAtLeastTLSv1_3(ssl->version)) {
  8261. #ifdef WOLFSSL_DTLS13
  8262. word16 dtls_record_extra;
  8263. dtls_record_extra = Dtls13GetRlHeaderLength(ssl, (byte)IsEncryptionOn(ssl, 1));
  8264. dtls_record_extra -= RECORD_HEADER_SZ;
  8265. adj += dtls_record_extra;
  8266. sz -= dtls_record_extra;
  8267. #endif /* WOLFSSL_DTLS13 */
  8268. } else {
  8269. adj += DTLS_RECORD_EXTRA;
  8270. sz -= DTLS_RECORD_EXTRA;
  8271. }
  8272. }
  8273. #endif
  8274. return HashRaw(ssl, adj, sz);
  8275. }
  8276. /* add input to md5 and sha handshake hashes, include handshake header */
  8277. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  8278. {
  8279. const byte* adj;
  8280. if (ssl->hsHashes == NULL) {
  8281. return BAD_FUNC_ARG;
  8282. }
  8283. adj = input - HANDSHAKE_HEADER_SZ;
  8284. sz += HANDSHAKE_HEADER_SZ;
  8285. #ifdef WOLFSSL_DTLS
  8286. if (ssl->options.dtls) {
  8287. adj -= DTLS_HANDSHAKE_EXTRA;
  8288. sz += DTLS_HANDSHAKE_EXTRA;
  8289. #ifdef WOLFSSL_DTLS13
  8290. if (IsAtLeastTLSv1_3(ssl->version))
  8291. return Dtls13HashHandshake(ssl, adj, (word16)sz);
  8292. #endif /* WOLFSSL_DTLS13 */
  8293. }
  8294. #endif
  8295. return HashRaw(ssl, adj, sz);
  8296. }
  8297. /* add record layer header for message */
  8298. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
  8299. {
  8300. RecordLayerHeader* rl;
  8301. (void)epochOrder;
  8302. /* record layer header */
  8303. rl = (RecordLayerHeader*)output;
  8304. if (rl == NULL) {
  8305. return;
  8306. }
  8307. rl->type = type;
  8308. rl->pvMajor = ssl->version.major; /* type and version same in each */
  8309. #ifdef WOLFSSL_TLS13
  8310. if (IsAtLeastTLSv1_3(ssl->version)) {
  8311. rl->pvMinor = TLSv1_2_MINOR;
  8312. }
  8313. else
  8314. #endif
  8315. rl->pvMinor = ssl->version.minor;
  8316. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  8317. if (ssl->options.side == WOLFSSL_CLIENT_END
  8318. && ssl->options.connectState == CONNECT_BEGIN
  8319. && !ssl->options.resuming) {
  8320. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  8321. : ssl->version.minor;
  8322. }
  8323. #endif
  8324. if (!ssl->options.dtls) {
  8325. c16toa((word16)length, rl->length);
  8326. }
  8327. else {
  8328. #ifdef WOLFSSL_DTLS
  8329. DtlsRecordLayerHeader* dtls;
  8330. /* dtls record layer header extensions */
  8331. dtls = (DtlsRecordLayerHeader*)output;
  8332. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  8333. c16toa((word16)length, dtls->length);
  8334. #endif
  8335. }
  8336. }
  8337. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  8338. !defined(NO_WOLFSSL_SERVER))
  8339. /* add handshake header for message */
  8340. static void AddHandShakeHeader(byte* output, word32 length,
  8341. word32 fragOffset, word32 fragLength,
  8342. byte type, WOLFSSL* ssl)
  8343. {
  8344. HandShakeHeader* hs;
  8345. (void)fragOffset;
  8346. (void)fragLength;
  8347. (void)ssl;
  8348. /* handshake header */
  8349. hs = (HandShakeHeader*)output;
  8350. if (hs == NULL)
  8351. return;
  8352. hs->type = type;
  8353. c32to24(length, hs->length); /* type and length same for each */
  8354. #ifdef WOLFSSL_DTLS
  8355. if (ssl->options.dtls) {
  8356. DtlsHandShakeHeader* dtls;
  8357. /* dtls handshake header extensions */
  8358. dtls = (DtlsHandShakeHeader*)output;
  8359. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  8360. c32to24(fragOffset, dtls->fragment_offset);
  8361. c32to24(fragLength, dtls->fragment_length);
  8362. }
  8363. #endif
  8364. }
  8365. /* add both headers for handshake message */
  8366. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  8367. {
  8368. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  8369. word32 outputAdj = RECORD_HEADER_SZ;
  8370. #ifdef WOLFSSL_DTLS
  8371. if (ssl->options.dtls) {
  8372. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  8373. outputAdj += DTLS_RECORD_EXTRA;
  8374. }
  8375. #endif
  8376. AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
  8377. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  8378. }
  8379. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  8380. #ifndef WOLFSSL_NO_TLS12
  8381. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
  8382. !defined(WOLFSSL_NO_CLIENT_AUTH)) || \
  8383. defined(WOLFSSL_DTLS)
  8384. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  8385. word32 length, byte type, WOLFSSL* ssl)
  8386. {
  8387. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  8388. word32 outputAdj = RECORD_HEADER_SZ;
  8389. (void)fragSz;
  8390. #ifdef WOLFSSL_DTLS
  8391. if (ssl->options.dtls) {
  8392. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  8393. outputAdj += DTLS_RECORD_EXTRA;
  8394. }
  8395. #endif
  8396. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
  8397. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  8398. }
  8399. #endif /* NO_CERTS */
  8400. #if !defined(NO_WOLFSSL_SERVER) || \
  8401. (!defined(NO_WOLFSSL_CLIENT) && !defined(NO_CERTS) && \
  8402. !defined(WOLFSSL_NO_CLIENT_AUTH))
  8403. /**
  8404. * Send the handshake message. This function handles fragmenting the message
  8405. * so that it will fit into the desired MTU or the max fragment size.
  8406. * @param ssl Connection object
  8407. * @param input Input starting at the record layer header. This function
  8408. * assumes that the appropriate record and handshake headers
  8409. * are present. These headers must assume no fragmentation.
  8410. * That is handled here.
  8411. * @param inputSz Length of message excluding headers (this is the total
  8412. * length of all fragments)
  8413. * @param type Type of message being sent
  8414. * @return 0 on success and negative otherwise
  8415. */
  8416. static int SendHandshakeMsg(WOLFSSL* ssl, byte* input, word32 inputSz,
  8417. enum HandShakeType type, const char* packetName)
  8418. {
  8419. int maxFrag;
  8420. int ret = 0;
  8421. int headerSz;
  8422. WOLFSSL_ENTER("SendHandshakeMsg");
  8423. (void)type;
  8424. (void)packetName;
  8425. if (ssl == NULL || input == NULL)
  8426. return BAD_FUNC_ARG;
  8427. #ifdef WOLFSSL_DTLS
  8428. if (ssl->options.dtls)
  8429. headerSz = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  8430. else
  8431. #endif
  8432. {
  8433. /* In TLS we send one handshake header in total, not one
  8434. * per fragment like in DTLS. The handshake header should
  8435. * already be in the input buffer. */
  8436. inputSz += HANDSHAKE_HEADER_SZ;
  8437. headerSz = RECORD_HEADER_SZ;
  8438. }
  8439. maxFrag = wolfSSL_GetMaxFragSize(ssl, (int)inputSz);
  8440. /* Make sure input is not the ssl output buffer as this
  8441. * function doesn't handle that */
  8442. if (input >= ssl->buffers.outputBuffer.buffer &&
  8443. input < ssl->buffers.outputBuffer.buffer +
  8444. ssl->buffers.outputBuffer.bufferSize) {
  8445. WOLFSSL_MSG("Can't use output buffer for input in SendHandshakeMsg");
  8446. return BAD_FUNC_ARG;
  8447. }
  8448. if (!ssl->options.buildingMsg) {
  8449. /* Hash it before the loop as we modify the input with
  8450. * encryption on */
  8451. ret = HashOutput(ssl, input, headerSz + (int)inputSz, 0);
  8452. if (ret != 0)
  8453. return ret;
  8454. #ifdef WOLFSSL_DTLS
  8455. /* Decrement msg number so that we continue to use the
  8456. * same msg number for this msg */
  8457. if (ssl->options.dtls)
  8458. ssl->keys.dtls_handshake_number--;
  8459. #endif
  8460. }
  8461. while (ssl->fragOffset < inputSz) {
  8462. byte* output;
  8463. int outputSz;
  8464. byte* data = input + ssl->fragOffset + headerSz;
  8465. word32 fragSz = (word32)maxFrag;
  8466. ssl->options.buildingMsg = 1;
  8467. if (inputSz - ssl->fragOffset < fragSz)
  8468. fragSz = inputSz - ssl->fragOffset;
  8469. /* check for available size */
  8470. outputSz = headerSz + fragSz;
  8471. if (IsEncryptionOn(ssl, 1))
  8472. outputSz += cipherExtraData(ssl);
  8473. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  8474. return ret;
  8475. if (ssl->buffers.outputBuffer.buffer == NULL)
  8476. return MEMORY_E;
  8477. output = ssl->buffers.outputBuffer.buffer +
  8478. ssl->buffers.outputBuffer.length;
  8479. if (IsEncryptionOn(ssl, 1)) {
  8480. /* First we need to add the fragment header ourselves.
  8481. * We do this in the input to minimize allocations */
  8482. int dataSz = (int)fragSz;
  8483. #ifdef WOLFSSL_DTLS
  8484. if (ssl->options.dtls) {
  8485. data -= DTLS_HANDSHAKE_HEADER_SZ;
  8486. dataSz += DTLS_HANDSHAKE_HEADER_SZ;
  8487. AddHandShakeHeader(data, inputSz, ssl->fragOffset, fragSz,
  8488. type, ssl);
  8489. ssl->keys.dtls_handshake_number--;
  8490. }
  8491. if (IsDtlsNotSctpMode(ssl) &&
  8492. (ret = DtlsMsgPoolSave(ssl, data,
  8493. fragSz + DTLS_HANDSHAKE_HEADER_SZ, type))
  8494. != 0)
  8495. return ret;
  8496. #endif
  8497. ret = BuildMessage(ssl, output, outputSz,
  8498. data, dataSz, handshake, 0, 0, 0, CUR_ORDER);
  8499. if (ret >= 0)
  8500. outputSz = ret;
  8501. else
  8502. return ret;
  8503. ret = 0;
  8504. }
  8505. else {
  8506. #ifdef WOLFSSL_DTLS
  8507. if (ssl->options.dtls)
  8508. AddFragHeaders(output, fragSz, ssl->fragOffset,
  8509. inputSz, type, ssl);
  8510. else
  8511. #endif
  8512. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  8513. XMEMCPY(output + headerSz, data, fragSz);
  8514. #ifdef WOLFSSL_DTLS
  8515. if (ssl->options.dtls) {
  8516. ssl->keys.dtls_handshake_number--;
  8517. DtlsSEQIncrement(ssl, CUR_ORDER);
  8518. }
  8519. if (IsDtlsNotSctpMode(ssl)) {
  8520. if ((ret = DtlsMsgPoolSave(ssl, output, headerSz + fragSz,
  8521. type)) != 0) {
  8522. return ret;
  8523. }
  8524. }
  8525. #endif
  8526. }
  8527. ssl->buffers.outputBuffer.length += outputSz;
  8528. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  8529. if (ssl->hsInfoOn) {
  8530. AddPacketName(ssl, packetName);
  8531. }
  8532. if (ssl->toInfoOn) {
  8533. ret = AddPacketInfo(ssl, packetName, handshake,
  8534. output, outputSz, WRITE_PROTO, 0, ssl->heap);
  8535. if (ret != 0)
  8536. return ret;
  8537. }
  8538. #endif
  8539. ssl->fragOffset += fragSz;
  8540. if (!ssl->options.groupMessages)
  8541. ret = SendBuffered(ssl);
  8542. if (ret != 0)
  8543. return ret;
  8544. }
  8545. #ifdef WOLFSSL_DTLS
  8546. /* Increment msg number once we sent all fragments */
  8547. if (ssl->options.dtls)
  8548. ssl->keys.dtls_handshake_number++;
  8549. #endif
  8550. ssl->fragOffset = 0;
  8551. ssl->options.buildingMsg = 0;
  8552. return ret;
  8553. }
  8554. #endif /* !NO_WOLFSSL_SERVER || (!NO_WOLFSSL_CLIENT && !NO_CERTS &&
  8555. * !WOLFSSL_NO_CLIENT_AUTH) */
  8556. #endif /* !WOLFSSL_NO_TLS12 */
  8557. /* return bytes received, -1 on error */
  8558. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  8559. {
  8560. int recvd;
  8561. int retryLimit = WOLFSSL_MODE_AUTO_RETRY_ATTEMPTS;
  8562. #ifdef WOLFSSL_QUIC
  8563. if (WOLFSSL_IS_QUIC(ssl)) {
  8564. /* QUIC only "reads" from data provided by the application
  8565. * via wolfSSL_provide_quic_data(). Transfer from there
  8566. * into the inputBuffer. */
  8567. return wolfSSL_quic_receive(ssl, buf, sz);
  8568. }
  8569. #endif
  8570. if (ssl->CBIORecv == NULL) {
  8571. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  8572. return -1;
  8573. }
  8574. retry:
  8575. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  8576. if (recvd < 0) {
  8577. switch (recvd) {
  8578. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  8579. #ifdef WOLFSSL_APACHE_HTTPD
  8580. #ifndef NO_BIO
  8581. if (ssl->biord) {
  8582. /* If retry and read flags are set, return WANT_READ */
  8583. if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
  8584. (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
  8585. return WANT_READ;
  8586. }
  8587. }
  8588. #endif
  8589. #endif
  8590. return -1;
  8591. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  8592. if (retryLimit > 0 && ssl->ctx->autoRetry &&
  8593. !ssl->options.handShakeDone && !ssl->options.dtls) {
  8594. retryLimit--;
  8595. goto retry;
  8596. }
  8597. return WANT_READ;
  8598. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  8599. #ifdef USE_WINDOWS_API
  8600. if (ssl->options.dtls) {
  8601. goto retry;
  8602. }
  8603. #endif
  8604. ssl->options.connReset = 1;
  8605. return -1;
  8606. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  8607. /* see if we got our timeout */
  8608. #ifdef WOLFSSL_CALLBACKS
  8609. if (ssl->toInfoOn) {
  8610. struct itimerval timeout;
  8611. getitimer(ITIMER_REAL, &timeout);
  8612. if (timeout.it_value.tv_sec == 0 &&
  8613. timeout.it_value.tv_usec == 0) {
  8614. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  8615. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  8616. ssl->timeoutInfo.timeoutName[
  8617. MAX_TIMEOUT_NAME_SZ] = '\0';
  8618. WOLFSSL_MSG("Got our timeout");
  8619. return WANT_READ;
  8620. }
  8621. }
  8622. #endif
  8623. goto retry;
  8624. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  8625. ssl->options.isClosed = 1;
  8626. return -1;
  8627. case WOLFSSL_CBIO_ERR_TIMEOUT:
  8628. #ifdef WOLFSSL_DTLS
  8629. #ifdef WOLFSSL_DTLS13
  8630. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  8631. /* TODO: support WANT_WRITE here */
  8632. if (Dtls13RtxTimeout(ssl) < 0) {
  8633. WOLFSSL_MSG(
  8634. "Error trying to retransmit DTLS buffered message");
  8635. return -1;
  8636. }
  8637. goto retry;
  8638. }
  8639. #endif /* WOLFSSL_DTLS13 */
  8640. if (IsDtlsNotSctpMode(ssl) &&
  8641. ssl->options.handShakeState != HANDSHAKE_DONE &&
  8642. DtlsMsgPoolTimeout(ssl) == 0 &&
  8643. DtlsMsgPoolSend(ssl, 0) == 0) {
  8644. /* retry read for DTLS during handshake only */
  8645. goto retry;
  8646. }
  8647. #endif
  8648. return -1;
  8649. default:
  8650. WOLFSSL_MSG("Unexpected recv return code");
  8651. return recvd;
  8652. }
  8653. }
  8654. return recvd;
  8655. }
  8656. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  8657. void ShrinkOutputBuffer(WOLFSSL* ssl)
  8658. {
  8659. WOLFSSL_MSG("Shrinking output buffer");
  8660. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  8661. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  8662. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  8663. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  8664. ssl->buffers.outputBuffer.dynamicFlag = 0;
  8665. ssl->buffers.outputBuffer.offset = 0;
  8666. }
  8667. /* Switch dynamic input buffer back to static, keep any remaining input */
  8668. /* forced free means cleaning up */
  8669. /* Be *CAREFUL* where this function is called. ProcessReply relies on
  8670. * inputBuffer.idx *NOT* changing inside the ProcessReply function. ProcessReply
  8671. * calls ShrinkInputBuffer itself when it is safe to do so. Don't overuse it. */
  8672. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  8673. {
  8674. int usedLength = ssl->buffers.inputBuffer.length -
  8675. ssl->buffers.inputBuffer.idx;
  8676. if (!forcedFree && (usedLength > STATIC_BUFFER_LEN ||
  8677. ssl->buffers.clearOutputBuffer.length > 0))
  8678. return;
  8679. WOLFSSL_MSG("Shrinking input buffer");
  8680. if (!forcedFree && usedLength > 0) {
  8681. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  8682. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  8683. usedLength);
  8684. }
  8685. ForceZero(ssl->buffers.inputBuffer.buffer -
  8686. ssl->buffers.inputBuffer.offset,
  8687. ssl->buffers.inputBuffer.bufferSize);
  8688. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  8689. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  8690. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  8691. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  8692. ssl->buffers.inputBuffer.dynamicFlag = 0;
  8693. ssl->buffers.inputBuffer.offset = 0;
  8694. ssl->buffers.inputBuffer.idx = 0;
  8695. ssl->buffers.inputBuffer.length = usedLength;
  8696. }
  8697. int SendBuffered(WOLFSSL* ssl)
  8698. {
  8699. if (ssl->CBIOSend == NULL && !WOLFSSL_IS_QUIC(ssl)) {
  8700. WOLFSSL_MSG("Your IO Send callback is null, please set");
  8701. return SOCKET_ERROR_E;
  8702. }
  8703. #ifdef WOLFSSL_DEBUG_TLS
  8704. if (ssl->buffers.outputBuffer.idx == 0) {
  8705. WOLFSSL_MSG("Data to send");
  8706. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  8707. ssl->buffers.outputBuffer.length);
  8708. }
  8709. #endif
  8710. #ifdef WOLFSSL_QUIC
  8711. if (WOLFSSL_IS_QUIC(ssl)) {
  8712. return wolfSSL_quic_send(ssl);
  8713. }
  8714. #endif
  8715. while (ssl->buffers.outputBuffer.length > 0) {
  8716. int sent = ssl->CBIOSend(ssl,
  8717. (char*)ssl->buffers.outputBuffer.buffer +
  8718. ssl->buffers.outputBuffer.idx,
  8719. (int)ssl->buffers.outputBuffer.length,
  8720. ssl->IOCB_WriteCtx);
  8721. if (sent < 0) {
  8722. switch (sent) {
  8723. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  8724. return WANT_WRITE;
  8725. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  8726. ssl->options.connReset = 1;
  8727. break;
  8728. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  8729. /* see if we got our timeout */
  8730. #ifdef WOLFSSL_CALLBACKS
  8731. if (ssl->toInfoOn) {
  8732. struct itimerval timeout;
  8733. getitimer(ITIMER_REAL, &timeout);
  8734. if (timeout.it_value.tv_sec == 0 &&
  8735. timeout.it_value.tv_usec == 0) {
  8736. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  8737. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  8738. ssl->timeoutInfo.timeoutName[
  8739. MAX_TIMEOUT_NAME_SZ] = '\0';
  8740. WOLFSSL_MSG("Got our timeout");
  8741. return WANT_WRITE;
  8742. }
  8743. }
  8744. #endif
  8745. continue;
  8746. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  8747. ssl->options.connReset = 1; /* treat same as reset */
  8748. break;
  8749. default:
  8750. return SOCKET_ERROR_E;
  8751. }
  8752. return SOCKET_ERROR_E;
  8753. }
  8754. if (sent > (int)ssl->buffers.outputBuffer.length) {
  8755. WOLFSSL_MSG("SendBuffered() out of bounds read");
  8756. return SEND_OOB_READ_E;
  8757. }
  8758. ssl->buffers.outputBuffer.idx += sent;
  8759. ssl->buffers.outputBuffer.length -= sent;
  8760. }
  8761. ssl->buffers.outputBuffer.idx = 0;
  8762. if (ssl->buffers.outputBuffer.dynamicFlag)
  8763. ShrinkOutputBuffer(ssl);
  8764. return 0;
  8765. }
  8766. /* Grow the output buffer */
  8767. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  8768. {
  8769. byte* tmp;
  8770. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8771. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  8772. RECORD_HEADER_SZ;
  8773. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8774. #else
  8775. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8776. #endif
  8777. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8778. /* the encrypted data will be offset from the front of the buffer by
  8779. the header, if the user wants encrypted alignment they need
  8780. to define their alignment requirement */
  8781. while (align < hdrSz)
  8782. align *= 2;
  8783. #endif
  8784. tmp = (byte*)XMALLOC(size + ssl->buffers.outputBuffer.length + align,
  8785. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  8786. WOLFSSL_MSG("growing output buffer");
  8787. if (tmp == NULL)
  8788. return MEMORY_E;
  8789. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8790. if (align)
  8791. tmp += align - hdrSz;
  8792. #endif
  8793. #ifdef WOLFSSL_STATIC_MEMORY
  8794. /* can be from IO memory pool which does not need copy if same buffer */
  8795. if (ssl->buffers.outputBuffer.length &&
  8796. tmp == ssl->buffers.outputBuffer.buffer) {
  8797. ssl->buffers.outputBuffer.bufferSize =
  8798. size + ssl->buffers.outputBuffer.length;
  8799. return 0;
  8800. }
  8801. #endif
  8802. if (ssl->buffers.outputBuffer.length)
  8803. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  8804. ssl->buffers.outputBuffer.length);
  8805. if (ssl->buffers.outputBuffer.dynamicFlag) {
  8806. XFREE(ssl->buffers.outputBuffer.buffer -
  8807. ssl->buffers.outputBuffer.offset, ssl->heap,
  8808. DYNAMIC_TYPE_OUT_BUFFER);
  8809. }
  8810. ssl->buffers.outputBuffer.dynamicFlag = 1;
  8811. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8812. if (align)
  8813. ssl->buffers.outputBuffer.offset = align - hdrSz;
  8814. else
  8815. #endif
  8816. ssl->buffers.outputBuffer.offset = 0;
  8817. ssl->buffers.outputBuffer.buffer = tmp;
  8818. ssl->buffers.outputBuffer.bufferSize = size +
  8819. ssl->buffers.outputBuffer.length;
  8820. return 0;
  8821. }
  8822. /* Grow the input buffer, should only be to read cert or big app data */
  8823. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  8824. {
  8825. byte* tmp;
  8826. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8827. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  8828. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  8829. #else
  8830. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8831. #endif
  8832. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8833. /* the encrypted data will be offset from the front of the buffer by
  8834. the dtls record header, if the user wants encrypted alignment they need
  8835. to define their alignment requirement. in tls we read record header
  8836. to get size of record and put actual data back at front, so don't need */
  8837. if (align) {
  8838. while (align < hdrSz)
  8839. align *= 2;
  8840. }
  8841. #endif
  8842. if (usedLength < 0 || size < 0) {
  8843. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  8844. return BAD_FUNC_ARG;
  8845. }
  8846. tmp = (byte*)XMALLOC(size + usedLength + align,
  8847. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  8848. WOLFSSL_MSG("growing input buffer");
  8849. if (tmp == NULL)
  8850. return MEMORY_E;
  8851. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8852. if (align)
  8853. tmp += align - hdrSz;
  8854. #endif
  8855. #ifdef WOLFSSL_STATIC_MEMORY
  8856. /* can be from IO memory pool which does not need copy if same buffer */
  8857. if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
  8858. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  8859. ssl->buffers.inputBuffer.idx = 0;
  8860. ssl->buffers.inputBuffer.length = usedLength;
  8861. return 0;
  8862. }
  8863. #endif
  8864. if (usedLength)
  8865. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  8866. ssl->buffers.inputBuffer.idx, usedLength);
  8867. if (ssl->buffers.inputBuffer.dynamicFlag) {
  8868. if (IsEncryptionOn(ssl, 1)) {
  8869. ForceZero(ssl->buffers.inputBuffer.buffer -
  8870. ssl->buffers.inputBuffer.offset,
  8871. ssl->buffers.inputBuffer.bufferSize);
  8872. }
  8873. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  8874. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  8875. }
  8876. ssl->buffers.inputBuffer.dynamicFlag = 1;
  8877. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8878. if (align)
  8879. ssl->buffers.inputBuffer.offset = align - hdrSz;
  8880. else
  8881. #endif
  8882. ssl->buffers.inputBuffer.offset = 0;
  8883. ssl->buffers.inputBuffer.buffer = tmp;
  8884. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  8885. ssl->buffers.inputBuffer.idx = 0;
  8886. ssl->buffers.inputBuffer.length = usedLength;
  8887. return 0;
  8888. }
  8889. /* Check available size into output buffer, make room if needed.
  8890. * This function needs to be called before anything gets put
  8891. * into the output buffers since it flushes pending data if it
  8892. * predicts that the msg will exceed MTU. */
  8893. int CheckAvailableSize(WOLFSSL *ssl, int size)
  8894. {
  8895. if (size < 0) {
  8896. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  8897. return BAD_FUNC_ARG;
  8898. }
  8899. #ifdef WOLFSSL_DTLS
  8900. if (ssl->options.dtls) {
  8901. if (size + ssl->buffers.outputBuffer.length -
  8902. ssl->buffers.outputBuffer.idx >
  8903. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  8904. ssl->dtlsMtuSz
  8905. #else
  8906. ssl->dtls_expected_rx
  8907. #endif
  8908. ) {
  8909. int ret;
  8910. WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
  8911. "to make room for new message");
  8912. if ((ret = SendBuffered(ssl)) != 0) {
  8913. return ret;
  8914. }
  8915. }
  8916. if (size > (int)
  8917. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  8918. ssl->dtlsMtuSz
  8919. #else
  8920. ssl->dtls_expected_rx
  8921. #endif
  8922. #ifdef WOLFSSL_DTLS13
  8923. /* DTLS1.3 uses the output buffer to store the full message and deal
  8924. with fragmentation later in dtls13HandshakeSend() */
  8925. && !IsAtLeastTLSv1_3(ssl->version)
  8926. #endif /* WOLFSSL_DTLS13 */
  8927. ) {
  8928. WOLFSSL_MSG("CheckAvailableSize() called with size greater than MTU.");
  8929. return DTLS_SIZE_ERROR;
  8930. }
  8931. }
  8932. #endif
  8933. if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
  8934. < (word32)size) {
  8935. if (GrowOutputBuffer(ssl, size) < 0)
  8936. return MEMORY_E;
  8937. }
  8938. return 0;
  8939. }
  8940. #ifdef WOLFSSL_DTLS13
  8941. static int GetInputData(WOLFSSL *ssl, word32 size);
  8942. static int GetDtls13RecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  8943. RecordLayerHeader* rh, word16* size)
  8944. {
  8945. Dtls13UnifiedHdrInfo hdrInfo;
  8946. w64wrapper epochNumber;
  8947. byte epochBits;
  8948. int readSize;
  8949. int ret;
  8950. readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
  8951. if (readSize < DTLS_UNIFIED_HEADER_MIN_SZ)
  8952. return BUFFER_ERROR;
  8953. epochBits = *(ssl->buffers.inputBuffer.buffer + *inOutIdx) & EE_MASK;
  8954. ret = Dtls13ReconstructEpochNumber(ssl, epochBits, &epochNumber);
  8955. if (ret != 0)
  8956. return ret;
  8957. #ifdef WOLFSSL_DEBUG_TLS
  8958. WOLFSSL_MSG_EX("reconstructed epoch number: %ld",
  8959. epochNumber);
  8960. #endif /* WOLFSSL_DEBUG_TLS */
  8961. /* protected records always use unified_headers in DTLSv1.3 */
  8962. if (w64IsZero(epochNumber))
  8963. return SEQUENCE_ERROR;
  8964. if (ssl->dtls13DecryptEpoch == NULL)
  8965. return BAD_STATE_E;
  8966. #ifdef WOLFSSL_EARLY_DATA
  8967. if (w64Equal(epochNumber, w64From32(0x0, DTLS13_EPOCH_EARLYDATA)) &&
  8968. ssl->options.handShakeDone) {
  8969. WOLFSSL_MSG("discarding early data after handshake");
  8970. return SEQUENCE_ERROR;
  8971. }
  8972. #endif /* WOLFSSL_DTLS13 */
  8973. if (!w64Equal(ssl->dtls13DecryptEpoch->epochNumber, epochNumber)) {
  8974. ret = Dtls13SetEpochKeys(ssl, epochNumber, DECRYPT_SIDE_ONLY);
  8975. if (ret != 0)
  8976. return SEQUENCE_ERROR;
  8977. }
  8978. ret = Dtls13GetUnifiedHeaderSize(ssl,
  8979. *(ssl->buffers.inputBuffer.buffer+*inOutIdx), &ssl->dtls13CurRlLength);
  8980. if (ret != 0)
  8981. return ret;
  8982. if (readSize < ssl->dtls13CurRlLength + DTLS13_RN_MASK_SIZE) {
  8983. /* when using DTLS over a medium that does not guarantee that a full
  8984. * message is received in a single read, we may end up without the full
  8985. * header and minimum ciphertext to decrypt record sequence numbers */
  8986. ret = GetInputData(ssl, ssl->dtls13CurRlLength + DTLS13_RN_MASK_SIZE);
  8987. if (ret != 0)
  8988. return ret;
  8989. readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
  8990. }
  8991. ret = Dtls13ParseUnifiedRecordLayer(ssl,
  8992. ssl->buffers.inputBuffer.buffer + *inOutIdx, (word16)readSize,
  8993. &hdrInfo);
  8994. if (ret != 0)
  8995. return ret;
  8996. *size = hdrInfo.recordLength;
  8997. c16toa(*size, rh->length);
  8998. /* type is implicit */
  8999. rh->type = application_data;
  9000. /* version is implicit */
  9001. rh->pvMajor = ssl->version.major;
  9002. rh->pvMinor = DTLSv1_2_MINOR;
  9003. ssl->keys.curEpoch64 = epochNumber;
  9004. ret = Dtls13ReconstructSeqNumber(ssl, &hdrInfo, &ssl->keys.curSeq);
  9005. if (ret != 0)
  9006. return ret;
  9007. #ifdef WOLFSSL_DEBUG_TLS
  9008. WOLFSSL_MSG_EX("reconstructed seq number: %ld",
  9009. ssl->keys.curSeq);
  9010. #endif /* WOLFSSL_DEBUG_TLS */
  9011. XMEMCPY(ssl->dtls13CurRL, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9012. ssl->dtls13CurRlLength);
  9013. *inOutIdx += ssl->dtls13CurRlLength;
  9014. return 0;
  9015. }
  9016. #endif /* WOLFSSL_DTLS13 */
  9017. #ifdef WOLFSSL_DTLS
  9018. static int GetDtlsRecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9019. RecordLayerHeader* rh, word16* size)
  9020. {
  9021. #ifdef HAVE_FUZZER
  9022. if (ssl->fuzzerCb)
  9023. ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9024. DTLS_RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx);
  9025. #endif
  9026. #ifdef WOLFSSL_DTLS13
  9027. int ret;
  9028. if (Dtls13IsUnifiedHeader(*(ssl->buffers.inputBuffer.buffer + *inOutIdx))) {
  9029. /* version 1.3 already negotiated */
  9030. if (ssl->options.tls1_3) {
  9031. ret = GetDtls13RecordHeader(ssl, inOutIdx, rh, size);
  9032. if (ret == 0 || ret != SEQUENCE_ERROR || ret != DTLS_CID_ERROR)
  9033. return ret;
  9034. }
  9035. #ifndef NO_WOLFSSL_CLIENT
  9036. if (ssl->options.side == WOLFSSL_CLIENT_END
  9037. && ssl->options.serverState < SERVER_HELLO_COMPLETE
  9038. && IsAtLeastTLSv1_3(ssl->version)
  9039. && !ssl->options.handShakeDone) {
  9040. /* we may have lost ServerHello. Try to send a empty ACK to shortcut
  9041. Server retransmission timer */
  9042. ssl->dtls13Rtx.sendAcks = 1;
  9043. }
  9044. #endif
  9045. return SEQUENCE_ERROR;
  9046. }
  9047. /* not a unified header, check that we have at least
  9048. * DTLS_RECORD_HEADER_SZ */
  9049. if (ssl->buffers.inputBuffer.length - *inOutIdx < DTLS_RECORD_HEADER_SZ) {
  9050. ret = GetInputData(ssl, DTLS_RECORD_HEADER_SZ);
  9051. if (ret != 0)
  9052. return LENGTH_ERROR;
  9053. }
  9054. #endif /* WOLFSSL_DTLS13 */
  9055. /* type and version in same spot */
  9056. XMEMCPY(rh, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9057. ENUM_LEN + VERSION_SZ);
  9058. *inOutIdx += ENUM_LEN + VERSION_SZ;
  9059. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curEpoch);
  9060. #ifdef WOLFSSL_DTLS13
  9061. /* only non protected message can use the DTLSPlaintext record header */
  9062. if (ssl->options.tls1_3 && ssl->keys.curEpoch != 0)
  9063. return SEQUENCE_ERROR;
  9064. w64Zero(&ssl->keys.curEpoch64);
  9065. if (!w64IsZero(ssl->dtls13DecryptEpoch->epochNumber))
  9066. Dtls13SetEpochKeys(ssl, ssl->keys.curEpoch64, DECRYPT_SIDE_ONLY);
  9067. #endif /* WOLFSSL_DTLS13 */
  9068. *inOutIdx += OPAQUE16_LEN;
  9069. if (ssl->options.haveMcast) {
  9070. #ifdef WOLFSSL_MULTICAST
  9071. ssl->keys.curPeerId = ssl->buffers.inputBuffer.buffer[*inOutIdx];
  9072. ssl->keys.curSeq_hi = ssl->buffers.inputBuffer.buffer[*inOutIdx+1];
  9073. #endif
  9074. }
  9075. else
  9076. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curSeq_hi);
  9077. *inOutIdx += OPAQUE16_LEN;
  9078. ato32(ssl->buffers.inputBuffer.buffer + *inOutIdx, &ssl->keys.curSeq_lo);
  9079. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  9080. #ifdef WOLFSSL_DTLS13
  9081. /* DTLSv1.3 PlainText records use DTLSv1.2 sequence number encoding. Update
  9082. the DTLv1.3 word64 version as well */
  9083. ssl->keys.curSeq = w64From32(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo);
  9084. #endif /* WOLFSSL_DTLS13 */
  9085. ato16(ssl->buffers.inputBuffer.buffer + *inOutIdx, size);
  9086. *inOutIdx += LENGTH_SZ;
  9087. return 0;
  9088. }
  9089. #endif /* WOLFSSL_DTLS */
  9090. /* do all verify and sanity checks on record header */
  9091. static int GetRecordHeader(WOLFSSL* ssl, word32* inOutIdx,
  9092. RecordLayerHeader* rh, word16 *size)
  9093. {
  9094. byte tls12minor;
  9095. #ifdef WOLFSSL_DTLS
  9096. int ret;
  9097. #endif /* WOLFSSL_DTLS */
  9098. #ifdef OPENSSL_ALL
  9099. word32 start = *inOutIdx;
  9100. #endif
  9101. (void)tls12minor;
  9102. if (!ssl->options.dtls) {
  9103. #ifdef HAVE_FUZZER
  9104. if (ssl->fuzzerCb)
  9105. ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx,
  9106. RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx);
  9107. #endif
  9108. XMEMCPY(rh, ssl->buffers.inputBuffer.buffer + *inOutIdx, RECORD_HEADER_SZ);
  9109. *inOutIdx += RECORD_HEADER_SZ;
  9110. ato16(rh->length, size);
  9111. }
  9112. else {
  9113. #ifdef WOLFSSL_DTLS
  9114. ret = GetDtlsRecordHeader(ssl, inOutIdx, rh, size);
  9115. if (ret != 0)
  9116. return ret;
  9117. #endif
  9118. }
  9119. #ifdef WOLFSSL_DTLS
  9120. /* DTLSv1.3 MUST check window after deprotecting to avoid timing channel
  9121. (RFC9147 Section 4.5.1) */
  9122. if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) {
  9123. if (!_DtlsCheckWindow(ssl) ||
  9124. (rh->type == application_data && ssl->keys.curEpoch == 0) ||
  9125. (rh->type == alert && ssl->options.handShakeDone &&
  9126. ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
  9127. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  9128. return SEQUENCE_ERROR;
  9129. }
  9130. }
  9131. #endif
  9132. #if defined(WOLFSSL_DTLS13) || defined(WOLFSSL_TLS13)
  9133. tls12minor = TLSv1_2_MINOR;
  9134. #endif
  9135. #ifdef WOLFSSL_DTLS13
  9136. if (ssl->options.dtls)
  9137. tls12minor = DTLSv1_2_MINOR;
  9138. #endif /* WOLFSSL_DTLS13 */
  9139. /* catch version mismatch */
  9140. #ifndef WOLFSSL_TLS13
  9141. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  9142. #else
  9143. if (rh->pvMajor != ssl->version.major ||
  9144. (rh->pvMinor != ssl->version.minor &&
  9145. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != tls12minor)
  9146. ))
  9147. #endif
  9148. {
  9149. if (ssl->options.side == WOLFSSL_SERVER_END &&
  9150. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  9151. WOLFSSL_MSG("Client attempting to connect with different version");
  9152. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  9153. ssl->options.downgrade &&
  9154. ssl->options.connectState < FIRST_REPLY_DONE)
  9155. WOLFSSL_MSG("Server attempting to accept with different version");
  9156. else if (ssl->options.dtls && rh->type == handshake)
  9157. /* Check the DTLS handshake message RH version later. */
  9158. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  9159. #ifdef WOLFSSL_DTLS13
  9160. else if (ssl->options.dtls && !ssl->options.handShakeDone) {
  9161. /* we may have lost the ServerHello and this is a unified record
  9162. before version been negotiated */
  9163. if (Dtls13IsUnifiedHeader(*ssl->buffers.inputBuffer.buffer)) {
  9164. return SEQUENCE_ERROR;
  9165. }
  9166. }
  9167. #endif /* WOLFSSL_DTLS13 */
  9168. else {
  9169. WOLFSSL_MSG("SSL version error");
  9170. /* send alert per RFC5246 Appendix E. Backward Compatibility */
  9171. if (ssl->options.side == WOLFSSL_CLIENT_END)
  9172. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  9173. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  9174. return VERSION_ERROR; /* only use requested version */
  9175. }
  9176. }
  9177. /* record layer length check */
  9178. #ifdef HAVE_MAX_FRAGMENT
  9179. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  9180. SendAlert(ssl, alert_fatal, record_overflow);
  9181. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  9182. return LENGTH_ERROR;
  9183. }
  9184. #else
  9185. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  9186. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  9187. return LENGTH_ERROR;
  9188. }
  9189. #endif
  9190. if (*size == 0 && rh->type != application_data) {
  9191. WOLFSSL_MSG("0 length, non-app data record.");
  9192. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  9193. return LENGTH_ERROR;
  9194. }
  9195. /* verify record type here as well */
  9196. switch (rh->type) {
  9197. case handshake:
  9198. case change_cipher_spec:
  9199. case application_data:
  9200. case alert:
  9201. #ifdef WOLFSSL_DTLS13
  9202. case ack:
  9203. #endif /* WOLFSSL_DTLS13 */
  9204. break;
  9205. case no_type:
  9206. default:
  9207. #ifdef OPENSSL_ALL
  9208. if (!ssl->options.dtls) {
  9209. char *method = (char*)ssl->buffers.inputBuffer.buffer + start;
  9210. /* Attempt to identify if this is a plain HTTP request.
  9211. * No size checks because this function assumes at least
  9212. * RECORD_HEADER_SZ size of data has been read which is
  9213. * also the longest string comparison in this if. */
  9214. if (XSTRNCMP(method, "GET ", XSTR_SIZEOF("GET ")) == 0 ||
  9215. XSTRNCMP(method, "POST ", XSTR_SIZEOF("POST ")) == 0 ||
  9216. XSTRNCMP(method, "HEAD ", XSTR_SIZEOF("HEAD ")) == 0 ||
  9217. XSTRNCMP(method, "PUT ", XSTR_SIZEOF("PUT ")) == 0) {
  9218. WOLFSSL_MSG("Plain HTTP request detected");
  9219. return SSL_R_HTTP_REQUEST;
  9220. }
  9221. }
  9222. #endif
  9223. WOLFSSL_MSG("Unknown Record Type");
  9224. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  9225. return UNKNOWN_RECORD_TYPE;
  9226. }
  9227. /* haven't decrypted this record yet */
  9228. ssl->keys.decryptedCur = 0;
  9229. return 0;
  9230. }
  9231. #ifndef WOLFSSL_NO_TLS12
  9232. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  9233. byte *type, word32 *size, word32 totalSz)
  9234. {
  9235. const byte *ptr = input + *inOutIdx;
  9236. (void)ssl;
  9237. *inOutIdx += HANDSHAKE_HEADER_SZ;
  9238. if (*inOutIdx > totalSz)
  9239. return BUFFER_E;
  9240. *type = ptr[0];
  9241. c24to32(&ptr[1], size);
  9242. return 0;
  9243. }
  9244. #endif
  9245. #ifdef WOLFSSL_DTLS
  9246. int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  9247. word32* inOutIdx, byte *type, word32 *size,
  9248. word32 *fragOffset, word32 *fragSz,
  9249. word32 totalSz)
  9250. {
  9251. word32 idx = *inOutIdx;
  9252. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  9253. if (*inOutIdx > totalSz) {
  9254. WOLFSSL_ERROR(BUFFER_E);
  9255. return BUFFER_E;
  9256. }
  9257. *type = input[idx++];
  9258. c24to32(input + idx, size);
  9259. idx += OPAQUE24_LEN;
  9260. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  9261. idx += DTLS_HANDSHAKE_SEQ_SZ;
  9262. c24to32(input + idx, fragOffset);
  9263. idx += DTLS_HANDSHAKE_FRAG_SZ;
  9264. c24to32(input + idx, fragSz);
  9265. if ((ssl->curRL.pvMajor != ssl->version.major) ||
  9266. (!IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != ssl->version.minor) ||
  9267. (IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != DTLSv1_2_MINOR)
  9268. ) {
  9269. if (*type != client_hello && *type != hello_verify_request && *type != server_hello) {
  9270. WOLFSSL_ERROR(VERSION_ERROR);
  9271. return VERSION_ERROR;
  9272. }
  9273. else {
  9274. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  9275. }
  9276. }
  9277. return 0;
  9278. }
  9279. #endif
  9280. #if !defined(NO_OLD_TLS) || \
  9281. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  9282. /* fill with MD5 pad size since biggest required */
  9283. static const byte PAD1[PAD_MD5] =
  9284. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9285. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9286. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9287. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9288. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9289. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  9290. };
  9291. static const byte PAD2[PAD_MD5] =
  9292. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9293. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9294. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9295. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9296. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9297. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  9298. };
  9299. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  9300. #ifndef NO_OLD_TLS
  9301. /* calculate MD5 hash for finished */
  9302. #ifdef WOLFSSL_TI_HASH
  9303. #include <wolfssl/wolfcrypt/hash.h>
  9304. #endif
  9305. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9306. {
  9307. int ret;
  9308. byte md5_result[WC_MD5_DIGEST_SIZE];
  9309. #ifdef WOLFSSL_SMALL_STACK
  9310. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9311. if (md5 == NULL)
  9312. return MEMORY_E;
  9313. #else
  9314. wc_Md5 md5[1];
  9315. #endif
  9316. /* make md5 inner */
  9317. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  9318. if (ret == 0)
  9319. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  9320. if (ret == 0)
  9321. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  9322. if (ret == 0)
  9323. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  9324. if (ret == 0)
  9325. ret = wc_Md5Final(md5, md5_result);
  9326. /* make md5 outer */
  9327. if (ret == 0) {
  9328. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  9329. if (ret == 0) {
  9330. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  9331. if (ret == 0)
  9332. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  9333. if (ret == 0)
  9334. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  9335. if (ret == 0)
  9336. ret = wc_Md5Final(md5, hashes->md5);
  9337. wc_Md5Free(md5);
  9338. }
  9339. }
  9340. #ifdef WOLFSSL_SMALL_STACK
  9341. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9342. #endif
  9343. return ret;
  9344. }
  9345. /* calculate SHA hash for finished */
  9346. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9347. {
  9348. int ret;
  9349. byte sha_result[WC_SHA_DIGEST_SIZE];
  9350. #ifdef WOLFSSL_SMALL_STACK
  9351. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9352. if (sha == NULL)
  9353. return MEMORY_E;
  9354. #else
  9355. wc_Sha sha[1];
  9356. #endif
  9357. /* make sha inner */
  9358. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  9359. if (ret == 0)
  9360. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  9361. if (ret == 0)
  9362. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  9363. if (ret == 0)
  9364. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  9365. if (ret == 0)
  9366. ret = wc_ShaFinal(sha, sha_result);
  9367. /* make sha outer */
  9368. if (ret == 0) {
  9369. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  9370. if (ret == 0) {
  9371. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  9372. if (ret == 0)
  9373. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  9374. if (ret == 0)
  9375. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  9376. if (ret == 0)
  9377. ret = wc_ShaFinal(sha, hashes->sha);
  9378. wc_ShaFree(sha);
  9379. }
  9380. }
  9381. #ifdef WOLFSSL_SMALL_STACK
  9382. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9383. #endif
  9384. return ret;
  9385. }
  9386. #endif
  9387. #ifndef WOLFSSL_NO_TLS12
  9388. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  9389. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9390. {
  9391. int ret = 0;
  9392. if (ssl == NULL)
  9393. return BAD_FUNC_ARG;
  9394. #ifndef NO_TLS
  9395. if (ssl->options.tls) {
  9396. ret = BuildTlsFinished(ssl, hashes, sender);
  9397. }
  9398. #else
  9399. (void)hashes;
  9400. (void)sender;
  9401. #endif
  9402. #ifndef NO_OLD_TLS
  9403. if (!ssl->options.tls) {
  9404. ret = BuildMD5(ssl, hashes, sender);
  9405. if (ret == 0) {
  9406. ret = BuildSHA(ssl, hashes, sender);
  9407. }
  9408. }
  9409. #endif
  9410. return ret;
  9411. }
  9412. #endif /* WOLFSSL_NO_TLS12 */
  9413. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  9414. /* cipher requirements */
  9415. enum {
  9416. REQUIRES_RSA,
  9417. REQUIRES_DHE,
  9418. REQUIRES_ECC,
  9419. REQUIRES_ECC_STATIC,
  9420. REQUIRES_PSK,
  9421. REQUIRES_RSA_SIG,
  9422. REQUIRES_AEAD
  9423. };
  9424. /* Does this cipher suite (first, second) have the requirement
  9425. an ephemeral key exchange will still require the key for signing
  9426. the key exchange so ECDHE_RSA requires an rsa key thus rsa_kea */
  9427. static int CipherRequires(byte first, byte second, int requirement)
  9428. {
  9429. (void)requirement;
  9430. #ifndef WOLFSSL_NO_TLS12
  9431. #ifdef HAVE_CHACHA
  9432. if (first == CHACHA_BYTE) {
  9433. switch (second) {
  9434. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  9435. if (requirement == REQUIRES_RSA)
  9436. return 1;
  9437. break;
  9438. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  9439. if (requirement == REQUIRES_ECC)
  9440. return 1;
  9441. break;
  9442. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  9443. if (requirement == REQUIRES_RSA)
  9444. return 1;
  9445. if (requirement == REQUIRES_DHE)
  9446. return 1;
  9447. break;
  9448. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9449. if (requirement == REQUIRES_RSA)
  9450. return 1;
  9451. break;
  9452. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9453. if (requirement == REQUIRES_ECC)
  9454. return 1;
  9455. break;
  9456. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9457. if (requirement == REQUIRES_RSA)
  9458. return 1;
  9459. if (requirement == REQUIRES_DHE)
  9460. return 1;
  9461. break;
  9462. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9463. if (requirement == REQUIRES_PSK)
  9464. return 1;
  9465. break;
  9466. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9467. if (requirement == REQUIRES_PSK)
  9468. return 1;
  9469. break;
  9470. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9471. if (requirement == REQUIRES_PSK)
  9472. return 1;
  9473. if (requirement == REQUIRES_DHE)
  9474. return 1;
  9475. break;
  9476. }
  9477. if (requirement == REQUIRES_AEAD)
  9478. return 1;
  9479. }
  9480. #endif /* HAVE_CHACHA */
  9481. /* ECC extensions */
  9482. if (first == ECC_BYTE) {
  9483. switch (second) {
  9484. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9485. #ifndef NO_RSA
  9486. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  9487. if (requirement == REQUIRES_RSA)
  9488. return 1;
  9489. break;
  9490. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  9491. if (requirement == REQUIRES_ECC_STATIC)
  9492. return 1;
  9493. if (requirement == REQUIRES_RSA_SIG)
  9494. return 1;
  9495. break;
  9496. #ifndef NO_DES3
  9497. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  9498. if (requirement == REQUIRES_RSA)
  9499. return 1;
  9500. break;
  9501. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  9502. if (requirement == REQUIRES_ECC_STATIC)
  9503. return 1;
  9504. if (requirement == REQUIRES_RSA_SIG)
  9505. return 1;
  9506. break;
  9507. #endif /* !NO_DES3 */
  9508. #ifndef NO_RC4
  9509. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  9510. if (requirement == REQUIRES_RSA)
  9511. return 1;
  9512. break;
  9513. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  9514. if (requirement == REQUIRES_ECC_STATIC)
  9515. return 1;
  9516. if (requirement == REQUIRES_RSA_SIG)
  9517. return 1;
  9518. break;
  9519. #endif /* !NO_RC4 */
  9520. #endif /* NO_RSA */
  9521. #ifndef NO_DES3
  9522. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  9523. if (requirement == REQUIRES_ECC)
  9524. return 1;
  9525. break;
  9526. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  9527. if (requirement == REQUIRES_ECC_STATIC)
  9528. return 1;
  9529. break;
  9530. #endif /* !NO_DES3 */
  9531. #ifndef NO_RC4
  9532. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  9533. if (requirement == REQUIRES_ECC)
  9534. return 1;
  9535. break;
  9536. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  9537. if (requirement == REQUIRES_ECC_STATIC)
  9538. return 1;
  9539. break;
  9540. #endif /* !NO_RC4 */
  9541. #ifndef NO_RSA
  9542. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  9543. if (requirement == REQUIRES_RSA)
  9544. return 1;
  9545. break;
  9546. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  9547. if (requirement == REQUIRES_ECC_STATIC)
  9548. return 1;
  9549. if (requirement == REQUIRES_RSA_SIG)
  9550. return 1;
  9551. break;
  9552. #endif /* !NO_RSA */
  9553. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  9554. if (requirement == REQUIRES_ECC)
  9555. return 1;
  9556. break;
  9557. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  9558. if (requirement == REQUIRES_ECC_STATIC)
  9559. return 1;
  9560. break;
  9561. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  9562. if (requirement == REQUIRES_ECC)
  9563. return 1;
  9564. break;
  9565. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  9566. if (requirement == REQUIRES_ECC_STATIC)
  9567. return 1;
  9568. break;
  9569. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  9570. if (requirement == REQUIRES_ECC)
  9571. return 1;
  9572. if (requirement == REQUIRES_AEAD)
  9573. return 1;
  9574. break;
  9575. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  9576. if (requirement == REQUIRES_ECC)
  9577. return 1;
  9578. if (requirement == REQUIRES_AEAD)
  9579. return 1;
  9580. break;
  9581. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  9582. if (requirement == REQUIRES_ECC_STATIC)
  9583. return 1;
  9584. if (requirement == REQUIRES_AEAD)
  9585. return 1;
  9586. break;
  9587. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  9588. if (requirement == REQUIRES_ECC_STATIC)
  9589. return 1;
  9590. if (requirement == REQUIRES_AEAD)
  9591. return 1;
  9592. break;
  9593. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9594. #ifndef NO_RSA
  9595. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9596. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  9597. if (requirement == REQUIRES_RSA)
  9598. return 1;
  9599. if (requirement == REQUIRES_AEAD)
  9600. return 1;
  9601. break;
  9602. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  9603. if (requirement == REQUIRES_RSA)
  9604. return 1;
  9605. if (requirement == REQUIRES_AEAD)
  9606. return 1;
  9607. break;
  9608. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  9609. if (requirement == REQUIRES_ECC_STATIC)
  9610. return 1;
  9611. if (requirement == REQUIRES_RSA_SIG)
  9612. return 1;
  9613. if (requirement == REQUIRES_AEAD)
  9614. return 1;
  9615. break;
  9616. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  9617. if (requirement == REQUIRES_ECC_STATIC)
  9618. return 1;
  9619. if (requirement == REQUIRES_RSA_SIG)
  9620. return 1;
  9621. if (requirement == REQUIRES_AEAD)
  9622. return 1;
  9623. break;
  9624. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9625. #ifdef HAVE_AESCCM
  9626. case TLS_RSA_WITH_AES_128_CCM_8 :
  9627. case TLS_RSA_WITH_AES_256_CCM_8 :
  9628. if (requirement == REQUIRES_RSA)
  9629. return 1;
  9630. if (requirement == REQUIRES_RSA_SIG)
  9631. return 1;
  9632. if (requirement == REQUIRES_AEAD)
  9633. return 1;
  9634. break;
  9635. #endif /* HAVE_AESCCM */
  9636. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9637. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  9638. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  9639. if (requirement == REQUIRES_RSA)
  9640. return 1;
  9641. break;
  9642. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  9643. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  9644. if (requirement == REQUIRES_RSA_SIG)
  9645. return 1;
  9646. if (requirement == REQUIRES_ECC_STATIC)
  9647. return 1;
  9648. break;
  9649. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9650. #endif /* !NO_RSA */
  9651. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9652. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  9653. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  9654. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  9655. if (requirement == REQUIRES_ECC)
  9656. return 1;
  9657. if (requirement == REQUIRES_AEAD)
  9658. return 1;
  9659. break;
  9660. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  9661. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  9662. if (requirement == REQUIRES_ECC)
  9663. return 1;
  9664. break;
  9665. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  9666. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  9667. if (requirement == REQUIRES_ECC)
  9668. return 1;
  9669. if (requirement == REQUIRES_ECC_STATIC)
  9670. return 1;
  9671. break;
  9672. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9673. #ifndef NO_PSK
  9674. case TLS_PSK_WITH_AES_128_CCM:
  9675. case TLS_PSK_WITH_AES_256_CCM:
  9676. case TLS_PSK_WITH_AES_128_CCM_8:
  9677. case TLS_PSK_WITH_AES_256_CCM_8:
  9678. if (requirement == REQUIRES_PSK)
  9679. return 1;
  9680. if (requirement == REQUIRES_AEAD)
  9681. return 1;
  9682. break;
  9683. case TLS_DHE_PSK_WITH_AES_128_CCM:
  9684. case TLS_DHE_PSK_WITH_AES_256_CCM:
  9685. if (requirement == REQUIRES_PSK)
  9686. return 1;
  9687. if (requirement == REQUIRES_DHE)
  9688. return 1;
  9689. if (requirement == REQUIRES_AEAD)
  9690. return 1;
  9691. break;
  9692. #endif /* !NO_PSK */
  9693. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9694. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  9695. if (requirement == REQUIRES_ECC)
  9696. return 1;
  9697. break;
  9698. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  9699. if (requirement == REQUIRES_PSK)
  9700. return 1;
  9701. break;
  9702. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  9703. if (requirement == REQUIRES_PSK)
  9704. return 1;
  9705. break;
  9706. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9707. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  9708. case TLS_SHA256_SHA256:
  9709. break;
  9710. case TLS_SHA384_SHA384:
  9711. break;
  9712. #endif
  9713. default:
  9714. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  9715. return 0;
  9716. } /* switch */
  9717. } /* if */
  9718. /* ECC extensions */
  9719. if (first == ECDHE_PSK_BYTE) {
  9720. switch (second) {
  9721. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9722. case TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 :
  9723. if (requirement == REQUIRES_PSK)
  9724. return 1;
  9725. break;
  9726. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9727. default:
  9728. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC PSK");
  9729. return 0;
  9730. } /* switch */
  9731. } /* if */
  9732. #endif /* !WOLFSSL_NO_TLS12 */
  9733. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  9734. if (first == TLS13_BYTE) {
  9735. switch (second) {
  9736. #ifdef WOLFSSL_TLS13
  9737. case TLS_AES_128_GCM_SHA256:
  9738. case TLS_AES_256_GCM_SHA384:
  9739. case TLS_CHACHA20_POLY1305_SHA256:
  9740. case TLS_AES_128_CCM_SHA256:
  9741. case TLS_AES_128_CCM_8_SHA256:
  9742. break;
  9743. #endif
  9744. default:
  9745. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  9746. "TLS v1.3");
  9747. return 0;
  9748. }
  9749. }
  9750. #ifndef WOLFSSL_NO_TLS12
  9751. if (first != ECC_BYTE && first != CHACHA_BYTE &&
  9752. first != TLS13_BYTE && first != ECDHE_PSK_BYTE) {
  9753. /* normal suites */
  9754. switch (second) {
  9755. #ifndef NO_RSA
  9756. #ifndef NO_RC4
  9757. case SSL_RSA_WITH_RC4_128_SHA :
  9758. if (requirement == REQUIRES_RSA)
  9759. return 1;
  9760. break;
  9761. case SSL_RSA_WITH_RC4_128_MD5 :
  9762. if (requirement == REQUIRES_RSA)
  9763. return 1;
  9764. break;
  9765. #endif /* NO_RC4 */
  9766. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  9767. if (requirement == REQUIRES_RSA)
  9768. return 1;
  9769. break;
  9770. case TLS_RSA_WITH_AES_128_CBC_SHA :
  9771. if (requirement == REQUIRES_RSA)
  9772. return 1;
  9773. break;
  9774. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  9775. if (requirement == REQUIRES_RSA)
  9776. return 1;
  9777. break;
  9778. case TLS_RSA_WITH_AES_256_CBC_SHA :
  9779. if (requirement == REQUIRES_RSA)
  9780. return 1;
  9781. break;
  9782. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  9783. if (requirement == REQUIRES_RSA)
  9784. return 1;
  9785. break;
  9786. case TLS_RSA_WITH_NULL_MD5 :
  9787. case TLS_RSA_WITH_NULL_SHA :
  9788. case TLS_RSA_WITH_NULL_SHA256 :
  9789. if (requirement == REQUIRES_RSA)
  9790. return 1;
  9791. break;
  9792. #endif /* !NO_RSA */
  9793. #ifndef NO_PSK
  9794. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  9795. if (requirement == REQUIRES_PSK)
  9796. return 1;
  9797. if (requirement == REQUIRES_AEAD)
  9798. return 1;
  9799. break;
  9800. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  9801. if (requirement == REQUIRES_PSK)
  9802. return 1;
  9803. if (requirement == REQUIRES_AEAD)
  9804. return 1;
  9805. break;
  9806. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  9807. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  9808. case TLS_PSK_WITH_AES_128_CBC_SHA :
  9809. case TLS_PSK_WITH_AES_256_CBC_SHA :
  9810. case TLS_PSK_WITH_NULL_SHA384 :
  9811. case TLS_PSK_WITH_NULL_SHA256 :
  9812. case TLS_PSK_WITH_NULL_SHA :
  9813. if (requirement == REQUIRES_PSK)
  9814. return 1;
  9815. break;
  9816. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  9817. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  9818. if (requirement == REQUIRES_DHE)
  9819. return 1;
  9820. if (requirement == REQUIRES_PSK)
  9821. return 1;
  9822. if (requirement == REQUIRES_AEAD)
  9823. return 1;
  9824. break;
  9825. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  9826. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  9827. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  9828. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  9829. if (requirement == REQUIRES_DHE)
  9830. return 1;
  9831. if (requirement == REQUIRES_PSK)
  9832. return 1;
  9833. break;
  9834. #endif /* NO_PSK */
  9835. #ifndef NO_RSA
  9836. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  9837. if (requirement == REQUIRES_RSA)
  9838. return 1;
  9839. if (requirement == REQUIRES_DHE)
  9840. return 1;
  9841. break;
  9842. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  9843. if (requirement == REQUIRES_RSA)
  9844. return 1;
  9845. if (requirement == REQUIRES_DHE)
  9846. return 1;
  9847. break;
  9848. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  9849. if (requirement == REQUIRES_RSA)
  9850. return 1;
  9851. if (requirement == REQUIRES_DHE)
  9852. return 1;
  9853. break;
  9854. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  9855. if (requirement == REQUIRES_RSA)
  9856. return 1;
  9857. if (requirement == REQUIRES_DHE)
  9858. return 1;
  9859. break;
  9860. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  9861. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  9862. if (requirement == REQUIRES_RSA)
  9863. return 1;
  9864. if (requirement == REQUIRES_AEAD)
  9865. return 1;
  9866. break;
  9867. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  9868. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  9869. if (requirement == REQUIRES_RSA)
  9870. return 1;
  9871. if (requirement == REQUIRES_DHE)
  9872. return 1;
  9873. if (requirement == REQUIRES_AEAD)
  9874. return 1;
  9875. break;
  9876. #ifdef HAVE_CAMELLIA
  9877. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  9878. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  9879. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  9880. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  9881. if (requirement == REQUIRES_RSA)
  9882. return 1;
  9883. break;
  9884. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  9885. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  9886. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  9887. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  9888. if (requirement == REQUIRES_RSA)
  9889. return 1;
  9890. if (requirement == REQUIRES_RSA_SIG)
  9891. return 1;
  9892. if (requirement == REQUIRES_DHE)
  9893. return 1;
  9894. break;
  9895. #endif /* HAVE_CAMELLIA */
  9896. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  9897. if (requirement == REQUIRES_RSA)
  9898. return 1;
  9899. if (requirement == REQUIRES_RSA_SIG)
  9900. return 1;
  9901. if (requirement == REQUIRES_DHE)
  9902. return 1;
  9903. break;
  9904. #endif
  9905. #ifdef HAVE_ANON
  9906. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  9907. if (requirement == REQUIRES_DHE)
  9908. return 1;
  9909. break;
  9910. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  9911. if (requirement == REQUIRES_DHE)
  9912. return 1;
  9913. if (requirement == REQUIRES_AEAD)
  9914. return 1;
  9915. break;
  9916. #endif
  9917. #ifdef WOLFSSL_MULTICAST
  9918. case WDM_WITH_NULL_SHA256 :
  9919. break;
  9920. #endif
  9921. default:
  9922. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  9923. return 0;
  9924. } /* switch */
  9925. } /* if ECC / Normal suites else */
  9926. #endif /* !WOLFSSL_NO_TLS12 */
  9927. return 0;
  9928. }
  9929. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  9930. #ifndef NO_CERTS
  9931. /* Match names with wildcards, each wildcard can represent a single name
  9932. component or fragment but not multiple names, i.e.,
  9933. *.z.com matches y.z.com but not x.y.z.com
  9934. return 1 on success */
  9935. int MatchDomainName(const char* pattern, int len, const char* str)
  9936. {
  9937. int ret = 0;
  9938. char p, s;
  9939. if (pattern == NULL || str == NULL || len <= 0)
  9940. return 0;
  9941. while (len > 0) {
  9942. p = (char)XTOLOWER((unsigned char)*pattern++);
  9943. if (p == '\0')
  9944. break;
  9945. if (p == '*') {
  9946. while (--len > 0 &&
  9947. (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') {
  9948. }
  9949. if (len == 0)
  9950. p = '\0';
  9951. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  9952. if (s == p)
  9953. break;
  9954. if (s == '.')
  9955. return 0;
  9956. str++;
  9957. }
  9958. }
  9959. else {
  9960. if (p != (char)XTOLOWER((unsigned char) *str))
  9961. return 0;
  9962. }
  9963. if (len > 0) {
  9964. str++;
  9965. len--;
  9966. }
  9967. }
  9968. if (*str == '\0' && len == 0) {
  9969. ret = 1; /* success */
  9970. }
  9971. return ret;
  9972. }
  9973. /* Check that alternative names, if they exists, match the domain.
  9974. * Fail if there are wild patterns and they didn't match.
  9975. * Check the common name if no alternative names matched.
  9976. *
  9977. * dCert Decoded cert to get the alternative names from.
  9978. * domain Domain name to compare against.
  9979. * checkCN Whether to check the common name.
  9980. * returns 1 : match was found.
  9981. * 0 : no match found.
  9982. * -1 : No matches and wild pattern match failed.
  9983. */
  9984. int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
  9985. {
  9986. int match = 0;
  9987. DNS_entry* altName = NULL;
  9988. char *buf;
  9989. word32 len;
  9990. WOLFSSL_MSG("Checking AltNames");
  9991. if (dCert)
  9992. altName = dCert->altNames;
  9993. if (checkCN != NULL) {
  9994. *checkCN = (altName == NULL) ? 1 : 0;
  9995. }
  9996. while (altName) {
  9997. WOLFSSL_MSG("\tindividual AltName check");
  9998. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  9999. if (altName->type == ASN_IP_TYPE) {
  10000. buf = altName->ipString;
  10001. len = (word32)XSTRLEN(buf);
  10002. }
  10003. else
  10004. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  10005. {
  10006. buf = altName->name;
  10007. len = altName->len;
  10008. }
  10009. if (MatchDomainName(buf, len, domain)) {
  10010. match = 1;
  10011. if (checkCN != NULL) {
  10012. *checkCN = 0;
  10013. }
  10014. WOLFSSL_MSG("\tmatch found");
  10015. break;
  10016. }
  10017. /* No matches and wild pattern match failed. */
  10018. else if (buf && (len >=1) && (buf[0] == '*')) {
  10019. match = -1;
  10020. WOLFSSL_MSG("\twildcard match failed");
  10021. }
  10022. altName = altName->next;
  10023. }
  10024. return match;
  10025. }
  10026. /* Check the domain name matches the subject alternative name or the subject
  10027. * name.
  10028. *
  10029. * dcert Decoded certificate.
  10030. * domainName The domain name.
  10031. * domainNameLen The length of the domain name.
  10032. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  10033. */
  10034. int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
  10035. {
  10036. int checkCN;
  10037. int ret = DOMAIN_NAME_MISMATCH;
  10038. /* Assume name is NUL terminated. */
  10039. (void)domainNameLen;
  10040. if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
  10041. WOLFSSL_MSG("DomainName match on alt names failed");
  10042. }
  10043. else {
  10044. ret = 0;
  10045. }
  10046. #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  10047. if (checkCN == 1) {
  10048. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  10049. domainName) == 1) {
  10050. ret = 0;
  10051. }
  10052. else {
  10053. WOLFSSL_MSG("DomainName match on common name failed");
  10054. }
  10055. }
  10056. #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
  10057. return ret;
  10058. }
  10059. int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
  10060. {
  10061. WOLFSSL_MSG("Checking IPAddr");
  10062. return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
  10063. }
  10064. #ifdef SESSION_CERTS
  10065. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  10066. byte* certBuf, word32 certSz)
  10067. {
  10068. if (chain->count < MAX_CHAIN_DEPTH &&
  10069. certSz < MAX_X509_SIZE) {
  10070. chain->certs[chain->count].length = certSz;
  10071. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  10072. chain->count++;
  10073. }
  10074. else {
  10075. WOLFSSL_MSG("Couldn't store chain cert for session");
  10076. }
  10077. }
  10078. #endif
  10079. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  10080. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10081. static void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType)
  10082. {
  10083. if (nameType == SUBJECT) {
  10084. XSTRNCPY(name->name, dCert->subject, ASN_NAME_MAX);
  10085. name->name[ASN_NAME_MAX - 1] = '\0';
  10086. name->sz = (int)XSTRLEN(name->name) + 1;
  10087. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  10088. name->rawLen = min(dCert->subjectRawLen, ASN_NAME_MAX);
  10089. XMEMCPY(name->raw, dCert->subjectRaw, name->rawLen);
  10090. #endif
  10091. }
  10092. else {
  10093. XSTRNCPY(name->name, dCert->issuer, ASN_NAME_MAX);
  10094. name->name[ASN_NAME_MAX - 1] = '\0';
  10095. name->sz = (int)XSTRLEN(name->name) + 1;
  10096. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)) \
  10097. && (defined(HAVE_PKCS7) || defined(WOLFSSL_CERT_EXT))
  10098. name->rawLen = min(dCert->issuerRawLen, ASN_NAME_MAX);
  10099. if (name->rawLen) {
  10100. XMEMCPY(name->raw, dCert->issuerRaw, name->rawLen);
  10101. }
  10102. #endif
  10103. }
  10104. }
  10105. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  10106. !defined(IGNORE_NAME_CONSTRAINTS)
  10107. /* copies over additional alt names such as dirName
  10108. * returns 0 on success
  10109. */
  10110. static int CopyAdditionalAltNames(DNS_entry** to, DNS_entry* from, int type,
  10111. void* heap)
  10112. {
  10113. DNS_entry* cur = from;
  10114. if (to == NULL) {
  10115. return BAD_FUNC_ARG;
  10116. }
  10117. while (cur != NULL) {
  10118. if (cur->type == type) {
  10119. DNS_entry* dnsEntry;
  10120. int strLen = cur->len;
  10121. dnsEntry = AltNameNew(heap);
  10122. if (dnsEntry == NULL) {
  10123. WOLFSSL_MSG("\tOut of Memory");
  10124. return MEMORY_E;
  10125. }
  10126. dnsEntry->type = type;
  10127. dnsEntry->name = (char*)XMALLOC(strLen + 1, heap,
  10128. DYNAMIC_TYPE_ALTNAME);
  10129. if (dnsEntry->name == NULL) {
  10130. WOLFSSL_MSG("\tOut of Memory");
  10131. XFREE(dnsEntry, heap, DYNAMIC_TYPE_ALTNAME);
  10132. return MEMORY_E;
  10133. }
  10134. dnsEntry->len = strLen;
  10135. XMEMCPY(dnsEntry->name, cur->name, strLen);
  10136. dnsEntry->name[strLen] = '\0';
  10137. dnsEntry->next = *to;
  10138. *to = dnsEntry;
  10139. }
  10140. cur = cur->next;
  10141. }
  10142. return 0;
  10143. }
  10144. #endif /* OPENSSL_EXTRA */
  10145. #ifdef WOLFSSL_CERT_REQ
  10146. static int CopyREQAttributes(WOLFSSL_X509* x509, DecodedCert* dCert)
  10147. {
  10148. int ret = 0;
  10149. if (dCert->cPwd) {
  10150. if (dCert->cPwdLen < CTC_NAME_SIZE) {
  10151. XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
  10152. x509->challengePw[dCert->cPwdLen] = '\0';
  10153. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  10154. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10155. NID_pkcs9_challengePassword,
  10156. MBSTRING_ASC,
  10157. (const byte*)dCert->cPwd,
  10158. dCert->cPwdLen) != WOLFSSL_SUCCESS) {
  10159. ret = REQ_ATTRIBUTE_E;
  10160. WOLFSSL_ERROR_VERBOSE(ret);
  10161. }
  10162. #endif
  10163. }
  10164. else {
  10165. WOLFSSL_MSG("Challenge password too long");
  10166. ret = MEMORY_E;
  10167. }
  10168. }
  10169. if (dCert->contentType) {
  10170. if (dCert->contentTypeLen < CTC_NAME_SIZE) {
  10171. XMEMCPY(x509->contentType, dCert->contentType, dCert->contentTypeLen);
  10172. x509->contentType[dCert->contentTypeLen] = '\0';
  10173. }
  10174. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  10175. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10176. NID_pkcs9_contentType,
  10177. MBSTRING_ASC,
  10178. (const byte*)dCert->contentType,
  10179. dCert->contentTypeLen) !=
  10180. WOLFSSL_SUCCESS) {
  10181. ret = REQ_ATTRIBUTE_E;
  10182. WOLFSSL_ERROR_VERBOSE(ret);
  10183. }
  10184. #endif
  10185. }
  10186. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  10187. if (dCert->sNum) {
  10188. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10189. NID_serialNumber,
  10190. MBSTRING_ASC,
  10191. (const byte*)dCert->sNum,
  10192. dCert->sNumLen) != WOLFSSL_SUCCESS) {
  10193. ret = REQ_ATTRIBUTE_E;
  10194. WOLFSSL_ERROR_VERBOSE(ret);
  10195. }
  10196. }
  10197. if (dCert->unstructuredName) {
  10198. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10199. NID_pkcs9_unstructuredName,
  10200. MBSTRING_ASC,
  10201. (const byte*)dCert->unstructuredName,
  10202. dCert->unstructuredNameLen)
  10203. != WOLFSSL_SUCCESS) {
  10204. ret = REQ_ATTRIBUTE_E;
  10205. WOLFSSL_ERROR_VERBOSE(ret);
  10206. }
  10207. }
  10208. if (dCert->surname) {
  10209. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10210. NID_surname,
  10211. MBSTRING_ASC,
  10212. (const byte*)dCert->surname,
  10213. dCert->surnameLen) != WOLFSSL_SUCCESS) {
  10214. ret = REQ_ATTRIBUTE_E;
  10215. WOLFSSL_ERROR_VERBOSE(ret);
  10216. }
  10217. }
  10218. if (dCert->givenName) {
  10219. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10220. NID_givenName,
  10221. MBSTRING_ASC,
  10222. (const byte*)dCert->givenName,
  10223. dCert->givenNameLen) != WOLFSSL_SUCCESS) {
  10224. ret = REQ_ATTRIBUTE_E;
  10225. WOLFSSL_ERROR_VERBOSE(ret);
  10226. }
  10227. }
  10228. if (dCert->dnQualifier) {
  10229. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10230. NID_dnQualifier,
  10231. MBSTRING_ASC,
  10232. (const byte*)dCert->dnQualifier,
  10233. dCert->dnQualifierLen) != WOLFSSL_SUCCESS) {
  10234. ret = REQ_ATTRIBUTE_E;
  10235. WOLFSSL_ERROR_VERBOSE(ret);
  10236. }
  10237. }
  10238. if (dCert->initials) {
  10239. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10240. NID_initials,
  10241. MBSTRING_ASC,
  10242. (const byte*)dCert->initials,
  10243. dCert->initialsLen) != WOLFSSL_SUCCESS) {
  10244. ret = REQ_ATTRIBUTE_E;
  10245. WOLFSSL_ERROR_VERBOSE(ret);
  10246. }
  10247. }
  10248. #endif /* OPENSSL_ALL */
  10249. return ret;
  10250. }
  10251. #endif /* WOLFSSL_CERT_REQ */
  10252. /* Copy parts X509 needs from Decoded cert, 0 on success */
  10253. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  10254. * altNames pointers could be free'd by second x509 still active by first */
  10255. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  10256. {
  10257. int ret = 0;
  10258. if (x509 == NULL || dCert == NULL ||
  10259. dCert->subjectCNLen < 0)
  10260. return BAD_FUNC_ARG;
  10261. if (x509->issuer.name == NULL || x509->subject.name == NULL) {
  10262. WOLFSSL_MSG("Either init was not called on X509 or programming error");
  10263. WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
  10264. return BAD_FUNC_ARG;
  10265. }
  10266. x509->version = dCert->version + 1;
  10267. CopyDecodedName(&x509->issuer, dCert, ISSUER);
  10268. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10269. if (dCert->issuerName != NULL) {
  10270. wolfSSL_X509_set_issuer_name(x509,
  10271. (WOLFSSL_X509_NAME*)dCert->issuerName);
  10272. x509->issuer.x509 = x509;
  10273. }
  10274. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10275. CopyDecodedName(&x509->subject, dCert, SUBJECT);
  10276. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10277. if (dCert->subjectName != NULL) {
  10278. wolfSSL_X509_set_subject_name(x509,
  10279. (WOLFSSL_X509_NAME*)dCert->subjectName);
  10280. x509->subject.x509 = x509;
  10281. }
  10282. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10283. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  10284. x509->serialSz = dCert->serialSz;
  10285. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  10286. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  10287. x509->subjectCN[dCert->subjectCNLen] = '\0';
  10288. }
  10289. else
  10290. x509->subjectCN[0] = '\0';
  10291. #ifdef WOLFSSL_CERT_REQ
  10292. x509->isCSR = dCert->isCSR;
  10293. /* CSR attributes */
  10294. if (x509->isCSR) {
  10295. ret = CopyREQAttributes(x509, dCert);
  10296. }
  10297. #endif /* WOLFSSL_CERT_REQ */
  10298. #ifdef WOLFSSL_SEP
  10299. {
  10300. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  10301. if (minSz > 0) {
  10302. x509->deviceTypeSz = minSz;
  10303. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  10304. }
  10305. else
  10306. x509->deviceTypeSz = 0;
  10307. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  10308. if (minSz > 0) {
  10309. x509->hwTypeSz = minSz;
  10310. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  10311. }
  10312. else
  10313. x509->hwTypeSz = 0;
  10314. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  10315. if (minSz > 0) {
  10316. x509->hwSerialNumSz = minSz;
  10317. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  10318. }
  10319. else
  10320. x509->hwSerialNumSz = 0;
  10321. }
  10322. #endif /* WOLFSSL_SEP */
  10323. {
  10324. int minSz;
  10325. if (dCert->beforeDateLen > 0) {
  10326. minSz = min(dCert->beforeDate[1], MAX_DATE_SZ);
  10327. x509->notBefore.type = dCert->beforeDate[0];
  10328. x509->notBefore.length = minSz;
  10329. XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
  10330. }
  10331. else
  10332. x509->notBefore.length = 0;
  10333. if (dCert->afterDateLen > 0) {
  10334. minSz = min(dCert->afterDate[1], MAX_DATE_SZ);
  10335. x509->notAfter.type = dCert->afterDate[0];
  10336. x509->notAfter.length = minSz;
  10337. XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
  10338. }
  10339. else
  10340. x509->notAfter.length = 0;
  10341. }
  10342. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  10343. x509->pubKey.buffer = (byte*)XMALLOC(
  10344. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  10345. if (x509->pubKey.buffer != NULL) {
  10346. x509->pubKeyOID = dCert->keyOID;
  10347. x509->pubKey.length = dCert->pubKeySize;
  10348. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  10349. }
  10350. else
  10351. ret = MEMORY_E;
  10352. #if defined(OPENSSL_ALL)
  10353. if (ret == 0) {
  10354. x509->key.pubKeyOID = dCert->keyOID;
  10355. if (!x509->key.algor) {
  10356. x509->key.algor = wolfSSL_X509_ALGOR_new();
  10357. } else {
  10358. wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
  10359. }
  10360. if (!x509->key.algor) {
  10361. ret = MEMORY_E;
  10362. } else {
  10363. if (!(x509->key.algor->algorithm =
  10364. wolfSSL_OBJ_nid2obj(oid2nid(dCert->keyOID, oidKeyType)))) {
  10365. ret = PUBLIC_KEY_E;
  10366. WOLFSSL_ERROR_VERBOSE(ret);
  10367. }
  10368. }
  10369. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  10370. if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
  10371. &dCert->publicKey,
  10372. dCert->pubKeySize))) {
  10373. ret = PUBLIC_KEY_E;
  10374. WOLFSSL_ERROR_VERBOSE(ret);
  10375. }
  10376. }
  10377. #endif
  10378. }
  10379. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  10380. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  10381. x509->sig.buffer = (byte*)XMALLOC(
  10382. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  10383. if (x509->sig.buffer == NULL) {
  10384. ret = MEMORY_E;
  10385. }
  10386. else {
  10387. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  10388. x509->sig.length = dCert->sigLength;
  10389. x509->sigOID = dCert->signatureOID;
  10390. }
  10391. #if defined(OPENSSL_ALL)
  10392. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  10393. if (!(x509->algor.algorithm =
  10394. wolfSSL_OBJ_nid2obj(oid2nid(dCert->signatureOID, oidSigType)))) {
  10395. ret = PUBLIC_KEY_E;
  10396. WOLFSSL_ERROR_VERBOSE(ret);
  10397. }
  10398. #endif
  10399. }
  10400. /* if der contains original source buffer then store for potential
  10401. * retrieval */
  10402. if (dCert->source != NULL && dCert->maxIdx > 0) {
  10403. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap)
  10404. == 0) {
  10405. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  10406. }
  10407. else {
  10408. ret = MEMORY_E;
  10409. }
  10410. }
  10411. x509->altNames = dCert->altNames;
  10412. dCert->weOwnAltNames = 0;
  10413. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  10414. !defined(IGNORE_NAME_CONSTRAINTS)
  10415. /* add copies of email names from dCert to X509 */
  10416. if (CopyAdditionalAltNames(&x509->altNames, dCert->altEmailNames,
  10417. ASN_RFC822_TYPE, x509->heap) != 0) {
  10418. return MEMORY_E;
  10419. }
  10420. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10421. #if defined(OPENSSL_EXTRA) && !defined(IGNORE_NAME_CONSTRAINTS)
  10422. /* add copies of alternate directory names from dCert to X509 */
  10423. if (CopyAdditionalAltNames(&x509->altNames, dCert->altDirNames,
  10424. ASN_DIR_TYPE, x509->heap) != 0) {
  10425. return MEMORY_E;
  10426. }
  10427. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10428. x509->altNamesNext = x509->altNames; /* index hint */
  10429. x509->isCa = dCert->isCA;
  10430. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10431. x509->pathLength = dCert->pathLength;
  10432. x509->keyUsage = dCert->extKeyUsage;
  10433. x509->CRLdistSet = dCert->extCRLdistSet;
  10434. x509->CRLdistCrit = dCert->extCRLdistCrit;
  10435. if (dCert->extCrlInfoRaw != NULL && dCert->extCrlInfoRawSz > 0) {
  10436. x509->rawCRLInfo = (byte*)XMALLOC(dCert->extCrlInfoRawSz, x509->heap,
  10437. DYNAMIC_TYPE_X509_EXT);
  10438. if (x509->rawCRLInfo != NULL) {
  10439. XMEMCPY(x509->rawCRLInfo, dCert->extCrlInfoRaw, dCert->extCrlInfoRawSz);
  10440. x509->rawCRLInfoSz = dCert->extCrlInfoRawSz;
  10441. }
  10442. else {
  10443. ret = MEMORY_E;
  10444. }
  10445. }
  10446. if (dCert->extCrlInfo != NULL && dCert->extCrlInfoSz > 0) {
  10447. x509->CRLInfo = (byte*)XMALLOC(dCert->extCrlInfoSz, x509->heap,
  10448. DYNAMIC_TYPE_X509_EXT);
  10449. if (x509->CRLInfo != NULL) {
  10450. XMEMCPY(x509->CRLInfo, dCert->extCrlInfo, dCert->extCrlInfoSz);
  10451. x509->CRLInfoSz = dCert->extCrlInfoSz;
  10452. }
  10453. else {
  10454. ret = MEMORY_E;
  10455. }
  10456. }
  10457. x509->authInfoSet = dCert->extAuthInfoSet;
  10458. x509->authInfoCrit = dCert->extAuthInfoCrit;
  10459. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  10460. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  10461. DYNAMIC_TYPE_X509_EXT);
  10462. if (x509->authInfo != NULL) {
  10463. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  10464. x509->authInfoSz = dCert->extAuthInfoSz;
  10465. }
  10466. else {
  10467. ret = MEMORY_E;
  10468. }
  10469. }
  10470. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  10471. if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
  10472. x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
  10473. DYNAMIC_TYPE_X509_EXT);
  10474. if (x509->authInfoCaIssuer != NULL) {
  10475. XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
  10476. x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
  10477. }
  10478. else {
  10479. ret = MEMORY_E;
  10480. }
  10481. }
  10482. #endif
  10483. x509->basicConstSet = dCert->extBasicConstSet;
  10484. x509->basicConstCrit = dCert->extBasicConstCrit;
  10485. x509->basicConstPlSet = dCert->pathLengthSet;
  10486. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  10487. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  10488. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  10489. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  10490. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  10491. #ifdef WOLFSSL_AKID_NAME
  10492. if (dCert->extRawAuthKeyIdSrc != NULL &&
  10493. dCert->extAuthKeyIdSrc > dCert->extRawAuthKeyIdSrc &&
  10494. dCert->extAuthKeyIdSrc <
  10495. (dCert->extRawAuthKeyIdSrc + dCert->extRawAuthKeyIdSz)) {
  10496. /* Confirmed: extAuthKeyIdSrc points inside extRawAuthKeyIdSrc */
  10497. x509->authKeyIdSrc = (byte*)XMALLOC(dCert->extRawAuthKeyIdSz,
  10498. x509->heap, DYNAMIC_TYPE_X509_EXT);
  10499. if (x509->authKeyIdSrc != NULL) {
  10500. XMEMCPY(x509->authKeyIdSrc, dCert->extRawAuthKeyIdSrc,
  10501. dCert->extRawAuthKeyIdSz);
  10502. x509->authKeyIdSrcSz = dCert->extRawAuthKeyIdSz;
  10503. /* Set authKeyId to same offset inside authKeyIdSrc */
  10504. x509->authKeyId = x509->authKeyIdSrc +
  10505. (dCert->extAuthKeyIdSrc - dCert->extRawAuthKeyIdSrc);
  10506. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  10507. }
  10508. else
  10509. ret = MEMORY_E;
  10510. }
  10511. #else
  10512. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  10513. DYNAMIC_TYPE_X509_EXT);
  10514. if (x509->authKeyId != NULL) {
  10515. XMEMCPY(x509->authKeyId,
  10516. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  10517. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  10518. }
  10519. #endif
  10520. else
  10521. ret = MEMORY_E;
  10522. }
  10523. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  10524. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  10525. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  10526. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  10527. DYNAMIC_TYPE_X509_EXT);
  10528. if (x509->subjKeyId != NULL) {
  10529. XMEMCPY(x509->subjKeyId,
  10530. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  10531. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  10532. }
  10533. else
  10534. ret = MEMORY_E;
  10535. }
  10536. x509->keyUsageSet = dCert->extKeyUsageSet;
  10537. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  10538. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  10539. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  10540. x509->heap, DYNAMIC_TYPE_X509_EXT);
  10541. if (x509->extKeyUsageSrc != NULL) {
  10542. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  10543. dCert->extExtKeyUsageSz);
  10544. x509->extKeyUsage = dCert->extExtKeyUsage;
  10545. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  10546. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  10547. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  10548. }
  10549. else {
  10550. ret = MEMORY_E;
  10551. }
  10552. }
  10553. #ifndef IGNORE_NETSCAPE_CERT_TYPE
  10554. x509->nsCertType = dCert->nsCertType;
  10555. #endif
  10556. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  10557. x509->certPolicySet = dCert->extCertPolicySet;
  10558. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  10559. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  10560. #ifdef WOLFSSL_CERT_EXT
  10561. {
  10562. int i;
  10563. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  10564. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  10565. MAX_CERTPOL_SZ);
  10566. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  10567. }
  10568. #endif /* WOLFSSL_CERT_EXT */
  10569. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10570. #ifdef OPENSSL_ALL
  10571. if (dCert->extSubjAltNameSrc != NULL && dCert->extSubjAltNameSz != 0) {
  10572. x509->subjAltNameSrc = (byte*)XMALLOC(dCert->extSubjAltNameSz, x509->heap,
  10573. DYNAMIC_TYPE_X509_EXT);
  10574. if (x509->subjAltNameSrc != NULL) {
  10575. XMEMCPY(x509->subjAltNameSrc,
  10576. dCert->extSubjAltNameSrc, dCert->extSubjAltNameSz);
  10577. x509->subjAltNameSz = dCert->extSubjAltNameSz;
  10578. }
  10579. else
  10580. ret = MEMORY_E;
  10581. }
  10582. #endif
  10583. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  10584. x509->pkCurveOID = dCert->pkCurveOID;
  10585. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10586. return ret;
  10587. }
  10588. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  10589. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  10590. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  10591. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10592. word32 status_length)
  10593. {
  10594. int ret = 0;
  10595. OcspRequest* request;
  10596. #ifdef WOLFSSL_SMALL_STACK
  10597. CertStatus* status;
  10598. OcspEntry* single;
  10599. OcspResponse* response;
  10600. #else
  10601. CertStatus status[1];
  10602. OcspEntry single[1];
  10603. OcspResponse response[1];
  10604. #endif
  10605. WOLFSSL_ENTER("ProcessCSR");
  10606. do {
  10607. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  10608. if (ssl->status_request) {
  10609. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  10610. ssl->status_request = 0;
  10611. break;
  10612. }
  10613. #endif
  10614. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10615. if (ssl->status_request_v2) {
  10616. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  10617. WOLFSSL_CSR2_OCSP, 0);
  10618. ssl->status_request_v2 = 0;
  10619. break;
  10620. }
  10621. #endif
  10622. return BUFFER_ERROR;
  10623. } while(0);
  10624. if (request == NULL)
  10625. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  10626. #ifdef WOLFSSL_SMALL_STACK
  10627. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  10628. DYNAMIC_TYPE_OCSP_STATUS);
  10629. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  10630. DYNAMIC_TYPE_OCSP_ENTRY);
  10631. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  10632. DYNAMIC_TYPE_OCSP_REQUEST);
  10633. if (status == NULL || single == NULL || response == NULL) {
  10634. if (status)
  10635. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  10636. if (single)
  10637. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  10638. if (response)
  10639. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  10640. return MEMORY_ERROR;
  10641. }
  10642. #endif
  10643. InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
  10644. if (OcspResponseDecode(response, SSL_CM(ssl), ssl->heap, 0) != 0)
  10645. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10646. else if (CompareOcspReqResp(request, response) != 0)
  10647. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10648. else if (response->responseStatus != OCSP_SUCCESSFUL)
  10649. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10650. else if (response->single->status->status == CERT_REVOKED)
  10651. ret = OCSP_CERT_REVOKED;
  10652. else if (response->single->status->status != CERT_GOOD)
  10653. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10654. else {
  10655. XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
  10656. ssl->ocspProducedDateFormat = response->producedDateFormat;
  10657. }
  10658. *inOutIdx += status_length;
  10659. #ifdef WOLFSSL_SMALL_STACK
  10660. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  10661. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  10662. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  10663. #endif
  10664. WOLFSSL_LEAVE("ProcessCSR", ret);
  10665. return ret;
  10666. }
  10667. #endif
  10668. #ifdef HAVE_PK_CALLBACKS
  10669. #ifdef HAVE_ECC
  10670. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  10671. const unsigned char* hash, unsigned int hashSz,
  10672. const unsigned char* keyDer, unsigned int keySz,
  10673. int* result, void* ctx)
  10674. {
  10675. int ret = NOT_COMPILED_IN;
  10676. WOLFSSL* ssl = (WOLFSSL*)ctx;
  10677. if (ssl && ssl->ctx->EccVerifyCb) {
  10678. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  10679. keyDer, keySz, result, ssl->EccVerifyCtx);
  10680. }
  10681. return ret;
  10682. }
  10683. #endif
  10684. #ifndef NO_RSA
  10685. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  10686. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  10687. void* ctx)
  10688. {
  10689. int ret = NOT_COMPILED_IN;
  10690. WOLFSSL* ssl = (WOLFSSL*)ctx;
  10691. if (ssl && ssl->ctx->RsaVerifyCb) {
  10692. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  10693. ssl->RsaVerifyCtx);
  10694. }
  10695. return ret;
  10696. }
  10697. #endif
  10698. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  10699. {
  10700. if (ssl == NULL || sigCtx == NULL)
  10701. return BAD_FUNC_ARG;
  10702. /* only setup the verify callback if a PK is set */
  10703. #ifdef HAVE_ECC
  10704. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  10705. sigCtx->pkCbEcc = Renesas_cmn_SigPkCbEccVerify;
  10706. sigCtx->pkCtxEcc = (void*)&sigCtx->CertAtt;
  10707. (void)SigPkCbEccVerify;
  10708. #else
  10709. if (ssl->ctx->EccVerifyCb) {
  10710. sigCtx->pkCbEcc = SigPkCbEccVerify;
  10711. sigCtx->pkCtxEcc = ssl;
  10712. }
  10713. #endif
  10714. #endif
  10715. #ifndef NO_RSA
  10716. /* only setup the verify callback if a PK is set */
  10717. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  10718. sigCtx->pkCbRsa = Renesas_cmn_SigPkCbRsaVerify;
  10719. sigCtx->pkCtxRsa = (void*)&sigCtx->CertAtt;
  10720. (void)SigPkCbRsaVerify;
  10721. #else
  10722. if (ssl->ctx->RsaVerifyCb) {
  10723. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  10724. sigCtx->pkCtxRsa = ssl;
  10725. }
  10726. #endif
  10727. #endif
  10728. return 0;
  10729. }
  10730. #endif /* HAVE_PK_CALLBACKS */
  10731. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  10732. void DoCertFatalAlert(WOLFSSL* ssl, int ret)
  10733. {
  10734. int alertWhy;
  10735. if (ssl == NULL || ret == 0) {
  10736. return;
  10737. }
  10738. WOLFSSL_ERROR(ret);
  10739. /* Determine alert reason */
  10740. alertWhy = bad_certificate;
  10741. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
  10742. alertWhy = certificate_expired;
  10743. } else if (ret == ASN_NO_SIGNER_E) {
  10744. alertWhy = unknown_ca;
  10745. }
  10746. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD))
  10747. else if (ret == CRL_CERT_REVOKED) {
  10748. alertWhy = certificate_revoked;
  10749. }
  10750. #endif
  10751. else if (ret == NO_PEER_CERT) {
  10752. #ifdef WOLFSSL_TLS13
  10753. if (ssl->options.tls1_3) {
  10754. alertWhy = certificate_required;
  10755. }
  10756. else
  10757. #endif
  10758. {
  10759. alertWhy = handshake_failure;
  10760. }
  10761. }
  10762. /* send fatal alert and mark connection closed */
  10763. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  10764. ssl->options.isClosed = 1;
  10765. }
  10766. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  10767. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  10768. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  10769. * The intermediates are done first then peer leaf cert last. Use the
  10770. * store->error_depth member to determine index (0=peer, >1 intermediates)
  10771. */
  10772. int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret,
  10773. ProcPeerCertArgs* args)
  10774. {
  10775. int verify_ok = 0, use_cb = 0;
  10776. void *heap;
  10777. if (cm == NULL) {
  10778. return BAD_FUNC_ARG;
  10779. }
  10780. heap = (ssl != NULL) ? ssl->heap : cm->heap;
  10781. /* Determine if verify was okay */
  10782. if (ret == 0) {
  10783. verify_ok = 1;
  10784. }
  10785. /* Determine if verify callback should be used */
  10786. if (ret != 0) {
  10787. if ((ssl != NULL) && (!ssl->options.verifyNone)) {
  10788. use_cb = 1; /* always report errors */
  10789. }
  10790. }
  10791. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  10792. /* always use verify callback on peer leaf cert */
  10793. if (args->certIdx == 0) {
  10794. use_cb = 1;
  10795. }
  10796. #endif
  10797. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  10798. /* perform verify callback on other intermediate certs (not just peer) */
  10799. if (args->certIdx > 0) {
  10800. use_cb = 1;
  10801. }
  10802. #endif
  10803. #if defined(OPENSSL_EXTRA)
  10804. /* Perform domain and IP check only for the leaf certificate */
  10805. if (args->certIdx == 0) {
  10806. /* perform domain name check on the peer certificate */
  10807. if (args->dCertInit && args->dCert && (ssl != NULL) &&
  10808. ssl->param && ssl->param->hostName[0]) {
  10809. /* If altNames names is present, then subject common name is ignored */
  10810. if (args->dCert->altNames != NULL) {
  10811. if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
  10812. if (ret == 0) {
  10813. ret = DOMAIN_NAME_MISMATCH;
  10814. WOLFSSL_ERROR_VERBOSE(ret);
  10815. }
  10816. }
  10817. }
  10818. #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  10819. else {
  10820. if (args->dCert->subjectCN) {
  10821. if (MatchDomainName(args->dCert->subjectCN,
  10822. args->dCert->subjectCNLen,
  10823. ssl->param->hostName) == 0) {
  10824. if (ret == 0) {
  10825. ret = DOMAIN_NAME_MISMATCH;
  10826. WOLFSSL_ERROR_VERBOSE(ret);
  10827. }
  10828. }
  10829. }
  10830. }
  10831. #else
  10832. else {
  10833. if (ret == 0) {
  10834. ret = DOMAIN_NAME_MISMATCH;
  10835. WOLFSSL_ERROR_VERBOSE(ret);
  10836. }
  10837. }
  10838. #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
  10839. }
  10840. /* perform IP address check on the peer certificate */
  10841. if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
  10842. (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
  10843. if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
  10844. if (ret == 0) {
  10845. ret = IPADDR_MISMATCH;
  10846. WOLFSSL_ERROR_VERBOSE(ret);
  10847. }
  10848. }
  10849. }
  10850. }
  10851. #endif
  10852. /* if verify callback has been set */
  10853. if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
  10854. #ifdef OPENSSL_ALL
  10855. || (ssl->ctx->verifyCertCb != NULL)
  10856. #endif
  10857. ))
  10858. #ifndef NO_WOLFSSL_CM_VERIFY
  10859. || (cm->verifyCallback != NULL)
  10860. #endif
  10861. ) {
  10862. int verifyFail = 0;
  10863. #ifdef WOLFSSL_SMALL_STACK
  10864. WOLFSSL_X509_STORE_CTX* store;
  10865. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10866. WOLFSSL_X509* x509;
  10867. #endif
  10868. char* domain = NULL;
  10869. #else
  10870. WOLFSSL_X509_STORE_CTX store[1];
  10871. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10872. WOLFSSL_X509 x509[1];
  10873. #endif
  10874. char domain[ASN_NAME_MAX];
  10875. #endif
  10876. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10877. int x509Free = 0;
  10878. #endif
  10879. #ifdef WOLFSSL_SMALL_STACK
  10880. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  10881. sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE);
  10882. if (store == NULL) {
  10883. return MEMORY_E;
  10884. }
  10885. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10886. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  10887. DYNAMIC_TYPE_X509);
  10888. if (x509 == NULL) {
  10889. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  10890. return MEMORY_E;
  10891. }
  10892. #endif
  10893. domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
  10894. if (domain == NULL) {
  10895. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  10896. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10897. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  10898. #endif
  10899. return MEMORY_E;
  10900. }
  10901. #endif /* WOLFSSL_SMALL_STACK */
  10902. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  10903. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10904. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  10905. #endif
  10906. domain[0] = '\0';
  10907. /* build subject CN as string to return in store */
  10908. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  10909. int subjectCNLen = args->dCert->subjectCNLen;
  10910. if (subjectCNLen > ASN_NAME_MAX-1)
  10911. subjectCNLen = ASN_NAME_MAX-1;
  10912. if (subjectCNLen > 0) {
  10913. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  10914. domain[subjectCNLen] = '\0';
  10915. }
  10916. }
  10917. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  10918. store->error = ret;
  10919. #else
  10920. store->error = GetX509Error(ret);
  10921. #endif
  10922. store->error_depth = args->certIdx;
  10923. store->discardSessionCerts = 0;
  10924. store->domain = domain;
  10925. if (ssl != NULL) {
  10926. if (ssl->verifyCbCtx != NULL) {
  10927. /* Use the WOLFSSL user context if set */
  10928. store->userCtx = ssl->verifyCbCtx;
  10929. }
  10930. else {
  10931. /* Else use the WOLFSSL_CTX user context */
  10932. store->userCtx = ssl->ctx->verifyCbCtx;
  10933. }
  10934. }
  10935. else {
  10936. store->userCtx = cm;
  10937. }
  10938. store->certs = args->certs;
  10939. store->totalCerts = args->totalCerts;
  10940. #if defined(HAVE_EX_DATA) && \
  10941. (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  10942. if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
  10943. != WOLFSSL_SUCCESS) {
  10944. WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
  10945. }
  10946. #endif
  10947. if (ssl != NULL) {
  10948. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  10949. store->store = SSL_STORE(ssl);
  10950. #if defined(OPENSSL_EXTRA)
  10951. store->depth = args->count;
  10952. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  10953. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  10954. heap, DYNAMIC_TYPE_OPENSSL);
  10955. if (store->param == NULL) {
  10956. #ifdef WOLFSSL_SMALL_STACK
  10957. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  10958. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10959. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  10960. #endif
  10961. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  10962. #endif
  10963. return MEMORY_E;
  10964. }
  10965. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  10966. /* Overwrite with non-default param values in SSL */
  10967. if (ssl->param) {
  10968. if (ssl->param->check_time)
  10969. store->param->check_time = ssl->param->check_time;
  10970. if (ssl->param->flags)
  10971. store->param->flags = ssl->param->flags;
  10972. if (ssl->param->hostName[0])
  10973. XMEMCPY(store->param->hostName, ssl->param->hostName,
  10974. WOLFSSL_HOST_NAME_MAX);
  10975. }
  10976. #endif /* defined(OPENSSL_EXTRA) */
  10977. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  10978. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10979. #ifdef KEEP_PEER_CERT
  10980. if (args->certIdx == 0) {
  10981. store->current_cert = &ssl->peerCert; /* use existing X509 */
  10982. }
  10983. else
  10984. #endif
  10985. {
  10986. InitX509(x509, 0, heap);
  10987. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  10988. store->current_cert = x509;
  10989. x509Free = 1;
  10990. }
  10991. else {
  10992. FreeX509(x509);
  10993. }
  10994. }
  10995. #endif
  10996. #ifdef SESSION_CERTS
  10997. store->sesChain = &ssl->session->chain;
  10998. #endif
  10999. }
  11000. #ifndef NO_WOLFSSL_CM_VERIFY
  11001. /* non-zero return code indicates failure override */
  11002. if (cm->verifyCallback != NULL) {
  11003. store->userCtx = cm;
  11004. if (cm->verifyCallback(verify_ok, store)) {
  11005. if (ret != 0) {
  11006. WOLFSSL_MSG("Verify CM callback overriding error!");
  11007. ret = 0;
  11008. }
  11009. }
  11010. else {
  11011. verifyFail = 1;
  11012. }
  11013. }
  11014. #endif
  11015. if (ssl != NULL) {
  11016. #ifdef OPENSSL_ALL
  11017. /* non-zero return code indicates failure override */
  11018. if (ssl->ctx->verifyCertCb) {
  11019. if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
  11020. if (ret != 0) {
  11021. WOLFSSL_MSG("Verify Cert callback overriding error!");
  11022. ret = 0;
  11023. }
  11024. }
  11025. else {
  11026. verifyFail = 1;
  11027. }
  11028. }
  11029. #endif
  11030. /* non-zero return code indicates failure override */
  11031. if (ssl->verifyCallback) {
  11032. if (ssl->verifyCallback(verify_ok, store)) {
  11033. if (ret != 0) {
  11034. WOLFSSL_MSG("Verify callback overriding error!");
  11035. ret = 0;
  11036. }
  11037. }
  11038. else {
  11039. verifyFail = 1;
  11040. }
  11041. }
  11042. }
  11043. if (verifyFail) {
  11044. /* induce error if one not present */
  11045. if (ret == 0) {
  11046. ret = VERIFY_CERT_ERROR;
  11047. WOLFSSL_ERROR_VERBOSE(ret);
  11048. }
  11049. /* mark as verify error */
  11050. args->verifyErr = 1;
  11051. }
  11052. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11053. if (x509Free) {
  11054. FreeX509(x509);
  11055. }
  11056. #endif
  11057. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  11058. wolfSSL_sk_X509_pop_free(store->chain, NULL);
  11059. store->chain = NULL;
  11060. #endif
  11061. #ifdef SESSION_CERTS
  11062. if ((ssl != NULL) && (store->discardSessionCerts)) {
  11063. WOLFSSL_MSG("Verify callback requested discard sess certs");
  11064. ssl->session->chain.count = 0;
  11065. #ifdef WOLFSSL_ALT_CERT_CHAINS
  11066. ssl->session->altChain.count = 0;
  11067. #endif
  11068. }
  11069. #endif /* SESSION_CERTS */
  11070. #ifdef OPENSSL_EXTRA
  11071. if ((ssl != NULL) && (store->param)) {
  11072. XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL);
  11073. }
  11074. #endif
  11075. #ifdef WOLFSSL_SMALL_STACK
  11076. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  11077. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11078. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  11079. #endif
  11080. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  11081. #endif
  11082. }
  11083. (void)heap;
  11084. return ret;
  11085. }
  11086. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  11087. {
  11088. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  11089. (void)ssl;
  11090. if (args->certs) {
  11091. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  11092. args->certs = NULL;
  11093. }
  11094. #ifdef WOLFSSL_TLS13
  11095. if (args->exts) {
  11096. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  11097. args->exts = NULL;
  11098. }
  11099. #endif
  11100. if (args->dCert) {
  11101. if (args->dCertInit) {
  11102. FreeDecodedCert(args->dCert);
  11103. args->dCertInit = 0;
  11104. }
  11105. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  11106. args->dCert = NULL;
  11107. }
  11108. }
  11109. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  11110. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  11111. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11112. /* load certificate file which has the form <hash>.(r)N[0..N] */
  11113. /* in the folder. */
  11114. /* (r), in the case of CRL file */
  11115. /* @param store a pointer to X509_STORE structure */
  11116. /* @param issuer a pointer to X509_NAME that presents an issuer */
  11117. /* @param type X509_LU_X509 or X509_LU_CRL */
  11118. /* @return WOLFSSL_SUCCESS on successful, otherwise WOLFSSL_FAILURE */
  11119. int LoadCertByIssuer(WOLFSSL_X509_STORE* store, X509_NAME* issuer, int type)
  11120. {
  11121. const int MAX_SUFFIX = 10;/* The number comes from CA_TABLE_SIZE=10 */
  11122. int ret = WOLFSSL_SUCCESS;
  11123. WOLFSSL_X509_LOOKUP* lookup;
  11124. WOLFSSL_BY_DIR_entry* entry;
  11125. WOLFSSL_BY_DIR_HASH hash_tmp;
  11126. WOLFSSL_BY_DIR_HASH* ph = NULL;
  11127. WOLFSSL_X509* x509;
  11128. unsigned long hash = 0;
  11129. char* filename = NULL;
  11130. const char* post = "";
  11131. byte* pbuf = NULL;
  11132. int len, num, i, idx;
  11133. int suffix = 0;
  11134. int retHash = NOT_COMPILED_IN;
  11135. byte dgt[WC_MAX_DIGEST_SIZE];
  11136. WOLFSSL_ENTER("LoadCertByIssuer");
  11137. /* sanity check */
  11138. if (store == NULL || issuer == NULL || (type != X509_LU_X509 && type != X509_LU_CRL)) {
  11139. return WOLFSSL_FAILURE;
  11140. }
  11141. lookup = &store->lookup;
  11142. if (lookup->dirs == NULL || lookup->type != 1) {
  11143. return WOLFSSL_FAILURE;
  11144. }
  11145. len = wolfSSL_i2d_X509_NAME_canon(issuer, &pbuf);
  11146. if (len > 0) {
  11147. #ifndef NO_SHA
  11148. retHash = wc_ShaHash((const byte*)pbuf, len, dgt);
  11149. #endif
  11150. if (retHash == 0) {
  11151. /* 4 bytes in little endian as unsigned long */
  11152. hash = (((unsigned long)dgt[3] << 24) |
  11153. ((unsigned long)dgt[2] << 16) |
  11154. ((unsigned long)dgt[1] << 8) |
  11155. ((unsigned long)dgt[0]));
  11156. } else {
  11157. WOLFSSL_MSG("failed hash operation");
  11158. return WOLFSSL_FAILURE;
  11159. }
  11160. wolfSSL_OPENSSL_free(pbuf);
  11161. }
  11162. /* try to load each hashed name file in path */
  11163. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11164. if (type == X509_LU_CRL) {
  11165. post = "r";
  11166. }
  11167. num = wolfSSL_sk_BY_DIR_entry_num(lookup->dirs->dir_entry);
  11168. for (i=0; i<num; i++) {
  11169. entry = wolfSSL_sk_BY_DIR_entry_value(lookup->dirs->dir_entry, i);
  11170. if (type == X509_LU_CRL && entry->hashes != NULL &&
  11171. wolfSSL_sk_BY_DIR_HASH_num(entry->hashes) > 0) {
  11172. /* lock the list */
  11173. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  11174. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  11175. return BAD_MUTEX_E;
  11176. }
  11177. hash_tmp.hash_value = hash;
  11178. idx = wolfSSL_sk_BY_DIR_HASH_find(entry->hashes, &hash_tmp);
  11179. if (idx >= 0) {
  11180. WOLFSSL_MSG("find hashed CRL in list");
  11181. ph = wolfSSL_sk_BY_DIR_HASH_value(entry->hashes, idx);
  11182. suffix = ph->last_suffix;
  11183. } else {
  11184. ph = NULL;
  11185. suffix = 0;
  11186. }
  11187. wc_UnLockMutex(&lookup->dirs->lock);
  11188. }
  11189. /* Additional buffer length for file name memory allocation : */
  11190. /* / <hashvalue>.(r)N\0 */
  11191. /*|1| 8 |1|1|1|1| => 13 */
  11192. len = (int)XSTRLEN(entry->dir_name) + 13;
  11193. if (filename != NULL) {
  11194. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11195. }
  11196. filename = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  11197. if (filename == NULL) {
  11198. WOLFSSL_MSG("memory allocation error");
  11199. return MEMORY_E;
  11200. }
  11201. /* set as FAILURE, if successfully loading cert of CRL, this becomes */
  11202. /* WOLFSSL_SUCCESS */
  11203. ret = WOLFSSL_FAILURE;
  11204. for (; suffix < MAX_SUFFIX; suffix++) {
  11205. /* /folder-path/<hash>.(r)N[0..9] */
  11206. if (XSNPRINTF(filename, len, "%s/%08lx.%s%d", entry->dir_name,
  11207. hash, post, suffix)
  11208. >= len)
  11209. {
  11210. WOLFSSL_MSG("buffer overrun in LoadCertByIssuer");
  11211. ret = BUFFER_E;
  11212. break;
  11213. }
  11214. if(wc_FileExists(filename) == 0/*0 file exists */) {
  11215. if (type == X509_LU_X509) {
  11216. x509 = wolfSSL_X509_load_certificate_file(filename,
  11217. WOLFSSL_FILETYPE_PEM);
  11218. if (x509 != NULL) {
  11219. ret = wolfSSL_X509_STORE_add_cert(store, x509);
  11220. wolfSSL_X509_free(x509);
  11221. } else {
  11222. WOLFSSL_MSG("failed to load certificate");
  11223. ret = WOLFSSL_FAILURE;
  11224. break;
  11225. }
  11226. }
  11227. else if (type == X509_LU_CRL) {
  11228. #if defined(HAVE_CRL)
  11229. ret = wolfSSL_X509_load_crl_file(&store->lookup, filename,
  11230. entry->dir_type);
  11231. if (ret != WOLFSSL_SUCCESS) {
  11232. WOLFSSL_MSG("failed to load CRL");
  11233. break;
  11234. }
  11235. #else
  11236. WOLFSSL_MSG("CRL is not supported");
  11237. ret = WOLFSSL_FAILURE;
  11238. break;
  11239. #endif /* HAVE_CRL */
  11240. }
  11241. } else
  11242. break;
  11243. }
  11244. if (ret != WOLFSSL_SUCCESS) {
  11245. WOLFSSL_MSG("not found file");
  11246. ret = WOLFSSL_FAILURE;
  11247. } else {
  11248. if (type == X509_LU_CRL) {
  11249. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  11250. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  11251. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11252. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  11253. return BAD_MUTEX_E;
  11254. }
  11255. if (ph == NULL) {
  11256. ph = wolfSSL_BY_DIR_HASH_new();
  11257. if (ph == NULL) {
  11258. WOLFSSL_MSG("failed to allocate hash stack");
  11259. ret = WOLFSSL_FAILURE;
  11260. } else {
  11261. ph->hash_value = hash;
  11262. ph->last_suffix = suffix;
  11263. ret = wolfSSL_sk_BY_DIR_HASH_push(entry->hashes, ph);
  11264. }
  11265. }
  11266. wc_UnLockMutex(&lookup->dirs->lock);
  11267. }
  11268. }
  11269. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11270. }
  11271. #else
  11272. (void) type;
  11273. (void) ret;
  11274. (void) x509;
  11275. (void) filename;
  11276. (void) suffix;
  11277. (void) num;
  11278. (void) i;
  11279. ret = WOLFSSL_NOT_IMPLEMENTED;
  11280. #endif
  11281. WOLFSSL_LEAVE("LoadCertByIssuer", ret);
  11282. return ret;
  11283. }
  11284. #endif
  11285. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  11286. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  11287. {
  11288. int ret = 0;
  11289. buffer* cert;
  11290. byte* subjectHash = NULL;
  11291. int alreadySigner = 0;
  11292. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11293. int sigRet = 0;
  11294. #endif
  11295. if (ssl == NULL || args == NULL
  11296. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  11297. || args->dCert == NULL
  11298. #endif
  11299. ) {
  11300. return BAD_FUNC_ARG;
  11301. }
  11302. /* check to make sure certificate index is valid */
  11303. if (args->certIdx > args->count)
  11304. return BUFFER_E;
  11305. /* check if returning from non-blocking OCSP */
  11306. /* skip this section because cert is already initialized and parsed */
  11307. #ifdef WOLFSSL_NONBLOCK_OCSP
  11308. if (args->lastErr == OCSP_WANT_READ) {
  11309. args->lastErr = 0; /* clear error */
  11310. return 0;
  11311. }
  11312. #endif
  11313. #ifdef WOLFSSL_TRUST_PEER_CERT
  11314. /* we have trusted peer */
  11315. if (args->haveTrustPeer) {
  11316. return 0;
  11317. }
  11318. #endif
  11319. /* get certificate buffer */
  11320. cert = &args->certs[args->certIdx];
  11321. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11322. if (verify == VERIFY) {
  11323. /* for small cert verify, release decoded cert during signature check to
  11324. reduce peak memory usage */
  11325. if (args->dCert != NULL) {
  11326. if (args->dCertInit) {
  11327. FreeDecodedCert(args->dCert);
  11328. args->dCertInit = 0;
  11329. }
  11330. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  11331. args->dCert = NULL;
  11332. }
  11333. /* perform cert parsing and signature check */
  11334. sigRet = CheckCertSignature(cert->buffer, cert->length,
  11335. ssl->heap, SSL_CM(ssl));
  11336. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  11337. /* verify name only in ParseCertRelative below, signature check done */
  11338. verify = VERIFY_NAME;
  11339. }
  11340. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  11341. /* make sure the decoded cert structure is allocated and initialized */
  11342. if (!args->dCertInit
  11343. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11344. || args->dCert == NULL
  11345. #endif
  11346. ) {
  11347. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11348. if (args->dCert == NULL) {
  11349. args->dCert = (DecodedCert*)XMALLOC(
  11350. sizeof(DecodedCert), ssl->heap,
  11351. DYNAMIC_TYPE_DCERT);
  11352. if (args->dCert == NULL) {
  11353. return MEMORY_E;
  11354. }
  11355. }
  11356. #endif
  11357. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  11358. args->dCertInit = 1;
  11359. args->dCert->sigCtx.devId = ssl->devId;
  11360. #ifdef WOLFSSL_ASYNC_CRYPT
  11361. args->dCert->sigCtx.asyncCtx = ssl;
  11362. #endif
  11363. #ifdef HAVE_PK_CALLBACKS
  11364. /* setup the PK callback context */
  11365. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  11366. if (ret != 0)
  11367. return ret;
  11368. #endif
  11369. }
  11370. /* Parse Certificate */
  11371. ret = ParseCertRelative(args->dCert, certType, verify, SSL_CM(ssl));
  11372. /* perform below checks for date failure cases */
  11373. if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) {
  11374. /* get subject and determine if already loaded */
  11375. #ifndef NO_SKID
  11376. if (args->dCert->extAuthKeyIdSet)
  11377. subjectHash = args->dCert->extSubjKeyId;
  11378. else
  11379. #endif
  11380. subjectHash = args->dCert->subjectHash;
  11381. alreadySigner = AlreadySigner(SSL_CM(ssl), subjectHash);
  11382. }
  11383. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11384. /* get signature check failures from above */
  11385. if (ret == 0)
  11386. ret = sigRet;
  11387. #endif
  11388. if (pSubjectHash)
  11389. *pSubjectHash = subjectHash;
  11390. if (pAlreadySigner)
  11391. *pAlreadySigner = alreadySigner;
  11392. #ifdef WOLFSSL_ASYNC_CRYPT
  11393. if (ret == WC_PENDING_E) {
  11394. ret = wolfSSL_AsyncPush(ssl,
  11395. args->dCert->sigCtx.asyncDev);
  11396. }
  11397. #endif
  11398. return ret;
  11399. }
  11400. /* Check key sizes for certs. Is redundant check since
  11401. ProcessBuffer also performs this check. */
  11402. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  11403. {
  11404. int ret = 0;
  11405. if (ssl->options.verifyNone) {
  11406. return ret;
  11407. }
  11408. switch (args->dCert->keyOID) {
  11409. #ifndef NO_RSA
  11410. #ifdef WC_RSA_PSS
  11411. case RSAPSSk:
  11412. #endif
  11413. case RSAk:
  11414. if (ssl->options.minRsaKeySz < 0 ||
  11415. args->dCert->pubKeySize <
  11416. (word16)ssl->options.minRsaKeySz) {
  11417. WOLFSSL_MSG(
  11418. "RSA key size in cert chain error");
  11419. ret = RSA_KEY_SIZE_E;
  11420. WOLFSSL_ERROR_VERBOSE(ret);
  11421. }
  11422. break;
  11423. #endif /* !NO_RSA */
  11424. #ifdef HAVE_ECC
  11425. case ECDSAk:
  11426. if (ssl->options.minEccKeySz < 0 ||
  11427. args->dCert->pubKeySize <
  11428. (word16)ssl->options.minEccKeySz) {
  11429. WOLFSSL_MSG(
  11430. "ECC key size in cert chain error");
  11431. ret = ECC_KEY_SIZE_E;
  11432. WOLFSSL_ERROR_VERBOSE(ret);
  11433. }
  11434. break;
  11435. #endif /* HAVE_ECC */
  11436. #ifdef HAVE_ED25519
  11437. case ED25519k:
  11438. if (ssl->options.minEccKeySz < 0 ||
  11439. ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  11440. WOLFSSL_MSG(
  11441. "ECC key size in cert chain error");
  11442. ret = ECC_KEY_SIZE_E;
  11443. WOLFSSL_ERROR_VERBOSE(ret);
  11444. }
  11445. break;
  11446. #endif /* HAVE_ED25519 */
  11447. #ifdef HAVE_ED448
  11448. case ED448k:
  11449. if (ssl->options.minEccKeySz < 0 ||
  11450. ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  11451. WOLFSSL_MSG(
  11452. "ECC key size in cert chain error");
  11453. ret = ECC_KEY_SIZE_E;
  11454. WOLFSSL_ERROR_VERBOSE(ret);
  11455. }
  11456. break;
  11457. #endif /* HAVE_ED448 */
  11458. #if defined(HAVE_PQC)
  11459. #if defined(HAVE_FALCON)
  11460. case FALCON_LEVEL1k:
  11461. if (ssl->options.minFalconKeySz < 0 ||
  11462. FALCON_LEVEL1_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  11463. WOLFSSL_MSG("Falcon key size in cert chain error");
  11464. ret = FALCON_KEY_SIZE_E;
  11465. WOLFSSL_ERROR_VERBOSE(ret);
  11466. }
  11467. break;
  11468. case FALCON_LEVEL5k:
  11469. if (ssl->options.minFalconKeySz < 0 ||
  11470. FALCON_LEVEL5_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  11471. WOLFSSL_MSG("Falcon key size in cert chain error");
  11472. ret = FALCON_KEY_SIZE_E;
  11473. WOLFSSL_ERROR_VERBOSE(ret);
  11474. }
  11475. break;
  11476. #endif /* HAVE_FALCON */
  11477. #endif /* HAVE_PQC */
  11478. #if defined(HAVE_DILITHIUM)
  11479. case DILITHIUM_LEVEL2k:
  11480. case DILITHIUM_AES_LEVEL2k:
  11481. if (ssl->options.minDilithiumKeySz < 0 ||
  11482. DILITHIUM_LEVEL2_KEY_SIZE
  11483. < (word16)ssl->options.minDilithiumKeySz) {
  11484. WOLFSSL_MSG("Dilithium key size in cert chain error");
  11485. ret = DILITHIUM_KEY_SIZE_E;
  11486. }
  11487. break;
  11488. case DILITHIUM_LEVEL3k:
  11489. case DILITHIUM_AES_LEVEL3k:
  11490. if (ssl->options.minDilithiumKeySz < 0 ||
  11491. DILITHIUM_LEVEL3_KEY_SIZE
  11492. < (word16)ssl->options.minDilithiumKeySz) {
  11493. WOLFSSL_MSG( "Dilithium key size in cert chain error");
  11494. ret = DILITHIUM_KEY_SIZE_E;
  11495. }
  11496. break;
  11497. case DILITHIUM_LEVEL5k:
  11498. case DILITHIUM_AES_LEVEL5k:
  11499. if (ssl->options.minDilithiumKeySz < 0 ||
  11500. DILITHIUM_LEVEL5_KEY_SIZE
  11501. < (word16)ssl->options.minDilithiumKeySz) {
  11502. WOLFSSL_MSG("Dilithium key size in cert chain error");
  11503. ret = DILITHIUM_KEY_SIZE_E;
  11504. }
  11505. break;
  11506. #endif /* HAVE_DILITHIUM */
  11507. default:
  11508. WOLFSSL_MSG("Key size not checked");
  11509. /* key not being checked for size if not in
  11510. switch */
  11511. break;
  11512. }
  11513. return ret;
  11514. }
  11515. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11516. word32 totalSz)
  11517. {
  11518. int ret = 0;
  11519. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11520. ProcPeerCertArgs* args = NULL;
  11521. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  11522. #elif defined(WOLFSSL_SMALL_STACK)
  11523. ProcPeerCertArgs* args = NULL;
  11524. #else
  11525. ProcPeerCertArgs args[1];
  11526. #endif
  11527. byte* subjectHash = NULL;
  11528. int alreadySigner = 0;
  11529. WOLFSSL_ENTER("ProcessPeerCerts");
  11530. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11531. if (ssl->async == NULL) {
  11532. ssl->async = (struct WOLFSSL_ASYNC*)
  11533. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  11534. DYNAMIC_TYPE_ASYNC);
  11535. if (ssl->async == NULL)
  11536. ERROR_OUT(MEMORY_E, exit_ppc);
  11537. }
  11538. args = (ProcPeerCertArgs*)ssl->async->args;
  11539. #ifdef WOLFSSL_ASYNC_CRYPT
  11540. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  11541. if (ret != WC_NOT_PENDING_E) {
  11542. /* Check for error */
  11543. if (ret < 0)
  11544. goto exit_ppc;
  11545. }
  11546. else
  11547. #endif /* WOLFSSL_ASYNC_CRYPT */
  11548. #ifdef WOLFSSL_NONBLOCK_OCSP
  11549. if (ssl->error == OCSP_WANT_READ) {
  11550. /* Re-entry after non-blocking OCSP */
  11551. #ifdef WOLFSSL_ASYNC_CRYPT
  11552. /* if async operationg not pending, reset error code */
  11553. if (ret == WC_NOT_PENDING_E)
  11554. ret = 0;
  11555. #endif
  11556. }
  11557. else
  11558. #endif /* WOLFSSL_NONBLOCK_OCSP */
  11559. #elif defined(WOLFSSL_SMALL_STACK)
  11560. args = (ProcPeerCertArgs*)XMALLOC(
  11561. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11562. if (args == NULL) {
  11563. ERROR_OUT(MEMORY_E, exit_ppc);
  11564. }
  11565. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  11566. {
  11567. /* Reset state */
  11568. ret = 0;
  11569. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  11570. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  11571. args->idx = *inOutIdx;
  11572. args->begin = *inOutIdx;
  11573. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11574. ssl->async->freeArgs = FreeProcPeerCertArgs;
  11575. #endif
  11576. }
  11577. switch (ssl->options.asyncState)
  11578. {
  11579. case TLS_ASYNC_BEGIN:
  11580. {
  11581. word32 listSz;
  11582. #ifdef WOLFSSL_CALLBACKS
  11583. if (ssl->hsInfoOn)
  11584. AddPacketName(ssl, "Certificate");
  11585. if (ssl->toInfoOn)
  11586. AddLateName("Certificate", &ssl->timeoutInfo);
  11587. #endif
  11588. #ifdef WOLFSSL_TLS13
  11589. if (ssl->options.tls1_3) {
  11590. byte ctxSz;
  11591. /* Certificate Request Context */
  11592. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  11593. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11594. ctxSz = *(input + args->idx);
  11595. args->idx++;
  11596. if ((args->idx - args->begin) + ctxSz > totalSz)
  11597. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11598. #ifndef NO_WOLFSSL_CLIENT
  11599. /* Must be empty when received from server. */
  11600. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11601. if (ctxSz != 0) {
  11602. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  11603. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  11604. }
  11605. }
  11606. #endif
  11607. #ifndef NO_WOLFSSL_SERVER
  11608. /* Must contain value sent in request. */
  11609. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11610. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  11611. ctxSz != 0) {
  11612. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  11613. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  11614. }
  11615. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  11616. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  11617. CertReqCtx* curr = ssl->certReqCtx;
  11618. CertReqCtx* prev = NULL;
  11619. while (curr != NULL) {
  11620. if ((ctxSz == curr->len) &&
  11621. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  11622. == 0) {
  11623. if (prev != NULL)
  11624. prev->next = curr->next;
  11625. else
  11626. ssl->certReqCtx = curr->next;
  11627. XFREE(curr, ssl->heap,
  11628. DYNAMIC_TYPE_TMP_BUFFER);
  11629. break;
  11630. }
  11631. prev = curr;
  11632. curr = curr->next;
  11633. }
  11634. if (curr == NULL)
  11635. #endif
  11636. {
  11637. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  11638. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  11639. }
  11640. }
  11641. }
  11642. #endif
  11643. args->idx += ctxSz;
  11644. /* allocate buffer for cert extensions */
  11645. args->exts = (buffer*)XMALLOC(sizeof(buffer) *
  11646. MAX_CHAIN_DEPTH, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  11647. if (args->exts == NULL) {
  11648. ERROR_OUT(MEMORY_E, exit_ppc);
  11649. }
  11650. }
  11651. #endif
  11652. /* allocate buffer for certs */
  11653. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  11654. ssl->heap, DYNAMIC_TYPE_DER);
  11655. if (args->certs == NULL) {
  11656. ERROR_OUT(MEMORY_E, exit_ppc);
  11657. }
  11658. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  11659. /* Certificate List */
  11660. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  11661. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11662. }
  11663. c24to32(input + args->idx, &listSz);
  11664. args->idx += OPAQUE24_LEN;
  11665. if (listSz > MAX_CERTIFICATE_SZ) {
  11666. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11667. }
  11668. if ((args->idx - args->begin) + listSz != totalSz) {
  11669. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11670. }
  11671. WOLFSSL_MSG("Loading peer's cert chain");
  11672. /* first put cert chain into buffer so can verify top down
  11673. we're sent bottom up */
  11674. while (listSz) {
  11675. word32 certSz;
  11676. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11677. if (args->totalCerts >= MAX_CHAIN_DEPTH) {
  11678. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11679. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  11680. ret = MAX_CHAIN_ERROR;
  11681. WOLFSSL_ERROR_VERBOSE(ret);
  11682. WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
  11683. break; /* break out to avoid reading more certs then buffer
  11684. * can hold */
  11685. }
  11686. #else
  11687. if (args->totalCerts >= ssl->verifyDepth ||
  11688. args->totalCerts >= MAX_CHAIN_DEPTH) {
  11689. WOLFSSL_ERROR_VERBOSE(MAX_CHAIN_ERROR);
  11690. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  11691. }
  11692. #endif
  11693. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  11694. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11695. }
  11696. c24to32(input + args->idx, &certSz);
  11697. args->idx += OPAQUE24_LEN;
  11698. if ((args->idx - args->begin) + certSz > totalSz) {
  11699. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11700. }
  11701. args->certs[args->totalCerts].length = certSz;
  11702. args->certs[args->totalCerts].buffer = input + args->idx;
  11703. #ifdef SESSION_CERTS
  11704. AddSessionCertToChain(&ssl->session->chain,
  11705. input + args->idx, certSz);
  11706. #endif /* SESSION_CERTS */
  11707. args->idx += certSz;
  11708. listSz -= certSz + CERT_HEADER_SZ;
  11709. #ifdef WOLFSSL_TLS13
  11710. /* Extensions */
  11711. if (ssl->options.tls1_3) {
  11712. word16 extSz;
  11713. if (args->exts == NULL) {
  11714. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11715. }
  11716. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  11717. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11718. }
  11719. ato16(input + args->idx, &extSz);
  11720. args->idx += OPAQUE16_LEN;
  11721. if ((args->idx - args->begin) + extSz > totalSz) {
  11722. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11723. }
  11724. /* Store extension data info for later processing. */
  11725. args->exts[args->totalCerts].length = extSz;
  11726. args->exts[args->totalCerts].buffer = input + args->idx;
  11727. args->idx += extSz;
  11728. listSz -= extSz + OPAQUE16_LEN;
  11729. WOLFSSL_MSG_EX("\tParsing %d bytes of cert extensions",
  11730. args->exts[args->totalCerts].length);
  11731. #if !defined(NO_TLS)
  11732. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  11733. (word16)args->exts[args->totalCerts].length,
  11734. certificate, NULL);
  11735. #endif /* !NO_TLS */
  11736. if (ret < 0) {
  11737. WOLFSSL_ERROR_VERBOSE(ret);
  11738. ERROR_OUT(ret, exit_ppc);
  11739. }
  11740. }
  11741. #endif
  11742. args->totalCerts++;
  11743. WOLFSSL_MSG("\tPut another cert into chain");
  11744. } /* while (listSz) */
  11745. args->count = args->totalCerts;
  11746. args->certIdx = 0; /* select peer cert (first one) */
  11747. if (args->count == 0) {
  11748. /* Empty certificate message. */
  11749. if ((ssl->options.side == WOLFSSL_SERVER_END) &&
  11750. (ssl->options.mutualAuth || (ssl->options.failNoCert &&
  11751. IsAtLeastTLSv1_3(ssl->version)))) {
  11752. WOLFSSL_MSG("No peer cert from Client");
  11753. ret = NO_PEER_CERT;
  11754. WOLFSSL_ERROR_VERBOSE(ret);
  11755. DoCertFatalAlert(ssl, ret);
  11756. }
  11757. else if ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  11758. IsAtLeastTLSv1_3(ssl->version)) {
  11759. WOLFSSL_MSG("No peer cert from Server");
  11760. ret = NO_PEER_CERT;
  11761. WOLFSSL_ERROR_VERBOSE(ret);
  11762. SendAlert(ssl, alert_fatal, decode_error);
  11763. }
  11764. }
  11765. args->dCertInit = 0;
  11766. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  11767. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  11768. DYNAMIC_TYPE_DCERT);
  11769. if (args->dCert == NULL) {
  11770. ERROR_OUT(MEMORY_E, exit_ppc);
  11771. }
  11772. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  11773. #endif
  11774. /* Advance state and proceed */
  11775. ssl->options.asyncState = TLS_ASYNC_BUILD;
  11776. } /* case TLS_ASYNC_BEGIN */
  11777. FALL_THROUGH;
  11778. case TLS_ASYNC_BUILD:
  11779. {
  11780. if (args->count > 0) {
  11781. /* check for trusted peer and get untrustedDepth */
  11782. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  11783. if (args->certIdx == 0) {
  11784. #ifdef WOLFSSL_TRUST_PEER_CERT
  11785. TrustedPeerCert* tp;
  11786. #endif
  11787. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  11788. &subjectHash, &alreadySigner);
  11789. if (ret != 0)
  11790. goto exit_ppc;
  11791. #ifdef OPENSSL_EXTRA
  11792. /* Determine untrusted depth */
  11793. if (!alreadySigner && (!args->dCert ||
  11794. !args->dCertInit || !args->dCert->selfSigned)) {
  11795. args->untrustedDepth = 1;
  11796. }
  11797. #endif
  11798. #ifdef WOLFSSL_TRUST_PEER_CERT
  11799. tp = GetTrustedPeer(SSL_CM(ssl), args->dCert);
  11800. WOLFSSL_MSG("Checking for trusted peer cert");
  11801. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  11802. WOLFSSL_MSG("Found matching trusted peer cert");
  11803. args->haveTrustPeer = 1;
  11804. }
  11805. else if (tp == NULL) {
  11806. /* no trusted peer cert */
  11807. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  11808. }
  11809. else {
  11810. WOLFSSL_MSG("Trusted peer cert did not match!");
  11811. }
  11812. if (!args->haveTrustPeer)
  11813. #endif
  11814. {
  11815. /* free cert if not trusted peer */
  11816. FreeDecodedCert(args->dCert);
  11817. args->dCertInit = 0;
  11818. }
  11819. }
  11820. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  11821. /* check certificate up to peer's first */
  11822. /* do not verify chain if trusted peer cert found */
  11823. while (args->count > 1
  11824. #ifdef WOLFSSL_TRUST_PEER_CERT
  11825. && !args->haveTrustPeer
  11826. #endif /* WOLFSSL_TRUST_PEER_CERT */
  11827. ) {
  11828. int skipAddCA = 0;
  11829. /* select last certificate */
  11830. args->certIdx = args->count - 1;
  11831. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  11832. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  11833. &subjectHash, &alreadySigner);
  11834. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  11835. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  11836. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11837. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  11838. WOLFSSL_MSG("try to load certificate if hash dir is set");
  11839. ret = LoadCertByIssuer(SSL_STORE(ssl),
  11840. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  11841. X509_LU_X509);
  11842. if (ret == WOLFSSL_SUCCESS) {
  11843. FreeDecodedCert(args->dCert);
  11844. args->dCertInit = 0;
  11845. /* once again */
  11846. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  11847. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  11848. &subjectHash, &alreadySigner);
  11849. }
  11850. else {
  11851. ret = ASN_NO_SIGNER_E;
  11852. WOLFSSL_ERROR_VERBOSE(ret);
  11853. }
  11854. }
  11855. #endif
  11856. #ifdef WOLFSSL_ASYNC_CRYPT
  11857. if (ret == WC_PENDING_E)
  11858. goto exit_ppc;
  11859. #endif
  11860. if (ret == 0) {
  11861. ret = ProcessPeerCertCheckKey(ssl, args);
  11862. }
  11863. if (ret == 0 && args->dCert->isCA == 0) {
  11864. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  11865. }
  11866. else if (ret == 0 && ssl->options.verifyNone) {
  11867. WOLFSSL_MSG("Chain cert not verified by option, "
  11868. "not adding as CA");
  11869. }
  11870. else if (ret == 0) {
  11871. #ifdef OPENSSL_EXTRA
  11872. if (args->certIdx > args->untrustedDepth) {
  11873. args->untrustedDepth = (char)args->certIdx + 1;
  11874. }
  11875. #endif
  11876. if (alreadySigner) {
  11877. WOLFSSL_MSG("Verified CA from chain and already had it");
  11878. }
  11879. }
  11880. else {
  11881. WOLFSSL_MSG("Failed to verify CA from chain");
  11882. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11883. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11884. ssl->peerVerifyRet = X509_V_ERR_INVALID_CA;
  11885. #endif
  11886. }
  11887. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  11888. if (ret == 0) {
  11889. int doCrlLookup = 1;
  11890. #ifdef HAVE_OCSP
  11891. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  11892. if (ssl->status_request_v2) {
  11893. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  11894. args->dCert, 0, ssl->heap);
  11895. }
  11896. else /* skips OCSP and force CRL check */
  11897. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  11898. if (SSL_CM(ssl)->ocspEnabled &&
  11899. SSL_CM(ssl)->ocspCheckAll) {
  11900. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  11901. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  11902. args->dCert, NULL, ssl);
  11903. #ifdef WOLFSSL_NONBLOCK_OCSP
  11904. if (ret == OCSP_WANT_READ) {
  11905. args->lastErr = ret;
  11906. goto exit_ppc;
  11907. }
  11908. #endif
  11909. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  11910. if (ret != 0) {
  11911. doCrlLookup = 0;
  11912. WOLFSSL_ERROR_VERBOSE(ret);
  11913. WOLFSSL_MSG("\tOCSP Lookup not ok");
  11914. }
  11915. }
  11916. #endif /* HAVE_OCSP */
  11917. #ifdef HAVE_CRL
  11918. if (ret == 0 && doCrlLookup &&
  11919. SSL_CM(ssl)->crlEnabled &&
  11920. SSL_CM(ssl)->crlCheckAll) {
  11921. WOLFSSL_MSG("Doing Non Leaf CRL check");
  11922. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  11923. #ifdef WOLFSSL_NONBLOCK_OCSP
  11924. if (ret == OCSP_WANT_READ) {
  11925. args->lastErr = ret;
  11926. goto exit_ppc;
  11927. }
  11928. #endif
  11929. if (ret != 0) {
  11930. WOLFSSL_ERROR_VERBOSE(ret);
  11931. WOLFSSL_MSG("\tCRL check not ok");
  11932. }
  11933. }
  11934. #endif /* HAVE_CRL */
  11935. (void)doCrlLookup;
  11936. }
  11937. #endif /* HAVE_OCSP || HAVE_CRL */
  11938. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11939. if (ret == 0 &&
  11940. /* extend the limit "+1" until reaching
  11941. * an ultimately trusted issuer.*/
  11942. args->count > (ssl->verifyDepth + 1)) {
  11943. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11944. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  11945. ret = MAX_CHAIN_ERROR;
  11946. WOLFSSL_ERROR_VERBOSE(ret);
  11947. }
  11948. #endif
  11949. #ifdef WOLFSSL_ALT_CERT_CHAINS
  11950. /* For alternate cert chain, its okay for a CA cert to fail
  11951. with ASN_NO_SIGNER_E here. The "alternate" certificate
  11952. chain mode only requires that the peer certificate
  11953. validate to a trusted CA */
  11954. if (ret != 0 && args->dCert->isCA) {
  11955. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  11956. if (!ssl->options.usingAltCertChain) {
  11957. WOLFSSL_MSG("Trying alternate cert chain");
  11958. ssl->options.usingAltCertChain = 1;
  11959. }
  11960. ret = 0; /* clear errors and continue */
  11961. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11962. ssl->peerVerifyRet = 0;
  11963. #endif
  11964. args->verifyErr = 0;
  11965. }
  11966. /* do not add to certificate manager */
  11967. skipAddCA = 1;
  11968. }
  11969. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  11970. /* Do verify callback */
  11971. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  11972. if (ssl->options.verifyNone &&
  11973. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  11974. ret == CRL_CERT_DATE_ERR)) {
  11975. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  11976. ret = ssl->error = 0;
  11977. }
  11978. /* If valid CA then add to Certificate Manager */
  11979. if (ret == 0 && args->dCert->isCA &&
  11980. !ssl->options.verifyNone && !skipAddCA) {
  11981. buffer* cert = &args->certs[args->certIdx];
  11982. /* Is valid CA */
  11983. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  11984. /* if using alternate chain, store the cert used */
  11985. if (ssl->options.usingAltCertChain) {
  11986. AddSessionCertToChain(&ssl->session->altChain,
  11987. cert->buffer, cert->length);
  11988. }
  11989. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  11990. if (!alreadySigner) {
  11991. DerBuffer* add = NULL;
  11992. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  11993. if (ret < 0)
  11994. goto exit_ppc;
  11995. XMEMCPY(add->buffer, cert->buffer, cert->length);
  11996. /* CA already verified above in ParseCertRelative */
  11997. WOLFSSL_MSG("Adding CA from chain");
  11998. ret = AddCA(SSL_CM(ssl), &add, WOLFSSL_CHAIN_CA,
  11999. NO_VERIFY);
  12000. if (ret == WOLFSSL_SUCCESS) {
  12001. ret = 0;
  12002. }
  12003. }
  12004. }
  12005. /* Handle error codes */
  12006. if (ret != 0) {
  12007. if (!ssl->options.verifyNone) {
  12008. WOLFSSL_ERROR_VERBOSE(ret);
  12009. DoCertFatalAlert(ssl, ret);
  12010. }
  12011. ssl->error = ret; /* Report SSL error */
  12012. if (args->lastErr == 0) {
  12013. args->lastErr = ret; /* save error from last time */
  12014. ret = 0; /* reset error */
  12015. }
  12016. }
  12017. FreeDecodedCert(args->dCert);
  12018. args->dCertInit = 0;
  12019. args->count--;
  12020. } /* while (count > 0 && !args->haveTrustPeer) */
  12021. } /* if (count > 0) */
  12022. /* Check for error */
  12023. if (ret != 0) {
  12024. goto exit_ppc;
  12025. }
  12026. /* Advance state and proceed */
  12027. ssl->options.asyncState = TLS_ASYNC_DO;
  12028. } /* case TLS_ASYNC_BUILD */
  12029. FALL_THROUGH;
  12030. case TLS_ASYNC_DO:
  12031. {
  12032. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  12033. if (args->count > 0) {
  12034. WOLFSSL_MSG("Verifying Peer's cert");
  12035. /* select peer cert (first one) */
  12036. args->certIdx = 0;
  12037. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  12038. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  12039. &subjectHash, &alreadySigner);
  12040. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  12041. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  12042. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  12043. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  12044. int lastErr = ret; /* save error from last time */
  12045. WOLFSSL_MSG("try to load certificate if hash dir is set");
  12046. ret = LoadCertByIssuer(SSL_STORE(ssl),
  12047. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  12048. X509_LU_X509);
  12049. if (ret == WOLFSSL_SUCCESS) {
  12050. FreeDecodedCert(args->dCert);
  12051. args->dCertInit = 0;
  12052. /* once again */
  12053. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  12054. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  12055. &subjectHash, &alreadySigner);
  12056. }
  12057. else {
  12058. ret = lastErr; /* restore error */
  12059. WOLFSSL_ERROR_VERBOSE(ret);
  12060. }
  12061. }
  12062. #endif
  12063. #ifdef WOLFSSL_ASYNC_CRYPT
  12064. if (ret == WC_PENDING_E)
  12065. goto exit_ppc;
  12066. #endif
  12067. if (ret == 0) {
  12068. WOLFSSL_MSG("Verified Peer's cert");
  12069. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12070. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12071. ssl->peerVerifyRet = X509_V_OK;
  12072. #endif
  12073. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  12074. /* if using alternate chain, store the cert used */
  12075. if (ssl->options.usingAltCertChain) {
  12076. buffer* cert = &args->certs[args->certIdx];
  12077. AddSessionCertToChain(&ssl->session->altChain,
  12078. cert->buffer, cert->length);
  12079. }
  12080. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  12081. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  12082. /* Check peer's certificate version number. TLS 1.2 / 1.3
  12083. * requires the clients certificate be version 3 unless a
  12084. * different version has been negotiated using RFC 7250.
  12085. * OpenSSL doesn't appear to be performing this check.
  12086. * For TLS 1.3 see RFC8446 Section 4.4.2.3 */
  12087. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12088. if (args->dCert->version != WOLFSSL_X509_V3) {
  12089. WOLFSSL_MSG("Peers certificate was not version 3!");
  12090. args->lastErr = ASN_VERSION_E;
  12091. /* setting last error but not considering it fatal
  12092. * giving the user a chance to override */
  12093. }
  12094. }
  12095. #endif
  12096. /* check if fatal error */
  12097. if (args->verifyErr) {
  12098. args->fatal = 1;
  12099. ret = args->lastErr;
  12100. }
  12101. else {
  12102. args->fatal = 0;
  12103. }
  12104. }
  12105. else if (ret == ASN_PARSE_E || ret == BUFFER_E) {
  12106. WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR");
  12107. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
  12108. defined(OPENSSL_EXTRA_X509_SMALL)
  12109. DoCertFatalAlert(ssl, ret);
  12110. #endif
  12111. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12112. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12113. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  12114. #endif
  12115. args->fatal = 1;
  12116. }
  12117. else {
  12118. WOLFSSL_MSG("Failed to verify Peer's cert");
  12119. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12120. if (ssl->peerVerifyRet == 0) { /* Return first cert error here */
  12121. if (ret == ASN_BEFORE_DATE_E) {
  12122. ssl->peerVerifyRet =
  12123. (unsigned long)X509_V_ERR_CERT_NOT_YET_VALID;
  12124. }
  12125. else if (ret == ASN_AFTER_DATE_E) {
  12126. ssl->peerVerifyRet =
  12127. (unsigned long)X509_V_ERR_CERT_HAS_EXPIRED;
  12128. }
  12129. else {
  12130. ssl->peerVerifyRet =
  12131. (unsigned long)
  12132. X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  12133. }
  12134. }
  12135. #endif
  12136. if (ssl->verifyCallback) {
  12137. WOLFSSL_MSG(
  12138. "\tCallback override available, will continue");
  12139. /* check if fatal error */
  12140. args->fatal = (args->verifyErr) ? 1 : 0;
  12141. if (args->fatal)
  12142. DoCertFatalAlert(ssl, ret);
  12143. }
  12144. else {
  12145. WOLFSSL_MSG("\tNo callback override available, fatal");
  12146. args->fatal = 1;
  12147. DoCertFatalAlert(ssl, ret);
  12148. }
  12149. }
  12150. #ifdef HAVE_SECURE_RENEGOTIATION
  12151. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  12152. && ssl->secure_renegotiation
  12153. && ssl->secure_renegotiation->enabled) {
  12154. if (IsEncryptionOn(ssl, 0)) {
  12155. /* compare against previous time */
  12156. if (ssl->secure_renegotiation->subject_hash_set) {
  12157. if (XMEMCMP(args->dCert->subjectHash,
  12158. ssl->secure_renegotiation->subject_hash,
  12159. KEYID_SIZE) != 0) {
  12160. WOLFSSL_MSG(
  12161. "Peer sent different cert during scr, fatal");
  12162. args->fatal = 1;
  12163. ret = SCR_DIFFERENT_CERT_E;
  12164. WOLFSSL_ERROR_VERBOSE(ret);
  12165. }
  12166. }
  12167. }
  12168. /* cache peer's hash */
  12169. if (args->fatal == 0) {
  12170. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  12171. args->dCert->subjectHash, KEYID_SIZE);
  12172. ssl->secure_renegotiation->subject_hash_set = 1;
  12173. }
  12174. }
  12175. #endif /* HAVE_SECURE_RENEGOTIATION */
  12176. } /* if (count > 0) */
  12177. /* Check for error */
  12178. if (args->fatal && ret != 0) {
  12179. goto exit_ppc;
  12180. }
  12181. /* Advance state and proceed */
  12182. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  12183. } /* case TLS_ASYNC_DO */
  12184. FALL_THROUGH;
  12185. case TLS_ASYNC_VERIFY:
  12186. {
  12187. if (args->count > 0) {
  12188. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  12189. /* only attempt to check OCSP or CRL if not previous error such
  12190. * as ASN_BEFORE_DATE_E or ASN_AFTER_DATE_E */
  12191. if (args->fatal == 0 && ret == 0) {
  12192. int doLookup = 1;
  12193. WOLFSSL_MSG("Checking if ocsp needed");
  12194. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12195. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  12196. if (ssl->status_request) {
  12197. args->fatal = (TLSX_CSR_InitRequest(ssl->extensions,
  12198. args->dCert, ssl->heap) != 0);
  12199. doLookup = 0;
  12200. WOLFSSL_MSG("\tHave status request");
  12201. #if defined(WOLFSSL_TLS13)
  12202. if (ssl->options.tls1_3) {
  12203. TLSX* ext = TLSX_Find(ssl->extensions,
  12204. TLSX_STATUS_REQUEST);
  12205. if (ext != NULL) {
  12206. word32 idx = 0;
  12207. CertificateStatusRequest* csr =
  12208. (CertificateStatusRequest*)ext->data;
  12209. ret = ProcessCSR(ssl, csr->response.buffer,
  12210. &idx, csr->response.length);
  12211. if (ret < 0) {
  12212. WOLFSSL_ERROR_VERBOSE(ret);
  12213. goto exit_ppc;
  12214. }
  12215. }
  12216. }
  12217. #endif
  12218. }
  12219. /* Ensure a stapling response was seen */
  12220. else if (ssl->options.tls1_3 &&
  12221. SSL_CM(ssl)->ocspMustStaple) {
  12222. ret = OCSP_CERT_UNKNOWN;
  12223. goto exit_ppc;
  12224. }
  12225. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  12226. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  12227. if (ssl->status_request_v2) {
  12228. args->fatal = (TLSX_CSR2_InitRequests(ssl->extensions,
  12229. args->dCert, 1, ssl->heap) != 0);
  12230. doLookup = 0;
  12231. WOLFSSL_MSG("\tHave status request v2");
  12232. }
  12233. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  12234. }
  12235. #ifdef HAVE_OCSP
  12236. if (doLookup && SSL_CM(ssl)->ocspEnabled) {
  12237. WOLFSSL_MSG("Doing Leaf OCSP check");
  12238. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  12239. args->dCert, NULL, ssl);
  12240. #ifdef WOLFSSL_NONBLOCK_OCSP
  12241. if (ret == OCSP_WANT_READ) {
  12242. goto exit_ppc;
  12243. }
  12244. #endif
  12245. doLookup = (ret == OCSP_CERT_UNKNOWN);
  12246. if (ret != 0) {
  12247. WOLFSSL_MSG("\tOCSP Lookup not ok");
  12248. args->fatal = 0;
  12249. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12250. if (ssl->peerVerifyRet == 0) {
  12251. /* Return first cert error here */
  12252. ssl->peerVerifyRet =
  12253. ret == OCSP_CERT_REVOKED
  12254. ? X509_V_ERR_CERT_REVOKED
  12255. : X509_V_ERR_CERT_REJECTED;
  12256. }
  12257. #endif
  12258. }
  12259. }
  12260. #endif /* HAVE_OCSP */
  12261. #ifdef HAVE_CRL
  12262. if (ret == 0 && doLookup && SSL_CM(ssl)->crlEnabled) {
  12263. WOLFSSL_MSG("Doing Leaf CRL check");
  12264. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  12265. #ifdef WOLFSSL_NONBLOCK_OCSP
  12266. if (ret == OCSP_WANT_READ) {
  12267. goto exit_ppc;
  12268. }
  12269. #endif
  12270. if (ret != 0) {
  12271. WOLFSSL_MSG("\tCRL check not ok");
  12272. args->fatal = 0;
  12273. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12274. if (ssl->peerVerifyRet == 0) {
  12275. /* Return first cert error here */
  12276. ssl->peerVerifyRet =
  12277. ret == CRL_CERT_REVOKED
  12278. ? X509_V_ERR_CERT_REVOKED
  12279. : X509_V_ERR_CERT_REJECTED;;
  12280. }
  12281. #endif
  12282. }
  12283. }
  12284. #endif /* HAVE_CRL */
  12285. (void)doLookup;
  12286. }
  12287. #endif /* HAVE_OCSP || HAVE_CRL */
  12288. #ifdef KEEP_PEER_CERT
  12289. if (args->fatal == 0) {
  12290. int copyRet = 0;
  12291. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  12292. if (ssl->options.handShakeDone) {
  12293. FreeX509(&ssl->peerCert);
  12294. InitX509(&ssl->peerCert, 0, ssl->heap);
  12295. }
  12296. else
  12297. #endif
  12298. #ifdef HAVE_SECURE_RENEGOTIATION
  12299. if (ssl->secure_renegotiation &&
  12300. ssl->secure_renegotiation->enabled) {
  12301. /* free old peer cert */
  12302. FreeX509(&ssl->peerCert);
  12303. InitX509(&ssl->peerCert, 0, ssl->heap);
  12304. }
  12305. else
  12306. #endif
  12307. {
  12308. }
  12309. /* set X509 format for peer cert */
  12310. copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
  12311. if (copyRet == MEMORY_E) {
  12312. args->fatal = 1;
  12313. }
  12314. }
  12315. #endif /* KEEP_PEER_CERT */
  12316. #ifndef IGNORE_KEY_EXTENSIONS
  12317. #if defined(OPENSSL_EXTRA)
  12318. /* when compatibility layer is turned on and no verify is
  12319. * set then ignore the certificate key extension */
  12320. if (args->dCert->extKeyUsageSet &&
  12321. args->dCert->extKeyUsageCrit == 0 &&
  12322. ssl->options.verifyNone) {
  12323. WOLFSSL_MSG("Not verifying certificate key usage");
  12324. }
  12325. else
  12326. #endif
  12327. if (args->dCert->extKeyUsageSet) {
  12328. if ((ssl->specs.kea == rsa_kea) &&
  12329. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  12330. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  12331. ret = KEYUSE_ENCIPHER_E;
  12332. WOLFSSL_ERROR_VERBOSE(ret);
  12333. }
  12334. if ((ssl->specs.kea != rsa_kea) &&
  12335. (ssl->specs.sig_algo == rsa_sa_algo ||
  12336. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  12337. !ssl->specs.static_ecdh)) &&
  12338. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  12339. WOLFSSL_MSG("KeyUse Digital Sig not set");
  12340. ret = KEYUSE_SIGNATURE_E;
  12341. WOLFSSL_ERROR_VERBOSE(ret);
  12342. }
  12343. }
  12344. #if defined(OPENSSL_EXTRA)
  12345. /* when compatibility layer is turned on and no verify is
  12346. * set then ignore the certificate key extension */
  12347. if (args->dCert->extExtKeyUsageSet &&
  12348. args->dCert->extExtKeyUsageCrit == 0 &&
  12349. ssl->options.verifyNone) {
  12350. WOLFSSL_MSG("Not verifying certificate ext key usage");
  12351. }
  12352. else
  12353. #endif
  12354. if (args->dCert->extExtKeyUsageSet) {
  12355. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12356. if ((args->dCert->extExtKeyUsage &
  12357. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  12358. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  12359. ret = EXTKEYUSE_AUTH_E;
  12360. WOLFSSL_ERROR_VERBOSE(ret);
  12361. }
  12362. }
  12363. else {
  12364. if ((args->dCert->extExtKeyUsage &
  12365. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  12366. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  12367. ret = EXTKEYUSE_AUTH_E;
  12368. WOLFSSL_ERROR_VERBOSE(ret);
  12369. }
  12370. }
  12371. }
  12372. #endif /* IGNORE_KEY_EXTENSIONS */
  12373. if (args->fatal) {
  12374. ssl->error = ret;
  12375. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12376. SendAlert(ssl, alert_fatal, bad_certificate);
  12377. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12378. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  12379. #endif
  12380. goto exit_ppc;
  12381. }
  12382. /* Certificate validated and stored. */
  12383. ssl->options.havePeerCert = 1;
  12384. #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_RSA)
  12385. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  12386. ssl->specs.sig_algo == rsa_kea) {
  12387. /* CLIENT: No ServerKeyExchange message sent by server. */
  12388. ssl->options.peerAuthGood = 1;
  12389. }
  12390. #endif
  12391. #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_ECC)
  12392. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  12393. ssl->specs.static_ecdh) {
  12394. /* CLIENT: No ServerKeyExchange message sent by server. */
  12395. ssl->options.peerAuthGood = 1;
  12396. }
  12397. #endif
  12398. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  12399. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  12400. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  12401. * are to be bound into a certificate, the subject
  12402. * alternative name extension MUST be used." */
  12403. if (args->dCert->altNames) {
  12404. if (CheckForAltNames(args->dCert,
  12405. (char*)ssl->buffers.domainName.buffer,
  12406. NULL) != 1) {
  12407. WOLFSSL_MSG("DomainName match on alt names failed");
  12408. /* try to get peer key still */
  12409. ret = DOMAIN_NAME_MISMATCH;
  12410. WOLFSSL_ERROR_VERBOSE(ret);
  12411. }
  12412. }
  12413. else {
  12414. if (MatchDomainName(
  12415. args->dCert->subjectCN,
  12416. args->dCert->subjectCNLen,
  12417. (char*)ssl->buffers.domainName.buffer) == 0) {
  12418. WOLFSSL_MSG("DomainName match on common name failed");
  12419. ret = DOMAIN_NAME_MISMATCH;
  12420. WOLFSSL_ERROR_VERBOSE(ret);
  12421. }
  12422. }
  12423. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  12424. /* Old behavior. */
  12425. if (MatchDomainName(args->dCert->subjectCN,
  12426. args->dCert->subjectCNLen,
  12427. (char*)ssl->buffers.domainName.buffer) == 0) {
  12428. WOLFSSL_MSG("DomainName match on common name failed");
  12429. if (CheckForAltNames(args->dCert,
  12430. (char*)ssl->buffers.domainName.buffer,
  12431. NULL) != 1) {
  12432. WOLFSSL_MSG(
  12433. "DomainName match on alt names failed too");
  12434. /* try to get peer key still */
  12435. ret = DOMAIN_NAME_MISMATCH;
  12436. WOLFSSL_ERROR_VERBOSE(ret);
  12437. }
  12438. }
  12439. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  12440. }
  12441. /* decode peer key */
  12442. switch (args->dCert->keyOID) {
  12443. #ifndef NO_RSA
  12444. #ifdef WC_RSA_PSS
  12445. case RSAPSSk:
  12446. #endif
  12447. case RSAk:
  12448. {
  12449. word32 keyIdx = 0;
  12450. int keyRet = 0;
  12451. if (ssl->peerRsaKey == NULL) {
  12452. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  12453. (void**)&ssl->peerRsaKey);
  12454. } else if (ssl->peerRsaKeyPresent) {
  12455. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  12456. ssl->peerRsaKey);
  12457. ssl->peerRsaKeyPresent = 0;
  12458. }
  12459. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  12460. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  12461. args->dCert->pubKeySize) != 0) {
  12462. ret = PEER_KEY_ERROR;
  12463. WOLFSSL_ERROR_VERBOSE(ret);
  12464. }
  12465. else {
  12466. ssl->peerRsaKeyPresent = 1;
  12467. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || \
  12468. defined(WOLFSSL_RENESAS_SCEPROTECT)
  12469. /* copy encrypted tsip key index into ssl object */
  12470. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  12471. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12472. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  12473. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  12474. ssl->heap, DYNAMIC_TYPE_RSA);
  12475. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12476. args->lastErr = MEMORY_E;
  12477. goto exit_ppc;
  12478. }
  12479. }
  12480. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  12481. args->dCert->sce_tsip_encRsaKeyIdx,
  12482. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  12483. }
  12484. #endif
  12485. #ifdef HAVE_PK_CALLBACKS
  12486. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  12487. defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  12488. if (ssl->buffers.peerRsaKey.buffer) {
  12489. XFREE(ssl->buffers.peerRsaKey.buffer,
  12490. ssl->heap, DYNAMIC_TYPE_RSA);
  12491. ssl->buffers.peerRsaKey.buffer = NULL;
  12492. }
  12493. #endif
  12494. ssl->buffers.peerRsaKey.buffer =
  12495. (byte*)XMALLOC(args->dCert->pubKeySize,
  12496. ssl->heap, DYNAMIC_TYPE_RSA);
  12497. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  12498. ret = MEMORY_ERROR;
  12499. }
  12500. else {
  12501. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  12502. args->dCert->publicKey,
  12503. args->dCert->pubKeySize);
  12504. ssl->buffers.peerRsaKey.length =
  12505. args->dCert->pubKeySize;
  12506. }
  12507. #endif /* HAVE_PK_CALLBACKS */
  12508. }
  12509. /* check size of peer RSA key */
  12510. if (ret == 0 && ssl->peerRsaKeyPresent &&
  12511. !ssl->options.verifyNone &&
  12512. wc_RsaEncryptSize(ssl->peerRsaKey)
  12513. < ssl->options.minRsaKeySz) {
  12514. ret = RSA_KEY_SIZE_E;
  12515. WOLFSSL_ERROR_VERBOSE(ret);
  12516. WOLFSSL_MSG("Peer RSA key is too small");
  12517. }
  12518. break;
  12519. }
  12520. #endif /* NO_RSA */
  12521. #ifdef HAVE_ECC
  12522. case ECDSAk:
  12523. {
  12524. int keyRet = 0;
  12525. word32 idx = 0;
  12526. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || \
  12527. defined(WOLFSSL_RENESAS_TSIP_TLS)
  12528. /* copy encrypted tsip/sce key index into ssl object */
  12529. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  12530. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12531. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  12532. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  12533. ssl->heap, DYNAMIC_TYPE_RSA);
  12534. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12535. args->lastErr = MEMORY_E;
  12536. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12537. }
  12538. }
  12539. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  12540. args->dCert->sce_tsip_encRsaKeyIdx,
  12541. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  12542. }
  12543. #endif
  12544. if (ssl->peerEccDsaKey == NULL) {
  12545. /* alloc/init on demand */
  12546. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  12547. (void**)&ssl->peerEccDsaKey);
  12548. } else if (ssl->peerEccDsaKeyPresent) {
  12549. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  12550. ssl->peerEccDsaKey);
  12551. ssl->peerEccDsaKeyPresent = 0;
  12552. }
  12553. if (keyRet != 0 ||
  12554. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  12555. ssl->peerEccDsaKey,
  12556. args->dCert->pubKeySize) != 0) {
  12557. ret = PEER_KEY_ERROR;
  12558. WOLFSSL_ERROR_VERBOSE(ret);
  12559. }
  12560. else {
  12561. ssl->peerEccDsaKeyPresent = 1;
  12562. #ifdef HAVE_PK_CALLBACKS
  12563. if (ssl->buffers.peerEccDsaKey.buffer)
  12564. XFREE(ssl->buffers.peerEccDsaKey.buffer,
  12565. ssl->heap, DYNAMIC_TYPE_ECC);
  12566. ssl->buffers.peerEccDsaKey.buffer =
  12567. (byte*)XMALLOC(args->dCert->pubKeySize,
  12568. ssl->heap, DYNAMIC_TYPE_ECC);
  12569. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  12570. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12571. }
  12572. else {
  12573. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  12574. args->dCert->publicKey,
  12575. args->dCert->pubKeySize);
  12576. ssl->buffers.peerEccDsaKey.length =
  12577. args->dCert->pubKeySize;
  12578. }
  12579. #endif /* HAVE_PK_CALLBACKS */
  12580. }
  12581. /* check size of peer ECC key */
  12582. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  12583. !ssl->options.verifyNone &&
  12584. wc_ecc_size(ssl->peerEccDsaKey)
  12585. < ssl->options.minEccKeySz) {
  12586. ret = ECC_KEY_SIZE_E;
  12587. WOLFSSL_ERROR_VERBOSE(ret);
  12588. WOLFSSL_MSG("Peer ECC key is too small");
  12589. }
  12590. /* populate curve oid - if missing */
  12591. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  12592. ssl->ecdhCurveOID = args->dCert->pkCurveOID;
  12593. break;
  12594. }
  12595. #endif /* HAVE_ECC */
  12596. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  12597. case ED25519k:
  12598. {
  12599. int keyRet = 0;
  12600. if (ssl->peerEd25519Key == NULL) {
  12601. /* alloc/init on demand */
  12602. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  12603. (void**)&ssl->peerEd25519Key);
  12604. } else if (ssl->peerEd25519KeyPresent) {
  12605. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  12606. ssl->peerEd25519Key);
  12607. ssl->peerEd25519KeyPresent = 0;
  12608. }
  12609. if (keyRet != 0 ||
  12610. wc_ed25519_import_public(args->dCert->publicKey,
  12611. args->dCert->pubKeySize,
  12612. ssl->peerEd25519Key)
  12613. != 0) {
  12614. ret = PEER_KEY_ERROR;
  12615. WOLFSSL_ERROR_VERBOSE(ret);
  12616. }
  12617. else {
  12618. ssl->peerEd25519KeyPresent = 1;
  12619. #ifdef HAVE_PK_CALLBACKS
  12620. ssl->buffers.peerEd25519Key.buffer =
  12621. (byte*)XMALLOC(args->dCert->pubKeySize,
  12622. ssl->heap, DYNAMIC_TYPE_ED25519);
  12623. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  12624. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12625. }
  12626. else {
  12627. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  12628. args->dCert->publicKey,
  12629. args->dCert->pubKeySize);
  12630. ssl->buffers.peerEd25519Key.length =
  12631. args->dCert->pubKeySize;
  12632. }
  12633. #endif /*HAVE_PK_CALLBACKS */
  12634. }
  12635. /* check size of peer ECC key */
  12636. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  12637. !ssl->options.verifyNone &&
  12638. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  12639. ret = ECC_KEY_SIZE_E;
  12640. WOLFSSL_ERROR_VERBOSE(ret);
  12641. WOLFSSL_MSG("Peer ECC key is too small");
  12642. }
  12643. /* populate curve oid - if missing */
  12644. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  12645. ssl->ecdhCurveOID = ECC_X25519_OID;
  12646. break;
  12647. }
  12648. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  12649. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  12650. case ED448k:
  12651. {
  12652. int keyRet = 0;
  12653. if (ssl->peerEd448Key == NULL) {
  12654. /* alloc/init on demand */
  12655. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
  12656. (void**)&ssl->peerEd448Key);
  12657. } else if (ssl->peerEd448KeyPresent) {
  12658. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
  12659. ssl->peerEd448Key);
  12660. ssl->peerEd448KeyPresent = 0;
  12661. }
  12662. if (keyRet != 0 ||
  12663. wc_ed448_import_public(args->dCert->publicKey,
  12664. args->dCert->pubKeySize,
  12665. ssl->peerEd448Key) != 0) {
  12666. ret = PEER_KEY_ERROR;
  12667. WOLFSSL_ERROR_VERBOSE(ret);
  12668. }
  12669. else {
  12670. ssl->peerEd448KeyPresent = 1;
  12671. #ifdef HAVE_PK_CALLBACKS
  12672. ssl->buffers.peerEd448Key.buffer =
  12673. (byte*)XMALLOC(args->dCert->pubKeySize,
  12674. ssl->heap, DYNAMIC_TYPE_ED448);
  12675. if (ssl->buffers.peerEd448Key.buffer == NULL) {
  12676. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12677. }
  12678. else {
  12679. XMEMCPY(ssl->buffers.peerEd448Key.buffer,
  12680. args->dCert->publicKey,
  12681. args->dCert->pubKeySize);
  12682. ssl->buffers.peerEd448Key.length =
  12683. args->dCert->pubKeySize;
  12684. }
  12685. #endif /*HAVE_PK_CALLBACKS */
  12686. }
  12687. /* check size of peer ECC key */
  12688. if (ret == 0 && ssl->peerEd448KeyPresent &&
  12689. !ssl->options.verifyNone &&
  12690. ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  12691. ret = ECC_KEY_SIZE_E;
  12692. WOLFSSL_ERROR_VERBOSE(ret);
  12693. WOLFSSL_MSG("Peer ECC key is too small");
  12694. }
  12695. /* populate curve oid - if missing */
  12696. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  12697. ssl->ecdhCurveOID = ECC_X448_OID;
  12698. break;
  12699. }
  12700. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  12701. #if defined(HAVE_PQC)
  12702. #if defined(HAVE_FALCON)
  12703. case FALCON_LEVEL1k:
  12704. case FALCON_LEVEL5k:
  12705. {
  12706. int keyRet = 0;
  12707. if (ssl->peerFalconKey == NULL) {
  12708. /* alloc/init on demand */
  12709. keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON,
  12710. (void**)&ssl->peerFalconKey);
  12711. } else if (ssl->peerFalconKeyPresent) {
  12712. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_FALCON,
  12713. ssl->peerFalconKey);
  12714. ssl->peerFalconKeyPresent = 0;
  12715. }
  12716. if (keyRet == 0) {
  12717. if (args->dCert->keyOID == FALCON_LEVEL1k) {
  12718. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  12719. 1);
  12720. }
  12721. else {
  12722. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  12723. 5);
  12724. }
  12725. }
  12726. if (keyRet != 0 ||
  12727. wc_falcon_import_public(args->dCert->publicKey,
  12728. args->dCert->pubKeySize,
  12729. ssl->peerFalconKey) != 0) {
  12730. ret = PEER_KEY_ERROR;
  12731. WOLFSSL_ERROR_VERBOSE(ret);
  12732. }
  12733. else {
  12734. ssl->peerFalconKeyPresent = 1;
  12735. }
  12736. /* check size of peer Falcon key */
  12737. if (ret == 0 && ssl->peerFalconKeyPresent &&
  12738. !ssl->options.verifyNone &&
  12739. FALCON_MAX_KEY_SIZE <
  12740. ssl->options.minFalconKeySz) {
  12741. ret = FALCON_KEY_SIZE_E;
  12742. WOLFSSL_ERROR_VERBOSE(ret);
  12743. WOLFSSL_MSG("Peer Falcon key is too small");
  12744. }
  12745. break;
  12746. }
  12747. #endif /* HAVE_FALCON */
  12748. #if defined(HAVE_DILITHIUM)
  12749. case DILITHIUM_LEVEL2k:
  12750. case DILITHIUM_LEVEL3k:
  12751. case DILITHIUM_LEVEL5k:
  12752. case DILITHIUM_AES_LEVEL2k:
  12753. case DILITHIUM_AES_LEVEL3k:
  12754. case DILITHIUM_AES_LEVEL5k:
  12755. {
  12756. int keyRet = 0;
  12757. if (ssl->peerDilithiumKey == NULL) {
  12758. /* alloc/init on demand */
  12759. keyRet = AllocKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  12760. (void**)&ssl->peerDilithiumKey);
  12761. } else if (ssl->peerDilithiumKeyPresent) {
  12762. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  12763. ssl->peerDilithiumKey);
  12764. ssl->peerDilithiumKeyPresent = 0;
  12765. }
  12766. if (keyRet == 0) {
  12767. if (args->dCert->keyOID == DILITHIUM_LEVEL2k) {
  12768. keyRet = wc_dilithium_set_level_and_sym(
  12769. ssl->peerDilithiumKey, 2,
  12770. SHAKE_VARIANT);
  12771. }
  12772. else if (args->dCert->keyOID == DILITHIUM_LEVEL3k) {
  12773. keyRet = wc_dilithium_set_level_and_sym(
  12774. ssl->peerDilithiumKey, 3,
  12775. SHAKE_VARIANT);
  12776. }
  12777. else if (args->dCert->keyOID == DILITHIUM_LEVEL5k) {
  12778. keyRet = wc_dilithium_set_level_and_sym(
  12779. ssl->peerDilithiumKey, 5,
  12780. SHAKE_VARIANT);
  12781. }
  12782. else if (args->dCert->keyOID
  12783. == DILITHIUM_AES_LEVEL2k) {
  12784. keyRet = wc_dilithium_set_level_and_sym(
  12785. ssl->peerDilithiumKey, 2,
  12786. AES_VARIANT);
  12787. }
  12788. else if (args->dCert->keyOID
  12789. == DILITHIUM_AES_LEVEL3k) {
  12790. keyRet = wc_dilithium_set_level_and_sym(
  12791. ssl->peerDilithiumKey, 3,
  12792. AES_VARIANT);
  12793. }
  12794. else if (args->dCert->keyOID
  12795. == DILITHIUM_AES_LEVEL5k) {
  12796. keyRet = wc_dilithium_set_level_and_sym(
  12797. ssl->peerDilithiumKey, 5,
  12798. AES_VARIANT);
  12799. }
  12800. }
  12801. if (keyRet != 0 ||
  12802. wc_dilithium_import_public(args->dCert->publicKey,
  12803. args->dCert->pubKeySize,
  12804. ssl->peerDilithiumKey)
  12805. != 0) {
  12806. ret = PEER_KEY_ERROR;
  12807. }
  12808. else {
  12809. ssl->peerDilithiumKeyPresent = 1;
  12810. }
  12811. /* check size of peer Dilithium key */
  12812. if (ret == 0 && ssl->peerDilithiumKeyPresent &&
  12813. !ssl->options.verifyNone &&
  12814. DILITHIUM_MAX_KEY_SIZE <
  12815. ssl->options.minDilithiumKeySz) {
  12816. ret = DILITHIUM_KEY_SIZE_E;
  12817. WOLFSSL_MSG("Peer Dilithium key is too small");
  12818. }
  12819. break;
  12820. }
  12821. #endif /* HAVE_DILITHIUM */
  12822. #endif /* HAVE_PQC */
  12823. default:
  12824. break;
  12825. }
  12826. /* args->dCert free'd in function cleanup after callback */
  12827. } /* if (count > 0) */
  12828. /* Check for error */
  12829. if (args->fatal && ret != 0) {
  12830. goto exit_ppc;
  12831. }
  12832. /* Advance state and proceed */
  12833. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  12834. } /* case TLS_ASYNC_VERIFY */
  12835. FALL_THROUGH;
  12836. case TLS_ASYNC_FINALIZE:
  12837. {
  12838. /* load last error */
  12839. if (args->lastErr != 0 && ret == 0) {
  12840. ret = args->lastErr;
  12841. }
  12842. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12843. /* limit compliant with OpenSSL verify Depth + 1
  12844. * OpenSSL tries to expand the chain one longer than limit until
  12845. * reaching an ultimately trusted issuer. Becoming failure if
  12846. * we hit the limit, with X509_V_ERR_CERT_CHAIN_TOO_LONG
  12847. */
  12848. if (args->untrustedDepth > (ssl->options.verifyDepth + 1)) {
  12849. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12850. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  12851. ret = MAX_CHAIN_ERROR;
  12852. WOLFSSL_ERROR_VERBOSE(ret);
  12853. }
  12854. #endif
  12855. /* Do verify callback */
  12856. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  12857. if (ssl->options.verifyNone &&
  12858. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  12859. ret == CRL_CERT_DATE_ERR)) {
  12860. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  12861. ret = ssl->error = 0;
  12862. }
  12863. if (ret != 0) {
  12864. if (!ssl->options.verifyNone) {
  12865. DoCertFatalAlert(ssl, ret);
  12866. }
  12867. ssl->error = ret; /* Report SSL error */
  12868. }
  12869. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  12870. ssl->options.serverState = SERVER_CERT_COMPLETE;
  12871. }
  12872. if (IsEncryptionOn(ssl, 0)) {
  12873. args->idx += ssl->keys.padSz;
  12874. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12875. if (ssl->options.startedETMRead)
  12876. args->idx += MacSize(ssl);
  12877. #endif
  12878. }
  12879. /* Advance state and proceed */
  12880. ssl->options.asyncState = TLS_ASYNC_END;
  12881. } /* case TLS_ASYNC_FINALIZE */
  12882. FALL_THROUGH;
  12883. case TLS_ASYNC_END:
  12884. {
  12885. /* Set final index */
  12886. *inOutIdx = args->idx;
  12887. break;
  12888. }
  12889. default:
  12890. ret = INPUT_CASE_ERROR;
  12891. break;
  12892. } /* switch(ssl->options.asyncState) */
  12893. exit_ppc:
  12894. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  12895. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12896. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  12897. /* Mark message as not received so it can process again */
  12898. ssl->msgsReceived.got_certificate = 0;
  12899. return ret;
  12900. }
  12901. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  12902. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12903. /* Cleanup async */
  12904. FreeAsyncCtx(ssl, 0);
  12905. #elif defined(WOLFSSL_SMALL_STACK)
  12906. if (args)
  12907. {
  12908. FreeProcPeerCertArgs(ssl, args);
  12909. }
  12910. #else
  12911. FreeProcPeerCertArgs(ssl, args);
  12912. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
  12913. #if !defined(WOLFSSL_ASYNC_CRYPT) && defined(WOLFSSL_SMALL_STACK)
  12914. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  12915. #endif
  12916. FreeKeyExchange(ssl);
  12917. return ret;
  12918. }
  12919. #endif
  12920. #ifndef WOLFSSL_NO_TLS12
  12921. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  12922. /* handle processing of certificate (11) */
  12923. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12924. word32 size)
  12925. {
  12926. int ret;
  12927. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  12928. WOLFSSL_ENTER("DoCertificate");
  12929. #ifdef SESSION_CERTS
  12930. /* Reset the session cert chain count in case the session resume failed. */
  12931. ssl->session->chain.count = 0;
  12932. #ifdef WOLFSSL_ALT_CERT_CHAINS
  12933. ssl->session->altChain.count = 0;
  12934. #endif
  12935. #endif /* SESSION_CERTS */
  12936. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  12937. #ifdef WOLFSSL_EXTRA_ALERTS
  12938. if (ret == BUFFER_ERROR || ret == ASN_PARSE_E)
  12939. SendAlert(ssl, alert_fatal, decode_error);
  12940. #endif
  12941. #ifdef OPENSSL_EXTRA
  12942. ssl->options.serverState = SERVER_CERT_COMPLETE;
  12943. #endif
  12944. WOLFSSL_LEAVE("DoCertificate", ret);
  12945. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  12946. return ret;
  12947. }
  12948. /* handle processing of certificate_status (22) */
  12949. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12950. word32 size)
  12951. {
  12952. int ret = 0;
  12953. byte status_type;
  12954. word32 status_length;
  12955. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  12956. WOLFSSL_ENTER("DoCertificateStatus");
  12957. if (size < ENUM_LEN + OPAQUE24_LEN)
  12958. return BUFFER_ERROR;
  12959. status_type = input[(*inOutIdx)++];
  12960. c24to32(input + *inOutIdx, &status_length);
  12961. *inOutIdx += OPAQUE24_LEN;
  12962. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  12963. return BUFFER_ERROR;
  12964. switch (status_type) {
  12965. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  12966. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  12967. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  12968. case WOLFSSL_CSR2_OCSP:
  12969. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  12970. break;
  12971. #endif
  12972. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  12973. case WOLFSSL_CSR2_OCSP_MULTI: {
  12974. OcspRequest* request;
  12975. word32 list_length = status_length;
  12976. byte idx = 0;
  12977. #ifdef WOLFSSL_SMALL_STACK
  12978. CertStatus* status;
  12979. OcspEntry* single;
  12980. OcspResponse* response;
  12981. #else
  12982. CertStatus status[1];
  12983. OcspEntry single[1];
  12984. OcspResponse response[1];
  12985. #endif
  12986. do {
  12987. if (ssl->status_request_v2) {
  12988. ssl->status_request_v2 = 0;
  12989. break;
  12990. }
  12991. return BUFFER_ERROR;
  12992. } while(0);
  12993. #ifdef WOLFSSL_SMALL_STACK
  12994. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  12995. DYNAMIC_TYPE_OCSP_STATUS);
  12996. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  12997. DYNAMIC_TYPE_OCSP_ENTRY);
  12998. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  12999. DYNAMIC_TYPE_OCSP_REQUEST);
  13000. if (status == NULL || single == NULL || response == NULL) {
  13001. if (status)
  13002. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  13003. if (single)
  13004. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  13005. if (response)
  13006. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  13007. return MEMORY_ERROR;
  13008. }
  13009. #endif
  13010. while (list_length && ret == 0) {
  13011. if (OPAQUE24_LEN > list_length) {
  13012. ret = BUFFER_ERROR;
  13013. break;
  13014. }
  13015. c24to32(input + *inOutIdx, &status_length);
  13016. *inOutIdx += OPAQUE24_LEN;
  13017. list_length -= OPAQUE24_LEN;
  13018. if (status_length > list_length) {
  13019. ret = BUFFER_ERROR;
  13020. break;
  13021. }
  13022. if (status_length) {
  13023. InitOcspResponse(response, single, status, input +*inOutIdx,
  13024. status_length, ssl->heap);
  13025. if ((OcspResponseDecode(response, SSL_CM(ssl), ssl->heap,
  13026. 0) != 0)
  13027. || (response->responseStatus != OCSP_SUCCESSFUL)
  13028. || (response->single->status->status != CERT_GOOD))
  13029. ret = BAD_CERTIFICATE_STATUS_ERROR;
  13030. while (ret == 0) {
  13031. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  13032. ssl->extensions, status_type, idx++);
  13033. if (request == NULL)
  13034. ret = BAD_CERTIFICATE_STATUS_ERROR;
  13035. else if (CompareOcspReqResp(request, response) == 0)
  13036. break;
  13037. else if (idx == 1) /* server cert must be OK */
  13038. ret = BAD_CERTIFICATE_STATUS_ERROR;
  13039. }
  13040. FreeOcspResponse(response);
  13041. *inOutIdx += status_length;
  13042. list_length -= status_length;
  13043. }
  13044. }
  13045. ssl->status_request_v2 = 0;
  13046. #ifdef WOLFSSL_SMALL_STACK
  13047. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  13048. XFREE(single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
  13049. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  13050. #endif
  13051. }
  13052. break;
  13053. #endif
  13054. default:
  13055. ret = BUFFER_ERROR;
  13056. }
  13057. if (ret != 0) {
  13058. WOLFSSL_ERROR_VERBOSE(ret);
  13059. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  13060. }
  13061. if (IsEncryptionOn(ssl, 0)) {
  13062. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13063. if (ssl->options.startedETMRead) {
  13064. word32 digestSz = MacSize(ssl);
  13065. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  13066. return BUFFER_E;
  13067. *inOutIdx += ssl->keys.padSz + digestSz;
  13068. }
  13069. else
  13070. #endif
  13071. {
  13072. if (*inOutIdx + ssl->keys.padSz > size)
  13073. return BUFFER_E;
  13074. *inOutIdx += ssl->keys.padSz;
  13075. }
  13076. }
  13077. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  13078. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  13079. return ret;
  13080. }
  13081. #endif
  13082. #endif /* !WOLFSSL_NO_TLS12 */
  13083. #endif /* !NO_CERTS */
  13084. #ifndef WOLFSSL_NO_TLS12
  13085. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  13086. word32 size, word32 totalSz)
  13087. {
  13088. (void)input;
  13089. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  13090. WOLFSSL_ENTER("DoHelloRequest");
  13091. if (size) /* must be 0 */
  13092. return BUFFER_ERROR;
  13093. if (IsEncryptionOn(ssl, 0)) {
  13094. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  13095. * about padding */
  13096. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13097. if (ssl->options.startedETMRead) {
  13098. word32 digestSz = MacSize(ssl);
  13099. if (size != totalSz &&
  13100. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  13101. return BUFFER_E;
  13102. *inOutIdx += ssl->keys.padSz + digestSz;
  13103. }
  13104. else
  13105. #endif
  13106. {
  13107. /* access beyond input + size should be checked against totalSz */
  13108. if (size != totalSz &&
  13109. *inOutIdx + ssl->keys.padSz > totalSz)
  13110. return BUFFER_E;
  13111. *inOutIdx += ssl->keys.padSz;
  13112. }
  13113. }
  13114. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13115. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  13116. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  13117. return FATAL_ERROR;
  13118. }
  13119. #ifdef HAVE_SECURE_RENEGOTIATION
  13120. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  13121. ssl->secure_renegotiation->startScr = 1;
  13122. WOLFSSL_LEAVE("DoHelloRequest", 0);
  13123. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  13124. return 0;
  13125. }
  13126. #endif
  13127. else {
  13128. return SendAlert(ssl, alert_warning, no_renegotiation);
  13129. }
  13130. }
  13131. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  13132. word32 totalSz, int sniff)
  13133. {
  13134. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  13135. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  13136. WOLFSSL_ENTER("DoFinished");
  13137. if (finishedSz != size)
  13138. return BUFFER_ERROR;
  13139. /* check against totalSz
  13140. * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
  13141. * padding */
  13142. if (size != totalSz) {
  13143. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13144. if (ssl->options.startedETMRead) {
  13145. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  13146. return BUFFER_E;
  13147. }
  13148. else
  13149. #endif
  13150. {
  13151. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  13152. return BUFFER_E;
  13153. }
  13154. }
  13155. #ifdef WOLFSSL_CALLBACKS
  13156. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  13157. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  13158. #endif
  13159. if (sniff == NO_SNIFF) {
  13160. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  13161. WOLFSSL_MSG("Verify finished error on hashes");
  13162. #ifdef WOLFSSL_EXTRA_ALERTS
  13163. SendAlert(ssl, alert_fatal, decrypt_error);
  13164. #endif
  13165. WOLFSSL_ERROR_VERBOSE(VERIFY_FINISHED_ERROR);
  13166. return VERIFY_FINISHED_ERROR;
  13167. }
  13168. }
  13169. #ifdef HAVE_SECURE_RENEGOTIATION
  13170. if (ssl->secure_renegotiation) {
  13171. /* save peer's state */
  13172. if (ssl->options.side == WOLFSSL_CLIENT_END)
  13173. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  13174. input + *inOutIdx, TLS_FINISHED_SZ);
  13175. else
  13176. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  13177. input + *inOutIdx, TLS_FINISHED_SZ);
  13178. ssl->secure_renegotiation->verifySet = 1;
  13179. }
  13180. #endif
  13181. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  13182. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13183. XMEMCPY(ssl->serverFinished,
  13184. input + *inOutIdx, TLS_FINISHED_SZ);
  13185. ssl->serverFinished_len = TLS_FINISHED_SZ;
  13186. }
  13187. else {
  13188. XMEMCPY(ssl->clientFinished,
  13189. input + *inOutIdx, TLS_FINISHED_SZ);
  13190. ssl->clientFinished_len = TLS_FINISHED_SZ;
  13191. }
  13192. #endif
  13193. /* force input exhaustion at ProcessReply consuming padSz */
  13194. *inOutIdx += size + ssl->keys.padSz;
  13195. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13196. if (ssl->options.startedETMRead)
  13197. *inOutIdx += MacSize(ssl);
  13198. #endif
  13199. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13200. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  13201. #ifdef OPENSSL_EXTRA
  13202. ssl->cbmode = SSL_CB_MODE_WRITE;
  13203. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  13204. #endif
  13205. if (!ssl->options.resuming) {
  13206. #ifdef OPENSSL_EXTRA
  13207. if (ssl->CBIS != NULL) {
  13208. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  13209. }
  13210. #endif
  13211. ssl->options.handShakeState = HANDSHAKE_DONE;
  13212. ssl->options.handShakeDone = 1;
  13213. }
  13214. }
  13215. else {
  13216. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  13217. #ifdef OPENSSL_EXTRA
  13218. ssl->cbmode = SSL_CB_MODE_READ;
  13219. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  13220. #endif
  13221. if (ssl->options.resuming) {
  13222. #ifdef OPENSSL_EXTRA
  13223. if (ssl->CBIS != NULL) {
  13224. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  13225. }
  13226. #endif
  13227. ssl->options.handShakeState = HANDSHAKE_DONE;
  13228. ssl->options.handShakeDone = 1;
  13229. }
  13230. }
  13231. #ifdef WOLFSSL_DTLS
  13232. if (ssl->options.dtls) {
  13233. if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
  13234. (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
  13235. DtlsMsgPoolReset(ssl);
  13236. ssl->keys.dtls_handshake_number = 0;
  13237. ssl->keys.dtls_expected_peer_handshake_number = 0;
  13238. }
  13239. }
  13240. #endif
  13241. WOLFSSL_LEAVE("DoFinished", 0);
  13242. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  13243. return 0;
  13244. }
  13245. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  13246. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  13247. {
  13248. /* verify not a duplicate, mark received, check state */
  13249. switch (type) {
  13250. #ifndef NO_WOLFSSL_CLIENT
  13251. case hello_request:
  13252. #ifndef NO_WOLFSSL_SERVER
  13253. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13254. WOLFSSL_MSG("HelloRequest received by server");
  13255. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13256. return SIDE_ERROR;
  13257. }
  13258. #endif
  13259. if (ssl->msgsReceived.got_hello_request) {
  13260. WOLFSSL_MSG("Duplicate HelloRequest received");
  13261. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13262. return DUPLICATE_MSG_E;
  13263. }
  13264. ssl->msgsReceived.got_hello_request = 1;
  13265. break;
  13266. #endif
  13267. #ifndef NO_WOLFSSL_SERVER
  13268. case client_hello:
  13269. #ifndef NO_WOLFSSL_CLIENT
  13270. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13271. WOLFSSL_MSG("ClientHello received by client");
  13272. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13273. return SIDE_ERROR;
  13274. }
  13275. #endif
  13276. if (ssl->msgsReceived.got_client_hello) {
  13277. WOLFSSL_MSG("Duplicate ClientHello received");
  13278. #ifdef WOLFSSL_EXTRA_ALERTS
  13279. SendAlert(ssl, alert_fatal, unexpected_message);
  13280. #endif
  13281. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13282. return DUPLICATE_MSG_E;
  13283. }
  13284. ssl->msgsReceived.got_client_hello = 1;
  13285. break;
  13286. #endif
  13287. #ifndef NO_WOLFSSL_CLIENT
  13288. case server_hello:
  13289. #ifndef NO_WOLFSSL_SERVER
  13290. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13291. WOLFSSL_MSG("ServerHello received by server");
  13292. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13293. return SIDE_ERROR;
  13294. }
  13295. #endif
  13296. if (ssl->msgsReceived.got_server_hello) {
  13297. WOLFSSL_MSG("Duplicate ServerHello received");
  13298. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13299. return DUPLICATE_MSG_E;
  13300. }
  13301. ssl->msgsReceived.got_server_hello = 1;
  13302. break;
  13303. #endif
  13304. #ifndef NO_WOLFSSL_CLIENT
  13305. case hello_verify_request:
  13306. #ifndef NO_WOLFSSL_SERVER
  13307. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13308. WOLFSSL_MSG("HelloVerifyRequest received by server");
  13309. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13310. return SIDE_ERROR;
  13311. }
  13312. #endif
  13313. if (ssl->msgsReceived.got_hello_verify_request) {
  13314. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  13315. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13316. return DUPLICATE_MSG_E;
  13317. }
  13318. ssl->msgsReceived.got_hello_verify_request = 1;
  13319. break;
  13320. #endif
  13321. #ifndef NO_WOLFSSL_CLIENT
  13322. case session_ticket:
  13323. #ifndef NO_WOLFSSL_SERVER
  13324. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13325. WOLFSSL_MSG("SessionTicket received by server");
  13326. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13327. return SIDE_ERROR;
  13328. }
  13329. #endif
  13330. if (ssl->msgsReceived.got_session_ticket) {
  13331. WOLFSSL_MSG("Duplicate SessionTicket received");
  13332. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13333. return DUPLICATE_MSG_E;
  13334. }
  13335. ssl->msgsReceived.got_session_ticket = 1;
  13336. break;
  13337. #endif
  13338. case certificate:
  13339. if (ssl->msgsReceived.got_certificate) {
  13340. WOLFSSL_MSG("Duplicate Certificate received");
  13341. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13342. return DUPLICATE_MSG_E;
  13343. }
  13344. ssl->msgsReceived.got_certificate = 1;
  13345. #ifndef NO_WOLFSSL_CLIENT
  13346. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13347. if ( ssl->msgsReceived.got_server_hello == 0) {
  13348. WOLFSSL_MSG("No ServerHello before Cert");
  13349. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13350. return OUT_OF_ORDER_E;
  13351. }
  13352. }
  13353. #endif
  13354. #ifndef NO_WOLFSSL_SERVER
  13355. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13356. if ( ssl->msgsReceived.got_client_hello == 0) {
  13357. WOLFSSL_MSG("No ClientHello before Cert");
  13358. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13359. return OUT_OF_ORDER_E;
  13360. }
  13361. }
  13362. #endif
  13363. break;
  13364. #ifndef NO_WOLFSSL_CLIENT
  13365. case certificate_status:
  13366. #ifndef NO_WOLFSSL_SERVER
  13367. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13368. WOLFSSL_MSG("CertificateStatus received by server");
  13369. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13370. return SIDE_ERROR;
  13371. }
  13372. #endif
  13373. if (ssl->msgsReceived.got_certificate_status) {
  13374. WOLFSSL_MSG("Duplicate CertificateStatus received");
  13375. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13376. return DUPLICATE_MSG_E;
  13377. }
  13378. ssl->msgsReceived.got_certificate_status = 1;
  13379. if (ssl->msgsReceived.got_certificate == 0) {
  13380. WOLFSSL_MSG("No Certificate before CertificateStatus");
  13381. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13382. return OUT_OF_ORDER_E;
  13383. }
  13384. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  13385. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  13386. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13387. return OUT_OF_ORDER_E;
  13388. }
  13389. break;
  13390. #endif
  13391. #ifndef NO_WOLFSSL_CLIENT
  13392. case server_key_exchange:
  13393. #ifndef NO_WOLFSSL_SERVER
  13394. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13395. WOLFSSL_MSG("ServerKeyExchange received by server");
  13396. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13397. return SIDE_ERROR;
  13398. }
  13399. #endif
  13400. if (ssl->msgsReceived.got_server_key_exchange) {
  13401. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  13402. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13403. return DUPLICATE_MSG_E;
  13404. }
  13405. ssl->msgsReceived.got_server_key_exchange = 1;
  13406. if (ssl->msgsReceived.got_server_hello == 0) {
  13407. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  13408. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13409. return OUT_OF_ORDER_E;
  13410. }
  13411. if (ssl->msgsReceived.got_certificate_status == 0) {
  13412. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  13413. if (ssl->status_request) {
  13414. int ret;
  13415. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  13416. if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0)
  13417. return ret;
  13418. }
  13419. #endif
  13420. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13421. if (ssl->status_request_v2) {
  13422. int ret;
  13423. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  13424. if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0)
  13425. return ret;
  13426. }
  13427. #endif
  13428. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  13429. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  13430. /* Check that a status request extension was seen as the
  13431. * CertificateStatus wasn't when an OCSP staple is required.
  13432. */
  13433. if (
  13434. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  13435. !ssl->status_request &&
  13436. #endif
  13437. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13438. !ssl->status_request_v2 &&
  13439. #endif
  13440. SSL_CM(ssl)->ocspMustStaple) {
  13441. WOLFSSL_ERROR_VERBOSE(OCSP_CERT_UNKNOWN);
  13442. return OCSP_CERT_UNKNOWN;
  13443. }
  13444. #endif
  13445. }
  13446. break;
  13447. #endif
  13448. #ifndef NO_WOLFSSL_CLIENT
  13449. case certificate_request:
  13450. #ifndef NO_WOLFSSL_SERVER
  13451. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13452. WOLFSSL_MSG("CertificateRequest received by server");
  13453. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13454. return SIDE_ERROR;
  13455. }
  13456. #endif
  13457. if (ssl->msgsReceived.got_certificate_request) {
  13458. WOLFSSL_MSG("Duplicate CertificateRequest received");
  13459. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13460. return DUPLICATE_MSG_E;
  13461. }
  13462. ssl->msgsReceived.got_certificate_request = 1;
  13463. break;
  13464. #endif
  13465. #ifndef NO_WOLFSSL_CLIENT
  13466. case server_hello_done:
  13467. #ifndef NO_WOLFSSL_SERVER
  13468. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13469. WOLFSSL_MSG("ServerHelloDone received by server");
  13470. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13471. return SIDE_ERROR;
  13472. }
  13473. #endif
  13474. if (ssl->msgsReceived.got_server_hello_done) {
  13475. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  13476. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13477. return DUPLICATE_MSG_E;
  13478. }
  13479. ssl->msgsReceived.got_server_hello_done = 1;
  13480. if (ssl->msgsReceived.got_certificate == 0) {
  13481. if (ssl->specs.kea == psk_kea ||
  13482. ssl->specs.kea == dhe_psk_kea ||
  13483. ssl->specs.kea == ecdhe_psk_kea ||
  13484. ssl->options.usingAnon_cipher) {
  13485. WOLFSSL_MSG("No Cert required");
  13486. }
  13487. else {
  13488. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  13489. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13490. return OUT_OF_ORDER_E;
  13491. }
  13492. }
  13493. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  13494. int pskNoServerHint = 0; /* not required in this case */
  13495. #ifndef NO_PSK
  13496. if (ssl->specs.kea == psk_kea &&
  13497. ssl->arrays != NULL &&
  13498. ssl->arrays->server_hint[0] == 0)
  13499. pskNoServerHint = 1;
  13500. #endif
  13501. if (ssl->specs.static_ecdh == 1 ||
  13502. ssl->specs.kea == rsa_kea ||
  13503. pskNoServerHint) {
  13504. WOLFSSL_MSG("No KeyExchange required");
  13505. }
  13506. else {
  13507. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  13508. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13509. return OUT_OF_ORDER_E;
  13510. }
  13511. }
  13512. break;
  13513. #endif
  13514. #ifndef NO_WOLFSSL_SERVER
  13515. case certificate_verify:
  13516. #ifndef NO_WOLFSSL_CLIENT
  13517. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13518. WOLFSSL_MSG("CertificateVerify received by client");
  13519. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13520. return SIDE_ERROR;
  13521. }
  13522. #endif
  13523. if (ssl->msgsReceived.got_certificate_verify) {
  13524. WOLFSSL_MSG("Duplicate CertificateVerify received");
  13525. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13526. return DUPLICATE_MSG_E;
  13527. }
  13528. ssl->msgsReceived.got_certificate_verify = 1;
  13529. if ( ssl->msgsReceived.got_certificate == 0) {
  13530. WOLFSSL_MSG("No Cert before CertVerify");
  13531. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13532. return OUT_OF_ORDER_E;
  13533. }
  13534. break;
  13535. #endif
  13536. #ifndef NO_WOLFSSL_SERVER
  13537. case client_key_exchange:
  13538. #ifndef NO_WOLFSSL_CLIENT
  13539. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13540. WOLFSSL_MSG("ClientKeyExchange received by client");
  13541. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13542. return SIDE_ERROR;
  13543. }
  13544. #endif
  13545. if (ssl->msgsReceived.got_client_key_exchange) {
  13546. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  13547. #ifdef WOLFSSL_EXTRA_ALERTS
  13548. SendAlert(ssl, alert_fatal, unexpected_message);
  13549. #endif
  13550. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13551. return DUPLICATE_MSG_E;
  13552. }
  13553. ssl->msgsReceived.got_client_key_exchange = 1;
  13554. if (ssl->msgsReceived.got_client_hello == 0) {
  13555. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  13556. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13557. return OUT_OF_ORDER_E;
  13558. }
  13559. break;
  13560. #endif
  13561. case finished:
  13562. if (ssl->msgsReceived.got_finished) {
  13563. WOLFSSL_MSG("Duplicate Finished received");
  13564. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13565. return DUPLICATE_MSG_E;
  13566. }
  13567. #ifdef WOLFSSL_DTLS
  13568. if (ssl->options.dtls) {
  13569. if (ssl->keys.curEpoch == 0) {
  13570. WOLFSSL_MSG("Finished received with epoch 0");
  13571. WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
  13572. return SEQUENCE_ERROR;
  13573. }
  13574. }
  13575. #endif
  13576. ssl->msgsReceived.got_finished = 1;
  13577. if (ssl->msgsReceived.got_change_cipher == 0) {
  13578. WOLFSSL_MSG("Finished received before ChangeCipher");
  13579. #ifdef WOLFSSL_EXTRA_ALERTS
  13580. SendAlert(ssl, alert_fatal, unexpected_message);
  13581. #endif
  13582. WOLFSSL_ERROR_VERBOSE(NO_CHANGE_CIPHER_E);
  13583. return NO_CHANGE_CIPHER_E;
  13584. }
  13585. break;
  13586. case change_cipher_hs:
  13587. if (ssl->msgsReceived.got_change_cipher) {
  13588. WOLFSSL_MSG("Duplicate ChangeCipher received");
  13589. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13590. return DUPLICATE_MSG_E;
  13591. }
  13592. /* DTLS is going to ignore the CCS message if the client key
  13593. * exchange message wasn't received yet. */
  13594. if (!ssl->options.dtls)
  13595. ssl->msgsReceived.got_change_cipher = 1;
  13596. #ifndef NO_WOLFSSL_CLIENT
  13597. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13598. if (!ssl->options.resuming) {
  13599. if (ssl->msgsReceived.got_server_hello_done == 0) {
  13600. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  13601. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13602. return OUT_OF_ORDER_E;
  13603. }
  13604. }
  13605. else {
  13606. if (ssl->msgsReceived.got_server_hello == 0) {
  13607. WOLFSSL_MSG("No ServerHello before ChangeCipher on "
  13608. "Resume");
  13609. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13610. return OUT_OF_ORDER_E;
  13611. }
  13612. }
  13613. #ifdef HAVE_SESSION_TICKET
  13614. if (ssl->expect_session_ticket) {
  13615. WOLFSSL_MSG("Expected session ticket missing");
  13616. #ifdef WOLFSSL_DTLS
  13617. if (ssl->options.dtls) {
  13618. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13619. return OUT_OF_ORDER_E;
  13620. }
  13621. #endif
  13622. WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
  13623. return SESSION_TICKET_EXPECT_E;
  13624. }
  13625. #endif
  13626. }
  13627. #endif
  13628. #ifndef NO_WOLFSSL_SERVER
  13629. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13630. if (!ssl->options.resuming &&
  13631. ssl->msgsReceived.got_client_key_exchange == 0) {
  13632. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  13633. #ifdef WOLFSSL_EXTRA_ALERTS
  13634. SendAlert(ssl, alert_fatal, unexpected_message);
  13635. #endif
  13636. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13637. return OUT_OF_ORDER_E;
  13638. }
  13639. #ifndef NO_CERTS
  13640. if (ssl->options.verifyPeer &&
  13641. ssl->options.havePeerCert) {
  13642. if (!ssl->options.havePeerVerify ||
  13643. !ssl->msgsReceived.got_certificate_verify) {
  13644. WOLFSSL_MSG("client didn't send cert verify");
  13645. #ifdef WOLFSSL_DTLS
  13646. if (ssl->options.dtls) {
  13647. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13648. return OUT_OF_ORDER_E;
  13649. }
  13650. #endif
  13651. WOLFSSL_ERROR_VERBOSE(NO_PEER_VERIFY);
  13652. return NO_PEER_VERIFY;
  13653. }
  13654. }
  13655. #endif
  13656. }
  13657. #endif
  13658. if (ssl->options.dtls)
  13659. ssl->msgsReceived.got_change_cipher = 1;
  13660. break;
  13661. default:
  13662. WOLFSSL_MSG("Unknown message type");
  13663. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  13664. return SANITY_MSG_E;
  13665. }
  13666. return 0;
  13667. }
  13668. static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  13669. byte type, word32 size, word32 totalSz)
  13670. {
  13671. int ret = 0;
  13672. word32 expectedIdx;
  13673. WOLFSSL_ENTER("DoHandShakeMsgType");
  13674. #ifdef WOLFSSL_TLS13
  13675. if (type == hello_retry_request) {
  13676. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  13677. totalSz);
  13678. }
  13679. #endif
  13680. /* make sure can read the message */
  13681. if (*inOutIdx + size > totalSz) {
  13682. WOLFSSL_MSG("Incomplete Data");
  13683. WOLFSSL_ERROR_VERBOSE(INCOMPLETE_DATA);
  13684. return INCOMPLETE_DATA;
  13685. }
  13686. expectedIdx = *inOutIdx + size +
  13687. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  13688. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13689. if (ssl->options.startedETMRead && ssl->keys.encryptionOn)
  13690. expectedIdx += MacSize(ssl);
  13691. #endif
  13692. #if !defined(NO_WOLFSSL_SERVER) && \
  13693. defined(HAVE_SECURE_RENEGOTIATION) && \
  13694. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  13695. if (ssl->options.handShakeDone && type == client_hello &&
  13696. ssl->secure_renegotiation &&
  13697. ssl->secure_renegotiation->enabled)
  13698. {
  13699. WOLFSSL_MSG("Reset handshake state");
  13700. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  13701. ssl->options.serverState = NULL_STATE;
  13702. ssl->options.clientState = NULL_STATE;
  13703. ssl->options.connectState = CONNECT_BEGIN;
  13704. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  13705. ssl->options.handShakeState = NULL_STATE;
  13706. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  13707. ret = InitHandshakeHashes(ssl);
  13708. if (ret != 0)
  13709. return ret;
  13710. }
  13711. #endif
  13712. /* sanity check msg received */
  13713. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  13714. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  13715. return ret;
  13716. }
  13717. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13718. /* add name later, add the handshake header part back on and record layer
  13719. * header */
  13720. if (ssl->toInfoOn) {
  13721. ret = AddPacketInfo(ssl, 0, handshake, input + *inOutIdx -
  13722. HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ, READ_PROTO,
  13723. RECORD_HEADER_SZ, ssl->heap);
  13724. if (ret != 0)
  13725. return ret;
  13726. #ifdef WOLFSSL_CALLBACKS
  13727. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  13728. #endif
  13729. }
  13730. #endif
  13731. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  13732. WOLFSSL_MSG("HandShake message after handshake complete");
  13733. SendAlert(ssl, alert_fatal, unexpected_message);
  13734. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13735. return OUT_OF_ORDER_E;
  13736. }
  13737. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  13738. ssl->options.serverState == NULL_STATE && type != server_hello) {
  13739. WOLFSSL_MSG("First server message not server hello");
  13740. SendAlert(ssl, alert_fatal, unexpected_message);
  13741. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13742. return OUT_OF_ORDER_E;
  13743. }
  13744. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  13745. type == server_hello_done &&
  13746. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  13747. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  13748. SendAlert(ssl, alert_fatal, unexpected_message);
  13749. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13750. return OUT_OF_ORDER_E;
  13751. }
  13752. if (ssl->options.side == WOLFSSL_SERVER_END &&
  13753. ssl->options.clientState == NULL_STATE && type != client_hello) {
  13754. WOLFSSL_MSG("First client message not client hello");
  13755. SendAlert(ssl, alert_fatal, unexpected_message);
  13756. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13757. return OUT_OF_ORDER_E;
  13758. }
  13759. /* above checks handshake state */
  13760. /* hello_request not hashed */
  13761. /* Also, skip hashing the client_hello message here for DTLS. It will be
  13762. * hashed later if the DTLS cookie is correct. */
  13763. if (type != hello_request
  13764. #ifdef WOLFSSL_ASYNC_CRYPT
  13765. && ssl->error != WC_PENDING_E
  13766. #endif
  13767. #ifdef WOLFSSL_NONBLOCK_OCSP
  13768. && ssl->error != OCSP_WANT_READ
  13769. #endif
  13770. ) {
  13771. ret = HashInput(ssl, input + *inOutIdx, size);
  13772. if (ret != 0) {
  13773. WOLFSSL_MSG("Incomplete handshake hashes");
  13774. return ret;
  13775. }
  13776. }
  13777. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13778. switch (type) {
  13779. case certificate:
  13780. case server_key_exchange:
  13781. case certificate_request:
  13782. case server_hello_done:
  13783. if (ssl->options.resuming) {
  13784. #ifdef WOLFSSL_WPAS
  13785. /* This can occur when ssl->sessionSecretCb is set. EAP-FAST
  13786. * (RFC 4851) allows for detecting server session resumption
  13787. * based on the msg received after the ServerHello. */
  13788. WOLFSSL_MSG("Not resuming as thought");
  13789. ssl->options.resuming = 0;
  13790. /* No longer resuming, reset peer authentication state. */
  13791. ssl->options.peerAuthGood = 0;
  13792. #else
  13793. /* Fatal error. Only try to send an alert. RFC 5246 does not
  13794. * allow for reverting back to a full handshake after the
  13795. * server has indicated the intention to do a resumption. */
  13796. (void)SendAlert(ssl, alert_fatal, unexpected_message);
  13797. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13798. return OUT_OF_ORDER_E;
  13799. #endif
  13800. }
  13801. }
  13802. }
  13803. #ifdef OPENSSL_EXTRA
  13804. if (ssl->CBIS != NULL){
  13805. ssl->cbmode = SSL_CB_MODE_READ;
  13806. ssl->cbtype = type;
  13807. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  13808. }
  13809. #endif
  13810. switch (type) {
  13811. case hello_request:
  13812. WOLFSSL_MSG("processing hello request");
  13813. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  13814. break;
  13815. #ifndef NO_WOLFSSL_CLIENT
  13816. case hello_verify_request:
  13817. WOLFSSL_MSG("processing hello verify request");
  13818. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  13819. if (IsEncryptionOn(ssl, 0)) {
  13820. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13821. if (ssl->options.startedETMRead) {
  13822. word32 digestSz = MacSize(ssl);
  13823. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  13824. return BUFFER_E;
  13825. *inOutIdx += ssl->keys.padSz + digestSz;
  13826. }
  13827. else
  13828. #endif
  13829. {
  13830. /* access beyond input + size should be checked against totalSz
  13831. */
  13832. if (*inOutIdx + ssl->keys.padSz > totalSz)
  13833. return BUFFER_E;
  13834. *inOutIdx += ssl->keys.padSz;
  13835. }
  13836. }
  13837. break;
  13838. case server_hello:
  13839. WOLFSSL_MSG("processing server hello");
  13840. ret = DoServerHello(ssl, input, inOutIdx, size);
  13841. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  13842. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  13843. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  13844. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  13845. IsAtLeastTLSv1_3(ssl->version)) {
  13846. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13847. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  13848. #endif
  13849. {
  13850. ssl->options.cacheMessages = 0;
  13851. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  13852. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  13853. XFREE(ssl->hsHashes->messages, ssl->heap,
  13854. DYNAMIC_TYPE_HASHES);
  13855. ssl->hsHashes->messages = NULL;
  13856. }
  13857. }
  13858. }
  13859. #endif
  13860. break;
  13861. #ifndef NO_CERTS
  13862. case certificate_request:
  13863. WOLFSSL_MSG("processing certificate request");
  13864. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  13865. break;
  13866. #endif
  13867. case server_key_exchange:
  13868. WOLFSSL_MSG("processing server key exchange");
  13869. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  13870. break;
  13871. #ifdef HAVE_SESSION_TICKET
  13872. case session_ticket:
  13873. WOLFSSL_MSG("processing session ticket");
  13874. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  13875. break;
  13876. #endif /* HAVE_SESSION_TICKET */
  13877. #endif
  13878. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  13879. !defined(WOLFSSL_NO_CLIENT_AUTH))
  13880. case certificate:
  13881. WOLFSSL_MSG("processing certificate");
  13882. ret = DoCertificate(ssl, input, inOutIdx, size);
  13883. break;
  13884. case certificate_status:
  13885. WOLFSSL_MSG("processing certificate status");
  13886. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  13887. break;
  13888. #endif
  13889. case server_hello_done:
  13890. WOLFSSL_MSG("processing server hello done");
  13891. #ifdef WOLFSSL_CALLBACKS
  13892. if (ssl->hsInfoOn)
  13893. AddPacketName(ssl, "ServerHelloDone");
  13894. if (ssl->toInfoOn)
  13895. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  13896. #endif
  13897. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  13898. if (IsEncryptionOn(ssl, 0)) {
  13899. *inOutIdx += ssl->keys.padSz;
  13900. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13901. if (ssl->options.startedETMRead)
  13902. *inOutIdx += MacSize(ssl);
  13903. #endif
  13904. }
  13905. break;
  13906. case finished:
  13907. WOLFSSL_MSG("processing finished");
  13908. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  13909. break;
  13910. #ifndef NO_WOLFSSL_SERVER
  13911. case client_hello:
  13912. WOLFSSL_MSG("processing client hello");
  13913. ret = DoClientHello(ssl, input, inOutIdx, size);
  13914. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  13915. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  13916. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  13917. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  13918. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  13919. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13920. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  13921. #endif
  13922. {
  13923. ssl->options.cacheMessages = 0;
  13924. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  13925. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  13926. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  13927. ssl->hsHashes->messages = NULL;
  13928. }
  13929. }
  13930. }
  13931. #endif
  13932. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  13933. * about padding */
  13934. if (IsEncryptionOn(ssl, 0)) {
  13935. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13936. if (ssl->options.startedETMRead) {
  13937. word32 digestSz = MacSize(ssl);
  13938. if (size != totalSz &&
  13939. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  13940. return BUFFER_E;
  13941. *inOutIdx += ssl->keys.padSz + digestSz;
  13942. }
  13943. else
  13944. #endif
  13945. {
  13946. /* access beyond input + size should be checked against totalSz
  13947. */
  13948. if (size != totalSz &&
  13949. *inOutIdx + ssl->keys.padSz > totalSz)
  13950. return BUFFER_E;
  13951. *inOutIdx += ssl->keys.padSz;
  13952. }
  13953. }
  13954. break;
  13955. case client_key_exchange:
  13956. WOLFSSL_MSG("processing client key exchange");
  13957. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  13958. break;
  13959. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  13960. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  13961. case certificate_verify:
  13962. WOLFSSL_MSG("processing certificate verify");
  13963. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  13964. break;
  13965. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  13966. #endif /* !NO_WOLFSSL_SERVER */
  13967. default:
  13968. WOLFSSL_MSG("Unknown handshake message type");
  13969. ret = UNKNOWN_HANDSHAKE_TYPE;
  13970. break;
  13971. }
  13972. if (ret == 0 && expectedIdx != *inOutIdx) {
  13973. WOLFSSL_MSG("Extra data in handshake message");
  13974. if (!ssl->options.dtls)
  13975. SendAlert(ssl, alert_fatal, decode_error);
  13976. ret = DECODE_E;
  13977. WOLFSSL_ERROR_VERBOSE(ret);
  13978. }
  13979. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13980. /* if async, offset index so this msg will be processed again */
  13981. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  13982. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  13983. #ifdef WOLFSSL_DTLS
  13984. if (ssl->options.dtls) {
  13985. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  13986. }
  13987. #endif
  13988. }
  13989. /* make sure async error is cleared */
  13990. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  13991. ssl->error = 0;
  13992. }
  13993. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  13994. #ifdef WOLFSSL_DTLS
  13995. if (ret == 0) {
  13996. if (type == client_hello) {
  13997. /* Advance expected number only if cookie exchange complete */
  13998. if (ssl->msgsReceived.got_client_hello)
  13999. ssl->keys.dtls_expected_peer_handshake_number =
  14000. ssl->keys.dtls_peer_handshake_number + 1;
  14001. }
  14002. else if (type != finished) {
  14003. ssl->keys.dtls_expected_peer_handshake_number++;
  14004. }
  14005. }
  14006. #endif
  14007. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  14008. return ret;
  14009. }
  14010. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  14011. word32 totalSz)
  14012. {
  14013. int ret = 0;
  14014. word32 inputLength;
  14015. WOLFSSL_ENTER("DoHandShakeMsg()");
  14016. if (ssl->arrays == NULL) {
  14017. byte type;
  14018. word32 size;
  14019. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0) {
  14020. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  14021. return PARSE_ERROR;
  14022. }
  14023. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  14024. }
  14025. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  14026. /* If there is a pending fragmented handshake message,
  14027. * pending message size will be non-zero. */
  14028. if (ssl->arrays->pendingMsgSz == 0) {
  14029. byte type;
  14030. word32 size;
  14031. if (GetHandShakeHeader(ssl, input, inOutIdx, &type, &size,
  14032. totalSz) != 0) {
  14033. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  14034. return PARSE_ERROR;
  14035. }
  14036. /* Cap the maximum size of a handshake message to something reasonable.
  14037. * By default is the maximum size of a certificate message assuming
  14038. * nine 2048-bit RSA certificates in the chain. */
  14039. if (size > MAX_HANDSHAKE_SZ) {
  14040. WOLFSSL_MSG("Handshake message too large");
  14041. WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
  14042. return HANDSHAKE_SIZE_ERROR;
  14043. }
  14044. /* size is the size of the certificate message payload */
  14045. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  14046. ssl->arrays->pendingMsgType = type;
  14047. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  14048. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  14049. ssl->heap,
  14050. DYNAMIC_TYPE_ARRAYS);
  14051. if (ssl->arrays->pendingMsg == NULL)
  14052. return MEMORY_E;
  14053. XMEMCPY(ssl->arrays->pendingMsg,
  14054. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  14055. inputLength);
  14056. ssl->arrays->pendingMsgOffset = inputLength;
  14057. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  14058. return 0;
  14059. }
  14060. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  14061. }
  14062. else {
  14063. word32 pendSz =
  14064. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  14065. /* Catch the case where there may be the remainder of a fragmented
  14066. * handshake message and the next handshake message in the same
  14067. * record. */
  14068. if (inputLength > pendSz)
  14069. inputLength = pendSz;
  14070. #ifdef WOLFSSL_ASYNC_CRYPT
  14071. if (ssl->error != WC_PENDING_E)
  14072. #endif
  14073. {
  14074. /* for async this copy was already done, do not replace, since
  14075. * contents may have been changed for inline operations */
  14076. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  14077. input + *inOutIdx, inputLength);
  14078. }
  14079. ssl->arrays->pendingMsgOffset += inputLength;
  14080. *inOutIdx += inputLength;
  14081. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  14082. {
  14083. word32 idx = HANDSHAKE_HEADER_SZ;
  14084. ret = DoHandShakeMsgType(ssl,
  14085. ssl->arrays->pendingMsg,
  14086. &idx, ssl->arrays->pendingMsgType,
  14087. ssl->arrays->pendingMsgSz - idx,
  14088. ssl->arrays->pendingMsgSz);
  14089. #ifdef WOLFSSL_ASYNC_CRYPT
  14090. if (ret == WC_PENDING_E) {
  14091. /* setup to process fragment again */
  14092. ssl->arrays->pendingMsgOffset -= inputLength;
  14093. *inOutIdx -= inputLength;
  14094. }
  14095. else
  14096. #endif
  14097. {
  14098. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  14099. ssl->arrays->pendingMsg = NULL;
  14100. ssl->arrays->pendingMsgSz = 0;
  14101. }
  14102. }
  14103. }
  14104. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  14105. return ret;
  14106. }
  14107. #endif /* !WOLFSSL_NO_TLS12 */
  14108. #ifdef WOLFSSL_DTLS
  14109. static int _DtlsCheckWindow(WOLFSSL* ssl)
  14110. {
  14111. word32* window;
  14112. word16 cur_hi, next_hi;
  14113. word32 cur_lo, next_lo, diff;
  14114. int curLT;
  14115. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  14116. if (!ssl->options.haveMcast)
  14117. peerSeq = ssl->keys.peerSeq;
  14118. else {
  14119. #ifdef WOLFSSL_MULTICAST
  14120. WOLFSSL_DTLS_PEERSEQ* p;
  14121. int i;
  14122. for (i = 0, p = ssl->keys.peerSeq;
  14123. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  14124. i++, p++) {
  14125. if (p->peerId == ssl->keys.curPeerId) {
  14126. peerSeq = p;
  14127. break;
  14128. }
  14129. }
  14130. #endif
  14131. }
  14132. if (peerSeq == NULL) {
  14133. WOLFSSL_MSG("Could not find peer sequence");
  14134. return 0;
  14135. }
  14136. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  14137. next_hi = peerSeq->nextSeq_hi;
  14138. next_lo = peerSeq->nextSeq_lo;
  14139. window = peerSeq->window;
  14140. }
  14141. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  14142. next_hi = peerSeq->prevSeq_hi;
  14143. next_lo = peerSeq->prevSeq_lo;
  14144. window = peerSeq->prevWindow;
  14145. }
  14146. else {
  14147. return 0;
  14148. }
  14149. cur_hi = ssl->keys.curSeq_hi;
  14150. cur_lo = ssl->keys.curSeq_lo;
  14151. /* If the difference between next and cur is > 2^32, way outside window. */
  14152. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  14153. WOLFSSL_MSG("Current record from way too far in the future.");
  14154. return 0;
  14155. }
  14156. if (cur_hi == next_hi) {
  14157. curLT = cur_lo < next_lo;
  14158. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  14159. }
  14160. else {
  14161. curLT = cur_hi < next_hi;
  14162. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  14163. }
  14164. /* Check to see that the next value is greater than the number of messages
  14165. * trackable in the window, and that the difference between the next
  14166. * expected sequence number and the received sequence number is inside the
  14167. * window. */
  14168. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  14169. curLT && (diff > DTLS_SEQ_BITS)) {
  14170. WOLFSSL_MSG("Current record sequence number from the past.");
  14171. return 0;
  14172. }
  14173. #ifdef WOLFSSL_DTLS_DISALLOW_FUTURE
  14174. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  14175. WOLFSSL_MSG("Rejecting message too far into the future.");
  14176. return 0;
  14177. }
  14178. #endif
  14179. else if (curLT) {
  14180. word32 idx;
  14181. word32 newDiff;
  14182. if (diff == 0) {
  14183. WOLFSSL_MSG("DTLS sanity check failed");
  14184. return 0;
  14185. }
  14186. diff--;
  14187. idx = diff / DTLS_WORD_BITS;
  14188. newDiff = diff % DTLS_WORD_BITS;
  14189. /* verify idx is valid for window array */
  14190. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  14191. WOLFSSL_MSG("Invalid DTLS windows index");
  14192. return 0;
  14193. }
  14194. if (window[idx] & (1 << newDiff)) {
  14195. WOLFSSL_MSG("Current record sequence number already received.");
  14196. return 0;
  14197. }
  14198. }
  14199. return 1;
  14200. }
  14201. #ifdef WOLFSSL_DTLS13
  14202. static WC_INLINE int Dtls13CheckWindow(WOLFSSL* ssl)
  14203. {
  14204. w64wrapper nextSeq, seq;
  14205. w64wrapper diff64;
  14206. word32 *window;
  14207. int wordOffset;
  14208. int wordIndex;
  14209. word32 diff;
  14210. if (ssl->dtls13DecryptEpoch == NULL) {
  14211. WOLFSSL_MSG("Can't find decrypting epoch");
  14212. return 0;
  14213. }
  14214. nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber;
  14215. window = ssl->dtls13DecryptEpoch->window;
  14216. seq = ssl->keys.curSeq;
  14217. if (w64GTE(seq, nextSeq))
  14218. return 1;
  14219. /* seq < nextSeq, nextSeq - seq */
  14220. diff64 = w64Sub(nextSeq, seq);
  14221. /* diff >= DTLS_SEQ_BITS, outside of the window */
  14222. if (w64GT(diff64, w64From32(0, DTLS_SEQ_BITS)))
  14223. return 0;
  14224. /* we are assuming DTLS_SEQ_BITS <= 2**32 */
  14225. diff = w64GetLow32(diff64);
  14226. /* zero based index */
  14227. diff--;
  14228. wordIndex = ((int)diff) / DTLS_WORD_BITS;
  14229. wordOffset = ((int)diff) % DTLS_WORD_BITS;
  14230. if (window[wordIndex] & (1 << wordOffset))
  14231. return 0;
  14232. return 1;
  14233. }
  14234. #endif /* WOLFSSL_DTLS13 */
  14235. #ifdef WOLFSSL_MULTICAST
  14236. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  14237. word32 second, word32 high)
  14238. {
  14239. word32 newCur = 0;
  14240. if (cur < first)
  14241. newCur = first;
  14242. else if (cur < second)
  14243. newCur = second;
  14244. else if (cur < high)
  14245. newCur = high;
  14246. return newCur;
  14247. }
  14248. #endif /* WOLFSSL_MULTICAST */
  14249. /* diff is the difference between the message sequence and the
  14250. * expected sequence number. 0 is special where it is an overflow. */
  14251. static void _DtlsUpdateWindowGTSeq(word32 diff, word32* window)
  14252. {
  14253. word32 idx, temp, i;
  14254. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  14255. if (diff == 0 || diff >= DTLS_SEQ_BITS)
  14256. XMEMSET(window, 0, DTLS_SEQ_SZ);
  14257. else {
  14258. temp = 0;
  14259. idx = diff / DTLS_WORD_BITS;
  14260. diff %= DTLS_WORD_BITS;
  14261. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  14262. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  14263. if (i < idx)
  14264. window[i] = 0;
  14265. else {
  14266. temp |= (oldWindow[i-idx] << diff);
  14267. window[i] = temp;
  14268. if (diff > 0)
  14269. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - diff);
  14270. else
  14271. temp = 0;
  14272. }
  14273. }
  14274. }
  14275. window[0] |= 1;
  14276. }
  14277. int wolfSSL_DtlsUpdateWindow(word16 cur_hi, word32 cur_lo,
  14278. word16* next_hi, word32* next_lo, word32 *window)
  14279. {
  14280. word32 diff;
  14281. int curLT;
  14282. if (cur_hi == *next_hi) {
  14283. curLT = cur_lo < *next_lo;
  14284. diff = curLT ? *next_lo - cur_lo : cur_lo - *next_lo;
  14285. }
  14286. else {
  14287. if (cur_hi > *next_hi + 1) {
  14288. /* reset window */
  14289. _DtlsUpdateWindowGTSeq(0, window);
  14290. *next_lo = cur_lo + 1;
  14291. if (*next_lo == 0)
  14292. *next_hi = cur_hi + 1;
  14293. else
  14294. *next_hi = cur_hi;
  14295. return 1;
  14296. }
  14297. else if (*next_hi > cur_hi + 1) {
  14298. return 1;
  14299. }
  14300. else {
  14301. curLT = cur_hi < *next_hi;
  14302. if (curLT) {
  14303. if (*next_lo < DTLS_SEQ_BITS &&
  14304. cur_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS)) {
  14305. /* diff here can still result in a difference that can not
  14306. * be stored in the window. The index is checked against
  14307. * WOLFSSL_DTLS_WINDOW_WORDS later. */
  14308. diff = *next_lo + ((word32)0xFFFFFFFF - cur_lo) + 1;
  14309. }
  14310. else {
  14311. /* Too far back to update */
  14312. return 1;
  14313. }
  14314. }
  14315. else {
  14316. if (*next_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS) &&
  14317. cur_lo < DTLS_SEQ_BITS) {
  14318. /* diff here can still result in a difference that can not
  14319. * be stored in the window. The index is checked against
  14320. * WOLFSSL_DTLS_WINDOW_WORDS later. */
  14321. diff = cur_lo - *next_lo;
  14322. }
  14323. else {
  14324. _DtlsUpdateWindowGTSeq(0, window);
  14325. *next_lo = cur_lo + 1;
  14326. if (*next_lo == 0)
  14327. *next_hi = cur_hi + 1;
  14328. else
  14329. *next_hi = cur_hi;
  14330. return 1;
  14331. }
  14332. }
  14333. }
  14334. }
  14335. if (curLT) {
  14336. word32 idx;
  14337. diff--;
  14338. idx = diff / DTLS_WORD_BITS;
  14339. diff %= DTLS_WORD_BITS;
  14340. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  14341. window[idx] |= (1 << diff);
  14342. }
  14343. else {
  14344. _DtlsUpdateWindowGTSeq(diff + 1, window);
  14345. *next_lo = cur_lo + 1;
  14346. if (*next_lo == 0)
  14347. *next_hi = cur_hi + 1;
  14348. else
  14349. *next_hi = cur_hi;
  14350. }
  14351. return 1;
  14352. }
  14353. static int _DtlsUpdateWindow(WOLFSSL* ssl)
  14354. {
  14355. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  14356. word16 *next_hi;
  14357. word32 *next_lo;
  14358. word32* window;
  14359. #ifdef WOLFSSL_MULTICAST
  14360. word32 cur_lo = ssl->keys.curSeq_lo;
  14361. if (ssl->options.haveMcast) {
  14362. WOLFSSL_DTLS_PEERSEQ* p;
  14363. int i;
  14364. peerSeq = NULL;
  14365. for (i = 0, p = ssl->keys.peerSeq;
  14366. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  14367. i++, p++) {
  14368. if (p->peerId == ssl->keys.curPeerId) {
  14369. peerSeq = p;
  14370. break;
  14371. }
  14372. }
  14373. if (peerSeq == NULL) {
  14374. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  14375. return 0;
  14376. }
  14377. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  14378. int cbError = 0;
  14379. if (ssl->ctx->mcastHwCb)
  14380. cbError = ssl->ctx->mcastHwCb(p->peerId,
  14381. ssl->ctx->mcastMaxSeq,
  14382. cur_lo, ssl->mcastHwCbCtx);
  14383. if (cbError) {
  14384. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  14385. return MCAST_HIGHWATER_CB_E;
  14386. }
  14387. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  14388. ssl->ctx->mcastFirstSeq,
  14389. ssl->ctx->mcastSecondSeq,
  14390. ssl->ctx->mcastMaxSeq);
  14391. }
  14392. }
  14393. #endif
  14394. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  14395. next_hi = &peerSeq->nextSeq_hi;
  14396. next_lo = &peerSeq->nextSeq_lo;
  14397. window = peerSeq->window;
  14398. }
  14399. else {
  14400. next_hi = &peerSeq->prevSeq_hi;
  14401. next_lo = &peerSeq->prevSeq_lo;
  14402. window = peerSeq->prevWindow;
  14403. }
  14404. return wolfSSL_DtlsUpdateWindow(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo,
  14405. next_hi, next_lo, window);
  14406. }
  14407. #ifdef WOLFSSL_DTLS13
  14408. static WC_INLINE int Dtls13UpdateWindow(WOLFSSL* ssl)
  14409. {
  14410. w64wrapper nextSeq, seq;
  14411. w64wrapper diff64;
  14412. word32 *window;
  14413. int wordOffset;
  14414. int wordIndex;
  14415. word32 diff;
  14416. if (ssl->dtls13DecryptEpoch == NULL) {
  14417. WOLFSSL_MSG("Can't find decrypting Epoch");
  14418. return BAD_STATE_E;
  14419. }
  14420. nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber;
  14421. window = ssl->dtls13DecryptEpoch->window;
  14422. seq = ssl->keys.curSeq;
  14423. /* seq < nextSeq */
  14424. if (w64LT(seq, nextSeq)) {
  14425. diff64 = w64Sub(nextSeq, seq);
  14426. /* zero based index */
  14427. w64Decrement(&diff64);
  14428. /* FIXME: check that diff64 < DTLS_WORDS_BITS */
  14429. diff = w64GetLow32(diff64);
  14430. wordIndex = ((int)diff) / DTLS_WORD_BITS;
  14431. wordOffset = ((int)diff) % DTLS_WORD_BITS;
  14432. if (wordIndex >= WOLFSSL_DTLS_WINDOW_WORDS) {
  14433. WOLFSSL_MSG("Invalid sequence number to Dtls13UpdateWindow");
  14434. return BAD_STATE_E;
  14435. }
  14436. window[wordIndex] |= (1 << wordOffset);
  14437. return 1;
  14438. }
  14439. /* seq >= nextSeq, seq - nextSeq */
  14440. diff64 = w64Sub(seq, nextSeq);
  14441. /* as we are considering nextSeq inside the window, we should add + 1 */
  14442. w64Increment(&diff64);
  14443. _DtlsUpdateWindowGTSeq(w64GetLow32(diff64), window);
  14444. w64Increment(&seq);
  14445. ssl->dtls13DecryptEpoch->nextPeerSeqNumber = seq;
  14446. return 1;
  14447. }
  14448. #endif /* WOLFSSL_DTLS13 */
  14449. int DtlsMsgDrain(WOLFSSL* ssl)
  14450. {
  14451. DtlsMsg* item = ssl->dtls_rx_msg_list;
  14452. int ret = 0;
  14453. WOLFSSL_ENTER("DtlsMsgDrain()");
  14454. /* While there is an item in the store list, and it is the expected
  14455. * message, and it is complete, and there hasn't been an error in the
  14456. * last message... */
  14457. while (item != NULL &&
  14458. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  14459. item->ready && ret == 0) {
  14460. word32 idx = 0;
  14461. #ifdef WOLFSSL_NO_TLS12
  14462. ret = DoTls13HandShakeMsgType(ssl, item->fullMsg, &idx, item->type,
  14463. item->sz, item->sz);
  14464. #else
  14465. ret = DoHandShakeMsgType(ssl, item->fullMsg, &idx, item->type,
  14466. item->sz, item->sz);
  14467. #endif
  14468. if (ret == 0) {
  14469. DtlsTxMsgListClean(ssl);
  14470. }
  14471. #ifdef WOLFSSL_ASYNC_CRYPT
  14472. if (ret == WC_PENDING_E) {
  14473. break;
  14474. }
  14475. #endif
  14476. ssl->dtls_rx_msg_list = item->next;
  14477. DtlsMsgDelete(item, ssl->heap);
  14478. item = ssl->dtls_rx_msg_list;
  14479. ssl->dtls_rx_msg_list_sz--;
  14480. }
  14481. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  14482. return ret;
  14483. }
  14484. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  14485. word32 totalSz)
  14486. {
  14487. byte type;
  14488. word32 size;
  14489. word32 fragOffset, fragSz;
  14490. int ret = 0;
  14491. int ignoreFinished = 0;
  14492. WOLFSSL_ENTER("DoDtlsHandShakeMsg()");
  14493. /* parse header */
  14494. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  14495. &size, &fragOffset, &fragSz, totalSz) != 0) {
  14496. WOLFSSL_ERROR(PARSE_ERROR);
  14497. return PARSE_ERROR;
  14498. }
  14499. /* Cap the maximum size of a handshake message to something reasonable.
  14500. * By default is the maximum size of a certificate message assuming
  14501. * nine 2048-bit RSA certificates in the chain. */
  14502. if (size > MAX_HANDSHAKE_SZ) {
  14503. WOLFSSL_MSG("Handshake message too large");
  14504. return HANDSHAKE_SIZE_ERROR;
  14505. }
  14506. /* check that we have complete fragment */
  14507. if (*inOutIdx + fragSz > totalSz) {
  14508. WOLFSSL_ERROR(INCOMPLETE_DATA);
  14509. return INCOMPLETE_DATA;
  14510. }
  14511. /* check that the fragment is contained in the message */
  14512. if (fragOffset + fragSz > size) {
  14513. WOLFSSL_ERROR(LENGTH_ERROR);
  14514. return LENGTH_ERROR;
  14515. }
  14516. if (type == finished && ssl->keys.dtls_peer_handshake_number >=
  14517. ssl->keys.dtls_expected_peer_handshake_number &&
  14518. ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
  14519. /* finished msg should be ignore from the current epoch
  14520. * if it comes from a previous handshake */
  14521. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14522. ignoreFinished = ssl->options.connectState < FINISHED_DONE;
  14523. }
  14524. else {
  14525. ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
  14526. }
  14527. }
  14528. #if !defined(NO_WOLFSSL_SERVER)
  14529. if (ssl->options.side == WOLFSSL_SERVER_END &&
  14530. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE &&
  14531. type != client_hello) {
  14532. WOLFSSL_MSG("Ignoring other messages before we verify a ClientHello");
  14533. *inOutIdx = totalSz;
  14534. return 0;
  14535. }
  14536. #endif
  14537. /* Check the handshake sequence number first. If out of order,
  14538. * add the current message to the list. If the message is in order,
  14539. * but it is a fragment, add the current message to the list, then
  14540. * check the head of the list to see if it is complete, if so, pop
  14541. * it out as the current message. If the message is complete and in
  14542. * order, process it. Check the head of the list to see if it is in
  14543. * order, if so, process it. (Repeat until list exhausted.) If the
  14544. * head is out of order, return for more processing.
  14545. */
  14546. if (ssl->keys.dtls_peer_handshake_number >
  14547. ssl->keys.dtls_expected_peer_handshake_number &&
  14548. /* Only client_hello shouldn't be ignored if the handshake
  14549. * num is greater */
  14550. (type == client_hello ||
  14551. ssl->options.handShakeState != HANDSHAKE_DONE) &&
  14552. !ignoreFinished) {
  14553. /* Current message is out of order. It will get stored in the list.
  14554. * Storing also takes care of defragmentation. If the messages is a
  14555. * client hello, we need to process this out of order; the server
  14556. * is not supposed to keep state, but the second client hello will
  14557. * have a different handshake sequence number than is expected, and
  14558. * the server shouldn't be expecting any particular handshake sequence
  14559. * number. (If the cookie changes multiple times in quick succession,
  14560. * the client could be sending multiple new client hello messages
  14561. * with newer and newer cookies.) */
  14562. if (type != client_hello) {
  14563. WOLFSSL_MSG("Current message is out of order");
  14564. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  14565. WOLFSSL_MSG("Reached rx msg limit error");
  14566. return DTLS_TOO_MANY_FRAGMENTS_E;
  14567. }
  14568. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  14569. ssl->keys.dtls_peer_handshake_number,
  14570. input + *inOutIdx, size, type,
  14571. fragOffset, fragSz, ssl->heap);
  14572. *inOutIdx += fragSz;
  14573. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14574. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14575. word32 digestSz = MacSize(ssl);
  14576. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) {
  14577. WOLFSSL_ERROR(BUFFER_E);
  14578. return BUFFER_E;
  14579. }
  14580. *inOutIdx += digestSz;
  14581. }
  14582. else
  14583. #endif
  14584. {
  14585. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  14586. WOLFSSL_ERROR(BUFFER_E);
  14587. return BUFFER_E;
  14588. }
  14589. }
  14590. *inOutIdx += ssl->keys.padSz;
  14591. ret = 0;
  14592. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  14593. /* If we receive an out of order last flight msg then retransmit */
  14594. if (type == server_hello_done || type == finished) {
  14595. ret = DtlsMsgPoolSend(ssl, 0);
  14596. }
  14597. #endif
  14598. }
  14599. else {
  14600. if (fragSz < size) {
  14601. /* a fragmented ClientHello, very probably forged or
  14602. erroneous. Even if the packet is valid, we don't want to save
  14603. state while processing a ClientHello to avoid DoS attacks */
  14604. WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
  14605. *inOutIdx = totalSz;
  14606. }
  14607. else {
  14608. #ifdef WOLFSSL_NO_TLS12
  14609. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  14610. totalSz);
  14611. #else
  14612. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size,
  14613. totalSz);
  14614. #endif
  14615. }
  14616. }
  14617. }
  14618. else if (ssl->keys.dtls_peer_handshake_number <
  14619. ssl->keys.dtls_expected_peer_handshake_number ||
  14620. /* ignore all handshake messages if we are done with the
  14621. * handshake */
  14622. (ssl->keys.dtls_peer_handshake_number >
  14623. ssl->keys.dtls_expected_peer_handshake_number &&
  14624. ssl->options.handShakeState == HANDSHAKE_DONE) ||
  14625. ignoreFinished) {
  14626. /* Already saw this message and processed it. It can be ignored. */
  14627. WOLFSSL_MSG("Already saw this message and processed it");
  14628. *inOutIdx += fragSz;
  14629. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14630. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14631. word32 digestSz = MacSize(ssl);
  14632. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) {
  14633. WOLFSSL_ERROR(BUFFER_E);
  14634. return BUFFER_E;
  14635. }
  14636. *inOutIdx += digestSz;
  14637. }
  14638. else
  14639. #endif
  14640. {
  14641. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  14642. WOLFSSL_ERROR(BUFFER_E);
  14643. return BUFFER_E;
  14644. }
  14645. }
  14646. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  14647. if (IsDtlsNotSctpMode(ssl) &&
  14648. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  14649. ret = DtlsMsgPoolSend(ssl, 0);
  14650. }
  14651. #endif
  14652. *inOutIdx += ssl->keys.padSz;
  14653. }
  14654. else if (fragSz < size) {
  14655. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  14656. * be pointing to the message with this fragment in it. Check it to see
  14657. * if it is completed. */
  14658. WOLFSSL_MSG("Branch is in order, but fragmented");
  14659. if (type == client_hello) {
  14660. WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
  14661. *inOutIdx = totalSz;
  14662. return 0;
  14663. }
  14664. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  14665. WOLFSSL_MSG("Reached rx msg limit error");
  14666. WOLFSSL_ERROR(DTLS_TOO_MANY_FRAGMENTS_E);
  14667. return DTLS_TOO_MANY_FRAGMENTS_E;
  14668. }
  14669. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  14670. ssl->keys.dtls_peer_handshake_number,
  14671. input + *inOutIdx, size, type,
  14672. fragOffset, fragSz, ssl->heap);
  14673. *inOutIdx += fragSz;
  14674. *inOutIdx += ssl->keys.padSz;
  14675. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14676. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14677. word32 digestSz = MacSize(ssl);
  14678. if (*inOutIdx + digestSz > totalSz) {
  14679. WOLFSSL_ERROR(BUFFER_E);
  14680. return BUFFER_E;
  14681. }
  14682. *inOutIdx += digestSz;
  14683. }
  14684. #endif
  14685. ret = 0;
  14686. if (ssl->dtls_rx_msg_list != NULL && ssl->dtls_rx_msg_list->ready)
  14687. ret = DtlsMsgDrain(ssl);
  14688. }
  14689. else {
  14690. /* This branch is in order next, and a complete message. On success
  14691. * clean the tx list. */
  14692. WOLFSSL_MSG("Branch is in order and a complete message");
  14693. #ifdef WOLFSSL_ASYNC_CRYPT
  14694. if (ssl->devId != INVALID_DEVID) {
  14695. word32 idx = *inOutIdx;
  14696. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  14697. WOLFSSL_ERROR(BUFFER_ERROR);
  14698. return BUFFER_ERROR;
  14699. }
  14700. if (idx + fragSz + ssl->keys.padSz > totalSz)
  14701. return BUFFER_E;
  14702. *inOutIdx = idx + fragSz + ssl->keys.padSz;
  14703. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14704. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14705. word32 digestSz = MacSize(ssl);
  14706. if (*inOutIdx + digestSz > totalSz)
  14707. return BUFFER_E;
  14708. *inOutIdx += digestSz;
  14709. }
  14710. #endif
  14711. /* In async mode always store the message and process it with
  14712. * DtlsMsgDrain because in case of a WC_PENDING_E it will be
  14713. * easier this way. */
  14714. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  14715. WOLFSSL_MSG("Reached rx msg limit error");
  14716. return DTLS_TOO_MANY_FRAGMENTS_E;
  14717. }
  14718. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  14719. ssl->keys.dtls_peer_handshake_number,
  14720. input + idx, size, type,
  14721. fragOffset, fragSz, ssl->heap);
  14722. ret = DtlsMsgDrain(ssl);
  14723. }
  14724. else
  14725. #endif
  14726. {
  14727. #ifdef WOLFSSL_NO_TLS12
  14728. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  14729. totalSz);
  14730. #else
  14731. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  14732. #endif
  14733. if (ret == 0) {
  14734. DtlsTxMsgListClean(ssl);
  14735. if (ssl->dtls_rx_msg_list != NULL) {
  14736. ret = DtlsMsgDrain(ssl);
  14737. }
  14738. }
  14739. }
  14740. }
  14741. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  14742. return ret;
  14743. }
  14744. #endif /* WOLFSSL_DTLS13 */
  14745. #ifndef WOLFSSL_NO_TLS12
  14746. #ifdef HAVE_AEAD
  14747. #if (!defined(NO_PUBLIC_GCM_SET_IV) && \
  14748. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  14749. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
  14750. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
  14751. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  14752. {
  14753. int i;
  14754. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  14755. if (++ssl->keys.aead_exp_IV[i]) return;
  14756. }
  14757. }
  14758. #endif
  14759. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && !defined(NO_CHAPOL_AEAD)
  14760. /* Used for the older version of creating AEAD tags with Poly1305 */
  14761. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  14762. byte* cipher, word16 sz, byte* tag)
  14763. {
  14764. int ret = 0;
  14765. int msglen = (sz - ssl->specs.aead_mac_size);
  14766. word32 keySz = 32;
  14767. byte padding[8]; /* used to temporarily store lengths */
  14768. #ifdef CHACHA_AEAD_TEST
  14769. printf("Using old version of poly1305 input.\n");
  14770. #endif
  14771. if (msglen < 0)
  14772. return INPUT_CASE_ERROR;
  14773. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  14774. return ret;
  14775. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  14776. AEAD_AUTH_DATA_SZ)) != 0)
  14777. return ret;
  14778. /* length of additional input plus padding */
  14779. XMEMSET(padding, 0, sizeof(padding));
  14780. padding[0] = AEAD_AUTH_DATA_SZ;
  14781. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  14782. sizeof(padding))) != 0)
  14783. return ret;
  14784. /* add cipher info and then its length */
  14785. XMEMSET(padding, 0, sizeof(padding));
  14786. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  14787. return ret;
  14788. /* 32 bit size of cipher to 64 bit endian */
  14789. padding[0] = msglen & 0xff;
  14790. padding[1] = (msglen >> 8) & 0xff;
  14791. padding[2] = ((word32)msglen >> 16) & 0xff;
  14792. padding[3] = ((word32)msglen >> 24) & 0xff;
  14793. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  14794. != 0)
  14795. return ret;
  14796. /* generate tag */
  14797. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  14798. return ret;
  14799. return ret;
  14800. }
  14801. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  14802. * the implementation follows an older draft for creating the nonce and MAC.
  14803. * The flag oldPoly gets set automatically depending on what cipher suite was
  14804. * negotiated in the handshake. This is able to be done because the IDs for the
  14805. * cipher suites was updated in RFC7905 giving unique values for the older
  14806. * draft in comparison to the more recent RFC.
  14807. *
  14808. * ssl WOLFSSL structure to get cipher and TLS state from
  14809. * out output buffer to hold encrypted data
  14810. * input data to encrypt
  14811. * sz size of input
  14812. *
  14813. * Return 0 on success negative values in error case
  14814. */
  14815. int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  14816. word16 sz)
  14817. {
  14818. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  14819. int ret = 0;
  14820. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  14821. byte tag[POLY1305_AUTH_SZ];
  14822. byte add[AEAD_AUTH_DATA_SZ];
  14823. byte nonce[CHACHA20_NONCE_SZ];
  14824. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  14825. #ifdef CHACHA_AEAD_TEST
  14826. int i;
  14827. #endif
  14828. Keys* keys = &ssl->keys;
  14829. XMEMSET(tag, 0, sizeof(tag));
  14830. XMEMSET(nonce, 0, sizeof(nonce));
  14831. XMEMSET(poly, 0, sizeof(poly));
  14832. XMEMSET(add, 0, sizeof(add));
  14833. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  14834. /*
  14835. * For epochs 2+:
  14836. * * use ssl->secure_renegotiation when encrypting the current epoch as it
  14837. * has the current epoch cipher material
  14838. * * use PREV_ORDER if encrypting the epoch not in
  14839. * ssl->secure_renegotiation
  14840. */
  14841. /* opaque SEQ number stored for AD */
  14842. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  14843. if (ssl->keys.dtls_epoch ==
  14844. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  14845. keys = &ssl->secure_renegotiation->tmp_keys;
  14846. WriteSEQ(ssl, CUR_ORDER, add);
  14847. }
  14848. else
  14849. WriteSEQ(ssl, PREV_ORDER, add);
  14850. }
  14851. else
  14852. #endif
  14853. WriteSEQ(ssl, CUR_ORDER, add);
  14854. if (ssl->options.oldPoly != 0) {
  14855. /* get nonce. SEQ should not be incremented again here */
  14856. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  14857. }
  14858. /* Store the type, version. Unfortunately, they are in
  14859. * the input buffer ahead of the plaintext. */
  14860. #ifdef WOLFSSL_DTLS
  14861. if (ssl->options.dtls) {
  14862. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  14863. }
  14864. #endif
  14865. /* add TLS message size to additional data */
  14866. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  14867. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  14868. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  14869. #ifdef CHACHA_AEAD_TEST
  14870. printf("Encrypt Additional : ");
  14871. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  14872. printf("%02x", add[i]);
  14873. }
  14874. printf("\n\n");
  14875. printf("input before encryption :\n");
  14876. for (i = 0; i < sz; i++) {
  14877. printf("%02x", input[i]);
  14878. if ((i + 1) % 16 == 0)
  14879. printf("\n");
  14880. }
  14881. printf("\n");
  14882. #endif
  14883. if (ssl->options.oldPoly == 0) {
  14884. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  14885. * record sequence number XORed with client_write_IV/server_write_IV */
  14886. XMEMCPY(nonce, keys->aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  14887. nonce[4] ^= add[0];
  14888. nonce[5] ^= add[1];
  14889. nonce[6] ^= add[2];
  14890. nonce[7] ^= add[3];
  14891. nonce[8] ^= add[4];
  14892. nonce[9] ^= add[5];
  14893. nonce[10] ^= add[6];
  14894. nonce[11] ^= add[7];
  14895. }
  14896. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14897. wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
  14898. #endif
  14899. /* set the nonce for chacha and get poly1305 key */
  14900. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  14901. ForceZero(nonce, CHACHA20_NONCE_SZ);
  14902. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14903. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14904. #endif
  14905. return ret;
  14906. }
  14907. /* create Poly1305 key using chacha20 keystream */
  14908. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  14909. poly, sizeof(poly))) != 0) {
  14910. ForceZero(nonce, CHACHA20_NONCE_SZ);
  14911. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14912. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14913. #endif
  14914. return ret;
  14915. }
  14916. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14917. wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
  14918. #endif
  14919. /* set the counter after getting poly1305 key */
  14920. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
  14921. ForceZero(nonce, CHACHA20_NONCE_SZ);
  14922. ForceZero(poly, sizeof(poly));
  14923. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14924. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14925. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14926. #endif
  14927. return ret;
  14928. }
  14929. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  14930. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14931. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14932. #endif
  14933. /* encrypt the plain text */
  14934. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  14935. input, msgLen)) != 0) {
  14936. ForceZero(poly, sizeof(poly));
  14937. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14938. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14939. #endif
  14940. return ret;
  14941. }
  14942. /* get the poly1305 tag using either old padding scheme or more recent */
  14943. if (ssl->options.oldPoly != 0) {
  14944. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  14945. poly, sz, tag)) != 0) {
  14946. ForceZero(poly, sizeof(poly));
  14947. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14948. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14949. #endif
  14950. return ret;
  14951. }
  14952. }
  14953. else {
  14954. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  14955. sizeof(poly))) != 0) {
  14956. ForceZero(poly, sizeof(poly));
  14957. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14958. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14959. #endif
  14960. return ret;
  14961. }
  14962. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  14963. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  14964. ForceZero(poly, sizeof(poly));
  14965. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14966. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14967. #endif
  14968. return ret;
  14969. }
  14970. }
  14971. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  14972. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14973. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14974. #endif
  14975. /* append tag to ciphertext */
  14976. XMEMCPY(out + msgLen, tag, sizeof(tag));
  14977. AeadIncrementExpIV(ssl);
  14978. #ifdef CHACHA_AEAD_TEST
  14979. printf("mac tag :\n");
  14980. for (i = 0; i < 16; i++) {
  14981. printf("%02x", tag[i]);
  14982. if ((i + 1) % 16 == 0)
  14983. printf("\n");
  14984. }
  14985. printf("\n\noutput after encrypt :\n");
  14986. for (i = 0; i < sz; i++) {
  14987. printf("%02x", out[i]);
  14988. if ((i + 1) % 16 == 0)
  14989. printf("\n");
  14990. }
  14991. printf("\n");
  14992. #endif
  14993. return ret;
  14994. }
  14995. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  14996. * the implementation follows an older draft for creating the nonce and MAC.
  14997. * The flag oldPoly gets set automatically depending on what cipher suite was
  14998. * negotiated in the handshake. This is able to be done because the IDs for the
  14999. * cipher suites was updated in RFC7905 giving unique values for the older
  15000. * draft in comparison to the more recent RFC.
  15001. *
  15002. * ssl WOLFSSL structure to get cipher and TLS state from
  15003. * plain output buffer to hold decrypted data
  15004. * input data to decrypt
  15005. * sz size of input
  15006. *
  15007. * Return 0 on success negative values in error case
  15008. */
  15009. static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  15010. word16 sz)
  15011. {
  15012. byte add[AEAD_AUTH_DATA_SZ];
  15013. byte nonce[CHACHA20_NONCE_SZ];
  15014. byte tag[POLY1305_AUTH_SZ];
  15015. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  15016. int ret = 0;
  15017. int msgLen = (sz - ssl->specs.aead_mac_size);
  15018. Keys* keys = &ssl->keys;
  15019. #ifdef CHACHA_AEAD_TEST
  15020. int i;
  15021. printf("input before decrypt :\n");
  15022. for (i = 0; i < sz; i++) {
  15023. printf("%02x", input[i]);
  15024. if ((i + 1) % 16 == 0)
  15025. printf("\n");
  15026. }
  15027. printf("\n");
  15028. #endif
  15029. XMEMSET(tag, 0, sizeof(tag));
  15030. XMEMSET(poly, 0, sizeof(poly));
  15031. XMEMSET(nonce, 0, sizeof(nonce));
  15032. XMEMSET(add, 0, sizeof(add));
  15033. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15034. /*
  15035. * For epochs 2+:
  15036. * * use ssl->secure_renegotiation when decrypting the latest epoch as it
  15037. * has the latest epoch cipher material
  15038. */
  15039. if (ssl->options.dtls && DtlsSCRKeysSet(ssl) &&
  15040. ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  15041. keys = &ssl->secure_renegotiation->tmp_keys;
  15042. #endif
  15043. /* sequence number field is 64-bits */
  15044. WriteSEQ(ssl, PEER_ORDER, add);
  15045. if (ssl->options.oldPoly != 0) {
  15046. /* get nonce, SEQ should not be incremented again here */
  15047. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  15048. }
  15049. /* get AD info */
  15050. /* Store the type, version. */
  15051. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  15052. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  15053. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  15054. /* add TLS message size to additional data */
  15055. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  15056. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  15057. #ifdef CHACHA_AEAD_TEST
  15058. printf("Decrypt Additional : ");
  15059. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  15060. printf("%02x", add[i]);
  15061. }
  15062. printf("\n\n");
  15063. #endif
  15064. if (ssl->options.oldPoly == 0) {
  15065. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  15066. * record sequence number XORed with client_write_IV/server_write_IV */
  15067. XMEMCPY(nonce, keys->aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  15068. nonce[4] ^= add[0];
  15069. nonce[5] ^= add[1];
  15070. nonce[6] ^= add[2];
  15071. nonce[7] ^= add[3];
  15072. nonce[8] ^= add[4];
  15073. nonce[9] ^= add[5];
  15074. nonce[10] ^= add[6];
  15075. nonce[11] ^= add[7];
  15076. }
  15077. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15078. wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
  15079. #endif
  15080. /* set nonce and get poly1305 key */
  15081. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  15082. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15083. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15084. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15085. #endif
  15086. return ret;
  15087. }
  15088. /* use chacha20 keystream to get poly1305 key for tag */
  15089. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  15090. poly, sizeof(poly))) != 0) {
  15091. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15092. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15093. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15094. #endif
  15095. return ret;
  15096. }
  15097. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15098. wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
  15099. #endif
  15100. /* set counter after getting poly1305 key */
  15101. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
  15102. ForceZero(nonce, CHACHA20_NONCE_SZ);
  15103. ForceZero(poly, sizeof(poly));
  15104. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15105. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15106. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15107. #endif
  15108. return ret;
  15109. }
  15110. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  15111. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15112. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  15113. #endif
  15114. /* get the tag using Poly1305 */
  15115. if (ssl->options.oldPoly != 0) {
  15116. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  15117. ForceZero(poly, sizeof(poly));
  15118. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15119. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15120. #endif
  15121. return ret;
  15122. }
  15123. }
  15124. else {
  15125. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  15126. sizeof(poly))) != 0) {
  15127. ForceZero(poly, sizeof(poly));
  15128. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15129. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15130. #endif
  15131. return ret;
  15132. }
  15133. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  15134. sizeof(add), input, msgLen, tag, sizeof(tag))) != 0) {
  15135. ForceZero(poly, sizeof(poly));
  15136. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15137. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15138. #endif
  15139. return ret;
  15140. }
  15141. }
  15142. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  15143. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15144. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  15145. #endif
  15146. /* check tag sent along with packet */
  15147. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  15148. WOLFSSL_MSG("MAC did not match");
  15149. if (!ssl->options.dtls)
  15150. SendAlert(ssl, alert_fatal, bad_record_mac);
  15151. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  15152. return VERIFY_MAC_ERROR;
  15153. }
  15154. /* if the tag was good decrypt message */
  15155. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  15156. input, msgLen)) != 0)
  15157. return ret;
  15158. #ifdef CHACHA_AEAD_TEST
  15159. printf("plain after decrypt :\n");
  15160. for (i = 0; i < sz; i++) {
  15161. printf("%02x", plain[i]);
  15162. if ((i + 1) % 16 == 0)
  15163. printf("\n");
  15164. }
  15165. printf("\n");
  15166. #endif
  15167. return ret;
  15168. }
  15169. #endif /* HAVE_CHACHA && HAVE_POLY1305 && !NO_CHAPOL_AEAD*/
  15170. #endif /* HAVE_AEAD */
  15171. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15172. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  15173. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  15174. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  15175. /* The following type is used to share code between AES-GCM and AES-CCM. */
  15176. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  15177. const byte* in, word32 sz,
  15178. byte* iv, word32 ivSz,
  15179. byte* authTag, word32 authTagSz,
  15180. const byte* authIn, word32 authInSz);
  15181. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  15182. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  15183. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  15184. #else
  15185. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  15186. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  15187. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  15188. #endif
  15189. #endif
  15190. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  15191. word16 sz, int asyncOkay)
  15192. {
  15193. int ret = 0;
  15194. #ifdef WOLFSSL_ASYNC_CRYPT
  15195. WC_ASYNC_DEV* asyncDev = NULL;
  15196. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  15197. #else
  15198. (void)asyncOkay;
  15199. #endif
  15200. (void)out;
  15201. (void)input;
  15202. (void)sz;
  15203. if (input == NULL) {
  15204. return BAD_FUNC_ARG;
  15205. }
  15206. switch (ssl->specs.bulk_cipher_algorithm) {
  15207. #ifdef BUILD_ARC4
  15208. case wolfssl_rc4:
  15209. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  15210. break;
  15211. #endif
  15212. #ifdef BUILD_DES3
  15213. case wolfssl_triple_des:
  15214. #ifdef WOLFSSL_ASYNC_CRYPT
  15215. /* initialize event */
  15216. asyncDev = &ssl->encrypt.des3->asyncDev;
  15217. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  15218. if (ret != 0)
  15219. break;
  15220. #endif
  15221. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  15222. #ifdef WOLFSSL_ASYNC_CRYPT
  15223. if (ret == WC_PENDING_E && asyncOkay) {
  15224. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15225. }
  15226. #endif
  15227. break;
  15228. #endif
  15229. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  15230. case wolfssl_aes:
  15231. #ifdef WOLFSSL_ASYNC_CRYPT
  15232. /* initialize event */
  15233. asyncDev = &ssl->encrypt.aes->asyncDev;
  15234. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  15235. if (ret != 0)
  15236. break;
  15237. #endif
  15238. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  15239. #ifdef WOLFSSL_ASYNC_CRYPT
  15240. if (ret == WC_PENDING_E && asyncOkay) {
  15241. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15242. }
  15243. #endif
  15244. break;
  15245. #endif
  15246. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15247. case wolfssl_aes_gcm:
  15248. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  15249. {
  15250. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  15251. const byte* additionalSrc;
  15252. #ifdef WOLFSSL_ASYNC_CRYPT
  15253. /* initialize event */
  15254. asyncDev = &ssl->encrypt.aes->asyncDev;
  15255. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  15256. if (ret != 0)
  15257. break;
  15258. #endif
  15259. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  15260. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  15261. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  15262. #elif defined(BUILD_AESGCM)
  15263. aes_auth_fn = AES_GCM_ENCRYPT;
  15264. #else
  15265. aes_auth_fn = AES_CCM_ENCRYPT;
  15266. #endif
  15267. additionalSrc = input - 5;
  15268. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  15269. /* sequence number field is 64-bits */
  15270. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  15271. /* Store the type, version. Unfortunately, they are in
  15272. * the input buffer ahead of the plaintext. */
  15273. #ifdef WOLFSSL_DTLS
  15274. if (ssl->options.dtls) {
  15275. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  15276. }
  15277. #endif
  15278. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  15279. additionalSrc, 3);
  15280. /* Store the length of the plain text minus the explicit
  15281. * IV length minus the authentication tag size. */
  15282. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15283. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  15284. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15285. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  15286. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  15287. XMEMCPY(ssl->encrypt.nonce,
  15288. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  15289. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  15290. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  15291. #endif
  15292. ret = aes_auth_fn(ssl->encrypt.aes,
  15293. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  15294. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15295. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  15296. out + sz - ssl->specs.aead_mac_size,
  15297. ssl->specs.aead_mac_size,
  15298. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  15299. #ifdef WOLFSSL_ASYNC_CRYPT
  15300. if (ret == WC_PENDING_E && asyncOkay) {
  15301. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15302. }
  15303. #endif
  15304. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15305. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  15306. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  15307. XMEMCPY(out,
  15308. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  15309. #endif
  15310. }
  15311. break;
  15312. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15313. #ifdef HAVE_CAMELLIA
  15314. case wolfssl_camellia:
  15315. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  15316. break;
  15317. #endif
  15318. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  15319. !defined(NO_CHAPOL_AEAD)
  15320. case wolfssl_chacha:
  15321. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  15322. break;
  15323. #endif
  15324. #ifdef HAVE_NULL_CIPHER
  15325. case wolfssl_cipher_null:
  15326. if (input != out) {
  15327. XMEMMOVE(out, input, sz);
  15328. }
  15329. break;
  15330. #endif
  15331. default:
  15332. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  15333. ret = ENCRYPT_ERROR;
  15334. WOLFSSL_ERROR_VERBOSE(ret);
  15335. }
  15336. #ifdef WOLFSSL_ASYNC_CRYPT
  15337. /* if async is not okay, then block */
  15338. if (ret == WC_PENDING_E && !asyncOkay) {
  15339. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  15340. }
  15341. #endif
  15342. return ret;
  15343. }
  15344. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input,
  15345. word16 sz, int asyncOkay)
  15346. {
  15347. int ret = 0;
  15348. #ifdef WOLFSSL_ASYNC_CRYPT
  15349. if (ssl->error == WC_PENDING_E) {
  15350. ssl->error = 0; /* clear async */
  15351. }
  15352. #endif
  15353. switch (ssl->encrypt.state) {
  15354. case CIPHER_STATE_BEGIN:
  15355. {
  15356. if (ssl->encrypt.setup == 0) {
  15357. WOLFSSL_MSG("Encrypt ciphers not setup");
  15358. WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
  15359. return ENCRYPT_ERROR;
  15360. }
  15361. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  15362. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  15363. XMEMCPY(ssl->encrypt.sanityCheck, input,
  15364. min(sz, sizeof(ssl->encrypt.sanityCheck)));
  15365. }
  15366. #endif
  15367. #ifdef HAVE_FUZZER
  15368. if (ssl->fuzzerCb)
  15369. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  15370. #endif
  15371. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15372. /* make sure AES GCM/CCM memory is allocated */
  15373. /* free for these happens in FreeCiphers */
  15374. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15375. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  15376. /* make sure auth iv and auth are allocated */
  15377. if (ssl->encrypt.additional == NULL)
  15378. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  15379. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15380. if (ssl->encrypt.nonce == NULL) {
  15381. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  15382. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15383. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15384. if (ssl->encrypt.nonce != NULL) {
  15385. wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce,
  15386. AESGCM_NONCE_SZ);
  15387. }
  15388. #endif
  15389. }
  15390. if (ssl->encrypt.additional == NULL ||
  15391. ssl->encrypt.nonce == NULL) {
  15392. return MEMORY_E;
  15393. }
  15394. }
  15395. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15396. /* Advance state and proceed */
  15397. ssl->encrypt.state = CIPHER_STATE_DO;
  15398. }
  15399. FALL_THROUGH;
  15400. case CIPHER_STATE_DO:
  15401. {
  15402. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  15403. /* Advance state */
  15404. ssl->encrypt.state = CIPHER_STATE_END;
  15405. #ifdef WOLFSSL_ASYNC_CRYPT
  15406. /* If pending, then leave and return will resume below */
  15407. if (ret == WC_PENDING_E) {
  15408. return ret;
  15409. }
  15410. #endif
  15411. }
  15412. FALL_THROUGH;
  15413. case CIPHER_STATE_END:
  15414. {
  15415. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  15416. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null &&
  15417. XMEMCMP(out, ssl->encrypt.sanityCheck,
  15418. min(sz, sizeof(ssl->encrypt.sanityCheck))) == 0) {
  15419. WOLFSSL_MSG("Encrypt sanity check failed! Glitch?");
  15420. WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
  15421. return ENCRYPT_ERROR;
  15422. }
  15423. ForceZero(ssl->encrypt.sanityCheck,
  15424. sizeof(ssl->encrypt.sanityCheck));
  15425. #endif
  15426. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15427. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15428. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  15429. {
  15430. /* finalize authentication cipher */
  15431. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15432. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  15433. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  15434. AeadIncrementExpIV(ssl);
  15435. #endif
  15436. if (ssl->encrypt.nonce)
  15437. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  15438. }
  15439. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15440. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15441. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  15442. (out != input) && (ret == 0)) {
  15443. wc_MemZero_Add("TLS Encrypt plaintext", input, sz);
  15444. }
  15445. #endif
  15446. break;
  15447. }
  15448. default:
  15449. break;
  15450. }
  15451. /* Reset state */
  15452. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  15453. return ret;
  15454. }
  15455. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  15456. word16 sz)
  15457. {
  15458. int ret = 0;
  15459. (void)plain;
  15460. (void)input;
  15461. (void)sz;
  15462. switch (ssl->specs.bulk_cipher_algorithm)
  15463. {
  15464. #ifdef BUILD_ARC4
  15465. case wolfssl_rc4:
  15466. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  15467. break;
  15468. #endif
  15469. #ifdef BUILD_DES3
  15470. case wolfssl_triple_des:
  15471. #ifdef WOLFSSL_ASYNC_CRYPT
  15472. /* initialize event */
  15473. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  15474. WC_ASYNC_FLAG_CALL_AGAIN);
  15475. if (ret != 0)
  15476. break;
  15477. #endif
  15478. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  15479. #ifdef WOLFSSL_ASYNC_CRYPT
  15480. if (ret == WC_PENDING_E) {
  15481. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  15482. }
  15483. #endif
  15484. break;
  15485. #endif
  15486. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  15487. case wolfssl_aes:
  15488. #ifdef WOLFSSL_ASYNC_CRYPT
  15489. /* initialize event */
  15490. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  15491. WC_ASYNC_FLAG_CALL_AGAIN);
  15492. if (ret != 0)
  15493. break;
  15494. #endif
  15495. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  15496. #ifdef WOLFSSL_ASYNC_CRYPT
  15497. if (ret == WC_PENDING_E) {
  15498. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  15499. }
  15500. #endif
  15501. break;
  15502. #endif
  15503. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15504. case wolfssl_aes_gcm:
  15505. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  15506. {
  15507. wc_AesAuthDecryptFunc aes_auth_fn;
  15508. #ifdef WOLFSSL_ASYNC_CRYPT
  15509. /* initialize event */
  15510. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  15511. WC_ASYNC_FLAG_CALL_AGAIN);
  15512. if (ret != 0)
  15513. break;
  15514. #endif
  15515. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  15516. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  15517. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  15518. #elif defined(BUILD_AESGCM)
  15519. aes_auth_fn = wc_AesGcmDecrypt;
  15520. #else
  15521. aes_auth_fn = wc_AesCcmDecrypt;
  15522. #endif
  15523. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  15524. /* sequence number field is 64-bits */
  15525. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  15526. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  15527. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  15528. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  15529. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15530. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  15531. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15532. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  15533. XMEMCPY(ssl->decrypt.nonce,
  15534. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  15535. AESGCM_IMP_IV_SZ);
  15536. else
  15537. #endif
  15538. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  15539. AESGCM_IMP_IV_SZ);
  15540. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  15541. AESGCM_EXP_IV_SZ);
  15542. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  15543. plain + AESGCM_EXP_IV_SZ,
  15544. input + AESGCM_EXP_IV_SZ,
  15545. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15546. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  15547. input + sz - ssl->specs.aead_mac_size,
  15548. ssl->specs.aead_mac_size,
  15549. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  15550. #ifdef WOLFSSL_ASYNC_CRYPT
  15551. if (ret == WC_PENDING_E) {
  15552. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  15553. }
  15554. #endif
  15555. }
  15556. }
  15557. break;
  15558. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15559. #ifdef HAVE_CAMELLIA
  15560. case wolfssl_camellia:
  15561. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  15562. break;
  15563. #endif
  15564. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  15565. !defined(NO_CHAPOL_AEAD)
  15566. case wolfssl_chacha:
  15567. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  15568. break;
  15569. #endif
  15570. #ifdef HAVE_NULL_CIPHER
  15571. case wolfssl_cipher_null:
  15572. if (input != plain) {
  15573. XMEMMOVE(plain, input, sz);
  15574. }
  15575. break;
  15576. #endif
  15577. default:
  15578. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  15579. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  15580. ret = DECRYPT_ERROR;
  15581. }
  15582. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15583. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  15584. (ret == 0)) {
  15585. wc_MemZero_Add("Decrypted data", plain, sz);
  15586. }
  15587. #endif
  15588. return ret;
  15589. }
  15590. static int DecryptTls(WOLFSSL* ssl, byte* plain, const byte* input, word16 sz)
  15591. {
  15592. int ret = 0;
  15593. #ifdef WOLFSSL_ASYNC_CRYPT
  15594. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  15595. if (ret != WC_NOT_PENDING_E) {
  15596. /* check for still pending */
  15597. if (ret == WC_PENDING_E)
  15598. return ret;
  15599. ssl->error = 0; /* clear async */
  15600. /* let failures through so CIPHER_STATE_END logic is run */
  15601. }
  15602. else
  15603. #endif
  15604. {
  15605. /* Reset state */
  15606. ret = 0;
  15607. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  15608. }
  15609. switch (ssl->decrypt.state) {
  15610. case CIPHER_STATE_BEGIN:
  15611. {
  15612. if (ssl->decrypt.setup == 0) {
  15613. WOLFSSL_MSG("Decrypt ciphers not setup");
  15614. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  15615. return DECRYPT_ERROR;
  15616. }
  15617. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15618. /* make sure AES GCM/CCM memory is allocated */
  15619. /* free for these happens in FreeCiphers */
  15620. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15621. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  15622. /* make sure auth iv and auth are allocated */
  15623. if (ssl->decrypt.additional == NULL)
  15624. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  15625. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15626. if (ssl->decrypt.nonce == NULL) {
  15627. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  15628. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15629. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15630. if (ssl->decrypt.nonce != NULL) {
  15631. wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce,
  15632. AESGCM_NONCE_SZ);
  15633. }
  15634. #endif
  15635. }
  15636. if (ssl->decrypt.additional == NULL ||
  15637. ssl->decrypt.nonce == NULL) {
  15638. return MEMORY_E;
  15639. }
  15640. }
  15641. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15642. /* Advance state and proceed */
  15643. ssl->decrypt.state = CIPHER_STATE_DO;
  15644. }
  15645. FALL_THROUGH;
  15646. case CIPHER_STATE_DO:
  15647. {
  15648. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15649. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  15650. /* For epochs >1 the current cipher parameters are located in
  15651. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  15652. * parameters and for epoch 1 use ssl->keys */
  15653. if (ssl->keys.curEpoch ==
  15654. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  15655. if (ssl->decrypt.src != SCR) {
  15656. ssl->secure_renegotiation->cache_status =
  15657. SCR_CACHE_NEEDED;
  15658. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  15659. break;
  15660. }
  15661. }
  15662. else {
  15663. if (ssl->decrypt.src != KEYS) {
  15664. ssl->secure_renegotiation->cache_status =
  15665. SCR_CACHE_NULL;
  15666. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  15667. break;
  15668. }
  15669. }
  15670. }
  15671. #endif
  15672. ret = DecryptDo(ssl, plain, input, sz);
  15673. /* Advance state */
  15674. ssl->decrypt.state = CIPHER_STATE_END;
  15675. #ifdef WOLFSSL_ASYNC_CRYPT
  15676. /* If pending, leave and return below */
  15677. if (ret == WC_PENDING_E) {
  15678. return ret;
  15679. }
  15680. #endif
  15681. }
  15682. FALL_THROUGH;
  15683. case CIPHER_STATE_END:
  15684. {
  15685. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15686. /* make sure AES GCM/CCM nonce is cleared */
  15687. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15688. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  15689. if (ssl->decrypt.nonce)
  15690. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  15691. if (ret < 0) {
  15692. ret = VERIFY_MAC_ERROR;
  15693. WOLFSSL_ERROR_VERBOSE(ret);
  15694. }
  15695. }
  15696. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15697. break;
  15698. }
  15699. default:
  15700. break;
  15701. }
  15702. /* Reset state */
  15703. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  15704. return ret;
  15705. }
  15706. #endif /* !WOLFSSL_NO_TLS12 */
  15707. /* Check conditions for a cipher to have an explicit IV.
  15708. *
  15709. * ssl The SSL/TLS object.
  15710. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  15711. */
  15712. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  15713. {
  15714. #ifdef WOLFSSL_TLS13
  15715. if (ssl->options.tls1_3)
  15716. return 0;
  15717. #endif
  15718. return (ssl->specs.cipher_type == aead) &&
  15719. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  15720. }
  15721. /* check cipher text size for sanity */
  15722. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  15723. {
  15724. #ifdef HAVE_TRUNCATED_HMAC
  15725. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  15726. : ssl->specs.hash_size;
  15727. #else
  15728. word32 minLength = ssl->specs.hash_size; /* covers stream */
  15729. #endif
  15730. #ifndef WOLFSSL_AEAD_ONLY
  15731. if (ssl->specs.cipher_type == block) {
  15732. #ifdef HAVE_ENCRYPT_THEN_MAC
  15733. if (ssl->options.startedETMRead) {
  15734. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  15735. WOLFSSL_MSG("Block ciphertext not block size");
  15736. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  15737. return SANITY_CIPHER_E;
  15738. }
  15739. }
  15740. else
  15741. #endif
  15742. if (encryptSz % ssl->specs.block_size) {
  15743. WOLFSSL_MSG("Block ciphertext not block size");
  15744. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  15745. return SANITY_CIPHER_E;
  15746. }
  15747. minLength++; /* pad byte */
  15748. if (ssl->specs.block_size > minLength)
  15749. minLength = ssl->specs.block_size;
  15750. if (ssl->options.tls1_1)
  15751. minLength += ssl->specs.block_size; /* explicit IV */
  15752. }
  15753. else
  15754. #endif
  15755. if (ssl->specs.cipher_type == aead) {
  15756. minLength = ssl->specs.aead_mac_size; /* authTag size */
  15757. if (CipherHasExpIV(ssl))
  15758. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  15759. }
  15760. if (encryptSz < minLength) {
  15761. WOLFSSL_MSG("Ciphertext not minimum size");
  15762. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  15763. return SANITY_CIPHER_E;
  15764. }
  15765. return 0;
  15766. }
  15767. #ifndef WOLFSSL_AEAD_ONLY
  15768. #ifdef WOLSSL_OLD_TIMINGPADVERIFY
  15769. #define COMPRESS_LOWER 64
  15770. #define COMPRESS_UPPER 55
  15771. #define COMPRESS_CONSTANT 13
  15772. #ifndef NO_OLD_TLS
  15773. static WC_INLINE void Md5Rounds(int rounds, const byte* data, int sz)
  15774. {
  15775. wc_Md5 md5;
  15776. int i;
  15777. wc_InitMd5(&md5); /* no error check on purpose, dummy round */
  15778. for (i = 0; i < rounds; i++)
  15779. wc_Md5Update(&md5, data, sz);
  15780. wc_Md5Free(&md5); /* in case needed to release resources */
  15781. }
  15782. /* do a dummy sha round */
  15783. static WC_INLINE void ShaRounds(int rounds, const byte* data, int sz)
  15784. {
  15785. wc_Sha sha;
  15786. int i;
  15787. wc_InitSha(&sha); /* no error check on purpose, dummy round */
  15788. for (i = 0; i < rounds; i++)
  15789. wc_ShaUpdate(&sha, data, sz);
  15790. wc_ShaFree(&sha); /* in case needed to release resources */
  15791. }
  15792. #endif
  15793. #ifndef NO_SHA256
  15794. static WC_INLINE void Sha256Rounds(int rounds, const byte* data, int sz)
  15795. {
  15796. wc_Sha256 sha256;
  15797. int i;
  15798. wc_InitSha256(&sha256); /* no error check on purpose, dummy round */
  15799. for (i = 0; i < rounds; i++) {
  15800. wc_Sha256Update(&sha256, data, sz);
  15801. /* no error check on purpose, dummy round */
  15802. }
  15803. wc_Sha256Free(&sha256); /* in case needed to release resources */
  15804. }
  15805. #endif
  15806. #ifdef WOLFSSL_SHA384
  15807. static WC_INLINE void Sha384Rounds(int rounds, const byte* data, int sz)
  15808. {
  15809. wc_Sha384 sha384;
  15810. int i;
  15811. wc_InitSha384(&sha384); /* no error check on purpose, dummy round */
  15812. for (i = 0; i < rounds; i++) {
  15813. wc_Sha384Update(&sha384, data, sz);
  15814. /* no error check on purpose, dummy round */
  15815. }
  15816. wc_Sha384Free(&sha384); /* in case needed to release resources */
  15817. }
  15818. #endif
  15819. #ifdef WOLFSSL_SHA512
  15820. static WC_INLINE void Sha512Rounds(int rounds, const byte* data, int sz)
  15821. {
  15822. wc_Sha512 sha512;
  15823. int i;
  15824. wc_InitSha512(&sha512); /* no error check on purpose, dummy round */
  15825. for (i = 0; i < rounds; i++) {
  15826. wc_Sha512Update(&sha512, data, sz);
  15827. /* no error check on purpose, dummy round */
  15828. }
  15829. wc_Sha512Free(&sha512); /* in case needed to release resources */
  15830. }
  15831. #endif
  15832. #ifdef WOLFSSL_RIPEMD
  15833. static WC_INLINE void RmdRounds(int rounds, const byte* data, int sz)
  15834. {
  15835. RipeMd ripemd;
  15836. int i;
  15837. wc_InitRipeMd(&ripemd);
  15838. for (i = 0; i < rounds; i++)
  15839. wc_RipeMdUpdate(&ripemd, data, sz);
  15840. }
  15841. #endif
  15842. /* Do dummy rounds */
  15843. static WC_INLINE void DoRounds(int type, int rounds, const byte* data, int sz)
  15844. {
  15845. (void)rounds;
  15846. (void)data;
  15847. (void)sz;
  15848. switch (type) {
  15849. case no_mac :
  15850. break;
  15851. #ifndef NO_OLD_TLS
  15852. #ifndef NO_MD5
  15853. case md5_mac :
  15854. Md5Rounds(rounds, data, sz);
  15855. break;
  15856. #endif
  15857. #ifndef NO_SHA
  15858. case sha_mac :
  15859. ShaRounds(rounds, data, sz);
  15860. break;
  15861. #endif
  15862. #endif
  15863. #ifndef NO_SHA256
  15864. case sha256_mac :
  15865. Sha256Rounds(rounds, data, sz);
  15866. break;
  15867. #endif
  15868. #ifdef WOLFSSL_SHA384
  15869. case sha384_mac :
  15870. Sha384Rounds(rounds, data, sz);
  15871. break;
  15872. #endif
  15873. #ifdef WOLFSSL_SHA512
  15874. case sha512_mac :
  15875. Sha512Rounds(rounds, data, sz);
  15876. break;
  15877. #endif
  15878. #ifdef WOLFSSL_RIPEMD
  15879. case rmd_mac :
  15880. RmdRounds(rounds, data, sz);
  15881. break;
  15882. #endif
  15883. default:
  15884. WOLFSSL_MSG("Bad round type");
  15885. break;
  15886. }
  15887. }
  15888. /* do number of compression rounds on dummy data */
  15889. static WC_INLINE void CompressRounds(WOLFSSL* ssl, int rounds, const byte* dummy)
  15890. {
  15891. if (rounds)
  15892. DoRounds(ssl->specs.mac_algorithm, rounds, dummy, COMPRESS_LOWER);
  15893. }
  15894. /* check all length bytes for the pad value, return 0 on success */
  15895. static int PadCheck(const byte* a, byte pad, int length)
  15896. {
  15897. int i;
  15898. int compareSum = 0;
  15899. for (i = 0; i < length; i++) {
  15900. compareSum |= a[i] ^ pad;
  15901. }
  15902. return compareSum;
  15903. }
  15904. /* get compression extra rounds */
  15905. static WC_INLINE int GetRounds(int pLen, int padLen, int t)
  15906. {
  15907. int roundL1 = 1; /* round up flags */
  15908. int roundL2 = 1;
  15909. int L1 = COMPRESS_CONSTANT + pLen - t;
  15910. int L2 = COMPRESS_CONSTANT + pLen - padLen - 1 - t;
  15911. L1 -= COMPRESS_UPPER;
  15912. L2 -= COMPRESS_UPPER;
  15913. if ( (L1 % COMPRESS_LOWER) == 0)
  15914. roundL1 = 0;
  15915. if ( (L2 % COMPRESS_LOWER) == 0)
  15916. roundL2 = 0;
  15917. L1 /= COMPRESS_LOWER;
  15918. L2 /= COMPRESS_LOWER;
  15919. L1 += roundL1;
  15920. L2 += roundL2;
  15921. return L1 - L2;
  15922. }
  15923. /* timing resistant pad/verify check, return 0 on success */
  15924. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int t,
  15925. int pLen, int content)
  15926. {
  15927. byte verify[WC_MAX_DIGEST_SIZE];
  15928. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  15929. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  15930. int ret = 0;
  15931. (void)dmy;
  15932. if ( (t + padLen + 1) > pLen) {
  15933. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  15934. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE);
  15935. /* still compare */
  15936. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  15937. ConstantCompare(verify, input + pLen - t, t);
  15938. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  15939. return VERIFY_MAC_ERROR;
  15940. }
  15941. if (PadCheck(input + pLen - (padLen + 1), (byte)padLen, padLen + 1) != 0) {
  15942. WOLFSSL_MSG("PadCheck failed");
  15943. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  15944. /* still compare */
  15945. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  15946. ConstantCompare(verify, input + pLen - t, t);
  15947. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  15948. return VERIFY_MAC_ERROR;
  15949. }
  15950. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  15951. ret = ssl->hmac(ssl, verify, input, pLen - padLen - 1 - t, -1, content,
  15952. 1, PEER_ORDER);
  15953. CompressRounds(ssl, GetRounds(pLen, padLen, t), dummy);
  15954. if (ConstantCompare(verify, input + (pLen - padLen - 1 - t), t) != 0) {
  15955. WOLFSSL_MSG("Verify MAC compare failed");
  15956. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  15957. return VERIFY_MAC_ERROR;
  15958. }
  15959. /* treat any failure as verify MAC error */
  15960. if (ret != 0) {
  15961. ret = VERIFY_MAC_ERROR;
  15962. WOLFSSL_ERROR_VERBOSE(ret);
  15963. }
  15964. return ret;
  15965. }
  15966. #else
  15967. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  15968. /* check all length bytes for the pad value, return 0 on success */
  15969. static int PadCheck(const byte* a, byte pad, int length)
  15970. {
  15971. int i;
  15972. int compareSum = 0;
  15973. for (i = 0; i < length; i++) {
  15974. compareSum |= a[i] ^ pad;
  15975. }
  15976. return compareSum;
  15977. }
  15978. /* Mask the padding bytes with the expected values.
  15979. * Constant time implementation - does maximum pad size possible.
  15980. *
  15981. * data Message data.
  15982. * sz Size of the message including MAC and padding and padding length.
  15983. * macSz Size of the MAC.
  15984. * returns 0 on success, otherwise failure.
  15985. */
  15986. static byte MaskPadding(const byte* data, int sz, int macSz)
  15987. {
  15988. int i;
  15989. int checkSz = sz - 1;
  15990. byte paddingSz = data[sz - 1];
  15991. byte mask;
  15992. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  15993. if (checkSz > TLS_MAX_PAD_SZ)
  15994. checkSz = TLS_MAX_PAD_SZ;
  15995. for (i = 0; i < checkSz; i++) {
  15996. mask = ctMaskLTE(i, paddingSz);
  15997. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  15998. }
  15999. return good;
  16000. }
  16001. /* Mask the MAC in the message with the MAC calculated.
  16002. * Constant time implementation - starts looking for MAC where maximum padding
  16003. * size has it.
  16004. *
  16005. * data Message data.
  16006. * sz Size of the message including MAC and padding and padding length.
  16007. * macSz Size of the MAC data.
  16008. * expMac Expected MAC value.
  16009. * returns 0 on success, otherwise failure.
  16010. */
  16011. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  16012. {
  16013. int i, j;
  16014. unsigned char mac[WC_MAX_DIGEST_SIZE];
  16015. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  16016. int macEnd = sz - 1 - data[sz - 1];
  16017. int macStart = macEnd - macSz;
  16018. int r = 0;
  16019. unsigned char started, notEnded;
  16020. unsigned char good = 0;
  16021. scanStart &= ctMaskIntGTE(scanStart, 0);
  16022. macStart &= ctMaskIntGTE(macStart, 0);
  16023. /* Div on Intel has different speeds depending on value.
  16024. * Use a bitwise AND or mod a specific value (converted to mul). */
  16025. if ((macSz & (macSz - 1)) == 0)
  16026. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  16027. #ifndef NO_SHA
  16028. else if (macSz == WC_SHA_DIGEST_SIZE)
  16029. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  16030. #endif
  16031. #ifdef WOLFSSL_SHA384
  16032. else if (macSz == WC_SHA384_DIGEST_SIZE)
  16033. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  16034. #endif
  16035. XMEMSET(mac, 0, macSz);
  16036. for (i = scanStart; i < sz; i += macSz) {
  16037. for (j = 0; j < macSz && j + i < sz; j++) {
  16038. started = ctMaskGTE(i + j, macStart);
  16039. notEnded = ctMaskLT(i + j, macEnd);
  16040. mac[j] |= started & notEnded & data[i + j];
  16041. }
  16042. }
  16043. if ((macSz & (macSz - 1)) == 0) {
  16044. for (i = 0; i < macSz; i++)
  16045. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  16046. }
  16047. #ifndef NO_SHA
  16048. else if (macSz == WC_SHA_DIGEST_SIZE) {
  16049. for (i = 0; i < macSz; i++)
  16050. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  16051. }
  16052. #endif
  16053. #ifdef WOLFSSL_SHA384
  16054. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  16055. for (i = 0; i < macSz; i++)
  16056. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  16057. }
  16058. #endif
  16059. return good;
  16060. }
  16061. /* timing resistant pad/verify check, return 0 on success */
  16062. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  16063. int pLen, int content)
  16064. {
  16065. byte verify[WC_MAX_DIGEST_SIZE];
  16066. byte good;
  16067. int ret = 0;
  16068. good = MaskPadding(input, pLen, macSz);
  16069. /* 4th argument has potential to underflow, ssl->hmac function should
  16070. * either increment the size by (macSz + padLen + 1) before use or check on
  16071. * the size to make sure is valid. */
  16072. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  16073. content, 1, PEER_ORDER);
  16074. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  16075. /* Non-zero on failure. */
  16076. good = (byte)~(word32)good;
  16077. good &= good >> 4;
  16078. good &= good >> 2;
  16079. good &= good >> 1;
  16080. /* Make ret negative on masking failure. */
  16081. ret -= 1 - good;
  16082. /* Treat any failure as verify MAC error. */
  16083. if (ret != 0) {
  16084. ret = VERIFY_MAC_ERROR;
  16085. WOLFSSL_ERROR_VERBOSE(ret);
  16086. }
  16087. return ret;
  16088. }
  16089. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  16090. #endif /* WOLSSL_OLD_TIMINGPADVERIFY */
  16091. #endif /* WOLFSSL_AEAD_ONLY */
  16092. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx, int sniff)
  16093. {
  16094. word32 msgSz = WOLFSSL_IS_QUIC(ssl)? ssl->curSize : ssl->keys.encryptSz;
  16095. word32 idx = *inOutIdx;
  16096. int dataSz;
  16097. int ivExtra = 0;
  16098. byte* rawData = input + idx; /* keep current for hmac */
  16099. #ifdef HAVE_LIBZ
  16100. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  16101. #endif
  16102. #ifdef WOLFSSL_EARLY_DATA
  16103. if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
  16104. int process = 0;
  16105. if (ssl->options.side == WOLFSSL_SERVER_END) {
  16106. if ((ssl->earlyData != no_early_data) &&
  16107. (ssl->options.clientState == CLIENT_HELLO_COMPLETE)) {
  16108. process = 1;
  16109. }
  16110. if (!process) {
  16111. WOLFSSL_MSG("Ignoring EarlyData!");
  16112. *inOutIdx += ssl->curSize;
  16113. if (*inOutIdx > ssl->buffers.inputBuffer.length)
  16114. return BUFFER_E;
  16115. return 0;
  16116. }
  16117. }
  16118. if (!process) {
  16119. WOLFSSL_MSG("Received App data before a handshake completed");
  16120. if (sniff == NO_SNIFF) {
  16121. SendAlert(ssl, alert_fatal, unexpected_message);
  16122. }
  16123. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  16124. return OUT_OF_ORDER_E;
  16125. }
  16126. }
  16127. else
  16128. #endif
  16129. if (ssl->options.handShakeDone == 0) {
  16130. WOLFSSL_MSG("Received App data before a handshake completed");
  16131. if (sniff == NO_SNIFF) {
  16132. SendAlert(ssl, alert_fatal, unexpected_message);
  16133. }
  16134. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  16135. return OUT_OF_ORDER_E;
  16136. }
  16137. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  16138. /* Check if we want to invalidate old epochs. If
  16139. * ssl->dtls13InvalidateBefore is set then we want to mark all old
  16140. * epochs as encrypt only. This is done when we detect too many failed
  16141. * decryptions. We do this here to confirm that the peer has updated its
  16142. * keys and we can stop using the old keys. */
  16143. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  16144. if (!w64IsZero(ssl->dtls13InvalidateBefore) &&
  16145. w64Equal(ssl->keys.curEpoch64, ssl->dtls13InvalidateBefore)) {
  16146. Dtls13SetOlderEpochSide(ssl, ssl->dtls13InvalidateBefore,
  16147. ENCRYPT_SIDE_ONLY);
  16148. w64Zero(&ssl->dtls13InvalidateBefore);
  16149. }
  16150. }
  16151. #endif
  16152. #ifndef WOLFSSL_AEAD_ONLY
  16153. if (ssl->specs.cipher_type == block) {
  16154. if (ssl->options.tls1_1)
  16155. ivExtra = ssl->specs.block_size;
  16156. }
  16157. else
  16158. #endif
  16159. if (ssl->specs.cipher_type == aead) {
  16160. if (CipherHasExpIV(ssl))
  16161. ivExtra = AESGCM_EXP_IV_SZ;
  16162. }
  16163. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  16164. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16165. if (ssl->options.startedETMRead)
  16166. dataSz -= MacSize(ssl);
  16167. #endif
  16168. if (dataSz < 0) {
  16169. WOLFSSL_MSG("App data buffer error, malicious input?");
  16170. if (sniff == NO_SNIFF) {
  16171. SendAlert(ssl, alert_fatal, unexpected_message);
  16172. }
  16173. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  16174. return BUFFER_ERROR;
  16175. }
  16176. #ifdef WOLFSSL_EARLY_DATA
  16177. if (ssl->earlyData > early_data_ext) {
  16178. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  16179. if (sniff == NO_SNIFF) {
  16180. SendAlert(ssl, alert_fatal, unexpected_message);
  16181. }
  16182. return WOLFSSL_FATAL_ERROR;
  16183. }
  16184. ssl->earlyDataSz += dataSz;
  16185. }
  16186. #endif
  16187. /* read data */
  16188. if (dataSz) {
  16189. int rawSz = dataSz; /* keep raw size for idx adjustment */
  16190. #ifdef HAVE_LIBZ
  16191. if (ssl->options.usingCompression) {
  16192. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  16193. if (dataSz < 0) return dataSz;
  16194. }
  16195. #endif
  16196. idx += rawSz;
  16197. ssl->buffers.clearOutputBuffer.buffer = rawData;
  16198. ssl->buffers.clearOutputBuffer.length = dataSz;
  16199. }
  16200. idx += ssl->keys.padSz;
  16201. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16202. if (ssl->options.startedETMRead)
  16203. idx += MacSize(ssl);
  16204. #endif
  16205. #ifdef HAVE_LIBZ
  16206. /* decompress could be bigger, overwrite after verify */
  16207. if (ssl->options.usingCompression)
  16208. XMEMMOVE(rawData, decomp, dataSz);
  16209. #endif
  16210. *inOutIdx = idx;
  16211. #ifdef HAVE_SECURE_RENEGOTIATION
  16212. if (IsSCR(ssl)) {
  16213. /* Reset the processReply state since
  16214. * we finished processing this message. */
  16215. ssl->options.processReply = doProcessInit;
  16216. /* If we are in a secure renegotiation then APP DATA is treated
  16217. * differently */
  16218. return APP_DATA_READY;
  16219. }
  16220. #endif
  16221. return 0;
  16222. }
  16223. const char* AlertTypeToString(int type)
  16224. {
  16225. switch (type) {
  16226. case close_notify:
  16227. {
  16228. static const char close_notify_str[] =
  16229. "close_notify";
  16230. return close_notify_str;
  16231. }
  16232. case unexpected_message:
  16233. {
  16234. static const char unexpected_message_str[] =
  16235. "unexpected_message";
  16236. return unexpected_message_str;
  16237. }
  16238. case bad_record_mac:
  16239. {
  16240. static const char bad_record_mac_str[] =
  16241. "bad_record_mac";
  16242. return bad_record_mac_str;
  16243. }
  16244. case record_overflow:
  16245. {
  16246. static const char record_overflow_str[] =
  16247. "record_overflow";
  16248. return record_overflow_str;
  16249. }
  16250. case decompression_failure:
  16251. {
  16252. static const char decompression_failure_str[] =
  16253. "decompression_failure";
  16254. return decompression_failure_str;
  16255. }
  16256. case handshake_failure:
  16257. {
  16258. static const char handshake_failure_str[] =
  16259. "handshake_failure";
  16260. return handshake_failure_str;
  16261. }
  16262. case no_certificate:
  16263. {
  16264. static const char no_certificate_str[] =
  16265. "no_certificate";
  16266. return no_certificate_str;
  16267. }
  16268. case bad_certificate:
  16269. {
  16270. static const char bad_certificate_str[] =
  16271. "bad_certificate";
  16272. return bad_certificate_str;
  16273. }
  16274. case unsupported_certificate:
  16275. {
  16276. static const char unsupported_certificate_str[] =
  16277. "unsupported_certificate";
  16278. return unsupported_certificate_str;
  16279. }
  16280. case certificate_revoked:
  16281. {
  16282. static const char certificate_revoked_str[] =
  16283. "certificate_revoked";
  16284. return certificate_revoked_str;
  16285. }
  16286. case certificate_expired:
  16287. {
  16288. static const char certificate_expired_str[] =
  16289. "certificate_expired";
  16290. return certificate_expired_str;
  16291. }
  16292. case certificate_unknown:
  16293. {
  16294. static const char certificate_unknown_str[] =
  16295. "certificate_unknown";
  16296. return certificate_unknown_str;
  16297. }
  16298. case illegal_parameter:
  16299. {
  16300. static const char illegal_parameter_str[] =
  16301. "illegal_parameter";
  16302. return illegal_parameter_str;
  16303. }
  16304. case unknown_ca:
  16305. {
  16306. static const char unknown_ca_str[] =
  16307. "unknown_ca";
  16308. return unknown_ca_str;
  16309. }
  16310. case access_denied:
  16311. {
  16312. static const char access_denied_str[] =
  16313. "access_denied";
  16314. return access_denied_str;
  16315. }
  16316. case decode_error:
  16317. {
  16318. static const char decode_error_str[] =
  16319. "decode_error";
  16320. return decode_error_str;
  16321. }
  16322. case decrypt_error:
  16323. {
  16324. static const char decrypt_error_str[] =
  16325. "decrypt_error";
  16326. return decrypt_error_str;
  16327. }
  16328. case wolfssl_alert_protocol_version:
  16329. {
  16330. static const char protocol_version_str[] =
  16331. "protocol_version";
  16332. return protocol_version_str;
  16333. }
  16334. case insufficient_security:
  16335. {
  16336. static const char insufficient_security_str[] =
  16337. "insufficient_security";
  16338. return insufficient_security_str;
  16339. }
  16340. case internal_error:
  16341. {
  16342. static const char internal_error_str[] =
  16343. "internal_error";
  16344. return internal_error_str;
  16345. }
  16346. case user_canceled:
  16347. {
  16348. static const char user_canceled_str[] =
  16349. "user_canceled";
  16350. return user_canceled_str;
  16351. }
  16352. case no_renegotiation:
  16353. {
  16354. static const char no_renegotiation_str[] =
  16355. "no_renegotiation";
  16356. return no_renegotiation_str;
  16357. }
  16358. case unrecognized_name:
  16359. {
  16360. static const char unrecognized_name_str[] =
  16361. "unrecognized_name";
  16362. return unrecognized_name_str;
  16363. }
  16364. case bad_certificate_status_response:
  16365. {
  16366. static const char bad_certificate_status_response_str[] =
  16367. "bad_certificate_status_response";
  16368. return bad_certificate_status_response_str;
  16369. }
  16370. case no_application_protocol:
  16371. {
  16372. static const char no_application_protocol_str[] =
  16373. "no_application_protocol";
  16374. return no_application_protocol_str;
  16375. }
  16376. default:
  16377. WOLFSSL_MSG("Unknown Alert");
  16378. return NULL;
  16379. }
  16380. }
  16381. static void LogAlert(int type)
  16382. {
  16383. #ifdef DEBUG_WOLFSSL
  16384. const char* typeStr;
  16385. char buff[60];
  16386. typeStr = AlertTypeToString(type);
  16387. if (typeStr != NULL) {
  16388. XSNPRINTF(buff, sizeof(buff), "Alert type: %s", typeStr);
  16389. WOLFSSL_MSG(buff);
  16390. }
  16391. #else
  16392. (void)type;
  16393. #endif /* DEBUG_WOLFSSL */
  16394. }
  16395. /* process alert, return level */
  16396. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
  16397. {
  16398. byte level;
  16399. byte code;
  16400. word32 dataSz = (word32)ssl->curSize;
  16401. int ivExtra = 0;
  16402. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16403. if (ssl->hsInfoOn)
  16404. AddPacketName(ssl, "Alert");
  16405. if (ssl->toInfoOn) {
  16406. /* add record header back on to info + alert bytes level/code */
  16407. int ret = AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx,
  16408. ALERT_SIZE, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
  16409. if (ret != 0)
  16410. return ret;
  16411. #ifdef WOLFSSL_CALLBACKS
  16412. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  16413. #endif
  16414. }
  16415. #endif
  16416. if (IsEncryptionOn(ssl, 0)) {
  16417. #ifndef WOLFSSL_AEAD_ONLY
  16418. if (ssl->specs.cipher_type == block) {
  16419. if (ssl->options.tls1_1)
  16420. ivExtra = ssl->specs.block_size;
  16421. }
  16422. else
  16423. #endif
  16424. if (ssl->specs.cipher_type == aead) {
  16425. if (CipherHasExpIV(ssl))
  16426. ivExtra = AESGCM_EXP_IV_SZ;
  16427. }
  16428. dataSz -= ivExtra;
  16429. dataSz -= ssl->keys.padSz;
  16430. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16431. if (ssl->options.startedETMRead)
  16432. dataSz -= MacSize(ssl);
  16433. #endif
  16434. }
  16435. /* make sure can read the message */
  16436. if (dataSz != ALERT_SIZE) {
  16437. #ifdef WOLFSSL_EXTRA_ALERTS
  16438. SendAlert(ssl, alert_fatal, unexpected_message);
  16439. #endif
  16440. return BUFFER_E;
  16441. }
  16442. level = input[(*inOutIdx)++];
  16443. code = input[(*inOutIdx)++];
  16444. ssl->alert_history.last_rx.code = code;
  16445. ssl->alert_history.last_rx.level = level;
  16446. *type = code;
  16447. if (level == alert_fatal) {
  16448. ssl->options.isClosed = 1; /* Don't send close_notify */
  16449. }
  16450. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  16451. WOLFSSL_MSG("Alert count exceeded");
  16452. #ifdef WOLFSSL_EXTRA_ALERTS
  16453. if (level != alert_warning || code != close_notify)
  16454. SendAlert(ssl, alert_fatal, unexpected_message);
  16455. #endif
  16456. WOLFSSL_ERROR_VERBOSE(ALERT_COUNT_E);
  16457. return ALERT_COUNT_E;
  16458. }
  16459. LogAlert(*type);
  16460. if (*type == close_notify) {
  16461. ssl->options.closeNotify = 1;
  16462. }
  16463. else {
  16464. /*
  16465. * A close_notify alert doesn't mean there's been an error, so we only
  16466. * add other types of alerts to the error queue
  16467. */
  16468. WOLFSSL_ERROR(*type);
  16469. }
  16470. if (IsEncryptionOn(ssl, 0)) {
  16471. *inOutIdx += ssl->keys.padSz;
  16472. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16473. if (ssl->options.startedETMRead)
  16474. *inOutIdx += MacSize(ssl);
  16475. #endif
  16476. }
  16477. return level;
  16478. }
  16479. static int GetInputData(WOLFSSL *ssl, word32 size)
  16480. {
  16481. int in;
  16482. int inSz;
  16483. int maxLength;
  16484. int usedLength;
  16485. int dtlsExtra = 0;
  16486. /* check max input length */
  16487. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  16488. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  16489. inSz = (int)(size - usedLength); /* from last partial read */
  16490. #ifdef WOLFSSL_DTLS
  16491. if (ssl->options.dtls) {
  16492. if (size < ssl->dtls_expected_rx)
  16493. dtlsExtra = (int)(ssl->dtls_expected_rx - size);
  16494. inSz = ssl->dtls_expected_rx;
  16495. }
  16496. #endif
  16497. /* check that no lengths or size values are negative */
  16498. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  16499. return BUFFER_ERROR;
  16500. }
  16501. if (inSz > maxLength) {
  16502. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  16503. return MEMORY_E;
  16504. }
  16505. /* Put buffer data at start if not there */
  16506. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  16507. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  16508. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  16509. usedLength);
  16510. /* remove processed data */
  16511. ssl->buffers.inputBuffer.idx = 0;
  16512. ssl->buffers.inputBuffer.length = usedLength;
  16513. /* read data from network */
  16514. do {
  16515. in = wolfSSLReceive(ssl,
  16516. ssl->buffers.inputBuffer.buffer +
  16517. ssl->buffers.inputBuffer.length,
  16518. inSz);
  16519. if (in == WANT_READ)
  16520. return WANT_READ;
  16521. if (in < 0) {
  16522. WOLFSSL_ERROR_VERBOSE(SOCKET_ERROR_E);
  16523. return SOCKET_ERROR_E;
  16524. }
  16525. if (in > inSz) {
  16526. WOLFSSL_ERROR_VERBOSE(RECV_OVERFLOW_E);
  16527. return RECV_OVERFLOW_E;
  16528. }
  16529. ssl->buffers.inputBuffer.length += in;
  16530. inSz -= in;
  16531. } while (ssl->buffers.inputBuffer.length < size);
  16532. #ifdef WOLFSSL_DEBUG_TLS
  16533. if (ssl->buffers.inputBuffer.idx == 0) {
  16534. WOLFSSL_MSG("Data received");
  16535. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  16536. ssl->buffers.inputBuffer.length);
  16537. }
  16538. #endif
  16539. return 0;
  16540. }
  16541. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16542. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  16543. int content)
  16544. {
  16545. int ret;
  16546. #ifdef HAVE_TRUNCATED_HMAC
  16547. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  16548. : ssl->specs.hash_size;
  16549. #else
  16550. word32 digestSz = ssl->specs.hash_size;
  16551. #endif
  16552. byte verify[WC_MAX_DIGEST_SIZE];
  16553. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  16554. if (msgSz < digestSz) {
  16555. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16556. return VERIFY_MAC_ERROR;
  16557. }
  16558. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
  16559. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  16560. if (ret != 0) {
  16561. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16562. return VERIFY_MAC_ERROR;
  16563. }
  16564. return 0;
  16565. }
  16566. #endif
  16567. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  16568. int content, word32* padSz)
  16569. {
  16570. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  16571. int ivExtra = 0;
  16572. int ret;
  16573. word32 pad = 0;
  16574. word32 padByte = 0;
  16575. #ifdef HAVE_TRUNCATED_HMAC
  16576. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  16577. : ssl->specs.hash_size;
  16578. #else
  16579. word32 digestSz = ssl->specs.hash_size;
  16580. #endif
  16581. byte verify[WC_MAX_DIGEST_SIZE];
  16582. if (ssl->specs.cipher_type == block) {
  16583. if (ssl->options.tls1_1)
  16584. ivExtra = ssl->specs.block_size;
  16585. pad = *(input + msgSz - ivExtra - 1);
  16586. padByte = 1;
  16587. if (ssl->options.tls) {
  16588. #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
  16589. ret = PROTOCOLCB_UNAVAILABLE;
  16590. if(ssl->ctx->VerifyMacCb) {
  16591. void* ctx = wolfSSL_GetVerifyMacCtx(ssl);
  16592. ret = ssl->ctx->VerifyMacCb(ssl, input,
  16593. (msgSz - ivExtra) - digestSz - pad - 1,
  16594. digestSz, content, ctx);
  16595. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  16596. return ret;
  16597. }
  16598. }
  16599. if (!ssl->ctx->VerifyMacCb || ret == PROTOCOLCB_UNAVAILABLE)
  16600. #endif
  16601. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  16602. content);
  16603. if (ret != 0)
  16604. return ret;
  16605. }
  16606. else { /* sslv3, some implementations have bad padding, but don't
  16607. * allow bad read */
  16608. int badPadLen = 0;
  16609. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE];
  16610. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  16611. XMEMSET(dmy, 0, sizeof(dmy));
  16612. if (pad > (msgSz - digestSz - 1)) {
  16613. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  16614. pad = 0; /* no bad read */
  16615. badPadLen = 1;
  16616. }
  16617. (void)PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  16618. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
  16619. pad, content, 1, PEER_ORDER);
  16620. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  16621. digestSz) != 0) {
  16622. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16623. return VERIFY_MAC_ERROR;
  16624. }
  16625. if (ret != 0 || badPadLen) {
  16626. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16627. return VERIFY_MAC_ERROR;
  16628. }
  16629. }
  16630. }
  16631. else if (ssl->specs.cipher_type == stream) {
  16632. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
  16633. PEER_ORDER);
  16634. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0) {
  16635. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16636. return VERIFY_MAC_ERROR;
  16637. }
  16638. if (ret != 0) {
  16639. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16640. return VERIFY_MAC_ERROR;
  16641. }
  16642. }
  16643. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  16644. if (ssl->specs.cipher_type == aead) {
  16645. *padSz = ssl->specs.aead_mac_size;
  16646. }
  16647. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  16648. else {
  16649. *padSz = digestSz + pad + padByte;
  16650. }
  16651. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  16652. (void)input;
  16653. (void)msgSz;
  16654. (void)content;
  16655. return 0;
  16656. }
  16657. #ifdef WOLFSSL_DTLS
  16658. static int HandleDTLSDecryptFailed(WOLFSSL* ssl)
  16659. {
  16660. int ret = 0;
  16661. #ifdef WOLFSSL_DTLS_DROP_STATS
  16662. ssl->macDropCount++;
  16663. #endif
  16664. #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  16665. /* Handle AEAD limits specified by the RFC for failed decryption */
  16666. if (IsAtLeastTLSv1_3(ssl->version))
  16667. ret = Dtls13CheckAEADFailLimit(ssl);
  16668. #endif
  16669. (void)ssl;
  16670. WOLFSSL_MSG("DTLS: Ignoring failed decryption");
  16671. return ret;
  16672. }
  16673. static int DtlsShouldDrop(WOLFSSL* ssl, int retcode)
  16674. {
  16675. if (ssl->options.handShakeDone && !IsEncryptionOn(ssl, 0)) {
  16676. WOLFSSL_MSG("Silently dropping plaintext DTLS message "
  16677. "on established connection.");
  16678. return 1;
  16679. }
  16680. if ((ssl->options.handShakeDone && retcode != 0)
  16681. || retcode == SEQUENCE_ERROR || retcode == DTLS_CID_ERROR) {
  16682. WOLFSSL_MSG_EX("Silently dropping DTLS message: %d", retcode);
  16683. return 1;
  16684. }
  16685. #ifdef WOLFSSL_DTLS13
  16686. if (IsAtLeastTLSv1_3(ssl->version) && !w64IsZero(ssl->dtls13Epoch)
  16687. && w64IsZero(ssl->keys.curEpoch64) && ssl->curRL.type != ack) {
  16688. WOLFSSL_MSG("Silently dropping plaintext DTLS message "
  16689. "during encrypted handshake.");
  16690. return 1;
  16691. }
  16692. #endif /* WOLFSSL_DTLS13 */
  16693. #ifndef NO_WOLFSSL_SERVER
  16694. if (ssl->options.side == WOLFSSL_SERVER_END
  16695. && ssl->curRL.type != handshake) {
  16696. int beforeCookieVerified = 0;
  16697. if (!IsAtLeastTLSv1_3(ssl->version)) {
  16698. beforeCookieVerified =
  16699. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE;
  16700. }
  16701. #ifdef WOLFSSL_DTLS13
  16702. else {
  16703. beforeCookieVerified =
  16704. ssl->options.acceptState < TLS13_ACCEPT_SECOND_REPLY_DONE;
  16705. }
  16706. #endif /* WOLFSSL_DTLS13 */
  16707. if (beforeCookieVerified) {
  16708. WOLFSSL_MSG("Drop non-handshake record before handshake");
  16709. return 1;
  16710. }
  16711. }
  16712. #endif /* NO_WOLFSSL_SERVER */
  16713. return 0;
  16714. }
  16715. #endif /* WOLFSSL_DTLS */
  16716. int ProcessReply(WOLFSSL* ssl)
  16717. {
  16718. return ProcessReplyEx(ssl, 0);
  16719. }
  16720. /* Process input requests. Return 0 is done, 1 is call again to complete, and
  16721. negative number is error. If allowSocketErr is set, SOCKET_ERROR_E in
  16722. ssl->error will be whitelisted. This is useful when the connection has been
  16723. closed and the endpoint wants to check for an alert sent by the other end. */
  16724. int ProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
  16725. {
  16726. int ret = 0, type = internal_error, readSz;
  16727. int atomicUser = 0;
  16728. word32 startIdx = 0;
  16729. #if defined(WOLFSSL_DTLS)
  16730. int used;
  16731. #endif
  16732. #ifdef ATOMIC_USER
  16733. if (ssl->ctx->DecryptVerifyCb)
  16734. atomicUser = 1;
  16735. #endif
  16736. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  16737. #ifdef HAVE_SECURE_RENEGOTIATION
  16738. && ssl->error != APP_DATA_READY
  16739. #endif
  16740. #ifdef WOLFSSL_ASYNC_CRYPT
  16741. && ssl->error != WC_PENDING_E
  16742. #endif
  16743. #ifdef WOLFSSL_NONBLOCK_OCSP
  16744. && ssl->error != OCSP_WANT_READ
  16745. #endif
  16746. && (allowSocketErr != 1 || ssl->error != SOCKET_ERROR_E)
  16747. ) {
  16748. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  16749. return ssl->error;
  16750. }
  16751. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
  16752. /* process any pending DTLS messages - this flow can happen with async */
  16753. if (ssl->dtls_rx_msg_list != NULL) {
  16754. word32 pendingMsg = ssl->dtls_rx_msg_list_sz;
  16755. if(IsAtLeastTLSv1_3(ssl->version)) {
  16756. #ifdef WOLFSSL_DTLS13
  16757. ret = Dtls13ProcessBufferedMessages(ssl);
  16758. #else
  16759. ret = NOT_COMPILED_IN;
  16760. #endif /* WOLFSSL_DTLS13 */
  16761. }
  16762. else {
  16763. ret = DtlsMsgDrain(ssl);
  16764. }
  16765. if (ret != 0) {
  16766. WOLFSSL_ERROR(ret);
  16767. return ret;
  16768. }
  16769. /* we processed some messages, return so connect/accept can make
  16770. progress */
  16771. if (ssl->dtls_rx_msg_list_sz != pendingMsg)
  16772. return ret;
  16773. }
  16774. #endif
  16775. ret = RetrySendAlert(ssl);
  16776. if (ret != 0)
  16777. return ret;
  16778. for (;;) {
  16779. switch (ssl->options.processReply) {
  16780. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  16781. * old client hello */
  16782. case doProcessInit:
  16783. readSz = RECORD_HEADER_SZ;
  16784. #ifdef WOLFSSL_DTLS
  16785. if (ssl->options.dtls) {
  16786. readSz = DTLS_RECORD_HEADER_SZ;
  16787. #ifdef WOLFSSL_DTLS13
  16788. if (ssl->options.tls1_3) {
  16789. /* dtls1.3 unified header can be as little as 2 bytes */
  16790. readSz = DTLS_UNIFIED_HEADER_MIN_SZ;
  16791. }
  16792. #endif /* WOLFSSL_DTLS13 */
  16793. }
  16794. #endif
  16795. /* get header or return error */
  16796. if (!ssl->options.dtls) {
  16797. if ((ret = GetInputData(ssl, readSz)) < 0)
  16798. return ret;
  16799. } else {
  16800. #ifdef WOLFSSL_DTLS
  16801. /* read ahead may already have header */
  16802. used = ssl->buffers.inputBuffer.length -
  16803. ssl->buffers.inputBuffer.idx;
  16804. if (used < readSz) {
  16805. if ((ret = GetInputData(ssl, readSz)) < 0)
  16806. return ret;
  16807. }
  16808. #endif
  16809. }
  16810. #ifdef OLD_HELLO_ALLOWED
  16811. /* see if sending SSLv2 client hello */
  16812. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  16813. ssl->options.clientState == NULL_STATE &&
  16814. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  16815. != handshake) {
  16816. byte b0, b1;
  16817. ssl->options.processReply = runProcessOldClientHello;
  16818. /* sanity checks before getting size at front */
  16819. if (ssl->buffers.inputBuffer.buffer[
  16820. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  16821. WOLFSSL_MSG("Not a valid old client hello");
  16822. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  16823. return PARSE_ERROR;
  16824. }
  16825. if (ssl->buffers.inputBuffer.buffer[
  16826. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  16827. ssl->buffers.inputBuffer.buffer[
  16828. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  16829. WOLFSSL_MSG("Not a valid version in old client hello");
  16830. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  16831. return PARSE_ERROR;
  16832. }
  16833. /* how many bytes need ProcessOldClientHello */
  16834. b0 =
  16835. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  16836. b1 =
  16837. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  16838. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  16839. }
  16840. else {
  16841. ssl->options.processReply = getRecordLayerHeader;
  16842. continue;
  16843. }
  16844. FALL_THROUGH;
  16845. /* in the WOLFSSL_SERVER case, run the old client hello */
  16846. case runProcessOldClientHello:
  16847. /* get sz bytes or return error */
  16848. if (!ssl->options.dtls) {
  16849. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  16850. return ret;
  16851. } else {
  16852. #ifdef WOLFSSL_DTLS
  16853. /* read ahead may already have */
  16854. used = ssl->buffers.inputBuffer.length -
  16855. ssl->buffers.inputBuffer.idx;
  16856. if (used < ssl->curSize)
  16857. if ((ret = GetInputData(ssl, ssl->curSize - used)) < 0)
  16858. return ret;
  16859. #endif /* WOLFSSL_DTLS */
  16860. }
  16861. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  16862. &ssl->buffers.inputBuffer.idx,
  16863. ssl->buffers.inputBuffer.length -
  16864. ssl->buffers.inputBuffer.idx,
  16865. ssl->curSize);
  16866. if (ret < 0)
  16867. return ret;
  16868. else if (ssl->buffers.inputBuffer.idx ==
  16869. ssl->buffers.inputBuffer.length) {
  16870. ssl->options.processReply = doProcessInit;
  16871. return 0;
  16872. }
  16873. #endif /* OLD_HELLO_ALLOWED */
  16874. FALL_THROUGH;
  16875. /* get the record layer header */
  16876. case getRecordLayerHeader:
  16877. /* DTLSv1.3 record numbers in the header are encrypted, and AAD
  16878. * uses the unecrypted form. Because of this we need to modify the
  16879. * header, decrypting the numbers inside
  16880. * DtlsParseUnifiedRecordLayer(). This violates the const attribute
  16881. * of the buffer parameter of GetRecordHeader() used here. */
  16882. ret = GetRecordHeader(ssl, &ssl->buffers.inputBuffer.idx,
  16883. &ssl->curRL, &ssl->curSize);
  16884. #ifdef WOLFSSL_DTLS
  16885. if (ssl->options.dtls && DtlsShouldDrop(ssl, ret)) {
  16886. ssl->options.processReply = doProcessInit;
  16887. ssl->buffers.inputBuffer.length = 0;
  16888. ssl->buffers.inputBuffer.idx = 0;
  16889. #ifdef WOLFSSL_DTLS_DROP_STATS
  16890. ssl->replayDropCount++;
  16891. #endif /* WOLFSSL_DTLS_DROP_STATS */
  16892. #ifdef WOLFSSL_DTLS13
  16893. /* return to send ACKS and shortcut rtx timer */
  16894. if (IsAtLeastTLSv1_3(ssl->version)
  16895. && ssl->dtls13Rtx.sendAcks)
  16896. return 0;
  16897. #endif /* WOLFSSL_DTLS13 */
  16898. continue;
  16899. }
  16900. #endif
  16901. if (ret != 0)
  16902. return ret;
  16903. #ifdef WOLFSSL_TLS13
  16904. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  16905. ssl->curRL.type != application_data &&
  16906. ssl->curRL.type != change_cipher_spec) {
  16907. SendAlert(ssl, alert_fatal, unexpected_message);
  16908. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  16909. return PARSE_ERROR;
  16910. }
  16911. #endif
  16912. ssl->options.processReply = getData;
  16913. FALL_THROUGH;
  16914. /* retrieve record layer data */
  16915. case getData:
  16916. /* get sz bytes or return error */
  16917. if (!ssl->options.dtls) {
  16918. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  16919. #ifdef WOLFSSL_EXTRA_ALERTS
  16920. if (ret != WANT_READ)
  16921. SendAlert(ssl, alert_fatal, bad_record_mac);
  16922. #endif
  16923. return ret;
  16924. }
  16925. }
  16926. else {
  16927. #ifdef WOLFSSL_DTLS
  16928. /* read ahead may already have */
  16929. used = ssl->buffers.inputBuffer.length -
  16930. ssl->buffers.inputBuffer.idx;
  16931. if (used < ssl->curSize)
  16932. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  16933. return ret;
  16934. #endif
  16935. }
  16936. if (IsEncryptionOn(ssl, 0)) {
  16937. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  16938. int tooLong = 0;
  16939. #endif
  16940. #ifdef WOLFSSL_TLS13
  16941. if (IsAtLeastTLSv1_3(ssl->version)) {
  16942. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  16943. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  16944. MAX_TLS13_PLAIN_SZ;
  16945. }
  16946. #endif
  16947. #ifdef WOLFSSL_EXTRA_ALERTS
  16948. if (!IsAtLeastTLSv1_3(ssl->version))
  16949. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  16950. #endif
  16951. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  16952. if (tooLong) {
  16953. WOLFSSL_MSG("Encrypted data too long");
  16954. SendAlert(ssl, alert_fatal, record_overflow);
  16955. return BUFFER_ERROR;
  16956. }
  16957. #endif
  16958. }
  16959. ssl->keys.padSz = 0;
  16960. ssl->options.processReply = verifyEncryptedMessage;
  16961. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  16962. FALL_THROUGH;
  16963. /* verify digest of encrypted message */
  16964. case verifyEncryptedMessage:
  16965. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16966. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  16967. !atomicUser && ssl->options.startedETMRead) {
  16968. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  16969. ssl->buffers.inputBuffer.idx,
  16970. ssl->curSize, ssl->curRL.type);
  16971. #ifdef WOLFSSL_ASYNC_CRYPT
  16972. if (ret == WC_PENDING_E)
  16973. return ret;
  16974. #endif
  16975. if (ret < 0) {
  16976. WOLFSSL_MSG("VerifyMacEnc failed");
  16977. #ifdef WOLFSSL_DTLS
  16978. /* If in DTLS mode, if the decrypt fails for any
  16979. * reason, pretend the datagram never happened. */
  16980. if (ssl->options.dtls) {
  16981. ssl->options.processReply = doProcessInit;
  16982. ssl->buffers.inputBuffer.idx =
  16983. ssl->buffers.inputBuffer.length;
  16984. return HandleDTLSDecryptFailed(ssl);
  16985. }
  16986. #endif /* WOLFSSL_DTLS */
  16987. #ifdef WOLFSSL_EXTRA_ALERTS
  16988. if (!ssl->options.dtls)
  16989. SendAlert(ssl, alert_fatal, bad_record_mac);
  16990. #endif
  16991. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  16992. return DECRYPT_ERROR;
  16993. }
  16994. ssl->keys.encryptSz = ssl->curSize;
  16995. }
  16996. #endif
  16997. ssl->options.processReply = decryptMessage;
  16998. FALL_THROUGH;
  16999. /* decrypt message */
  17000. case decryptMessage:
  17001. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  17002. (!IsAtLeastTLSv1_3(ssl->version) ||
  17003. ssl->curRL.type != change_cipher_spec))
  17004. {
  17005. bufferStatic* in = &ssl->buffers.inputBuffer;
  17006. ret = SanityCheckCipherText(ssl, ssl->curSize);
  17007. if (ret < 0) {
  17008. #ifdef WOLFSSL_EXTRA_ALERTS
  17009. SendAlert(ssl, alert_fatal, bad_record_mac);
  17010. #endif
  17011. return ret;
  17012. }
  17013. if (atomicUser) {
  17014. #ifdef ATOMIC_USER
  17015. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17016. if (ssl->options.startedETMRead) {
  17017. ret = ssl->ctx->VerifyDecryptCb(ssl,
  17018. in->buffer + in->idx, in->buffer + in->idx,
  17019. ssl->curSize - MacSize(ssl),
  17020. ssl->curRL.type, 1, &ssl->keys.padSz,
  17021. ssl->DecryptVerifyCtx);
  17022. }
  17023. else
  17024. #endif
  17025. {
  17026. ret = ssl->ctx->DecryptVerifyCb(ssl,
  17027. in->buffer + in->idx,
  17028. in->buffer + in->idx,
  17029. ssl->curSize, ssl->curRL.type, 1,
  17030. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  17031. }
  17032. #endif /* ATOMIC_USER */
  17033. }
  17034. else {
  17035. if (!ssl->options.tls1_3) {
  17036. #ifndef WOLFSSL_NO_TLS12
  17037. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17038. if (ssl->options.startedETMRead) {
  17039. word32 digestSz = MacSize(ssl);
  17040. ret = DecryptTls(ssl,
  17041. in->buffer + in->idx,
  17042. in->buffer + in->idx,
  17043. ssl->curSize - (word16)digestSz);
  17044. if (ret == 0) {
  17045. byte invalid = 0;
  17046. byte padding = (byte)-1;
  17047. word32 i;
  17048. word32 off = in->idx + ssl->curSize - digestSz - 1;
  17049. /* Last of padding bytes - indicates length. */
  17050. ssl->keys.padSz = in->buffer[off];
  17051. /* Constant time checking of padding - don't leak
  17052. * the length of the data.
  17053. */
  17054. /* Compare max pad bytes or at most data + pad. */
  17055. for (i = 1; i < MAX_PAD_SIZE && off >= i; i++) {
  17056. /* Mask on indicates this is expected to be a
  17057. * padding byte.
  17058. */
  17059. padding &= ctMaskLTE(i, ssl->keys.padSz);
  17060. /* When this is a padding byte and not equal
  17061. * to length then mask is set.
  17062. */
  17063. invalid |= padding &
  17064. ctMaskNotEq(in->buffer[off - i],
  17065. ssl->keys.padSz);
  17066. }
  17067. /* If mask is set then there was an error. */
  17068. if (invalid) {
  17069. ret = DECRYPT_ERROR;
  17070. }
  17071. ssl->keys.padSz += 1;
  17072. ssl->keys.decryptedCur = 1;
  17073. }
  17074. }
  17075. else
  17076. #endif
  17077. {
  17078. ret = DecryptTls(ssl,
  17079. in->buffer + in->idx,
  17080. in->buffer + in->idx,
  17081. ssl->curSize);
  17082. }
  17083. #else
  17084. ret = DECRYPT_ERROR;
  17085. #endif
  17086. }
  17087. else
  17088. {
  17089. #ifdef WOLFSSL_TLS13
  17090. byte *aad = (byte*)&ssl->curRL;
  17091. word16 aad_size = RECORD_HEADER_SZ;
  17092. #ifdef WOLFSSL_DTLS13
  17093. if (ssl->options.dtls) {
  17094. /* aad now points to the record header */
  17095. aad = ssl->dtls13CurRL;
  17096. aad_size = ssl->dtls13CurRlLength;
  17097. }
  17098. #endif /* WOLFSSL_DTLS13 */
  17099. /* Don't send an alert for DTLS. We will just drop it
  17100. * silently later. */
  17101. ret = DecryptTls13(ssl,
  17102. in->buffer + in->idx,
  17103. in->buffer + in->idx,
  17104. ssl->curSize,
  17105. aad, aad_size);
  17106. #else
  17107. ret = DECRYPT_ERROR;
  17108. #endif /* WOLFSSL_TLS13 */
  17109. }
  17110. (void)in;
  17111. }
  17112. #ifdef WOLFSSL_ASYNC_CRYPT
  17113. if (ret == WC_PENDING_E)
  17114. return ret;
  17115. #endif
  17116. if (ret >= 0) {
  17117. #ifndef WOLFSSL_NO_TLS12
  17118. /* handle success */
  17119. #ifndef WOLFSSL_AEAD_ONLY
  17120. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  17121. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  17122. #endif
  17123. /* go past TLSv1.1 IV */
  17124. if (CipherHasExpIV(ssl))
  17125. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  17126. #endif
  17127. }
  17128. else {
  17129. WOLFSSL_MSG("Decrypt failed");
  17130. #ifdef WOLFSSL_DTLS
  17131. /* If in DTLS mode, if the decrypt fails for any
  17132. * reason, pretend the datagram never happened. */
  17133. if (ssl->options.dtls) {
  17134. ssl->options.processReply = doProcessInit;
  17135. ssl->buffers.inputBuffer.idx =
  17136. ssl->buffers.inputBuffer.length;
  17137. return HandleDTLSDecryptFailed(ssl);
  17138. }
  17139. #endif /* WOLFSSL_DTLS */
  17140. #ifdef WOLFSSL_EARLY_DATA
  17141. if (ssl->options.tls1_3) {
  17142. if (ssl->options.side == WOLFSSL_SERVER_END &&
  17143. ssl->earlyData != no_early_data &&
  17144. ssl->options.clientState <
  17145. CLIENT_FINISHED_COMPLETE) {
  17146. ssl->earlyDataSz += ssl->curSize;
  17147. if (ssl->earlyDataSz <=
  17148. ssl->options.maxEarlyDataSz) {
  17149. WOLFSSL_MSG("Ignoring EarlyData!");
  17150. if (ssl->keys.peer_sequence_number_lo-- == 0)
  17151. ssl->keys.peer_sequence_number_hi--;
  17152. ssl->options.processReply = doProcessInit;
  17153. ssl->buffers.inputBuffer.idx += ssl->curSize;
  17154. if (ssl->buffers.inputBuffer.idx >
  17155. ssl->buffers.inputBuffer.length) {
  17156. WOLFSSL_ERROR(BUFFER_E);
  17157. return BUFFER_E;
  17158. }
  17159. return 0;
  17160. }
  17161. WOLFSSL_MSG("Too much EarlyData!");
  17162. SendAlert(ssl, alert_fatal, unexpected_message);
  17163. WOLFSSL_ERROR(TOO_MUCH_EARLY_DATA);
  17164. return TOO_MUCH_EARLY_DATA;
  17165. }
  17166. }
  17167. #endif
  17168. SendAlert(ssl, alert_fatal, bad_record_mac);
  17169. /* Push error once we know that we will error out here */
  17170. WOLFSSL_ERROR(ret);
  17171. return ret;
  17172. }
  17173. }
  17174. ssl->options.processReply = verifyMessage;
  17175. FALL_THROUGH;
  17176. /* verify digest of message */
  17177. case verifyMessage:
  17178. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  17179. (!IsAtLeastTLSv1_3(ssl->version) ||
  17180. ssl->curRL.type != change_cipher_spec))
  17181. {
  17182. if (!atomicUser
  17183. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17184. && !ssl->options.startedETMRead
  17185. #endif
  17186. ) {
  17187. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  17188. ssl->buffers.inputBuffer.idx,
  17189. ssl->curSize, ssl->curRL.type,
  17190. &ssl->keys.padSz);
  17191. #ifdef WOLFSSL_ASYNC_CRYPT
  17192. if (ret == WC_PENDING_E)
  17193. return ret;
  17194. #endif
  17195. if (ret < 0) {
  17196. #ifdef WOLFSSL_DTLS
  17197. /* If in DTLS mode, if the decrypt fails for any
  17198. * reason, pretend the datagram never happened. */
  17199. if (ssl->options.dtls) {
  17200. ssl->options.processReply = doProcessInit;
  17201. ssl->buffers.inputBuffer.idx =
  17202. ssl->buffers.inputBuffer.length;
  17203. return HandleDTLSDecryptFailed(ssl);
  17204. }
  17205. #endif /* WOLFSSL_DTLS */
  17206. #ifdef WOLFSSL_EXTRA_ALERTS
  17207. if (!ssl->options.dtls)
  17208. SendAlert(ssl, alert_fatal, bad_record_mac);
  17209. #endif
  17210. WOLFSSL_MSG("VerifyMac failed");
  17211. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  17212. return DECRYPT_ERROR;
  17213. }
  17214. }
  17215. ssl->keys.encryptSz = ssl->curSize;
  17216. ssl->keys.decryptedCur = 1;
  17217. #ifdef WOLFSSL_TLS13
  17218. if (ssl->options.tls1_3) {
  17219. /* end of plaintext */
  17220. word16 i = (word16)(ssl->buffers.inputBuffer.idx +
  17221. ssl->curSize - ssl->specs.aead_mac_size);
  17222. if (i > ssl->buffers.inputBuffer.length) {
  17223. WOLFSSL_ERROR(BUFFER_ERROR);
  17224. return BUFFER_ERROR;
  17225. }
  17226. /* Remove padding from end of plain text. */
  17227. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  17228. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  17229. break;
  17230. }
  17231. /* Get the real content type from the end of the data. */
  17232. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  17233. /* consider both contentType byte and MAC as padding */
  17234. ssl->keys.padSz = ssl->buffers.inputBuffer.idx
  17235. + ssl->curSize - i;
  17236. }
  17237. #endif
  17238. }
  17239. ssl->options.processReply = runProcessingOneRecord;
  17240. FALL_THROUGH;
  17241. /* the record layer is here */
  17242. case runProcessingOneRecord:
  17243. #ifdef WOLFSSL_DTLS13
  17244. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  17245. if(!Dtls13CheckWindow(ssl)) {
  17246. /* drop packet */
  17247. WOLFSSL_MSG(
  17248. "Dropping DTLS record outside receiving window");
  17249. ssl->options.processReply = doProcessInit;
  17250. ssl->buffers.inputBuffer.idx += ssl->curSize;
  17251. if (ssl->buffers.inputBuffer.idx >
  17252. ssl->buffers.inputBuffer.length)
  17253. return BUFFER_E;
  17254. continue;
  17255. }
  17256. ret = Dtls13UpdateWindow(ssl);
  17257. if (ret != 1) {
  17258. WOLFSSL_ERROR(ret);
  17259. return ret;
  17260. }
  17261. ret = Dtls13RecordRecvd(ssl);
  17262. if (ret != 0) {
  17263. WOLFSSL_ERROR(ret);
  17264. return ret;
  17265. }
  17266. }
  17267. #endif /* WOLFSSL_DTLS13 */
  17268. ssl->options.processReply = runProcessingOneMessage;
  17269. FALL_THROUGH;
  17270. case runProcessingOneMessage:
  17271. /* can't process a message if we have no data. */
  17272. if (ssl->buffers.inputBuffer.idx
  17273. >= ssl->buffers.inputBuffer.length) {
  17274. return BUFFER_ERROR;
  17275. }
  17276. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17277. if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
  17278. /* For TLS v1.1 the block size and explcit IV are added to idx,
  17279. * so it needs to be included in this limit check */
  17280. if ((ssl->curSize - ssl->keys.padSz -
  17281. (ssl->buffers.inputBuffer.idx - startIdx) -
  17282. MacSize(ssl) > MAX_PLAINTEXT_SZ)
  17283. #ifdef WOLFSSL_ASYNC_CRYPT
  17284. && ssl->buffers.inputBuffer.length !=
  17285. ssl->buffers.inputBuffer.idx
  17286. #endif
  17287. ) {
  17288. WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
  17289. #if defined(WOLFSSL_EXTRA_ALERTS)
  17290. SendAlert(ssl, alert_fatal, record_overflow);
  17291. #endif
  17292. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  17293. return BUFFER_ERROR;
  17294. }
  17295. }
  17296. else
  17297. #endif
  17298. /* TLS13 plaintext limit is checked earlier before decryption */
  17299. /* For TLS v1.1 the block size and explcit IV are added to idx,
  17300. * so it needs to be included in this limit check */
  17301. if (!IsAtLeastTLSv1_3(ssl->version)
  17302. && ssl->curSize - ssl->keys.padSz -
  17303. (ssl->buffers.inputBuffer.idx - startIdx)
  17304. > MAX_PLAINTEXT_SZ
  17305. #ifdef WOLFSSL_ASYNC_CRYPT
  17306. && ssl->buffers.inputBuffer.length !=
  17307. ssl->buffers.inputBuffer.idx
  17308. #endif
  17309. ) {
  17310. WOLFSSL_MSG("Plaintext too long");
  17311. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  17312. SendAlert(ssl, alert_fatal, record_overflow);
  17313. #endif
  17314. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  17315. return BUFFER_ERROR;
  17316. }
  17317. #ifdef WOLFSSL_DTLS
  17318. if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) {
  17319. _DtlsUpdateWindow(ssl);
  17320. }
  17321. if (ssl->options.dtls) {
  17322. /* Reset timeout as we have received a valid DTLS message */
  17323. ssl->dtls_timeout = ssl->dtls_timeout_init;
  17324. }
  17325. #endif /* WOLFSSL_DTLS */
  17326. WOLFSSL_MSG("received record layer msg");
  17327. switch (ssl->curRL.type) {
  17328. case handshake :
  17329. WOLFSSL_MSG("got HANDSHAKE");
  17330. /* debugging in DoHandShakeMsg */
  17331. if (ssl->options.dtls) {
  17332. #ifdef WOLFSSL_DTLS
  17333. if (!IsAtLeastTLSv1_3(ssl->version)) {
  17334. ret = DoDtlsHandShakeMsg(ssl,
  17335. ssl->buffers.inputBuffer.buffer,
  17336. &ssl->buffers.inputBuffer.idx,
  17337. ssl->buffers.inputBuffer.length);
  17338. }
  17339. #endif
  17340. #ifdef WOLFSSL_DTLS13
  17341. if (IsAtLeastTLSv1_3(ssl->version)) {
  17342. ret = Dtls13HandshakeRecv(ssl,
  17343. ssl->buffers.inputBuffer.buffer,
  17344. &ssl->buffers.inputBuffer.idx,
  17345. ssl->buffers.inputBuffer.length);
  17346. #ifdef WOLFSSL_EARLY_DATA
  17347. if (ret == 0 &&
  17348. ssl->options.side == WOLFSSL_SERVER_END &&
  17349. ssl->earlyData > early_data_ext &&
  17350. ssl->options.handShakeState == HANDSHAKE_DONE) {
  17351. /* return so wolfSSL_read_early_data can return
  17352. exit */
  17353. ssl->earlyData = no_early_data;
  17354. ssl->options.processReply = doProcessInit;
  17355. return ZERO_RETURN;
  17356. }
  17357. #endif /* WOLFSSL_EARLY_DATA */
  17358. }
  17359. #endif /* WOLFSSL_DTLS13 */
  17360. }
  17361. else if (!IsAtLeastTLSv1_3(ssl->version)
  17362. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  17363. || !TLSv1_3_Capable(ssl)
  17364. #endif
  17365. ) {
  17366. #ifndef WOLFSSL_NO_TLS12
  17367. ret = DoHandShakeMsg(ssl,
  17368. ssl->buffers.inputBuffer.buffer,
  17369. &ssl->buffers.inputBuffer.idx,
  17370. ssl->buffers.inputBuffer.length);
  17371. #else
  17372. ret = BUFFER_ERROR;
  17373. #endif
  17374. }
  17375. else {
  17376. #ifdef WOLFSSL_TLS13
  17377. ssl->msgsReceived.got_change_cipher = 0;
  17378. ret = DoTls13HandShakeMsg(ssl,
  17379. ssl->buffers.inputBuffer.buffer,
  17380. &ssl->buffers.inputBuffer.idx,
  17381. ssl->buffers.inputBuffer.length);
  17382. #ifdef WOLFSSL_EARLY_DATA
  17383. if (ret != 0)
  17384. return ret;
  17385. if (ssl->options.side == WOLFSSL_SERVER_END &&
  17386. ssl->earlyData > early_data_ext &&
  17387. ssl->options.handShakeState == HANDSHAKE_DONE) {
  17388. ssl->earlyData = no_early_data;
  17389. ssl->options.processReply = doProcessInit;
  17390. return ZERO_RETURN;
  17391. }
  17392. #endif
  17393. #else
  17394. ret = BUFFER_ERROR;
  17395. #endif
  17396. }
  17397. if (ret != 0
  17398. /* DoDtlsHandShakeMsg can return a WANT_WRITE when
  17399. * calling DtlsMsgPoolSend. This msg is done
  17400. * processing so let's move on. */
  17401. && (!ssl->options.dtls
  17402. || ret != WANT_WRITE)
  17403. #ifdef WOLFSSL_ASYNC_CRYPT
  17404. /* In async case, on pending, move onto next message.
  17405. * Current message should have been DtlsMsgStore'ed and
  17406. * should be processed with DtlsMsgDrain */
  17407. && (!ssl->options.dtls
  17408. || ret != WC_PENDING_E)
  17409. #endif
  17410. ) {
  17411. WOLFSSL_ERROR(ret);
  17412. return ret;
  17413. }
  17414. break;
  17415. case change_cipher_spec:
  17416. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  17417. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17418. if (ssl->hsInfoOn)
  17419. AddPacketName(ssl, "ChangeCipher");
  17420. /* add record header back on info */
  17421. if (ssl->toInfoOn) {
  17422. ret = AddPacketInfo(ssl, "ChangeCipher",
  17423. change_cipher_spec,
  17424. ssl->buffers.inputBuffer.buffer +
  17425. ssl->buffers.inputBuffer.idx,
  17426. 1, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
  17427. if (ret != 0)
  17428. return ret;
  17429. #ifdef WOLFSSL_CALLBACKS
  17430. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  17431. #endif
  17432. }
  17433. #endif
  17434. #ifdef WOLFSSL_TLS13
  17435. if (IsAtLeastTLSv1_3(ssl->version)) {
  17436. word32 i = ssl->buffers.inputBuffer.idx;
  17437. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  17438. SendAlert(ssl, alert_fatal, unexpected_message);
  17439. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  17440. return UNKNOWN_RECORD_TYPE;
  17441. }
  17442. if (ssl->curSize != 1 ||
  17443. ssl->buffers.inputBuffer.buffer[i] != 1) {
  17444. SendAlert(ssl, alert_fatal, illegal_parameter);
  17445. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  17446. return UNKNOWN_RECORD_TYPE;
  17447. }
  17448. ssl->buffers.inputBuffer.idx++;
  17449. if (!ssl->msgsReceived.got_change_cipher) {
  17450. ssl->msgsReceived.got_change_cipher = 1;
  17451. }
  17452. else {
  17453. SendAlert(ssl, alert_fatal, illegal_parameter);
  17454. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  17455. return UNKNOWN_RECORD_TYPE;
  17456. }
  17457. break;
  17458. }
  17459. #endif
  17460. #ifndef WOLFSSL_NO_TLS12
  17461. if (ssl->buffers.inputBuffer.idx >=
  17462. ssl->buffers.inputBuffer.length ||
  17463. ssl->curSize < 1) {
  17464. WOLFSSL_MSG("ChangeCipher msg too short");
  17465. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  17466. return LENGTH_ERROR;
  17467. }
  17468. if (ssl->buffers.inputBuffer.buffer[
  17469. ssl->buffers.inputBuffer.idx] != 1) {
  17470. WOLFSSL_MSG("ChangeCipher msg wrong value");
  17471. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  17472. return LENGTH_ERROR;
  17473. }
  17474. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  17475. #ifdef HAVE_AEAD
  17476. if (ssl->specs.cipher_type == aead) {
  17477. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  17478. ssl->curSize -= AESGCM_EXP_IV_SZ;
  17479. ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
  17480. ssl->curSize -= ssl->specs.aead_mac_size;
  17481. }
  17482. else
  17483. #endif
  17484. {
  17485. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  17486. ssl->curSize -= (word16)ssl->keys.padSz;
  17487. ssl->curSize -= ssl->specs.iv_size;
  17488. }
  17489. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17490. if (ssl->options.startedETMRead) {
  17491. word32 digestSz = MacSize(ssl);
  17492. ssl->buffers.inputBuffer.idx += digestSz;
  17493. ssl->curSize -= (word16)digestSz;
  17494. }
  17495. #endif
  17496. }
  17497. if (ssl->curSize != 1) {
  17498. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  17499. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  17500. return LENGTH_ERROR;
  17501. }
  17502. ssl->buffers.inputBuffer.idx++;
  17503. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  17504. if (ret != 0) {
  17505. if (!ssl->options.dtls) {
  17506. return ret;
  17507. }
  17508. else {
  17509. #ifdef WOLFSSL_DTLS
  17510. /* Check for duplicate CCS message in DTLS mode.
  17511. * DTLS allows for duplicate messages, and it should be
  17512. * skipped. Also skip if out of order. */
  17513. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  17514. return ret;
  17515. /* Reset error */
  17516. ret = 0;
  17517. break;
  17518. #endif /* WOLFSSL_DTLS */
  17519. }
  17520. }
  17521. ssl->keys.encryptionOn = 1;
  17522. /* setup decrypt keys for following messages */
  17523. /* XXX This might not be what we want to do when
  17524. * receiving a CCS with multicast. We update the
  17525. * key when the application updates them. */
  17526. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  17527. return ret;
  17528. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17529. ssl->options.startedETMRead = ssl->options.encThenMac;
  17530. #endif
  17531. #ifdef WOLFSSL_DTLS
  17532. if (ssl->options.dtls) {
  17533. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  17534. #ifdef WOLFSSL_MULTICAST
  17535. if (ssl->options.haveMcast) {
  17536. peerSeq += ssl->keys.curPeerId;
  17537. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  17538. ssl->ctx->mcastFirstSeq,
  17539. ssl->ctx->mcastSecondSeq,
  17540. ssl->ctx->mcastMaxSeq);
  17541. }
  17542. #endif
  17543. peerSeq->nextEpoch++;
  17544. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  17545. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  17546. peerSeq->nextSeq_lo = 0;
  17547. peerSeq->nextSeq_hi = 0;
  17548. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  17549. DTLS_SEQ_SZ);
  17550. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  17551. }
  17552. #endif
  17553. #ifdef HAVE_LIBZ
  17554. if (ssl->options.usingCompression)
  17555. if ( (ret = InitStreams(ssl)) != 0)
  17556. return ret;
  17557. #endif
  17558. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  17559. ssl->options.side == WOLFSSL_CLIENT_END ?
  17560. kTlsServerStr : kTlsClientStr);
  17561. if (ret != 0)
  17562. return ret;
  17563. #endif /* !WOLFSSL_NO_TLS12 */
  17564. break;
  17565. case application_data:
  17566. WOLFSSL_MSG("got app DATA");
  17567. #ifdef WOLFSSL_DTLS
  17568. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  17569. #ifdef HAVE_SECURE_RENEGOTIATION
  17570. /*
  17571. * Only free HS resources when not in the process of a
  17572. * secure renegotiation and we have received APP DATA
  17573. * from the current epoch
  17574. */
  17575. if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
  17576. || !DtlsSCRKeysSet(ssl))) {
  17577. FreeHandshakeResources(ssl);
  17578. ssl->options.dtlsHsRetain = 0;
  17579. }
  17580. #else
  17581. FreeHandshakeResources(ssl);
  17582. ssl->options.dtlsHsRetain = 0;
  17583. #endif
  17584. }
  17585. #endif
  17586. #ifdef WOLFSSL_TLS13
  17587. if (ssl->keys.keyUpdateRespond) {
  17588. WOLFSSL_MSG("No KeyUpdate from peer seen");
  17589. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  17590. return SANITY_MSG_E;
  17591. }
  17592. #endif
  17593. if ((ret = DoApplicationData(ssl,
  17594. ssl->buffers.inputBuffer.buffer,
  17595. &ssl->buffers.inputBuffer.idx,
  17596. NO_SNIFF)) != 0) {
  17597. WOLFSSL_ERROR(ret);
  17598. return ret;
  17599. }
  17600. break;
  17601. case alert:
  17602. WOLFSSL_MSG("got ALERT!");
  17603. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  17604. &ssl->buffers.inputBuffer.idx, &type);
  17605. if (ret == alert_fatal)
  17606. return FATAL_ERROR;
  17607. else if (ret < 0)
  17608. return ret;
  17609. /* catch warnings that are handled as errors */
  17610. if (type == close_notify) {
  17611. ssl->buffers.inputBuffer.idx =
  17612. ssl->buffers.inputBuffer.length;
  17613. ssl->options.processReply = doProcessInit;
  17614. return ssl->error = ZERO_RETURN;
  17615. }
  17616. if (type == decrypt_error)
  17617. return FATAL_ERROR;
  17618. /* Reset error if we got an alert level in ret */
  17619. if (ret > 0)
  17620. ret = 0;
  17621. break;
  17622. #ifdef WOLFSSL_DTLS13
  17623. case ack:
  17624. WOLFSSL_MSG("got ACK");
  17625. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  17626. word32 processedSize = 0;
  17627. ret = DoDtls13Ack(ssl, ssl->buffers.inputBuffer.buffer +
  17628. ssl->buffers.inputBuffer.idx,
  17629. ssl->buffers.inputBuffer.length -
  17630. ssl->buffers.inputBuffer.idx -
  17631. ssl->keys.padSz, &processedSize);
  17632. ssl->buffers.inputBuffer.idx += processedSize;
  17633. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  17634. if (ret != 0)
  17635. return ret;
  17636. break;
  17637. }
  17638. FALL_THROUGH;
  17639. #endif /* WOLFSSL_DTLS13 */
  17640. default:
  17641. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  17642. return UNKNOWN_RECORD_TYPE;
  17643. }
  17644. ssl->options.processReply = doProcessInit;
  17645. /* input exhausted */
  17646. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
  17647. #ifdef WOLFSSL_DTLS
  17648. /* If app data was processed then return now to avoid
  17649. * dropping any app data. */
  17650. || (ssl->options.dtls && ssl->curRL.type == application_data)
  17651. #endif
  17652. ) {
  17653. /* Shrink input buffer when we successfully finish record
  17654. * processing */
  17655. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag)
  17656. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  17657. return ret;
  17658. }
  17659. /* more messages per record */
  17660. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  17661. WOLFSSL_MSG("More messages in record");
  17662. ssl->options.processReply = runProcessingOneMessage;
  17663. if (IsEncryptionOn(ssl, 0)) {
  17664. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  17665. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17666. if (ssl->options.startedETMRead) {
  17667. word32 digestSz = MacSize(ssl);
  17668. if (ssl->buffers.inputBuffer.idx >=
  17669. ssl->keys.padSz + digestSz) {
  17670. ssl->buffers.inputBuffer.idx -=
  17671. ssl->keys.padSz + digestSz;
  17672. }
  17673. else {
  17674. WOLFSSL_MSG("\tmiddle padding error");
  17675. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  17676. return FATAL_ERROR;
  17677. }
  17678. }
  17679. else
  17680. #endif
  17681. {
  17682. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  17683. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  17684. }
  17685. else {
  17686. WOLFSSL_MSG("\tmiddle padding error");
  17687. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  17688. return FATAL_ERROR;
  17689. }
  17690. }
  17691. }
  17692. }
  17693. /* more records */
  17694. else {
  17695. WOLFSSL_MSG("More records in input");
  17696. }
  17697. #ifdef WOLFSSL_ASYNC_CRYPT
  17698. /* We are setup to read next message/record but we had an error
  17699. * (probably WC_PENDING_E) so return that so it can be handled
  17700. * by higher layers. */
  17701. if (ret != 0)
  17702. return ret;
  17703. #endif
  17704. /* It is safe to shrink the input buffer here now. local vars will
  17705. * be reset to the new starting value. */
  17706. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag)
  17707. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  17708. continue;
  17709. default:
  17710. WOLFSSL_MSG("Bad process input state, programming error");
  17711. WOLFSSL_ERROR_VERBOSE(INPUT_CASE_ERROR);
  17712. return INPUT_CASE_ERROR;
  17713. }
  17714. }
  17715. }
  17716. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  17717. (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
  17718. int SendChangeCipher(WOLFSSL* ssl)
  17719. {
  17720. byte *output;
  17721. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  17722. int idx = RECORD_HEADER_SZ;
  17723. int ret;
  17724. #ifdef OPENSSL_EXTRA
  17725. ssl->cbmode = SSL_CB_MODE_WRITE;
  17726. if (ssl->options.side == WOLFSSL_SERVER_END){
  17727. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  17728. if (ssl->CBIS != NULL)
  17729. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  17730. }
  17731. else{
  17732. ssl->options.clientState =
  17733. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  17734. if (ssl->CBIS != NULL)
  17735. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  17736. }
  17737. #endif
  17738. #ifdef WOLFSSL_DTLS
  17739. if (ssl->options.dtls) {
  17740. sendSz += DTLS_RECORD_EXTRA;
  17741. idx += DTLS_RECORD_EXTRA;
  17742. }
  17743. #endif
  17744. /* are we in scr */
  17745. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  17746. sendSz += MAX_MSG_EXTRA;
  17747. }
  17748. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  17749. * is not advanced yet */
  17750. ssl->options.buildingMsg = 1;
  17751. /* check for available size */
  17752. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  17753. return ret;
  17754. /* get output buffer */
  17755. output = ssl->buffers.outputBuffer.buffer +
  17756. ssl->buffers.outputBuffer.length;
  17757. AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
  17758. output[idx] = 1; /* turn it on */
  17759. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  17760. byte input[ENUM_LEN];
  17761. int inputSz = ENUM_LEN;
  17762. input[0] = 1; /* turn it on */
  17763. #ifdef WOLFSSL_DTLS
  17764. if (IsDtlsNotSctpMode(ssl) &&
  17765. (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
  17766. return ret;
  17767. }
  17768. #endif
  17769. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  17770. change_cipher_spec, 0, 0, 0, CUR_ORDER);
  17771. if (sendSz < 0) {
  17772. return sendSz;
  17773. }
  17774. }
  17775. #ifdef WOLFSSL_DTLS
  17776. else {
  17777. if (IsDtlsNotSctpMode(ssl)) {
  17778. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
  17779. return ret;
  17780. DtlsSEQIncrement(ssl, CUR_ORDER);
  17781. }
  17782. }
  17783. #endif
  17784. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17785. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  17786. if (ssl->toInfoOn) {
  17787. ret = AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  17788. sendSz, WRITE_PROTO, 0, ssl->heap);
  17789. if (ret != 0)
  17790. return ret;
  17791. }
  17792. #endif
  17793. ssl->buffers.outputBuffer.length += sendSz;
  17794. #ifdef WOLFSSL_TLS13
  17795. if (!ssl->options.tls1_3)
  17796. #endif
  17797. {
  17798. /* setup encrypt keys */
  17799. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  17800. return ret;
  17801. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17802. ssl->options.startedETMWrite = ssl->options.encThenMac;
  17803. #endif
  17804. }
  17805. ssl->options.buildingMsg = 0;
  17806. if (ssl->options.groupMessages)
  17807. return 0;
  17808. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  17809. else if (ssl->options.dtls) {
  17810. /* If using DTLS, force the ChangeCipherSpec message to be in the
  17811. * same datagram as the finished message. */
  17812. return 0;
  17813. }
  17814. #endif
  17815. else
  17816. return SendBuffered(ssl);
  17817. }
  17818. #endif
  17819. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  17820. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  17821. int padLen, int content, int verify, int epochOrder)
  17822. {
  17823. byte result[WC_MAX_DIGEST_SIZE];
  17824. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  17825. word32 padSz = ssl->specs.pad_size;
  17826. int ret = 0;
  17827. wc_Md5 md5;
  17828. wc_Sha sha;
  17829. /* data */
  17830. byte seq[SEQ_SZ];
  17831. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  17832. const byte* macSecret = NULL;
  17833. (void)padLen;
  17834. #ifdef HAVE_FUZZER
  17835. if (ssl->fuzzerCb)
  17836. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  17837. #endif
  17838. #ifdef WOLFSSL_DTLS
  17839. if (ssl->options.dtls)
  17840. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  17841. else
  17842. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  17843. #else
  17844. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  17845. #endif
  17846. XMEMSET(seq, 0, SEQ_SZ);
  17847. conLen[0] = (byte)content;
  17848. c16toa((word16)sz, &conLen[ENUM_LEN]);
  17849. WriteSEQ(ssl, epochOrder, seq);
  17850. if (ssl->specs.mac_algorithm == md5_mac) {
  17851. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  17852. if (ret != 0)
  17853. return ret;
  17854. /* inner */
  17855. ret = wc_Md5Update(&md5, macSecret, digestSz);
  17856. ret |= wc_Md5Update(&md5, PAD1, padSz);
  17857. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  17858. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  17859. /* in buffer */
  17860. ret |= wc_Md5Update(&md5, in, sz);
  17861. if (ret != 0) {
  17862. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17863. return VERIFY_MAC_ERROR;
  17864. }
  17865. ret = wc_Md5Final(&md5, result);
  17866. #ifdef WOLFSSL_ASYNC_CRYPT
  17867. /* TODO: Make non-blocking */
  17868. if (ret == WC_PENDING_E) {
  17869. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  17870. }
  17871. #endif
  17872. if (ret != 0) {
  17873. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17874. return VERIFY_MAC_ERROR;
  17875. }
  17876. /* outer */
  17877. ret = wc_Md5Update(&md5, macSecret, digestSz);
  17878. ret |= wc_Md5Update(&md5, PAD2, padSz);
  17879. ret |= wc_Md5Update(&md5, result, digestSz);
  17880. if (ret != 0) {
  17881. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17882. return VERIFY_MAC_ERROR;
  17883. }
  17884. ret = wc_Md5Final(&md5, digest);
  17885. #ifdef WOLFSSL_ASYNC_CRYPT
  17886. /* TODO: Make non-blocking */
  17887. if (ret == WC_PENDING_E) {
  17888. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  17889. }
  17890. #endif
  17891. if (ret != 0) {
  17892. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17893. return VERIFY_MAC_ERROR;
  17894. }
  17895. wc_Md5Free(&md5);
  17896. }
  17897. else {
  17898. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  17899. if (ret != 0)
  17900. return ret;
  17901. /* inner */
  17902. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  17903. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  17904. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  17905. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  17906. /* in buffer */
  17907. ret |= wc_ShaUpdate(&sha, in, sz);
  17908. if (ret != 0) {
  17909. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17910. return VERIFY_MAC_ERROR;
  17911. }
  17912. ret = wc_ShaFinal(&sha, result);
  17913. #ifdef WOLFSSL_ASYNC_CRYPT
  17914. /* TODO: Make non-blocking */
  17915. if (ret == WC_PENDING_E) {
  17916. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  17917. }
  17918. #endif
  17919. if (ret != 0) {
  17920. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17921. return VERIFY_MAC_ERROR;
  17922. }
  17923. /* outer */
  17924. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  17925. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  17926. ret |= wc_ShaUpdate(&sha, result, digestSz);
  17927. if (ret != 0) {
  17928. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17929. return VERIFY_MAC_ERROR;
  17930. }
  17931. ret = wc_ShaFinal(&sha, digest);
  17932. #ifdef WOLFSSL_ASYNC_CRYPT
  17933. /* TODO: Make non-blocking */
  17934. if (ret == WC_PENDING_E) {
  17935. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  17936. }
  17937. #endif
  17938. if (ret != 0) {
  17939. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17940. return VERIFY_MAC_ERROR;
  17941. }
  17942. wc_ShaFree(&sha);
  17943. }
  17944. return 0;
  17945. }
  17946. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  17947. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  17948. static int BuildMD5_CertVerify(WOLFSSL* ssl, byte* digest)
  17949. {
  17950. int ret;
  17951. byte md5_result[WC_MD5_DIGEST_SIZE];
  17952. #ifdef WOLFSSL_SMALL_STACK
  17953. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  17954. #else
  17955. wc_Md5 md5[1];
  17956. #endif
  17957. /* make md5 inner */
  17958. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  17959. if (ret == 0)
  17960. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  17961. if (ret == 0)
  17962. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  17963. if (ret == 0)
  17964. ret = wc_Md5Final(md5, md5_result);
  17965. /* make md5 outer */
  17966. if (ret == 0) {
  17967. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  17968. if (ret == 0) {
  17969. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  17970. if (ret == 0)
  17971. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  17972. if (ret == 0)
  17973. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  17974. if (ret == 0)
  17975. ret = wc_Md5Final(md5, digest);
  17976. wc_Md5Free(md5);
  17977. }
  17978. }
  17979. #ifdef WOLFSSL_SMALL_STACK
  17980. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  17981. #endif
  17982. return ret;
  17983. }
  17984. #endif /* !NO_MD5 && !NO_OLD_TLS */
  17985. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  17986. defined(WOLFSSL_ALLOW_TLS_SHA1))
  17987. static int BuildSHA_CertVerify(WOLFSSL* ssl, byte* digest)
  17988. {
  17989. int ret;
  17990. byte sha_result[WC_SHA_DIGEST_SIZE];
  17991. #ifdef WOLFSSL_SMALL_STACK
  17992. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  17993. #else
  17994. wc_Sha sha[1];
  17995. #endif
  17996. /* make sha inner */
  17997. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  17998. if (ret == 0)
  17999. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  18000. if (ret == 0)
  18001. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  18002. if (ret == 0)
  18003. ret = wc_ShaFinal(sha, sha_result);
  18004. /* make sha outer */
  18005. if (ret == 0) {
  18006. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  18007. if (ret == 0) {
  18008. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  18009. if (ret == 0)
  18010. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  18011. if (ret == 0)
  18012. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  18013. if (ret == 0)
  18014. ret = wc_ShaFinal(sha, digest);
  18015. wc_ShaFree(sha);
  18016. }
  18017. }
  18018. #ifdef WOLFSSL_SMALL_STACK
  18019. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  18020. #endif
  18021. return ret;
  18022. }
  18023. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  18024. int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes)
  18025. {
  18026. int ret = 0;
  18027. (void)hashes;
  18028. if (ssl->options.tls) {
  18029. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  18030. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  18031. if (ret != 0)
  18032. return ret;
  18033. #endif
  18034. #if !defined(NO_SHA)
  18035. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  18036. if (ret != 0)
  18037. return ret;
  18038. #endif
  18039. if (IsAtLeastTLSv1_2(ssl)) {
  18040. #ifndef NO_SHA256
  18041. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  18042. hashes->sha256);
  18043. if (ret != 0)
  18044. return ret;
  18045. #endif
  18046. #ifdef WOLFSSL_SHA384
  18047. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  18048. hashes->sha384);
  18049. if (ret != 0)
  18050. return ret;
  18051. #endif
  18052. #ifdef WOLFSSL_SHA512
  18053. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  18054. hashes->sha512);
  18055. if (ret != 0)
  18056. return ret;
  18057. #endif
  18058. }
  18059. }
  18060. else {
  18061. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  18062. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  18063. if (ret != 0)
  18064. return ret;
  18065. #endif
  18066. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  18067. defined(WOLFSSL_ALLOW_TLS_SHA1))
  18068. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  18069. if (ret != 0)
  18070. return ret;
  18071. #endif
  18072. }
  18073. return ret;
  18074. }
  18075. #ifndef WOLFSSL_NO_TLS12
  18076. void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
  18077. {
  18078. (void)ssl;
  18079. if (args
  18080. #ifdef WOLFSSL_ASYNC_CRYPT
  18081. && ssl->options.buildArgsSet
  18082. #endif
  18083. ) {
  18084. /* only free the IV if it was dynamically allocated */
  18085. if (args->iv && (args->iv != args->staticIvBuffer)) {
  18086. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  18087. }
  18088. }
  18089. #ifdef WOLFSSL_ASYNC_CRYPT
  18090. ssl->options.buildArgsSet = 0;
  18091. #endif
  18092. }
  18093. #endif
  18094. /* Build SSL Message, encrypted */
  18095. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  18096. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
  18097. int epochOrder)
  18098. {
  18099. #ifndef WOLFSSL_NO_TLS12
  18100. int ret;
  18101. BuildMsgArgs* args;
  18102. BuildMsgArgs lcl_args;
  18103. #endif
  18104. WOLFSSL_ENTER("BuildMessage");
  18105. if (ssl == NULL) {
  18106. return BAD_FUNC_ARG;
  18107. }
  18108. /* catch mistaken sizeOnly parameter */
  18109. if (!sizeOnly && (output == NULL || input == NULL) ) {
  18110. return BAD_FUNC_ARG;
  18111. }
  18112. if (sizeOnly && (output || input) ) {
  18113. return BAD_FUNC_ARG;
  18114. }
  18115. (void)epochOrder;
  18116. #ifndef NO_TLS
  18117. #if defined(WOLFSSL_NO_TLS12) && defined(WOLFSSL_TLS13)
  18118. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  18119. hashOutput, sizeOnly, asyncOkay);
  18120. #else
  18121. #ifdef WOLFSSL_TLS13
  18122. if (ssl->options.tls1_3) {
  18123. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  18124. hashOutput, sizeOnly, asyncOkay);
  18125. }
  18126. #endif
  18127. #ifdef WOLFSSL_ASYNC_CRYPT
  18128. ret = WC_NOT_PENDING_E;
  18129. if (asyncOkay) {
  18130. if (ssl->async == NULL) {
  18131. return BAD_FUNC_ARG;
  18132. }
  18133. args = &ssl->async->buildArgs;
  18134. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  18135. if (ret != WC_NOT_PENDING_E) {
  18136. /* Check for error */
  18137. if (ret < 0)
  18138. goto exit_buildmsg;
  18139. }
  18140. }
  18141. else
  18142. #endif
  18143. {
  18144. args = &lcl_args;
  18145. }
  18146. /* Reset state */
  18147. #ifdef WOLFSSL_ASYNC_CRYPT
  18148. if (ret == WC_NOT_PENDING_E)
  18149. #endif
  18150. {
  18151. ret = 0;
  18152. #ifdef WOLFSSL_ASYNC_CRYPT
  18153. ssl->options.buildArgsSet = 1;
  18154. #endif
  18155. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  18156. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  18157. args->sz = RECORD_HEADER_SZ + inSz;
  18158. args->idx = RECORD_HEADER_SZ;
  18159. args->headerSz = RECORD_HEADER_SZ;
  18160. }
  18161. switch (ssl->options.buildMsgState) {
  18162. case BUILD_MSG_BEGIN:
  18163. {
  18164. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  18165. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  18166. /* For epochs >1 the current cipher parameters are located in
  18167. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  18168. * parameters and for epoch 1 use ssl->keys */
  18169. switch (epochOrder) {
  18170. case PREV_ORDER:
  18171. if (ssl->encrypt.src != KEYS) {
  18172. ssl->secure_renegotiation->cache_status =
  18173. SCR_CACHE_NULL;
  18174. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  18175. ERROR_OUT(ret, exit_buildmsg);
  18176. }
  18177. break;
  18178. case CUR_ORDER:
  18179. if (ssl->keys.dtls_epoch ==
  18180. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  18181. if (ssl->encrypt.src != SCR) {
  18182. ssl->secure_renegotiation->cache_status =
  18183. SCR_CACHE_NEEDED;
  18184. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  18185. != 0)
  18186. ERROR_OUT(ret, exit_buildmsg);
  18187. }
  18188. }
  18189. else {
  18190. if (ssl->encrypt.src != KEYS) {
  18191. ssl->secure_renegotiation->cache_status =
  18192. SCR_CACHE_NULL;
  18193. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  18194. != 0)
  18195. ERROR_OUT(ret, exit_buildmsg);
  18196. }
  18197. }
  18198. break;
  18199. default:
  18200. WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
  18201. "CUR_ORDER");
  18202. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  18203. }
  18204. }
  18205. #endif
  18206. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  18207. }
  18208. FALL_THROUGH;
  18209. case BUILD_MSG_SIZE:
  18210. {
  18211. args->digestSz = ssl->specs.hash_size;
  18212. #ifdef HAVE_TRUNCATED_HMAC
  18213. if (ssl->truncated_hmac)
  18214. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  18215. #endif
  18216. args->sz += args->digestSz;
  18217. #ifdef WOLFSSL_DTLS
  18218. if (ssl->options.dtls) {
  18219. args->sz += DTLS_RECORD_EXTRA;
  18220. args->idx += DTLS_RECORD_EXTRA;
  18221. args->headerSz += DTLS_RECORD_EXTRA;
  18222. }
  18223. #endif
  18224. #ifndef WOLFSSL_AEAD_ONLY
  18225. if (ssl->specs.cipher_type == block) {
  18226. word32 blockSz = ssl->specs.block_size;
  18227. if (blockSz == 0) {
  18228. WOLFSSL_MSG("Invalid block size with block cipher type");
  18229. ERROR_OUT(BAD_STATE_E, exit_buildmsg);
  18230. }
  18231. if (ssl->options.tls1_1) {
  18232. args->ivSz = blockSz;
  18233. args->sz += args->ivSz;
  18234. if (args->ivSz > MAX_IV_SZ)
  18235. ERROR_OUT(BUFFER_E, exit_buildmsg);
  18236. }
  18237. args->sz += 1; /* pad byte */
  18238. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18239. if (ssl->options.startedETMWrite) {
  18240. args->pad = (args->sz - args->headerSz -
  18241. args->digestSz) % blockSz;
  18242. }
  18243. else
  18244. #endif
  18245. {
  18246. args->pad = (args->sz - args->headerSz) % blockSz;
  18247. }
  18248. if (args->pad != 0)
  18249. args->pad = blockSz - args->pad;
  18250. args->sz += args->pad;
  18251. }
  18252. #endif /* WOLFSSL_AEAD_ONLY */
  18253. #ifdef HAVE_AEAD
  18254. if (ssl->specs.cipher_type == aead) {
  18255. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  18256. args->ivSz = AESGCM_EXP_IV_SZ;
  18257. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  18258. }
  18259. #endif
  18260. /* done with size calculations */
  18261. if (sizeOnly)
  18262. goto exit_buildmsg;
  18263. if (args->sz > (word32)outSz) {
  18264. WOLFSSL_MSG("Oops, want to write past output buffer size");
  18265. ERROR_OUT(BUFFER_E, exit_buildmsg);
  18266. }
  18267. if (args->ivSz > 0) {
  18268. if (args->ivSz > sizeof(args->staticIvBuffer)) {
  18269. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap,
  18270. DYNAMIC_TYPE_SALT);
  18271. if (args->iv == NULL) {
  18272. ERROR_OUT(MEMORY_E, exit_buildmsg);
  18273. }
  18274. }
  18275. else {
  18276. args->iv = args->staticIvBuffer;
  18277. }
  18278. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  18279. if (ret != 0)
  18280. goto exit_buildmsg;
  18281. }
  18282. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  18283. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  18284. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  18285. defined(HAVE_AEAD))
  18286. if (ssl->specs.cipher_type == aead) {
  18287. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  18288. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  18289. }
  18290. #endif
  18291. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  18292. AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
  18293. /* write to output */
  18294. if (args->ivSz > 0) {
  18295. XMEMCPY(output + args->idx, args->iv,
  18296. min(args->ivSz, MAX_IV_SZ));
  18297. args->idx += args->ivSz;
  18298. }
  18299. XMEMCPY(output + args->idx, input, inSz);
  18300. args->idx += inSz;
  18301. ssl->options.buildMsgState = BUILD_MSG_HASH;
  18302. }
  18303. FALL_THROUGH;
  18304. case BUILD_MSG_HASH:
  18305. {
  18306. /* done with size calculations */
  18307. if (sizeOnly)
  18308. goto exit_buildmsg;
  18309. if (type == handshake && hashOutput) {
  18310. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  18311. if (ret != 0)
  18312. goto exit_buildmsg;
  18313. }
  18314. #ifndef WOLFSSL_AEAD_ONLY
  18315. if (ssl->specs.cipher_type == block) {
  18316. word32 tmpIdx;
  18317. word32 i;
  18318. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18319. if (ssl->options.startedETMWrite)
  18320. tmpIdx = args->idx;
  18321. else
  18322. #endif
  18323. tmpIdx = args->idx + args->digestSz;
  18324. for (i = 0; i <= args->pad; i++)
  18325. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  18326. }
  18327. #endif
  18328. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  18329. }
  18330. FALL_THROUGH;
  18331. case BUILD_MSG_VERIFY_MAC:
  18332. {
  18333. /* done with size calculations */
  18334. if (sizeOnly)
  18335. goto exit_buildmsg;
  18336. /* User Record Layer Callback handling */
  18337. #ifdef ATOMIC_USER
  18338. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18339. if (ssl->options.startedETMWrite) {
  18340. if (ssl->ctx->EncryptMacCb) {
  18341. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  18342. args->pad + 1, type, 0,
  18343. output + args->headerSz,
  18344. output + args->headerSz,
  18345. args->size - args->digestSz,
  18346. ssl->MacEncryptCtx);
  18347. goto exit_buildmsg;
  18348. }
  18349. }
  18350. else
  18351. #endif
  18352. {
  18353. if (ssl->ctx->MacEncryptCb) {
  18354. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  18355. output + args->headerSz + args->ivSz, inSz,
  18356. type, 0, output + args->headerSz,
  18357. output + args->headerSz, args->size,
  18358. ssl->MacEncryptCtx);
  18359. goto exit_buildmsg;
  18360. }
  18361. }
  18362. #endif
  18363. #ifndef WOLFSSL_AEAD_ONLY
  18364. if (ssl->specs.cipher_type != aead
  18365. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18366. && !ssl->options.startedETMWrite
  18367. #endif
  18368. ) {
  18369. #ifdef HAVE_TRUNCATED_HMAC
  18370. if (ssl->truncated_hmac &&
  18371. ssl->specs.hash_size > args->digestSz) {
  18372. #ifdef WOLFSSL_SMALL_STACK
  18373. byte* hmac;
  18374. #else
  18375. byte hmac[WC_MAX_DIGEST_SIZE];
  18376. #endif
  18377. #ifdef WOLFSSL_SMALL_STACK
  18378. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  18379. DYNAMIC_TYPE_DIGEST);
  18380. if (hmac == NULL)
  18381. ERROR_OUT(MEMORY_E, exit_buildmsg);
  18382. #endif
  18383. ret = ssl->hmac(ssl, hmac,
  18384. output + args->headerSz + args->ivSz, inSz,
  18385. -1, type, 0, epochOrder);
  18386. XMEMCPY(output + args->idx, hmac, args->digestSz);
  18387. #ifdef WOLFSSL_SMALL_STACK
  18388. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  18389. #endif
  18390. }
  18391. else
  18392. #endif
  18393. {
  18394. ret = ssl->hmac(ssl, output + args->idx, output +
  18395. args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
  18396. }
  18397. }
  18398. #endif /* WOLFSSL_AEAD_ONLY */
  18399. if (ret != 0)
  18400. goto exit_buildmsg;
  18401. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  18402. }
  18403. FALL_THROUGH;
  18404. case BUILD_MSG_ENCRYPT:
  18405. {
  18406. /* done with size calculations */
  18407. if (sizeOnly)
  18408. goto exit_buildmsg;
  18409. {
  18410. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  18411. /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
  18412. * for all encryption algos that use it for encryption parameters */
  18413. word16 dtls_epoch = 0;
  18414. word16 dtls_sequence_number_hi = 0;
  18415. word32 dtls_sequence_number_lo = 0;
  18416. int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
  18417. DtlsUseSCRKeys(ssl);
  18418. if (swap_seq) {
  18419. dtls_epoch = ssl->keys.dtls_epoch;
  18420. dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
  18421. dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
  18422. ssl->keys.dtls_epoch--;
  18423. ssl->keys.dtls_sequence_number_hi =
  18424. ssl->keys.dtls_prev_sequence_number_hi;
  18425. ssl->keys.dtls_sequence_number_lo =
  18426. ssl->keys.dtls_prev_sequence_number_lo;
  18427. }
  18428. #endif
  18429. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18430. if (ssl->options.startedETMWrite) {
  18431. ret = Encrypt(ssl, output + args->headerSz,
  18432. output + args->headerSz,
  18433. (word16)(args->size - args->digestSz),
  18434. asyncOkay);
  18435. }
  18436. else
  18437. #endif
  18438. {
  18439. ret = Encrypt(ssl, output + args->headerSz,
  18440. output + args->headerSz, args->size, asyncOkay);
  18441. }
  18442. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  18443. /* Restore sequence numbers */
  18444. if (swap_seq) {
  18445. ssl->keys.dtls_epoch = dtls_epoch;
  18446. ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
  18447. ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
  18448. }
  18449. #endif
  18450. }
  18451. if (ret != 0) {
  18452. #ifdef WOLFSSL_ASYNC_CRYPT
  18453. if (ret != WC_PENDING_E)
  18454. #endif
  18455. {
  18456. /* Zeroize plaintext. */
  18457. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18458. if (ssl->options.startedETMWrite) {
  18459. ForceZero(output + args->headerSz,
  18460. (word16)(args->size - args->digestSz));
  18461. }
  18462. else
  18463. #endif
  18464. {
  18465. ForceZero(output + args->headerSz, (word16)args->size);
  18466. }
  18467. }
  18468. goto exit_buildmsg;
  18469. }
  18470. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  18471. }
  18472. FALL_THROUGH;
  18473. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  18474. {
  18475. /* done with size calculations */
  18476. if (sizeOnly)
  18477. goto exit_buildmsg;
  18478. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18479. if (ssl->options.startedETMWrite) {
  18480. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  18481. #ifdef HAVE_TRUNCATED_HMAC
  18482. if (ssl->truncated_hmac &&
  18483. ssl->specs.hash_size > args->digestSz) {
  18484. #ifdef WOLFSSL_SMALL_STACK
  18485. byte* hmac = NULL;
  18486. #else
  18487. byte hmac[WC_MAX_DIGEST_SIZE];
  18488. #endif
  18489. #ifdef WOLFSSL_SMALL_STACK
  18490. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  18491. DYNAMIC_TYPE_DIGEST);
  18492. if (hmac == NULL)
  18493. ERROR_OUT(MEMORY_E, exit_buildmsg);
  18494. #endif
  18495. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  18496. args->ivSz + inSz + args->pad + 1, -1, type,
  18497. 0, epochOrder);
  18498. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  18499. args->digestSz);
  18500. #ifdef WOLFSSL_SMALL_STACK
  18501. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  18502. #endif
  18503. }
  18504. else
  18505. #endif
  18506. {
  18507. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  18508. output + args->headerSz,
  18509. args->ivSz + inSz + args->pad + 1, -1, type,
  18510. 0, epochOrder);
  18511. }
  18512. }
  18513. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  18514. }
  18515. FALL_THROUGH;
  18516. default:
  18517. break;
  18518. }
  18519. exit_buildmsg:
  18520. WOLFSSL_LEAVE("BuildMessage", ret);
  18521. #ifdef WOLFSSL_ASYNC_CRYPT
  18522. if (ret == WC_PENDING_E) {
  18523. return ret;
  18524. }
  18525. #endif
  18526. /* make sure build message state is reset */
  18527. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  18528. #ifdef WOLFSSL_DTLS
  18529. if (ret == 0 && ssl->options.dtls && !sizeOnly)
  18530. DtlsSEQIncrement(ssl, epochOrder);
  18531. #endif
  18532. /* return sz on success */
  18533. if (ret == 0) {
  18534. ret = args->sz;
  18535. }
  18536. else {
  18537. WOLFSSL_ERROR_VERBOSE(ret);
  18538. }
  18539. /* Final cleanup */
  18540. FreeBuildMsgArgs(ssl, args);
  18541. return ret;
  18542. #endif /* !WOLFSSL_NO_TLS12 */
  18543. #else
  18544. (void)outSz;
  18545. (void)inSz;
  18546. (void)type;
  18547. (void)hashOutput;
  18548. (void)asyncOkay;
  18549. return NOT_COMPILED_IN;
  18550. #endif /* NO_TLS */
  18551. }
  18552. #ifndef WOLFSSL_NO_TLS12
  18553. int SendFinished(WOLFSSL* ssl)
  18554. {
  18555. int sendSz,
  18556. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  18557. FINISHED_SZ;
  18558. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  18559. byte *output;
  18560. Hashes* hashes;
  18561. int ret;
  18562. int headerSz = HANDSHAKE_HEADER_SZ;
  18563. int outputSz;
  18564. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  18565. WOLFSSL_ENTER("SendFinished");
  18566. /* check for available size */
  18567. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  18568. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  18569. * is not advanced yet */
  18570. ssl->options.buildingMsg = 1;
  18571. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  18572. return ret;
  18573. #ifdef WOLFSSL_DTLS
  18574. if (ssl->options.dtls) {
  18575. headerSz += DTLS_HANDSHAKE_EXTRA;
  18576. ssl->keys.dtls_epoch++;
  18577. ssl->keys.dtls_prev_sequence_number_hi =
  18578. ssl->keys.dtls_sequence_number_hi;
  18579. ssl->keys.dtls_prev_sequence_number_lo =
  18580. ssl->keys.dtls_sequence_number_lo;
  18581. ssl->keys.dtls_sequence_number_hi = 0;
  18582. ssl->keys.dtls_sequence_number_lo = 0;
  18583. }
  18584. #endif
  18585. /* get output buffer */
  18586. output = ssl->buffers.outputBuffer.buffer +
  18587. ssl->buffers.outputBuffer.length;
  18588. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  18589. /* make finished hashes */
  18590. hashes = (Hashes*)&input[headerSz];
  18591. ret = BuildFinished(ssl, hashes, ssl->options.side == WOLFSSL_CLIENT_END ?
  18592. kTlsClientStr : kTlsServerStr);
  18593. if (ret != 0) return ret;
  18594. #ifdef HAVE_SECURE_RENEGOTIATION
  18595. if (ssl->secure_renegotiation) {
  18596. if (ssl->options.side == WOLFSSL_CLIENT_END)
  18597. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  18598. TLS_FINISHED_SZ);
  18599. else
  18600. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  18601. TLS_FINISHED_SZ);
  18602. }
  18603. #endif
  18604. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  18605. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  18606. XMEMCPY(ssl->clientFinished,
  18607. hashes, TLS_FINISHED_SZ);
  18608. ssl->clientFinished_len = TLS_FINISHED_SZ;
  18609. }
  18610. else {
  18611. XMEMCPY(ssl->serverFinished,
  18612. hashes, TLS_FINISHED_SZ);
  18613. ssl->serverFinished_len = TLS_FINISHED_SZ;
  18614. }
  18615. #endif
  18616. #ifdef WOLFSSL_DTLS
  18617. if (IsDtlsNotSctpMode(ssl)) {
  18618. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz,
  18619. finished)) != 0) {
  18620. return ret;
  18621. }
  18622. }
  18623. #endif
  18624. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  18625. handshake, 1, 0, 0, CUR_ORDER);
  18626. if (sendSz < 0)
  18627. return BUILD_MSG_ERROR;
  18628. if (!ssl->options.resuming) {
  18629. #ifndef NO_SESSION_CACHE
  18630. AddSession(ssl); /* just try */
  18631. #endif
  18632. if (ssl->options.side == WOLFSSL_SERVER_END) {
  18633. #ifdef OPENSSL_EXTRA
  18634. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  18635. ssl->cbmode = SSL_CB_MODE_WRITE;
  18636. if (ssl->CBIS != NULL)
  18637. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  18638. #endif
  18639. ssl->options.handShakeState = HANDSHAKE_DONE;
  18640. ssl->options.handShakeDone = 1;
  18641. }
  18642. }
  18643. else {
  18644. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  18645. #ifdef OPENSSL_EXTRA
  18646. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  18647. ssl->cbmode = SSL_CB_MODE_WRITE;
  18648. if (ssl->CBIS != NULL)
  18649. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  18650. #endif
  18651. ssl->options.handShakeState = HANDSHAKE_DONE;
  18652. ssl->options.handShakeDone = 1;
  18653. }
  18654. }
  18655. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18656. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  18657. if (ssl->toInfoOn) {
  18658. ret = AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  18659. WRITE_PROTO, 0, ssl->heap);
  18660. if (ret != 0)
  18661. return ret;
  18662. }
  18663. #endif
  18664. ssl->buffers.outputBuffer.length += sendSz;
  18665. ret = SendBuffered(ssl);
  18666. ssl->options.buildingMsg = 0;
  18667. #ifdef WOLFSSL_DTLS
  18668. if ((!ssl->options.resuming &&
  18669. ssl->options.side == WOLFSSL_SERVER_END) ||
  18670. (ssl->options.resuming &&
  18671. ssl->options.side == WOLFSSL_CLIENT_END)) {
  18672. ssl->keys.dtls_handshake_number = 0;
  18673. ssl->keys.dtls_expected_peer_handshake_number = 0;
  18674. }
  18675. #endif
  18676. WOLFSSL_LEAVE("SendFinished", ret);
  18677. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  18678. return ret;
  18679. }
  18680. #endif /* WOLFSSL_NO_TLS12 */
  18681. #ifndef NO_WOLFSSL_SERVER
  18682. #if (!defined(WOLFSSL_NO_TLS12) && \
  18683. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  18684. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  18685. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  18686. /* Parses and decodes the certificate then initializes "request". In the case
  18687. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  18688. *
  18689. * Returns 0 on success
  18690. */
  18691. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  18692. DecodedCert* cert, byte* certData, word32 length)
  18693. {
  18694. int ret;
  18695. if (request != NULL)
  18696. XMEMSET(request, 0, sizeof(OcspRequest));
  18697. InitDecodedCert(cert, certData, length, ssl->heap);
  18698. /* TODO: Setup async support here */
  18699. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl));
  18700. if (ret != 0) {
  18701. WOLFSSL_MSG("ParseCert failed");
  18702. }
  18703. if (ret == 0)
  18704. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  18705. if (ret == 0) {
  18706. /* make sure ctx OCSP request is updated */
  18707. if (!ssl->buffers.weOwnCert) {
  18708. wolfSSL_Mutex* ocspLock = &SSL_CM(ssl)->ocsp_stapling->ocspLock;
  18709. if (wc_LockMutex(ocspLock) == 0) {
  18710. if (ssl->ctx->certOcspRequest == NULL)
  18711. ssl->ctx->certOcspRequest = request;
  18712. wc_UnLockMutex(ocspLock);
  18713. }
  18714. }
  18715. }
  18716. FreeDecodedCert(cert);
  18717. return ret;
  18718. }
  18719. /* Creates OCSP response and places it in variable "response". Memory
  18720. * management for "buffer* response" is up to the caller.
  18721. *
  18722. * Also creates an OcspRequest in the case that ocspRequest is null or that
  18723. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  18724. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  18725. * be set to point to "ocspRequest" and it then should not be free'd since
  18726. * wolfSSL_CTX_free will take care of it.
  18727. *
  18728. * Returns 0 on success
  18729. */
  18730. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  18731. buffer* response)
  18732. {
  18733. int ret = 0;
  18734. OcspRequest* request = NULL;
  18735. byte createdRequest = 0;
  18736. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  18737. return BAD_FUNC_ARG;
  18738. XMEMSET(response, 0, sizeof(*response));
  18739. request = *ocspRequest;
  18740. /* unable to fetch status. skip. */
  18741. if (SSL_CM(ssl) == NULL || SSL_CM(ssl)->ocspStaplingEnabled == 0)
  18742. return 0;
  18743. if (request == NULL || ssl->buffers.weOwnCert) {
  18744. DerBuffer* der = ssl->buffers.certificate;
  18745. #ifdef WOLFSSL_SMALL_STACK
  18746. DecodedCert* cert = NULL;
  18747. #else
  18748. DecodedCert cert[1];
  18749. #endif
  18750. /* unable to fetch status. skip. */
  18751. if (der->buffer == NULL || der->length == 0)
  18752. return 0;
  18753. #ifdef WOLFSSL_SMALL_STACK
  18754. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  18755. DYNAMIC_TYPE_DCERT);
  18756. if (cert == NULL)
  18757. return MEMORY_E;
  18758. #endif
  18759. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  18760. DYNAMIC_TYPE_OCSP_REQUEST);
  18761. if (request == NULL)
  18762. ret = MEMORY_E;
  18763. createdRequest = 1;
  18764. if (ret == 0) {
  18765. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  18766. der->length);
  18767. }
  18768. if (ret != 0) {
  18769. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  18770. request = NULL;
  18771. }
  18772. #ifdef WOLFSSL_SMALL_STACK
  18773. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  18774. #endif
  18775. }
  18776. if (ret == 0) {
  18777. request->ssl = ssl;
  18778. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, request, response);
  18779. /* Suppressing, not critical */
  18780. if (ret == OCSP_CERT_REVOKED ||
  18781. ret == OCSP_CERT_UNKNOWN ||
  18782. ret == OCSP_LOOKUP_FAIL) {
  18783. ret = 0;
  18784. }
  18785. }
  18786. /* free request up if error case found otherwise return it */
  18787. if (ret != 0 && createdRequest) {
  18788. FreeOcspRequest(request);
  18789. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  18790. }
  18791. if (ret == 0)
  18792. *ocspRequest = request;
  18793. return ret;
  18794. }
  18795. #endif
  18796. #endif /* !NO_WOLFSSL_SERVER */
  18797. int cipherExtraData(WOLFSSL* ssl)
  18798. {
  18799. int cipherExtra;
  18800. /* Cipher data that may be added by BuildMessage */
  18801. /* There is always an IV (expect for chacha). For AEAD ciphers,
  18802. * there is the authentication tag (aead_mac_size). For block
  18803. * ciphers we have the hash_size MAC on the message, and one
  18804. * block size for possible padding. */
  18805. if (ssl->specs.cipher_type == aead) {
  18806. cipherExtra = ssl->specs.aead_mac_size;
  18807. /* CHACHA does not have an explicit IV. */
  18808. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) {
  18809. cipherExtra += AESGCM_EXP_IV_SZ;
  18810. }
  18811. }
  18812. else {
  18813. cipherExtra = ssl->specs.iv_size + ssl->specs.block_size +
  18814. ssl->specs.hash_size;
  18815. }
  18816. /* Sanity check so we don't ever return negative. */
  18817. return cipherExtra > 0 ? cipherExtra : 0;
  18818. }
  18819. #ifndef WOLFSSL_NO_TLS12
  18820. #ifndef NO_CERTS
  18821. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  18822. /* handle generation of certificate (11) */
  18823. int SendCertificate(WOLFSSL* ssl)
  18824. {
  18825. int ret = 0;
  18826. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  18827. word32 length, maxFragment;
  18828. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  18829. WOLFSSL_ENTER("SendCertificate");
  18830. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher) {
  18831. WOLFSSL_MSG("Not sending certificate msg. Using PSK or ANON cipher.");
  18832. return 0; /* not needed */
  18833. }
  18834. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  18835. #ifdef OPENSSL_EXTRA
  18836. if (ssl->version.major == SSLv3_MAJOR
  18837. && ssl->version.minor == SSLv3_MINOR){
  18838. SendAlert(ssl, alert_warning, no_certificate);
  18839. return 0;
  18840. } else {
  18841. #endif
  18842. certSz = 0;
  18843. certChainSz = 0;
  18844. headerSz = CERT_HEADER_SZ;
  18845. length = CERT_HEADER_SZ;
  18846. listSz = 0;
  18847. #ifdef OPENSSL_EXTRA
  18848. }
  18849. #endif
  18850. }
  18851. else {
  18852. if (!ssl->buffers.certificate) {
  18853. WOLFSSL_MSG("Send Cert missing certificate buffer");
  18854. return BUFFER_ERROR;
  18855. }
  18856. certSz = ssl->buffers.certificate->length;
  18857. headerSz = 2 * CERT_HEADER_SZ;
  18858. /* list + cert size */
  18859. length = certSz + headerSz;
  18860. listSz = certSz + CERT_HEADER_SZ;
  18861. /* may need to send rest of chain, already has leading size(s) */
  18862. if (certSz && ssl->buffers.certChain) {
  18863. certChainSz = ssl->buffers.certChain->length;
  18864. length += certChainSz;
  18865. listSz += certChainSz;
  18866. }
  18867. else
  18868. certChainSz = 0;
  18869. }
  18870. payloadSz = length;
  18871. if (ssl->fragOffset != 0)
  18872. length -= (ssl->fragOffset + headerSz);
  18873. maxFragment = MAX_RECORD_SIZE;
  18874. maxFragment = wolfSSL_GetMaxFragSize(ssl, maxFragment);
  18875. while (length > 0 && ret == 0) {
  18876. byte* output = NULL;
  18877. word32 fragSz = 0;
  18878. word32 i = RECORD_HEADER_SZ;
  18879. int sendSz = RECORD_HEADER_SZ;
  18880. ssl->options.buildingMsg = 1;
  18881. if (!ssl->options.dtls) {
  18882. if (ssl->fragOffset == 0) {
  18883. if (headerSz + certSz + certChainSz <=
  18884. maxFragment - HANDSHAKE_HEADER_SZ) {
  18885. fragSz = headerSz + certSz + certChainSz;
  18886. }
  18887. else {
  18888. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  18889. }
  18890. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  18891. i += HANDSHAKE_HEADER_SZ;
  18892. }
  18893. else {
  18894. fragSz = min(length, maxFragment);
  18895. sendSz += fragSz;
  18896. }
  18897. if (IsEncryptionOn(ssl, 1))
  18898. sendSz += MAX_MSG_EXTRA;
  18899. }
  18900. else {
  18901. #ifdef WOLFSSL_DTLS
  18902. fragSz = min(length, maxFragment);
  18903. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  18904. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  18905. #endif
  18906. }
  18907. if (IsEncryptionOn(ssl, 1))
  18908. sendSz += cipherExtraData(ssl);
  18909. /* check for available size */
  18910. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  18911. return ret;
  18912. /* get output buffer */
  18913. output = ssl->buffers.outputBuffer.buffer +
  18914. ssl->buffers.outputBuffer.length;
  18915. /* Safe to use ssl->fragOffset since it will be incremented immediately
  18916. * after this block. This block needs to be entered only once to not
  18917. * hash the cert msg twice. */
  18918. if (ssl->fragOffset == 0) {
  18919. if (!ssl->options.dtls) {
  18920. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  18921. if (!IsEncryptionOn(ssl, 1))
  18922. HashRaw(ssl, output + RECORD_HEADER_SZ,
  18923. HANDSHAKE_HEADER_SZ);
  18924. }
  18925. else {
  18926. #ifdef WOLFSSL_DTLS
  18927. AddHeaders(output, payloadSz, certificate, ssl);
  18928. HashRaw(ssl,
  18929. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  18930. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  18931. /* Adding the headers increments these, decrement them for
  18932. * actual message header. */
  18933. ssl->keys.dtls_handshake_number--;
  18934. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  18935. ssl->keys.dtls_handshake_number--;
  18936. #endif /* WOLFSSL_DTLS */
  18937. }
  18938. /* list total */
  18939. c32to24(listSz, output + i);
  18940. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  18941. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  18942. i += CERT_HEADER_SZ;
  18943. length -= CERT_HEADER_SZ;
  18944. fragSz -= CERT_HEADER_SZ;
  18945. if (certSz) {
  18946. c32to24(certSz, output + i);
  18947. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  18948. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  18949. i += CERT_HEADER_SZ;
  18950. length -= CERT_HEADER_SZ;
  18951. fragSz -= CERT_HEADER_SZ;
  18952. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
  18953. HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  18954. if (certChainSz)
  18955. HashRaw(ssl, ssl->buffers.certChain->buffer,
  18956. certChainSz);
  18957. }
  18958. }
  18959. }
  18960. else {
  18961. if (!ssl->options.dtls) {
  18962. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  18963. }
  18964. else {
  18965. #ifdef WOLFSSL_DTLS
  18966. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  18967. payloadSz, certificate, ssl);
  18968. ssl->keys.dtls_handshake_number--;
  18969. #endif /* WOLFSSL_DTLS */
  18970. }
  18971. }
  18972. /* member */
  18973. if (certSz && ssl->fragOffset < certSz) {
  18974. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  18975. XMEMCPY(output + i,
  18976. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  18977. i += copySz;
  18978. ssl->fragOffset += copySz;
  18979. length -= copySz;
  18980. fragSz -= copySz;
  18981. }
  18982. if (certChainSz && fragSz) {
  18983. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  18984. XMEMCPY(output + i,
  18985. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  18986. copySz);
  18987. i += copySz;
  18988. ssl->fragOffset += copySz;
  18989. length -= copySz;
  18990. }
  18991. if (IsEncryptionOn(ssl, 1)) {
  18992. byte* input = NULL;
  18993. int inputSz = i; /* build msg adds rec hdr */
  18994. int recordHeaderSz = RECORD_HEADER_SZ;
  18995. if (ssl->options.dtls)
  18996. recordHeaderSz += DTLS_RECORD_EXTRA;
  18997. inputSz -= recordHeaderSz;
  18998. if (inputSz < 0) {
  18999. WOLFSSL_MSG("Send Cert bad inputSz");
  19000. return BUFFER_E;
  19001. }
  19002. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  19003. input = (byte*)XMALLOC(inputSz, ssl->heap,
  19004. DYNAMIC_TYPE_IN_BUFFER);
  19005. if (input == NULL)
  19006. return MEMORY_E;
  19007. XMEMCPY(input, output + recordHeaderSz, inputSz);
  19008. }
  19009. #ifndef WOLFSSL_DTLS
  19010. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19011. handshake, 1, 0, 0, CUR_ORDER);
  19012. #else
  19013. if (!ssl->options.dtls)
  19014. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19015. handshake, 1, 0, 0, CUR_ORDER);
  19016. else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
  19017. * calculate the hash ourselves above */ {
  19018. if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
  19019. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19020. return ret;
  19021. }
  19022. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19023. handshake, 0, 0, 0, CUR_ORDER);
  19024. }
  19025. #endif
  19026. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19027. if (sendSz < 0)
  19028. return sendSz;
  19029. }
  19030. else {
  19031. sendSz = i;
  19032. #ifdef WOLFSSL_DTLS
  19033. if (IsDtlsNotSctpMode(ssl)) {
  19034. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
  19035. return ret;
  19036. }
  19037. if (ssl->options.dtls)
  19038. DtlsSEQIncrement(ssl, CUR_ORDER);
  19039. #endif
  19040. }
  19041. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19042. if (ssl->hsInfoOn)
  19043. AddPacketName(ssl, "Certificate");
  19044. if (ssl->toInfoOn) {
  19045. ret = AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  19046. WRITE_PROTO, 0, ssl->heap);
  19047. if (ret != 0)
  19048. return ret;
  19049. }
  19050. #endif
  19051. ssl->buffers.outputBuffer.length += sendSz;
  19052. if (!ssl->options.groupMessages)
  19053. ret = SendBuffered(ssl);
  19054. }
  19055. if (ret != WANT_WRITE) {
  19056. /* Clean up the fragment offset. */
  19057. ssl->options.buildingMsg = 0;
  19058. ssl->fragOffset = 0;
  19059. #ifdef WOLFSSL_DTLS
  19060. if (ssl->options.dtls)
  19061. ssl->keys.dtls_handshake_number++;
  19062. #endif
  19063. if (ssl->options.side == WOLFSSL_SERVER_END){
  19064. ssl->options.serverState = SERVER_CERT_COMPLETE;
  19065. }
  19066. }
  19067. WOLFSSL_LEAVE("SendCertificate", ret);
  19068. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  19069. return ret;
  19070. }
  19071. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  19072. /* handle generation of certificate_request (13) */
  19073. int SendCertificateRequest(WOLFSSL* ssl)
  19074. {
  19075. byte *output;
  19076. int ret;
  19077. int sendSz;
  19078. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  19079. word32 dnLen = 0;
  19080. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  19081. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  19082. #endif
  19083. int typeTotal = 1; /* only 1 for now */
  19084. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  19085. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  19086. WOLFSSL_ENTER("SendCertificateRequest");
  19087. if (IsAtLeastTLSv1_2(ssl))
  19088. reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz;
  19089. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  19090. /* Certificate Authorities */
  19091. names = SSL_CA_NAMES(ssl);
  19092. while (names != NULL) {
  19093. byte seq[MAX_SEQ_SZ];
  19094. WOLFSSL_X509_NAME* name = names->data.name;
  19095. if (name != NULL) {
  19096. /* 16-bit length | SEQ | Len | DER of name */
  19097. dnLen += OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
  19098. name->rawLen;
  19099. }
  19100. names = names->next;
  19101. }
  19102. reqSz += dnLen;
  19103. #endif
  19104. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  19105. return 0; /* not needed */
  19106. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  19107. if (!ssl->options.dtls) {
  19108. if (IsEncryptionOn(ssl, 1))
  19109. sendSz += MAX_MSG_EXTRA;
  19110. }
  19111. else {
  19112. #ifdef WOLFSSL_DTLS
  19113. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19114. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  19115. #endif
  19116. }
  19117. if (IsEncryptionOn(ssl, 1))
  19118. sendSz += cipherExtraData(ssl);
  19119. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  19120. * is not advanced yet */
  19121. ssl->options.buildingMsg = 1;
  19122. /* check for available size */
  19123. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  19124. return ret;
  19125. /* get output buffer */
  19126. output = ssl->buffers.outputBuffer.buffer +
  19127. ssl->buffers.outputBuffer.length;
  19128. AddHeaders(output, reqSz, certificate_request, ssl);
  19129. /* write to output */
  19130. output[i++] = (byte)typeTotal; /* # of types */
  19131. #ifdef HAVE_ECC
  19132. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  19133. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  19134. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  19135. output[i++] = ecdsa_sign;
  19136. } else
  19137. #endif /* HAVE_ECC */
  19138. {
  19139. output[i++] = rsa_sign;
  19140. }
  19141. /* supported hash/sig */
  19142. if (IsAtLeastTLSv1_2(ssl)) {
  19143. c16toa(ssl->suites->hashSigAlgoSz, &output[i]);
  19144. i += OPAQUE16_LEN;
  19145. XMEMCPY(&output[i],
  19146. ssl->suites->hashSigAlgo, ssl->suites->hashSigAlgoSz);
  19147. i += ssl->suites->hashSigAlgoSz;
  19148. }
  19149. /* Certificate Authorities */
  19150. c16toa((word16)dnLen, &output[i]); /* auth's */
  19151. i += REQ_HEADER_SZ;
  19152. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  19153. names = SSL_CA_NAMES(ssl);
  19154. while (names != NULL) {
  19155. byte seq[MAX_SEQ_SZ];
  19156. WOLFSSL_X509_NAME* name = names->data.name;
  19157. if (name != NULL) {
  19158. c16toa((word16)name->rawLen +
  19159. (word16)SetSequence(name->rawLen, seq), &output[i]);
  19160. i += OPAQUE16_LEN;
  19161. i += SetSequence(name->rawLen, output + i);
  19162. XMEMCPY(output + i, name->raw, name->rawLen);
  19163. i += name->rawLen;
  19164. }
  19165. names = names->next;
  19166. }
  19167. #endif
  19168. (void)i;
  19169. if (IsEncryptionOn(ssl, 1)) {
  19170. byte* input = NULL;
  19171. int inputSz = i; /* build msg adds rec hdr */
  19172. int recordHeaderSz = RECORD_HEADER_SZ;
  19173. if (ssl->options.dtls)
  19174. recordHeaderSz += DTLS_RECORD_EXTRA;
  19175. inputSz -= recordHeaderSz;
  19176. if (inputSz <= 0) {
  19177. WOLFSSL_MSG("Send Cert Req bad inputSz");
  19178. return BUFFER_E;
  19179. }
  19180. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19181. if (input == NULL)
  19182. return MEMORY_E;
  19183. XMEMCPY(input, output + recordHeaderSz, inputSz);
  19184. #ifdef WOLFSSL_DTLS
  19185. if (IsDtlsNotSctpMode(ssl) &&
  19186. (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
  19187. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19188. return ret;
  19189. }
  19190. #endif
  19191. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19192. handshake, 1, 0, 0, CUR_ORDER);
  19193. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19194. if (sendSz < 0)
  19195. return sendSz;
  19196. } else {
  19197. sendSz = i;
  19198. #ifdef WOLFSSL_DTLS
  19199. if (IsDtlsNotSctpMode(ssl)) {
  19200. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
  19201. return ret;
  19202. }
  19203. if (ssl->options.dtls)
  19204. DtlsSEQIncrement(ssl, CUR_ORDER);
  19205. #endif
  19206. ret = HashOutput(ssl, output, sendSz, 0);
  19207. if (ret != 0)
  19208. return ret;
  19209. }
  19210. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19211. if (ssl->hsInfoOn)
  19212. AddPacketName(ssl, "CertificateRequest");
  19213. if (ssl->toInfoOn) {
  19214. ret = AddPacketInfo(ssl, "CertificateRequest", handshake, output,
  19215. sendSz, WRITE_PROTO, 0, ssl->heap);
  19216. if (ret != 0)
  19217. return ret;
  19218. }
  19219. #endif
  19220. ssl->buffers.outputBuffer.length += sendSz;
  19221. if (ssl->options.groupMessages)
  19222. ret = 0;
  19223. else
  19224. ret = SendBuffered(ssl);
  19225. ssl->options.buildingMsg = 0;
  19226. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  19227. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  19228. return ret;
  19229. }
  19230. #ifndef NO_WOLFSSL_SERVER
  19231. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  19232. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  19233. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  19234. byte count)
  19235. {
  19236. byte* output = NULL;
  19237. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  19238. word32 length = ENUM_LEN;
  19239. int sendSz = 0;
  19240. int ret = 0;
  19241. int i = 0;
  19242. WOLFSSL_ENTER("BuildCertificateStatus");
  19243. switch (type) {
  19244. case WOLFSSL_CSR2_OCSP_MULTI:
  19245. length += OPAQUE24_LEN;
  19246. FALL_THROUGH; /* followed by */
  19247. case WOLFSSL_CSR2_OCSP:
  19248. for (i = 0; i < count; i++)
  19249. length += OPAQUE24_LEN + status[i].length;
  19250. break;
  19251. default:
  19252. return 0;
  19253. }
  19254. sendSz = idx + length;
  19255. if (ssl->keys.encryptionOn)
  19256. sendSz += MAX_MSG_EXTRA;
  19257. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  19258. * is not advanced yet */
  19259. ssl->options.buildingMsg = 1;
  19260. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  19261. output = ssl->buffers.outputBuffer.buffer +
  19262. ssl->buffers.outputBuffer.length;
  19263. AddHeaders(output, length, certificate_status, ssl);
  19264. output[idx++] = type;
  19265. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  19266. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  19267. idx += OPAQUE24_LEN;
  19268. }
  19269. for (i = 0; i < count; i++) {
  19270. c32to24(status[i].length, output + idx);
  19271. idx += OPAQUE24_LEN;
  19272. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  19273. idx += status[i].length;
  19274. }
  19275. if (IsEncryptionOn(ssl, 1)) {
  19276. byte* input;
  19277. int inputSz = idx; /* build msg adds rec hdr */
  19278. int recordHeaderSz = RECORD_HEADER_SZ;
  19279. if (ssl->options.dtls)
  19280. recordHeaderSz += DTLS_RECORD_EXTRA;
  19281. inputSz -= recordHeaderSz;
  19282. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19283. if (input == NULL)
  19284. return MEMORY_E;
  19285. XMEMCPY(input, output + recordHeaderSz, inputSz);
  19286. #ifdef WOLFSSL_DTLS
  19287. ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
  19288. #endif
  19289. if (ret == 0)
  19290. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  19291. handshake, 1, 0, 0, CUR_ORDER);
  19292. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  19293. if (sendSz < 0)
  19294. ret = sendSz;
  19295. }
  19296. else {
  19297. #ifdef WOLFSSL_DTLS
  19298. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  19299. ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
  19300. if (ret == 0 && ssl->options.dtls)
  19301. DtlsSEQIncrement(ssl, CUR_ORDER);
  19302. #endif
  19303. ret = HashOutput(ssl, output, sendSz, 0);
  19304. }
  19305. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19306. if (ret == 0 && ssl->hsInfoOn)
  19307. AddPacketName(ssl, "CertificateStatus");
  19308. if (ret == 0 && ssl->toInfoOn) {
  19309. ret = AddPacketInfo(ssl, "CertificateStatus", handshake, output,
  19310. sendSz, WRITE_PROTO, 0, ssl->heap);
  19311. if (ret != 0)
  19312. return ret;
  19313. }
  19314. #endif
  19315. if (ret == 0) {
  19316. ssl->options.buildingMsg = 0;
  19317. ssl->buffers.outputBuffer.length += sendSz;
  19318. if (!ssl->options.groupMessages)
  19319. ret = SendBuffered(ssl);
  19320. }
  19321. }
  19322. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  19323. return ret;
  19324. }
  19325. #endif
  19326. #endif /* NO_WOLFSSL_SERVER */
  19327. /* handle generation of certificate_status (22) */
  19328. int SendCertificateStatus(WOLFSSL* ssl)
  19329. {
  19330. int ret = 0;
  19331. byte status_type = 0;
  19332. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  19333. WOLFSSL_ENTER("SendCertificateStatus");
  19334. (void) ssl;
  19335. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  19336. status_type = ssl->status_request;
  19337. #endif
  19338. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  19339. status_type = status_type ? status_type : ssl->status_request_v2;
  19340. #endif
  19341. switch (status_type) {
  19342. #ifndef NO_WOLFSSL_SERVER
  19343. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  19344. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  19345. /* case WOLFSSL_CSR_OCSP: */
  19346. case WOLFSSL_CSR2_OCSP:
  19347. {
  19348. OcspRequest* request = ssl->ctx->certOcspRequest;
  19349. buffer response;
  19350. ret = CreateOcspResponse(ssl, &request, &response);
  19351. /* if a request was successfully created and not stored in
  19352. * ssl->ctx then free it */
  19353. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  19354. FreeOcspRequest(request);
  19355. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19356. request = NULL;
  19357. }
  19358. if (ret == 0 && response.buffer) {
  19359. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  19360. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19361. response.buffer = NULL;
  19362. }
  19363. break;
  19364. }
  19365. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  19366. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  19367. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  19368. case WOLFSSL_CSR2_OCSP_MULTI:
  19369. {
  19370. OcspRequest* request = ssl->ctx->certOcspRequest;
  19371. buffer responses[1 + MAX_CHAIN_DEPTH];
  19372. int i = 0;
  19373. XMEMSET(responses, 0, sizeof(responses));
  19374. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  19375. /* if a request was successfully created and not stored in
  19376. * ssl->ctx then free it */
  19377. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  19378. FreeOcspRequest(request);
  19379. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19380. request = NULL;
  19381. }
  19382. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  19383. || ssl->buffers.weOwnCertChain)) {
  19384. buffer der;
  19385. word32 idx = 0;
  19386. #ifdef WOLFSSL_SMALL_STACK
  19387. DecodedCert* cert;
  19388. #else
  19389. DecodedCert cert[1];
  19390. #endif
  19391. DerBuffer* chain;
  19392. #ifdef WOLFSSL_SMALL_STACK
  19393. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  19394. DYNAMIC_TYPE_DCERT);
  19395. if (cert == NULL)
  19396. return MEMORY_E;
  19397. #endif
  19398. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  19399. DYNAMIC_TYPE_OCSP_REQUEST);
  19400. if (request == NULL) {
  19401. #ifdef WOLFSSL_SMALL_STACK
  19402. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  19403. #endif
  19404. return MEMORY_E;
  19405. }
  19406. /* use certChain if available, otherwise use peer certificate */
  19407. chain = ssl->buffers.certChain;
  19408. if (chain == NULL) {
  19409. chain = ssl->buffers.certificate;
  19410. }
  19411. if (chain && chain->buffer) {
  19412. while (idx + OPAQUE24_LEN < chain->length) {
  19413. c24to32(chain->buffer + idx, &der.length);
  19414. idx += OPAQUE24_LEN;
  19415. der.buffer = chain->buffer + idx;
  19416. idx += der.length;
  19417. if (idx > chain->length)
  19418. break;
  19419. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  19420. der.length);
  19421. if (ret == 0) {
  19422. request->ssl = ssl;
  19423. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  19424. request, &responses[i + 1]);
  19425. /* Suppressing, not critical */
  19426. if (ret == OCSP_CERT_REVOKED ||
  19427. ret == OCSP_CERT_UNKNOWN ||
  19428. ret == OCSP_LOOKUP_FAIL) {
  19429. ret = 0;
  19430. }
  19431. i++;
  19432. FreeOcspRequest(request);
  19433. }
  19434. }
  19435. }
  19436. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19437. #ifdef WOLFSSL_SMALL_STACK
  19438. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  19439. #endif
  19440. }
  19441. else {
  19442. while (ret == 0 &&
  19443. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  19444. request->ssl = ssl;
  19445. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  19446. request, &responses[++i]);
  19447. /* Suppressing, not critical */
  19448. if (ret == OCSP_CERT_REVOKED ||
  19449. ret == OCSP_CERT_UNKNOWN ||
  19450. ret == OCSP_LOOKUP_FAIL) {
  19451. ret = 0;
  19452. }
  19453. }
  19454. }
  19455. if (responses[0].buffer) {
  19456. if (ret == 0) {
  19457. ret = BuildCertificateStatus(ssl, status_type, responses,
  19458. (byte)i + 1);
  19459. }
  19460. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  19461. if (responses[i].buffer) {
  19462. XFREE(responses[i].buffer, ssl->heap,
  19463. DYNAMIC_TYPE_OCSP_REQUEST);
  19464. }
  19465. }
  19466. }
  19467. break;
  19468. }
  19469. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  19470. #endif /* NO_WOLFSSL_SERVER */
  19471. default:
  19472. break;
  19473. }
  19474. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  19475. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  19476. return ret;
  19477. }
  19478. #endif /* !NO_CERTS */
  19479. #endif /* WOLFSSL_NO_TLS12 */
  19480. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  19481. /**
  19482. * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
  19483. */
  19484. int DtlsSCRKeysSet(WOLFSSL* ssl)
  19485. {
  19486. return ssl->secure_renegotiation &&
  19487. ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
  19488. }
  19489. /**
  19490. * ssl->keys contains the current cipher parameters only for epoch 1. For
  19491. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  19492. * cipher parameters. This function checks if the message currently being
  19493. * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  19494. */
  19495. int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
  19496. {
  19497. return DtlsSCRKeysSet(ssl) &&
  19498. ssl->keys.curEpoch ==
  19499. ssl->secure_renegotiation->tmp_keys.dtls_epoch;
  19500. }
  19501. /**
  19502. * ssl->keys contains the current cipher parameters only for epoch 1. For
  19503. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  19504. * cipher parameters. This function checks if the message currently being
  19505. * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  19506. */
  19507. int DtlsUseSCRKeys(WOLFSSL* ssl)
  19508. {
  19509. return DtlsSCRKeysSet(ssl) &&
  19510. ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
  19511. ssl->keys.dtls_epoch;
  19512. }
  19513. /**
  19514. * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
  19515. * then PREV_ORDER refers to the current epoch.
  19516. * */
  19517. int DtlsCheckOrder(WOLFSSL* ssl, int order)
  19518. {
  19519. if (order == PREV_ORDER && ssl->secure_renegotiation &&
  19520. ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
  19521. return CUR_ORDER;
  19522. }
  19523. else {
  19524. return order;
  19525. }
  19526. }
  19527. #endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
  19528. /* If secure renegotiation is disabled, this will always return false.
  19529. * Otherwise it checks to see if we are currently renegotiating. */
  19530. int IsSCR(WOLFSSL* ssl)
  19531. {
  19532. #ifndef HAVE_SECURE_RENEGOTIATION
  19533. (void)ssl;
  19534. #else /* HAVE_SECURE_RENEGOTIATION */
  19535. if (ssl->secure_renegotiation &&
  19536. ssl->secure_renegotiation->enabled && /* Is SCR enabled? */
  19537. ssl->options.handShakeDone && /* At least one handshake done? */
  19538. ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
  19539. return 1;
  19540. #endif /* HAVE_SECURE_RENEGOTIATION */
  19541. return 0;
  19542. }
  19543. #ifdef WOLFSSL_DTLS
  19544. static int ModifyForMTU(WOLFSSL* ssl, int buffSz, int outputSz, int mtuSz)
  19545. {
  19546. int recordExtra = outputSz - buffSz;
  19547. (void)ssl;
  19548. if (recordExtra > 0 && outputSz > mtuSz) {
  19549. buffSz = mtuSz - recordExtra;
  19550. #ifndef WOLFSSL_AEAD_ONLY
  19551. /* Subtract a block size to be certain that returned fragment
  19552. * size won't get more padding. */
  19553. if (ssl->specs.cipher_type == block)
  19554. buffSz -= ssl->specs.block_size;
  19555. #endif
  19556. }
  19557. return buffSz;
  19558. }
  19559. #endif /* WOLFSSL_DTLS */
  19560. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  19561. /*
  19562. * Enforce limits specified in
  19563. * https://www.rfc-editor.org/rfc/rfc8446#section-5.5
  19564. */
  19565. static int CheckTLS13AEADSendLimit(WOLFSSL* ssl)
  19566. {
  19567. w64wrapper seq;
  19568. w64wrapper limit;
  19569. switch (ssl->specs.bulk_cipher_algorithm) {
  19570. #ifdef BUILD_AESGCM
  19571. case wolfssl_aes_gcm:
  19572. /* Limit is 2^24.5 */
  19573. limit = AEAD_AES_LIMIT;
  19574. break;
  19575. #endif
  19576. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
  19577. case wolfssl_chacha:
  19578. /* For ChaCha20/Poly1305, the record sequence number would wrap
  19579. * before the safety limit is reached. */
  19580. return 0;
  19581. #endif
  19582. #ifdef HAVE_AESCCM
  19583. case wolfssl_aes_ccm:
  19584. /* Use the limits calculated in the DTLS 1.3 spec
  19585. * https://www.rfc-editor.org/rfc/rfc9147.html#name-analysis-of-limits-on-ccm-u */
  19586. #ifdef WOLFSSL_DTLS13
  19587. if (ssl->options.dtls)
  19588. limit = DTLS_AEAD_AES_CCM_LIMIT; /* Limit is 2^23 */
  19589. else
  19590. #endif
  19591. limit = AEAD_AES_LIMIT; /* Limit is 2^24.5 */
  19592. break;
  19593. #endif
  19594. case wolfssl_cipher_null:
  19595. /* No encryption being done */
  19596. return 0;
  19597. default:
  19598. WOLFSSL_MSG("Unrecognized ciphersuite for AEAD limit check");
  19599. return BAD_STATE_E;
  19600. }
  19601. #ifdef WOLFSSL_DTLS13
  19602. if (ssl->options.dtls) {
  19603. seq = ssl->dtls13EncryptEpoch->nextSeqNumber;
  19604. }
  19605. else
  19606. #endif
  19607. {
  19608. seq = w64From32(ssl->keys.sequence_number_hi,
  19609. ssl->keys.sequence_number_lo);
  19610. }
  19611. if (w64GTE(seq, limit))
  19612. return Tls13UpdateKeys(ssl); /* Need to generate new keys */
  19613. return 0;
  19614. }
  19615. #endif /* WOLFSSL_TLS13 && !WOLFSSL_TLS13_IGNORE_AEAD_LIMITS */
  19616. int SendData(WOLFSSL* ssl, const void* data, int sz)
  19617. {
  19618. int sent = 0, /* plainText size */
  19619. sendSz,
  19620. ret;
  19621. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  19622. int groupMsgs = 0;
  19623. #endif
  19624. if (ssl->error == WANT_WRITE
  19625. #ifdef WOLFSSL_ASYNC_CRYPT
  19626. || ssl->error == WC_PENDING_E
  19627. #endif
  19628. ) {
  19629. ssl->error = 0;
  19630. }
  19631. /* don't allow write after decrypt or mac error */
  19632. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  19633. /* For DTLS allow these possible errors and allow the session
  19634. to continue despite them */
  19635. if (ssl->options.dtls) {
  19636. ssl->error = 0;
  19637. }
  19638. else {
  19639. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  19640. return WOLFSSL_FATAL_ERROR;
  19641. }
  19642. }
  19643. #ifdef WOLFSSL_EARLY_DATA
  19644. if (ssl->earlyData != no_early_data) {
  19645. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  19646. WOLFSSL_MSG("handshake complete, trying to send early data");
  19647. ssl->error = BUILD_MSG_ERROR;
  19648. return WOLFSSL_FATAL_ERROR;
  19649. }
  19650. #ifdef WOLFSSL_EARLY_DATA_GROUP
  19651. groupMsgs = 1;
  19652. #endif
  19653. }
  19654. else
  19655. #endif
  19656. if (ssl->options.handShakeState != HANDSHAKE_DONE && !IsSCR(ssl)) {
  19657. int err;
  19658. WOLFSSL_MSG("handshake not complete, trying to finish");
  19659. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  19660. #ifdef WOLFSSL_ASYNC_CRYPT
  19661. /* if async would block return WANT_WRITE */
  19662. if (ssl->error == WC_PENDING_E) {
  19663. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  19664. }
  19665. #endif
  19666. return err;
  19667. }
  19668. }
  19669. /* last time system socket output buffer was full, try again to send */
  19670. if (ssl->buffers.outputBuffer.length > 0
  19671. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  19672. && !groupMsgs
  19673. #endif
  19674. ) {
  19675. WOLFSSL_MSG("output buffer was full, trying to send again");
  19676. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  19677. WOLFSSL_ERROR(ssl->error);
  19678. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  19679. ssl->options.isClosed)) {
  19680. ssl->error = SOCKET_PEER_CLOSED_E;
  19681. WOLFSSL_ERROR(ssl->error);
  19682. return 0; /* peer reset or closed */
  19683. }
  19684. return ssl->error;
  19685. }
  19686. else {
  19687. /* advance sent to previous sent + plain size just sent */
  19688. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  19689. WOLFSSL_MSG("sent write buffered data");
  19690. if (sent > sz) {
  19691. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  19692. return ssl->error = BAD_FUNC_ARG;
  19693. }
  19694. }
  19695. }
  19696. ret = RetrySendAlert(ssl);
  19697. if (ret != 0) {
  19698. ssl->error = ret;
  19699. return WOLFSSL_FATAL_ERROR;
  19700. }
  19701. for (;;) {
  19702. byte* out;
  19703. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  19704. int buffSz; /* may switch on comp */
  19705. int outputSz;
  19706. #ifdef HAVE_LIBZ
  19707. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  19708. #endif
  19709. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_TLS13_IGNORE_AEAD_LIMITS)
  19710. if (IsAtLeastTLSv1_3(ssl->version)) {
  19711. ret = CheckTLS13AEADSendLimit(ssl);
  19712. if (ret != 0) {
  19713. ssl->error = ret;
  19714. return WOLFSSL_FATAL_ERROR;
  19715. }
  19716. }
  19717. #endif
  19718. #ifdef WOLFSSL_DTLS13
  19719. if (ssl->options.dtls && ssl->options.tls1_3) {
  19720. byte isEarlyData = 0;
  19721. if (ssl->dtls13EncryptEpoch == NULL)
  19722. return ssl->error = BAD_STATE_E;
  19723. #ifdef WOLFSSL_EARLY_DATA
  19724. isEarlyData = ssl->earlyData != no_early_data;
  19725. #endif
  19726. if (isEarlyData) {
  19727. #ifdef WOLFSSL_EARLY_DATA
  19728. ret = Dtls13SetEpochKeys(ssl,
  19729. w64From32(0x0, DTLS13_EPOCH_EARLYDATA), ENCRYPT_SIDE_ONLY);
  19730. if (ret != 0) {
  19731. WOLFSSL_MSG(
  19732. "trying to send early data without epoch 1");
  19733. ssl->error = BUILD_MSG_ERROR;
  19734. return WOLFSSL_FATAL_ERROR;
  19735. }
  19736. #endif /* WOLFSSL_EARLY_DATA */
  19737. }
  19738. else if (!w64Equal(
  19739. ssl->dtls13EncryptEpoch->epochNumber,
  19740. ssl->dtls13Epoch)) {
  19741. ret = Dtls13SetEpochKeys(
  19742. ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
  19743. if (ret != 0) {
  19744. ssl->error = BUILD_MSG_ERROR;
  19745. return WOLFSSL_FATAL_ERROR;
  19746. }
  19747. }
  19748. }
  19749. #endif /* WOLFSSL_DTLS13 */
  19750. #ifdef WOLFSSL_DTLS
  19751. if (ssl->options.dtls) {
  19752. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  19753. }
  19754. else
  19755. #endif
  19756. {
  19757. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  19758. }
  19759. if (sent == sz) break;
  19760. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
  19761. if (ssl->options.dtls && (buffSz < sz - sent)) {
  19762. ssl->error = DTLS_SIZE_ERROR;
  19763. WOLFSSL_ERROR(ssl->error);
  19764. return ssl->error;
  19765. }
  19766. #endif
  19767. outputSz = buffSz + COMP_EXTRA + DTLS_RECORD_HEADER_SZ;
  19768. if (IsEncryptionOn(ssl, 1) || ssl->options.tls1_3)
  19769. outputSz += cipherExtraData(ssl);
  19770. /* check for available size */
  19771. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  19772. return ssl->error = ret;
  19773. /* get output buffer */
  19774. out = ssl->buffers.outputBuffer.buffer +
  19775. ssl->buffers.outputBuffer.length;
  19776. #ifdef HAVE_LIBZ
  19777. if (ssl->options.usingCompression) {
  19778. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  19779. if (buffSz < 0) {
  19780. return buffSz;
  19781. }
  19782. sendBuffer = comp;
  19783. }
  19784. #endif
  19785. if (!ssl->options.tls1_3) {
  19786. #ifdef WOLFSSL_ASYNC_CRYPT
  19787. if (ssl->async == NULL) {
  19788. ssl->async = (struct WOLFSSL_ASYNC*)
  19789. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  19790. DYNAMIC_TYPE_ASYNC);
  19791. if (ssl->async == NULL)
  19792. return MEMORY_E;
  19793. ssl->async->freeArgs = NULL;
  19794. }
  19795. #endif
  19796. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  19797. application_data, 0, 0, 1, CUR_ORDER);
  19798. }
  19799. else {
  19800. #ifdef WOLFSSL_TLS13
  19801. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  19802. application_data, 0, 0, 1);
  19803. #else
  19804. sendSz = BUFFER_ERROR;
  19805. #endif
  19806. }
  19807. if (sendSz < 0) {
  19808. #ifdef WOLFSSL_ASYNC_CRYPT
  19809. if (sendSz == WC_PENDING_E)
  19810. ssl->error = sendSz;
  19811. #endif
  19812. return BUILD_MSG_ERROR;
  19813. }
  19814. #ifdef WOLFSSL_ASYNC_CRYPT
  19815. FreeAsyncCtx(ssl, 0);
  19816. #endif
  19817. ssl->buffers.outputBuffer.length += sendSz;
  19818. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  19819. WOLFSSL_ERROR(ssl->error);
  19820. /* store for next call if WANT_WRITE or user embedSend() that
  19821. doesn't present like WANT_WRITE */
  19822. ssl->buffers.plainSz = buffSz;
  19823. ssl->buffers.prevSent = sent;
  19824. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  19825. ssl->options.isClosed)) {
  19826. ssl->error = SOCKET_PEER_CLOSED_E;
  19827. WOLFSSL_ERROR(ssl->error);
  19828. return 0; /* peer reset or closed */
  19829. }
  19830. return ssl->error;
  19831. }
  19832. sent += buffSz;
  19833. /* only one message per attempt */
  19834. if (ssl->options.partialWrite == 1) {
  19835. WOLFSSL_MSG("Partial Write on, only sending one record");
  19836. break;
  19837. }
  19838. }
  19839. return sent;
  19840. }
  19841. /* process input data */
  19842. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  19843. {
  19844. int size;
  19845. WOLFSSL_ENTER("ReceiveData()");
  19846. /* reset error state */
  19847. if (ssl->error == WANT_READ || ssl->error == WOLFSSL_ERROR_WANT_READ) {
  19848. ssl->error = 0;
  19849. }
  19850. #ifdef WOLFSSL_DTLS
  19851. if (ssl->options.dtls) {
  19852. /* In DTLS mode, we forgive some errors and allow the session
  19853. * to continue despite them. */
  19854. if (ssl->error == VERIFY_MAC_ERROR ||
  19855. ssl->error == DECRYPT_ERROR ||
  19856. ssl->error == DTLS_SIZE_ERROR) {
  19857. ssl->error = 0;
  19858. }
  19859. }
  19860. #endif /* WOLFSSL_DTLS */
  19861. if (ssl->error != 0 && ssl->error != WANT_WRITE
  19862. #ifdef WOLFSSL_ASYNC_CRYPT
  19863. && ssl->error != WC_PENDING_E
  19864. #endif
  19865. #ifdef HAVE_SECURE_RENEGOTIATION
  19866. && ssl->error != APP_DATA_READY
  19867. #endif
  19868. ) {
  19869. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  19870. return ssl->error;
  19871. }
  19872. #ifdef WOLFSSL_EARLY_DATA
  19873. if (ssl->earlyData != no_early_data) {
  19874. }
  19875. else
  19876. #endif
  19877. {
  19878. int negotiate = 0;
  19879. #ifdef HAVE_SECURE_RENEGOTIATION
  19880. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  19881. if (ssl->options.handShakeState != HANDSHAKE_DONE
  19882. && ssl->buffers.clearOutputBuffer.length == 0)
  19883. negotiate = 1;
  19884. }
  19885. else
  19886. #endif
  19887. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  19888. negotiate = 1;
  19889. if (negotiate) {
  19890. int err;
  19891. WOLFSSL_MSG("Handshake not complete, trying to finish");
  19892. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  19893. #ifdef WOLFSSL_ASYNC_CRYPT
  19894. /* if async would block return WANT_WRITE */
  19895. if (ssl->error == WC_PENDING_E) {
  19896. return WOLFSSL_CBIO_ERR_WANT_READ;
  19897. }
  19898. #endif
  19899. return err;
  19900. }
  19901. }
  19902. }
  19903. #ifdef HAVE_SECURE_RENEGOTIATION
  19904. startScr:
  19905. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  19906. int ret;
  19907. WOLFSSL_MSG("Need to start scr, server requested");
  19908. ret = wolfSSL_Rehandshake(ssl);
  19909. ssl->secure_renegotiation->startScr = 0; /* only start once */
  19910. if (ret != WOLFSSL_SUCCESS)
  19911. return ret;
  19912. }
  19913. #endif
  19914. while (ssl->buffers.clearOutputBuffer.length == 0) {
  19915. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  19916. if (ssl->error == ZERO_RETURN) {
  19917. WOLFSSL_MSG("Zero return, no more data coming");
  19918. return 0; /* no more data coming */
  19919. }
  19920. if (ssl->error == SOCKET_ERROR_E) {
  19921. if (ssl->options.connReset || ssl->options.isClosed) {
  19922. WOLFSSL_MSG("Peer reset or closed, connection done");
  19923. ssl->error = SOCKET_PEER_CLOSED_E;
  19924. WOLFSSL_ERROR(ssl->error);
  19925. return 0; /* peer reset or closed */
  19926. }
  19927. }
  19928. WOLFSSL_ERROR(ssl->error);
  19929. return ssl->error;
  19930. }
  19931. #ifdef WOLFSSL_DTLS13
  19932. if (ssl->options.dtls) {
  19933. /* Dtls13DoScheduledWork(ssl) may return WANT_WRITE */
  19934. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  19935. WOLFSSL_ERROR(ssl->error);
  19936. return ssl->error;
  19937. }
  19938. }
  19939. #endif /* WOLFSSL_DTLS13 */
  19940. #ifdef HAVE_SECURE_RENEGOTIATION
  19941. if (ssl->secure_renegotiation &&
  19942. ssl->secure_renegotiation->startScr) {
  19943. goto startScr;
  19944. }
  19945. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  19946. ssl->options.handShakeState != HANDSHAKE_DONE
  19947. && ssl->buffers.clearOutputBuffer.length == 0) {
  19948. /* ProcessReply processed a handshake packet and not any APP DATA
  19949. * so let's move the handshake along */
  19950. int err;
  19951. WOLFSSL_MSG("Handshake not complete, trying to finish");
  19952. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  19953. #ifdef WOLFSSL_ASYNC_CRYPT
  19954. /* if async would block return WANT_WRITE */
  19955. if (ssl->error == WC_PENDING_E) {
  19956. return WOLFSSL_CBIO_ERR_WANT_READ;
  19957. }
  19958. #endif
  19959. return err;
  19960. }
  19961. }
  19962. #endif
  19963. #ifdef WOLFSSL_DTLS13
  19964. /* if wolfSSL_Peek() is invoked with sz == 0 it will not block (but
  19965. * it processes pending non-application records) */
  19966. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version) && peek &&
  19967. sz == 0 && ssl->buffers.inputBuffer.idx
  19968. - ssl->buffers.inputBuffer.length == 0) {
  19969. return 0;
  19970. }
  19971. #endif /* WOLFSSL_DTLS13 */
  19972. #ifndef WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
  19973. #ifdef WOLFSSL_TLS13
  19974. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
  19975. ssl->curRL.type == handshake && peek) {
  19976. WOLFSSL_MSG("Got Handshake Messge in APP data");
  19977. if (ssl->buffers.inputBuffer.length == 0) {
  19978. ssl->error = WOLFSSL_ERROR_WANT_READ;
  19979. return 0;
  19980. }
  19981. }
  19982. #endif
  19983. #endif
  19984. }
  19985. size = min(sz, (int)ssl->buffers.clearOutputBuffer.length);
  19986. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  19987. if (peek == 0) {
  19988. ssl->buffers.clearOutputBuffer.length -= size;
  19989. ssl->buffers.clearOutputBuffer.buffer += size;
  19990. }
  19991. if (ssl->buffers.inputBuffer.dynamicFlag)
  19992. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  19993. WOLFSSL_LEAVE("ReceiveData()", size);
  19994. return size;
  19995. }
  19996. static int SendAlert_ex(WOLFSSL* ssl, int severity, int type)
  19997. {
  19998. byte input[ALERT_SIZE];
  19999. byte *output;
  20000. int sendSz;
  20001. int ret;
  20002. int outputSz;
  20003. int dtlsExtra = 0;
  20004. WOLFSSL_ENTER("SendAlert");
  20005. #ifdef WOLFSSL_QUIC
  20006. if (WOLFSSL_IS_QUIC(ssl)) {
  20007. ret = !ssl->quic.method->send_alert(ssl, ssl->quic.enc_level_write, (uint8_t)type);
  20008. if (ret) {
  20009. WOLFSSL_MSG("QUIC send_alert callback error");
  20010. }
  20011. return ret;
  20012. }
  20013. #endif
  20014. #ifdef HAVE_WRITE_DUP
  20015. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  20016. int notifyErr = 0;
  20017. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  20018. if (type == close_notify) {
  20019. notifyErr = ZERO_RETURN;
  20020. } else if (severity == alert_fatal) {
  20021. notifyErr = FATAL_ERROR;
  20022. }
  20023. if (notifyErr != 0) {
  20024. return NotifyWriteSide(ssl, notifyErr);
  20025. }
  20026. return 0;
  20027. }
  20028. #endif
  20029. ssl->pendingAlert.code = type;
  20030. ssl->pendingAlert.level = severity;
  20031. #ifdef OPENSSL_EXTRA
  20032. if (ssl->CBIS != NULL) {
  20033. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  20034. }
  20035. #endif
  20036. #ifdef WOLFSSL_DTLS
  20037. if (ssl->options.dtls)
  20038. dtlsExtra = DTLS_RECORD_EXTRA;
  20039. #endif
  20040. /* check for available size */
  20041. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  20042. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  20043. #ifdef WOLFSSL_DTLS
  20044. /* If CheckAvailableSize returned WANT_WRITE due to a blocking write
  20045. * then discard pending output and just send the alert. */
  20046. if (ssl->options.dtls) {
  20047. if (ret != WANT_WRITE || severity != alert_fatal)
  20048. return ret;
  20049. ShrinkOutputBuffer(ssl);
  20050. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  20051. return ret;
  20052. }
  20053. }
  20054. else {
  20055. return ret;
  20056. }
  20057. #else
  20058. return ret;
  20059. #endif
  20060. }
  20061. /* Check output buffer */
  20062. if (ssl->buffers.outputBuffer.buffer == NULL)
  20063. return BUFFER_E;
  20064. /* get output buffer */
  20065. output = ssl->buffers.outputBuffer.buffer +
  20066. ssl->buffers.outputBuffer.length;
  20067. input[0] = (byte)severity;
  20068. input[1] = (byte)type;
  20069. ssl->alert_history.last_tx.code = type;
  20070. ssl->alert_history.last_tx.level = severity;
  20071. if (severity == alert_fatal) {
  20072. ssl->options.isClosed = 1; /* Don't send close_notify */
  20073. }
  20074. /* send encrypted alert if encryption is on - can be a rehandshake over
  20075. * an existing encrypted channel.
  20076. * TLS 1.3 encrypts handshake packets after the ServerHello
  20077. */
  20078. if (IsEncryptionOn(ssl, 1)) {
  20079. #ifdef WOLFSSL_DTLS13
  20080. if (ssl->options.dtls
  20081. && IsAtLeastTLSv1_3(ssl->version)
  20082. && !w64Equal(ssl->dtls13EncryptEpoch->epochNumber, ssl->dtls13Epoch)) {
  20083. ret = Dtls13SetEpochKeys(ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
  20084. if (ret != 0)
  20085. return ret;
  20086. }
  20087. #endif /* WOLFSSL_DTLS13 */
  20088. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  20089. 0, 0, 0, CUR_ORDER);
  20090. }
  20091. else {
  20092. #ifdef WOLFSSL_DTLS13
  20093. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  20094. ret = Dtls13RlAddPlaintextHeader(ssl, output, alert, ALERT_SIZE);
  20095. if (ret != 0)
  20096. return ret;
  20097. }
  20098. else
  20099. #endif /* WOLFSSL_DTLS13 */
  20100. {
  20101. AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
  20102. }
  20103. output += RECORD_HEADER_SZ;
  20104. #ifdef WOLFSSL_DTLS
  20105. if (ssl->options.dtls)
  20106. output += DTLS_RECORD_EXTRA;
  20107. #endif
  20108. XMEMCPY(output, input, ALERT_SIZE);
  20109. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  20110. #ifdef WOLFSSL_DTLS
  20111. if (ssl->options.dtls)
  20112. sendSz += DTLS_RECORD_EXTRA;
  20113. #endif
  20114. }
  20115. if (sendSz < 0)
  20116. return BUILD_MSG_ERROR;
  20117. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20118. if (ssl->hsInfoOn)
  20119. AddPacketName(ssl, "Alert");
  20120. if (ssl->toInfoOn) {
  20121. ret = AddPacketInfo(ssl, "Alert", alert, output, sendSz,
  20122. WRITE_PROTO, 0, ssl->heap);
  20123. if (ret != 0)
  20124. return ret;
  20125. }
  20126. #endif
  20127. ssl->buffers.outputBuffer.length += sendSz;
  20128. ret = SendBuffered(ssl);
  20129. ssl->pendingAlert.code = 0;
  20130. ssl->pendingAlert.level = alert_none;
  20131. WOLFSSL_LEAVE("SendAlert", ret);
  20132. return ret;
  20133. }
  20134. int RetrySendAlert(WOLFSSL* ssl)
  20135. {
  20136. int type = ssl->pendingAlert.code;
  20137. int severity = ssl->pendingAlert.level;
  20138. if (severity == alert_none)
  20139. return 0;
  20140. ssl->pendingAlert.code = 0;
  20141. ssl->pendingAlert.level = alert_none;
  20142. return SendAlert_ex(ssl, severity, type);
  20143. }
  20144. /* send alert message */
  20145. int SendAlert(WOLFSSL* ssl, int severity, int type)
  20146. {
  20147. int ret;
  20148. if (ssl->pendingAlert.level != alert_none) {
  20149. ret = RetrySendAlert(ssl);
  20150. if (ret != 0) {
  20151. if (ssl->pendingAlert.level == alert_none ||
  20152. (ssl->pendingAlert.level != alert_fatal &&
  20153. severity == alert_fatal)) {
  20154. /* Store current alert if pendingAlert is empty or if current
  20155. * is fatal and previous was not */
  20156. ssl->pendingAlert.code = type;
  20157. ssl->pendingAlert.level = severity;
  20158. }
  20159. return ret;
  20160. }
  20161. }
  20162. return SendAlert_ex(ssl, severity, type);
  20163. }
  20164. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  20165. {
  20166. #ifdef NO_ERROR_STRINGS
  20167. (void)e;
  20168. return "no support for error strings built in";
  20169. #else
  20170. int error = (int)e;
  20171. #ifdef OPENSSL_EXTRA
  20172. /* OpenSSL uses positive error codes */
  20173. if (error > 0) {
  20174. error = -error;
  20175. }
  20176. #endif
  20177. /* pass to wolfCrypt */
  20178. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  20179. return wc_GetErrorString(error);
  20180. }
  20181. switch (error) {
  20182. #ifdef OPENSSL_EXTRA
  20183. case 0 :
  20184. return "ok";
  20185. #endif
  20186. case UNSUPPORTED_SUITE :
  20187. return "unsupported cipher suite";
  20188. case INPUT_CASE_ERROR :
  20189. return "input state error";
  20190. case PREFIX_ERROR :
  20191. return "bad index to key rounds";
  20192. case MEMORY_ERROR :
  20193. return "out of memory";
  20194. case VERIFY_FINISHED_ERROR :
  20195. return "verify problem on finished";
  20196. case VERIFY_MAC_ERROR :
  20197. return "verify mac problem";
  20198. case PARSE_ERROR :
  20199. return "parse error on header";
  20200. case SIDE_ERROR :
  20201. return "wrong client/server type";
  20202. case NO_PEER_CERT : /* OpenSSL compatibility expects this exact text */
  20203. return "peer did not return a certificate";
  20204. case UNKNOWN_HANDSHAKE_TYPE :
  20205. return "weird handshake type";
  20206. case SOCKET_ERROR_E :
  20207. return "error state on socket";
  20208. case SOCKET_NODATA :
  20209. return "expected data, not there";
  20210. case INCOMPLETE_DATA :
  20211. return "don't have enough data to complete task";
  20212. case UNKNOWN_RECORD_TYPE :
  20213. return "unknown type in record hdr";
  20214. case DECRYPT_ERROR :
  20215. return "error during decryption";
  20216. case FATAL_ERROR :
  20217. return "received alert fatal error";
  20218. case ENCRYPT_ERROR :
  20219. return "error during encryption";
  20220. case FREAD_ERROR :
  20221. return "fread problem";
  20222. case NO_PEER_KEY :
  20223. return "need peer's key";
  20224. case NO_PRIVATE_KEY :
  20225. return "need the private key";
  20226. case NO_DH_PARAMS :
  20227. return "server missing DH params";
  20228. case RSA_PRIVATE_ERROR :
  20229. return "error during rsa priv op";
  20230. case MATCH_SUITE_ERROR :
  20231. return "can't match cipher suite";
  20232. case COMPRESSION_ERROR :
  20233. return "compression mismatch error";
  20234. case BUILD_MSG_ERROR :
  20235. return "build message failure";
  20236. case BAD_HELLO :
  20237. return "client hello malformed";
  20238. case DOMAIN_NAME_MISMATCH :
  20239. return "peer subject name mismatch";
  20240. case IPADDR_MISMATCH :
  20241. return "peer ip address mismatch";
  20242. case WANT_READ :
  20243. case WOLFSSL_ERROR_WANT_READ :
  20244. return "non-blocking socket wants data to be read";
  20245. case NOT_READY_ERROR :
  20246. return "handshake layer not ready yet, complete first";
  20247. case VERSION_ERROR :
  20248. return "record layer version error";
  20249. case WANT_WRITE :
  20250. case WOLFSSL_ERROR_WANT_WRITE :
  20251. return "non-blocking socket write buffer full";
  20252. case BUFFER_ERROR :
  20253. return "malformed buffer input error";
  20254. case VERIFY_CERT_ERROR :
  20255. return "verify problem on certificate";
  20256. case VERIFY_SIGN_ERROR :
  20257. return "verify problem based on signature";
  20258. case CLIENT_ID_ERROR :
  20259. return "psk client identity error";
  20260. case SERVER_HINT_ERROR:
  20261. return "psk server hint error";
  20262. case PSK_KEY_ERROR:
  20263. return "psk key callback error";
  20264. case GETTIME_ERROR:
  20265. return "gettimeofday() error";
  20266. case GETITIMER_ERROR:
  20267. return "getitimer() error";
  20268. case SIGACT_ERROR:
  20269. return "sigaction() error";
  20270. case SETITIMER_ERROR:
  20271. return "setitimer() error";
  20272. case LENGTH_ERROR:
  20273. return "record layer length error";
  20274. case PEER_KEY_ERROR:
  20275. return "cant decode peer key";
  20276. case ZERO_RETURN:
  20277. case WOLFSSL_ERROR_ZERO_RETURN:
  20278. return "peer sent close notify alert";
  20279. case ECC_CURVETYPE_ERROR:
  20280. return "Bad ECC Curve Type or unsupported";
  20281. case ECC_CURVE_ERROR:
  20282. return "Bad ECC Curve or unsupported";
  20283. case ECC_PEERKEY_ERROR:
  20284. return "Bad ECC Peer Key";
  20285. case ECC_MAKEKEY_ERROR:
  20286. return "ECC Make Key failure";
  20287. case ECC_EXPORT_ERROR:
  20288. return "ECC Export Key failure";
  20289. case ECC_SHARED_ERROR:
  20290. return "ECC DHE shared failure";
  20291. case NOT_CA_ERROR:
  20292. return "Not a CA by basic constraint error";
  20293. case BAD_CERT_MANAGER_ERROR:
  20294. return "Bad Cert Manager error";
  20295. case OCSP_CERT_REVOKED:
  20296. return "OCSP Cert revoked";
  20297. case CRL_CERT_REVOKED:
  20298. return "CRL Cert revoked";
  20299. case CRL_MISSING:
  20300. return "CRL missing, not loaded";
  20301. case MONITOR_SETUP_E:
  20302. return "CRL monitor setup error";
  20303. case THREAD_CREATE_E:
  20304. return "Thread creation problem";
  20305. case OCSP_NEED_URL:
  20306. return "OCSP need URL";
  20307. case OCSP_CERT_UNKNOWN:
  20308. return "OCSP Cert unknown";
  20309. case OCSP_LOOKUP_FAIL:
  20310. return "OCSP Responder lookup fail";
  20311. case MAX_CHAIN_ERROR:
  20312. return "Maximum Chain Depth Exceeded";
  20313. case COOKIE_ERROR:
  20314. return "DTLS Cookie Error";
  20315. case SEQUENCE_ERROR:
  20316. return "DTLS Sequence Error";
  20317. case SUITES_ERROR:
  20318. return "Suites Pointer Error";
  20319. case OUT_OF_ORDER_E:
  20320. return "Out of order message, fatal";
  20321. case BAD_KEA_TYPE_E:
  20322. return "Bad KEA type found";
  20323. case SANITY_CIPHER_E:
  20324. return "Sanity check on ciphertext failed";
  20325. case RECV_OVERFLOW_E:
  20326. return "Receive callback returned more than requested";
  20327. case GEN_COOKIE_E:
  20328. return "Generate Cookie Error";
  20329. case NO_PEER_VERIFY:
  20330. return "Need peer certificate verify Error";
  20331. case FWRITE_ERROR:
  20332. return "fwrite Error";
  20333. case CACHE_MATCH_ERROR:
  20334. return "Cache restore header match Error";
  20335. case UNKNOWN_SNI_HOST_NAME_E:
  20336. return "Unrecognized host name Error";
  20337. case UNKNOWN_MAX_FRAG_LEN_E:
  20338. return "Unrecognized max frag len Error";
  20339. case KEYUSE_SIGNATURE_E:
  20340. return "Key Use digitalSignature not set Error";
  20341. case KEYUSE_ENCIPHER_E:
  20342. return "Key Use keyEncipherment not set Error";
  20343. case EXTKEYUSE_AUTH_E:
  20344. return "Ext Key Use server/client auth not set Error";
  20345. case SEND_OOB_READ_E:
  20346. return "Send Callback Out of Bounds Read Error";
  20347. case SECURE_RENEGOTIATION_E:
  20348. return "Invalid Renegotiation Error";
  20349. case SESSION_TICKET_LEN_E:
  20350. return "Session Ticket Too Long Error";
  20351. case SESSION_TICKET_EXPECT_E:
  20352. return "Session Ticket Error";
  20353. case SESSION_SECRET_CB_E:
  20354. return "Session Secret Callback Error";
  20355. case NO_CHANGE_CIPHER_E:
  20356. return "Finished received from peer before Change Cipher Error";
  20357. case SANITY_MSG_E:
  20358. return "Sanity Check on message order Error";
  20359. case DUPLICATE_MSG_E:
  20360. return "Duplicate HandShake message Error";
  20361. case SNI_UNSUPPORTED:
  20362. return "Protocol version does not support SNI Error";
  20363. case SOCKET_PEER_CLOSED_E:
  20364. return "Peer closed underlying transport Error";
  20365. case BAD_TICKET_KEY_CB_SZ:
  20366. return "Bad user session ticket key callback Size Error";
  20367. case BAD_TICKET_MSG_SZ:
  20368. return "Bad session ticket message Size Error";
  20369. case BAD_TICKET_ENCRYPT:
  20370. return "Bad user ticket callback encrypt Error";
  20371. case DH_KEY_SIZE_E:
  20372. return "DH key too small Error";
  20373. case SNI_ABSENT_ERROR:
  20374. return "No Server Name Indication extension Error";
  20375. case RSA_SIGN_FAULT:
  20376. return "RSA Signature Fault Error";
  20377. case HANDSHAKE_SIZE_ERROR:
  20378. return "Handshake message too large Error";
  20379. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  20380. return "Unrecognized protocol name Error";
  20381. case BAD_CERTIFICATE_STATUS_ERROR:
  20382. return "Bad Certificate Status Message Error";
  20383. case OCSP_INVALID_STATUS:
  20384. return "Invalid OCSP Status Error";
  20385. case OCSP_WANT_READ:
  20386. return "OCSP nonblock wants read";
  20387. case RSA_KEY_SIZE_E:
  20388. return "RSA key too small";
  20389. case ECC_KEY_SIZE_E:
  20390. return "ECC key too small";
  20391. case DTLS_EXPORT_VER_E:
  20392. return "Version needs updated after code change or version mismatch";
  20393. case INPUT_SIZE_E:
  20394. return "Input size too large Error";
  20395. case CTX_INIT_MUTEX_E:
  20396. return "Initialize ctx mutex error";
  20397. case EXT_MASTER_SECRET_NEEDED_E:
  20398. return "Extended Master Secret must be enabled to resume EMS session";
  20399. case DTLS_POOL_SZ_E:
  20400. return "Maximum DTLS pool size exceeded";
  20401. case DECODE_E:
  20402. return "Decode handshake message error";
  20403. case WRITE_DUP_READ_E:
  20404. return "Write dup write side can't read error";
  20405. case WRITE_DUP_WRITE_E:
  20406. return "Write dup read side can't write error";
  20407. case INVALID_CERT_CTX_E:
  20408. return "Certificate context does not match request or not empty";
  20409. case BAD_KEY_SHARE_DATA:
  20410. return "The Key Share data contains group that wasn't in Client Hello";
  20411. case MISSING_HANDSHAKE_DATA:
  20412. return "The handshake message is missing required data";
  20413. case BAD_BINDER: /* OpenSSL compatibility expects this exact text */
  20414. return "binder does not verify";
  20415. case EXT_NOT_ALLOWED:
  20416. return "Extension type not allowed in handshake message type";
  20417. case INVALID_PARAMETER:
  20418. return "The security parameter is invalid";
  20419. case UNSUPPORTED_EXTENSION:
  20420. return "TLS Extension not requested by the client";
  20421. case PRF_MISSING:
  20422. return "Pseudo-random function is not enabled";
  20423. case KEY_SHARE_ERROR:
  20424. return "Key share extension did not contain a valid named group";
  20425. case POST_HAND_AUTH_ERROR:
  20426. return "Client will not do post handshake authentication";
  20427. case HRR_COOKIE_ERROR:
  20428. return "Cookie does not match one sent in HelloRetryRequest";
  20429. case MCAST_HIGHWATER_CB_E:
  20430. return "Multicast highwater callback returned error";
  20431. case ALERT_COUNT_E:
  20432. return "Alert Count exceeded error";
  20433. case EXT_MISSING:
  20434. return "Required TLS extension missing";
  20435. case DTLS_RETX_OVER_TX:
  20436. return "DTLS interrupting flight transmit with retransmit";
  20437. case DH_PARAMS_NOT_FFDHE_E:
  20438. return "Server DH parameters were not from the FFDHE set as required";
  20439. case TCA_INVALID_ID_TYPE:
  20440. return "TLS Extension Trusted CA ID type invalid";
  20441. case TCA_ABSENT_ERROR:
  20442. return "TLS Extension Trusted CA ID response absent";
  20443. case TSIP_MAC_DIGSZ_E:
  20444. return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
  20445. case CLIENT_CERT_CB_ERROR:
  20446. return "Error importing client cert or key from callback";
  20447. case SSL_SHUTDOWN_ALREADY_DONE_E:
  20448. return "Shutdown has already occurred";
  20449. case TLS13_SECRET_CB_E:
  20450. return "TLS1.3 Secret Callback Error";
  20451. case DTLS_SIZE_ERROR:
  20452. return "DTLS trying to send too much in single datagram error";
  20453. case NO_CERT_ERROR:
  20454. return "TLS1.3 No Certificate Set Error";
  20455. case APP_DATA_READY:
  20456. return "Application data is available for reading";
  20457. case TOO_MUCH_EARLY_DATA:
  20458. return "Too much early data";
  20459. case SOCKET_FILTERED_E:
  20460. return "Session stopped by network filter";
  20461. #ifdef HAVE_HTTP_CLIENT
  20462. case HTTP_TIMEOUT:
  20463. return "HTTP timeout for OCSP or CRL req";
  20464. case HTTP_RECV_ERR:
  20465. return "HTTP Receive error";
  20466. case HTTP_HEADER_ERR:
  20467. return "HTTP Header error";
  20468. case HTTP_PROTO_ERR:
  20469. return "HTTP Protocol error";
  20470. case HTTP_STATUS_ERR:
  20471. return "HTTP Status error";
  20472. case HTTP_VERSION_ERR:
  20473. return "HTTP Version error";
  20474. case HTTP_APPSTR_ERR:
  20475. return "HTTP Application string error";
  20476. #endif
  20477. #ifdef OPENSSL_EXTRA
  20478. case -X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
  20479. return "unable to get local issuer certificate";
  20480. #endif
  20481. case UNSUPPORTED_PROTO_VERSION:
  20482. #ifdef OPENSSL_ALL
  20483. return "WRONG_SSL_VERSION";
  20484. #else
  20485. return "bad/unsupported protocol version";
  20486. #endif
  20487. case FALCON_KEY_SIZE_E:
  20488. return "Wrong key size for Falcon.";
  20489. case DILITHIUM_KEY_SIZE_E:
  20490. return "Wrong key size for Dilithium.";
  20491. #ifdef WOLFSSL_QUIC
  20492. case QUIC_TP_MISSING_E:
  20493. return "QUIC transport parameter not set";
  20494. #endif
  20495. case DTLS_CID_ERROR:
  20496. return "DTLS ConnectionID mismatch or missing";
  20497. case DTLS_TOO_MANY_FRAGMENTS_E:
  20498. return "Received too many fragmented messages from peer error";
  20499. default :
  20500. return "unknown error number";
  20501. }
  20502. #endif /* NO_ERROR_STRINGS */
  20503. }
  20504. const char* wolfSSL_ERR_func_error_string(unsigned long e)
  20505. {
  20506. (void)e;
  20507. WOLFSSL_MSG("wolfSSL_ERR_func_error_string does not return the name of "
  20508. "the function that failed. Please inspect the wolfSSL debug "
  20509. "logs to determine where the error occurred.");
  20510. return "";
  20511. }
  20512. /* return library name
  20513. * @param e error code
  20514. * @return text library name,
  20515. * if there is no suitable library found, returns empty string
  20516. */
  20517. const char* wolfSSL_ERR_lib_error_string(unsigned long e)
  20518. {
  20519. int libe = 0;
  20520. (void)libe;
  20521. (void)e;
  20522. #if defined(OPENSSL_EXTRA)
  20523. libe = wolfSSL_ERR_GET_LIB(e);
  20524. switch (libe) {
  20525. case ERR_LIB_PEM:
  20526. return "wolfSSL PEM routines";
  20527. case ERR_LIB_EVP:
  20528. return "wolfSSL digital envelope routines";
  20529. default:
  20530. return "";
  20531. }
  20532. #else
  20533. return "";
  20534. #endif
  20535. }
  20536. void SetErrorString(int error, char* str)
  20537. {
  20538. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  20539. str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
  20540. }
  20541. #ifdef NO_CIPHER_SUITE_ALIASES
  20542. #ifndef NO_ERROR_STRINGS
  20543. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  20544. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20545. #define SUITE_ALIAS(x,z,w,v,u)
  20546. #else
  20547. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20548. #define SUITE_ALIAS(x,z,w,v,u)
  20549. #endif
  20550. #else
  20551. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  20552. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20553. #define SUITE_ALIAS(x,z,w,v,u)
  20554. #else
  20555. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20556. #define SUITE_ALIAS(x,z,w,v,u)
  20557. #endif
  20558. #endif
  20559. #else /* !NO_CIPHER_SUITE_ALIASES */
  20560. /* note that the comma is included at the end of the SUITE_ALIAS() macro
  20561. * definitions, to allow aliases to be gated out by the above null macros
  20562. * in the NO_CIPHER_SUITE_ALIASES section.
  20563. */
  20564. #ifndef NO_ERROR_STRINGS
  20565. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  20566. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  20567. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20568. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20569. #else
  20570. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20571. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20572. #endif
  20573. #else
  20574. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  20575. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  20576. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20577. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20578. #else
  20579. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20580. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20581. #endif
  20582. #endif
  20583. #endif /* NO_CIPHER_SUITE_ALIASES */
  20584. static const CipherSuiteInfo cipher_names[] =
  20585. {
  20586. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  20587. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  20588. #endif
  20589. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  20590. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
  20591. #endif
  20592. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  20593. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  20594. #endif
  20595. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  20596. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  20597. #endif
  20598. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  20599. 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),
  20600. SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
  20601. #endif
  20602. #ifdef BUILD_TLS_SHA256_SHA256
  20603. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  20604. #endif
  20605. #ifdef BUILD_TLS_SHA384_SHA384
  20606. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
  20607. #endif
  20608. #ifndef WOLFSSL_NO_TLS12
  20609. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  20610. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20611. #endif
  20612. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  20613. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  20614. #endif
  20615. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  20616. 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),
  20617. #endif
  20618. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  20619. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20620. #endif
  20621. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  20622. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20623. #endif
  20624. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  20625. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  20626. #endif
  20627. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  20628. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20629. #endif
  20630. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  20631. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  20632. #endif
  20633. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  20634. 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),
  20635. #endif
  20636. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  20637. 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),
  20638. #endif
  20639. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  20640. 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),
  20641. #endif
  20642. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  20643. 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),
  20644. #endif
  20645. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  20646. 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),
  20647. #endif
  20648. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  20649. 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),
  20650. #endif
  20651. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  20652. 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),
  20653. #endif
  20654. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  20655. 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),
  20656. #endif
  20657. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  20658. 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),
  20659. #endif
  20660. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  20661. 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),
  20662. #endif
  20663. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  20664. 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),
  20665. #endif
  20666. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  20667. 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),
  20668. #endif
  20669. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  20670. 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),
  20671. #endif
  20672. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  20673. 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),
  20674. #endif
  20675. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  20676. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  20677. #endif
  20678. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  20679. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  20680. #endif
  20681. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  20682. 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),
  20683. SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  20684. #endif
  20685. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  20686. 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),
  20687. SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  20688. #endif
  20689. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  20690. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  20691. #endif
  20692. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  20693. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20694. #endif
  20695. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  20696. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  20697. #endif
  20698. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  20699. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20700. #endif
  20701. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  20702. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  20703. #endif
  20704. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  20705. 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),
  20706. SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20707. #endif
  20708. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  20709. 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),
  20710. SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20711. #endif
  20712. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  20713. 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),
  20714. #endif
  20715. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  20716. 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),
  20717. SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20718. #endif
  20719. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  20720. 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),
  20721. SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20722. #endif
  20723. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  20724. 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),
  20725. #endif
  20726. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  20727. 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),
  20728. #endif
  20729. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  20730. 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),
  20731. #endif
  20732. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  20733. 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),
  20734. #endif
  20735. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  20736. 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),
  20737. #endif
  20738. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  20739. 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),
  20740. #endif
  20741. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  20742. 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),
  20743. #endif
  20744. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  20745. 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),
  20746. #endif
  20747. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  20748. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
  20749. #endif
  20750. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  20751. 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),
  20752. #endif
  20753. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  20754. 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),
  20755. #endif
  20756. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  20757. 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),
  20758. #endif
  20759. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  20760. 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),
  20761. #endif
  20762. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  20763. 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),
  20764. #endif
  20765. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  20766. 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),
  20767. #endif
  20768. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  20769. 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),
  20770. #endif
  20771. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  20772. 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),
  20773. #endif
  20774. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  20775. 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),
  20776. #endif
  20777. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  20778. 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),
  20779. #endif
  20780. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  20781. 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),
  20782. #endif
  20783. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  20784. 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),
  20785. #endif
  20786. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  20787. 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),
  20788. #endif
  20789. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  20790. 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),
  20791. #endif
  20792. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  20793. 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),
  20794. #endif
  20795. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  20796. 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),
  20797. #endif
  20798. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  20799. 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),
  20800. #endif
  20801. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  20802. 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),
  20803. #endif
  20804. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  20805. 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),
  20806. #endif
  20807. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  20808. 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),
  20809. #endif
  20810. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  20811. 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),
  20812. #endif
  20813. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  20814. 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),
  20815. #endif
  20816. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  20817. 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),
  20818. #endif
  20819. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  20820. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  20821. #endif
  20822. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  20823. 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),
  20824. #endif
  20825. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  20826. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  20827. #endif
  20828. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  20829. 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),
  20830. #endif
  20831. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  20832. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20833. #endif
  20834. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  20835. 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),
  20836. #endif
  20837. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  20838. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20839. #endif
  20840. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  20841. 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),
  20842. #endif
  20843. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  20844. 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),
  20845. #endif
  20846. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  20847. 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),
  20848. #endif
  20849. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  20850. 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),
  20851. #endif
  20852. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  20853. 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),
  20854. #endif
  20855. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  20856. 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),
  20857. #endif
  20858. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  20859. 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),
  20860. #endif
  20861. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  20862. 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),
  20863. #endif
  20864. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  20865. 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),
  20866. #endif
  20867. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  20868. 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),
  20869. #endif
  20870. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  20871. 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),
  20872. #endif
  20873. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  20874. 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),
  20875. #endif
  20876. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  20877. 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),
  20878. #endif
  20879. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  20880. 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),
  20881. #endif
  20882. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  20883. 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),
  20884. #endif
  20885. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  20886. 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),
  20887. #endif
  20888. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  20889. 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),
  20890. #endif
  20891. #ifdef HAVE_RENEGOTIATION_INDICATION
  20892. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
  20893. #endif
  20894. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  20895. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  20896. #endif
  20897. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  20898. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20899. #endif
  20900. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  20901. 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),
  20902. #endif
  20903. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
  20904. 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),
  20905. #endif
  20906. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  20907. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  20908. #endif
  20909. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  20910. 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),
  20911. #endif
  20912. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  20913. 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),
  20914. #endif
  20915. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  20916. 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),
  20917. #endif
  20918. #ifdef BUILD_WDM_WITH_NULL_SHA256
  20919. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
  20920. #endif
  20921. #endif /* WOLFSSL_NO_TLS12 */
  20922. };
  20923. /* returns the cipher_names array */
  20924. const CipherSuiteInfo* GetCipherNames(void)
  20925. {
  20926. return cipher_names;
  20927. }
  20928. /* returns the number of elements in the cipher_names array */
  20929. int GetCipherNamesSize(void)
  20930. {
  20931. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  20932. }
  20933. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  20934. {
  20935. int i;
  20936. const char* nameInternal = "None";
  20937. for (i = 0; i < GetCipherNamesSize(); i++) {
  20938. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  20939. (cipher_names[i].cipherSuite == cipherSuite)
  20940. #ifndef NO_CIPHER_SUITE_ALIASES
  20941. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  20942. #endif
  20943. ) {
  20944. nameInternal = cipher_names[i].name;
  20945. break;
  20946. }
  20947. }
  20948. return nameInternal;
  20949. }
  20950. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  20951. /* Segment cipher name into n[n0,n1,n2,n4]
  20952. * @param cipher a pointer to WOLFSSL_CIPHER
  20953. * @param n return segment cipher name
  20954. * return cipher name if cipher is in the list,
  20955. * otherwise NULL
  20956. */
  20957. const char* GetCipherSegment(const WOLFSSL_CIPHER* cipher, char n[][MAX_SEGMENT_SZ])
  20958. {
  20959. int i,j,k;
  20960. int strLen;
  20961. unsigned long offset;
  20962. const char* name;
  20963. /* sanity check */
  20964. if (cipher == NULL || n == NULL)
  20965. return NULL;
  20966. offset = cipher->offset;
  20967. if (offset >= (unsigned long)GetCipherNamesSize())
  20968. return NULL;
  20969. name = cipher_names[offset].name;
  20970. if (name == NULL)
  20971. return NULL;
  20972. /* Segment cipher name into n[n0,n1,n2,n4]
  20973. * These are used later for comparisons to create:
  20974. * keaStr, authStr, encStr, macStr
  20975. *
  20976. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  20977. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  20978. * and n = [n0,n1,n2,n3,0]
  20979. */
  20980. strLen = (int)XSTRLEN(name);
  20981. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  20982. if (k >= MAX_SEGMENTS || j >= MAX_SEGMENT_SZ)
  20983. break;
  20984. if (name[i] != '-' && name[i] != '\0') {
  20985. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  20986. j++;
  20987. }
  20988. else {
  20989. n[k][j] = '\0';
  20990. j = 0;
  20991. k++;
  20992. }
  20993. }
  20994. return name;
  20995. }
  20996. /* gcc-12 and later, building with ASAN at -O2 and higher, generate spurious
  20997. * stringop-overread warnings on some (but not all...) reads of n[1] in
  20998. * GetCipherKeaStr().
  20999. */
  21000. #if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
  21001. PRAGMA_GCC_DIAG_PUSH
  21002. PRAGMA_GCC("GCC diagnostic ignored \"-Wstringop-overread\"")
  21003. #endif
  21004. const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
  21005. const char* keaStr = NULL;
  21006. if (XSTRCMP(n[0],"ECDHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  21007. keaStr = "ECDHEPSK";
  21008. else if ((XSTRCMP(n[0],"ECDH") == 0) || (XSTRCMP(n[0],"ECDHE") == 0))
  21009. keaStr = "ECDH";
  21010. else if (XSTRCMP(n[0],"DHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  21011. keaStr = "DHEPSK";
  21012. else if (XSTRCMP(n[0],"DHE") == 0)
  21013. keaStr = "DH";
  21014. else if (XSTRCMP(n[0],"RSA") == 0 && XSTRCMP(n[1],"PSK") == 0)
  21015. keaStr = "RSAPSK";
  21016. else if (XSTRCMP(n[0],"SRP") == 0)
  21017. keaStr = "SRP";
  21018. else if (XSTRCMP(n[0],"PSK") == 0)
  21019. keaStr = "PSK";
  21020. else if (XSTRCMP(n[0],"EDH") == 0)
  21021. keaStr = "EDH";
  21022. else if ((XSTRCMP(n[1],"SHA") == 0) || (XSTRCMP(n[2],"SHA") == 0) ||
  21023. (XSTRCMP(n[3],"SHA") == 0) || (XSTRCMP(n[4],"SHA") == 0) ||
  21024. (XSTRCMP(n[2],"RSA") == 0) || (XSTRCMP(n[0],"AES128") == 0) ||
  21025. (XSTRCMP(n[0],"AES256") == 0) || (XSTRCMP(n[1],"MD5") == 0))
  21026. keaStr = "RSA";
  21027. else if (XSTRCMP(n[0],"NULL") == 0)
  21028. keaStr = "None";
  21029. else
  21030. keaStr = "unknown";
  21031. return keaStr;
  21032. }
  21033. #if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
  21034. PRAGMA_GCC_DIAG_POP
  21035. #endif
  21036. const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
  21037. const char* authStr = NULL;
  21038. if ((XSTRCMP(n[0],"AES128") == 0) || (XSTRCMP(n[0],"AES256") == 0) ||
  21039. ((XSTRCMP(n[0],"TLS13") == 0) && ((XSTRCMP(n[1],"AES128") == 0) ||
  21040. (XSTRCMP(n[1],"AES256") == 0) || (XSTRCMP(n[1],"CHACHA20") == 0))) ||
  21041. (XSTRCMP(n[0],"RSA") == 0) || (XSTRCMP(n[1],"RSA") == 0) ||
  21042. (XSTRCMP(n[1],"SHA") == 0) || (XSTRCMP(n[2],"SHA") == 0) ||
  21043. (XSTRCMP(n[1],"MD5") == 0))
  21044. authStr = "RSA";
  21045. else if (XSTRCMP(n[0],"PSK") == 0 || XSTRCMP(n[1],"PSK") == 0)
  21046. authStr = "PSK";
  21047. else if (XSTRCMP(n[0],"SRP") == 0 && XSTRCMP(n[1],"AES") == 0)
  21048. authStr = "SRP";
  21049. else if (XSTRCMP(n[1],"ECDSA") == 0)
  21050. authStr = "ECDSA";
  21051. else if (XSTRCMP(n[0],"ADH") == 0 || XSTRCMP(n[0],"NULL") == 0)
  21052. authStr = "None";
  21053. else
  21054. authStr = "unknown";
  21055. return authStr;
  21056. }
  21057. const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
  21058. const char* encStr = NULL;
  21059. if ((XSTRCMP(n[0],"AES256") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  21060. (XSTRCMP(n[1],"AES256") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  21061. (XSTRCMP(n[2],"AES256") == 0 && XSTRCMP(n[3],"GCM") == 0))
  21062. encStr = "AESGCM(256)";
  21063. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  21064. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  21065. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"GCM") == 0))
  21066. encStr = "AESGCM(128)";
  21067. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"CCM") == 0) ||
  21068. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"CCM") == 0) ||
  21069. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"CCM") == 0))
  21070. encStr = "AESCCM(128)";
  21071. else if ((XSTRCMP(n[0],"AES128") == 0) ||
  21072. (XSTRCMP(n[1],"AES128") == 0) ||
  21073. (XSTRCMP(n[2],"AES128") == 0) ||
  21074. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"128") == 0) ||
  21075. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"128") == 0))
  21076. encStr = "AES(128)";
  21077. else if ((XSTRCMP(n[0],"AES256") == 0) ||
  21078. (XSTRCMP(n[1],"AES256") == 0) ||
  21079. (XSTRCMP(n[2],"AES256") == 0) ||
  21080. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"256") == 0) ||
  21081. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"256") == 0))
  21082. encStr = "AES(256)";
  21083. else if ((XSTRCMP(n[0],"CAMELLIA256") == 0) ||
  21084. (XSTRCMP(n[2],"CAMELLIA256") == 0))
  21085. encStr = "CAMELLIA(256)";
  21086. else if ((XSTRCMP(n[0],"CAMELLIA128") == 0) ||
  21087. (XSTRCMP(n[2],"CAMELLIA128") == 0))
  21088. encStr = "CAMELLIA(128)";
  21089. else if ((XSTRCMP(n[0],"RC4") == 0) || (XSTRCMP(n[1],"RC4") == 0) ||
  21090. (XSTRCMP(n[2],"RC4") == 0))
  21091. encStr = "RC4";
  21092. else if (((XSTRCMP(n[0],"DES") == 0) || (XSTRCMP(n[1],"DES") == 0) ||
  21093. (XSTRCMP(n[2],"DES") == 0)) &&
  21094. ((XSTRCMP(n[1],"CBC3") == 0) || (XSTRCMP(n[2],"CBC3") == 0) ||
  21095. (XSTRCMP(n[3],"CBC3") == 0)))
  21096. encStr = "3DES";
  21097. else if ((XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  21098. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  21099. encStr = "CHACHA20/POLY1305(256)";
  21100. else if ((XSTRCMP(n[0],"NULL") == 0) || (XSTRCMP(n[1],"NULL") == 0) ||
  21101. (XSTRCMP(n[2],"NULL") == 0) ||
  21102. ((XSTRCMP(n[0],"TLS13") == 0) && (XSTRCMP(n[3],"") == 0)))
  21103. encStr = "None";
  21104. else
  21105. encStr = "unknown";
  21106. return encStr;
  21107. }
  21108. /* Check if a cipher is AEAD
  21109. * @param n return segment cipher name
  21110. * return 1 if the cipher is AEAD, otherwise 0
  21111. */
  21112. int IsCipherAEAD(char n[][MAX_SEGMENT_SZ])
  21113. {
  21114. WOLFSSL_ENTER("IsCipherAEAD");
  21115. if (n == NULL) {
  21116. WOLFSSL_MSG("bad function argumet. n is NULL.");
  21117. return 0;
  21118. }
  21119. if ((XSTRCMP(n[2],"GCM") == 0) || (XSTRCMP(n[3],"GCM") == 0) ||
  21120. (XSTRCMP(n[1],"CCM") == 0) ||
  21121. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  21122. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  21123. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  21124. return 1;
  21125. return 0;
  21126. }
  21127. /* Returns the MAC string of a cipher or "unknown" on failure */
  21128. const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
  21129. const char* macStr = NULL;
  21130. if ((XSTRCMP(n[4],"SHA256") == 0) || (XSTRCMP(n[3],"SHA256") == 0) ||
  21131. (XSTRCMP(n[2],"SHA256") == 0) || (XSTRCMP(n[1],"SHA256") == 0))
  21132. macStr = "SHA256";
  21133. else if ((XSTRCMP(n[4],"SHA384") == 0) ||
  21134. (XSTRCMP(n[3],"SHA384") == 0) ||
  21135. (XSTRCMP(n[2],"SHA384") == 0) ||
  21136. (XSTRCMP(n[1],"SHA384") == 0))
  21137. macStr = "SHA384";
  21138. else if ((XSTRCMP(n[4],"SHA") == 0) || (XSTRCMP(n[3],"SHA") == 0) ||
  21139. (XSTRCMP(n[2],"SHA") == 0) || (XSTRCMP(n[1],"SHA") == 0) ||
  21140. (XSTRCMP(n[1],"MD5") == 0))
  21141. macStr = "SHA1";
  21142. else if ((XSTRCMP(n[3],"GCM") == 0) ||
  21143. (XSTRCMP(n[1],"CCM") == 0) ||
  21144. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  21145. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  21146. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  21147. macStr = "AEAD";
  21148. else
  21149. macStr = "unknown";
  21150. return macStr;
  21151. }
  21152. /* Returns the number of bits based on the cipher enc string, or 0 on failure */
  21153. int SetCipherBits(const char* enc) {
  21154. int ret = WOLFSSL_FAILURE;
  21155. if ((XSTRCMP(enc,"AESGCM(256)") == 0) ||
  21156. (XSTRCMP(enc,"AES(256)") == 0) ||
  21157. (XSTRCMP(enc,"CAMELLIA(256)") == 0) ||
  21158. (XSTRCMP(enc,"CHACHA20/POLY1305(256)") == 0))
  21159. ret = 256;
  21160. else if
  21161. ((XSTRCMP(enc,"3DES") == 0))
  21162. ret = 168;
  21163. else if
  21164. ((XSTRCMP(enc,"AESGCM(128)") == 0) ||
  21165. (XSTRCMP(enc,"AES(128)") == 0) ||
  21166. (XSTRCMP(enc,"CAMELLIA(128)") == 0) ||
  21167. (XSTRCMP(enc,"RC4") == 0))
  21168. ret = 128;
  21169. else if
  21170. ((XSTRCMP(enc,"DES") == 0))
  21171. ret = 56;
  21172. return ret;
  21173. }
  21174. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  21175. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  21176. {
  21177. #ifndef NO_ERROR_STRINGS
  21178. int i;
  21179. const char* nameIana = "NONE";
  21180. for (i = 0; i < GetCipherNamesSize(); i++) {
  21181. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  21182. (cipher_names[i].cipherSuite == cipherSuite)
  21183. #ifndef NO_CIPHER_SUITE_ALIASES
  21184. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  21185. #endif
  21186. ) {
  21187. nameIana = cipher_names[i].name_iana;
  21188. break;
  21189. }
  21190. }
  21191. return nameIana;
  21192. #else
  21193. (void)cipherSuite0;
  21194. (void)cipherSuite;
  21195. return NULL;
  21196. #endif
  21197. }
  21198. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  21199. {
  21200. if (ssl == NULL) {
  21201. return NULL;
  21202. }
  21203. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  21204. }
  21205. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  21206. {
  21207. if (ssl == NULL) {
  21208. return NULL;
  21209. }
  21210. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  21211. }
  21212. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  21213. byte* cipherSuite, int* flags)
  21214. {
  21215. int ret = BAD_FUNC_ARG;
  21216. int i;
  21217. unsigned long len;
  21218. const char* nameDelim;
  21219. /* Support trailing : */
  21220. nameDelim = XSTRSTR(name, ":");
  21221. if (nameDelim)
  21222. len = (unsigned long)(nameDelim - name);
  21223. else
  21224. len = (unsigned long)XSTRLEN(name);
  21225. for (i = 0; i < GetCipherNamesSize(); i++) {
  21226. if ((XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
  21227. (cipher_names[i].name[len] == 0)) {
  21228. *cipherSuite0 = cipher_names[i].cipherSuite0;
  21229. *cipherSuite = cipher_names[i].cipherSuite;
  21230. *flags = cipher_names[i].flags;
  21231. ret = 0;
  21232. break;
  21233. }
  21234. }
  21235. return ret;
  21236. }
  21237. /**
  21238. Set the enabled cipher suites.
  21239. With OPENSSL_EXTRA we attempt to understand some of the available "bulk"
  21240. ciphersuites. We can not perfectly filter ciphersuites based on the "bulk"
  21241. names but we do what we can. Ciphersuites named explicitly take precedence to
  21242. ciphersuites introduced through the "bulk" ciphersuites.
  21243. @param [out] suites Suites structure.
  21244. @param [in] list List of cipher suites, only supports full name from
  21245. cipher_names[] delimited by ':'.
  21246. @return true on success, else false.
  21247. */
  21248. int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list)
  21249. {
  21250. int ret = 0;
  21251. int idx = 0;
  21252. int haveRSAsig = 0;
  21253. int haveECDSAsig = 0;
  21254. int haveFalconSig = 0;
  21255. int haveDilithiumSig = 0;
  21256. int haveAnon = 0;
  21257. #ifdef OPENSSL_EXTRA
  21258. int haveRSA = 0;
  21259. int haveDH = 0;
  21260. int haveECC = 0;
  21261. int haveStaticRSA = 1; /* allowed by default if compiled in */
  21262. int haveStaticECC = 0;
  21263. int haveNull = 1; /* allowed by default if compiled in */
  21264. int callInitSuites = 0;
  21265. int havePSK = 0;
  21266. #endif
  21267. const int suiteSz = GetCipherNamesSize();
  21268. const char* next = list;
  21269. if (suites == NULL || list == NULL) {
  21270. WOLFSSL_MSG("SetCipherList parameter error");
  21271. return 0;
  21272. }
  21273. if (next[0] == 0 || XSTRCMP(next, "ALL") == 0 ||
  21274. XSTRCMP(next, "DEFAULT") == 0 || XSTRCMP(next, "HIGH") == 0)
  21275. return 1; /* wolfSSL default */
  21276. do {
  21277. const char* current = next;
  21278. char name[MAX_SUITE_NAME + 1];
  21279. int i;
  21280. word32 length;
  21281. #ifdef OPENSSL_EXTRA
  21282. int allowing = 1;
  21283. #endif
  21284. next = XSTRSTR(next, ":");
  21285. length = MAX_SUITE_NAME;
  21286. if (next != NULL) {
  21287. word32 currLen = (word32)(next - current);
  21288. if (length > currLen) {
  21289. length = currLen;
  21290. }
  21291. }
  21292. #ifdef OPENSSL_EXTRA
  21293. if (length > 1) {
  21294. if (*current == '!') {
  21295. allowing = 0;
  21296. current++;
  21297. length--;
  21298. }
  21299. }
  21300. #endif
  21301. XSTRNCPY(name, current, length);
  21302. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  21303. #ifdef OPENSSL_EXTRA
  21304. if (XSTRCMP(name, "DEFAULT") == 0 || XSTRCMP(name, "ALL") == 0) {
  21305. if (XSTRCMP(name, "ALL") == 0)
  21306. haveAnon = 1;
  21307. else
  21308. haveAnon = 0;
  21309. #ifdef HAVE_ANON
  21310. ctx->haveAnon = haveAnon;
  21311. #endif
  21312. haveRSA = 1;
  21313. haveDH = 1;
  21314. haveECC = 1;
  21315. haveStaticECC = 1;
  21316. haveStaticRSA = 1;
  21317. haveRSAsig = 1;
  21318. havePSK = 1;
  21319. haveNull = 0;
  21320. callInitSuites = 1;
  21321. ret = 1;
  21322. continue;
  21323. }
  21324. /* We don't have a way to disallow high bit sizes. Only disable unsafe
  21325. * ciphersuites. */
  21326. if (XSTRCMP(name, "HIGH") == 0 && allowing) {
  21327. /* Disable static, anonymous, and null ciphers */
  21328. haveAnon = 0;
  21329. #ifdef HAVE_ANON
  21330. ctx->haveAnon = 0;
  21331. #endif
  21332. haveRSA = 1;
  21333. haveDH = 1;
  21334. haveECC = 1;
  21335. haveStaticECC = 0;
  21336. haveStaticRSA = 0;
  21337. haveRSAsig = 1;
  21338. havePSK = 1;
  21339. haveNull = 0;
  21340. callInitSuites = 1;
  21341. ret = 1;
  21342. continue;
  21343. }
  21344. if (XSTRCMP(name, "aNULL") == 0) {
  21345. haveAnon = allowing;
  21346. #ifdef HAVE_ANON
  21347. ctx->haveAnon = allowing;
  21348. #endif
  21349. if (allowing) {
  21350. /* Allow RSA by default. */
  21351. if (!haveECC)
  21352. haveRSA = 1;
  21353. if (!haveECDSAsig)
  21354. haveRSAsig = 1;
  21355. callInitSuites = 1;
  21356. ret = 1;
  21357. }
  21358. continue;
  21359. }
  21360. if (XSTRCMP(name, "eNULL") == 0 || XSTRCMP(name, "NULL") == 0) {
  21361. haveNull = allowing;
  21362. if (allowing) {
  21363. /* Allow RSA by default. */
  21364. if (!haveECC)
  21365. haveRSA = 1;
  21366. if (!haveECDSAsig)
  21367. haveRSAsig = 1;
  21368. callInitSuites = 1;
  21369. ret = 1;
  21370. }
  21371. continue;
  21372. }
  21373. if (XSTRCMP(name, "kDH") == 0) {
  21374. haveStaticECC = allowing;
  21375. if (allowing) {
  21376. haveECC = 1;
  21377. haveECDSAsig = 1;
  21378. callInitSuites = 1;
  21379. ret = 1;
  21380. }
  21381. continue;
  21382. }
  21383. if (XSTRCMP(name, "kRSA") == 0 || XSTRCMP(name, "RSA") == 0) {
  21384. haveStaticRSA = allowing;
  21385. if (allowing) {
  21386. haveRSA = 1;
  21387. haveRSAsig = 1;
  21388. callInitSuites = 1;
  21389. ret = 1;
  21390. }
  21391. continue;
  21392. }
  21393. if (XSTRCMP(name, "PSK") == 0) {
  21394. havePSK = allowing;
  21395. haveRSAsig = 1;
  21396. if (allowing) {
  21397. /* Allow RSA by default. */
  21398. if (!haveECC)
  21399. haveRSA = 1;
  21400. if (!haveECDSAsig)
  21401. haveRSAsig = 1;
  21402. callInitSuites = 1;
  21403. ret = 1;
  21404. }
  21405. continue;
  21406. }
  21407. if (XSTRCMP(name, "LOW") == 0 || XSTRCMP(name, "MEDIUM") == 0) {
  21408. /* No way to limit or allow low bit sizes */
  21409. if (allowing) {
  21410. /* Allow RSA by default */
  21411. haveRSA = 1;
  21412. haveRSAsig = 1;
  21413. callInitSuites = 1;
  21414. ret = 1;
  21415. }
  21416. continue;
  21417. }
  21418. if (XSTRCMP(name, "DSS") == 0) {
  21419. /* No support for DSA ciphersuites */
  21420. continue;
  21421. }
  21422. if (XSTRCMP(name, "EXP") == 0 || XSTRCMP(name, "EXPORT") == 0) {
  21423. /* wolfSSL doesn't support "export" ciphers. We can skip this */
  21424. continue;
  21425. }
  21426. #endif /* OPENSSL_EXTRA */
  21427. for (i = 0; i < suiteSz; i++) {
  21428. int j;
  21429. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  21430. #ifndef NO_ERROR_STRINGS
  21431. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  21432. #endif
  21433. ) {
  21434. #ifdef WOLFSSL_DTLS
  21435. /* don't allow stream ciphers with DTLS */
  21436. if (ctx->method->version.major == DTLS_MAJOR) {
  21437. if (XSTRSTR(name, "RC4"))
  21438. {
  21439. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  21440. continue;
  21441. }
  21442. }
  21443. #endif /* WOLFSSL_DTLS */
  21444. for (j = 0; j < idx; j += 2) {
  21445. if ((suites->suites[j+0] == cipher_names[i].cipherSuite0) &&
  21446. (suites->suites[j+1] == cipher_names[i].cipherSuite)) {
  21447. break;
  21448. }
  21449. }
  21450. /* Silently drop duplicates from list. */
  21451. if (j != idx) {
  21452. break;
  21453. }
  21454. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  21455. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  21456. return 0; /* suites buffer not large enough, error out */
  21457. }
  21458. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  21459. suites->suites[idx++] = cipher_names[i].cipherSuite;
  21460. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  21461. * suites don't necessarily have RSA in the name. */
  21462. #ifdef WOLFSSL_TLS13
  21463. if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
  21464. (cipher_names[i].cipherSuite0 == ECC_BYTE &&
  21465. (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
  21466. cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
  21467. #ifndef NO_RSA
  21468. haveRSAsig = 1;
  21469. #endif
  21470. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  21471. defined(HAVE_ED448)
  21472. haveECDSAsig = 1;
  21473. #endif
  21474. #if defined(HAVE_PQC)
  21475. #ifdef HAVE_FALCON
  21476. haveFalconSig = 1;
  21477. #endif /* HAVE_FALCON */
  21478. #ifdef HAVE_DILITHIUM
  21479. haveDilithiumSig = 1;
  21480. #endif /* HAVE_DILITHIUM */
  21481. #endif /* HAVE_PQC */
  21482. }
  21483. else
  21484. #endif
  21485. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  21486. defined(HAVE_ED448)
  21487. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  21488. haveECDSAsig = 1;
  21489. else
  21490. #endif
  21491. #ifdef HAVE_ANON
  21492. if (XSTRSTR(name, "ADH"))
  21493. haveAnon = 1;
  21494. else
  21495. #endif
  21496. if (haveRSAsig == 0
  21497. #ifndef NO_PSK
  21498. && (XSTRSTR(name, "PSK") == NULL)
  21499. #endif
  21500. ) {
  21501. haveRSAsig = 1;
  21502. }
  21503. ret = 1; /* found at least one */
  21504. break;
  21505. }
  21506. }
  21507. }
  21508. while (next++); /* ++ needed to skip ':' */
  21509. if (ret) {
  21510. int keySz = 0;
  21511. #ifndef NO_CERTS
  21512. keySz = ctx->privateKeySz;
  21513. #endif
  21514. #ifdef OPENSSL_EXTRA
  21515. if (callInitSuites) {
  21516. byte tmp[WOLFSSL_MAX_SUITE_SZ];
  21517. XMEMCPY(tmp, suites->suites, idx); /* Store copy */
  21518. suites->setSuites = 0; /* Force InitSuites */
  21519. suites->hashSigAlgoSz = 0; /* Force InitSuitesHashSigAlgo call
  21520. * inside InitSuites */
  21521. InitSuites(suites, ctx->method->version, keySz, (word16)haveRSA,
  21522. (word16)havePSK, (word16)haveDH, (word16)haveECDSAsig,
  21523. (word16)haveECC, (word16)haveStaticRSA,
  21524. (word16)haveStaticECC, (word16)haveFalconSig,
  21525. (word16)haveDilithiumSig, (word16)haveAnon,
  21526. (word16)haveNull, ctx->method->side);
  21527. /* Restore user ciphers ahead of defaults */
  21528. XMEMMOVE(suites->suites + idx, suites->suites,
  21529. min(suites->suiteSz, WOLFSSL_MAX_SUITE_SZ-idx));
  21530. suites->suiteSz += (word16)idx;
  21531. }
  21532. else
  21533. #endif
  21534. {
  21535. suites->suiteSz = (word16)idx;
  21536. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig,
  21537. haveFalconSig, haveDilithiumSig, haveAnon,
  21538. 1, keySz);
  21539. }
  21540. suites->setSuites = 1;
  21541. }
  21542. (void)ctx;
  21543. return ret;
  21544. }
  21545. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)
  21546. int SetCipherListFromBytes(WOLFSSL_CTX* ctx, Suites* suites, const byte* list,
  21547. const int listSz)
  21548. {
  21549. int ret = 0;
  21550. int idx = 0;
  21551. int i;
  21552. int haveRSAsig = 0;
  21553. int haveECDSAsig = 0;
  21554. int haveFalconSig = 0;
  21555. int haveDilithiumSig = 0;
  21556. int haveAnon = 0;
  21557. if (suites == NULL || list == NULL) {
  21558. WOLFSSL_MSG("SetCipherListFromBytes parameter error");
  21559. return 0;
  21560. }
  21561. if ((listSz % 2) != 0) {
  21562. return 0;
  21563. }
  21564. for (i = 0; (i + 1) < listSz; i += 2) {
  21565. const byte firstByte = list[i];
  21566. const byte secondByte = list[i + 1];
  21567. const char* name = NULL;
  21568. int j;
  21569. name = GetCipherNameInternal(firstByte, secondByte);
  21570. if (XSTRCMP(name, "None") == 0) {
  21571. /* bytes don't match any known cipher */
  21572. continue;
  21573. }
  21574. #ifdef WOLFSSL_DTLS
  21575. /* don't allow stream ciphers with DTLS */
  21576. if (ctx->method->version.major == DTLS_MAJOR) {
  21577. if (XSTRSTR(name, "RC4")) {
  21578. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  21579. continue;
  21580. }
  21581. }
  21582. #endif /* WOLFSSL_DTLS */
  21583. for (j = 0; j < idx; j += 2) {
  21584. if ((suites->suites[j+0] == firstByte) &&
  21585. (suites->suites[j+1] == secondByte)) {
  21586. break;
  21587. }
  21588. }
  21589. /* Silently drop duplicates from list. */
  21590. if (j != idx) {
  21591. continue;
  21592. }
  21593. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  21594. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  21595. return 0; /* suites buffer not large enough, error out */
  21596. }
  21597. suites->suites[idx++] = firstByte;
  21598. suites->suites[idx++] = secondByte;
  21599. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  21600. * suites don't necessarily have RSA in the name. */
  21601. #ifdef WOLFSSL_TLS13
  21602. if (firstByte == TLS13_BYTE || (firstByte == ECC_BYTE &&
  21603. (secondByte == TLS_SHA256_SHA256 ||
  21604. secondByte == TLS_SHA384_SHA384))) {
  21605. #ifndef NO_RSA
  21606. haveRSAsig = 1;
  21607. #endif
  21608. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  21609. haveECDSAsig = 1;
  21610. #endif
  21611. #if defined(HAVE_PQC)
  21612. #ifdef HAVE_FALCON
  21613. haveFalconSig = 1;
  21614. #endif /* HAVE_FALCON */
  21615. #ifdef HAVE_DILITHIUM
  21616. haveDilithiumSig = 1;
  21617. #endif /* HAVE_DILITHIUM */
  21618. #endif /* HAVE_PQC */
  21619. }
  21620. else
  21621. #endif /* WOLFSSL_TLS13 */
  21622. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  21623. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  21624. haveECDSAsig = 1;
  21625. else
  21626. #endif
  21627. #ifdef HAVE_ANON
  21628. if (XSTRSTR(name, "ADH"))
  21629. haveAnon = 1;
  21630. else
  21631. #endif
  21632. if (haveRSAsig == 0
  21633. #ifndef NO_PSK
  21634. && (XSTRSTR(name, "PSK") == NULL)
  21635. #endif
  21636. ) {
  21637. haveRSAsig = 1;
  21638. }
  21639. ret = 1; /* found at least one */
  21640. }
  21641. if (ret) {
  21642. int keySz = 0;
  21643. #ifndef NO_CERTS
  21644. keySz = ctx->privateKeySz;
  21645. #endif
  21646. suites->suiteSz = (word16)idx;
  21647. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig, haveFalconSig,
  21648. haveDilithiumSig, haveAnon, 1, keySz);
  21649. suites->setSuites = 1;
  21650. }
  21651. (void)ctx;
  21652. return ret;
  21653. }
  21654. #endif /* OPENSSL_EXTRA */
  21655. #ifdef OPENSSL_EXTRA
  21656. struct mac_algs {
  21657. byte alg;
  21658. const char* name;
  21659. } mac_names[] = {
  21660. #ifndef NO_SHA256
  21661. { sha256_mac, "SHA256" },
  21662. #endif
  21663. #ifdef WOLFSSL_SHA384
  21664. { sha384_mac, "SHA384" },
  21665. #endif
  21666. #ifdef WOLFSSL_SHA512
  21667. { sha512_mac, "SHA512" },
  21668. #endif
  21669. #ifdef WOLFSSL_SHA224
  21670. { sha224_mac, "SHA224" },
  21671. #endif
  21672. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  21673. defined(WOLFSSL_ALLOW_TLS_SHA1))
  21674. { sha_mac, "SHA1" },
  21675. #endif
  21676. };
  21677. #define MAC_NAMES_SZ (int)(sizeof(mac_names)/sizeof(*mac_names))
  21678. /* Convert the hash algorithm string to a TLS MAC algorithm num. */
  21679. static byte GetMacAlgFromName(const char* name, int len)
  21680. {
  21681. byte alg = no_mac;
  21682. int i;
  21683. for (i = 0; i < MAC_NAMES_SZ; i++) {
  21684. if (((int)XSTRLEN(mac_names[i].name) == len) &&
  21685. (XMEMCMP(mac_names[i].name, name, len) == 0)) {
  21686. alg = mac_names[i].alg;
  21687. break;
  21688. }
  21689. }
  21690. return alg;
  21691. }
  21692. struct sig_algs {
  21693. byte alg;
  21694. const char* name;
  21695. } sig_names[] = {
  21696. #ifndef NO_RSA
  21697. { rsa_sa_algo, "RSA" },
  21698. #ifdef WC_RSA_PSS
  21699. { rsa_pss_sa_algo, "RSA-PSS" },
  21700. { rsa_pss_sa_algo, "PSS" },
  21701. #endif
  21702. #endif
  21703. #ifdef HAVE_ECC
  21704. { ecc_dsa_sa_algo, "ECDSA" },
  21705. #endif
  21706. #ifdef HAVE_ED25519
  21707. { ed25519_sa_algo, "ED25519" },
  21708. #endif
  21709. #ifdef HAVE_ED448
  21710. { ed448_sa_algo, "ED448" },
  21711. #endif
  21712. #ifndef NO_DSA
  21713. { dsa_sa_algo, "DSA" },
  21714. #endif
  21715. };
  21716. #define SIG_NAMES_SZ (int)(sizeof(sig_names)/sizeof(*sig_names))
  21717. /* Convert the signature algorithm string to a TLS signature algorithm num. */
  21718. static byte GetSigAlgFromName(const char* name, int len)
  21719. {
  21720. byte alg = anonymous_sa_algo;
  21721. int i;
  21722. for (i = 0; i < SIG_NAMES_SZ; i++) {
  21723. if (((int)XSTRLEN(sig_names[i].name) == len) &&
  21724. (XMEMCMP(sig_names[i].name, name, len) == 0)) {
  21725. alg = sig_names[i].alg;
  21726. break;
  21727. }
  21728. }
  21729. return alg;
  21730. }
  21731. /* Set the hash/signature algorithms that are supported for certificate signing.
  21732. *
  21733. * suites [in,out] Cipher suites and signature algorithms.
  21734. * list [in] String representing hash/signature algorithms to set.
  21735. * returns 0 on failure.
  21736. * 1 on success.
  21737. */
  21738. int SetSuitesHashSigAlgo(Suites* suites, const char* list)
  21739. {
  21740. int ret = 1;
  21741. word16 idx = 0;
  21742. const char* s = list;
  21743. byte sig_alg = 0;
  21744. byte mac_alg = no_mac;
  21745. /* Setting is destructive on error. */
  21746. suites->hashSigAlgoSz = 0;
  21747. do {
  21748. if (*list == '+') {
  21749. if (mac_alg != 0) {
  21750. ret = 0;
  21751. break;
  21752. }
  21753. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  21754. if (sig_alg == 0) {
  21755. ret = 0;
  21756. break;
  21757. }
  21758. s = list + 1;
  21759. }
  21760. else if (*list == ':' || *list == '\0') {
  21761. if (sig_alg == 0) {
  21762. /* No signature algorithm set yet.
  21763. * Ed25519 and Ed448 have implied MAC algorithm.
  21764. */
  21765. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  21766. if (sig_alg != ed25519_sa_algo && sig_alg != ed448_sa_algo) {
  21767. ret = 0;
  21768. break;
  21769. }
  21770. }
  21771. else {
  21772. mac_alg = GetMacAlgFromName(s, (int)(list - s));
  21773. if (mac_alg == 0) {
  21774. ret = 0;
  21775. break;
  21776. }
  21777. }
  21778. AddSuiteHashSigAlgo(suites, mac_alg, sig_alg, 0, &idx);
  21779. sig_alg = 0;
  21780. mac_alg = no_mac;
  21781. s = list + 1;
  21782. }
  21783. list++;
  21784. }
  21785. while (*(list-1) != '\0');
  21786. if (s != list && (sig_alg != 0 || mac_alg != 0)) {
  21787. ret = 0;
  21788. }
  21789. else {
  21790. suites->hashSigAlgoSz = idx;
  21791. }
  21792. return ret;
  21793. }
  21794. #endif /* OPENSSL_EXTRA */
  21795. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  21796. static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
  21797. {
  21798. #ifdef HAVE_ED25519
  21799. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  21800. /* Certificate has Ed25519 key, only match with Ed25519 sig alg */
  21801. return sigAlgo == ed25519_sa_algo;
  21802. }
  21803. #endif
  21804. #ifdef HAVE_ED448
  21805. if (ssl->pkCurveOID == ECC_ED448_OID) {
  21806. /* Certificate has Ed448 key, only match with Ed448 sig alg */
  21807. return sigAlgo == ed448_sa_algo;
  21808. }
  21809. #endif
  21810. #ifdef HAVE_PQC
  21811. #ifdef HAVE_FALCON
  21812. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1) {
  21813. /* Certificate has Falcon level 1 key, only match with Falcon level 1
  21814. * sig alg */
  21815. return sigAlgo == falcon_level1_sa_algo;
  21816. }
  21817. if (ssl->pkCurveOID == CTC_FALCON_LEVEL5) {
  21818. /* Certificate has Falcon level 5 key, only match with Falcon level 5
  21819. * sig alg */
  21820. return sigAlgo == falcon_level5_sa_algo;
  21821. }
  21822. #endif /* HAVE_FALCON */
  21823. #ifdef HAVE_DILITHIUM
  21824. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2) {
  21825. /* Certificate has Dilithium level 2 key, only match with it. */
  21826. return sigAlgo == dilithium_level2_sa_algo;
  21827. }
  21828. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3) {
  21829. /* Certificate has Dilithium level 3 key, only match with it. */
  21830. return sigAlgo == dilithium_level3_sa_algo;
  21831. }
  21832. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5) {
  21833. /* Certificate has Dilithium level 5 key, only match with it. */
  21834. return sigAlgo == dilithium_level5_sa_algo;
  21835. }
  21836. if (ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL2) {
  21837. /* Certificate has Dilithium AES level 2 key, only match with it. */
  21838. return sigAlgo == dilithium_aes_level2_sa_algo;
  21839. }
  21840. if (ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL3) {
  21841. /* Certificate has Dilithium AES level 3 key, only match with it. */
  21842. return sigAlgo == dilithium_aes_level3_sa_algo;
  21843. }
  21844. if (ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL5) {
  21845. /* Certificate has Dilithium AES level 5 key, only match with it. */
  21846. return sigAlgo == dilithium_aes_level5_sa_algo;
  21847. }
  21848. #endif /* HAVE_DILITHIUM */
  21849. #endif /* HAVE_PQC */
  21850. #ifdef WC_RSA_PSS
  21851. /* RSA certificate and PSS sig alg. */
  21852. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  21853. #if defined(WOLFSSL_TLS13)
  21854. /* TLS 1.3 only supports RSA-PSS. */
  21855. if (IsAtLeastTLSv1_3(ssl->version))
  21856. return sigAlgo == rsa_pss_sa_algo;
  21857. #endif
  21858. /* TLS 1.2 and below - RSA-PSS allowed. */
  21859. if (sigAlgo == rsa_pss_sa_algo)
  21860. return 1;
  21861. }
  21862. #endif
  21863. /* Signature algorithm matches certificate. */
  21864. return sigAlgo == ssl->suites->sigAlgo;
  21865. }
  21866. #if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
  21867. defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  21868. static int CmpEccStrength(int hashAlgo, int curveSz)
  21869. {
  21870. int dgstSz = GetMacDigestSize((byte)hashAlgo);
  21871. if (dgstSz <= 0)
  21872. return -1;
  21873. return dgstSz - (curveSz & (~0x3));
  21874. }
  21875. #endif
  21876. static byte MinHashAlgo(WOLFSSL* ssl)
  21877. {
  21878. #ifdef WOLFSSL_TLS13
  21879. if (IsAtLeastTLSv1_3(ssl->version)) {
  21880. return sha256_mac;
  21881. }
  21882. #endif
  21883. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
  21884. if (IsAtLeastTLSv1_2(ssl)) {
  21885. return sha256_mac;
  21886. }
  21887. #endif /* WOLFSSL_NO_TLS12 */
  21888. (void)ssl;
  21889. return sha_mac;
  21890. }
  21891. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  21892. {
  21893. word32 i;
  21894. int ret = MATCH_SUITE_ERROR;
  21895. byte minHash;
  21896. /* set defaults */
  21897. if (IsAtLeastTLSv1_3(ssl->version)) {
  21898. #ifndef NO_CERTS
  21899. /* TLS 1.3 cipher suites don't have public key algorithms in them.
  21900. * Using the one in the certificate - if any.
  21901. */
  21902. ssl->suites->sigAlgo = ssl->buffers.keyType;
  21903. #endif
  21904. }
  21905. else {
  21906. ssl->suites->sigAlgo = ssl->specs.sig_algo;
  21907. }
  21908. if (ssl->suites->sigAlgo == anonymous_sa_algo) {
  21909. /* PSK ciphersuite - get digest to use from cipher suite */
  21910. ssl->suites->hashAlgo = ssl->specs.mac_algorithm;
  21911. return 0;
  21912. }
  21913. ssl->suites->hashAlgo = minHash = MinHashAlgo(ssl);
  21914. /* No list means go with the defaults. */
  21915. if (hashSigAlgoSz == 0)
  21916. return 0;
  21917. /* i+1 since two bytes used to describe hash and signature algorithm */
  21918. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  21919. byte hashAlgo = 0, sigAlgo = 0;
  21920. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  21921. /* Keep looking if hash algorithm not strong enough. */
  21922. if (hashAlgo < minHash)
  21923. continue;
  21924. /* Keep looking if signature algorithm isn't supported by cert. */
  21925. if (!MatchSigAlgo(ssl, sigAlgo))
  21926. continue;
  21927. #ifdef HAVE_ED25519
  21928. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  21929. /* Matched Ed25519 - set chosen and finished. */
  21930. ssl->suites->sigAlgo = sigAlgo;
  21931. ssl->suites->hashAlgo = hashAlgo;
  21932. ret = 0;
  21933. break;
  21934. }
  21935. #endif
  21936. #ifdef HAVE_ED448
  21937. if (ssl->pkCurveOID == ECC_ED448_OID) {
  21938. /* Matched Ed448 - set chosen and finished. */
  21939. ssl->suites->sigAlgo = sigAlgo;
  21940. ssl->suites->hashAlgo = hashAlgo;
  21941. ret = 0;
  21942. break;
  21943. }
  21944. #endif
  21945. #if defined(HAVE_PQC)
  21946. #if defined(HAVE_FALCON)
  21947. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1 ||
  21948. ssl->pkCurveOID == CTC_FALCON_LEVEL5 ) {
  21949. /* Matched Falcon - set chosen and finished. */
  21950. ssl->suites->sigAlgo = sigAlgo;
  21951. ssl->suites->hashAlgo = hashAlgo;
  21952. ret = 0;
  21953. break;
  21954. }
  21955. #endif /* HAVE_FALCON */
  21956. #if defined(HAVE_DILITHIUM)
  21957. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2 ||
  21958. ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3 ||
  21959. ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5 ||
  21960. ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL2 ||
  21961. ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL3 ||
  21962. ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL5 ) {
  21963. /* Matched Dilithium - set chosen and finished. */
  21964. ssl->suites->sigAlgo = sigAlgo;
  21965. ssl->suites->hashAlgo = hashAlgo;
  21966. ret = 0;
  21967. break;
  21968. }
  21969. #endif /* HAVE_DILITHIUM */
  21970. #endif /* HAVE_PQC */
  21971. #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  21972. #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
  21973. "be used together"
  21974. #endif
  21975. #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
  21976. defined(WOLFSSL_ECDSA_MATCH_HASH))
  21977. if (sigAlgo == ecc_dsa_sa_algo
  21978. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  21979. && IsAtLeastTLSv1_3(ssl->version)
  21980. #endif
  21981. ) {
  21982. /* Must be exact match. */
  21983. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  21984. continue;
  21985. /* Matched ECDSA exaclty - set chosen and finished. */
  21986. ssl->suites->hashAlgo = hashAlgo;
  21987. ssl->suites->sigAlgo = sigAlgo;
  21988. ret = 0;
  21989. break;
  21990. }
  21991. #endif
  21992. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  21993. * algorithm that matches the ephemeral ECDHE key size or the next highest
  21994. * available. This workaround resolves issue with some peer's that do not
  21995. * properly support scenarios such as a P-256 key hashed with SHA512.
  21996. */
  21997. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  21998. if (sigAlgo == ecc_dsa_sa_algo) {
  21999. int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
  22000. /* Keep looking if digest not strong enough. */
  22001. if (cmp < 0)
  22002. continue;
  22003. /* Looking for exact match or next highest. */
  22004. if (ret != 0 || hashAlgo <= ssl->suites->hashAlgo) {
  22005. ssl->suites->hashAlgo = hashAlgo;
  22006. ssl->suites->sigAlgo = sigAlgo;
  22007. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  22008. ssl->namedGroup = 0;
  22009. #endif
  22010. ret = 0;
  22011. }
  22012. /* Continue looking if not the same strength. */
  22013. if (cmp > 0)
  22014. continue;
  22015. /* Exact match - finished. */
  22016. break;
  22017. }
  22018. #endif
  22019. switch (hashAlgo) {
  22020. #ifndef NO_SHA
  22021. case sha_mac:
  22022. #endif
  22023. #ifdef WOLFSSL_SHA224
  22024. case sha224_mac:
  22025. #endif
  22026. #ifndef NO_SHA256
  22027. case sha256_mac:
  22028. #endif
  22029. #ifdef WOLFSSL_SHA384
  22030. case sha384_mac:
  22031. #endif
  22032. #ifdef WOLFSSL_SHA512
  22033. case sha512_mac:
  22034. #endif
  22035. #ifdef WOLFSSL_STRONGEST_HASH_SIG
  22036. /* Is hash algorithm weaker than chosen/min? */
  22037. if (hashAlgo < ssl->suites->hashAlgo)
  22038. break;
  22039. #else
  22040. /* Is hash algorithm stonger than last chosen? */
  22041. if (ret == 0 && hashAlgo > ssl->suites->hashAlgo)
  22042. break;
  22043. #endif
  22044. /* The chosen one - but keep looking. */
  22045. ssl->suites->hashAlgo = hashAlgo;
  22046. ssl->suites->sigAlgo = sigAlgo;
  22047. ret = 0;
  22048. break;
  22049. default:
  22050. /* Support for hash algorithm not compiled in. */
  22051. break;
  22052. }
  22053. }
  22054. return ret;
  22055. }
  22056. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  22057. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  22058. /* Initialize HandShakeInfo */
  22059. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  22060. {
  22061. int i;
  22062. info->ssl = ssl;
  22063. info->cipherName[0] = 0;
  22064. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  22065. info->packetNames[i][0] = 0;
  22066. info->numberPackets = 0;
  22067. info->negotiationError = 0;
  22068. }
  22069. /* Set Final HandShakeInfo parameters */
  22070. void FinishHandShakeInfo(HandShakeInfo* info)
  22071. {
  22072. int i;
  22073. int sz = GetCipherNamesSize();
  22074. for (i = 0; i < sz; i++) {
  22075. #ifndef NO_CIPHER_SUITE_ALIASES
  22076. if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  22077. continue;
  22078. #endif
  22079. if (info->ssl->options.cipherSuite ==
  22080. (byte)cipher_names[i].cipherSuite) {
  22081. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  22082. continue; /* ECC suites at end */
  22083. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  22084. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  22085. break;
  22086. }
  22087. }
  22088. /* error max and min are negative numbers */
  22089. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  22090. info->negotiationError = info->ssl->error;
  22091. }
  22092. /* Add name to info packet names, increase packet name count */
  22093. void AddPacketName(WOLFSSL* ssl, const char* name)
  22094. {
  22095. #ifdef WOLFSSL_CALLBACKS
  22096. HandShakeInfo* info = &ssl->handShakeInfo;
  22097. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  22098. char* packetName = info->packetNames[info->numberPackets];
  22099. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  22100. packetName[MAX_PACKETNAME_SZ] = '\0';
  22101. info->numberPackets++;
  22102. }
  22103. #endif
  22104. (void)ssl;
  22105. (void)name;
  22106. }
  22107. #ifdef WOLFSSL_CALLBACKS
  22108. /* Initialize TimeoutInfo */
  22109. void InitTimeoutInfo(TimeoutInfo* info)
  22110. {
  22111. XMEMSET(info, 0, sizeof(TimeoutInfo));
  22112. }
  22113. /* Free TimeoutInfo */
  22114. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  22115. {
  22116. int i;
  22117. (void)heap;
  22118. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  22119. if (info->packets[i].bufferValue) {
  22120. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  22121. info->packets[i].bufferValue = NULL;
  22122. }
  22123. }
  22124. }
  22125. /* Add packet name to previously added packet info */
  22126. void AddLateName(const char* name, TimeoutInfo* info)
  22127. {
  22128. /* make sure we have a valid previous one */
  22129. if (info->numberPackets > 0 && info->numberPackets <
  22130. MAX_PACKETS_HANDSHAKE) {
  22131. char* packetName = info->packets[info->numberPackets-1].packetName;
  22132. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  22133. packetName[MAX_PACKETNAME_SZ] = '\0';
  22134. }
  22135. }
  22136. /* Add record header to previously added packet info */
  22137. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  22138. {
  22139. /* make sure we have a valid previous one */
  22140. if (info->numberPackets > 0 && info->numberPackets <
  22141. MAX_PACKETS_HANDSHAKE) {
  22142. if (info->packets[info->numberPackets - 1].bufferValue)
  22143. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  22144. RECORD_HEADER_SZ);
  22145. else
  22146. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  22147. RECORD_HEADER_SZ);
  22148. }
  22149. }
  22150. #endif /* WOLFSSL_CALLBACKS */
  22151. /* Add PacketInfo to TimeoutInfo
  22152. *
  22153. * ssl WOLFSSL structure sending or receiving packet
  22154. * name name of packet being sent
  22155. * type type of packet being sent
  22156. * data data bing sent with packet
  22157. * sz size of data buffer
  22158. * lateRL save space for record layer in TimoutInfo struct
  22159. * written 1 if this packet is being written to wire, 0 if being read
  22160. * heap custom heap to use for mallocs/frees
  22161. */
  22162. int AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  22163. const byte* data, int sz, int written, int lateRL, void* heap)
  22164. {
  22165. #ifdef WOLFSSL_CALLBACKS
  22166. TimeoutInfo* info = &ssl->timeoutInfo;
  22167. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  22168. WOLFSSL_TIMEVAL currTime;
  22169. int totalSz;
  22170. /* add in space for post record layer */
  22171. totalSz = sz + lateRL;
  22172. /* may add name after */
  22173. if (name) {
  22174. char* packetName = info->packets[info->numberPackets].packetName;
  22175. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  22176. packetName[MAX_PACKETNAME_SZ] = '\0';
  22177. }
  22178. /* add data, put in buffer if bigger than static buffer */
  22179. info->packets[info->numberPackets].valueSz = totalSz;
  22180. if (totalSz < MAX_VALUE_SZ) {
  22181. XMEMCPY(info->packets[info->numberPackets].value, data + lateRL,
  22182. sz);
  22183. }
  22184. else {
  22185. info->packets[info->numberPackets].bufferValue =
  22186. (byte*)XMALLOC(totalSz, heap, DYNAMIC_TYPE_INFO);
  22187. if (!info->packets[info->numberPackets].bufferValue) {
  22188. /* let next alloc catch, just don't fill, not fatal here */
  22189. info->packets[info->numberPackets].valueSz = 0;
  22190. }
  22191. else {
  22192. /* copy over data (which has the handshake header), leaving
  22193. * room for post record layer header if set */
  22194. XMEMCPY(info->packets[info->numberPackets].bufferValue +
  22195. lateRL, data, sz);
  22196. }
  22197. }
  22198. if (gettimeofday(&currTime, 0) < 0)
  22199. return SYSLIB_FAILED_E;
  22200. info->packets[info->numberPackets].timestamp.tv_sec =
  22201. currTime.tv_sec;
  22202. info->packets[info->numberPackets].timestamp.tv_usec =
  22203. currTime.tv_usec;
  22204. info->numberPackets++;
  22205. }
  22206. #endif /* WOLFSSL_CALLBACKS */
  22207. #ifdef OPENSSL_EXTRA
  22208. if ((ssl->protoMsgCb != NULL) && (sz > 0) &&
  22209. (ssl->keys.encryptionOn != 1)) {
  22210. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  22211. 4096 from 16^3 */
  22212. int version = (ssl->version.minor & 0x0F) +
  22213. ((ssl->version.minor & 0xF0) << 4) +
  22214. ((ssl->version.major & 0x0F) << 8) +
  22215. ((ssl->version.major & 0xF0) << 12);
  22216. ssl->protoMsgCb(written, version, type,
  22217. (const void *)data, (size_t)sz,
  22218. ssl, ssl->protoMsgCtx);
  22219. }
  22220. #endif /* OPENSSL_EXTRA */
  22221. (void)written;
  22222. (void)name;
  22223. (void)heap;
  22224. (void)type;
  22225. (void)ssl;
  22226. (void)lateRL;
  22227. return 0;
  22228. }
  22229. #endif /* WOLFSSL_CALLBACKS */
  22230. #if !defined(NO_CERTS)
  22231. #if defined(WOLF_PRIVATE_KEY_ID) && !defined(NO_CHECK_PRIVATE_KEY)
  22232. /* Create a private key for a device.
  22233. *
  22234. * pkey Key object.
  22235. * data Data to identify key.
  22236. * length Length of data.
  22237. * hsType Type of the key to create.
  22238. * heap Custom heap to use for mallocs/frees
  22239. * devId Id for device.
  22240. * return 0 on success.
  22241. * return NOT_COMPILED_IN if algorithm type not supported.
  22242. * return MEMORY_E on memory allocation failure.
  22243. * return other internal error
  22244. */
  22245. int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
  22246. int label, int id, void* heap, int devId)
  22247. {
  22248. int ret = NOT_COMPILED_IN;
  22249. if (hsType == DYNAMIC_TYPE_RSA) {
  22250. #ifndef NO_RSA
  22251. RsaKey* rsaKey;
  22252. rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  22253. if (rsaKey == NULL) {
  22254. return MEMORY_E;
  22255. }
  22256. if (label) {
  22257. ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
  22258. }
  22259. else if (id) {
  22260. ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId);
  22261. }
  22262. if (ret == 0) {
  22263. *pkey = (void*)rsaKey;
  22264. }
  22265. else {
  22266. XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
  22267. }
  22268. #endif
  22269. }
  22270. else if (hsType == DYNAMIC_TYPE_ECC) {
  22271. #ifdef HAVE_ECC
  22272. ecc_key* ecKey;
  22273. ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  22274. if (ecKey == NULL) {
  22275. return MEMORY_E;
  22276. }
  22277. if (label) {
  22278. ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
  22279. }
  22280. else if (id) {
  22281. ret = wc_ecc_init_id(ecKey, data, length, heap, devId);
  22282. }
  22283. if (ret == 0) {
  22284. *pkey = (void*)ecKey;
  22285. }
  22286. else {
  22287. XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
  22288. }
  22289. #endif
  22290. }
  22291. return ret;
  22292. }
  22293. #endif /* WOLF_PRIVATE_KEY_ID && !NO_CHECK_PRIVATE_KEY */
  22294. /* Decode the private key - RSA/ECC/Ed25519/Ed448/Falcon/Dilithium - and
  22295. * creates a key object.
  22296. *
  22297. * The signature type is set as well.
  22298. * The maximum length of a signature is returned.
  22299. *
  22300. * ssl The SSL/TLS object.
  22301. * length The length of a signature.
  22302. * returns 0 on success, otherwise failure.
  22303. */
  22304. int DecodePrivateKey(WOLFSSL *ssl, word16* length)
  22305. {
  22306. int ret = BAD_FUNC_ARG;
  22307. int keySz;
  22308. word32 idx;
  22309. /* make sure private key exists */
  22310. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  22311. /* allow no private key if using external */
  22312. #ifdef WOLF_PRIVATE_KEY_ID
  22313. if (ssl->devId != INVALID_DEVID
  22314. #ifdef HAVE_PK_CALLBACKS
  22315. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22316. #endif
  22317. ) {
  22318. *length = GetPrivateKeySigSize(ssl);
  22319. return 0;
  22320. }
  22321. else
  22322. #endif
  22323. {
  22324. WOLFSSL_MSG("Private key missing!");
  22325. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  22326. }
  22327. }
  22328. #ifdef WOLF_PRIVATE_KEY_ID
  22329. if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
  22330. ssl->buffers.keyLabel)) {
  22331. if (ssl->buffers.keyType == rsa_sa_algo)
  22332. ssl->hsType = DYNAMIC_TYPE_RSA;
  22333. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  22334. ssl->hsType = DYNAMIC_TYPE_ECC;
  22335. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22336. if (ret != 0) {
  22337. goto exit_dpk;
  22338. }
  22339. if (ssl->buffers.keyType == rsa_sa_algo) {
  22340. #ifndef NO_RSA
  22341. if (ssl->buffers.keyLabel) {
  22342. ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
  22343. (char*)ssl->buffers.key->buffer,
  22344. ssl->heap, ssl->buffers.keyDevId);
  22345. }
  22346. else if (ssl->buffers.keyId) {
  22347. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  22348. ssl->buffers.key->buffer,
  22349. ssl->buffers.key->length, ssl->heap,
  22350. ssl->buffers.keyDevId);
  22351. }
  22352. if (ret == 0) {
  22353. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  22354. WOLFSSL_MSG("RSA key size too small");
  22355. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  22356. }
  22357. /* Return the maximum signature length. */
  22358. *length = (word16)ssl->buffers.keySz;
  22359. }
  22360. #else
  22361. ret = NOT_COMPILED_IN;
  22362. #endif
  22363. }
  22364. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  22365. #ifdef HAVE_ECC
  22366. if (ssl->buffers.keyLabel) {
  22367. ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
  22368. (char*)ssl->buffers.key->buffer,
  22369. ssl->heap, ssl->buffers.keyDevId);
  22370. }
  22371. else if (ssl->buffers.keyId) {
  22372. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
  22373. ssl->buffers.key->buffer,
  22374. ssl->buffers.key->length, ssl->heap,
  22375. ssl->buffers.keyDevId);
  22376. }
  22377. if (ret == 0) {
  22378. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  22379. WOLFSSL_MSG("ECC key size too small");
  22380. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  22381. }
  22382. /* Return the maximum signature length. */
  22383. *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz);
  22384. }
  22385. #else
  22386. ret = NOT_COMPILED_IN;
  22387. #endif
  22388. }
  22389. goto exit_dpk;
  22390. }
  22391. #endif /* WOLF_PRIVATE_KEY_ID */
  22392. #ifndef NO_RSA
  22393. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  22394. ssl->hsType = DYNAMIC_TYPE_RSA;
  22395. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22396. if (ret != 0) {
  22397. goto exit_dpk;
  22398. }
  22399. WOLFSSL_MSG("Trying RSA private key");
  22400. /* Set start of data to beginning of buffer. */
  22401. idx = 0;
  22402. /* Decode the key assuming it is an RSA private key. */
  22403. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  22404. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  22405. #ifdef WOLF_PRIVATE_KEY_ID
  22406. /* if using external key then allow using a public key */
  22407. if (ret != 0 && (ssl->devId != INVALID_DEVID
  22408. #ifdef HAVE_PK_CALLBACKS
  22409. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22410. #endif
  22411. )) {
  22412. WOLFSSL_MSG("Trying RSA public key with crypto callbacks");
  22413. idx = 0;
  22414. ret = wc_RsaPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  22415. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  22416. }
  22417. #endif
  22418. if (ret == 0) {
  22419. WOLFSSL_MSG("Using RSA private key");
  22420. /* It worked so check it meets minimum key size requirements. */
  22421. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  22422. if (keySz < 0) { /* check if keySz has error case */
  22423. ERROR_OUT(keySz, exit_dpk);
  22424. }
  22425. if (keySz < ssl->options.minRsaKeySz) {
  22426. WOLFSSL_MSG("RSA key size too small");
  22427. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  22428. }
  22429. /* Return the maximum signature length. */
  22430. *length = (word16)keySz;
  22431. goto exit_dpk;
  22432. }
  22433. }
  22434. #endif /* !NO_RSA */
  22435. #ifdef HAVE_ECC
  22436. #ifndef NO_RSA
  22437. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  22438. #endif /* !NO_RSA */
  22439. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0) {
  22440. ssl->hsType = DYNAMIC_TYPE_ECC;
  22441. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22442. if (ret != 0) {
  22443. goto exit_dpk;
  22444. }
  22445. #ifndef NO_RSA
  22446. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  22447. #else
  22448. WOLFSSL_MSG("Trying ECC private key");
  22449. #endif
  22450. /* Set start of data to beginning of buffer. */
  22451. idx = 0;
  22452. /* Decode the key assuming it is an ECC private key. */
  22453. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  22454. (ecc_key*)ssl->hsKey,
  22455. ssl->buffers.key->length);
  22456. #ifdef WOLF_PRIVATE_KEY_ID
  22457. /* if using external key then allow using a public key */
  22458. if (ret != 0 && (ssl->devId != INVALID_DEVID
  22459. #ifdef HAVE_PK_CALLBACKS
  22460. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22461. #endif
  22462. )) {
  22463. WOLFSSL_MSG("Trying ECC public key with crypto callbacks");
  22464. idx = 0;
  22465. ret = wc_EccPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  22466. (ecc_key*)ssl->hsKey,
  22467. ssl->buffers.key->length);
  22468. }
  22469. #endif
  22470. if (ret == 0) {
  22471. WOLFSSL_MSG("Using ECC private key");
  22472. /* Check it meets the minimum ECC key size requirements. */
  22473. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  22474. if (keySz < ssl->options.minEccKeySz) {
  22475. WOLFSSL_MSG("ECC key size too small");
  22476. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  22477. }
  22478. /* Return the maximum signature length. */
  22479. *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  22480. goto exit_dpk;
  22481. }
  22482. }
  22483. #endif
  22484. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  22485. #if !defined(NO_RSA) || defined(HAVE_ECC)
  22486. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  22487. #endif
  22488. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  22489. ssl->hsType = DYNAMIC_TYPE_ED25519;
  22490. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22491. if (ret != 0) {
  22492. goto exit_dpk;
  22493. }
  22494. #ifdef HAVE_ECC
  22495. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  22496. #elif !defined(NO_RSA)
  22497. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  22498. #else
  22499. WOLFSSL_MSG("Trying ED25519 private key");
  22500. #endif
  22501. /* Set start of data to beginning of buffer. */
  22502. idx = 0;
  22503. /* Decode the key assuming it is an ED25519 private key. */
  22504. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  22505. (ed25519_key*)ssl->hsKey,
  22506. ssl->buffers.key->length);
  22507. #ifdef WOLF_PRIVATE_KEY_ID
  22508. /* if using external key then allow using a public key */
  22509. if (ret != 0 && (ssl->devId != INVALID_DEVID
  22510. #ifdef HAVE_PK_CALLBACKS
  22511. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22512. #endif
  22513. )) {
  22514. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  22515. idx = 0;
  22516. ret = wc_Ed25519PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  22517. (ed25519_key*)ssl->hsKey,
  22518. ssl->buffers.key->length);
  22519. }
  22520. #endif
  22521. if (ret == 0) {
  22522. WOLFSSL_MSG("Using ED25519 private key");
  22523. /* Check it meets the minimum ECC key size requirements. */
  22524. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  22525. WOLFSSL_MSG("ED25519 key size too small");
  22526. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  22527. }
  22528. /* Return the maximum signature length. */
  22529. *length = ED25519_SIG_SIZE;
  22530. goto exit_dpk;
  22531. }
  22532. }
  22533. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  22534. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  22535. #if !defined(NO_RSA) || defined(HAVE_ECC)
  22536. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  22537. #endif
  22538. if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
  22539. ssl->hsType = DYNAMIC_TYPE_ED448;
  22540. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22541. if (ret != 0) {
  22542. goto exit_dpk;
  22543. }
  22544. #ifdef HAVE_ED25519
  22545. WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
  22546. #elif defined(HAVE_ECC)
  22547. WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
  22548. #elif !defined(NO_RSA)
  22549. WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
  22550. #else
  22551. WOLFSSL_MSG("Trying ED448 private key");
  22552. #endif
  22553. /* Set start of data to beginning of buffer. */
  22554. idx = 0;
  22555. /* Decode the key assuming it is an ED448 private key. */
  22556. ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  22557. (ed448_key*)ssl->hsKey,
  22558. ssl->buffers.key->length);
  22559. #ifdef WOLF_PRIVATE_KEY_ID
  22560. /* if using external key then allow using a public key */
  22561. if (ret != 0 && (ssl->devId != INVALID_DEVID
  22562. #ifdef HAVE_PK_CALLBACKS
  22563. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22564. #endif
  22565. )) {
  22566. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  22567. idx = 0;
  22568. ret = wc_Ed448PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  22569. (ed448_key*)ssl->hsKey,
  22570. ssl->buffers.key->length);
  22571. }
  22572. #endif
  22573. if (ret == 0) {
  22574. WOLFSSL_MSG("Using ED448 private key");
  22575. /* Check it meets the minimum ECC key size requirements. */
  22576. if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  22577. WOLFSSL_MSG("ED448 key size too small");
  22578. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  22579. }
  22580. /* Return the maximum signature length. */
  22581. *length = ED448_SIG_SIZE;
  22582. goto exit_dpk;
  22583. }
  22584. }
  22585. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  22586. #if defined(HAVE_PQC)
  22587. #if defined(HAVE_FALCON)
  22588. if (ssl->buffers.keyType == falcon_level1_sa_algo ||
  22589. ssl->buffers.keyType == falcon_level5_sa_algo ||
  22590. ssl->buffers.keyType == 0) {
  22591. ssl->hsType = DYNAMIC_TYPE_FALCON;
  22592. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22593. if (ret != 0) {
  22594. goto exit_dpk;
  22595. }
  22596. if (ssl->buffers.keyType == falcon_level1_sa_algo) {
  22597. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 1);
  22598. }
  22599. else if (ssl->buffers.keyType == falcon_level5_sa_algo) {
  22600. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 5);
  22601. }
  22602. else {
  22603. /* What if ssl->buffers.keyType is 0? We might want to do something
  22604. * more graceful here. */
  22605. ret = ALGO_ID_E;
  22606. }
  22607. if (ret != 0) {
  22608. goto exit_dpk;
  22609. }
  22610. #if defined(HAVE_ED448)
  22611. WOLFSSL_MSG("Trying Falcon private key, ED448 didn't work");
  22612. #elif defined(HAVE_ED25519)
  22613. WOLFSSL_MSG("Trying Falcon private key, ED25519 didn't work");
  22614. #elif defined(HAVE_ECC)
  22615. WOLFSSL_MSG("Trying Falcon private key, ECC didn't work");
  22616. #elif !defined(NO_RSA)
  22617. WOLFSSL_MSG("Trying Falcon private key, RSA didn't work");
  22618. #else
  22619. WOLFSSL_MSG("Trying Falcon private key");
  22620. #endif
  22621. /* Set start of data to beginning of buffer. */
  22622. idx = 0;
  22623. /* Decode the key assuming it is a Falcon private key. */
  22624. ret = wc_falcon_import_private_only(ssl->buffers.key->buffer,
  22625. ssl->buffers.key->length,
  22626. (falcon_key*)ssl->hsKey);
  22627. if (ret == 0) {
  22628. WOLFSSL_MSG("Using Falcon private key");
  22629. /* Check it meets the minimum Falcon key size requirements. */
  22630. if (FALCON_MAX_KEY_SIZE < ssl->options.minFalconKeySz) {
  22631. WOLFSSL_MSG("Falcon key size too small");
  22632. ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk);
  22633. }
  22634. /* Return the maximum signature length. */
  22635. *length = FALCON_MAX_SIG_SIZE;
  22636. goto exit_dpk;
  22637. }
  22638. }
  22639. #endif /* HAVE_FALCON */
  22640. #if defined(HAVE_DILITHIUM)
  22641. if (ssl->buffers.keyType == dilithium_level2_sa_algo ||
  22642. ssl->buffers.keyType == dilithium_level3_sa_algo ||
  22643. ssl->buffers.keyType == dilithium_level5_sa_algo ||
  22644. ssl->buffers.keyType == dilithium_aes_level2_sa_algo ||
  22645. ssl->buffers.keyType == dilithium_aes_level3_sa_algo ||
  22646. ssl->buffers.keyType == dilithium_aes_level5_sa_algo ||
  22647. ssl->buffers.keyType == 0) {
  22648. ssl->hsType = DYNAMIC_TYPE_DILITHIUM;
  22649. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22650. if (ret != 0) {
  22651. goto exit_dpk;
  22652. }
  22653. if (ssl->buffers.keyType == dilithium_level2_sa_algo) {
  22654. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22655. 2, SHAKE_VARIANT);
  22656. }
  22657. else if (ssl->buffers.keyType == dilithium_level3_sa_algo) {
  22658. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22659. 3, SHAKE_VARIANT);
  22660. }
  22661. else if (ssl->buffers.keyType == dilithium_level5_sa_algo) {
  22662. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22663. 5, SHAKE_VARIANT);
  22664. }
  22665. else if (ssl->buffers.keyType == dilithium_aes_level2_sa_algo) {
  22666. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22667. 2, AES_VARIANT);
  22668. }
  22669. else if (ssl->buffers.keyType == dilithium_aes_level3_sa_algo) {
  22670. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22671. 3, AES_VARIANT);
  22672. }
  22673. else if (ssl->buffers.keyType == dilithium_aes_level5_sa_algo) {
  22674. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22675. 5, AES_VARIANT);
  22676. }
  22677. else {
  22678. /* What if ssl->buffers.keyType is 0? We might want to do something
  22679. * more graceful here. */
  22680. ret = ALGO_ID_E;
  22681. }
  22682. if (ret != 0) {
  22683. goto exit_dpk;
  22684. }
  22685. #if defined(HAVE_ED448)
  22686. WOLFSSL_MSG("Trying Dilithium private key, ED448 didn't work");
  22687. #elif defined(HAVE_ED25519)
  22688. WOLFSSL_MSG("Trying Dilithium private key, ED25519 didn't work");
  22689. #elif defined(HAVE_ECC)
  22690. WOLFSSL_MSG("Trying Dilithium private key, ECC didn't work");
  22691. #elif !defined(NO_RSA)
  22692. WOLFSSL_MSG("Trying Dilithium private key, RSA didn't work");
  22693. #elif defined(HAVE_FALCON)
  22694. WOLFSSL_MSG("Trying Dilithium private key, Falcon didn't work");
  22695. #else
  22696. WOLFSSL_MSG("Trying Dilithium private key");
  22697. #endif
  22698. /* Set start of data to beginning of buffer. */
  22699. idx = 0;
  22700. /* Decode the key assuming it is a Dilithium private key. */
  22701. ret = wc_dilithium_import_private_only(ssl->buffers.key->buffer,
  22702. ssl->buffers.key->length,
  22703. (dilithium_key*)ssl->hsKey);
  22704. if (ret == 0) {
  22705. WOLFSSL_MSG("Using Dilithium private key");
  22706. /* Check it meets the minimum Dilithium key size requirements. */
  22707. if (DILITHIUM_MAX_KEY_SIZE < ssl->options.minDilithiumKeySz) {
  22708. WOLFSSL_MSG("Dilithium key size too small");
  22709. ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk);
  22710. }
  22711. /* Return the maximum signature length. */
  22712. *length = DILITHIUM_MAX_SIG_SIZE;
  22713. goto exit_dpk;
  22714. }
  22715. }
  22716. #endif /* HAVE_DILITHIUM */
  22717. #endif /* HAVE_PQC */
  22718. (void)idx;
  22719. (void)keySz;
  22720. (void)length;
  22721. exit_dpk:
  22722. if (ret != 0) {
  22723. WOLFSSL_ERROR_VERBOSE(ret);
  22724. }
  22725. return ret;
  22726. }
  22727. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  22728. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  22729. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  22730. int TLSv1_3_Capable(WOLFSSL* ssl)
  22731. {
  22732. #ifndef WOLFSSL_TLS13
  22733. return 0;
  22734. #else
  22735. int ret = 0;
  22736. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  22737. ret = 1;
  22738. }
  22739. if ((wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_3)) {
  22740. /* option set at run time to disable TLS 1.3 */
  22741. ret = 0;
  22742. }
  22743. return ret;
  22744. #endif
  22745. }
  22746. #endif /* WOLFSSL_TLS13 */
  22747. #ifndef WOLFSSL_NO_TLS12
  22748. #if (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC) || \
  22749. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))) || \
  22750. (!defined(NO_WOLFSSL_SERVER) && (defined(HAVE_ECC) || \
  22751. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  22752. (defined(HAVE_ED25519) || defined(HAVE_ED448) || !defined(NO_RSA)))) || \
  22753. (!defined(NO_DH) && (!defined(NO_RSA) || defined(HAVE_ANON))))
  22754. static int HashSkeData(WOLFSSL* ssl, enum wc_HashType hashType,
  22755. const byte* data, int sz, byte sigAlgo)
  22756. {
  22757. int ret = 0;
  22758. int digest_sz = wc_HashGetDigestSize(hashType);
  22759. if (digest_sz <= 0) {
  22760. ret = BUFFER_ERROR;
  22761. }
  22762. if (ret == 0) {
  22763. /* buffer for signature */
  22764. ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + sz, ssl->heap,
  22765. DYNAMIC_TYPE_SIGNATURE);
  22766. if (ssl->buffers.sig.buffer == NULL) {
  22767. ret = MEMORY_E;
  22768. }
  22769. }
  22770. if (ret == 0) {
  22771. ssl->buffers.sig.length = SEED_LEN + sz;
  22772. /* build message to hash */
  22773. XMEMCPY(ssl->buffers.sig.buffer, ssl->arrays->clientRandom, RAN_LEN);
  22774. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN], ssl->arrays->serverRandom,
  22775. RAN_LEN);
  22776. /* message */
  22777. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2], data, sz);
  22778. }
  22779. if (ret == 0 && sigAlgo != ed25519_sa_algo && sigAlgo != ed448_sa_algo) {
  22780. ssl->buffers.digest.length = (unsigned int)digest_sz;
  22781. /* buffer for hash */
  22782. ssl->buffers.digest.buffer = (byte*)XMALLOC(ssl->buffers.digest.length,
  22783. ssl->heap, DYNAMIC_TYPE_DIGEST);
  22784. if (ssl->buffers.digest.buffer == NULL) {
  22785. ret = MEMORY_E;
  22786. }
  22787. }
  22788. if (ret == 0 && sigAlgo != ed25519_sa_algo && sigAlgo != ed448_sa_algo) {
  22789. /* Perform hash. Only wc_Hash supports MD5_SHA1. */
  22790. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  22791. ssl->buffers.sig.length,
  22792. ssl->buffers.digest.buffer,
  22793. ssl->buffers.digest.length);
  22794. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22795. ssl->buffers.sig.buffer = NULL;
  22796. }
  22797. return ret;
  22798. }
  22799. #endif
  22800. #endif /* !WOLFSSL_NO_TLS12 */
  22801. /* client only parts */
  22802. #ifndef NO_WOLFSSL_CLIENT
  22803. #ifndef WOLFSSL_NO_TLS12
  22804. /* handle generation of client_hello (1) */
  22805. int SendClientHello(WOLFSSL* ssl)
  22806. {
  22807. byte *output;
  22808. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22809. int sendSz;
  22810. int idSz;
  22811. int ret;
  22812. word16 extSz = 0;
  22813. if (ssl == NULL) {
  22814. return BAD_FUNC_ARG;
  22815. }
  22816. idSz = ssl->options.resuming ? ssl->session->sessionIDSz : 0;
  22817. #ifdef WOLFSSL_TLS13
  22818. if (IsAtLeastTLSv1_3(ssl->version))
  22819. return SendTls13ClientHello(ssl);
  22820. #endif
  22821. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  22822. WOLFSSL_ENTER("SendClientHello");
  22823. if (ssl->suites == NULL) {
  22824. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  22825. return SUITES_ERROR;
  22826. }
  22827. #ifdef HAVE_SESSION_TICKET
  22828. if (ssl->options.resuming && ssl->session->ticketLen > 0) {
  22829. SessionTicket* ticket;
  22830. ticket = TLSX_SessionTicket_Create(0, ssl->session->ticket,
  22831. ssl->session->ticketLen, ssl->heap);
  22832. if (ticket == NULL) return MEMORY_E;
  22833. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  22834. if (ret != WOLFSSL_SUCCESS) {
  22835. TLSX_SessionTicket_Free(ticket, ssl->heap);
  22836. return ret;
  22837. }
  22838. idSz = 0;
  22839. }
  22840. #endif
  22841. length = VERSION_SZ + RAN_LEN
  22842. + idSz + ENUM_LEN
  22843. + ssl->suites->suiteSz + SUITE_LEN
  22844. + COMP_LEN + ENUM_LEN;
  22845. #ifdef HAVE_TLS_EXTENSIONS
  22846. /* auto populate extensions supported unless user defined */
  22847. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  22848. return ret;
  22849. extSz = 0;
  22850. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  22851. if (ret != 0)
  22852. return ret;
  22853. length += extSz;
  22854. #else
  22855. if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
  22856. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  22857. + ssl->suites->hashSigAlgoSz;
  22858. #ifdef HAVE_EXTENDED_MASTER
  22859. if (ssl->options.haveEMS)
  22860. extSz += HELLO_EXT_SZ;
  22861. #endif
  22862. if (extSz != 0)
  22863. length += extSz + HELLO_EXT_SZ_SZ;
  22864. #endif
  22865. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  22866. if (ssl->arrays == NULL) {
  22867. return BAD_FUNC_ARG;
  22868. }
  22869. #ifdef WOLFSSL_DTLS
  22870. if (ssl->options.dtls) {
  22871. length += ENUM_LEN; /* cookie */
  22872. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  22873. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  22874. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  22875. }
  22876. #endif
  22877. if (IsEncryptionOn(ssl, 1))
  22878. sendSz += MAX_MSG_EXTRA;
  22879. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  22880. * is not advanced yet */
  22881. ssl->options.buildingMsg = 1;
  22882. /* check for available size */
  22883. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  22884. return ret;
  22885. /* get output buffer */
  22886. output = ssl->buffers.outputBuffer.buffer +
  22887. ssl->buffers.outputBuffer.length;
  22888. AddHeaders(output, length, client_hello, ssl);
  22889. /* client hello, first version */
  22890. output[idx++] = ssl->version.major;
  22891. output[idx++] = ssl->version.minor;
  22892. ssl->chVersion = ssl->version; /* store in case changed */
  22893. /* then random */
  22894. if (ssl->options.connectState == CONNECT_BEGIN) {
  22895. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  22896. if (ret != 0)
  22897. return ret;
  22898. /* store random */
  22899. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  22900. } else {
  22901. #ifdef WOLFSSL_DTLS
  22902. /* send same random on hello again */
  22903. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  22904. #endif
  22905. }
  22906. idx += RAN_LEN;
  22907. /* then session id */
  22908. output[idx++] = (byte)idSz;
  22909. if (idSz) {
  22910. XMEMCPY(output + idx, ssl->session->sessionID,
  22911. ssl->session->sessionIDSz);
  22912. idx += ssl->session->sessionIDSz;
  22913. }
  22914. /* then DTLS cookie */
  22915. #ifdef WOLFSSL_DTLS
  22916. if (ssl->options.dtls) {
  22917. byte cookieSz = ssl->arrays->cookieSz;
  22918. output[idx++] = cookieSz;
  22919. if (cookieSz) {
  22920. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  22921. idx += cookieSz;
  22922. }
  22923. }
  22924. #endif
  22925. /* then cipher suites */
  22926. c16toa(ssl->suites->suiteSz, output + idx);
  22927. idx += OPAQUE16_LEN;
  22928. XMEMCPY(output + idx, &ssl->suites->suites, ssl->suites->suiteSz);
  22929. idx += ssl->suites->suiteSz;
  22930. /* last, compression */
  22931. output[idx++] = COMP_LEN;
  22932. if (ssl->options.usingCompression)
  22933. output[idx++] = ZLIB_COMPRESSION;
  22934. else
  22935. output[idx++] = NO_COMPRESSION;
  22936. #ifdef HAVE_TLS_EXTENSIONS
  22937. extSz = 0;
  22938. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  22939. if (ret != 0)
  22940. return ret;
  22941. idx += extSz;
  22942. (void)idx; /* suppress analyzer warning, keep idx current */
  22943. #else
  22944. if (extSz != 0) {
  22945. c16toa(extSz, output + idx);
  22946. idx += HELLO_EXT_SZ_SZ;
  22947. if (IsAtLeastTLSv1_2(ssl)) {
  22948. if (ssl->suites->hashSigAlgoSz) {
  22949. word16 i;
  22950. /* extension type */
  22951. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  22952. idx += HELLO_EXT_TYPE_SZ;
  22953. /* extension data length */
  22954. c16toa(HELLO_EXT_SIGALGO_SZ + ssl->suites->hashSigAlgoSz,
  22955. output + idx);
  22956. idx += HELLO_EXT_SZ_SZ;
  22957. /* sig algos length */
  22958. c16toa(ssl->suites->hashSigAlgoSz, output + idx);
  22959. idx += HELLO_EXT_SIGALGO_SZ;
  22960. for (i=0; i < ssl->suites->hashSigAlgoSz; i++, idx++) {
  22961. output[idx] = ssl->suites->hashSigAlgo[i];
  22962. }
  22963. }
  22964. }
  22965. #ifdef HAVE_EXTENDED_MASTER
  22966. if (ssl->options.haveEMS) {
  22967. c16toa(HELLO_EXT_EXTMS, output + idx);
  22968. idx += HELLO_EXT_TYPE_SZ;
  22969. c16toa(0, output + idx);
  22970. idx += HELLO_EXT_SZ_SZ;
  22971. }
  22972. #endif
  22973. }
  22974. #endif
  22975. if (IsEncryptionOn(ssl, 1)) {
  22976. byte* input;
  22977. int inputSz = idx; /* build msg adds rec hdr */
  22978. int recordHeaderSz = RECORD_HEADER_SZ;
  22979. if (ssl->options.dtls)
  22980. recordHeaderSz += DTLS_RECORD_EXTRA;
  22981. inputSz -= recordHeaderSz;
  22982. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22983. if (input == NULL)
  22984. return MEMORY_E;
  22985. XMEMCPY(input, output + recordHeaderSz, inputSz);
  22986. #ifdef WOLFSSL_DTLS
  22987. if (IsDtlsNotSctpMode(ssl) &&
  22988. (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
  22989. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22990. return ret;
  22991. }
  22992. #endif
  22993. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  22994. handshake, 1, 0, 0, CUR_ORDER);
  22995. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22996. if (sendSz < 0)
  22997. return sendSz;
  22998. } else {
  22999. #ifdef WOLFSSL_DTLS
  23000. if (IsDtlsNotSctpMode(ssl)) {
  23001. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
  23002. return ret;
  23003. }
  23004. if (ssl->options.dtls)
  23005. DtlsSEQIncrement(ssl, CUR_ORDER);
  23006. #endif
  23007. ret = HashOutput(ssl, output, sendSz, 0);
  23008. if (ret != 0)
  23009. return ret;
  23010. }
  23011. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  23012. #ifdef OPENSSL_EXTRA
  23013. ssl->cbmode = SSL_CB_MODE_WRITE;
  23014. if (ssl->CBIS != NULL)
  23015. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  23016. #endif
  23017. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  23018. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  23019. if (ssl->toInfoOn) {
  23020. ret = AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  23021. WRITE_PROTO, 0, ssl->heap);
  23022. if (ret != 0)
  23023. return ret;
  23024. }
  23025. #endif
  23026. ssl->options.buildingMsg = 0;
  23027. ssl->buffers.outputBuffer.length += sendSz;
  23028. ret = SendBuffered(ssl);
  23029. WOLFSSL_LEAVE("SendClientHello", ret);
  23030. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  23031. return ret;
  23032. }
  23033. /* handle processing of DTLS hello_verify_request (3) */
  23034. int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  23035. word32 size)
  23036. {
  23037. ProtocolVersion pv;
  23038. byte cookieSz;
  23039. word32 begin = *inOutIdx;
  23040. #ifdef WOLFSSL_CALLBACKS
  23041. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  23042. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  23043. #endif
  23044. #ifdef WOLFSSL_DTLS
  23045. if (ssl->options.dtls) {
  23046. DtlsMsgPoolReset(ssl);
  23047. }
  23048. #endif
  23049. if (OPAQUE16_LEN + OPAQUE8_LEN > size)
  23050. return BUFFER_ERROR;
  23051. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  23052. *inOutIdx += OPAQUE16_LEN;
  23053. if (pv.major != DTLS_MAJOR ||
  23054. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  23055. return VERSION_ERROR;
  23056. cookieSz = input[(*inOutIdx)++];
  23057. if (cookieSz) {
  23058. if ((*inOutIdx - begin) + cookieSz > size)
  23059. return BUFFER_ERROR;
  23060. #ifdef WOLFSSL_DTLS
  23061. if (cookieSz <= MAX_COOKIE_LEN) {
  23062. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  23063. ssl->arrays->cookieSz = cookieSz;
  23064. }
  23065. #endif
  23066. *inOutIdx += cookieSz;
  23067. }
  23068. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13)
  23069. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.dtls) {
  23070. /* we sent a TLSv1.3 ClientHello but received a
  23071. * HELLO_VERIFY_REQUEST */
  23072. if (!ssl->options.downgrade ||
  23073. ssl->options.minDowngrade < pv.minor)
  23074. return VERSION_ERROR;
  23075. }
  23076. #endif /* defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13) */
  23077. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  23078. return 0;
  23079. }
  23080. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  23081. {
  23082. int ret = 0;
  23083. #ifdef HAVE_SECRET_CALLBACK
  23084. /* If a session secret callback exists, we are using that
  23085. * key instead of the saved session key. Requires a ticket. */
  23086. ret = ret || (ssl->sessionSecretCb != NULL
  23087. #ifdef HAVE_SESSION_TICKET
  23088. && ssl->session->ticketLen > 0
  23089. #endif
  23090. );
  23091. #endif
  23092. #ifdef HAVE_SESSION_TICKET
  23093. /* server may send blank ticket which may not be expected to indicate
  23094. * existing one ok but will also be sending a new one */
  23095. ret = ret || (ssl->session->ticketLen > 0);
  23096. #endif
  23097. ret = ret ||
  23098. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  23099. ssl->session->sessionID, ID_LEN) == 0);
  23100. return ret;
  23101. }
  23102. /* Check the version in the received message is valid and set protocol
  23103. * version to use.
  23104. *
  23105. * ssl The SSL/TLS object.
  23106. * pv The protocol version from the packet.
  23107. * returns 0 on success, otherwise failure.
  23108. */
  23109. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  23110. {
  23111. byte lowerVersion, higherVersion;
  23112. #ifdef WOLFSSL_TLS13_DRAFT
  23113. if (pv.major == TLS_DRAFT_MAJOR) {
  23114. pv.major = SSLv3_MAJOR;
  23115. pv.minor = TLSv1_3_MINOR;
  23116. }
  23117. #endif
  23118. #ifdef OPENSSL_EXTRA
  23119. if (ssl->CBIS != NULL) {
  23120. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, SSL_SUCCESS);
  23121. }
  23122. #endif
  23123. if (ssl->options.dtls) {
  23124. if (pv.major != DTLS_MAJOR || pv.minor == DTLS_BOGUS_MINOR) {
  23125. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23126. return VERSION_ERROR;
  23127. }
  23128. lowerVersion = pv.minor > ssl->version.minor;
  23129. higherVersion = pv.minor < ssl->version.minor;
  23130. }
  23131. else {
  23132. if (pv.major != SSLv3_MAJOR) {
  23133. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23134. return VERSION_ERROR;
  23135. }
  23136. lowerVersion = pv.minor < ssl->version.minor;
  23137. higherVersion = pv.minor > ssl->version.minor;
  23138. }
  23139. if (higherVersion) {
  23140. WOLFSSL_MSG("Server using higher version, fatal error");
  23141. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23142. return VERSION_ERROR;
  23143. }
  23144. if (lowerVersion) {
  23145. WOLFSSL_MSG("server using lower version");
  23146. /* Check for downgrade attack. */
  23147. if (!ssl->options.downgrade) {
  23148. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  23149. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23150. return VERSION_ERROR;
  23151. }
  23152. if ((!ssl->options.dtls && pv.minor < ssl->options.minDowngrade) ||
  23153. (ssl->options.dtls && pv.minor > ssl->options.minDowngrade)) {
  23154. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  23155. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23156. return VERSION_ERROR;
  23157. }
  23158. #ifdef HAVE_SECURE_RENEGOTIATION
  23159. if (ssl->secure_renegotiation &&
  23160. ssl->secure_renegotiation->enabled &&
  23161. ssl->options.handShakeDone) {
  23162. WOLFSSL_MSG("Server changed version during scr");
  23163. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23164. return VERSION_ERROR;
  23165. }
  23166. #endif
  23167. /* Checks made - OK to downgrade. */
  23168. ssl->version.minor = pv.minor;
  23169. switch(pv.minor) {
  23170. case SSLv3_MINOR:
  23171. /* turn off tls */
  23172. WOLFSSL_MSG("\tdowngrading to SSLv3");
  23173. ssl->options.tls = 0;
  23174. ssl->options.tls1_1 = 0;
  23175. break;
  23176. case TLSv1_MINOR:
  23177. /* turn off tls 1.1+ */
  23178. WOLFSSL_MSG("\tdowngrading to TLSv1");
  23179. ssl->options.tls1_1 = 0;
  23180. break;
  23181. case TLSv1_1_MINOR:
  23182. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  23183. break;
  23184. case DTLS_MINOR:
  23185. WOLFSSL_MSG("\tdowngrading to DTLSv1.1");
  23186. break;
  23187. case TLSv1_2_MINOR:
  23188. WOLFSSL_MSG("\tdowngrading to TLSv1.2");
  23189. break;
  23190. case DTLSv1_2_MINOR:
  23191. WOLFSSL_MSG("\tdowngrading to DTLSv1.2");
  23192. break;
  23193. default:
  23194. WOLFSSL_MSG("\tbad minor version");
  23195. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23196. return VERSION_ERROR;
  23197. }
  23198. }
  23199. /* check if option is set to not allow the current version
  23200. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  23201. if (!ssl->options.dtls && ssl->options.downgrade &&
  23202. ssl->options.mask > 0) {
  23203. if (ssl->version.minor == TLSv1_2_MINOR &&
  23204. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
  23205. WOLFSSL_OP_NO_TLSv1_2) {
  23206. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  23207. ssl->version.minor = TLSv1_1_MINOR;
  23208. }
  23209. if (ssl->version.minor == TLSv1_1_MINOR &&
  23210. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
  23211. WOLFSSL_OP_NO_TLSv1_1) {
  23212. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  23213. ssl->options.tls1_1 = 0;
  23214. ssl->version.minor = TLSv1_MINOR;
  23215. }
  23216. if (ssl->version.minor == TLSv1_MINOR &&
  23217. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
  23218. WOLFSSL_OP_NO_TLSv1) {
  23219. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  23220. ssl->options.tls = 0;
  23221. ssl->options.tls1_1 = 0;
  23222. ssl->version.minor = SSLv3_MINOR;
  23223. }
  23224. if (ssl->version.minor == SSLv3_MINOR &&
  23225. (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
  23226. WOLFSSL_OP_NO_SSLv3) {
  23227. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  23228. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23229. return VERSION_ERROR;
  23230. }
  23231. if (ssl->version.minor < ssl->options.minDowngrade) {
  23232. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  23233. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23234. return VERSION_ERROR;
  23235. }
  23236. }
  23237. return 0;
  23238. }
  23239. /* handle processing of server_hello (2) */
  23240. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  23241. word32 helloSz)
  23242. {
  23243. byte cs0; /* cipher suite bytes 0, 1 */
  23244. byte cs1;
  23245. ProtocolVersion pv;
  23246. byte compression;
  23247. word32 i = *inOutIdx;
  23248. word32 begin = i;
  23249. int ret;
  23250. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  23251. WOLFSSL_ENTER("DoServerHello");
  23252. #ifdef WOLFSSL_CALLBACKS
  23253. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  23254. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  23255. #endif
  23256. /* protocol version, random and session id length check */
  23257. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  23258. return BUFFER_ERROR;
  23259. /* protocol version */
  23260. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  23261. i += OPAQUE16_LEN;
  23262. ret = CheckVersion(ssl, pv);
  23263. if (ret != 0) {
  23264. SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version);
  23265. return ret;
  23266. }
  23267. #ifdef WOLFSSL_TLS13
  23268. if (IsAtLeastTLSv1_3(pv)) {
  23269. byte type = server_hello;
  23270. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  23271. }
  23272. #endif
  23273. /* random */
  23274. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  23275. i += RAN_LEN;
  23276. /* session id */
  23277. ssl->arrays->sessionIDSz = input[i++];
  23278. if (ssl->arrays->sessionIDSz > ID_LEN) {
  23279. WOLFSSL_MSG("Invalid session ID size");
  23280. ssl->arrays->sessionIDSz = 0;
  23281. return BUFFER_ERROR;
  23282. }
  23283. else if (ssl->arrays->sessionIDSz) {
  23284. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  23285. return BUFFER_ERROR;
  23286. XMEMCPY(ssl->arrays->sessionID, input + i,
  23287. ssl->arrays->sessionIDSz);
  23288. i += ssl->arrays->sessionIDSz;
  23289. ssl->options.haveSessionId = 1;
  23290. }
  23291. /* suite and compression */
  23292. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  23293. return BUFFER_ERROR;
  23294. cs0 = input[i++];
  23295. cs1 = input[i++];
  23296. #ifdef HAVE_SECURE_RENEGOTIATION
  23297. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  23298. ssl->options.handShakeDone) {
  23299. if (ssl->options.cipherSuite0 != cs0 ||
  23300. ssl->options.cipherSuite != cs1) {
  23301. WOLFSSL_MSG("Server changed cipher suite during scr");
  23302. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  23303. return MATCH_SUITE_ERROR;
  23304. }
  23305. }
  23306. #endif
  23307. ssl->options.cipherSuite0 = cs0;
  23308. ssl->options.cipherSuite = cs1;
  23309. #ifdef WOLFSSL_DEBUG_TLS
  23310. WOLFSSL_MSG("Chosen cipher suite:");
  23311. WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
  23312. ssl->options.cipherSuite));
  23313. #endif
  23314. compression = input[i++];
  23315. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  23316. {
  23317. word32 idx, found = 0;
  23318. /* confirm server_hello cipher suite is one sent in client_hello */
  23319. for (idx = 0; idx < ssl->suites->suiteSz; idx += 2) {
  23320. if (ssl->suites->suites[idx] == cs0 &&
  23321. ssl->suites->suites[idx+1] == cs1) {
  23322. found = 1;
  23323. break;
  23324. }
  23325. }
  23326. if (!found) {
  23327. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  23328. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  23329. return MATCH_SUITE_ERROR;
  23330. }
  23331. }
  23332. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  23333. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  23334. WOLFSSL_MSG("Server forcing compression w/o support");
  23335. WOLFSSL_ERROR_VERBOSE(COMPRESSION_ERROR);
  23336. return COMPRESSION_ERROR;
  23337. }
  23338. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  23339. WOLFSSL_MSG("Server refused compression, turning off");
  23340. ssl->options.usingCompression = 0; /* turn off if server refused */
  23341. }
  23342. *inOutIdx = i;
  23343. #ifdef HAVE_TLS_EXTENSIONS
  23344. if ( (i - begin) < helloSz) {
  23345. if (TLSX_SupportExtensions(ssl)) {
  23346. word16 totalExtSz;
  23347. if ((i - begin) + OPAQUE16_LEN > helloSz)
  23348. return BUFFER_ERROR;
  23349. ato16(&input[i], &totalExtSz);
  23350. i += OPAQUE16_LEN;
  23351. if ((i - begin) + totalExtSz > helloSz)
  23352. return BUFFER_ERROR;
  23353. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  23354. server_hello, NULL)))
  23355. return ret;
  23356. i += totalExtSz;
  23357. *inOutIdx = i;
  23358. }
  23359. else
  23360. *inOutIdx = begin + helloSz; /* skip extensions */
  23361. }
  23362. else
  23363. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  23364. #else
  23365. {
  23366. int allowExt = 0;
  23367. byte pendingEMS = 0;
  23368. if ( (i - begin) < helloSz) {
  23369. if (ssl->version.major == SSLv3_MAJOR &&
  23370. ssl->version.minor >= TLSv1_MINOR) {
  23371. allowExt = 1;
  23372. }
  23373. #ifdef WOLFSSL_DTLS
  23374. if (ssl->version.major == DTLS_MAJOR)
  23375. allowExt = 1;
  23376. #endif
  23377. if (allowExt) {
  23378. word16 totalExtSz;
  23379. if ((i - begin) + OPAQUE16_LEN > helloSz)
  23380. return BUFFER_ERROR;
  23381. ato16(&input[i], &totalExtSz);
  23382. i += OPAQUE16_LEN;
  23383. if ((i - begin) + totalExtSz > helloSz)
  23384. return BUFFER_ERROR;
  23385. while (totalExtSz) {
  23386. word16 extId, extSz;
  23387. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  23388. return BUFFER_ERROR;
  23389. ato16(&input[i], &extId);
  23390. i += OPAQUE16_LEN;
  23391. ato16(&input[i], &extSz);
  23392. i += OPAQUE16_LEN;
  23393. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  23394. return BUFFER_ERROR;
  23395. if (extId == HELLO_EXT_EXTMS)
  23396. pendingEMS = 1;
  23397. else
  23398. i += extSz;
  23399. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  23400. }
  23401. *inOutIdx = i;
  23402. }
  23403. else
  23404. *inOutIdx = begin + helloSz; /* skip extensions */
  23405. }
  23406. if (!pendingEMS && ssl->options.haveEMS)
  23407. ssl->options.haveEMS = 0;
  23408. }
  23409. #endif
  23410. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  23411. if (IsEncryptionOn(ssl, 0)) {
  23412. *inOutIdx += ssl->keys.padSz;
  23413. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  23414. if (ssl->options.startedETMWrite &&
  23415. ssl->specs.cipher_type == block) {
  23416. *inOutIdx += MacSize(ssl);
  23417. }
  23418. #endif
  23419. }
  23420. #ifdef HAVE_SECRET_CALLBACK
  23421. if (ssl->sessionSecretCb != NULL
  23422. #ifdef HAVE_SESSION_TICKET
  23423. && ssl->session->ticketLen > 0
  23424. #endif
  23425. ) {
  23426. int secretSz = SECRET_LEN;
  23427. ret = ssl->sessionSecretCb(ssl, ssl->session->masterSecret,
  23428. &secretSz, ssl->sessionSecretCtx);
  23429. if (ret != 0 || secretSz != SECRET_LEN) {
  23430. WOLFSSL_ERROR_VERBOSE(SESSION_SECRET_CB_E);
  23431. return SESSION_SECRET_CB_E;
  23432. }
  23433. }
  23434. #endif /* HAVE_SECRET_CALLBACK */
  23435. ret = CompleteServerHello(ssl);
  23436. WOLFSSL_LEAVE("DoServerHello", ret);
  23437. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  23438. return ret;
  23439. }
  23440. int CompleteServerHello(WOLFSSL* ssl)
  23441. {
  23442. int ret;
  23443. if (!ssl->options.resuming) {
  23444. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  23445. TLS13_DOWNGRADE_SZ - 1;
  23446. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  23447. #ifdef WOLFSSL_TLS13
  23448. if (TLSv1_3_Capable(ssl)) {
  23449. /* TLS v1.3 capable client not allowed to downgrade when
  23450. * connecting to TLS v1.3 capable server unless cipher suite
  23451. * demands it.
  23452. */
  23453. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  23454. (vers == 0 || vers == 1)) {
  23455. SendAlert(ssl, alert_fatal, illegal_parameter);
  23456. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23457. return VERSION_ERROR;
  23458. }
  23459. }
  23460. else
  23461. #endif
  23462. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  23463. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  23464. (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0) {
  23465. /* TLS v1.2 capable client not allowed to downgrade when
  23466. * connecting to TLS v1.2 capable server.
  23467. */
  23468. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  23469. vers == 0) {
  23470. SendAlert(ssl, alert_fatal, illegal_parameter);
  23471. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  23472. return VERSION_ERROR;
  23473. }
  23474. }
  23475. }
  23476. else {
  23477. if (DSH_CheckSessionId(ssl)) {
  23478. if (SetCipherSpecs(ssl) == 0) {
  23479. XMEMCPY(ssl->arrays->masterSecret,
  23480. ssl->session->masterSecret, SECRET_LEN);
  23481. #ifdef NO_OLD_TLS
  23482. ret = DeriveTlsKeys(ssl);
  23483. #else
  23484. ret = -1; /* default value */
  23485. #ifndef NO_TLS
  23486. if (ssl->options.tls)
  23487. ret = DeriveTlsKeys(ssl);
  23488. #endif
  23489. if (!ssl->options.tls)
  23490. ret = DeriveKeys(ssl);
  23491. #endif /* NO_OLD_TLS */
  23492. /* SERVER: peer auth based on session secret. */
  23493. ssl->options.peerAuthGood = (ret == 0);
  23494. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  23495. return ret;
  23496. }
  23497. else {
  23498. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  23499. WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_SUITE);
  23500. return UNSUPPORTED_SUITE;
  23501. }
  23502. }
  23503. else {
  23504. WOLFSSL_MSG("Server denied resumption attempt");
  23505. ssl->options.resuming = 0; /* server denied resumption try */
  23506. }
  23507. }
  23508. return SetCipherSpecs(ssl);
  23509. }
  23510. #endif /* !WOLFSSL_NO_TLS12 */
  23511. /* Make sure client setup is valid for this suite, true on success */
  23512. int VerifyClientSuite(WOLFSSL* ssl)
  23513. {
  23514. #ifndef NO_PSK
  23515. int havePSK = ssl->options.havePSK;
  23516. #endif
  23517. byte first = ssl->options.cipherSuite0;
  23518. byte second = ssl->options.cipherSuite;
  23519. WOLFSSL_ENTER("VerifyClientSuite");
  23520. if (CipherRequires(first, second, REQUIRES_PSK)) {
  23521. WOLFSSL_MSG("Requires PSK");
  23522. #ifndef NO_PSK
  23523. if (havePSK == 0)
  23524. #endif
  23525. {
  23526. WOLFSSL_MSG("Don't have PSK");
  23527. return 0;
  23528. }
  23529. }
  23530. return 1; /* success */
  23531. }
  23532. #ifndef WOLFSSL_NO_TLS12
  23533. #ifndef NO_CERTS
  23534. /* handle processing of certificate_request (13) */
  23535. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  23536. inOutIdx, word32 size)
  23537. {
  23538. word16 len;
  23539. word32 begin = *inOutIdx;
  23540. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
  23541. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  23542. int ret;
  23543. #endif
  23544. #ifdef OPENSSL_EXTRA
  23545. WOLFSSL_X509* x509 = NULL;
  23546. WOLFSSL_EVP_PKEY* pkey = NULL;
  23547. #endif
  23548. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  23549. WOLFSSL_ENTER("DoCertificateRequest");
  23550. #ifdef WOLFSSL_CALLBACKS
  23551. if (ssl->hsInfoOn)
  23552. AddPacketName(ssl, "CertificateRequest");
  23553. if (ssl->toInfoOn)
  23554. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  23555. #endif
  23556. if (OPAQUE8_LEN > size)
  23557. return BUFFER_ERROR;
  23558. len = input[(*inOutIdx)++];
  23559. if ((*inOutIdx - begin) + len > size)
  23560. return BUFFER_ERROR;
  23561. /* types, read in here */
  23562. *inOutIdx += len;
  23563. /* signature and hash signature algorithm */
  23564. if (IsAtLeastTLSv1_2(ssl)) {
  23565. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  23566. return BUFFER_ERROR;
  23567. ato16(input + *inOutIdx, &len);
  23568. *inOutIdx += OPAQUE16_LEN;
  23569. if ((len > size) || ((*inOutIdx - begin) + len > size))
  23570. return BUFFER_ERROR;
  23571. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  23572. ssl->buffers.certificate &&
  23573. ssl->buffers.certificate->buffer) {
  23574. #ifdef HAVE_PK_CALLBACKS
  23575. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  23576. WOLFSSL_MSG("Using PK for client private key");
  23577. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  23578. return INVALID_PARAMETER;
  23579. }
  23580. #endif
  23581. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  23582. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  23583. return INVALID_PARAMETER;
  23584. }
  23585. }
  23586. *inOutIdx += len;
  23587. #ifdef WC_RSA_PSS
  23588. ssl->pssAlgo = 0;
  23589. if (ssl->suites->sigAlgo == rsa_pss_sa_algo)
  23590. ssl->pssAlgo |= 1 << ssl->suites->hashAlgo;
  23591. #endif
  23592. }
  23593. /* authorities */
  23594. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  23595. return BUFFER_ERROR;
  23596. /* DN seq length */
  23597. ato16(input + *inOutIdx, &len);
  23598. *inOutIdx += OPAQUE16_LEN;
  23599. if ((*inOutIdx - begin) + len > size)
  23600. return BUFFER_ERROR;
  23601. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  23602. if (ssl->ca_names != ssl->ctx->ca_names)
  23603. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  23604. ssl->ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  23605. if (ssl->ca_names == NULL) {
  23606. return MEMORY_ERROR;
  23607. }
  23608. #endif
  23609. while (len) {
  23610. word16 dnSz;
  23611. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  23612. return BUFFER_ERROR;
  23613. ato16(input + *inOutIdx, &dnSz);
  23614. *inOutIdx += OPAQUE16_LEN;
  23615. if ((*inOutIdx - begin) + dnSz > size)
  23616. return BUFFER_ERROR;
  23617. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  23618. {
  23619. WOLFSSL_X509_NAME* name = NULL;
  23620. /* Use a DecodedCert struct to get access to GetName to
  23621. * parse DN name */
  23622. #ifdef WOLFSSL_SMALL_STACK
  23623. DecodedCert *cert = (DecodedCert *)XMALLOC(
  23624. sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
  23625. if (cert == NULL)
  23626. return MEMORY_ERROR;
  23627. #else
  23628. DecodedCert cert[1];
  23629. #endif
  23630. InitDecodedCert(cert, input + *inOutIdx, dnSz, ssl->heap);
  23631. ret = GetName(cert, SUBJECT, dnSz);
  23632. if (ret == 0) {
  23633. if ((name = wolfSSL_X509_NAME_new()) == NULL)
  23634. ret = MEMORY_ERROR;
  23635. }
  23636. if (ret == 0) {
  23637. CopyDecodedName(name, cert, SUBJECT);
  23638. }
  23639. if (ret == 0) {
  23640. if (wolfSSL_sk_X509_NAME_push(ssl->ca_names, name)
  23641. == WOLFSSL_FAILURE)
  23642. {
  23643. ret = MEMORY_ERROR;
  23644. }
  23645. }
  23646. FreeDecodedCert(cert);
  23647. #ifdef WOLFSSL_SMALL_STACK
  23648. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  23649. #endif
  23650. if (ret != 0) {
  23651. if (name != NULL)
  23652. wolfSSL_X509_NAME_free(name);
  23653. return ret;
  23654. }
  23655. }
  23656. #endif
  23657. *inOutIdx += dnSz;
  23658. len -= OPAQUE16_LEN + dnSz;
  23659. }
  23660. #ifdef OPENSSL_EXTRA
  23661. /* call client cert callback if no cert has been loaded */
  23662. if ((ssl->ctx->CBClientCert != NULL) &&
  23663. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  23664. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  23665. if (ret == 1) {
  23666. if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
  23667. (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
  23668. WOLFSSL_ERROR_VERBOSE(CLIENT_CERT_CB_ERROR);
  23669. return CLIENT_CERT_CB_ERROR;
  23670. }
  23671. wolfSSL_X509_free(x509);
  23672. wolfSSL_EVP_PKEY_free(pkey);
  23673. }
  23674. else if (ret < 0) {
  23675. return WOLFSSL_ERROR_WANT_X509_LOOKUP;
  23676. }
  23677. }
  23678. if ((ret = CertSetupCbWrapper(ssl)) != 0)
  23679. return ret;
  23680. #endif
  23681. /* don't send client cert or cert verify if user hasn't provided
  23682. cert and private key */
  23683. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  23684. #ifdef HAVE_PK_CALLBACKS
  23685. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  23686. WOLFSSL_MSG("Using PK for client private key");
  23687. ssl->options.sendVerify = SEND_CERT;
  23688. }
  23689. #endif
  23690. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  23691. ssl->options.sendVerify = SEND_CERT;
  23692. }
  23693. }
  23694. #ifdef OPENSSL_EXTRA
  23695. else
  23696. #else
  23697. else if (IsTLS(ssl))
  23698. #endif
  23699. {
  23700. ssl->options.sendVerify = SEND_BLANK_CERT;
  23701. }
  23702. if (IsEncryptionOn(ssl, 0)) {
  23703. *inOutIdx += ssl->keys.padSz;
  23704. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  23705. if (ssl->options.startedETMRead)
  23706. *inOutIdx += MacSize(ssl);
  23707. #endif
  23708. }
  23709. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  23710. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  23711. return 0;
  23712. }
  23713. #endif /* !NO_CERTS */
  23714. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  23715. static int CheckCurveId(int tlsCurveId)
  23716. {
  23717. int ret = ECC_CURVE_ERROR;
  23718. switch (tlsCurveId) {
  23719. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  23720. #ifndef NO_ECC_SECP
  23721. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  23722. #endif /* !NO_ECC_SECP */
  23723. #ifdef HAVE_ECC_SECPR2
  23724. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  23725. #endif /* HAVE_ECC_SECPR2 */
  23726. #ifdef HAVE_ECC_KOBLITZ
  23727. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  23728. #endif /* HAVE_ECC_KOBLITZ */
  23729. #endif
  23730. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  23731. #ifndef NO_ECC_SECP
  23732. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  23733. #endif /* !NO_ECC_SECP */
  23734. #ifdef HAVE_ECC_KOBLITZ
  23735. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  23736. #endif /* HAVE_ECC_KOBLITZ */
  23737. #endif
  23738. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  23739. #ifndef NO_ECC_SECP
  23740. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  23741. #endif /* !NO_ECC_SECP */
  23742. #ifdef HAVE_ECC_KOBLITZ
  23743. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  23744. #endif /* HAVE_ECC_KOBLITZ */
  23745. #endif
  23746. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  23747. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  23748. #endif
  23749. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  23750. #ifndef NO_ECC_SECP
  23751. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  23752. #endif /* !NO_ECC_SECP */
  23753. #ifdef HAVE_ECC_KOBLITZ
  23754. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  23755. #endif /* HAVE_ECC_KOBLITZ */
  23756. #ifdef HAVE_ECC_BRAINPOOL
  23757. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  23758. #endif /* HAVE_ECC_BRAINPOOL */
  23759. #endif
  23760. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  23761. case WOLFSSL_ECC_X448: return ECC_X448_OID;
  23762. #endif
  23763. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  23764. #ifndef NO_ECC_SECP
  23765. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  23766. #endif /* !NO_ECC_SECP */
  23767. #ifdef HAVE_ECC_BRAINPOOL
  23768. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  23769. #endif /* HAVE_ECC_BRAINPOOL */
  23770. #endif
  23771. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  23772. #ifdef HAVE_ECC_BRAINPOOL
  23773. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  23774. #endif /* HAVE_ECC_BRAINPOOL */
  23775. #endif
  23776. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  23777. #ifndef NO_ECC_SECP
  23778. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  23779. #endif /* !NO_ECC_SECP */
  23780. #endif
  23781. default: break;
  23782. }
  23783. return ret;
  23784. }
  23785. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23786. /* Persistable DoServerKeyExchange arguments */
  23787. typedef struct DskeArgs {
  23788. byte* output; /* not allocated */
  23789. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23790. defined(HAVE_CURVE448)
  23791. byte* verifySig;
  23792. #endif
  23793. word32 idx;
  23794. word32 begin;
  23795. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23796. defined(HAVE_CURVE448)
  23797. word16 verifySigSz;
  23798. #endif
  23799. word16 sigSz;
  23800. byte sigAlgo;
  23801. byte hashAlgo;
  23802. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  23803. int bits;
  23804. #endif
  23805. } DskeArgs;
  23806. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  23807. {
  23808. DskeArgs* args = (DskeArgs*)pArgs;
  23809. (void)ssl;
  23810. (void)args;
  23811. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23812. defined(HAVE_CURVE448)
  23813. if (args->verifySig) {
  23814. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23815. args->verifySig = NULL;
  23816. }
  23817. #endif
  23818. }
  23819. #ifndef NO_DH
  23820. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  23821. DskeArgs* args)
  23822. {
  23823. int ret = 0;
  23824. word16 length;
  23825. #ifdef HAVE_FFDHE
  23826. #ifdef HAVE_PUBLIC_FFDHE
  23827. const DhParams* params = NULL;
  23828. #endif
  23829. word16 group = 0;
  23830. #endif
  23831. if (ssl->buffers.weOwnDH) {
  23832. if (ssl->buffers.serverDH_P.buffer) {
  23833. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23834. DYNAMIC_TYPE_PUBLIC_KEY);
  23835. ssl->buffers.serverDH_P.buffer = NULL;
  23836. }
  23837. if (ssl->buffers.serverDH_G.buffer) {
  23838. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  23839. DYNAMIC_TYPE_PUBLIC_KEY);
  23840. ssl->buffers.serverDH_G.buffer = NULL;
  23841. }
  23842. }
  23843. if (ssl->buffers.serverDH_Pub.buffer) {
  23844. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
  23845. DYNAMIC_TYPE_PUBLIC_KEY);
  23846. ssl->buffers.serverDH_Pub.buffer = NULL;
  23847. }
  23848. /* p */
  23849. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  23850. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23851. }
  23852. ato16(input + args->idx, &length);
  23853. args->idx += OPAQUE16_LEN;
  23854. if ((args->idx - args->begin) + length > size) {
  23855. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23856. }
  23857. if (length < ssl->options.minDhKeySz) {
  23858. WOLFSSL_MSG("Server using a DH key that is too small");
  23859. SendAlert(ssl, alert_fatal, handshake_failure);
  23860. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  23861. }
  23862. if (length > ssl->options.maxDhKeySz) {
  23863. WOLFSSL_MSG("Server using a DH key that is too big");
  23864. SendAlert(ssl, alert_fatal, handshake_failure);
  23865. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  23866. }
  23867. ssl->buffers.serverDH_P.buffer =
  23868. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23869. if (ssl->buffers.serverDH_P.buffer) {
  23870. ssl->buffers.serverDH_P.length = length;
  23871. }
  23872. else {
  23873. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  23874. }
  23875. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  23876. length);
  23877. args->idx += length;
  23878. ssl->options.dhKeySz = length;
  23879. /* g */
  23880. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  23881. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23882. DYNAMIC_TYPE_PUBLIC_KEY);
  23883. ssl->buffers.serverDH_P.buffer = NULL;
  23884. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23885. }
  23886. ato16(input + args->idx, &length);
  23887. args->idx += OPAQUE16_LEN;
  23888. if ((args->idx - args->begin) + length > size) {
  23889. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23890. DYNAMIC_TYPE_PUBLIC_KEY);
  23891. ssl->buffers.serverDH_P.buffer = NULL;
  23892. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23893. }
  23894. if (length > ssl->options.maxDhKeySz) {
  23895. WOLFSSL_MSG("Server using a DH key generator that is too big");
  23896. SendAlert(ssl, alert_fatal, handshake_failure);
  23897. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23898. DYNAMIC_TYPE_PUBLIC_KEY);
  23899. ssl->buffers.serverDH_P.buffer = NULL;
  23900. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  23901. }
  23902. ssl->buffers.serverDH_G.buffer =
  23903. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23904. if (ssl->buffers.serverDH_G.buffer) {
  23905. ssl->buffers.serverDH_G.length = length;
  23906. }
  23907. else {
  23908. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23909. DYNAMIC_TYPE_PUBLIC_KEY);
  23910. ssl->buffers.serverDH_P.buffer = NULL;
  23911. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  23912. }
  23913. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  23914. length);
  23915. args->idx += length;
  23916. /* pub */
  23917. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  23918. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23919. DYNAMIC_TYPE_PUBLIC_KEY);
  23920. ssl->buffers.serverDH_P.buffer = NULL;
  23921. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  23922. DYNAMIC_TYPE_PUBLIC_KEY);
  23923. ssl->buffers.serverDH_G.buffer = NULL;
  23924. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23925. }
  23926. ato16(input + args->idx, &length);
  23927. args->idx += OPAQUE16_LEN;
  23928. if ((args->idx - args->begin) + length > size) {
  23929. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23930. DYNAMIC_TYPE_PUBLIC_KEY);
  23931. ssl->buffers.serverDH_P.buffer = NULL;
  23932. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  23933. DYNAMIC_TYPE_PUBLIC_KEY);
  23934. ssl->buffers.serverDH_G.buffer = NULL;
  23935. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23936. }
  23937. if (length > ssl->options.maxDhKeySz) {
  23938. WOLFSSL_MSG("Server using a public DH key that is too big");
  23939. SendAlert(ssl, alert_fatal, handshake_failure);
  23940. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23941. DYNAMIC_TYPE_PUBLIC_KEY);
  23942. ssl->buffers.serverDH_P.buffer = NULL;
  23943. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  23944. DYNAMIC_TYPE_PUBLIC_KEY);
  23945. ssl->buffers.serverDH_G.buffer = NULL;
  23946. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  23947. }
  23948. ssl->buffers.serverDH_Pub.buffer =
  23949. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23950. if (ssl->buffers.serverDH_Pub.buffer) {
  23951. ssl->buffers.serverDH_Pub.length = length;
  23952. }
  23953. else {
  23954. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23955. DYNAMIC_TYPE_PUBLIC_KEY);
  23956. ssl->buffers.serverDH_P.buffer = NULL;
  23957. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  23958. DYNAMIC_TYPE_PUBLIC_KEY);
  23959. ssl->buffers.serverDH_G.buffer = NULL;
  23960. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  23961. }
  23962. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  23963. length);
  23964. ssl->buffers.weOwnDH = 1;
  23965. args->idx += length;
  23966. #ifdef HAVE_FFDHE
  23967. switch (ssl->options.dhKeySz) {
  23968. #ifdef HAVE_FFDHE_2048
  23969. case 2048/8:
  23970. #ifdef HAVE_PUBLIC_FFDHE
  23971. params = wc_Dh_ffdhe2048_Get();
  23972. #endif
  23973. group = WOLFSSL_FFDHE_2048;
  23974. break;
  23975. #endif
  23976. #ifdef HAVE_FFDHE_3072
  23977. case 3072/8:
  23978. #ifdef HAVE_PUBLIC_FFDHE
  23979. params = wc_Dh_ffdhe3072_Get();
  23980. #endif
  23981. group = WOLFSSL_FFDHE_3072;
  23982. break;
  23983. #endif
  23984. #ifdef HAVE_FFDHE_4096
  23985. case 4096/8:
  23986. #ifdef HAVE_PUBLIC_FFDHE
  23987. params = wc_Dh_ffdhe4096_Get();
  23988. #endif
  23989. group = WOLFSSL_FFDHE_4096;
  23990. break;
  23991. #endif
  23992. #ifdef HAVE_FFDHE_6144
  23993. case 6144/8:
  23994. #ifdef HAVE_PUBLIC_FFDHE
  23995. params = wc_Dh_ffdhe6144_Get();
  23996. #endif
  23997. group = WOLFSSL_FFDHE_6144;
  23998. break;
  23999. #endif
  24000. #ifdef HAVE_FFDHE_8192
  24001. case 8192/8:
  24002. #ifdef HAVE_PUBLIC_FFDHE
  24003. params = wc_Dh_ffdhe8192_Get();
  24004. #endif
  24005. group = WOLFSSL_FFDHE_8192;
  24006. break;
  24007. #endif
  24008. default:
  24009. break;
  24010. }
  24011. #ifdef HAVE_PUBLIC_FFDHE
  24012. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  24013. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  24014. params->g_len) != 0) ||
  24015. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  24016. params->p_len) != 0))
  24017. #else
  24018. if (!wc_DhCmpNamedKey(group, 1,
  24019. ssl->buffers.serverDH_P.buffer, ssl->buffers.serverDH_P.length,
  24020. ssl->buffers.serverDH_G.buffer, ssl->buffers.serverDH_G.length,
  24021. NULL, 0))
  24022. #endif
  24023. {
  24024. WOLFSSL_MSG("Server not using FFDHE parameters");
  24025. #ifdef WOLFSSL_REQUIRE_FFDHE
  24026. SendAlert(ssl, alert_fatal, handshake_failure);
  24027. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  24028. #endif
  24029. }
  24030. else {
  24031. ssl->namedGroup = group;
  24032. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  24033. !defined(HAVE_SELFTEST)
  24034. ssl->options.dhDoKeyTest = 0;
  24035. #endif
  24036. }
  24037. #endif /* HAVE_FFDHE */
  24038. exit_gdpk:
  24039. if (ret != 0) {
  24040. WOLFSSL_ERROR_VERBOSE(ret);
  24041. }
  24042. return ret;
  24043. }
  24044. #endif
  24045. /* handle processing of server_key_exchange (12) */
  24046. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  24047. word32* inOutIdx, word32 size)
  24048. {
  24049. int ret = 0;
  24050. #ifdef WOLFSSL_ASYNC_CRYPT
  24051. DskeArgs* args = NULL;
  24052. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  24053. #else
  24054. DskeArgs args[1];
  24055. #endif
  24056. (void)input;
  24057. (void)size;
  24058. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  24059. WOLFSSL_ENTER("DoServerKeyExchange");
  24060. #ifdef WOLFSSL_ASYNC_CRYPT
  24061. if (ssl->async == NULL) {
  24062. ssl->async = (struct WOLFSSL_ASYNC*)
  24063. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  24064. DYNAMIC_TYPE_ASYNC);
  24065. if (ssl->async == NULL)
  24066. ERROR_OUT(MEMORY_E, exit_dske);
  24067. }
  24068. args = (DskeArgs*)ssl->async->args;
  24069. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  24070. if (ret != WC_NOT_PENDING_E) {
  24071. /* Check for error */
  24072. if (ret < 0)
  24073. goto exit_dske;
  24074. }
  24075. else
  24076. #endif
  24077. {
  24078. /* Reset state */
  24079. ret = 0;
  24080. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  24081. XMEMSET(args, 0, sizeof(DskeArgs));
  24082. args->idx = *inOutIdx;
  24083. args->begin = *inOutIdx;
  24084. args->sigAlgo = ssl->specs.sig_algo;
  24085. args->hashAlgo = sha_mac;
  24086. #ifdef WOLFSSL_ASYNC_CRYPT
  24087. ssl->async->freeArgs = FreeDskeArgs;
  24088. #endif
  24089. }
  24090. switch(ssl->options.asyncState)
  24091. {
  24092. case TLS_ASYNC_BEGIN:
  24093. {
  24094. #ifdef WOLFSSL_CALLBACKS
  24095. if (ssl->hsInfoOn)
  24096. AddPacketName(ssl, "ServerKeyExchange");
  24097. if (ssl->toInfoOn)
  24098. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  24099. #endif
  24100. switch(ssl->specs.kea)
  24101. {
  24102. #ifndef NO_PSK
  24103. case psk_kea:
  24104. {
  24105. int srvHintLen;
  24106. word16 length;
  24107. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24108. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24109. }
  24110. ato16(input + args->idx, &length);
  24111. args->idx += OPAQUE16_LEN;
  24112. if ((args->idx - args->begin) + length > size) {
  24113. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24114. }
  24115. /* get PSK server hint from the wire */
  24116. srvHintLen = min(length, MAX_PSK_ID_LEN);
  24117. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  24118. srvHintLen);
  24119. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  24120. args->idx += length;
  24121. break;
  24122. }
  24123. #endif /* !NO_PSK */
  24124. #ifndef NO_DH
  24125. case diffie_hellman_kea:
  24126. {
  24127. ret = GetDhPublicKey(ssl, input, size, args);
  24128. if (ret != 0)
  24129. goto exit_dske;
  24130. break;
  24131. }
  24132. #endif /* !NO_DH */
  24133. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24134. defined(HAVE_CURVE448)
  24135. case ecc_diffie_hellman_kea:
  24136. {
  24137. byte b;
  24138. #ifdef HAVE_ECC
  24139. int curveId;
  24140. #endif
  24141. int curveOid;
  24142. word16 length;
  24143. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  24144. OPAQUE8_LEN > size) {
  24145. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24146. }
  24147. b = input[args->idx++];
  24148. if (b != named_curve) {
  24149. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  24150. }
  24151. args->idx += 1; /* curve type, eat leading 0 */
  24152. b = input[args->idx++];
  24153. if ((curveOid = CheckCurveId(b)) < 0) {
  24154. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  24155. }
  24156. ssl->ecdhCurveOID = curveOid;
  24157. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  24158. ssl->namedGroup = 0;
  24159. #endif
  24160. length = input[args->idx++];
  24161. if ((args->idx - args->begin) + length > size) {
  24162. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24163. }
  24164. #ifdef HAVE_CURVE25519
  24165. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  24166. if (ssl->peerX25519Key == NULL) {
  24167. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  24168. (void**)&ssl->peerX25519Key);
  24169. if (ret != 0) {
  24170. goto exit_dske;
  24171. }
  24172. } else if (ssl->peerX25519KeyPresent) {
  24173. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  24174. ssl->peerX25519Key);
  24175. ssl->peerX25519KeyPresent = 0;
  24176. if (ret != 0) {
  24177. goto exit_dske;
  24178. }
  24179. }
  24180. if ((ret = wc_curve25519_check_public(
  24181. input + args->idx, length,
  24182. EC25519_LITTLE_ENDIAN)) != 0) {
  24183. #ifdef WOLFSSL_EXTRA_ALERTS
  24184. if (ret == BUFFER_E)
  24185. SendAlert(ssl, alert_fatal, decode_error);
  24186. else if (ret == ECC_OUT_OF_RANGE_E)
  24187. SendAlert(ssl, alert_fatal, bad_record_mac);
  24188. else {
  24189. SendAlert(ssl, alert_fatal, illegal_parameter);
  24190. }
  24191. #endif
  24192. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24193. }
  24194. if (wc_curve25519_import_public_ex(input + args->idx,
  24195. length, ssl->peerX25519Key,
  24196. EC25519_LITTLE_ENDIAN) != 0) {
  24197. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24198. }
  24199. args->idx += length;
  24200. ssl->peerX25519KeyPresent = 1;
  24201. break;
  24202. }
  24203. #endif
  24204. #ifdef HAVE_CURVE448
  24205. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  24206. if (ssl->peerX448Key == NULL) {
  24207. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  24208. (void**)&ssl->peerX448Key);
  24209. if (ret != 0) {
  24210. goto exit_dske;
  24211. }
  24212. } else if (ssl->peerX448KeyPresent) {
  24213. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  24214. ssl->peerX448Key);
  24215. ssl->peerX448KeyPresent = 0;
  24216. if (ret != 0) {
  24217. goto exit_dske;
  24218. }
  24219. }
  24220. if ((ret = wc_curve448_check_public(
  24221. input + args->idx, length,
  24222. EC448_LITTLE_ENDIAN)) != 0) {
  24223. #ifdef WOLFSSL_EXTRA_ALERTS
  24224. if (ret == BUFFER_E)
  24225. SendAlert(ssl, alert_fatal, decode_error);
  24226. else if (ret == ECC_OUT_OF_RANGE_E)
  24227. SendAlert(ssl, alert_fatal, bad_record_mac);
  24228. else {
  24229. SendAlert(ssl, alert_fatal, illegal_parameter);
  24230. }
  24231. #endif
  24232. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24233. }
  24234. if (wc_curve448_import_public_ex(input + args->idx,
  24235. length, ssl->peerX448Key,
  24236. EC448_LITTLE_ENDIAN) != 0) {
  24237. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24238. }
  24239. args->idx += length;
  24240. ssl->peerX448KeyPresent = 1;
  24241. break;
  24242. }
  24243. #endif
  24244. #ifdef HAVE_ECC
  24245. if (ssl->peerEccKey == NULL) {
  24246. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  24247. (void**)&ssl->peerEccKey);
  24248. if (ret != 0) {
  24249. goto exit_dske;
  24250. }
  24251. } else if (ssl->peerEccKeyPresent) {
  24252. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  24253. ssl->peerEccKeyPresent = 0;
  24254. if (ret != 0) {
  24255. goto exit_dske;
  24256. }
  24257. }
  24258. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  24259. if (wc_ecc_import_x963_ex(input + args->idx, length,
  24260. ssl->peerEccKey, curveId) != 0) {
  24261. #ifdef WOLFSSL_EXTRA_ALERTS
  24262. SendAlert(ssl, alert_fatal, illegal_parameter);
  24263. #endif
  24264. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24265. }
  24266. args->idx += length;
  24267. ssl->peerEccKeyPresent = 1;
  24268. #endif
  24269. break;
  24270. }
  24271. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24272. #if !defined(NO_DH) && !defined(NO_PSK)
  24273. case dhe_psk_kea:
  24274. {
  24275. int srvHintLen;
  24276. word16 length;
  24277. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24278. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24279. }
  24280. ato16(input + args->idx, &length);
  24281. args->idx += OPAQUE16_LEN;
  24282. if ((args->idx - args->begin) + length > size) {
  24283. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24284. }
  24285. /* get PSK server hint from the wire */
  24286. srvHintLen = min(length, MAX_PSK_ID_LEN);
  24287. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  24288. srvHintLen);
  24289. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  24290. args->idx += length;
  24291. ret = GetDhPublicKey(ssl, input, size, args);
  24292. if (ret != 0)
  24293. goto exit_dske;
  24294. break;
  24295. }
  24296. #endif /* !NO_DH && !NO_PSK */
  24297. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24298. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  24299. case ecdhe_psk_kea:
  24300. {
  24301. byte b;
  24302. int curveOid, curveId;
  24303. int srvHintLen;
  24304. word16 length;
  24305. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24306. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24307. }
  24308. ato16(input + args->idx, &length);
  24309. args->idx += OPAQUE16_LEN;
  24310. if ((args->idx - args->begin) + length > size) {
  24311. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24312. }
  24313. /* get PSK server hint from the wire */
  24314. srvHintLen = min(length, MAX_PSK_ID_LEN);
  24315. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  24316. srvHintLen);
  24317. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  24318. args->idx += length;
  24319. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  24320. OPAQUE8_LEN > size) {
  24321. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24322. }
  24323. /* Check curve name and ID */
  24324. b = input[args->idx++];
  24325. if (b != named_curve) {
  24326. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  24327. }
  24328. args->idx += 1; /* curve type, eat leading 0 */
  24329. b = input[args->idx++];
  24330. if ((curveOid = CheckCurveId(b)) < 0) {
  24331. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  24332. }
  24333. length = input[args->idx++];
  24334. if ((args->idx - args->begin) + length > size) {
  24335. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24336. }
  24337. #ifdef HAVE_CURVE25519
  24338. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  24339. if (ssl->peerX25519Key == NULL) {
  24340. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  24341. (void**)&ssl->peerX25519Key);
  24342. if (ret != 0) {
  24343. goto exit_dske;
  24344. }
  24345. } else if (ssl->peerEccKeyPresent) {
  24346. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  24347. ssl->peerX25519Key);
  24348. ssl->peerX25519KeyPresent = 0;
  24349. if (ret != 0) {
  24350. goto exit_dske;
  24351. }
  24352. }
  24353. if ((ret = wc_curve25519_check_public(
  24354. input + args->idx, length,
  24355. EC25519_LITTLE_ENDIAN)) != 0) {
  24356. #ifdef WOLFSSL_EXTRA_ALERTS
  24357. if (ret == BUFFER_E)
  24358. SendAlert(ssl, alert_fatal, decode_error);
  24359. else if (ret == ECC_OUT_OF_RANGE_E)
  24360. SendAlert(ssl, alert_fatal, bad_record_mac);
  24361. else {
  24362. SendAlert(ssl, alert_fatal, illegal_parameter);
  24363. }
  24364. #endif
  24365. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24366. }
  24367. if (wc_curve25519_import_public_ex(input + args->idx,
  24368. length, ssl->peerX25519Key,
  24369. EC25519_LITTLE_ENDIAN) != 0) {
  24370. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24371. }
  24372. args->idx += length;
  24373. ssl->peerX25519KeyPresent = 1;
  24374. break;
  24375. }
  24376. #endif
  24377. #ifdef HAVE_CURVE448
  24378. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  24379. if (ssl->peerX448Key == NULL) {
  24380. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  24381. (void**)&ssl->peerX448Key);
  24382. if (ret != 0) {
  24383. goto exit_dske;
  24384. }
  24385. } else if (ssl->peerEccKeyPresent) {
  24386. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  24387. ssl->peerX448Key);
  24388. ssl->peerX448KeyPresent = 0;
  24389. if (ret != 0) {
  24390. goto exit_dske;
  24391. }
  24392. }
  24393. if ((ret = wc_curve448_check_public(
  24394. input + args->idx, length,
  24395. EC448_LITTLE_ENDIAN)) != 0) {
  24396. #ifdef WOLFSSL_EXTRA_ALERTS
  24397. if (ret == BUFFER_E)
  24398. SendAlert(ssl, alert_fatal, decode_error);
  24399. else if (ret == ECC_OUT_OF_RANGE_E)
  24400. SendAlert(ssl, alert_fatal, bad_record_mac);
  24401. else {
  24402. SendAlert(ssl, alert_fatal, illegal_parameter);
  24403. }
  24404. #endif
  24405. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24406. }
  24407. if (wc_curve448_import_public_ex(input + args->idx,
  24408. length, ssl->peerX448Key,
  24409. EC448_LITTLE_ENDIAN) != 0) {
  24410. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24411. }
  24412. args->idx += length;
  24413. ssl->peerX448KeyPresent = 1;
  24414. break;
  24415. }
  24416. #endif
  24417. if (ssl->peerEccKey == NULL) {
  24418. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  24419. (void**)&ssl->peerEccKey);
  24420. if (ret != 0) {
  24421. goto exit_dske;
  24422. }
  24423. } else if (ssl->peerEccKeyPresent) {
  24424. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  24425. ssl->peerEccKeyPresent = 0;
  24426. if (ret != 0) {
  24427. goto exit_dske;
  24428. }
  24429. }
  24430. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  24431. if (wc_ecc_import_x963_ex(input + args->idx, length,
  24432. ssl->peerEccKey, curveId) != 0) {
  24433. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  24434. }
  24435. args->idx += length;
  24436. ssl->peerEccKeyPresent = 1;
  24437. break;
  24438. }
  24439. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  24440. default:
  24441. ret = BAD_KEA_TYPE_E;
  24442. } /* switch(ssl->specs.kea) */
  24443. /* Check for error */
  24444. if (ret != 0) {
  24445. goto exit_dske;
  24446. }
  24447. /* Advance state and proceed */
  24448. ssl->options.asyncState = TLS_ASYNC_BUILD;
  24449. } /* case TLS_ASYNC_BEGIN */
  24450. FALL_THROUGH;
  24451. case TLS_ASYNC_BUILD:
  24452. {
  24453. switch(ssl->specs.kea)
  24454. {
  24455. case psk_kea:
  24456. case dhe_psk_kea:
  24457. case ecdhe_psk_kea:
  24458. {
  24459. /* Nothing to do in this sub-state */
  24460. break;
  24461. }
  24462. case diffie_hellman_kea:
  24463. case ecc_diffie_hellman_kea:
  24464. {
  24465. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  24466. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  24467. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  24468. #else
  24469. enum wc_HashType hashType;
  24470. word16 verifySz;
  24471. byte sigAlgo;
  24472. if (ssl->options.usingAnon_cipher) {
  24473. break;
  24474. }
  24475. verifySz = (word16)(args->idx - args->begin);
  24476. if (verifySz > MAX_DH_SZ) {
  24477. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24478. }
  24479. if (IsAtLeastTLSv1_2(ssl)) {
  24480. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  24481. size) {
  24482. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24483. }
  24484. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  24485. &sigAlgo);
  24486. #ifndef NO_RSA
  24487. if (sigAlgo == rsa_pss_sa_algo &&
  24488. args->sigAlgo == rsa_sa_algo) {
  24489. args->sigAlgo = sigAlgo;
  24490. }
  24491. else
  24492. #endif
  24493. #ifdef HAVE_ED25519
  24494. if (sigAlgo == ed25519_sa_algo &&
  24495. args->sigAlgo == ecc_dsa_sa_algo) {
  24496. args->sigAlgo = sigAlgo;
  24497. }
  24498. else
  24499. #endif
  24500. #ifdef HAVE_ED448
  24501. if (sigAlgo == ed448_sa_algo &&
  24502. args->sigAlgo == ecc_dsa_sa_algo) {
  24503. args->sigAlgo = sigAlgo;
  24504. }
  24505. else
  24506. #endif
  24507. /* Signature algorithm from message must match signature
  24508. * algorithm in cipher suite. */
  24509. if (sigAlgo != args->sigAlgo) {
  24510. ERROR_OUT(ALGO_ID_E, exit_dske);
  24511. }
  24512. args->idx += 2;
  24513. hashType = HashAlgoToType(args->hashAlgo);
  24514. if (hashType == WC_HASH_TYPE_NONE) {
  24515. ERROR_OUT(ALGO_ID_E, exit_dske);
  24516. }
  24517. } else {
  24518. /* only using sha and md5 for rsa */
  24519. #ifndef NO_OLD_TLS
  24520. hashType = WC_HASH_TYPE_SHA;
  24521. if (args->sigAlgo == rsa_sa_algo) {
  24522. hashType = WC_HASH_TYPE_MD5_SHA;
  24523. }
  24524. #else
  24525. ERROR_OUT(ALGO_ID_E, exit_dske);
  24526. #endif
  24527. }
  24528. /* signature */
  24529. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  24530. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24531. }
  24532. ato16(input + args->idx, &args->verifySigSz);
  24533. args->idx += OPAQUE16_LEN;
  24534. if ((args->idx - args->begin) + args->verifySigSz > size) {
  24535. ERROR_OUT(BUFFER_ERROR, exit_dske);
  24536. }
  24537. ret = HashSkeData(ssl, hashType, input + args->begin,
  24538. verifySz, args->sigAlgo);
  24539. if (ret != 0) {
  24540. goto exit_dske;
  24541. }
  24542. switch (args->sigAlgo)
  24543. {
  24544. #ifndef NO_RSA
  24545. #ifdef WC_RSA_PSS
  24546. case rsa_pss_sa_algo:
  24547. #endif
  24548. case rsa_sa_algo:
  24549. {
  24550. if (ssl->peerRsaKey == NULL ||
  24551. !ssl->peerRsaKeyPresent) {
  24552. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24553. }
  24554. break;
  24555. }
  24556. #endif /* !NO_RSA */
  24557. #ifdef HAVE_ECC
  24558. case ecc_dsa_sa_algo:
  24559. {
  24560. if (!ssl->peerEccDsaKeyPresent) {
  24561. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24562. }
  24563. break;
  24564. }
  24565. #endif /* HAVE_ECC */
  24566. #if defined(HAVE_ED25519)
  24567. case ed25519_sa_algo:
  24568. {
  24569. if (!ssl->peerEd25519KeyPresent) {
  24570. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24571. }
  24572. break;
  24573. }
  24574. #endif /* HAVE_ED25519 */
  24575. #if defined(HAVE_ED448)
  24576. case ed448_sa_algo:
  24577. {
  24578. if (!ssl->peerEd448KeyPresent) {
  24579. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24580. }
  24581. break;
  24582. }
  24583. #endif /* HAVE_ED448 */
  24584. default:
  24585. ret = ALGO_ID_E;
  24586. } /* switch (args->sigAlgo) */
  24587. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  24588. break;
  24589. }
  24590. default:
  24591. ret = BAD_KEA_TYPE_E;
  24592. } /* switch(ssl->specs.kea) */
  24593. /* Check for error */
  24594. if (ret != 0) {
  24595. goto exit_dske;
  24596. }
  24597. /* Advance state and proceed */
  24598. ssl->options.asyncState = TLS_ASYNC_DO;
  24599. } /* case TLS_ASYNC_BUILD */
  24600. FALL_THROUGH;
  24601. case TLS_ASYNC_DO:
  24602. {
  24603. switch(ssl->specs.kea)
  24604. {
  24605. case psk_kea:
  24606. case dhe_psk_kea:
  24607. case ecdhe_psk_kea:
  24608. {
  24609. /* Nothing to do in this sub-state */
  24610. break;
  24611. }
  24612. case diffie_hellman_kea:
  24613. case ecc_diffie_hellman_kea:
  24614. {
  24615. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  24616. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  24617. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  24618. #else
  24619. if (ssl->options.usingAnon_cipher) {
  24620. break;
  24621. }
  24622. if (args->verifySig == NULL) {
  24623. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  24624. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24625. if (args->verifySig == NULL) {
  24626. ERROR_OUT(MEMORY_E, exit_dske);
  24627. }
  24628. XMEMCPY(args->verifySig, input + args->idx,
  24629. args->verifySigSz);
  24630. }
  24631. switch (args->sigAlgo)
  24632. {
  24633. #ifndef NO_RSA
  24634. #ifdef WC_RSA_PSS
  24635. case rsa_pss_sa_algo:
  24636. #endif
  24637. case rsa_sa_algo:
  24638. {
  24639. ret = RsaVerify(ssl,
  24640. args->verifySig, args->verifySigSz,
  24641. &args->output,
  24642. args->sigAlgo, args->hashAlgo,
  24643. ssl->peerRsaKey,
  24644. #ifdef HAVE_PK_CALLBACKS
  24645. &ssl->buffers.peerRsaKey
  24646. #else
  24647. NULL
  24648. #endif
  24649. );
  24650. if (ret >= 0) {
  24651. args->sigSz = (word16)ret;
  24652. #ifdef WC_RSA_PSS
  24653. args->bits = mp_count_bits(&ssl->peerRsaKey->n);
  24654. #endif
  24655. ret = 0;
  24656. }
  24657. #ifdef WOLFSSL_ASYNC_CRYPT
  24658. if (ret != WC_PENDING_E)
  24659. #endif
  24660. {
  24661. /* peerRsaKey */
  24662. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  24663. (void**)&ssl->peerRsaKey);
  24664. ssl->peerRsaKeyPresent = 0;
  24665. }
  24666. break;
  24667. }
  24668. #endif /* !NO_RSA */
  24669. #ifdef HAVE_ECC
  24670. case ecc_dsa_sa_algo:
  24671. {
  24672. ret = EccVerify(ssl,
  24673. args->verifySig, args->verifySigSz,
  24674. ssl->buffers.digest.buffer,
  24675. ssl->buffers.digest.length,
  24676. ssl->peerEccDsaKey,
  24677. #ifdef HAVE_PK_CALLBACKS
  24678. &ssl->buffers.peerEccDsaKey
  24679. #else
  24680. NULL
  24681. #endif
  24682. );
  24683. #ifdef WOLFSSL_ASYNC_CRYPT
  24684. if (ret != WC_PENDING_E)
  24685. #endif
  24686. {
  24687. /* peerEccDsaKey */
  24688. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  24689. (void**)&ssl->peerEccDsaKey);
  24690. ssl->peerEccDsaKeyPresent = 0;
  24691. }
  24692. /* CLIENT: Data verified with cert's public key. */
  24693. ssl->options.peerAuthGood =
  24694. ssl->options.havePeerCert && (ret == 0);
  24695. break;
  24696. }
  24697. #endif /* HAVE_ECC */
  24698. #if defined(HAVE_ED25519)
  24699. case ed25519_sa_algo:
  24700. {
  24701. ret = Ed25519Verify(ssl,
  24702. args->verifySig, args->verifySigSz,
  24703. ssl->buffers.sig.buffer,
  24704. ssl->buffers.sig.length,
  24705. ssl->peerEd25519Key,
  24706. #ifdef HAVE_PK_CALLBACKS
  24707. &ssl->buffers.peerEd25519Key
  24708. #else
  24709. NULL
  24710. #endif
  24711. );
  24712. #ifdef WOLFSSL_ASYNC_CRYPT
  24713. if (ret != WC_PENDING_E)
  24714. #endif
  24715. {
  24716. /* peerEccDsaKey */
  24717. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  24718. (void**)&ssl->peerEd25519Key);
  24719. ssl->peerEd25519KeyPresent = 0;
  24720. }
  24721. /* CLIENT: Data verified with cert's public key. */
  24722. ssl->options.peerAuthGood =
  24723. ssl->options.havePeerCert && (ret == 0);
  24724. break;
  24725. }
  24726. #endif /* HAVE_ED25519 */
  24727. #if defined(HAVE_ED448)
  24728. case ed448_sa_algo:
  24729. {
  24730. ret = Ed448Verify(ssl,
  24731. args->verifySig, args->verifySigSz,
  24732. ssl->buffers.sig.buffer,
  24733. ssl->buffers.sig.length,
  24734. ssl->peerEd448Key,
  24735. #ifdef HAVE_PK_CALLBACKS
  24736. &ssl->buffers.peerEd448Key
  24737. #else
  24738. NULL
  24739. #endif
  24740. );
  24741. #ifdef WOLFSSL_ASYNC_CRYPT
  24742. if (ret != WC_PENDING_E)
  24743. #endif
  24744. {
  24745. /* peerEccDsaKey */
  24746. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  24747. (void**)&ssl->peerEd448Key);
  24748. ssl->peerEd448KeyPresent = 0;
  24749. }
  24750. /* CLIENT: Data verified with cert's public key. */
  24751. ssl->options.peerAuthGood =
  24752. ssl->options.havePeerCert && (ret == 0);
  24753. break;
  24754. }
  24755. #endif /* HAVE_ED448 */
  24756. default:
  24757. ret = ALGO_ID_E;
  24758. } /* switch (sigAlgo) */
  24759. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  24760. break;
  24761. }
  24762. default:
  24763. ret = BAD_KEA_TYPE_E;
  24764. } /* switch(ssl->specs.kea) */
  24765. /* Check for error */
  24766. if (ret != 0) {
  24767. goto exit_dske;
  24768. }
  24769. /* Advance state and proceed */
  24770. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  24771. } /* case TLS_ASYNC_DO */
  24772. FALL_THROUGH;
  24773. case TLS_ASYNC_VERIFY:
  24774. {
  24775. switch(ssl->specs.kea)
  24776. {
  24777. case psk_kea:
  24778. case dhe_psk_kea:
  24779. case ecdhe_psk_kea:
  24780. {
  24781. /* Nothing to do in this sub-state */
  24782. break;
  24783. }
  24784. case diffie_hellman_kea:
  24785. case ecc_diffie_hellman_kea:
  24786. {
  24787. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  24788. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  24789. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  24790. #else
  24791. if (ssl->options.usingAnon_cipher) {
  24792. break;
  24793. }
  24794. /* increment index after verify is done */
  24795. args->idx += args->verifySigSz;
  24796. switch(args->sigAlgo)
  24797. {
  24798. #ifndef NO_RSA
  24799. #ifdef WC_RSA_PSS
  24800. case rsa_pss_sa_algo:
  24801. #ifdef HAVE_SELFTEST
  24802. ret = wc_RsaPSS_CheckPadding(
  24803. ssl->buffers.digest.buffer,
  24804. ssl->buffers.digest.length,
  24805. args->output, args->sigSz,
  24806. HashAlgoToType(args->hashAlgo));
  24807. #else
  24808. ret = wc_RsaPSS_CheckPadding_ex(
  24809. ssl->buffers.digest.buffer,
  24810. ssl->buffers.digest.length,
  24811. args->output, args->sigSz,
  24812. HashAlgoToType(args->hashAlgo),
  24813. -1, args->bits);
  24814. #endif
  24815. if (ret != 0)
  24816. goto exit_dske;
  24817. /* CLIENT: Data verified with cert's public key. */
  24818. ssl->options.peerAuthGood =
  24819. ssl->options.havePeerCert;
  24820. break;
  24821. #endif
  24822. case rsa_sa_algo:
  24823. {
  24824. #if (defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  24825. defined(WOLFSSL_RENESAS_SCEPROTECT_ECC)) || \
  24826. defined(WOLFSSL_RENESAS_TSIP_TLS)
  24827. /* already checked signature result by SCE */
  24828. /* skip the sign checks below */
  24829. if (Renesas_cmn_usable(ssl, 0)) {
  24830. break;
  24831. }
  24832. #endif
  24833. if (IsAtLeastTLSv1_2(ssl)) {
  24834. #ifdef WOLFSSL_SMALL_STACK
  24835. byte* encodedSig;
  24836. #else
  24837. byte encodedSig[MAX_ENCODED_SIG_SZ];
  24838. #endif
  24839. word32 encSigSz;
  24840. #ifdef WOLFSSL_SMALL_STACK
  24841. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  24842. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24843. if (encodedSig == NULL) {
  24844. ERROR_OUT(MEMORY_E, exit_dske);
  24845. }
  24846. #endif
  24847. encSigSz = wc_EncodeSignature(encodedSig,
  24848. ssl->buffers.digest.buffer,
  24849. ssl->buffers.digest.length,
  24850. TypeHash(args->hashAlgo));
  24851. if (encSigSz != args->sigSz || !args->output ||
  24852. XMEMCMP(args->output, encodedSig,
  24853. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  24854. ret = VERIFY_SIGN_ERROR;
  24855. }
  24856. #ifdef WOLFSSL_SMALL_STACK
  24857. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24858. #endif
  24859. if (ret != 0) {
  24860. goto exit_dske;
  24861. }
  24862. }
  24863. else if (args->sigSz != FINISHED_SZ ||
  24864. !args->output ||
  24865. XMEMCMP(args->output,
  24866. ssl->buffers.digest.buffer,
  24867. FINISHED_SZ) != 0) {
  24868. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  24869. }
  24870. /* CLIENT: Data verified with cert's public key. */
  24871. ssl->options.peerAuthGood =
  24872. ssl->options.havePeerCert;
  24873. break;
  24874. }
  24875. #endif /* !NO_RSA */
  24876. #ifdef HAVE_ECC
  24877. case ecc_dsa_sa_algo:
  24878. /* Nothing to do in this algo */
  24879. break;
  24880. #endif /* HAVE_ECC */
  24881. #if defined(HAVE_ED25519)
  24882. case ed25519_sa_algo:
  24883. /* Nothing to do in this algo */
  24884. break;
  24885. #endif /* HAVE_ED25519 */
  24886. #if defined(HAVE_ED448)
  24887. case ed448_sa_algo:
  24888. /* Nothing to do in this algo */
  24889. break;
  24890. #endif /* HAVE_ED448 */
  24891. default:
  24892. ret = ALGO_ID_E;
  24893. } /* switch (sigAlgo) */
  24894. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  24895. break;
  24896. }
  24897. default:
  24898. ret = BAD_KEA_TYPE_E;
  24899. } /* switch(ssl->specs.kea) */
  24900. /* Check for error */
  24901. if (ret != 0) {
  24902. goto exit_dske;
  24903. }
  24904. /* Advance state and proceed */
  24905. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  24906. } /* case TLS_ASYNC_VERIFY */
  24907. FALL_THROUGH;
  24908. case TLS_ASYNC_FINALIZE:
  24909. {
  24910. if (IsEncryptionOn(ssl, 0)) {
  24911. args->idx += ssl->keys.padSz;
  24912. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  24913. if (ssl->options.startedETMRead)
  24914. args->idx += MacSize(ssl);
  24915. #endif
  24916. }
  24917. /* Advance state and proceed */
  24918. ssl->options.asyncState = TLS_ASYNC_END;
  24919. } /* case TLS_ASYNC_FINALIZE */
  24920. FALL_THROUGH;
  24921. case TLS_ASYNC_END:
  24922. {
  24923. /* return index */
  24924. *inOutIdx = args->idx;
  24925. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  24926. break;
  24927. }
  24928. default:
  24929. ret = INPUT_CASE_ERROR;
  24930. } /* switch(ssl->options.asyncState) */
  24931. exit_dske:
  24932. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  24933. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  24934. #ifdef WOLFSSL_ASYNC_CRYPT
  24935. /* Handle async operation */
  24936. if (ret == WC_PENDING_E) {
  24937. /* Mark message as not received so it can process again */
  24938. ssl->msgsReceived.got_server_key_exchange = 0;
  24939. return ret;
  24940. }
  24941. /* Cleanup async */
  24942. FreeAsyncCtx(ssl, 0);
  24943. #else
  24944. FreeDskeArgs(ssl, args);
  24945. #endif /* WOLFSSL_ASYNC_CRYPT */
  24946. /* Final cleanup */
  24947. FreeKeyExchange(ssl);
  24948. if (ret != 0) {
  24949. WOLFSSL_ERROR_VERBOSE(ret);
  24950. }
  24951. return ret;
  24952. }
  24953. typedef struct SckeArgs {
  24954. byte* output; /* not allocated */
  24955. byte* encSecret;
  24956. byte* input;
  24957. word32 encSz;
  24958. word32 length;
  24959. int sendSz;
  24960. int inputSz;
  24961. } SckeArgs;
  24962. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  24963. {
  24964. SckeArgs* args = (SckeArgs*)pArgs;
  24965. (void)ssl;
  24966. if (args->encSecret) {
  24967. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  24968. args->encSecret = NULL;
  24969. }
  24970. if (args->input) {
  24971. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24972. args->input = NULL;
  24973. }
  24974. }
  24975. /* handle generation client_key_exchange (16) */
  24976. int SendClientKeyExchange(WOLFSSL* ssl)
  24977. {
  24978. int ret = 0;
  24979. #ifdef WOLFSSL_ASYNC_IO
  24980. SckeArgs* args = NULL;
  24981. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  24982. #else
  24983. SckeArgs args[1];
  24984. #endif
  24985. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  24986. WOLFSSL_ENTER("SendClientKeyExchange");
  24987. #ifdef OPENSSL_EXTRA
  24988. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  24989. ssl->cbmode = SSL_CB_MODE_WRITE;
  24990. if (ssl->CBIS != NULL)
  24991. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  24992. #endif
  24993. #ifdef WOLFSSL_ASYNC_IO
  24994. if (ssl->async == NULL) {
  24995. ssl->async = (struct WOLFSSL_ASYNC*)
  24996. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  24997. DYNAMIC_TYPE_ASYNC);
  24998. if (ssl->async == NULL)
  24999. ERROR_OUT(MEMORY_E, exit_scke);
  25000. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  25001. }
  25002. args = (SckeArgs*)ssl->async->args;
  25003. #ifdef WOLFSSL_ASYNC_CRYPT
  25004. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  25005. if (ret != WC_NOT_PENDING_E) {
  25006. /* Check for error */
  25007. if (ret < 0)
  25008. goto exit_scke;
  25009. }
  25010. else
  25011. #endif
  25012. if (ssl->options.buildingMsg) {
  25013. /* Continue building the message */
  25014. }
  25015. else
  25016. #endif
  25017. {
  25018. /* Reset state */
  25019. ret = 0;
  25020. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  25021. XMEMSET(args, 0, sizeof(SckeArgs));
  25022. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  25023. * is not advanced yet */
  25024. ssl->options.buildingMsg = 1;
  25025. #ifdef WOLFSSL_ASYNC_IO
  25026. ssl->async->freeArgs = FreeSckeArgs;
  25027. #endif
  25028. }
  25029. switch(ssl->options.asyncState)
  25030. {
  25031. case TLS_ASYNC_BEGIN:
  25032. {
  25033. switch (ssl->specs.kea) {
  25034. #ifndef NO_RSA
  25035. case rsa_kea:
  25036. if (ssl->peerRsaKey == NULL ||
  25037. ssl->peerRsaKeyPresent == 0) {
  25038. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25039. }
  25040. break;
  25041. #endif
  25042. #ifndef NO_DH
  25043. case diffie_hellman_kea:
  25044. if (ssl->buffers.serverDH_P.buffer == NULL ||
  25045. ssl->buffers.serverDH_G.buffer == NULL ||
  25046. ssl->buffers.serverDH_Pub.buffer == NULL) {
  25047. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25048. }
  25049. break;
  25050. #endif /* NO_DH */
  25051. #ifndef NO_PSK
  25052. case psk_kea:
  25053. /* sanity check that PSK client callback has been set */
  25054. if (ssl->options.client_psk_cb == NULL) {
  25055. WOLFSSL_MSG("No client PSK callback set");
  25056. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25057. }
  25058. break;
  25059. #endif /* NO_PSK */
  25060. #if !defined(NO_DH) && !defined(NO_PSK)
  25061. case dhe_psk_kea:
  25062. if (ssl->buffers.serverDH_P.buffer == NULL ||
  25063. ssl->buffers.serverDH_G.buffer == NULL ||
  25064. ssl->buffers.serverDH_Pub.buffer == NULL) {
  25065. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25066. }
  25067. /* sanity check that PSK client callback has been set */
  25068. if (ssl->options.client_psk_cb == NULL) {
  25069. WOLFSSL_MSG("No client PSK callback set");
  25070. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25071. }
  25072. break;
  25073. #endif /* !NO_DH && !NO_PSK */
  25074. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25075. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25076. case ecdhe_psk_kea:
  25077. /* sanity check that PSK client callback has been set */
  25078. if (ssl->options.client_psk_cb == NULL) {
  25079. WOLFSSL_MSG("No client PSK callback set");
  25080. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25081. }
  25082. #ifdef HAVE_CURVE25519
  25083. if (ssl->peerX25519KeyPresent) {
  25084. /* Check client ECC public key */
  25085. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  25086. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25087. }
  25088. #ifdef HAVE_PK_CALLBACKS
  25089. /* if callback then use it for shared secret */
  25090. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  25091. break;
  25092. }
  25093. #endif
  25094. /* create private key */
  25095. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  25096. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25097. if (ret != 0) {
  25098. goto exit_scke;
  25099. }
  25100. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  25101. ssl->peerX25519Key);
  25102. break;
  25103. }
  25104. #endif
  25105. #ifdef HAVE_CURVE448
  25106. if (ssl->peerX448KeyPresent) {
  25107. /* Check client ECC public key */
  25108. if (!ssl->peerX448Key) {
  25109. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25110. }
  25111. #ifdef HAVE_PK_CALLBACKS
  25112. /* if callback then use it for shared secret */
  25113. if (ssl->ctx->X448SharedSecretCb != NULL) {
  25114. break;
  25115. }
  25116. #endif
  25117. /* create private key */
  25118. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  25119. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25120. if (ret != 0) {
  25121. goto exit_scke;
  25122. }
  25123. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  25124. ssl->peerX448Key);
  25125. break;
  25126. }
  25127. #endif
  25128. /* Check client ECC public key */
  25129. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  25130. !ssl->peerEccKey->dp) {
  25131. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25132. }
  25133. #ifdef HAVE_PK_CALLBACKS
  25134. /* if callback then use it for shared secret */
  25135. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25136. break;
  25137. }
  25138. #endif
  25139. /* create ephemeral private key */
  25140. ssl->hsType = DYNAMIC_TYPE_ECC;
  25141. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25142. if (ret != 0) {
  25143. goto exit_scke;
  25144. }
  25145. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  25146. break;
  25147. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  25148. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25149. defined(HAVE_CURVE448)
  25150. case ecc_diffie_hellman_kea:
  25151. {
  25152. #ifdef HAVE_ECC
  25153. ecc_key* peerKey;
  25154. #endif
  25155. #ifdef HAVE_PK_CALLBACKS
  25156. /* if callback then use it for shared secret */
  25157. #ifdef HAVE_CURVE25519
  25158. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25159. if (ssl->ctx->X25519SharedSecretCb != NULL)
  25160. break;
  25161. }
  25162. else
  25163. #endif
  25164. #ifdef HAVE_CURVE448
  25165. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25166. if (ssl->ctx->X448SharedSecretCb != NULL)
  25167. break;
  25168. }
  25169. else
  25170. #endif
  25171. #ifdef HAVE_ECC
  25172. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25173. break;
  25174. }
  25175. else
  25176. #endif
  25177. {
  25178. }
  25179. #endif /* HAVE_PK_CALLBACKS */
  25180. #ifdef HAVE_CURVE25519
  25181. if (ssl->peerX25519KeyPresent) {
  25182. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  25183. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25184. }
  25185. /* create private key */
  25186. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  25187. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25188. if (ret != 0) {
  25189. goto exit_scke;
  25190. }
  25191. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  25192. ssl->peerX25519Key);
  25193. break;
  25194. }
  25195. #endif
  25196. #ifdef HAVE_CURVE448
  25197. if (ssl->peerX448KeyPresent) {
  25198. if (!ssl->peerX448Key) {
  25199. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25200. }
  25201. /* create private key */
  25202. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  25203. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25204. if (ret != 0) {
  25205. goto exit_scke;
  25206. }
  25207. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  25208. ssl->peerX448Key);
  25209. break;
  25210. }
  25211. #endif
  25212. #ifdef HAVE_ECC
  25213. if (ssl->specs.static_ecdh) {
  25214. /* Note: EccDsa is really fixed Ecc key here */
  25215. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
  25216. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25217. }
  25218. peerKey = ssl->peerEccDsaKey;
  25219. }
  25220. else {
  25221. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
  25222. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25223. }
  25224. peerKey = ssl->peerEccKey;
  25225. }
  25226. if (peerKey == NULL) {
  25227. ERROR_OUT(NO_PEER_KEY, exit_scke);
  25228. }
  25229. /* create ephemeral private key */
  25230. ssl->hsType = DYNAMIC_TYPE_ECC;
  25231. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  25232. if (ret != 0) {
  25233. goto exit_scke;
  25234. }
  25235. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  25236. #endif
  25237. break;
  25238. }
  25239. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25240. default:
  25241. ret = BAD_KEA_TYPE_E;
  25242. } /* switch(ssl->specs.kea) */
  25243. /* Check for error */
  25244. if (ret != 0) {
  25245. goto exit_scke;
  25246. }
  25247. /* Advance state and proceed */
  25248. ssl->options.asyncState = TLS_ASYNC_BUILD;
  25249. } /* case TLS_ASYNC_BEGIN */
  25250. FALL_THROUGH;
  25251. case TLS_ASYNC_BUILD:
  25252. {
  25253. args->encSz = MAX_ENCRYPT_SZ;
  25254. args->encSecret = (byte*)XMALLOC(MAX_ENCRYPT_SZ, ssl->heap,
  25255. DYNAMIC_TYPE_SECRET);
  25256. if (args->encSecret == NULL) {
  25257. ERROR_OUT(MEMORY_E, exit_scke);
  25258. }
  25259. if (ssl->arrays->preMasterSecret == NULL) {
  25260. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  25261. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  25262. ssl->heap, DYNAMIC_TYPE_SECRET);
  25263. if (ssl->arrays->preMasterSecret == NULL) {
  25264. ERROR_OUT(MEMORY_E, exit_scke);
  25265. }
  25266. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  25267. }
  25268. switch(ssl->specs.kea)
  25269. {
  25270. #ifndef NO_RSA
  25271. case rsa_kea:
  25272. {
  25273. #ifdef HAVE_PK_CALLBACKS
  25274. if (ssl->ctx->GenPreMasterCb) {
  25275. void* ctx = wolfSSL_GetGenPreMasterCtx(ssl);
  25276. ret = ssl->ctx->GenPreMasterCb(ssl,
  25277. ssl->arrays->preMasterSecret, ENCRYPT_LEN, ctx);
  25278. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  25279. goto exit_scke;
  25280. }
  25281. }
  25282. if (!ssl->ctx->GenPreMasterCb || ret == PROTOCOLCB_UNAVAILABLE)
  25283. #endif
  25284. {
  25285. /* build PreMasterSecret with RNG data */
  25286. ret = wc_RNG_GenerateBlock(ssl->rng,
  25287. &ssl->arrays->preMasterSecret[VERSION_SZ],
  25288. SECRET_LEN - VERSION_SZ);
  25289. if (ret != 0) {
  25290. goto exit_scke;
  25291. }
  25292. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  25293. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  25294. ssl->arrays->preMasterSz = SECRET_LEN;
  25295. }
  25296. break;
  25297. }
  25298. #endif /* !NO_RSA */
  25299. #ifndef NO_DH
  25300. case diffie_hellman_kea:
  25301. {
  25302. ssl->buffers.sig.length = ENCRYPT_LEN;
  25303. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  25304. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25305. if (ssl->buffers.sig.buffer == NULL) {
  25306. ERROR_OUT(MEMORY_E, exit_scke);
  25307. }
  25308. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  25309. (void**)&ssl->buffers.serverDH_Key);
  25310. if (ret != 0) {
  25311. goto exit_scke;
  25312. }
  25313. #if defined(HAVE_FFDHE) && !defined(HAVE_PUBLIC_FFDHE)
  25314. if (ssl->namedGroup) {
  25315. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  25316. ssl->namedGroup);
  25317. if (ret != 0) {
  25318. goto exit_scke;
  25319. }
  25320. ssl->buffers.sig.length =
  25321. wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  25322. }
  25323. else
  25324. #endif
  25325. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  25326. !defined(WOLFSSL_OLD_PRIME_CHECK)
  25327. if (ssl->options.dhDoKeyTest &&
  25328. !ssl->options.dhKeyTested)
  25329. {
  25330. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  25331. ssl->buffers.serverDH_P.buffer,
  25332. ssl->buffers.serverDH_P.length,
  25333. ssl->buffers.serverDH_G.buffer,
  25334. ssl->buffers.serverDH_G.length,
  25335. NULL, 0, 0, ssl->rng);
  25336. if (ret != 0) {
  25337. goto exit_scke;
  25338. }
  25339. ssl->options.dhKeyTested = 1;
  25340. }
  25341. else
  25342. #endif
  25343. {
  25344. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  25345. ssl->buffers.serverDH_P.buffer,
  25346. ssl->buffers.serverDH_P.length,
  25347. ssl->buffers.serverDH_G.buffer,
  25348. ssl->buffers.serverDH_G.length);
  25349. if (ret != 0) {
  25350. goto exit_scke;
  25351. }
  25352. }
  25353. /* for DH, encSecret is Yc, agree is pre-master */
  25354. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  25355. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  25356. args->encSecret, &args->encSz);
  25357. /* set the max agree result size */
  25358. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  25359. break;
  25360. }
  25361. #endif /* !NO_DH */
  25362. #ifndef NO_PSK
  25363. case psk_kea:
  25364. {
  25365. byte* pms = ssl->arrays->preMasterSecret;
  25366. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  25367. ssl->arrays->server_hint, ssl->arrays->client_identity,
  25368. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  25369. if (ssl->arrays->psk_keySz == 0 ||
  25370. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  25371. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25372. }
  25373. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  25374. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  25375. if (args->encSz > MAX_PSK_ID_LEN) {
  25376. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  25377. }
  25378. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  25379. args->encSz);
  25380. /* CLIENT: Pre-shared Key for peer authentication. */
  25381. ssl->options.peerAuthGood = 1;
  25382. /* make psk pre master secret */
  25383. /* length of key + length 0s + length of key + key */
  25384. c16toa((word16)ssl->arrays->psk_keySz, pms);
  25385. pms += OPAQUE16_LEN;
  25386. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  25387. pms += ssl->arrays->psk_keySz;
  25388. c16toa((word16)ssl->arrays->psk_keySz, pms);
  25389. pms += OPAQUE16_LEN;
  25390. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25391. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
  25392. (2 * OPAQUE16_LEN);
  25393. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25394. ssl->arrays->psk_keySz = 0; /* No further need */
  25395. break;
  25396. }
  25397. #endif /* !NO_PSK */
  25398. #if !defined(NO_DH) && !defined(NO_PSK)
  25399. case dhe_psk_kea:
  25400. {
  25401. word32 esSz = 0;
  25402. args->output = args->encSecret;
  25403. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  25404. ssl->arrays->server_hint, ssl->arrays->client_identity,
  25405. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  25406. if (ssl->arrays->psk_keySz == 0 ||
  25407. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  25408. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25409. }
  25410. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  25411. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  25412. if (esSz > MAX_PSK_ID_LEN) {
  25413. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  25414. }
  25415. /* CLIENT: Pre-shared Key for peer authentication. */
  25416. ssl->options.peerAuthGood = 1;
  25417. ssl->buffers.sig.length = ENCRYPT_LEN;
  25418. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  25419. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25420. if (ssl->buffers.sig.buffer == NULL) {
  25421. ERROR_OUT(MEMORY_E, exit_scke);
  25422. }
  25423. c16toa((word16)esSz, args->output);
  25424. args->output += OPAQUE16_LEN;
  25425. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  25426. args->output += esSz;
  25427. args->length = args->encSz - esSz - OPAQUE16_LEN;
  25428. args->encSz = esSz + OPAQUE16_LEN;
  25429. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  25430. (void**)&ssl->buffers.serverDH_Key);
  25431. if (ret != 0) {
  25432. goto exit_scke;
  25433. }
  25434. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  25435. !defined(WOLFSSL_OLD_PRIME_CHECK)
  25436. if (ssl->options.dhDoKeyTest &&
  25437. !ssl->options.dhKeyTested)
  25438. {
  25439. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  25440. ssl->buffers.serverDH_P.buffer,
  25441. ssl->buffers.serverDH_P.length,
  25442. ssl->buffers.serverDH_G.buffer,
  25443. ssl->buffers.serverDH_G.length,
  25444. NULL, 0, 0, ssl->rng);
  25445. if (ret != 0) {
  25446. goto exit_scke;
  25447. }
  25448. ssl->options.dhKeyTested = 1;
  25449. }
  25450. else
  25451. #endif
  25452. {
  25453. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  25454. ssl->buffers.serverDH_P.buffer,
  25455. ssl->buffers.serverDH_P.length,
  25456. ssl->buffers.serverDH_G.buffer,
  25457. ssl->buffers.serverDH_G.length);
  25458. if (ret != 0) {
  25459. goto exit_scke;
  25460. }
  25461. }
  25462. /* for DH, encSecret is Yc, agree is pre-master */
  25463. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  25464. ssl->buffers.sig.buffer,
  25465. (word32*)&ssl->buffers.sig.length,
  25466. args->output + OPAQUE16_LEN, &args->length);
  25467. break;
  25468. }
  25469. #endif /* !NO_DH && !NO_PSK */
  25470. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25471. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25472. case ecdhe_psk_kea:
  25473. {
  25474. word32 esSz = 0;
  25475. args->output = args->encSecret;
  25476. /* Send PSK client identity */
  25477. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  25478. ssl->arrays->server_hint, ssl->arrays->client_identity,
  25479. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  25480. if (ssl->arrays->psk_keySz == 0 ||
  25481. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  25482. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  25483. }
  25484. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  25485. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  25486. if (esSz > MAX_PSK_ID_LEN) {
  25487. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  25488. }
  25489. /* CLIENT: Pre-shared Key for peer authentication. */
  25490. ssl->options.peerAuthGood = 1;
  25491. /* place size and identity in output buffer sz:identity */
  25492. c16toa((word16)esSz, args->output);
  25493. args->output += OPAQUE16_LEN;
  25494. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  25495. args->output += esSz;
  25496. args->encSz = esSz + OPAQUE16_LEN;
  25497. /* length is used for public key size */
  25498. args->length = MAX_ENCRYPT_SZ;
  25499. /* Create shared ECC key leaving room at the beginning
  25500. of buffer for size of shared key. */
  25501. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  25502. #ifdef HAVE_CURVE25519
  25503. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25504. #ifdef HAVE_PK_CALLBACKS
  25505. /* if callback then use it for shared secret */
  25506. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  25507. break;
  25508. }
  25509. #endif
  25510. ret = wc_curve25519_export_public_ex(
  25511. (curve25519_key*)ssl->hsKey,
  25512. args->output + OPAQUE8_LEN, &args->length,
  25513. EC25519_LITTLE_ENDIAN);
  25514. if (ret != 0) {
  25515. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25516. }
  25517. break;
  25518. }
  25519. #endif
  25520. #ifdef HAVE_CURVE448
  25521. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25522. #ifdef HAVE_PK_CALLBACKS
  25523. /* if callback then use it for shared secret */
  25524. if (ssl->ctx->X448SharedSecretCb != NULL) {
  25525. break;
  25526. }
  25527. #endif
  25528. ret = wc_curve448_export_public_ex(
  25529. (curve448_key*)ssl->hsKey,
  25530. args->output + OPAQUE8_LEN, &args->length,
  25531. EC448_LITTLE_ENDIAN);
  25532. if (ret != 0) {
  25533. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25534. }
  25535. break;
  25536. }
  25537. #endif
  25538. #ifdef HAVE_PK_CALLBACKS
  25539. /* if callback then use it for shared secret */
  25540. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25541. break;
  25542. }
  25543. #endif
  25544. /* Place ECC key in output buffer, leaving room for size */
  25545. PRIVATE_KEY_UNLOCK();
  25546. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  25547. args->output + OPAQUE8_LEN, &args->length);
  25548. PRIVATE_KEY_LOCK();
  25549. if (ret != 0) {
  25550. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25551. }
  25552. break;
  25553. }
  25554. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  25555. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25556. defined(HAVE_CURVE448)
  25557. case ecc_diffie_hellman_kea:
  25558. {
  25559. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  25560. #ifdef HAVE_CURVE25519
  25561. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  25562. #ifdef HAVE_PK_CALLBACKS
  25563. /* if callback then use it for shared secret */
  25564. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  25565. break;
  25566. }
  25567. #endif
  25568. ret = wc_curve25519_export_public_ex(
  25569. (curve25519_key*)ssl->hsKey,
  25570. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25571. EC25519_LITTLE_ENDIAN);
  25572. if (ret != 0) {
  25573. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25574. }
  25575. break;
  25576. }
  25577. #endif
  25578. #ifdef HAVE_CURVE448
  25579. if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
  25580. #ifdef HAVE_PK_CALLBACKS
  25581. /* if callback then use it for shared secret */
  25582. if (ssl->ctx->X448SharedSecretCb != NULL) {
  25583. break;
  25584. }
  25585. #endif
  25586. ret = wc_curve448_export_public_ex(
  25587. (curve448_key*)ssl->hsKey,
  25588. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25589. EC448_LITTLE_ENDIAN);
  25590. if (ret != 0) {
  25591. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25592. }
  25593. break;
  25594. }
  25595. #endif
  25596. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  25597. #ifdef HAVE_PK_CALLBACKS
  25598. /* if callback then use it for shared secret */
  25599. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25600. break;
  25601. }
  25602. #endif
  25603. /* Place ECC key in buffer, leaving room for size */
  25604. PRIVATE_KEY_UNLOCK();
  25605. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  25606. args->encSecret + OPAQUE8_LEN, &args->encSz);
  25607. PRIVATE_KEY_LOCK();
  25608. if (ret != 0) {
  25609. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25610. }
  25611. #endif /* HAVE_ECC */
  25612. break;
  25613. }
  25614. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25615. default:
  25616. ret = BAD_KEA_TYPE_E;
  25617. } /* switch(ssl->specs.kea) */
  25618. /* Check for error */
  25619. if (ret != 0) {
  25620. goto exit_scke;
  25621. }
  25622. /* Advance state and proceed */
  25623. ssl->options.asyncState = TLS_ASYNC_DO;
  25624. } /* case TLS_ASYNC_BUILD */
  25625. FALL_THROUGH;
  25626. case TLS_ASYNC_DO:
  25627. {
  25628. switch(ssl->specs.kea)
  25629. {
  25630. #ifndef NO_RSA
  25631. case rsa_kea:
  25632. {
  25633. ret = RsaEnc(ssl,
  25634. ssl->arrays->preMasterSecret, SECRET_LEN,
  25635. args->encSecret, &args->encSz,
  25636. ssl->peerRsaKey,
  25637. #if defined(HAVE_PK_CALLBACKS)
  25638. &ssl->buffers.peerRsaKey
  25639. #else
  25640. NULL
  25641. #endif
  25642. );
  25643. break;
  25644. }
  25645. #endif /* !NO_RSA */
  25646. #ifndef NO_DH
  25647. case diffie_hellman_kea:
  25648. {
  25649. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  25650. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  25651. ssl->buffers.serverDH_Pub.buffer,
  25652. ssl->buffers.serverDH_Pub.length,
  25653. ssl->arrays->preMasterSecret,
  25654. &ssl->arrays->preMasterSz,
  25655. ssl->buffers.serverDH_P.buffer,
  25656. ssl->buffers.serverDH_P.length);
  25657. break;
  25658. }
  25659. #endif /* !NO_DH */
  25660. #ifndef NO_PSK
  25661. case psk_kea:
  25662. {
  25663. break;
  25664. }
  25665. #endif /* !NO_PSK */
  25666. #if !defined(NO_DH) && !defined(NO_PSK)
  25667. case dhe_psk_kea:
  25668. {
  25669. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  25670. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  25671. ssl->buffers.serverDH_Pub.buffer,
  25672. ssl->buffers.serverDH_Pub.length,
  25673. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25674. &ssl->arrays->preMasterSz,
  25675. ssl->buffers.serverDH_P.buffer,
  25676. ssl->buffers.serverDH_P.length);
  25677. break;
  25678. }
  25679. #endif /* !NO_DH && !NO_PSK */
  25680. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25681. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25682. case ecdhe_psk_kea:
  25683. {
  25684. #ifdef HAVE_CURVE25519
  25685. if (ssl->peerX25519KeyPresent) {
  25686. ret = X25519SharedSecret(ssl,
  25687. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  25688. args->output + OPAQUE8_LEN, &args->length,
  25689. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25690. &ssl->arrays->preMasterSz,
  25691. WOLFSSL_CLIENT_END
  25692. );
  25693. if (!ssl->specs.static_ecdh
  25694. #ifdef WOLFSSL_ASYNC_CRYPT
  25695. && ret != WC_PENDING_E
  25696. #endif
  25697. ) {
  25698. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25699. (void**)&ssl->peerX25519Key);
  25700. ssl->peerX25519KeyPresent = 0;
  25701. }
  25702. break;
  25703. }
  25704. #endif
  25705. #ifdef HAVE_CURVE448
  25706. if (ssl->peerX448KeyPresent) {
  25707. ret = X448SharedSecret(ssl,
  25708. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  25709. args->output + OPAQUE8_LEN, &args->length,
  25710. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25711. &ssl->arrays->preMasterSz,
  25712. WOLFSSL_CLIENT_END
  25713. );
  25714. if (!ssl->specs.static_ecdh
  25715. #ifdef WOLFSSL_ASYNC_CRYPT
  25716. && ret != WC_PENDING_E
  25717. #endif
  25718. ) {
  25719. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  25720. (void**)&ssl->peerX448Key);
  25721. ssl->peerX448KeyPresent = 0;
  25722. }
  25723. break;
  25724. }
  25725. #endif
  25726. ret = EccSharedSecret(ssl,
  25727. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  25728. args->output + OPAQUE8_LEN, &args->length,
  25729. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25730. &ssl->arrays->preMasterSz,
  25731. WOLFSSL_CLIENT_END
  25732. );
  25733. #ifdef WOLFSSL_ASYNC_CRYPT
  25734. if (ret != WC_PENDING_E)
  25735. #endif
  25736. {
  25737. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  25738. (void**)&ssl->peerEccKey);
  25739. ssl->peerEccKeyPresent = 0;
  25740. }
  25741. break;
  25742. }
  25743. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  25744. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25745. defined(HAVE_CURVE448)
  25746. case ecc_diffie_hellman_kea:
  25747. {
  25748. #ifdef HAVE_ECC
  25749. ecc_key* peerKey;
  25750. #endif
  25751. #ifdef HAVE_CURVE25519
  25752. if (ssl->peerX25519KeyPresent) {
  25753. ret = X25519SharedSecret(ssl,
  25754. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  25755. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25756. ssl->arrays->preMasterSecret,
  25757. &ssl->arrays->preMasterSz,
  25758. WOLFSSL_CLIENT_END
  25759. );
  25760. if (!ssl->specs.static_ecdh
  25761. #ifdef WOLFSSL_ASYNC_CRYPT
  25762. && ret != WC_PENDING_E
  25763. #endif
  25764. ) {
  25765. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25766. (void**)&ssl->peerX25519Key);
  25767. ssl->peerX25519KeyPresent = 0;
  25768. }
  25769. break;
  25770. }
  25771. #endif
  25772. #ifdef HAVE_CURVE448
  25773. if (ssl->peerX448KeyPresent) {
  25774. ret = X448SharedSecret(ssl,
  25775. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  25776. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25777. ssl->arrays->preMasterSecret,
  25778. &ssl->arrays->preMasterSz,
  25779. WOLFSSL_CLIENT_END
  25780. );
  25781. if (!ssl->specs.static_ecdh
  25782. #ifdef WOLFSSL_ASYNC_CRYPT
  25783. && ret != WC_PENDING_E
  25784. #endif
  25785. ) {
  25786. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  25787. (void**)&ssl->peerX448Key);
  25788. ssl->peerX448KeyPresent = 0;
  25789. }
  25790. break;
  25791. }
  25792. #endif
  25793. #ifdef HAVE_ECC
  25794. peerKey = (ssl->specs.static_ecdh) ?
  25795. ssl->peerEccDsaKey : ssl->peerEccKey;
  25796. ret = EccSharedSecret(ssl,
  25797. (ecc_key*)ssl->hsKey, peerKey,
  25798. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25799. ssl->arrays->preMasterSecret,
  25800. &ssl->arrays->preMasterSz,
  25801. WOLFSSL_CLIENT_END
  25802. );
  25803. if (!ssl->specs.static_ecdh
  25804. #ifdef WOLFSSL_ASYNC_CRYPT
  25805. && ret != WC_PENDING_E
  25806. #endif
  25807. && !ssl->options.keepResources) {
  25808. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  25809. (void**)&ssl->peerEccKey);
  25810. ssl->peerEccKeyPresent = 0;
  25811. }
  25812. #endif
  25813. break;
  25814. }
  25815. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25816. default:
  25817. ret = BAD_KEA_TYPE_E;
  25818. } /* switch(ssl->specs.kea) */
  25819. /* Check for error */
  25820. if (ret != 0) {
  25821. goto exit_scke;
  25822. }
  25823. /* Advance state and proceed */
  25824. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  25825. } /* case TLS_ASYNC_DO */
  25826. FALL_THROUGH;
  25827. case TLS_ASYNC_VERIFY:
  25828. {
  25829. switch(ssl->specs.kea)
  25830. {
  25831. #ifndef NO_RSA
  25832. case rsa_kea:
  25833. {
  25834. break;
  25835. }
  25836. #endif /* !NO_RSA */
  25837. #ifndef NO_DH
  25838. case diffie_hellman_kea:
  25839. {
  25840. break;
  25841. }
  25842. #endif /* !NO_DH */
  25843. #ifndef NO_PSK
  25844. case psk_kea:
  25845. {
  25846. break;
  25847. }
  25848. #endif /* !NO_PSK */
  25849. #if !defined(NO_DH) && !defined(NO_PSK)
  25850. case dhe_psk_kea:
  25851. {
  25852. byte* pms = ssl->arrays->preMasterSecret;
  25853. /* validate args */
  25854. if (args->output == NULL || args->length == 0) {
  25855. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  25856. }
  25857. c16toa((word16)args->length, args->output);
  25858. args->encSz += args->length + OPAQUE16_LEN;
  25859. c16toa((word16)ssl->arrays->preMasterSz, pms);
  25860. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  25861. pms += ssl->arrays->preMasterSz;
  25862. /* make psk pre master secret */
  25863. /* length of key + length 0s + length of key + key */
  25864. c16toa((word16)ssl->arrays->psk_keySz, pms);
  25865. pms += OPAQUE16_LEN;
  25866. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25867. ssl->arrays->preMasterSz +=
  25868. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  25869. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25870. ssl->arrays->psk_keySz = 0; /* No further need */
  25871. break;
  25872. }
  25873. #endif /* !NO_DH && !NO_PSK */
  25874. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25875. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25876. case ecdhe_psk_kea:
  25877. {
  25878. byte* pms = ssl->arrays->preMasterSecret;
  25879. /* validate args */
  25880. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  25881. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  25882. }
  25883. /* place size of public key in output buffer */
  25884. *args->output = (byte)args->length;
  25885. args->encSz += args->length + OPAQUE8_LEN;
  25886. /* Create pre master secret is the concatenation of
  25887. eccSize + eccSharedKey + pskSize + pskKey */
  25888. c16toa((word16)ssl->arrays->preMasterSz, pms);
  25889. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  25890. pms += ssl->arrays->preMasterSz;
  25891. c16toa((word16)ssl->arrays->psk_keySz, pms);
  25892. pms += OPAQUE16_LEN;
  25893. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25894. ssl->arrays->preMasterSz +=
  25895. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  25896. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25897. ssl->arrays->psk_keySz = 0; /* No further need */
  25898. break;
  25899. }
  25900. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  25901. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25902. defined(HAVE_CURVE448)
  25903. case ecc_diffie_hellman_kea:
  25904. {
  25905. if (args->encSecret == NULL) {
  25906. ret = BAD_STATE_E;
  25907. goto exit_scke;
  25908. }
  25909. else {
  25910. /* place size of public key in buffer */
  25911. *args->encSecret = (byte)args->encSz;
  25912. args->encSz += OPAQUE8_LEN;
  25913. }
  25914. break;
  25915. }
  25916. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25917. default:
  25918. ret = BAD_KEA_TYPE_E;
  25919. } /* switch(ssl->specs.kea) */
  25920. /* Check for error */
  25921. if (ret != 0) {
  25922. goto exit_scke;
  25923. }
  25924. /* Advance state and proceed */
  25925. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  25926. } /* case TLS_ASYNC_VERIFY */
  25927. FALL_THROUGH;
  25928. case TLS_ASYNC_FINALIZE:
  25929. {
  25930. word32 tlsSz = 0;
  25931. word32 idx = 0;
  25932. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  25933. tlsSz = 2;
  25934. }
  25935. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  25936. ssl->specs.kea == dhe_psk_kea ||
  25937. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  25938. tlsSz = 0;
  25939. }
  25940. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  25941. args->sendSz = args->encSz + tlsSz + idx;
  25942. #ifdef WOLFSSL_DTLS
  25943. if (ssl->options.dtls) {
  25944. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  25945. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  25946. }
  25947. #endif
  25948. if (IsEncryptionOn(ssl, 1)) {
  25949. args->sendSz += MAX_MSG_EXTRA;
  25950. }
  25951. /* check for available size */
  25952. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0)
  25953. goto exit_scke;
  25954. /* get output buffer */
  25955. args->output = ssl->buffers.outputBuffer.buffer +
  25956. ssl->buffers.outputBuffer.length;
  25957. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  25958. if (tlsSz) {
  25959. c16toa((word16)args->encSz, &args->output[idx]);
  25960. idx += OPAQUE16_LEN;
  25961. }
  25962. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  25963. idx += args->encSz;
  25964. if (IsEncryptionOn(ssl, 1)) {
  25965. int recordHeaderSz = RECORD_HEADER_SZ;
  25966. if (ssl->options.dtls)
  25967. recordHeaderSz += DTLS_RECORD_EXTRA;
  25968. args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
  25969. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  25970. DYNAMIC_TYPE_IN_BUFFER);
  25971. if (args->input == NULL) {
  25972. ERROR_OUT(MEMORY_E, exit_scke);
  25973. }
  25974. XMEMCPY(args->input, args->output + recordHeaderSz,
  25975. args->inputSz);
  25976. }
  25977. /* Advance state and proceed */
  25978. ssl->options.asyncState = TLS_ASYNC_END;
  25979. } /* case TLS_ASYNC_FINALIZE */
  25980. FALL_THROUGH;
  25981. case TLS_ASYNC_END:
  25982. {
  25983. if (IsEncryptionOn(ssl, 1)) {
  25984. #ifdef WOLFSSL_DTLS
  25985. if (IsDtlsNotSctpMode(ssl) &&
  25986. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
  25987. goto exit_scke;
  25988. }
  25989. #endif
  25990. ret = BuildMessage(ssl, args->output, args->sendSz,
  25991. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  25992. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25993. args->input = NULL; /* make sure its not double free'd on cleanup */
  25994. if (ret >= 0) {
  25995. args->sendSz = ret;
  25996. ret = 0;
  25997. }
  25998. }
  25999. else {
  26000. #ifdef WOLFSSL_DTLS
  26001. if (IsDtlsNotSctpMode(ssl)) {
  26002. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
  26003. goto exit_scke;
  26004. }
  26005. }
  26006. if (ssl->options.dtls)
  26007. DtlsSEQIncrement(ssl, CUR_ORDER);
  26008. #endif
  26009. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  26010. }
  26011. if (ret != 0) {
  26012. goto exit_scke;
  26013. }
  26014. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  26015. if (ssl->hsInfoOn)
  26016. AddPacketName(ssl, "ClientKeyExchange");
  26017. if (ssl->toInfoOn) {
  26018. ret = AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  26019. args->output, args->sendSz, WRITE_PROTO, 0, ssl->heap);
  26020. if (ret != 0) {
  26021. goto exit_scke;
  26022. }
  26023. }
  26024. #endif
  26025. ssl->buffers.outputBuffer.length += args->sendSz;
  26026. if (!ssl->options.groupMessages) {
  26027. ret = SendBuffered(ssl);
  26028. }
  26029. if (ret == 0 || ret == WANT_WRITE) {
  26030. int tmpRet = MakeMasterSecret(ssl);
  26031. if (tmpRet != 0) {
  26032. ret = tmpRet; /* save WANT_WRITE unless more serious */
  26033. }
  26034. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  26035. ssl->options.buildingMsg = 0;
  26036. }
  26037. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  26038. if (ssl->keyLogCb != NULL) {
  26039. int secretSz = SECRET_LEN;
  26040. ret = ssl->keyLogCb(ssl, ssl->arrays->masterSecret, &secretSz,
  26041. NULL);
  26042. if (ret != 0 || secretSz != SECRET_LEN)
  26043. return SESSION_SECRET_CB_E;
  26044. }
  26045. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  26046. break;
  26047. }
  26048. default:
  26049. ret = INPUT_CASE_ERROR;
  26050. } /* switch(ssl->options.asyncState) */
  26051. exit_scke:
  26052. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  26053. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  26054. #ifdef WOLFSSL_ASYNC_IO
  26055. /* Handle async operation */
  26056. if (ret == WC_PENDING_E || ret == WANT_WRITE) {
  26057. if (ssl->options.buildingMsg)
  26058. return ret;
  26059. /* If we have completed all states then we will not enter this function
  26060. * again. We need to do clean up now. */
  26061. }
  26062. #endif
  26063. /* No further need for PMS */
  26064. if (ssl->arrays->preMasterSecret != NULL) {
  26065. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  26066. }
  26067. ssl->arrays->preMasterSz = 0;
  26068. /* Final cleanup */
  26069. #ifdef WOLFSSL_ASYNC_IO
  26070. /* Cleanup async */
  26071. FreeAsyncCtx(ssl, 0);
  26072. #else
  26073. FreeSckeArgs(ssl, args);
  26074. #endif
  26075. FreeKeyExchange(ssl);
  26076. if (ret != 0) {
  26077. WOLFSSL_ERROR_VERBOSE(ret);
  26078. }
  26079. return ret;
  26080. }
  26081. #endif /* !WOLFSSL_NO_TLS12 */
  26082. #ifndef NO_CERTS
  26083. #ifndef WOLFSSL_NO_TLS12
  26084. #ifndef WOLFSSL_NO_CLIENT_AUTH
  26085. typedef struct ScvArgs {
  26086. byte* output; /* not allocated */
  26087. #ifndef NO_RSA
  26088. byte* verifySig;
  26089. #endif
  26090. byte* verify; /* not allocated */
  26091. byte* input;
  26092. word32 idx;
  26093. word32 extraSz;
  26094. word32 sigSz;
  26095. int sendSz;
  26096. int inputSz;
  26097. word16 length;
  26098. byte sigAlgo;
  26099. } ScvArgs;
  26100. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  26101. {
  26102. ScvArgs* args = (ScvArgs*)pArgs;
  26103. (void)ssl;
  26104. #ifndef NO_RSA
  26105. if (args->verifySig) {
  26106. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26107. args->verifySig = NULL;
  26108. }
  26109. #endif
  26110. if (args->input) {
  26111. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26112. args->input = NULL;
  26113. }
  26114. }
  26115. /* handle generation of certificate_verify (15) */
  26116. int SendCertificateVerify(WOLFSSL* ssl)
  26117. {
  26118. int ret = 0;
  26119. #ifdef WOLFSSL_ASYNC_IO
  26120. ScvArgs* args = NULL;
  26121. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  26122. #else
  26123. ScvArgs args[1];
  26124. #endif
  26125. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  26126. WOLFSSL_ENTER("SendCertificateVerify");
  26127. #ifdef WOLFSSL_ASYNC_IO
  26128. if (ssl->async == NULL) {
  26129. ssl->async = (struct WOLFSSL_ASYNC*)
  26130. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  26131. DYNAMIC_TYPE_ASYNC);
  26132. if (ssl->async == NULL)
  26133. ERROR_OUT(MEMORY_E, exit_scv);
  26134. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  26135. }
  26136. args = (ScvArgs*)ssl->async->args;
  26137. #ifdef WOLFSSL_ASYNC_CRYPT
  26138. /* BuildMessage does its own Pop */
  26139. if (ssl->error != WC_PENDING_E ||
  26140. ssl->options.asyncState != TLS_ASYNC_END)
  26141. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  26142. if (ret != WC_NOT_PENDING_E) {
  26143. /* Check for error */
  26144. if (ret < 0)
  26145. goto exit_scv;
  26146. }
  26147. else
  26148. #endif
  26149. if (ssl->options.buildingMsg) {
  26150. /* We should be in the sending state. */
  26151. if (ssl->options.asyncState != TLS_ASYNC_END) {
  26152. ret = BAD_STATE_E;
  26153. goto exit_scv;
  26154. }
  26155. }
  26156. else
  26157. #endif
  26158. {
  26159. /* Reset state */
  26160. ret = 0;
  26161. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  26162. XMEMSET(args, 0, sizeof(ScvArgs));
  26163. #ifdef WOLFSSL_ASYNC_IO
  26164. ssl->async->freeArgs = FreeScvArgs;
  26165. #endif
  26166. }
  26167. switch(ssl->options.asyncState)
  26168. {
  26169. case TLS_ASYNC_BEGIN:
  26170. {
  26171. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  26172. return 0; /* sent blank cert, can't verify */
  26173. }
  26174. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  26175. if (IsEncryptionOn(ssl, 1)) {
  26176. args->sendSz += MAX_MSG_EXTRA;
  26177. }
  26178. /* Use tmp buffer */
  26179. args->input = (byte*)XMALLOC(args->sendSz,
  26180. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26181. if (args->input == NULL)
  26182. ERROR_OUT(MEMORY_E, exit_scv);
  26183. args->output = args->input;
  26184. /* Advance state and proceed */
  26185. ssl->options.asyncState = TLS_ASYNC_BUILD;
  26186. } /* case TLS_ASYNC_BEGIN */
  26187. FALL_THROUGH;
  26188. case TLS_ASYNC_BUILD:
  26189. {
  26190. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  26191. if (ret != 0) {
  26192. goto exit_scv;
  26193. }
  26194. if (ssl->buffers.key == NULL) {
  26195. #ifdef HAVE_PK_CALLBACKS
  26196. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  26197. args->length = GetPrivateKeySigSize(ssl);
  26198. else
  26199. #endif
  26200. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  26201. }
  26202. else {
  26203. /* Decode private key. */
  26204. ret = DecodePrivateKey(ssl, &args->length);
  26205. if (ret != 0) {
  26206. goto exit_scv;
  26207. }
  26208. }
  26209. if (args->length == 0) {
  26210. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  26211. }
  26212. /* idx is used to track verify pointer offset to output */
  26213. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  26214. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  26215. args->extraSz = 0; /* tls 1.2 hash/sig */
  26216. /* build encoded signature buffer */
  26217. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  26218. ssl->buffers.sig.buffer = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  26219. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26220. if (ssl->buffers.sig.buffer == NULL) {
  26221. ERROR_OUT(MEMORY_E, exit_scv);
  26222. }
  26223. #ifdef WOLFSSL_DTLS
  26224. if (ssl->options.dtls) {
  26225. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26226. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26227. }
  26228. #endif
  26229. #ifndef NO_OLD_TLS
  26230. #ifndef NO_SHA
  26231. /* old tls default */
  26232. SetDigest(ssl, sha_mac);
  26233. #endif
  26234. #else
  26235. #ifndef NO_SHA256
  26236. /* new tls default */
  26237. SetDigest(ssl, sha256_mac);
  26238. #endif
  26239. #endif /* !NO_OLD_TLS */
  26240. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  26241. #ifdef WC_RSA_PSS
  26242. if (IsAtLeastTLSv1_2(ssl) &&
  26243. (ssl->pssAlgo & (1 << ssl->suites->hashAlgo))) {
  26244. args->sigAlgo = rsa_pss_sa_algo;
  26245. }
  26246. else
  26247. #endif
  26248. args->sigAlgo = rsa_sa_algo;
  26249. }
  26250. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  26251. args->sigAlgo = ecc_dsa_sa_algo;
  26252. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  26253. args->sigAlgo = ed25519_sa_algo;
  26254. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  26255. args->sigAlgo = ed448_sa_algo;
  26256. if (IsAtLeastTLSv1_2(ssl)) {
  26257. EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo,
  26258. args->verify);
  26259. args->extraSz = HASH_SIG_SIZE;
  26260. SetDigest(ssl, ssl->suites->hashAlgo);
  26261. }
  26262. #ifndef NO_OLD_TLS
  26263. else {
  26264. /* if old TLS load MD5 and SHA hash as value to sign
  26265. * MD5 and SHA must be first two buffers in stucture */
  26266. XMEMCPY(ssl->buffers.sig.buffer,
  26267. (byte*)&ssl->hsHashes->certHashes, FINISHED_SZ);
  26268. }
  26269. #endif
  26270. #ifndef NO_RSA
  26271. if (args->sigAlgo == rsa_sa_algo) {
  26272. ssl->buffers.sig.length = FINISHED_SZ;
  26273. args->sigSz = ENCRYPT_LEN;
  26274. if (IsAtLeastTLSv1_2(ssl)) {
  26275. ssl->buffers.sig.length = wc_EncodeSignature(
  26276. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  26277. ssl->buffers.digest.length,
  26278. TypeHash(ssl->suites->hashAlgo));
  26279. }
  26280. /* prepend hdr */
  26281. c16toa(args->length, args->verify + args->extraSz);
  26282. }
  26283. #ifdef WC_RSA_PSS
  26284. else if (args->sigAlgo == rsa_pss_sa_algo) {
  26285. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  26286. ssl->buffers.digest.length);
  26287. ssl->buffers.sig.length = ssl->buffers.digest.length;
  26288. args->sigSz = ENCRYPT_LEN;
  26289. /* prepend hdr */
  26290. c16toa(args->length, args->verify + args->extraSz);
  26291. }
  26292. #endif
  26293. #endif /* !NO_RSA */
  26294. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  26295. if (args->sigAlgo == ed25519_sa_algo) {
  26296. ret = Ed25519CheckPubKey(ssl);
  26297. if (ret != 0)
  26298. goto exit_scv;
  26299. }
  26300. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  26301. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  26302. if (args->sigAlgo == ed448_sa_algo) {
  26303. ret = Ed448CheckPubKey(ssl);
  26304. if (ret != 0)
  26305. goto exit_scv;
  26306. }
  26307. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  26308. /* Advance state and proceed */
  26309. ssl->options.asyncState = TLS_ASYNC_DO;
  26310. } /* case TLS_ASYNC_BUILD */
  26311. FALL_THROUGH;
  26312. case TLS_ASYNC_DO:
  26313. {
  26314. #ifdef HAVE_ECC
  26315. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  26316. ecc_key* key = (ecc_key*)ssl->hsKey;
  26317. ret = EccSign(ssl,
  26318. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  26319. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  26320. key,
  26321. #ifdef HAVE_PK_CALLBACKS
  26322. ssl->buffers.key
  26323. #else
  26324. NULL
  26325. #endif
  26326. );
  26327. }
  26328. #endif /* HAVE_ECC */
  26329. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  26330. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  26331. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  26332. ret = Ed25519Sign(ssl,
  26333. ssl->hsHashes->messages, ssl->hsHashes->length,
  26334. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  26335. key,
  26336. #ifdef HAVE_PK_CALLBACKS
  26337. ssl->buffers.key
  26338. #else
  26339. NULL
  26340. #endif
  26341. );
  26342. }
  26343. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  26344. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  26345. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  26346. ed448_key* key = (ed448_key*)ssl->hsKey;
  26347. ret = Ed448Sign(ssl,
  26348. ssl->hsHashes->messages, ssl->hsHashes->length,
  26349. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  26350. key,
  26351. #ifdef HAVE_PK_CALLBACKS
  26352. ssl->buffers.key
  26353. #else
  26354. NULL
  26355. #endif
  26356. );
  26357. }
  26358. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  26359. #ifndef NO_RSA
  26360. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  26361. RsaKey* key = (RsaKey*)ssl->hsKey;
  26362. /* restore verify pointer */
  26363. args->verify = &args->output[args->idx];
  26364. ret = RsaSign(ssl,
  26365. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  26366. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  26367. args->sigAlgo, ssl->suites->hashAlgo, key,
  26368. ssl->buffers.key
  26369. );
  26370. }
  26371. #endif /* !NO_RSA */
  26372. /* Check for error */
  26373. if (ret != 0) {
  26374. goto exit_scv;
  26375. }
  26376. /* Advance state and proceed */
  26377. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  26378. } /* case TLS_ASYNC_DO */
  26379. FALL_THROUGH;
  26380. case TLS_ASYNC_VERIFY:
  26381. {
  26382. /* restore verify pointer */
  26383. args->verify = &args->output[args->idx];
  26384. switch (ssl->hsType) {
  26385. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  26386. #ifdef HAVE_ECC
  26387. case DYNAMIC_TYPE_ECC:
  26388. #ifdef WOLFSSL_CHECK_SIG_FAULTS
  26389. {
  26390. ecc_key* key = (ecc_key*)ssl->hsKey;
  26391. ret = EccVerify(ssl,
  26392. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  26393. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  26394. key,
  26395. #ifdef HAVE_PK_CALLBACKS
  26396. ssl->buffers.key
  26397. #else
  26398. NULL
  26399. #endif
  26400. );
  26401. if (ret != 0) {
  26402. WOLFSSL_MSG("Failed to verify ECC signature");
  26403. goto exit_scv;
  26404. }
  26405. }
  26406. #if defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  26407. FALL_THROUGH;
  26408. #endif
  26409. #endif /* WOLFSSL_CHECK_SIG_FAULTS */
  26410. #endif /* HAVE_ECC */
  26411. #ifdef HAVE_ED25519
  26412. case DYNAMIC_TYPE_ED25519:
  26413. #endif
  26414. #ifdef HAVE_ED448
  26415. case DYNAMIC_TYPE_ED448:
  26416. #endif
  26417. args->length = (word16)ssl->buffers.sig.length;
  26418. /* prepend hdr */
  26419. c16toa(args->length, args->verify + args->extraSz);
  26420. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  26421. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  26422. break;
  26423. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  26424. #ifndef NO_RSA
  26425. case DYNAMIC_TYPE_RSA:
  26426. {
  26427. RsaKey* key = (RsaKey*)ssl->hsKey;
  26428. if (args->verifySig == NULL) {
  26429. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  26430. DYNAMIC_TYPE_SIGNATURE);
  26431. if (args->verifySig == NULL) {
  26432. ERROR_OUT(MEMORY_E, exit_scv);
  26433. }
  26434. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  26435. VERIFY_HEADER, args->sigSz);
  26436. }
  26437. /* check for signature faults */
  26438. ret = VerifyRsaSign(ssl,
  26439. args->verifySig, args->sigSz,
  26440. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  26441. args->sigAlgo, ssl->suites->hashAlgo, key,
  26442. ssl->buffers.key
  26443. );
  26444. /* free temporary buffer now */
  26445. if (ret != WC_PENDING_E) {
  26446. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26447. args->verifySig = NULL;
  26448. }
  26449. break;
  26450. }
  26451. #endif /* !NO_RSA */
  26452. default:
  26453. break;
  26454. }
  26455. /* Check for error */
  26456. if (ret != 0) {
  26457. goto exit_scv;
  26458. }
  26459. /* Advance state and proceed */
  26460. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  26461. } /* case TLS_ASYNC_VERIFY */
  26462. FALL_THROUGH;
  26463. case TLS_ASYNC_FINALIZE:
  26464. {
  26465. if (args->output == NULL) {
  26466. ERROR_OUT(BUFFER_ERROR, exit_scv);
  26467. }
  26468. AddHeaders(args->output, (word32)args->length + args->extraSz +
  26469. VERIFY_HEADER, certificate_verify, ssl);
  26470. /* Advance state and proceed */
  26471. ssl->options.asyncState = TLS_ASYNC_END;
  26472. } /* case TLS_ASYNC_FINALIZE */
  26473. FALL_THROUGH;
  26474. case TLS_ASYNC_END:
  26475. {
  26476. ret = SendHandshakeMsg(ssl, args->output,
  26477. (word32)args->length + args->extraSz + VERIFY_HEADER,
  26478. certificate_verify, "CertificateVerify");
  26479. if (ret != 0)
  26480. goto exit_scv;
  26481. break;
  26482. }
  26483. default:
  26484. ret = INPUT_CASE_ERROR;
  26485. } /* switch(ssl->options.asyncState) */
  26486. exit_scv:
  26487. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  26488. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  26489. #ifdef WOLFSSL_ASYNC_IO
  26490. /* Handle async operation */
  26491. if (ret == WANT_WRITE
  26492. #ifdef WOLFSSL_ASYNC_CRYPT
  26493. || ret == WC_PENDING_E
  26494. #endif
  26495. )
  26496. return ret;
  26497. #endif /* WOLFSSL_ASYNC_IO */
  26498. /* Digest is not allocated, so do this to prevent free */
  26499. ssl->buffers.digest.buffer = NULL;
  26500. ssl->buffers.digest.length = 0;
  26501. /* Final cleanup */
  26502. #ifdef WOLFSSL_ASYNC_IO
  26503. /* Cleanup async */
  26504. FreeAsyncCtx(ssl, 0);
  26505. #else
  26506. FreeScvArgs(ssl, args);
  26507. #endif
  26508. FreeKeyExchange(ssl);
  26509. if (ret != 0) {
  26510. WOLFSSL_ERROR_VERBOSE(ret);
  26511. }
  26512. return ret;
  26513. }
  26514. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  26515. #endif /* WOLFSSL_NO_TLS12 */
  26516. #endif /* NO_CERTS */
  26517. #ifdef HAVE_SESSION_TICKET
  26518. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  26519. {
  26520. /* Free old dynamic ticket if we already had one */
  26521. if (ssl->session->ticketLenAlloc > 0) {
  26522. XFREE(ssl->session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  26523. ssl->session->ticket = ssl->session->staticTicket;
  26524. ssl->session->ticketLenAlloc = 0;
  26525. }
  26526. if (length > sizeof(ssl->session->staticTicket)) {
  26527. byte* sessionTicket =
  26528. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  26529. if (sessionTicket == NULL)
  26530. return MEMORY_E;
  26531. ssl->session->ticket = sessionTicket;
  26532. ssl->session->ticketLenAlloc = (word16)length;
  26533. }
  26534. ssl->session->ticketLen = (word16)length;
  26535. if (length > 0) {
  26536. XMEMCPY(ssl->session->ticket, ticket, length);
  26537. if (ssl->session_ticket_cb != NULL) {
  26538. ssl->session_ticket_cb(ssl,
  26539. ssl->session->ticket, ssl->session->ticketLen,
  26540. ssl->session_ticket_ctx);
  26541. }
  26542. /* Create a fake sessionID based on the ticket, this will
  26543. * supersede the existing session cache info. */
  26544. ssl->options.haveSessionId = 1;
  26545. #ifdef WOLFSSL_TLS13
  26546. if (ssl->options.tls1_3) {
  26547. XMEMCPY(ssl->session->sessionID,
  26548. ssl->session->ticket + length - ID_LEN, ID_LEN);
  26549. ssl->session->sessionIDSz = ID_LEN;
  26550. }
  26551. else
  26552. #endif
  26553. {
  26554. XMEMCPY(ssl->arrays->sessionID,
  26555. ssl->session->ticket + length - ID_LEN, ID_LEN);
  26556. ssl->arrays->sessionIDSz = ID_LEN;
  26557. }
  26558. }
  26559. return 0;
  26560. }
  26561. #ifndef WOLFSSL_NO_TLS12
  26562. /* handle processing of session_ticket (4) */
  26563. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  26564. word32 size)
  26565. {
  26566. word32 begin = *inOutIdx;
  26567. word32 lifetime;
  26568. word16 length;
  26569. int ret;
  26570. if (ssl->expect_session_ticket == 0) {
  26571. WOLFSSL_MSG("Unexpected session ticket");
  26572. WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
  26573. return SESSION_TICKET_EXPECT_E;
  26574. }
  26575. if (OPAQUE32_LEN > size)
  26576. return BUFFER_ERROR;
  26577. ato32(input + *inOutIdx, &lifetime);
  26578. *inOutIdx += OPAQUE32_LEN;
  26579. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  26580. return BUFFER_ERROR;
  26581. ato16(input + *inOutIdx, &length);
  26582. *inOutIdx += OPAQUE16_LEN;
  26583. if ((*inOutIdx - begin) + length > size)
  26584. return BUFFER_ERROR;
  26585. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  26586. return ret;
  26587. *inOutIdx += length;
  26588. if (length > 0) {
  26589. ssl->timeout = lifetime;
  26590. #ifndef NO_SESSION_CACHE
  26591. AddSession(ssl);
  26592. #endif
  26593. }
  26594. if (IsEncryptionOn(ssl, 0)) {
  26595. *inOutIdx += ssl->keys.padSz;
  26596. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  26597. if (ssl->options.startedETMRead)
  26598. *inOutIdx += MacSize(ssl);
  26599. #endif
  26600. }
  26601. ssl->expect_session_ticket = 0;
  26602. return 0;
  26603. }
  26604. #endif /* !WOLFSSL_NO_TLS12 */
  26605. #endif /* HAVE_SESSION_TICKET */
  26606. #endif /* NO_WOLFSSL_CLIENT */
  26607. #ifndef NO_CERTS
  26608. #ifdef WOLF_PRIVATE_KEY_ID
  26609. int GetPrivateKeySigSize(WOLFSSL* ssl)
  26610. {
  26611. int sigSz = 0;
  26612. if (ssl == NULL)
  26613. return 0;
  26614. switch (ssl->buffers.keyType) {
  26615. #ifndef NO_RSA
  26616. #ifdef WC_RSA_PSS
  26617. case rsa_pss_sa_algo:
  26618. #endif
  26619. case rsa_sa_algo:
  26620. sigSz = ssl->buffers.keySz;
  26621. ssl->hsType = DYNAMIC_TYPE_RSA;
  26622. break;
  26623. #endif
  26624. #ifdef HAVE_ECC
  26625. case ecc_dsa_sa_algo:
  26626. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  26627. ssl->hsType = DYNAMIC_TYPE_ECC;
  26628. break;
  26629. #endif
  26630. #ifdef HAVE_ED25519
  26631. case ed25519_sa_algo:
  26632. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  26633. ssl->hsType = DYNAMIC_TYPE_ED25519;
  26634. break;
  26635. #endif
  26636. #ifdef HAVE_ED448
  26637. case ed448_sa_algo:
  26638. sigSz = ED448_SIG_SIZE; /* fixed known value */
  26639. ssl->hsType = DYNAMIC_TYPE_ED448;
  26640. break;
  26641. #endif
  26642. default:
  26643. break;
  26644. }
  26645. return sigSz;
  26646. }
  26647. #endif /* HAVE_PK_CALLBACKS */
  26648. #endif /* NO_CERTS */
  26649. #ifdef HAVE_ECC
  26650. /* returns the WOLFSSL_* version of the curve from the OID sum */
  26651. word16 GetCurveByOID(int oidSum) {
  26652. switch(oidSum) {
  26653. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  26654. #ifndef NO_ECC_SECP
  26655. case ECC_SECP160R1_OID:
  26656. return WOLFSSL_ECC_SECP160R1;
  26657. #endif /* !NO_ECC_SECP */
  26658. #ifdef HAVE_ECC_SECPR2
  26659. case ECC_SECP160R2_OID:
  26660. return WOLFSSL_ECC_SECP160R2;
  26661. #endif /* HAVE_ECC_SECPR2 */
  26662. #ifdef HAVE_ECC_KOBLITZ
  26663. case ECC_SECP160K1_OID:
  26664. return WOLFSSL_ECC_SECP160K1;
  26665. #endif /* HAVE_ECC_KOBLITZ */
  26666. #endif
  26667. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  26668. #ifndef NO_ECC_SECP
  26669. case ECC_SECP192R1_OID:
  26670. return WOLFSSL_ECC_SECP192R1;
  26671. #endif /* !NO_ECC_SECP */
  26672. #ifdef HAVE_ECC_KOBLITZ
  26673. case ECC_SECP192K1_OID:
  26674. return WOLFSSL_ECC_SECP192K1;
  26675. #endif /* HAVE_ECC_KOBLITZ */
  26676. #endif
  26677. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  26678. #ifndef NO_ECC_SECP
  26679. case ECC_SECP224R1_OID:
  26680. return WOLFSSL_ECC_SECP224R1;
  26681. #endif /* !NO_ECC_SECP */
  26682. #ifdef HAVE_ECC_KOBLITZ
  26683. case ECC_SECP224K1_OID:
  26684. return WOLFSSL_ECC_SECP224K1;
  26685. #endif /* HAVE_ECC_KOBLITZ */
  26686. #endif
  26687. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  26688. #ifndef NO_ECC_SECP
  26689. case ECC_SECP256R1_OID:
  26690. return WOLFSSL_ECC_SECP256R1;
  26691. #endif /* !NO_ECC_SECP */
  26692. #ifdef HAVE_ECC_KOBLITZ
  26693. case ECC_SECP256K1_OID:
  26694. return WOLFSSL_ECC_SECP256K1;
  26695. #endif /* HAVE_ECC_KOBLITZ */
  26696. #ifdef HAVE_ECC_BRAINPOOL
  26697. case ECC_BRAINPOOLP256R1_OID:
  26698. return WOLFSSL_ECC_BRAINPOOLP256R1;
  26699. #endif /* HAVE_ECC_BRAINPOOL */
  26700. #endif
  26701. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  26702. #ifndef NO_ECC_SECP
  26703. case ECC_SECP384R1_OID:
  26704. return WOLFSSL_ECC_SECP384R1;
  26705. #endif /* !NO_ECC_SECP */
  26706. #ifdef HAVE_ECC_BRAINPOOL
  26707. case ECC_BRAINPOOLP384R1_OID:
  26708. return WOLFSSL_ECC_BRAINPOOLP384R1;
  26709. #endif /* HAVE_ECC_BRAINPOOL */
  26710. #endif
  26711. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  26712. #ifdef HAVE_ECC_BRAINPOOL
  26713. case ECC_BRAINPOOLP512R1_OID:
  26714. return WOLFSSL_ECC_BRAINPOOLP512R1;
  26715. #endif /* HAVE_ECC_BRAINPOOL */
  26716. #endif
  26717. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  26718. #ifndef NO_ECC_SECP
  26719. case ECC_SECP521R1_OID:
  26720. return WOLFSSL_ECC_SECP521R1;
  26721. #endif /* !NO_ECC_SECP */
  26722. #endif
  26723. default:
  26724. WOLFSSL_MSG("Curve OID not compiled in or implemented");
  26725. return 0;
  26726. }
  26727. }
  26728. #endif /* HAVE_ECC */
  26729. #ifndef NO_WOLFSSL_SERVER
  26730. #ifndef WOLFSSL_NO_TLS12
  26731. /* handle generation of server_hello (2) */
  26732. int SendServerHello(WOLFSSL* ssl)
  26733. {
  26734. int ret;
  26735. byte *output;
  26736. word16 length;
  26737. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  26738. int sendSz;
  26739. byte sessIdSz = ID_LEN;
  26740. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  26741. byte echoId = 0; /* ticket echo id flag */
  26742. #endif
  26743. byte cacheOff = 0; /* session cache off flag */
  26744. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  26745. WOLFSSL_ENTER("SendServerHello");
  26746. length = VERSION_SZ + RAN_LEN
  26747. + ID_LEN + ENUM_LEN
  26748. + SUITE_LEN
  26749. + ENUM_LEN;
  26750. #ifdef HAVE_TLS_EXTENSIONS
  26751. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  26752. if (ret != 0)
  26753. return ret;
  26754. #ifdef HAVE_SESSION_TICKET
  26755. if (ssl->options.useTicket) {
  26756. /* echo session id sz can be 0,32 or bogus len in between */
  26757. sessIdSz = ssl->arrays->sessionIDSz;
  26758. if (sessIdSz > ID_LEN) {
  26759. WOLFSSL_MSG("Bad bogus session id len");
  26760. return BUFFER_ERROR;
  26761. }
  26762. if (!IsAtLeastTLSv1_3(ssl->version))
  26763. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  26764. echoId = 1;
  26765. }
  26766. #endif /* HAVE_SESSION_TICKET */
  26767. #else
  26768. if (ssl->options.haveEMS) {
  26769. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  26770. }
  26771. #endif
  26772. /* is the session cache off at build or runtime */
  26773. #ifdef NO_SESSION_CACHE
  26774. cacheOff = 1;
  26775. #else
  26776. if (ssl->options.sessionCacheOff == 1) {
  26777. cacheOff = 1;
  26778. }
  26779. #endif
  26780. /* if no session cache don't send a session ID unless we're echoing
  26781. * an ID as part of session tickets */
  26782. if (cacheOff == 1
  26783. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  26784. && echoId == 0
  26785. #endif
  26786. ) {
  26787. length -= ID_LEN; /* adjust ID_LEN assumption */
  26788. sessIdSz = 0;
  26789. }
  26790. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  26791. #ifdef WOLFSSL_DTLS
  26792. if (ssl->options.dtls) {
  26793. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26794. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26795. }
  26796. #endif /* WOLFSSL_DTLS */
  26797. if (IsEncryptionOn(ssl, 1))
  26798. sendSz += MAX_MSG_EXTRA;
  26799. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  26800. * is not advanced yet */
  26801. ssl->options.buildingMsg = 1;
  26802. /* check for available size */
  26803. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  26804. return ret;
  26805. /* get output buffer */
  26806. output = ssl->buffers.outputBuffer.buffer +
  26807. ssl->buffers.outputBuffer.length;
  26808. AddHeaders(output, length, server_hello, ssl);
  26809. /* now write to output */
  26810. /* first version */
  26811. output[idx++] = (byte)ssl->version.major;
  26812. output[idx++] = (byte)ssl->version.minor;
  26813. /* then random and session id */
  26814. if (!ssl->options.resuming) {
  26815. /* generate random part and session id */
  26816. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  26817. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  26818. if (ret != 0)
  26819. return ret;
  26820. #ifdef WOLFSSL_TLS13
  26821. if (TLSv1_3_Capable(ssl)) {
  26822. /* TLS v1.3 capable server downgraded. */
  26823. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  26824. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  26825. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  26826. }
  26827. else
  26828. #endif
  26829. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  26830. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  26831. (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0 &&
  26832. !IsAtLeastTLSv1_2(ssl)) {
  26833. /* TLS v1.2 capable server downgraded. */
  26834. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  26835. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  26836. output[idx + RAN_LEN - 1] = 0;
  26837. }
  26838. /* store info in SSL for later */
  26839. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  26840. idx += RAN_LEN;
  26841. output[idx++] = sessIdSz;
  26842. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  26843. ssl->arrays->sessionIDSz = sessIdSz;
  26844. }
  26845. else {
  26846. /* If resuming, use info from SSL */
  26847. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  26848. idx += RAN_LEN;
  26849. output[idx++] = sessIdSz;
  26850. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  26851. }
  26852. idx += sessIdSz;
  26853. #ifdef SHOW_SECRETS
  26854. {
  26855. int j;
  26856. printf("server random: ");
  26857. for (j = 0; j < RAN_LEN; j++)
  26858. printf("%02x", ssl->arrays->serverRandom[j]);
  26859. printf("\n");
  26860. }
  26861. #endif
  26862. /* then cipher suite */
  26863. output[idx++] = ssl->options.cipherSuite0;
  26864. output[idx++] = ssl->options.cipherSuite;
  26865. /* then compression */
  26866. if (ssl->options.usingCompression)
  26867. output[idx++] = ZLIB_COMPRESSION;
  26868. else
  26869. output[idx++] = NO_COMPRESSION;
  26870. /* last, extensions */
  26871. #ifdef HAVE_TLS_EXTENSIONS
  26872. {
  26873. word16 offset = 0;
  26874. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  26875. if (ret != 0)
  26876. return ret;
  26877. idx += offset;
  26878. }
  26879. #else
  26880. #ifdef HAVE_EXTENDED_MASTER
  26881. if (ssl->options.haveEMS) {
  26882. c16toa(HELLO_EXT_SZ, output + idx);
  26883. idx += HELLO_EXT_SZ_SZ;
  26884. c16toa(HELLO_EXT_EXTMS, output + idx);
  26885. idx += HELLO_EXT_TYPE_SZ;
  26886. c16toa(0, output + idx);
  26887. /*idx += HELLO_EXT_SZ_SZ;*/
  26888. /* idx is not used after this point. uncomment the line above
  26889. * if adding any more extensions in the future. */
  26890. }
  26891. #endif
  26892. #endif
  26893. if (IsEncryptionOn(ssl, 1)) {
  26894. byte* input;
  26895. int inputSz = idx; /* build msg adds rec hdr */
  26896. int recordHeaderSz = RECORD_HEADER_SZ;
  26897. if (ssl->options.dtls)
  26898. recordHeaderSz += DTLS_RECORD_EXTRA;
  26899. inputSz -= recordHeaderSz;
  26900. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26901. if (input == NULL)
  26902. return MEMORY_E;
  26903. XMEMCPY(input, output + recordHeaderSz, inputSz);
  26904. #ifdef WOLFSSL_DTLS
  26905. if (IsDtlsNotSctpMode(ssl) &&
  26906. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
  26907. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26908. return ret;
  26909. }
  26910. #endif
  26911. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  26912. handshake, 1, 0, 0, CUR_ORDER);
  26913. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26914. if (sendSz < 0)
  26915. return sendSz;
  26916. } else {
  26917. #ifdef WOLFSSL_DTLS
  26918. if (IsDtlsNotSctpMode(ssl)) {
  26919. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
  26920. return ret;
  26921. }
  26922. if (ssl->options.dtls)
  26923. DtlsSEQIncrement(ssl, CUR_ORDER);
  26924. #endif
  26925. ret = HashOutput(ssl, output, sendSz, 0);
  26926. if (ret != 0)
  26927. return ret;
  26928. }
  26929. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  26930. if (ssl->hsInfoOn)
  26931. AddPacketName(ssl, "ServerHello");
  26932. if (ssl->toInfoOn) {
  26933. ret = AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  26934. WRITE_PROTO, 0, ssl->heap);
  26935. if (ret != 0)
  26936. return ret;
  26937. }
  26938. #endif
  26939. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  26940. ssl->options.buildingMsg = 0;
  26941. ssl->buffers.outputBuffer.length += sendSz;
  26942. if (ssl->options.groupMessages)
  26943. ret = 0;
  26944. else
  26945. ret = SendBuffered(ssl);
  26946. WOLFSSL_LEAVE("SendServerHello", ret);
  26947. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  26948. return ret;
  26949. }
  26950. #if defined(HAVE_ECC)
  26951. static byte SetCurveId(ecc_key* key)
  26952. {
  26953. if (key == NULL || key->dp == NULL) {
  26954. WOLFSSL_MSG("SetCurveId: Invalid key!");
  26955. return 0;
  26956. }
  26957. return (byte)GetCurveByOID(key->dp->oidSum);
  26958. }
  26959. #endif /* HAVE_ECC */
  26960. typedef struct SskeArgs {
  26961. byte* output; /* not allocated */
  26962. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  26963. byte* exportBuf;
  26964. #endif
  26965. #ifndef NO_RSA
  26966. byte* verifySig;
  26967. #endif
  26968. byte* input;
  26969. word32 idx;
  26970. word32 tmpSigSz;
  26971. word32 length;
  26972. word32 sigSz;
  26973. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  26974. !defined(NO_RSA)
  26975. word32 sigDataSz;
  26976. #endif
  26977. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  26978. word32 exportSz;
  26979. #endif
  26980. int sendSz;
  26981. int inputSz;
  26982. } SskeArgs;
  26983. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  26984. {
  26985. SskeArgs* args = (SskeArgs*)pArgs;
  26986. (void)ssl;
  26987. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  26988. if (args->exportBuf) {
  26989. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  26990. args->exportBuf = NULL;
  26991. }
  26992. #endif
  26993. #ifndef NO_RSA
  26994. if (args->verifySig) {
  26995. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26996. args->verifySig = NULL;
  26997. }
  26998. #endif
  26999. (void)args;
  27000. }
  27001. /* handle generation of server_key_exchange (12) */
  27002. int SendServerKeyExchange(WOLFSSL* ssl)
  27003. {
  27004. int ret = 0;
  27005. #ifdef WOLFSSL_ASYNC_IO
  27006. SskeArgs* args = NULL;
  27007. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  27008. #else
  27009. SskeArgs args[1];
  27010. #endif
  27011. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  27012. WOLFSSL_ENTER("SendServerKeyExchange");
  27013. #ifdef WOLFSSL_ASYNC_IO
  27014. if (ssl->async == NULL) {
  27015. ssl->async = (struct WOLFSSL_ASYNC*)
  27016. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  27017. DYNAMIC_TYPE_ASYNC);
  27018. if (ssl->async == NULL)
  27019. ERROR_OUT(MEMORY_E, exit_sske);
  27020. XMEMSET(ssl->async, 0, sizeof(struct WOLFSSL_ASYNC));
  27021. }
  27022. args = (SskeArgs*)ssl->async->args;
  27023. #ifdef WOLFSSL_ASYNC_CRYPT
  27024. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  27025. if (ret != WC_NOT_PENDING_E) {
  27026. /* Check for error */
  27027. if (ret < 0)
  27028. goto exit_sske;
  27029. }
  27030. else
  27031. #endif
  27032. if (ssl->options.buildingMsg) {
  27033. /* We should be in the sending state. */
  27034. if (ssl->options.asyncState != TLS_ASYNC_END) {
  27035. ret = BAD_STATE_E;
  27036. goto exit_sske;
  27037. }
  27038. }
  27039. else
  27040. #endif
  27041. {
  27042. /* Reset state */
  27043. ret = 0;
  27044. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  27045. XMEMSET(args, 0, sizeof(SskeArgs));
  27046. #ifdef WOLFSSL_ASYNC_IO
  27047. ssl->async->freeArgs = FreeSskeArgs;
  27048. #endif
  27049. }
  27050. switch(ssl->options.asyncState)
  27051. {
  27052. case TLS_ASYNC_BEGIN:
  27053. {
  27054. /* Do some checks / debug msgs */
  27055. switch(ssl->specs.kea)
  27056. {
  27057. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27058. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27059. case ecdhe_psk_kea:
  27060. {
  27061. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  27062. break;
  27063. }
  27064. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27065. #if defined(HAVE_ECC)
  27066. case ecc_diffie_hellman_kea:
  27067. {
  27068. if (ssl->specs.static_ecdh) {
  27069. WOLFSSL_MSG("Using Static ECDH, not sending "
  27070. "ServerKeyExchange");
  27071. ERROR_OUT(0, exit_sske);
  27072. }
  27073. WOLFSSL_MSG("Using ephemeral ECDH");
  27074. break;
  27075. }
  27076. #endif /* HAVE_ECC */
  27077. }
  27078. /* Preparing keys */
  27079. switch(ssl->specs.kea)
  27080. {
  27081. #ifndef NO_PSK
  27082. case psk_kea:
  27083. {
  27084. /* Nothing to do in this sub-state */
  27085. break;
  27086. }
  27087. #endif /* !NO_PSK */
  27088. #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA) \
  27089. || (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  27090. #if !defined(NO_PSK)
  27091. case dhe_psk_kea:
  27092. #endif
  27093. #if !defined(NO_RSA) || (defined(HAVE_ANON) && \
  27094. !defined(WOLFSSL_NO_TLS12))
  27095. case diffie_hellman_kea:
  27096. #endif
  27097. #if (defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)) && !defined(HAVE_PUBLIC_FFDHE)
  27098. if (ssl->namedGroup) {
  27099. word32 pSz = 0;
  27100. ret = wc_DhGetNamedKeyParamSize(ssl->namedGroup, &pSz,
  27101. NULL, NULL);
  27102. if (ret != 0)
  27103. goto exit_sske;
  27104. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  27105. /* Free'd in SSL_ResourceFree and
  27106. * FreeHandshakeResources */
  27107. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  27108. pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  27109. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  27110. ERROR_OUT(MEMORY_E, exit_sske);
  27111. }
  27112. ssl->buffers.serverDH_Pub.length = pSz;
  27113. }
  27114. ssl->options.dhKeySz =(word16)pSz;
  27115. pSz = wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  27116. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  27117. /* Free'd in SSL_ResourceFree and
  27118. * FreeHandshakeResources */
  27119. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  27120. pSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  27121. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  27122. ERROR_OUT(MEMORY_E, exit_sske);
  27123. }
  27124. ssl->buffers.serverDH_Priv.length = pSz;
  27125. }
  27126. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  27127. (void**)&ssl->buffers.serverDH_Key);
  27128. if (ret != 0) {
  27129. goto exit_sske;
  27130. }
  27131. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  27132. ssl->namedGroup);
  27133. if (ret != 0) {
  27134. goto exit_sske;
  27135. }
  27136. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  27137. !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  27138. ssl->options.dhKeyTested = 1;
  27139. #endif
  27140. #ifdef HAVE_SECURE_RENEGOTIATION
  27141. /* Check that the DH public key buffer is large
  27142. * enough to hold the key. This may occur on a
  27143. * renegotiation when the key generated in the
  27144. * initial handshake is shorter than the key
  27145. * generated in the renegotiation. */
  27146. if (ssl->buffers.serverDH_Pub.length <
  27147. ssl->buffers.serverDH_P.length) {
  27148. byte* tmp = (byte*)XREALLOC(
  27149. ssl->buffers.serverDH_Pub.buffer,
  27150. ssl->buffers.serverDH_P.length +
  27151. OPAQUE16_LEN,
  27152. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  27153. if (tmp == NULL)
  27154. ERROR_OUT(MEMORY_E, exit_sske);
  27155. ssl->buffers.serverDH_Pub.buffer = tmp;
  27156. ssl->buffers.serverDH_Pub.length =
  27157. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  27158. }
  27159. #endif
  27160. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  27161. ssl->buffers.serverDH_Priv.buffer,
  27162. (word32*)&ssl->buffers.serverDH_Priv.length,
  27163. ssl->buffers.serverDH_Pub.buffer,
  27164. (word32*)&ssl->buffers.serverDH_Pub.length);
  27165. #ifdef WOLFSSL_CHECK_MEM_ZERO
  27166. wc_MemZero_Add("DH private key buffer",
  27167. ssl->buffers.serverDH_Priv.buffer,
  27168. ssl->buffers.serverDH_Priv.length);
  27169. #endif
  27170. break;
  27171. }
  27172. else
  27173. #endif
  27174. {
  27175. /* Allocate DH key buffers and generate key */
  27176. if (ssl->buffers.serverDH_P.buffer == NULL ||
  27177. ssl->buffers.serverDH_G.buffer == NULL) {
  27178. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  27179. }
  27180. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  27181. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  27182. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  27183. ssl->buffers.serverDH_P.length,
  27184. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  27185. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  27186. ERROR_OUT(MEMORY_E, exit_sske);
  27187. }
  27188. ssl->buffers.serverDH_Pub.length =
  27189. ssl->buffers.serverDH_P.length;
  27190. }
  27191. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  27192. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  27193. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  27194. ssl->buffers.serverDH_P.length,
  27195. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  27196. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  27197. ERROR_OUT(MEMORY_E, exit_sske);
  27198. }
  27199. ssl->buffers.serverDH_Priv.length =
  27200. ssl->buffers.serverDH_P.length;
  27201. }
  27202. ssl->options.dhKeySz =
  27203. (word16)ssl->buffers.serverDH_P.length;
  27204. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  27205. (void**)&ssl->buffers.serverDH_Key);
  27206. if (ret != 0) {
  27207. goto exit_sske;
  27208. }
  27209. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  27210. !defined(HAVE_FIPS) && \
  27211. !defined(HAVE_SELFTEST)
  27212. if (ssl->options.dhDoKeyTest &&
  27213. !ssl->options.dhKeyTested)
  27214. {
  27215. ret = wc_DhSetCheckKey(
  27216. ssl->buffers.serverDH_Key,
  27217. ssl->buffers.serverDH_P.buffer,
  27218. ssl->buffers.serverDH_P.length,
  27219. ssl->buffers.serverDH_G.buffer,
  27220. ssl->buffers.serverDH_G.length,
  27221. NULL, 0, 0, ssl->rng);
  27222. if (ret != 0) {
  27223. goto exit_sske;
  27224. }
  27225. ssl->options.dhKeyTested = 1;
  27226. }
  27227. else
  27228. #endif
  27229. {
  27230. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  27231. ssl->buffers.serverDH_P.buffer,
  27232. ssl->buffers.serverDH_P.length,
  27233. ssl->buffers.serverDH_G.buffer,
  27234. ssl->buffers.serverDH_G.length);
  27235. if (ret != 0) {
  27236. goto exit_sske;
  27237. }
  27238. }
  27239. #ifdef HAVE_SECURE_RENEGOTIATION
  27240. /* Check that the DH public key buffer is large
  27241. * enough to hold the key. This may occur on a
  27242. * renegotiation when the key generated in the
  27243. * initial handshake is shorter than the key
  27244. * generated in the renegotiation. */
  27245. if (ssl->buffers.serverDH_Pub.length <
  27246. ssl->buffers.serverDH_P.length) {
  27247. byte* tmp = (byte*)XREALLOC(
  27248. ssl->buffers.serverDH_Pub.buffer,
  27249. ssl->buffers.serverDH_P.length +
  27250. OPAQUE16_LEN,
  27251. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  27252. if (tmp == NULL)
  27253. ERROR_OUT(MEMORY_E, exit_sske);
  27254. ssl->buffers.serverDH_Pub.buffer = tmp;
  27255. ssl->buffers.serverDH_Pub.length =
  27256. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  27257. }
  27258. #endif
  27259. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  27260. ssl->buffers.serverDH_Priv.buffer,
  27261. (word32*)&ssl->buffers.serverDH_Priv.length,
  27262. ssl->buffers.serverDH_Pub.buffer,
  27263. (word32*)&ssl->buffers.serverDH_Pub.length);
  27264. #ifdef WOLFSSL_CHECK_MEM_ZERO
  27265. wc_MemZero_Add("DH private key buffer",
  27266. ssl->buffers.serverDH_Priv.buffer,
  27267. ssl->buffers.serverDH_Priv.length);
  27268. #endif
  27269. break;
  27270. }
  27271. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  27272. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27273. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27274. case ecdhe_psk_kea:
  27275. /* Fall through to create temp ECC key */
  27276. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27277. #if defined(HAVE_ECC) || \
  27278. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  27279. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  27280. !defined(NO_RSA)))
  27281. case ecc_diffie_hellman_kea:
  27282. {
  27283. #ifdef HAVE_CURVE25519
  27284. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27285. /* need ephemeral key now, create it if missing */
  27286. if (ssl->eccTempKey == NULL) {
  27287. /* alloc/init on demand */
  27288. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  27289. (void**)&ssl->eccTempKey);
  27290. if (ret != 0) {
  27291. goto exit_sske;
  27292. }
  27293. }
  27294. if (ssl->eccTempKeyPresent == 0) {
  27295. ret = X25519MakeKey(ssl,
  27296. (curve25519_key*)ssl->eccTempKey, NULL);
  27297. if (ret == 0 || ret == WC_PENDING_E) {
  27298. ssl->eccTempKeyPresent =
  27299. DYNAMIC_TYPE_CURVE25519;
  27300. }
  27301. }
  27302. break;
  27303. }
  27304. #endif
  27305. #ifdef HAVE_CURVE448
  27306. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27307. /* need ephemeral key now, create it if missing */
  27308. if (ssl->eccTempKey == NULL) {
  27309. /* alloc/init on demand */
  27310. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  27311. (void**)&ssl->eccTempKey);
  27312. if (ret != 0) {
  27313. goto exit_sske;
  27314. }
  27315. }
  27316. if (ssl->eccTempKeyPresent == 0) {
  27317. ret = X448MakeKey(ssl,
  27318. (curve448_key*)ssl->eccTempKey, NULL);
  27319. if (ret == 0 || ret == WC_PENDING_E) {
  27320. ssl->eccTempKeyPresent =
  27321. DYNAMIC_TYPE_CURVE448;
  27322. }
  27323. }
  27324. break;
  27325. }
  27326. #endif
  27327. #ifdef HAVE_ECC
  27328. /* need ephemeral key now, create it if missing */
  27329. if (ssl->eccTempKey == NULL) {
  27330. /* alloc/init on demand */
  27331. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  27332. (void**)&ssl->eccTempKey);
  27333. if (ret != 0) {
  27334. goto exit_sske;
  27335. }
  27336. }
  27337. if (ssl->eccTempKeyPresent == 0) {
  27338. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  27339. if (ret == 0 || ret == WC_PENDING_E) {
  27340. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  27341. }
  27342. }
  27343. #endif
  27344. break;
  27345. }
  27346. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27347. default:
  27348. /* Skip ServerKeyExchange */
  27349. goto exit_sske;
  27350. } /* switch(ssl->specs.kea) */
  27351. /* Check for error */
  27352. if (ret != 0) {
  27353. goto exit_sske;
  27354. }
  27355. /* Advance state and proceed */
  27356. ssl->options.asyncState = TLS_ASYNC_BUILD;
  27357. } /* case TLS_ASYNC_BEGIN */
  27358. FALL_THROUGH;
  27359. case TLS_ASYNC_BUILD:
  27360. {
  27361. switch(ssl->specs.kea)
  27362. {
  27363. #ifndef NO_PSK
  27364. case psk_kea:
  27365. {
  27366. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27367. if (ssl->arrays->server_hint[0] == 0) {
  27368. ERROR_OUT(0, exit_sske); /* don't send */
  27369. }
  27370. /* include size part */
  27371. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  27372. if (args->length > MAX_PSK_ID_LEN) {
  27373. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  27374. }
  27375. args->length += HINT_LEN_SZ;
  27376. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  27377. RECORD_HEADER_SZ;
  27378. #ifdef WOLFSSL_DTLS
  27379. if (ssl->options.dtls) {
  27380. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27381. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27382. }
  27383. #endif
  27384. if (IsEncryptionOn(ssl, 1)) {
  27385. args->sendSz += MAX_MSG_EXTRA;
  27386. }
  27387. /* Use tmp buffer */
  27388. args->input = (byte*)XMALLOC(args->sendSz,
  27389. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27390. if (args->input == NULL)
  27391. ERROR_OUT(MEMORY_E, exit_sske);
  27392. args->output = args->input;
  27393. AddHeaders(args->output, args->length,
  27394. server_key_exchange, ssl);
  27395. /* key data */
  27396. c16toa((word16)(args->length - HINT_LEN_SZ),
  27397. args->output + args->idx);
  27398. args->idx += HINT_LEN_SZ;
  27399. XMEMCPY(args->output + args->idx,
  27400. ssl->arrays->server_hint,
  27401. args->length - HINT_LEN_SZ);
  27402. break;
  27403. }
  27404. #endif /* !NO_PSK */
  27405. #if !defined(NO_DH) && !defined(NO_PSK)
  27406. case dhe_psk_kea:
  27407. {
  27408. word32 hintLen;
  27409. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27410. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  27411. ssl->buffers.serverDH_P.length +
  27412. ssl->buffers.serverDH_G.length +
  27413. ssl->buffers.serverDH_Pub.length;
  27414. /* include size part */
  27415. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  27416. if (hintLen > MAX_PSK_ID_LEN) {
  27417. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  27418. }
  27419. args->length += hintLen + HINT_LEN_SZ;
  27420. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  27421. RECORD_HEADER_SZ;
  27422. #ifdef WOLFSSL_DTLS
  27423. if (ssl->options.dtls) {
  27424. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27425. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27426. }
  27427. #endif
  27428. if (IsEncryptionOn(ssl, 1)) {
  27429. args->sendSz += MAX_MSG_EXTRA;
  27430. }
  27431. /* Use tmp buffer */
  27432. args->input = (byte*)XMALLOC(args->sendSz,
  27433. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27434. if (args->input == NULL)
  27435. ERROR_OUT(MEMORY_E, exit_sske);
  27436. args->output = args->input;
  27437. AddHeaders(args->output, args->length,
  27438. server_key_exchange, ssl);
  27439. /* key data */
  27440. c16toa((word16)hintLen, args->output + args->idx);
  27441. args->idx += HINT_LEN_SZ;
  27442. XMEMCPY(args->output + args->idx,
  27443. ssl->arrays->server_hint, hintLen);
  27444. args->idx += hintLen;
  27445. /* add p, g, pub */
  27446. c16toa((word16)ssl->buffers.serverDH_P.length,
  27447. args->output + args->idx);
  27448. args->idx += LENGTH_SZ;
  27449. XMEMCPY(args->output + args->idx,
  27450. ssl->buffers.serverDH_P.buffer,
  27451. ssl->buffers.serverDH_P.length);
  27452. args->idx += ssl->buffers.serverDH_P.length;
  27453. /* g */
  27454. c16toa((word16)ssl->buffers.serverDH_G.length,
  27455. args->output + args->idx);
  27456. args->idx += LENGTH_SZ;
  27457. XMEMCPY(args->output + args->idx,
  27458. ssl->buffers.serverDH_G.buffer,
  27459. ssl->buffers.serverDH_G.length);
  27460. args->idx += ssl->buffers.serverDH_G.length;
  27461. /* pub */
  27462. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  27463. args->output + args->idx);
  27464. args->idx += LENGTH_SZ;
  27465. XMEMCPY(args->output + args->idx,
  27466. ssl->buffers.serverDH_Pub.buffer,
  27467. ssl->buffers.serverDH_Pub.length);
  27468. /* No need to update idx, since sizes are already set */
  27469. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  27470. break;
  27471. }
  27472. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  27473. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27474. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27475. case ecdhe_psk_kea:
  27476. {
  27477. word32 hintLen;
  27478. /* curve type, named curve, length(1) */
  27479. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27480. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  27481. args->exportSz = MAX_EXPORT_ECC_SZ;
  27482. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  27483. ssl->heap, DYNAMIC_TYPE_DER);
  27484. if (args->exportBuf == NULL) {
  27485. ERROR_OUT(MEMORY_E, exit_sske);
  27486. }
  27487. #ifdef HAVE_CURVE25519
  27488. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27489. if (wc_curve25519_export_public_ex(
  27490. (curve25519_key*)ssl->eccTempKey,
  27491. args->exportBuf, &args->exportSz,
  27492. EC25519_LITTLE_ENDIAN) != 0) {
  27493. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27494. }
  27495. }
  27496. else
  27497. #endif
  27498. #ifdef HAVE_CURVE448
  27499. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27500. if (wc_curve448_export_public_ex(
  27501. (curve448_key*)ssl->eccTempKey,
  27502. args->exportBuf, &args->exportSz,
  27503. EC448_LITTLE_ENDIAN) != 0) {
  27504. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27505. }
  27506. }
  27507. else
  27508. #endif
  27509. {
  27510. PRIVATE_KEY_UNLOCK();
  27511. ret = wc_ecc_export_x963(ssl->eccTempKey,
  27512. args->exportBuf, &args->exportSz);
  27513. PRIVATE_KEY_LOCK();
  27514. if (ret != 0) {
  27515. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27516. }
  27517. }
  27518. args->length += args->exportSz;
  27519. /* include size part */
  27520. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  27521. if (hintLen > MAX_PSK_ID_LEN) {
  27522. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  27523. }
  27524. args->length += hintLen + HINT_LEN_SZ;
  27525. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  27526. #ifdef WOLFSSL_DTLS
  27527. if (ssl->options.dtls) {
  27528. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27529. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27530. }
  27531. #endif
  27532. if (IsEncryptionOn(ssl, 1)) {
  27533. args->sendSz += MAX_MSG_EXTRA;
  27534. }
  27535. /* Use tmp buffer */
  27536. args->input = (byte*)XMALLOC(args->sendSz,
  27537. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27538. if (args->input == NULL)
  27539. ERROR_OUT(MEMORY_E, exit_sske);
  27540. args->output = args->input;
  27541. /* key data */
  27542. c16toa((word16)hintLen, args->output + args->idx);
  27543. args->idx += HINT_LEN_SZ;
  27544. XMEMCPY(args->output + args->idx,
  27545. ssl->arrays->server_hint, hintLen);
  27546. args->idx += hintLen;
  27547. /* ECC key exchange data */
  27548. args->output[args->idx++] = named_curve;
  27549. args->output[args->idx++] = 0x00; /* leading zero */
  27550. #ifdef HAVE_CURVE25519
  27551. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  27552. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  27553. else
  27554. #endif
  27555. #ifdef HAVE_CURVE448
  27556. if (ssl->ecdhCurveOID == ECC_X448_OID)
  27557. args->output[args->idx++] = WOLFSSL_ECC_X448;
  27558. else
  27559. #endif
  27560. {
  27561. #ifdef HAVE_ECC
  27562. args->output[args->idx++] =
  27563. SetCurveId(ssl->eccTempKey);
  27564. #endif
  27565. }
  27566. args->output[args->idx++] = (byte)args->exportSz;
  27567. XMEMCPY(args->output + args->idx, args->exportBuf,
  27568. args->exportSz);
  27569. break;
  27570. }
  27571. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27572. #if defined(HAVE_ECC) || \
  27573. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  27574. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  27575. !defined(NO_RSA)))
  27576. case ecc_diffie_hellman_kea:
  27577. {
  27578. enum wc_HashType hashType;
  27579. word32 preSigSz, preSigIdx;
  27580. /* curve type, named curve, length(1) */
  27581. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27582. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  27583. /* Export temp ECC key and add to length */
  27584. args->exportSz = MAX_EXPORT_ECC_SZ;
  27585. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  27586. ssl->heap, DYNAMIC_TYPE_DER);
  27587. if (args->exportBuf == NULL) {
  27588. ERROR_OUT(MEMORY_E, exit_sske);
  27589. }
  27590. #ifdef HAVE_CURVE25519
  27591. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27592. if (wc_curve25519_export_public_ex(
  27593. (curve25519_key*)ssl->eccTempKey,
  27594. args->exportBuf, &args->exportSz,
  27595. EC25519_LITTLE_ENDIAN) != 0) {
  27596. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27597. }
  27598. }
  27599. else
  27600. #endif
  27601. #ifdef HAVE_CURVE448
  27602. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27603. if (wc_curve448_export_public_ex(
  27604. (curve448_key*)ssl->eccTempKey,
  27605. args->exportBuf, &args->exportSz,
  27606. EC448_LITTLE_ENDIAN) != 0) {
  27607. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27608. }
  27609. }
  27610. else
  27611. #endif
  27612. {
  27613. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  27614. PRIVATE_KEY_UNLOCK();
  27615. ret = wc_ecc_export_x963(ssl->eccTempKey,
  27616. args->exportBuf, &args->exportSz);
  27617. PRIVATE_KEY_LOCK();
  27618. if (ret != 0) {
  27619. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27620. }
  27621. #endif
  27622. }
  27623. args->length += args->exportSz;
  27624. preSigSz = args->length;
  27625. preSigIdx = args->idx;
  27626. if (ssl->buffers.key == NULL) {
  27627. #ifdef HAVE_PK_CALLBACKS
  27628. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  27629. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  27630. if (args->tmpSigSz == 0) {
  27631. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  27632. }
  27633. }
  27634. else
  27635. #endif
  27636. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  27637. }
  27638. else {
  27639. switch(ssl->suites->sigAlgo) {
  27640. #ifndef NO_RSA
  27641. #ifdef WC_RSA_PSS
  27642. case rsa_pss_sa_algo:
  27643. #endif
  27644. case rsa_sa_algo:
  27645. {
  27646. word16 keySz;
  27647. ssl->buffers.keyType = rsa_sa_algo;
  27648. ret = DecodePrivateKey(ssl, &keySz);
  27649. if (ret != 0) {
  27650. goto exit_sske;
  27651. }
  27652. args->tmpSigSz = (word32)keySz;
  27653. break;
  27654. }
  27655. #endif /* !NO_RSA */
  27656. #ifdef HAVE_ECC
  27657. case ecc_dsa_sa_algo:
  27658. {
  27659. word16 keySz;
  27660. ssl->buffers.keyType = ecc_dsa_sa_algo;
  27661. ret = DecodePrivateKey(ssl, &keySz);
  27662. if (ret != 0) {
  27663. goto exit_sske;
  27664. }
  27665. /* worst case estimate */
  27666. args->tmpSigSz = keySz;
  27667. break;
  27668. }
  27669. #endif
  27670. #ifdef HAVE_ED25519
  27671. case ed25519_sa_algo:
  27672. {
  27673. word16 keySz;
  27674. ssl->buffers.keyType = ed25519_sa_algo;
  27675. ret = DecodePrivateKey(ssl, &keySz);
  27676. if (ret != 0) {
  27677. goto exit_sske;
  27678. }
  27679. /* worst case estimate */
  27680. args->tmpSigSz = ED25519_SIG_SIZE;
  27681. break;
  27682. }
  27683. #endif /* HAVE_ED25519 */
  27684. #ifdef HAVE_ED448
  27685. case ed448_sa_algo:
  27686. {
  27687. word16 keySz;
  27688. ssl->buffers.keyType = ed448_sa_algo;
  27689. ret = DecodePrivateKey(ssl, &keySz);
  27690. if (ret != 0) {
  27691. goto exit_sske;
  27692. }
  27693. /* worst case estimate */
  27694. args->tmpSigSz = ED448_SIG_SIZE;
  27695. break;
  27696. }
  27697. #endif /* HAVE_ED448 */
  27698. default:
  27699. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  27700. } /* switch(ssl->specs.sig_algo) */
  27701. }
  27702. /* sig length */
  27703. args->length += LENGTH_SZ;
  27704. args->length += args->tmpSigSz;
  27705. if (IsAtLeastTLSv1_2(ssl)) {
  27706. args->length += HASH_SIG_SIZE;
  27707. }
  27708. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  27709. #ifdef WOLFSSL_DTLS
  27710. if (ssl->options.dtls) {
  27711. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27712. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27713. preSigIdx = args->idx;
  27714. }
  27715. #endif
  27716. if (IsEncryptionOn(ssl, 1)) {
  27717. args->sendSz += MAX_MSG_EXTRA;
  27718. }
  27719. /* Use tmp buffer */
  27720. args->input = (byte*)XMALLOC(args->sendSz,
  27721. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27722. if (args->input == NULL)
  27723. ERROR_OUT(MEMORY_E, exit_sske);
  27724. args->output = args->input;
  27725. /* record and message headers will be added below, when we're sure
  27726. of the sig length */
  27727. /* key exchange data */
  27728. args->output[args->idx++] = named_curve;
  27729. args->output[args->idx++] = 0x00; /* leading zero */
  27730. #ifdef HAVE_CURVE25519
  27731. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  27732. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  27733. else
  27734. #endif
  27735. #ifdef HAVE_CURVE448
  27736. if (ssl->ecdhCurveOID == ECC_X448_OID)
  27737. args->output[args->idx++] = WOLFSSL_ECC_X448;
  27738. else
  27739. #endif
  27740. {
  27741. #ifdef HAVE_ECC
  27742. args->output[args->idx++] =
  27743. SetCurveId(ssl->eccTempKey);
  27744. #endif
  27745. }
  27746. args->output[args->idx++] = (byte)args->exportSz;
  27747. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  27748. args->idx += args->exportSz;
  27749. /* Determine hash type */
  27750. if (IsAtLeastTLSv1_2(ssl)) {
  27751. EncodeSigAlg(ssl->suites->hashAlgo,
  27752. ssl->suites->sigAlgo,
  27753. &args->output[args->idx]);
  27754. args->idx += 2;
  27755. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  27756. if (hashType == WC_HASH_TYPE_NONE) {
  27757. ERROR_OUT(ALGO_ID_E, exit_sske);
  27758. }
  27759. } else {
  27760. /* only using sha and md5 for rsa */
  27761. #ifndef NO_OLD_TLS
  27762. hashType = WC_HASH_TYPE_SHA;
  27763. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  27764. hashType = WC_HASH_TYPE_MD5_SHA;
  27765. }
  27766. #else
  27767. ERROR_OUT(ALGO_ID_E, exit_sske);
  27768. #endif
  27769. }
  27770. /* Signature length will be written later, when we're sure what it is */
  27771. #ifdef HAVE_FUZZER
  27772. if (ssl->fuzzerCb) {
  27773. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  27774. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  27775. }
  27776. #endif
  27777. ret = HashSkeData(ssl, hashType,
  27778. args->output + preSigIdx, preSigSz,
  27779. ssl->suites->sigAlgo);
  27780. if (ret != 0) {
  27781. goto exit_sske;
  27782. }
  27783. args->sigSz = args->tmpSigSz;
  27784. /* Sign hash to create signature */
  27785. switch (ssl->suites->sigAlgo)
  27786. {
  27787. #ifndef NO_RSA
  27788. case rsa_sa_algo:
  27789. {
  27790. /* For TLS 1.2 re-encode signature */
  27791. if (IsAtLeastTLSv1_2(ssl)) {
  27792. byte* encodedSig = (byte*)XMALLOC(
  27793. MAX_ENCODED_SIG_SZ, ssl->heap,
  27794. DYNAMIC_TYPE_DIGEST);
  27795. if (encodedSig == NULL) {
  27796. ERROR_OUT(MEMORY_E, exit_sske);
  27797. }
  27798. ssl->buffers.digest.length =
  27799. wc_EncodeSignature(encodedSig,
  27800. ssl->buffers.digest.buffer,
  27801. ssl->buffers.digest.length,
  27802. TypeHash(ssl->suites->hashAlgo));
  27803. /* Replace sig buffer with new one */
  27804. XFREE(ssl->buffers.digest.buffer, ssl->heap,
  27805. DYNAMIC_TYPE_DIGEST);
  27806. ssl->buffers.digest.buffer = encodedSig;
  27807. }
  27808. /* write sig size here */
  27809. c16toa((word16)args->sigSz,
  27810. args->output + args->idx);
  27811. args->idx += LENGTH_SZ;
  27812. break;
  27813. }
  27814. #ifdef WC_RSA_PSS
  27815. case rsa_pss_sa_algo:
  27816. /* write sig size here */
  27817. c16toa((word16)args->sigSz,
  27818. args->output + args->idx);
  27819. args->idx += LENGTH_SZ;
  27820. break;
  27821. #endif
  27822. #endif /* !NO_RSA */
  27823. case ecc_dsa_sa_algo:
  27824. {
  27825. break;
  27826. }
  27827. #ifdef HAVE_ED25519
  27828. case ed25519_sa_algo:
  27829. ret = Ed25519CheckPubKey(ssl);
  27830. if (ret != 0)
  27831. goto exit_sske;
  27832. break;
  27833. #endif /* HAVE_ED25519 */
  27834. #ifdef HAVE_ED448
  27835. case ed448_sa_algo:
  27836. ret = Ed448CheckPubKey(ssl);
  27837. if (ret != 0)
  27838. goto exit_sske;
  27839. break;
  27840. #endif /* HAVE_ED448 */
  27841. default:
  27842. break;
  27843. } /* switch(ssl->specs.sig_algo) */
  27844. break;
  27845. }
  27846. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27847. #if !defined(NO_DH) && (!defined(NO_RSA) || \
  27848. (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  27849. case diffie_hellman_kea:
  27850. {
  27851. enum wc_HashType hashType;
  27852. word32 preSigSz, preSigIdx;
  27853. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27854. args->length = LENGTH_SZ * 3; /* p, g, pub */
  27855. args->length += ssl->buffers.serverDH_P.length +
  27856. ssl->buffers.serverDH_G.length +
  27857. ssl->buffers.serverDH_Pub.length;
  27858. preSigIdx = args->idx;
  27859. preSigSz = args->length;
  27860. if (!ssl->options.usingAnon_cipher) {
  27861. word16 keySz = 0;
  27862. /* sig length */
  27863. args->length += LENGTH_SZ;
  27864. if (ssl->buffers.key == NULL) {
  27865. #ifdef HAVE_PK_CALLBACKS
  27866. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  27867. keySz = (word32)GetPrivateKeySigSize(ssl);
  27868. else
  27869. #endif
  27870. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  27871. }
  27872. else
  27873. {
  27874. if (ssl->buffers.keyType == 0)
  27875. ssl->buffers.keyType = rsa_sa_algo;
  27876. ret = DecodePrivateKey(ssl, &keySz);
  27877. if (ret != 0) {
  27878. goto exit_sske;
  27879. }
  27880. }
  27881. /* test if keySz has error */
  27882. if (keySz == 0) {
  27883. ERROR_OUT(keySz, exit_sske);
  27884. }
  27885. args->tmpSigSz = (word32)keySz;
  27886. args->length += args->tmpSigSz;
  27887. if (IsAtLeastTLSv1_2(ssl)) {
  27888. args->length += HASH_SIG_SIZE;
  27889. }
  27890. }
  27891. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  27892. RECORD_HEADER_SZ;
  27893. #ifdef WOLFSSL_DTLS
  27894. if (ssl->options.dtls) {
  27895. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27896. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27897. preSigIdx = args->idx;
  27898. }
  27899. #endif
  27900. if (IsEncryptionOn(ssl, 1)) {
  27901. args->sendSz += MAX_MSG_EXTRA;
  27902. }
  27903. /* Use tmp buffer */
  27904. args->input = (byte*)XMALLOC(args->sendSz,
  27905. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27906. if (args->input == NULL)
  27907. ERROR_OUT(MEMORY_E, exit_sske);
  27908. args->output = args->input;
  27909. AddHeaders(args->output, args->length,
  27910. server_key_exchange, ssl);
  27911. /* add p, g, pub */
  27912. c16toa((word16)ssl->buffers.serverDH_P.length,
  27913. args->output + args->idx);
  27914. args->idx += LENGTH_SZ;
  27915. XMEMCPY(args->output + args->idx,
  27916. ssl->buffers.serverDH_P.buffer,
  27917. ssl->buffers.serverDH_P.length);
  27918. args->idx += ssl->buffers.serverDH_P.length;
  27919. /* g */
  27920. c16toa((word16)ssl->buffers.serverDH_G.length,
  27921. args->output + args->idx);
  27922. args->idx += LENGTH_SZ;
  27923. XMEMCPY(args->output + args->idx,
  27924. ssl->buffers.serverDH_G.buffer,
  27925. ssl->buffers.serverDH_G.length);
  27926. args->idx += ssl->buffers.serverDH_G.length;
  27927. /* pub */
  27928. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  27929. args->output + args->idx);
  27930. args->idx += LENGTH_SZ;
  27931. XMEMCPY(args->output + args->idx,
  27932. ssl->buffers.serverDH_Pub.buffer,
  27933. ssl->buffers.serverDH_Pub.length);
  27934. args->idx += ssl->buffers.serverDH_Pub.length;
  27935. #ifdef HAVE_FUZZER
  27936. if (ssl->fuzzerCb) {
  27937. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  27938. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  27939. }
  27940. #endif
  27941. if (ssl->options.usingAnon_cipher) {
  27942. break;
  27943. }
  27944. /* Determine hash type */
  27945. if (IsAtLeastTLSv1_2(ssl)) {
  27946. EncodeSigAlg(ssl->suites->hashAlgo,
  27947. ssl->suites->sigAlgo,
  27948. &args->output[args->idx]);
  27949. args->idx += 2;
  27950. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  27951. if (hashType == WC_HASH_TYPE_NONE) {
  27952. ERROR_OUT(ALGO_ID_E, exit_sske);
  27953. }
  27954. } else {
  27955. /* only using sha and md5 for rsa */
  27956. #ifndef NO_OLD_TLS
  27957. hashType = WC_HASH_TYPE_SHA;
  27958. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  27959. hashType = WC_HASH_TYPE_MD5_SHA;
  27960. }
  27961. #else
  27962. ERROR_OUT(ALGO_ID_E, exit_sske);
  27963. #endif
  27964. }
  27965. /* signature size */
  27966. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  27967. args->idx += LENGTH_SZ;
  27968. ret = HashSkeData(ssl, hashType,
  27969. args->output + preSigIdx, preSigSz,
  27970. ssl->suites->sigAlgo);
  27971. if (ret != 0) {
  27972. goto exit_sske;
  27973. }
  27974. args->sigSz = args->tmpSigSz;
  27975. /* Sign hash to create signature */
  27976. switch (ssl->suites->sigAlgo)
  27977. {
  27978. #ifndef NO_RSA
  27979. case rsa_sa_algo:
  27980. {
  27981. /* For TLS 1.2 re-encode signature */
  27982. if (IsAtLeastTLSv1_2(ssl)) {
  27983. byte* encodedSig = (byte*)XMALLOC(
  27984. MAX_ENCODED_SIG_SZ, ssl->heap,
  27985. DYNAMIC_TYPE_DIGEST);
  27986. if (encodedSig == NULL) {
  27987. ERROR_OUT(MEMORY_E, exit_sske);
  27988. }
  27989. ssl->buffers.digest.length =
  27990. wc_EncodeSignature(encodedSig,
  27991. ssl->buffers.digest.buffer,
  27992. ssl->buffers.digest.length,
  27993. TypeHash(ssl->suites->hashAlgo));
  27994. /* Replace sig buffer with new one */
  27995. XFREE(ssl->buffers.digest.buffer, ssl->heap,
  27996. DYNAMIC_TYPE_DIGEST);
  27997. ssl->buffers.digest.buffer = encodedSig;
  27998. }
  27999. break;
  28000. }
  28001. #endif /* NO_RSA */
  28002. default:
  28003. break;
  28004. } /* switch (ssl->suites->sigAlgo) */
  28005. break;
  28006. }
  28007. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  28008. default:
  28009. break;
  28010. } /* switch(ssl->specs.kea) */
  28011. /* Check for error */
  28012. if (ret != 0) {
  28013. goto exit_sske;
  28014. }
  28015. /* Advance state and proceed */
  28016. ssl->options.asyncState = TLS_ASYNC_DO;
  28017. } /* case TLS_ASYNC_BUILD */
  28018. FALL_THROUGH;
  28019. case TLS_ASYNC_DO:
  28020. {
  28021. switch(ssl->specs.kea)
  28022. {
  28023. #ifndef NO_PSK
  28024. case psk_kea:
  28025. {
  28026. break;
  28027. }
  28028. #endif /* !NO_PSK */
  28029. #if !defined(NO_DH) && !defined(NO_PSK)
  28030. case dhe_psk_kea:
  28031. {
  28032. break;
  28033. }
  28034. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  28035. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28036. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28037. case ecdhe_psk_kea:
  28038. {
  28039. break;
  28040. }
  28041. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  28042. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28043. defined(HAVE_CURVE448)
  28044. case ecc_diffie_hellman_kea:
  28045. {
  28046. /* Sign hash to create signature */
  28047. switch (ssl->suites->sigAlgo)
  28048. {
  28049. #ifndef NO_RSA
  28050. #ifdef WC_RSA_PSS
  28051. case rsa_pss_sa_algo:
  28052. #endif
  28053. case rsa_sa_algo:
  28054. {
  28055. RsaKey* key = (RsaKey*)ssl->hsKey;
  28056. ret = RsaSign(ssl,
  28057. ssl->buffers.digest.buffer,
  28058. ssl->buffers.digest.length,
  28059. args->output + args->idx,
  28060. &args->sigSz,
  28061. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  28062. key,
  28063. ssl->buffers.key
  28064. );
  28065. break;
  28066. }
  28067. #endif /* !NO_RSA */
  28068. #ifdef HAVE_ECC
  28069. case ecc_dsa_sa_algo:
  28070. {
  28071. ecc_key* key = (ecc_key*)ssl->hsKey;
  28072. ret = EccSign(ssl,
  28073. ssl->buffers.digest.buffer,
  28074. ssl->buffers.digest.length,
  28075. args->output + LENGTH_SZ + args->idx,
  28076. &args->sigSz,
  28077. key,
  28078. #ifdef HAVE_PK_CALLBACKS
  28079. ssl->buffers.key
  28080. #else
  28081. NULL
  28082. #endif
  28083. );
  28084. break;
  28085. }
  28086. #endif /* HAVE_ECC */
  28087. #ifdef HAVE_ED25519
  28088. case ed25519_sa_algo:
  28089. {
  28090. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  28091. ret = Ed25519Sign(ssl,
  28092. ssl->buffers.sig.buffer,
  28093. ssl->buffers.sig.length,
  28094. args->output + LENGTH_SZ + args->idx,
  28095. &args->sigSz,
  28096. key,
  28097. #ifdef HAVE_PK_CALLBACKS
  28098. ssl->buffers.key
  28099. #else
  28100. NULL
  28101. #endif
  28102. );
  28103. break;
  28104. }
  28105. #endif
  28106. #ifdef HAVE_ED448
  28107. case ed448_sa_algo:
  28108. {
  28109. ed448_key* key = (ed448_key*)ssl->hsKey;
  28110. ret = Ed448Sign(ssl,
  28111. ssl->buffers.sig.buffer,
  28112. ssl->buffers.sig.length,
  28113. args->output + LENGTH_SZ + args->idx,
  28114. &args->sigSz,
  28115. key,
  28116. #ifdef HAVE_PK_CALLBACKS
  28117. ssl->buffers.key
  28118. #else
  28119. NULL
  28120. #endif
  28121. );
  28122. break;
  28123. }
  28124. #endif
  28125. default:
  28126. ERROR_OUT(ALGO_ID_E, exit_sske);
  28127. } /* switch(ssl->specs.sig_algo) */
  28128. break;
  28129. }
  28130. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28131. #if !defined(NO_DH) && !defined(NO_RSA)
  28132. case diffie_hellman_kea:
  28133. {
  28134. /* Sign hash to create signature */
  28135. switch (ssl->suites->sigAlgo)
  28136. {
  28137. #ifndef NO_RSA
  28138. #ifdef WC_RSA_PSS
  28139. case rsa_pss_sa_algo:
  28140. #endif
  28141. case rsa_sa_algo:
  28142. {
  28143. RsaKey* key = (RsaKey*)ssl->hsKey;
  28144. if (ssl->options.usingAnon_cipher) {
  28145. break;
  28146. }
  28147. ret = RsaSign(ssl,
  28148. ssl->buffers.digest.buffer,
  28149. ssl->buffers.digest.length,
  28150. args->output + args->idx,
  28151. &args->sigSz,
  28152. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  28153. key,
  28154. ssl->buffers.key
  28155. );
  28156. break;
  28157. }
  28158. #endif /* NO_RSA */
  28159. default:
  28160. break;
  28161. } /* switch (ssl->suites->sigAlgo) */
  28162. break;
  28163. }
  28164. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  28165. default:
  28166. break;
  28167. } /* switch(ssl->specs.kea) */
  28168. /* Check for error */
  28169. if (ret != 0) {
  28170. goto exit_sske;
  28171. }
  28172. /* Advance state and proceed */
  28173. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  28174. } /* case TLS_ASYNC_DO */
  28175. FALL_THROUGH;
  28176. case TLS_ASYNC_VERIFY:
  28177. {
  28178. switch(ssl->specs.kea)
  28179. {
  28180. #ifndef NO_PSK
  28181. case psk_kea:
  28182. {
  28183. /* Nothing to do in this sub-state */
  28184. break;
  28185. }
  28186. #endif /* !NO_PSK */
  28187. #if !defined(NO_DH) && !defined(NO_PSK)
  28188. case dhe_psk_kea:
  28189. {
  28190. /* Nothing to do in this sub-state */
  28191. break;
  28192. }
  28193. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  28194. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28195. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28196. case ecdhe_psk_kea:
  28197. {
  28198. /* Nothing to do in this sub-state */
  28199. break;
  28200. }
  28201. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  28202. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28203. defined(HAVE_CURVE448)
  28204. case ecc_diffie_hellman_kea:
  28205. {
  28206. switch(ssl->suites->sigAlgo)
  28207. {
  28208. #ifndef NO_RSA
  28209. #ifdef WC_RSA_PSS
  28210. case rsa_pss_sa_algo:
  28211. #endif
  28212. case rsa_sa_algo:
  28213. {
  28214. RsaKey* key = (RsaKey*)ssl->hsKey;
  28215. if (args->verifySig == NULL) {
  28216. if (args->sigSz == 0) {
  28217. ERROR_OUT(BAD_COND_E, exit_sske);
  28218. }
  28219. args->verifySig = (byte*)XMALLOC(
  28220. args->sigSz, ssl->heap,
  28221. DYNAMIC_TYPE_SIGNATURE);
  28222. if (!args->verifySig) {
  28223. ERROR_OUT(MEMORY_E, exit_sske);
  28224. }
  28225. XMEMCPY(args->verifySig,
  28226. args->output + args->idx, args->sigSz);
  28227. }
  28228. /* check for signature faults */
  28229. ret = VerifyRsaSign(ssl,
  28230. args->verifySig, args->sigSz,
  28231. ssl->buffers.digest.buffer,
  28232. ssl->buffers.digest.length,
  28233. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  28234. key, ssl->buffers.key
  28235. );
  28236. break;
  28237. }
  28238. #endif
  28239. case ecc_dsa_sa_algo:
  28240. #ifdef WOLFSSL_CHECK_SIG_FAULTS
  28241. {
  28242. ecc_key* key = (ecc_key*)ssl->hsKey;
  28243. ret = EccVerify(ssl,
  28244. args->output + LENGTH_SZ + args->idx,
  28245. args->sigSz,
  28246. ssl->buffers.digest.buffer,
  28247. ssl->buffers.digest.length,
  28248. key,
  28249. #ifdef HAVE_PK_CALLBACKS
  28250. ssl->buffers.key
  28251. #else
  28252. NULL
  28253. #endif
  28254. );
  28255. if (ret != 0) {
  28256. WOLFSSL_MSG(
  28257. "Failed to verify ECC signature");
  28258. goto exit_sske;
  28259. }
  28260. }
  28261. #if defined(HAVE_CURVE25519) || \
  28262. defined(HAVE_CURVE448)
  28263. FALL_THROUGH;
  28264. #endif
  28265. #endif /* WOLFSSL_CHECK_SIG_FAULTS */
  28266. #ifdef HAVE_ED25519
  28267. case ed25519_sa_algo:
  28268. #endif
  28269. #ifdef HAVE_ED448
  28270. case ed448_sa_algo:
  28271. #endif
  28272. {
  28273. /* Now that we know the real sig size, write it. */
  28274. c16toa((word16)args->sigSz,
  28275. args->output + args->idx);
  28276. /* And adjust length and sendSz from estimates */
  28277. args->length += args->sigSz - args->tmpSigSz;
  28278. args->sendSz += args->sigSz - args->tmpSigSz;
  28279. break;
  28280. }
  28281. default:
  28282. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  28283. } /* switch(ssl->specs.sig_algo) */
  28284. break;
  28285. }
  28286. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28287. #if !defined(NO_DH) && !defined(NO_RSA)
  28288. case diffie_hellman_kea:
  28289. {
  28290. switch (ssl->suites->sigAlgo)
  28291. {
  28292. #ifndef NO_RSA
  28293. #ifndef WC_RSA_PSS
  28294. case rsa_pss_sa_algo:
  28295. #endif
  28296. case rsa_sa_algo:
  28297. {
  28298. RsaKey* key = (RsaKey*)ssl->hsKey;
  28299. if (ssl->options.usingAnon_cipher) {
  28300. break;
  28301. }
  28302. if (args->verifySig == NULL) {
  28303. if (args->sigSz == 0) {
  28304. ERROR_OUT(BAD_COND_E, exit_sske);
  28305. }
  28306. args->verifySig = (byte*)XMALLOC(
  28307. args->sigSz, ssl->heap,
  28308. DYNAMIC_TYPE_SIGNATURE);
  28309. if (!args->verifySig) {
  28310. ERROR_OUT(MEMORY_E, exit_sske);
  28311. }
  28312. XMEMCPY(args->verifySig,
  28313. args->output + args->idx, args->sigSz);
  28314. }
  28315. /* check for signature faults */
  28316. ret = VerifyRsaSign(ssl,
  28317. args->verifySig, args->sigSz,
  28318. ssl->buffers.digest.buffer,
  28319. ssl->buffers.digest.length,
  28320. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  28321. key, ssl->buffers.key
  28322. );
  28323. break;
  28324. }
  28325. #endif
  28326. } /* switch (ssl->suites->sigAlgo) */
  28327. break;
  28328. }
  28329. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  28330. default:
  28331. break;
  28332. } /* switch(ssl->specs.kea) */
  28333. /* Check for error */
  28334. if (ret != 0) {
  28335. goto exit_sske;
  28336. }
  28337. /* Advance state and proceed */
  28338. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  28339. } /* case TLS_ASYNC_VERIFY */
  28340. FALL_THROUGH;
  28341. case TLS_ASYNC_FINALIZE:
  28342. {
  28343. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28344. defined(HAVE_CURVE448)
  28345. if (ssl->specs.kea == ecdhe_psk_kea ||
  28346. ssl->specs.kea == ecc_diffie_hellman_kea) {
  28347. /* Check output to make sure it was set */
  28348. if (args->output) {
  28349. AddHeaders(args->output, args->length,
  28350. server_key_exchange, ssl);
  28351. }
  28352. else {
  28353. ERROR_OUT(BUFFER_ERROR, exit_sske);
  28354. }
  28355. }
  28356. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28357. /* Advance state and proceed */
  28358. ssl->options.asyncState = TLS_ASYNC_END;
  28359. } /* case TLS_ASYNC_FINALIZE */
  28360. FALL_THROUGH;
  28361. case TLS_ASYNC_END:
  28362. {
  28363. ret = SendHandshakeMsg(ssl, args->output, args->length,
  28364. server_key_exchange, "ServerKeyExchange");
  28365. if (ret != 0)
  28366. goto exit_sske;
  28367. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  28368. break;
  28369. }
  28370. default:
  28371. ret = INPUT_CASE_ERROR;
  28372. } /* switch(ssl->options.asyncState) */
  28373. exit_sske:
  28374. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  28375. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  28376. #ifdef WOLFSSL_ASYNC_IO
  28377. /* Handle async operation */
  28378. if (ret == WANT_WRITE
  28379. #ifdef WOLFSSL_ASYNC_CRYPT
  28380. || ret == WC_PENDING_E
  28381. #endif
  28382. )
  28383. return ret;
  28384. #endif /* WOLFSSL_ASYNC_IO */
  28385. /* Final cleanup */
  28386. if (
  28387. #ifdef WOLFSSL_ASYNC_IO
  28388. args != NULL &&
  28389. #endif
  28390. args->input != NULL) {
  28391. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28392. args->input = NULL;
  28393. }
  28394. #ifdef WOLFSSL_ASYNC_IO
  28395. /* Cleanup async */
  28396. FreeAsyncCtx(ssl, 0);
  28397. #else
  28398. FreeSskeArgs(ssl, args);
  28399. #endif
  28400. FreeKeyExchange(ssl);
  28401. if (ret != 0) {
  28402. WOLFSSL_ERROR_VERBOSE(ret);
  28403. }
  28404. return ret;
  28405. }
  28406. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  28407. defined(OPENSSL_ALL)
  28408. /* search suites for specific one, idx on success, negative on error */
  28409. static int FindSuite(Suites* suites, byte first, byte second)
  28410. {
  28411. int i;
  28412. if (suites == NULL || suites->suiteSz == 0) {
  28413. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  28414. return SUITES_ERROR;
  28415. }
  28416. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  28417. if (suites->suites[i] == first &&
  28418. suites->suites[i+1] == second )
  28419. return i;
  28420. }
  28421. return MATCH_SUITE_ERROR;
  28422. }
  28423. #endif
  28424. #endif /* !WOLFSSL_NO_TLS12 */
  28425. /* Make sure server cert/key are valid for this suite, true on success
  28426. * Returns 1 for valid server suite or 0 if not found
  28427. * For asynchronous this can return WC_PENDING_E
  28428. */
  28429. static int VerifyServerSuite(WOLFSSL* ssl, word16 idx)
  28430. {
  28431. #ifndef NO_PSK
  28432. int havePSK = ssl->options.havePSK;
  28433. #endif
  28434. byte first;
  28435. byte second;
  28436. WOLFSSL_ENTER("VerifyServerSuite");
  28437. if (ssl->suites == NULL) {
  28438. WOLFSSL_MSG("Suites pointer error");
  28439. return 0;
  28440. }
  28441. first = ssl->suites->suites[idx];
  28442. second = ssl->suites->suites[idx+1];
  28443. if (CipherRequires(first, second, REQUIRES_RSA)) {
  28444. WOLFSSL_MSG("Requires RSA");
  28445. if (ssl->options.haveRSA == 0) {
  28446. WOLFSSL_MSG("Don't have RSA");
  28447. return 0;
  28448. }
  28449. }
  28450. if (CipherRequires(first, second, REQUIRES_DHE)) {
  28451. WOLFSSL_MSG("Requires DHE");
  28452. if (ssl->options.haveDH == 0) {
  28453. WOLFSSL_MSG("Don't have DHE");
  28454. return 0;
  28455. }
  28456. }
  28457. if (CipherRequires(first, second, REQUIRES_ECC)) {
  28458. WOLFSSL_MSG("Requires ECC");
  28459. if (ssl->options.haveECC == 0) {
  28460. WOLFSSL_MSG("Don't have ECC");
  28461. return 0;
  28462. }
  28463. }
  28464. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  28465. WOLFSSL_MSG("Requires static ECC");
  28466. if (ssl->options.haveStaticECC == 0) {
  28467. WOLFSSL_MSG("Don't have static ECC");
  28468. return 0;
  28469. }
  28470. }
  28471. if (CipherRequires(first, second, REQUIRES_PSK)) {
  28472. WOLFSSL_MSG("Requires PSK");
  28473. #ifndef NO_PSK
  28474. if (havePSK == 0)
  28475. #endif
  28476. {
  28477. WOLFSSL_MSG("Don't have PSK");
  28478. return 0;
  28479. }
  28480. }
  28481. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  28482. WOLFSSL_MSG("Requires RSA Signature");
  28483. if (ssl->options.side == WOLFSSL_SERVER_END &&
  28484. ssl->options.haveECDSAsig == 1) {
  28485. WOLFSSL_MSG("Don't have RSA Signature");
  28486. return 0;
  28487. }
  28488. }
  28489. #if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
  28490. if (CipherRequires(first, second, REQUIRES_AEAD)) {
  28491. WOLFSSL_MSG("Requires AEAD");
  28492. if (ssl->version.major == SSLv3_MAJOR &&
  28493. ssl->version.minor < TLSv1_2_MINOR) {
  28494. WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
  28495. return 0;
  28496. }
  28497. }
  28498. #endif
  28499. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28500. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  28501. if (!TLSX_ValidateSupportedCurves(ssl, first, second)) {
  28502. WOLFSSL_MSG("Don't have matching curves");
  28503. return 0;
  28504. }
  28505. #endif
  28506. #ifdef WOLFSSL_TLS13
  28507. if (IsAtLeastTLSv1_3(ssl->version) &&
  28508. ssl->options.side == WOLFSSL_SERVER_END) {
  28509. #ifdef HAVE_SUPPORTED_CURVES
  28510. int doHelloRetry = 0;
  28511. /* Try to establish a key share. */
  28512. int ret = TLSX_KeyShare_Establish(ssl, &doHelloRetry);
  28513. if (doHelloRetry) {
  28514. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  28515. }
  28516. #ifdef WOLFSSL_ASYNC_CRYPT
  28517. if (ret == WC_PENDING_E)
  28518. return ret;
  28519. #endif
  28520. if (!doHelloRetry && ret != 0) {
  28521. return 0; /* not found */
  28522. }
  28523. #endif /* HAVE_SUPPORTED_CURVES */
  28524. }
  28525. else if (first == TLS13_BYTE || (first == ECC_BYTE &&
  28526. (second == TLS_SHA256_SHA256 || second == TLS_SHA384_SHA384))) {
  28527. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  28528. * version. */
  28529. return 0;
  28530. }
  28531. #endif /* WOLFSSL_TLS13 */
  28532. return 1;
  28533. }
  28534. static int CompareSuites(WOLFSSL* ssl, Suites* peerSuites, word16 i,
  28535. word16 j)
  28536. {
  28537. if (ssl->suites->suites[i] == peerSuites->suites[j] &&
  28538. ssl->suites->suites[i+1] == peerSuites->suites[j+1] ) {
  28539. int ret = VerifyServerSuite(ssl, i);
  28540. #ifdef WOLFSSL_ASYNC_CRYPT
  28541. if (ret == WC_PENDING_E)
  28542. return ret;
  28543. #endif
  28544. if (ret) {
  28545. WOLFSSL_MSG("Verified suite validity");
  28546. ssl->options.cipherSuite0 = ssl->suites->suites[i];
  28547. ssl->options.cipherSuite = ssl->suites->suites[i+1];
  28548. ret = SetCipherSpecs(ssl);
  28549. if (ret == 0) {
  28550. ret = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  28551. peerSuites->hashSigAlgoSz);
  28552. }
  28553. return ret;
  28554. }
  28555. else {
  28556. WOLFSSL_MSG("Could not verify suite validity, continue");
  28557. }
  28558. }
  28559. return MATCH_SUITE_ERROR;
  28560. }
  28561. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  28562. {
  28563. int ret;
  28564. word16 i, j;
  28565. WOLFSSL_ENTER("MatchSuite");
  28566. /* & 0x1 equivalent % 2 */
  28567. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  28568. return BUFFER_ERROR;
  28569. if (ssl->suites == NULL)
  28570. return SUITES_ERROR;
  28571. if (!ssl->options.useClientOrder) {
  28572. /* Server order */
  28573. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  28574. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  28575. ret = CompareSuites(ssl, peerSuites, i, j);
  28576. if (ret != MATCH_SUITE_ERROR)
  28577. return ret;
  28578. }
  28579. }
  28580. }
  28581. else {
  28582. /* Client order */
  28583. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  28584. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  28585. ret = CompareSuites(ssl, peerSuites, i, j);
  28586. if (ret != MATCH_SUITE_ERROR)
  28587. return ret;
  28588. }
  28589. }
  28590. }
  28591. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  28592. return MATCH_SUITE_ERROR;
  28593. }
  28594. #ifdef OLD_HELLO_ALLOWED
  28595. /* process old style client hello, deprecate? */
  28596. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  28597. word32 inSz, word16 sz)
  28598. {
  28599. word32 idx = *inOutIdx;
  28600. word16 sessionSz;
  28601. word16 randomSz;
  28602. word16 i, j;
  28603. ProtocolVersion pv;
  28604. Suites clSuites;
  28605. int ret = -1;
  28606. (void)inSz;
  28607. WOLFSSL_MSG("Got old format client hello");
  28608. #ifdef WOLFSSL_CALLBACKS
  28609. if (ssl->hsInfoOn)
  28610. AddPacketName(ssl, "ClientHello");
  28611. if (ssl->toInfoOn)
  28612. AddLateName("ClientHello", &ssl->timeoutInfo);
  28613. #endif
  28614. /* manually hash input since different format */
  28615. #ifndef NO_OLD_TLS
  28616. #ifndef NO_MD5
  28617. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  28618. #endif
  28619. #ifndef NO_SHA
  28620. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  28621. #endif
  28622. #endif
  28623. #ifndef NO_SHA256
  28624. if (IsAtLeastTLSv1_2(ssl)) {
  28625. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  28626. input + idx, sz);
  28627. if (shaRet != 0)
  28628. return shaRet;
  28629. }
  28630. #endif
  28631. /* does this value mean client_hello? */
  28632. idx++;
  28633. /* version */
  28634. pv.major = input[idx++];
  28635. pv.minor = input[idx++];
  28636. ssl->chVersion = pv; /* store */
  28637. if (ssl->version.minor > pv.minor) {
  28638. byte haveRSA = 0;
  28639. byte havePSK = 0;
  28640. int keySz = 0;
  28641. if (!ssl->options.downgrade) {
  28642. WOLFSSL_MSG("Client trying to connect with lesser version");
  28643. return VERSION_ERROR;
  28644. }
  28645. if (pv.minor < ssl->options.minDowngrade) {
  28646. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  28647. return VERSION_ERROR;
  28648. }
  28649. if (pv.minor == SSLv3_MINOR) {
  28650. /* turn off tls */
  28651. WOLFSSL_MSG("\tdowngrading to SSLv3");
  28652. ssl->options.tls = 0;
  28653. ssl->options.tls1_1 = 0;
  28654. ssl->version.minor = SSLv3_MINOR;
  28655. }
  28656. else if (pv.minor == TLSv1_MINOR) {
  28657. WOLFSSL_MSG("\tdowngrading to TLSv1");
  28658. /* turn off tls 1.1+ */
  28659. ssl->options.tls1_1 = 0;
  28660. ssl->version.minor = TLSv1_MINOR;
  28661. }
  28662. else if (pv.minor == TLSv1_1_MINOR) {
  28663. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  28664. ssl->version.minor = TLSv1_1_MINOR;
  28665. }
  28666. else if (pv.minor == TLSv1_2_MINOR) {
  28667. WOLFSSL_MSG(" downgrading to TLSv1.2");
  28668. ssl->version.minor = TLSv1_2_MINOR;
  28669. }
  28670. #ifndef NO_RSA
  28671. haveRSA = 1;
  28672. #endif
  28673. #ifndef NO_PSK
  28674. havePSK = ssl->options.havePSK;
  28675. #endif
  28676. #ifndef NO_CERTS
  28677. keySz = ssl->buffers.keySz;
  28678. #endif
  28679. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  28680. ssl->options.haveDH, ssl->options.haveECDSAsig,
  28681. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  28682. ssl->options.haveFalconSig,
  28683. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  28684. TRUE, ssl->options.side);
  28685. }
  28686. /* suite size */
  28687. ato16(&input[idx], &clSuites.suiteSz);
  28688. idx += OPAQUE16_LEN;
  28689. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  28690. return BUFFER_ERROR;
  28691. /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
  28692. if (clSuites.suiteSz % 3 != 0)
  28693. return BUFFER_ERROR;
  28694. clSuites.hashSigAlgoSz = 0;
  28695. /* session size */
  28696. ato16(&input[idx], &sessionSz);
  28697. idx += OPAQUE16_LEN;
  28698. if (sessionSz > ID_LEN)
  28699. return BUFFER_ERROR;
  28700. /* random size */
  28701. ato16(&input[idx], &randomSz);
  28702. idx += OPAQUE16_LEN;
  28703. if (randomSz > RAN_LEN)
  28704. return BUFFER_ERROR;
  28705. /* suites */
  28706. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  28707. byte first = input[idx++];
  28708. if (!first) { /* implicit: skip sslv2 type */
  28709. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  28710. j += SUITE_LEN;
  28711. }
  28712. idx += SUITE_LEN;
  28713. }
  28714. clSuites.suiteSz = j;
  28715. /* session id */
  28716. if (sessionSz) {
  28717. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  28718. ssl->arrays->sessionIDSz = (byte)sessionSz;
  28719. idx += sessionSz;
  28720. ssl->options.resuming = 1;
  28721. }
  28722. /* random */
  28723. if (randomSz < RAN_LEN)
  28724. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  28725. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  28726. randomSz);
  28727. idx += randomSz;
  28728. if (ssl->options.usingCompression)
  28729. ssl->options.usingCompression = 0; /* turn off */
  28730. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  28731. ssl->cbmode = SSL_CB_MODE_WRITE;
  28732. *inOutIdx = idx;
  28733. ssl->options.haveSessionId = 1;
  28734. /* DoClientHello uses same resume code */
  28735. if (ssl->options.resuming) { /* let's try */
  28736. WOLFSSL_SESSION* session;
  28737. #ifdef HAVE_SESSION_TICKET
  28738. if (ssl->options.useTicket == 1) {
  28739. session = ssl->session;
  28740. }
  28741. else
  28742. #endif
  28743. {
  28744. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  28745. }
  28746. if (!session) {
  28747. WOLFSSL_MSG("Session lookup for resume failed");
  28748. ssl->options.resuming = 0;
  28749. } else {
  28750. if (MatchSuite(ssl, &clSuites) < 0) {
  28751. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  28752. return UNSUPPORTED_SUITE;
  28753. }
  28754. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  28755. RAN_LEN);
  28756. if (ret != 0)
  28757. return ret;
  28758. #ifdef NO_OLD_TLS
  28759. ret = DeriveTlsKeys(ssl);
  28760. #else
  28761. #ifndef NO_TLS
  28762. if (ssl->options.tls)
  28763. ret = DeriveTlsKeys(ssl);
  28764. #endif
  28765. if (!ssl->options.tls)
  28766. ret = DeriveKeys(ssl);
  28767. #endif
  28768. /* SERVER: peer auth based on session secret. */
  28769. ssl->options.peerAuthGood = (ret == 0);
  28770. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  28771. return ret;
  28772. }
  28773. }
  28774. ret = MatchSuite(ssl, &clSuites);
  28775. if (ret != 0)return ret;
  28776. return SanityCheckMsgReceived(ssl, client_hello);
  28777. }
  28778. #endif /* OLD_HELLO_ALLOWED */
  28779. #ifndef WOLFSSL_NO_TLS12
  28780. /**
  28781. * Handles session resumption.
  28782. * Session tickets are checked for validity based on the time each ticket
  28783. * was created, timeout value and the current time. If the tickets are
  28784. * judged expired, falls back to full-handshake. If you want disable this
  28785. * session ticket validation check in TLS1.2 and below, define
  28786. * WOLFSSL_NO_TICKET_EXPRE.
  28787. */
  28788. int HandleTlsResumption(WOLFSSL* ssl, int bogusID, Suites* clSuites)
  28789. {
  28790. int ret = 0;
  28791. WOLFSSL_SESSION* session;
  28792. (void)bogusID;
  28793. #ifdef HAVE_SESSION_TICKET
  28794. if (ssl->options.useTicket == 1) {
  28795. session = ssl->session;
  28796. }
  28797. else if (bogusID == 1 && ssl->options.rejectTicket == 0) {
  28798. WOLFSSL_MSG("Bogus session ID without session ticket");
  28799. return BUFFER_ERROR;
  28800. }
  28801. else
  28802. #endif
  28803. {
  28804. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  28805. }
  28806. if (!session) {
  28807. WOLFSSL_MSG("Session lookup for resume failed");
  28808. ssl->options.resuming = 0;
  28809. return ret;
  28810. }
  28811. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_TICKET_EXPIRE) && \
  28812. !defined(NO_ASN_TIME)
  28813. /* check if the ticket is valid */
  28814. if (LowResTimer() > session->bornOn + ssl->timeout) {
  28815. WOLFSSL_MSG("Expired session ticket, fall back to full handshake.");
  28816. ssl->options.resuming = 0;
  28817. }
  28818. #endif /* HAVE_SESSION_TICKET && !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
  28819. else if (session->haveEMS != ssl->options.haveEMS) {
  28820. /* RFC 7627, 5.3, server-side */
  28821. /* if old sess didn't have EMS, but new does, full handshake */
  28822. if (!session->haveEMS && ssl->options.haveEMS) {
  28823. WOLFSSL_MSG("Attempting to resume a session that didn't "
  28824. "use EMS with a new session with EMS. Do full "
  28825. "handshake.");
  28826. ssl->options.resuming = 0;
  28827. }
  28828. /* if old sess used EMS, but new doesn't, MUST abort */
  28829. else if (session->haveEMS && !ssl->options.haveEMS) {
  28830. WOLFSSL_MSG("Trying to resume a session with EMS without "
  28831. "using EMS");
  28832. #ifdef WOLFSSL_EXTRA_ALERTS
  28833. SendAlert(ssl, alert_fatal, handshake_failure);
  28834. #endif
  28835. ret = EXT_MASTER_SECRET_NEEDED_E;
  28836. WOLFSSL_ERROR_VERBOSE(ret);
  28837. }
  28838. }
  28839. else {
  28840. #ifndef NO_RESUME_SUITE_CHECK
  28841. int j;
  28842. /* Check client suites include the one in session */
  28843. for (j = 0; j < clSuites->suiteSz; j += 2) {
  28844. if (clSuites->suites[j] == session->cipherSuite0 &&
  28845. clSuites->suites[j+1] == session->cipherSuite) {
  28846. break;
  28847. }
  28848. }
  28849. if (j == clSuites->suiteSz) {
  28850. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  28851. #ifdef WOLFSSL_EXTRA_ALERTS
  28852. SendAlert(ssl, alert_fatal, illegal_parameter);
  28853. #endif
  28854. ret = UNSUPPORTED_SUITE;
  28855. WOLFSSL_ERROR_VERBOSE(ret);
  28856. }
  28857. #endif
  28858. if (ret == 0 && ssl->options.resuming) {
  28859. /* for resumption use the cipher suite from session */
  28860. ssl->options.cipherSuite0 = session->cipherSuite0;
  28861. ssl->options.cipherSuite = session->cipherSuite;
  28862. ret = SetCipherSpecs(ssl);
  28863. if (ret == 0) {
  28864. ret = PickHashSigAlgo(ssl, clSuites->hashSigAlgo,
  28865. clSuites->hashSigAlgoSz);
  28866. }
  28867. }
  28868. else if (ret == 0) {
  28869. if (MatchSuite(ssl, clSuites) < 0) {
  28870. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  28871. ret = UNSUPPORTED_SUITE;
  28872. WOLFSSL_ERROR_VERBOSE(ret);
  28873. }
  28874. }
  28875. if (ret == 0) {
  28876. ret = wc_RNG_GenerateBlock(ssl->rng,
  28877. ssl->arrays->serverRandom, RAN_LEN);
  28878. }
  28879. if (ret == 0) {
  28880. #ifdef NO_OLD_TLS
  28881. ret = DeriveTlsKeys(ssl);
  28882. #else
  28883. #ifndef NO_TLS
  28884. if (ssl->options.tls)
  28885. ret = DeriveTlsKeys(ssl);
  28886. #endif
  28887. if (!ssl->options.tls)
  28888. ret = DeriveKeys(ssl);
  28889. #endif
  28890. /* SERVER: peer auth based on session secret. */
  28891. ssl->options.peerAuthGood = (ret == 0);
  28892. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  28893. }
  28894. }
  28895. return ret;
  28896. }
  28897. /* handle processing of client_hello (1) */
  28898. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  28899. word32 helloSz)
  28900. {
  28901. byte b;
  28902. byte bogusID = 0; /* flag for a bogus session id */
  28903. ProtocolVersion pv;
  28904. #ifdef WOLFSSL_SMALL_STACK
  28905. Suites* clSuites = NULL;
  28906. #else
  28907. Suites clSuites[1];
  28908. #endif
  28909. word32 i = *inOutIdx;
  28910. word32 begin = i;
  28911. int ret = 0;
  28912. byte lesserVersion;
  28913. #ifdef WOLFSSL_DTLS
  28914. Hmac cookieHmac;
  28915. byte newCookie[MAX_COOKIE_LEN];
  28916. byte peerCookie[MAX_COOKIE_LEN];
  28917. byte peerCookieSz = 0;
  28918. byte cookieType;
  28919. byte cookieSz = 0;
  28920. XMEMSET(&cookieHmac, 0, sizeof(Hmac));
  28921. #endif /* WOLFSSL_DTLS */
  28922. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  28923. WOLFSSL_ENTER("DoClientHello");
  28924. #ifdef WOLFSSL_CALLBACKS
  28925. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  28926. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  28927. #endif
  28928. /* protocol version, random and session id length check */
  28929. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  28930. return BUFFER_ERROR;
  28931. /* protocol version */
  28932. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  28933. ssl->chVersion = pv; /* store */
  28934. #ifdef WOLFSSL_DTLS
  28935. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  28936. if (((ssl->keys.dtls_sequence_number_hi == ssl->keys.curSeq_hi &&
  28937. ssl->keys.dtls_sequence_number_lo < ssl->keys.curSeq_lo) ||
  28938. (ssl->keys.dtls_sequence_number_hi < ssl->keys.curSeq_hi))) {
  28939. /* We should continue with the same sequence number as the
  28940. * Client Hello if available. */
  28941. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  28942. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  28943. }
  28944. /* We should continue with the same handshake number as the
  28945. * Client Hello. */
  28946. ssl->keys.dtls_handshake_number =
  28947. ssl->keys.dtls_peer_handshake_number;
  28948. #if defined(NO_SHA) && defined(NO_SHA256)
  28949. #error "DTLS needs either SHA or SHA-256"
  28950. #endif /* NO_SHA && NO_SHA256 */
  28951. #if !defined(NO_SHA) && defined(NO_SHA256)
  28952. cookieType = WC_SHA;
  28953. cookieSz = WC_SHA_DIGEST_SIZE;
  28954. #endif /* NO_SHA */
  28955. #ifndef NO_SHA256
  28956. cookieType = WC_SHA256;
  28957. cookieSz = WC_SHA256_DIGEST_SIZE;
  28958. #endif /* NO_SHA256 */
  28959. ret = wc_HmacSetKey(&cookieHmac, cookieType,
  28960. ssl->buffers.dtlsCookieSecret.buffer,
  28961. ssl->buffers.dtlsCookieSecret.length);
  28962. if (ret != 0) goto out;
  28963. ret = wc_HmacUpdate(&cookieHmac,
  28964. (const byte*)ssl->buffers.dtlsCtx.peer.sa,
  28965. ssl->buffers.dtlsCtx.peer.sz);
  28966. if (ret != 0) goto out;
  28967. ret = wc_HmacUpdate(&cookieHmac, input + i, OPAQUE16_LEN);
  28968. if (ret != 0) goto out;
  28969. }
  28970. #endif /* WOLFSSL_DTLS */
  28971. i += OPAQUE16_LEN;
  28972. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  28973. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  28974. pv.minor = TLSv1_2_MINOR;
  28975. lesserVersion = !ssl->options.dtls && ssl->version.minor > pv.minor;
  28976. lesserVersion |= ssl->options.dtls && ssl->version.minor < pv.minor;
  28977. if (lesserVersion) {
  28978. byte belowMinDowngrade;
  28979. word16 haveRSA = 0;
  28980. word16 havePSK = 0;
  28981. int keySz = 0;
  28982. if (!ssl->options.downgrade) {
  28983. WOLFSSL_MSG("Client trying to connect with lesser version");
  28984. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA)
  28985. SendAlert(ssl, alert_fatal, handshake_failure);
  28986. #endif
  28987. ret = VERSION_ERROR;
  28988. goto out;
  28989. }
  28990. belowMinDowngrade = pv.minor < ssl->options.minDowngrade;
  28991. /* DTLS versions increase backwards (-1,-2,-3) ecc */
  28992. if (ssl->options.dtls)
  28993. belowMinDowngrade = ssl->options.dtls
  28994. && pv.minor > ssl->options.minDowngrade;
  28995. if (belowMinDowngrade) {
  28996. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  28997. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA)
  28998. SendAlert(ssl, alert_fatal, handshake_failure);
  28999. #endif
  29000. ret = VERSION_ERROR;
  29001. goto out;
  29002. }
  29003. if (!ssl->options.dtls) {
  29004. if (pv.minor == SSLv3_MINOR) {
  29005. /* turn off tls */
  29006. WOLFSSL_MSG("\tdowngrading to SSLv3");
  29007. ssl->options.tls = 0;
  29008. ssl->options.tls1_1 = 0;
  29009. ssl->version.minor = SSLv3_MINOR;
  29010. }
  29011. else if (pv.minor == TLSv1_MINOR) {
  29012. /* turn off tls 1.1+ */
  29013. WOLFSSL_MSG("\tdowngrading to TLSv1");
  29014. ssl->options.tls1_1 = 0;
  29015. ssl->version.minor = TLSv1_MINOR;
  29016. }
  29017. else if (pv.minor == TLSv1_1_MINOR) {
  29018. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  29019. ssl->version.minor = TLSv1_1_MINOR;
  29020. }
  29021. else if (pv.minor == TLSv1_2_MINOR) {
  29022. WOLFSSL_MSG(" downgrading to TLSv1.2");
  29023. ssl->version.minor = TLSv1_2_MINOR;
  29024. }
  29025. }
  29026. else {
  29027. if (pv.minor == DTLSv1_2_MINOR) {
  29028. WOLFSSL_MSG("\tDowngrading to DTLSv1.2");
  29029. ssl->options.tls1_3 = 0;
  29030. ssl->version.minor = DTLSv1_2_MINOR;
  29031. /* reset hashes, DTLSv1.2 will take care of the hashing
  29032. later */
  29033. ret = InitHandshakeHashes(ssl);
  29034. if (ret != 0)
  29035. return ret;
  29036. }
  29037. else if (pv.minor == DTLS_MINOR) {
  29038. WOLFSSL_MSG("\tDowngrading to DTLSv1.2");
  29039. ssl->options.tls1_3 = 0;
  29040. ssl->version.minor = DTLS_MINOR;
  29041. }
  29042. }
  29043. #ifndef NO_RSA
  29044. haveRSA = 1;
  29045. #endif
  29046. #ifndef NO_PSK
  29047. havePSK = ssl->options.havePSK;
  29048. #endif
  29049. #ifndef NO_CERTS
  29050. keySz = ssl->buffers.keySz;
  29051. #endif
  29052. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  29053. ssl->options.haveDH, ssl->options.haveECDSAsig,
  29054. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  29055. ssl->options.haveFalconSig,
  29056. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  29057. TRUE, ssl->options.side);
  29058. }
  29059. /* check if option is set to not allow the current version
  29060. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  29061. if (!ssl->options.dtls && ssl->options.downgrade &&
  29062. ssl->options.mask > 0) {
  29063. int reset = 0;
  29064. if (ssl->version.minor == TLSv1_2_MINOR &&
  29065. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
  29066. WOLFSSL_OP_NO_TLSv1_2) {
  29067. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  29068. ssl->version.minor = TLSv1_1_MINOR;
  29069. reset = 1;
  29070. }
  29071. if (ssl->version.minor == TLSv1_1_MINOR &&
  29072. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
  29073. WOLFSSL_OP_NO_TLSv1_1) {
  29074. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  29075. ssl->options.tls1_1 = 0;
  29076. ssl->version.minor = TLSv1_MINOR;
  29077. reset = 1;
  29078. }
  29079. if (ssl->version.minor == TLSv1_MINOR &&
  29080. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
  29081. WOLFSSL_OP_NO_TLSv1) {
  29082. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  29083. ssl->options.tls = 0;
  29084. ssl->options.tls1_1 = 0;
  29085. ssl->version.minor = SSLv3_MINOR;
  29086. reset = 1;
  29087. }
  29088. if (ssl->version.minor == SSLv3_MINOR &&
  29089. (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
  29090. WOLFSSL_OP_NO_SSLv3) {
  29091. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  29092. ret = VERSION_ERROR;
  29093. goto out;
  29094. }
  29095. if (ssl->version.minor < ssl->options.minDowngrade) {
  29096. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  29097. ret = VERSION_ERROR;
  29098. goto out;
  29099. }
  29100. if (reset) {
  29101. word16 haveRSA = 0;
  29102. word16 havePSK = 0;
  29103. int keySz = 0;
  29104. #ifndef NO_RSA
  29105. haveRSA = 1;
  29106. #endif
  29107. #ifndef NO_PSK
  29108. havePSK = ssl->options.havePSK;
  29109. #endif
  29110. #ifndef NO_CERTS
  29111. keySz = ssl->buffers.keySz;
  29112. #endif
  29113. /* reset cipher suites to account for TLS version change */
  29114. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  29115. ssl->options.haveDH, ssl->options.haveECDSAsig,
  29116. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  29117. ssl->options.haveFalconSig,
  29118. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  29119. TRUE, ssl->options.side);
  29120. }
  29121. }
  29122. /* random */
  29123. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  29124. #ifdef WOLFSSL_DTLS
  29125. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  29126. ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN);
  29127. if (ret != 0) goto out;
  29128. }
  29129. #endif /* WOLFSSL_DTLS */
  29130. i += RAN_LEN;
  29131. #ifdef SHOW_SECRETS
  29132. {
  29133. int j;
  29134. printf("client random: ");
  29135. for (j = 0; j < RAN_LEN; j++)
  29136. printf("%02x", ssl->arrays->clientRandom[j]);
  29137. printf("\n");
  29138. }
  29139. #endif
  29140. /* session id */
  29141. b = input[i++];
  29142. #ifdef HAVE_SESSION_TICKET
  29143. if (b > 0 && b < ID_LEN) {
  29144. bogusID = 1;
  29145. WOLFSSL_MSG("Client sent bogus session id, let's allow for echo");
  29146. }
  29147. #endif
  29148. if (b == ID_LEN || bogusID) {
  29149. if ((i - begin) + b > helloSz) {
  29150. ret = BUFFER_ERROR;
  29151. goto out;
  29152. }
  29153. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  29154. #ifdef WOLFSSL_DTLS
  29155. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) &&
  29156. !IsSCR(ssl)) {
  29157. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  29158. if (ret != 0) goto out;
  29159. }
  29160. #endif /* WOLFSSL_DTLS */
  29161. ssl->arrays->sessionIDSz = b;
  29162. i += b;
  29163. ssl->options.resuming = 1; /* client wants to resume */
  29164. WOLFSSL_MSG("Client wants to resume session");
  29165. }
  29166. else if (b) {
  29167. WOLFSSL_MSG("Invalid session ID size");
  29168. ret = BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
  29169. goto out;
  29170. }
  29171. #ifdef WOLFSSL_DTLS
  29172. /* cookie */
  29173. if (ssl->options.dtls) {
  29174. if ((i - begin) + OPAQUE8_LEN > helloSz) {
  29175. ret = BUFFER_ERROR;
  29176. goto out;
  29177. }
  29178. peerCookieSz = input[i++];
  29179. if (peerCookieSz) {
  29180. if (peerCookieSz > MAX_COOKIE_LEN) {
  29181. ret = BUFFER_ERROR;
  29182. goto out;
  29183. }
  29184. if ((i - begin) + peerCookieSz > helloSz) {
  29185. ret = BUFFER_ERROR;
  29186. goto out;
  29187. }
  29188. XMEMCPY(peerCookie, input + i, peerCookieSz);
  29189. i += peerCookieSz;
  29190. }
  29191. }
  29192. #endif
  29193. /* suites */
  29194. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  29195. ret = BUFFER_ERROR;
  29196. goto out;
  29197. }
  29198. #ifdef WOLFSSL_SMALL_STACK
  29199. clSuites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  29200. DYNAMIC_TYPE_SUITES);
  29201. if (clSuites == NULL) {
  29202. ret = MEMORY_E;
  29203. goto out;
  29204. }
  29205. #endif
  29206. XMEMSET(clSuites, 0, sizeof(Suites));
  29207. ato16(&input[i], &clSuites->suiteSz);
  29208. i += OPAQUE16_LEN;
  29209. /* Cipher suite lists are always multiples of two in length. */
  29210. if (clSuites->suiteSz % 2 != 0) {
  29211. ret = BUFFER_ERROR;
  29212. goto out;
  29213. }
  29214. /* suites and compression length check */
  29215. if ((i - begin) + clSuites->suiteSz + OPAQUE8_LEN > helloSz) {
  29216. ret = BUFFER_ERROR;
  29217. goto out;
  29218. }
  29219. if (clSuites->suiteSz > WOLFSSL_MAX_SUITE_SZ) {
  29220. ret = BUFFER_ERROR;
  29221. goto out;
  29222. }
  29223. XMEMCPY(clSuites->suites, input + i, clSuites->suiteSz);
  29224. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  29225. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  29226. if (FindSuite(clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  29227. TLSX* extension;
  29228. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  29229. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  29230. if (ret != WOLFSSL_SUCCESS)
  29231. goto out;
  29232. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  29233. if (extension) {
  29234. ssl->secure_renegotiation =
  29235. (SecureRenegotiation*)extension->data;
  29236. ssl->secure_renegotiation->enabled = 1;
  29237. }
  29238. }
  29239. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  29240. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  29241. /* check for TLS_FALLBACK_SCSV suite */
  29242. if (FindSuite(clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  29243. WOLFSSL_MSG("Found Fallback SCSV");
  29244. if (ssl->ctx->method->version.minor > pv.minor) {
  29245. WOLFSSL_MSG("Client trying to connect with lesser version");
  29246. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  29247. ret = VERSION_ERROR;
  29248. goto out;
  29249. }
  29250. }
  29251. #endif
  29252. #ifdef WOLFSSL_DTLS
  29253. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  29254. ret = wc_HmacUpdate(&cookieHmac,
  29255. input + i - OPAQUE16_LEN,
  29256. clSuites->suiteSz + OPAQUE16_LEN);
  29257. if (ret != 0) goto out;
  29258. }
  29259. #endif /* WOLFSSL_DTLS */
  29260. i += clSuites->suiteSz;
  29261. clSuites->hashSigAlgoSz = 0;
  29262. /* compression length */
  29263. b = input[i++];
  29264. if ((i - begin) + b > helloSz) {
  29265. ret = BUFFER_ERROR;
  29266. goto out;
  29267. }
  29268. if (b == 0) {
  29269. WOLFSSL_MSG("No compression types in list");
  29270. #ifdef WOLFSSL_EXTRA_ALERTS
  29271. SendAlert(ssl, alert_fatal, decode_error);
  29272. #endif
  29273. ret = COMPRESSION_ERROR;
  29274. goto out;
  29275. }
  29276. #ifdef WOLFSSL_DTLS
  29277. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  29278. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  29279. if (ret != 0) goto out;
  29280. ret = wc_HmacFinal(&cookieHmac, newCookie);
  29281. if (ret != 0) goto out;
  29282. /* If a cookie callback is set, call it to overwrite the cookie.
  29283. * This should be deprecated. The code now calculates the cookie
  29284. * using an HMAC as expected. */
  29285. if (ssl->ctx->CBIOCookie != NULL &&
  29286. ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz,
  29287. ssl->IOCB_CookieCtx) != cookieSz) {
  29288. ret = COOKIE_ERROR;
  29289. goto out;
  29290. }
  29291. #ifndef WOLFSSL_DTLS_NO_HVR_ON_RESUME
  29292. if (peerCookieSz != cookieSz ||
  29293. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  29294. *inOutIdx += helloSz;
  29295. ret = SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  29296. goto out;
  29297. }
  29298. #endif /* !WOLFSSL_DTLS_NO_HVR_ON_RESUME */
  29299. }
  29300. #endif /* WOLFSSL_DTLS */
  29301. {
  29302. /* compression match types */
  29303. int matchNo = 0;
  29304. int matchZlib = 0;
  29305. while (b--) {
  29306. byte comp = input[i++];
  29307. if (comp == NO_COMPRESSION) {
  29308. matchNo = 1;
  29309. }
  29310. if (comp == ZLIB_COMPRESSION) {
  29311. matchZlib = 1;
  29312. }
  29313. }
  29314. if (ssl->options.usingCompression == 0 && matchNo) {
  29315. WOLFSSL_MSG("Matched No Compression");
  29316. } else if (ssl->options.usingCompression && matchZlib) {
  29317. WOLFSSL_MSG("Matched zlib Compression");
  29318. } else if (ssl->options.usingCompression && matchNo) {
  29319. WOLFSSL_MSG("Could only match no compression, turning off");
  29320. ssl->options.usingCompression = 0; /* turn off */
  29321. } else {
  29322. WOLFSSL_MSG("Could not match compression");
  29323. #ifdef WOLFSSL_EXTRA_ALERTS
  29324. SendAlert(ssl, alert_fatal, illegal_parameter);
  29325. #endif
  29326. ret = COMPRESSION_ERROR;
  29327. goto out;
  29328. }
  29329. }
  29330. *inOutIdx = i;
  29331. /* tls extensions */
  29332. if ((i - begin) < helloSz) {
  29333. #ifdef HAVE_TLS_EXTENSIONS
  29334. if (TLSX_SupportExtensions(ssl))
  29335. #else
  29336. if (IsAtLeastTLSv1_2(ssl))
  29337. #endif
  29338. {
  29339. /* Process the hello extension. Skip unsupported. */
  29340. word16 totalExtSz;
  29341. #ifdef HAVE_TLS_EXTENSIONS
  29342. /* auto populate extensions supported unless user defined */
  29343. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  29344. goto out;
  29345. #endif
  29346. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  29347. ret = BUFFER_ERROR;
  29348. goto out;
  29349. }
  29350. ato16(&input[i], &totalExtSz);
  29351. i += OPAQUE16_LEN;
  29352. if ((i - begin) + totalExtSz > helloSz) {
  29353. ret = BUFFER_ERROR;
  29354. goto out;
  29355. }
  29356. #ifdef HAVE_TLS_EXTENSIONS
  29357. /* tls extensions */
  29358. if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, client_hello,
  29359. clSuites)))
  29360. goto out;
  29361. #ifdef WOLFSSL_TLS13
  29362. if (TLSX_Find(ssl->extensions,
  29363. TLSX_SUPPORTED_VERSIONS) != NULL) {
  29364. WOLFSSL_MSG(
  29365. "Client attempting to connect with higher version");
  29366. ret = VERSION_ERROR;
  29367. goto out;
  29368. }
  29369. #endif
  29370. #ifdef HAVE_SNI
  29371. if((ret=SNI_Callback(ssl)))
  29372. goto out;
  29373. #endif
  29374. #ifdef HAVE_ALPN
  29375. if((ret=ALPN_Select(ssl)))
  29376. goto out;
  29377. #endif
  29378. i += totalExtSz;
  29379. #else
  29380. while (totalExtSz) {
  29381. word16 extId, extSz;
  29382. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
  29383. ret = BUFFER_ERROR;
  29384. goto out;
  29385. }
  29386. ato16(&input[i], &extId);
  29387. i += OPAQUE16_LEN;
  29388. ato16(&input[i], &extSz);
  29389. i += OPAQUE16_LEN;
  29390. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
  29391. ret = BUFFER_ERROR;
  29392. goto out;
  29393. }
  29394. if (extId == HELLO_EXT_SIG_ALGO) {
  29395. word16 hashSigAlgoSz;
  29396. ato16(&input[i], &hashSigAlgoSz);
  29397. i += OPAQUE16_LEN;
  29398. if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
  29399. ret = BUFFER_ERROR;
  29400. goto out;
  29401. }
  29402. if (hashSigAlgoSz % 2 != 0) {
  29403. ret = BUFFER_ERROR;
  29404. goto out;
  29405. }
  29406. clSuites->hashSigAlgoSz = hashSigAlgoSz;
  29407. if (clSuites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  29408. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  29409. "truncating");
  29410. clSuites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  29411. }
  29412. XMEMCPY(clSuites->hashSigAlgo, &input[i],
  29413. clSuites->hashSigAlgoSz);
  29414. i += hashSigAlgoSz;
  29415. }
  29416. #ifdef HAVE_EXTENDED_MASTER
  29417. else if (extId == HELLO_EXT_EXTMS)
  29418. ssl->options.haveEMS = 1;
  29419. #endif
  29420. else
  29421. i += extSz;
  29422. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  29423. }
  29424. #endif
  29425. *inOutIdx = i;
  29426. }
  29427. else
  29428. *inOutIdx = begin + helloSz; /* skip extensions */
  29429. }
  29430. #ifdef WOLFSSL_DTLS_CID
  29431. if (ssl->options.useDtlsCID)
  29432. DtlsCIDOnExtensionsParsed(ssl);
  29433. #endif /* WOLFSSL_DTLS_CID */
  29434. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  29435. ssl->options.haveSessionId = 1;
  29436. /* ProcessOld uses same resume code */
  29437. if (ssl->options.resuming) {
  29438. ret = HandleTlsResumption(ssl, bogusID, clSuites);
  29439. if (ret != 0)
  29440. goto out;
  29441. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  29442. !defined(WOLFSSL_AEAD_ONLY)
  29443. if (ssl->options.encThenMac && ssl->specs.cipher_type == block) {
  29444. ret = TLSX_EncryptThenMac_Respond(ssl);
  29445. if (ret != 0)
  29446. goto out;
  29447. }
  29448. else
  29449. ssl->options.encThenMac = 0;
  29450. #endif
  29451. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  29452. WOLFSSL_LEAVE("DoClientHello", ret);
  29453. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  29454. goto out;
  29455. }
  29456. }
  29457. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_NO_HVR_ON_RESUME)
  29458. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  29459. if (!ssl->options.resuming) {
  29460. /* resume failed, check the cookie */
  29461. if (peerCookieSz != cookieSz ||
  29462. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  29463. *inOutIdx = begin + helloSz;
  29464. ret = SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  29465. goto out;
  29466. }
  29467. }
  29468. }
  29469. #endif /* WOLFSSL_DTLS && WOLFSSL_DTLS_NO_HVR_ON_RESUME */
  29470. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
  29471. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  29472. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  29473. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  29474. * present and no matches in the server's list. */
  29475. ret = TLSX_SupportedFFDHE_Set(ssl);
  29476. if (ret != 0)
  29477. goto out;
  29478. }
  29479. #endif
  29480. #endif
  29481. #ifdef OPENSSL_EXTRA
  29482. /* Give user last chance to provide a cert for cipher selection */
  29483. if (ret == 0 && ssl->ctx->certSetupCb != NULL)
  29484. ret = CertSetupCbWrapper(ssl);
  29485. #endif
  29486. if (ret == 0)
  29487. ret = MatchSuite(ssl, clSuites);
  29488. #ifdef WOLFSSL_EXTRA_ALERTS
  29489. if (ret == BUFFER_ERROR)
  29490. SendAlert(ssl, alert_fatal, decode_error);
  29491. else if (ret < 0)
  29492. SendAlert(ssl, alert_fatal, handshake_failure);
  29493. #endif
  29494. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  29495. !defined(WOLFSSL_AEAD_ONLY)
  29496. if (ret == 0 && ssl->options.encThenMac &&
  29497. ssl->specs.cipher_type == block) {
  29498. ret = TLSX_EncryptThenMac_Respond(ssl);
  29499. }
  29500. else
  29501. ssl->options.encThenMac = 0;
  29502. #endif
  29503. #ifdef WOLFSSL_DTLS
  29504. if (ret == 0 && ssl->options.dtls)
  29505. DtlsMsgPoolReset(ssl);
  29506. #endif
  29507. out:
  29508. #ifdef WOLFSSL_DTLS
  29509. wc_HmacFree(&cookieHmac);
  29510. #endif
  29511. #ifdef WOLFSSL_SMALL_STACK
  29512. if (clSuites != NULL)
  29513. XFREE(clSuites, ssl->heap, DYNAMIC_TYPE_SUITES);
  29514. #endif
  29515. WOLFSSL_LEAVE("DoClientHello", ret);
  29516. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  29517. if (ret != 0) {
  29518. WOLFSSL_ERROR_VERBOSE(ret);
  29519. }
  29520. return ret;
  29521. }
  29522. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  29523. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  29524. typedef struct DcvArgs {
  29525. byte* output; /* not allocated */
  29526. word32 sendSz;
  29527. word16 sz;
  29528. word32 sigSz;
  29529. word32 idx;
  29530. word32 begin;
  29531. byte hashAlgo;
  29532. byte sigAlgo;
  29533. } DcvArgs;
  29534. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  29535. {
  29536. DcvArgs* args = (DcvArgs*)pArgs;
  29537. (void)ssl;
  29538. (void)args;
  29539. }
  29540. /* handle processing of certificate_verify (15) */
  29541. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  29542. word32* inOutIdx, word32 size)
  29543. {
  29544. int ret = 0;
  29545. #ifdef WOLFSSL_ASYNC_CRYPT
  29546. DcvArgs* args = NULL;
  29547. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  29548. #else
  29549. DcvArgs args[1];
  29550. #endif
  29551. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  29552. WOLFSSL_ENTER("DoCertificateVerify");
  29553. #ifdef WOLFSSL_ASYNC_CRYPT
  29554. if (ssl->async == NULL) {
  29555. ssl->async = (struct WOLFSSL_ASYNC*)
  29556. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  29557. DYNAMIC_TYPE_ASYNC);
  29558. if (ssl->async == NULL)
  29559. ERROR_OUT(MEMORY_E, exit_dcv);
  29560. }
  29561. args = (DcvArgs*)ssl->async->args;
  29562. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  29563. if (ret != WC_NOT_PENDING_E) {
  29564. /* Check for error */
  29565. if (ret < 0)
  29566. goto exit_dcv;
  29567. }
  29568. else
  29569. #endif
  29570. {
  29571. /* Reset state */
  29572. ret = 0;
  29573. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  29574. XMEMSET(args, 0, sizeof(DcvArgs));
  29575. args->hashAlgo = sha_mac;
  29576. args->sigAlgo = anonymous_sa_algo;
  29577. args->idx = *inOutIdx;
  29578. args->begin = *inOutIdx;
  29579. #ifdef WOLFSSL_ASYNC_CRYPT
  29580. ssl->async->freeArgs = FreeDcvArgs;
  29581. #endif
  29582. }
  29583. switch(ssl->options.asyncState)
  29584. {
  29585. case TLS_ASYNC_BEGIN:
  29586. {
  29587. #ifdef WOLFSSL_CALLBACKS
  29588. if (ssl->hsInfoOn)
  29589. AddPacketName(ssl, "CertificateVerify");
  29590. if (ssl->toInfoOn)
  29591. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  29592. #endif
  29593. /* Advance state and proceed */
  29594. ssl->options.asyncState = TLS_ASYNC_BUILD;
  29595. } /* case TLS_ASYNC_BEGIN */
  29596. FALL_THROUGH;
  29597. case TLS_ASYNC_BUILD:
  29598. {
  29599. if (IsAtLeastTLSv1_2(ssl)) {
  29600. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  29601. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  29602. }
  29603. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  29604. &args->sigAlgo);
  29605. args->idx += 2;
  29606. }
  29607. #ifndef NO_RSA
  29608. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  29609. args->sigAlgo = rsa_sa_algo;
  29610. #endif
  29611. #ifdef HAVE_ECC
  29612. else if (ssl->peerEccDsaKeyPresent)
  29613. args->sigAlgo = ecc_dsa_sa_algo;
  29614. #endif
  29615. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  29616. else if (ssl->peerEd25519KeyPresent)
  29617. args->sigAlgo = ed25519_sa_algo;
  29618. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  29619. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  29620. else if (ssl->peerEd448KeyPresent)
  29621. args->sigAlgo = ed448_sa_algo;
  29622. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  29623. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  29624. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  29625. }
  29626. ato16(input + args->idx, &args->sz);
  29627. args->idx += OPAQUE16_LEN;
  29628. if ((args->idx - args->begin) + args->sz > size ||
  29629. args->sz > ENCRYPT_LEN) {
  29630. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  29631. }
  29632. #ifdef HAVE_ECC
  29633. if (ssl->peerEccDsaKeyPresent) {
  29634. WOLFSSL_MSG("Doing ECC peer cert verify");
  29635. /* make sure a default is defined */
  29636. #if !defined(NO_SHA)
  29637. SetDigest(ssl, sha_mac);
  29638. #elif !defined(NO_SHA256)
  29639. SetDigest(ssl, sha256_mac);
  29640. #elif defined(WOLFSSL_SHA384)
  29641. SetDigest(ssl, sha384_mac);
  29642. #elif defined(WOLFSSL_SHA512)
  29643. SetDigest(ssl, sha512_mac);
  29644. #else
  29645. #error No digest enabled for ECC sig verify
  29646. #endif
  29647. if (IsAtLeastTLSv1_2(ssl)) {
  29648. if (args->sigAlgo != ecc_dsa_sa_algo) {
  29649. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  29650. }
  29651. SetDigest(ssl, args->hashAlgo);
  29652. }
  29653. }
  29654. #endif /* HAVE_ECC */
  29655. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  29656. if (ssl->peerEd25519KeyPresent) {
  29657. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  29658. if (IsAtLeastTLSv1_2(ssl) &&
  29659. args->sigAlgo != ed25519_sa_algo) {
  29660. WOLFSSL_MSG(
  29661. "Oops, peer sent ED25519 key but not in verify");
  29662. }
  29663. }
  29664. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  29665. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  29666. if (ssl->peerEd448KeyPresent) {
  29667. WOLFSSL_MSG("Doing ED448 peer cert verify");
  29668. if (IsAtLeastTLSv1_2(ssl) &&
  29669. args->sigAlgo != ed448_sa_algo) {
  29670. WOLFSSL_MSG(
  29671. "Oops, peer sent ED448 key but not in verify");
  29672. }
  29673. }
  29674. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  29675. /* Advance state and proceed */
  29676. ssl->options.asyncState = TLS_ASYNC_DO;
  29677. } /* case TLS_ASYNC_BUILD */
  29678. FALL_THROUGH;
  29679. case TLS_ASYNC_DO:
  29680. {
  29681. #ifndef NO_RSA
  29682. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  29683. WOLFSSL_MSG("Doing RSA peer cert verify");
  29684. ret = RsaVerify(ssl,
  29685. input + args->idx,
  29686. args->sz,
  29687. &args->output,
  29688. args->sigAlgo, args->hashAlgo,
  29689. ssl->peerRsaKey,
  29690. #ifdef HAVE_PK_CALLBACKS
  29691. &ssl->buffers.peerRsaKey
  29692. #else
  29693. NULL
  29694. #endif
  29695. );
  29696. if (ret >= 0) {
  29697. if (args->sigAlgo == rsa_sa_algo)
  29698. args->sendSz = ret;
  29699. else {
  29700. args->sigSz = ret;
  29701. args->sendSz = ssl->buffers.digest.length;
  29702. }
  29703. ret = 0;
  29704. }
  29705. }
  29706. #endif /* !NO_RSA */
  29707. #ifdef HAVE_ECC
  29708. if (ssl->peerEccDsaKeyPresent) {
  29709. WOLFSSL_MSG("Doing ECC peer cert verify");
  29710. ret = EccVerify(ssl,
  29711. input + args->idx, args->sz,
  29712. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  29713. ssl->peerEccDsaKey,
  29714. #ifdef HAVE_PK_CALLBACKS
  29715. &ssl->buffers.peerEccDsaKey
  29716. #else
  29717. NULL
  29718. #endif
  29719. );
  29720. /* SERVER: Data verified with certificate's public key. */
  29721. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  29722. (ret == 0);
  29723. }
  29724. #endif /* HAVE_ECC */
  29725. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  29726. if (ssl->peerEd25519KeyPresent) {
  29727. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  29728. ret = Ed25519Verify(ssl,
  29729. input + args->idx, args->sz,
  29730. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  29731. ssl->peerEd25519Key,
  29732. #ifdef HAVE_PK_CALLBACKS
  29733. &ssl->buffers.peerEd25519Key
  29734. #else
  29735. NULL
  29736. #endif
  29737. );
  29738. /* SERVER: Data verified with certificate's public key. */
  29739. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  29740. (ret == 0);
  29741. }
  29742. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  29743. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  29744. if (ssl->peerEd448KeyPresent) {
  29745. WOLFSSL_MSG("Doing Ed448 peer cert verify");
  29746. ret = Ed448Verify(ssl,
  29747. input + args->idx, args->sz,
  29748. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  29749. ssl->peerEd448Key,
  29750. #ifdef HAVE_PK_CALLBACKS
  29751. &ssl->buffers.peerEd448Key
  29752. #else
  29753. NULL
  29754. #endif
  29755. );
  29756. /* SERVER: Data verified with certificate's public key. */
  29757. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  29758. (ret == 0);
  29759. }
  29760. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  29761. #ifdef WOLFSSL_ASYNC_CRYPT
  29762. /* handle async pending */
  29763. if (ret == WC_PENDING_E)
  29764. goto exit_dcv;
  29765. #endif
  29766. /* Check for error */
  29767. if (ret != 0) {
  29768. ret = SIG_VERIFY_E;
  29769. goto exit_dcv;
  29770. }
  29771. /* Advance state and proceed */
  29772. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  29773. } /* case TLS_ASYNC_DO */
  29774. FALL_THROUGH;
  29775. case TLS_ASYNC_VERIFY:
  29776. {
  29777. #ifndef NO_RSA
  29778. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  29779. if (IsAtLeastTLSv1_2(ssl)) {
  29780. #ifdef WC_RSA_PSS
  29781. if (args->sigAlgo == rsa_pss_sa_algo) {
  29782. SetDigest(ssl, args->hashAlgo);
  29783. #ifdef HAVE_SELFTEST
  29784. ret = wc_RsaPSS_CheckPadding(
  29785. ssl->buffers.digest.buffer,
  29786. ssl->buffers.digest.length,
  29787. args->output, args->sigSz,
  29788. HashAlgoToType(args->hashAlgo));
  29789. #else
  29790. ret = wc_RsaPSS_CheckPadding_ex(
  29791. ssl->buffers.digest.buffer,
  29792. ssl->buffers.digest.length,
  29793. args->output, args->sigSz,
  29794. HashAlgoToType(args->hashAlgo), -1,
  29795. mp_count_bits(&ssl->peerRsaKey->n));
  29796. #endif
  29797. if (ret != 0) {
  29798. ret = SIG_VERIFY_E;
  29799. goto exit_dcv;
  29800. }
  29801. }
  29802. else
  29803. #endif
  29804. {
  29805. #ifndef WOLFSSL_SMALL_STACK
  29806. byte encodedSig[MAX_ENCODED_SIG_SZ];
  29807. #else
  29808. byte* encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  29809. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  29810. if (encodedSig == NULL) {
  29811. ERROR_OUT(MEMORY_E, exit_dcv);
  29812. }
  29813. #endif
  29814. if (args->sigAlgo != rsa_sa_algo) {
  29815. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  29816. "in verify");
  29817. }
  29818. SetDigest(ssl, args->hashAlgo);
  29819. args->sigSz = wc_EncodeSignature(encodedSig,
  29820. ssl->buffers.digest.buffer,
  29821. ssl->buffers.digest.length,
  29822. TypeHash(args->hashAlgo));
  29823. if (args->sendSz != args->sigSz || !args->output ||
  29824. XMEMCMP(args->output, encodedSig,
  29825. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  29826. ret = VERIFY_CERT_ERROR;
  29827. }
  29828. #ifdef WOLFSSL_SMALL_STACK
  29829. XFREE(encodedSig, ssl->heap,
  29830. DYNAMIC_TYPE_SIGNATURE);
  29831. #endif
  29832. }
  29833. }
  29834. else {
  29835. if (args->sendSz != FINISHED_SZ || !args->output ||
  29836. XMEMCMP(args->output,
  29837. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  29838. ret = VERIFY_CERT_ERROR;
  29839. }
  29840. }
  29841. if (ret == 0) {
  29842. /* SERVER: Data verified with cert's public key. */
  29843. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  29844. (ret == 0);
  29845. }
  29846. }
  29847. #endif /* !NO_RSA */
  29848. if (ret != 0)
  29849. break;
  29850. /* Advance state and proceed */
  29851. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  29852. } /* case TLS_ASYNC_VERIFY */
  29853. FALL_THROUGH;
  29854. case TLS_ASYNC_FINALIZE:
  29855. {
  29856. if (IsEncryptionOn(ssl, 0)) {
  29857. args->idx += ssl->keys.padSz;
  29858. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  29859. if (ssl->options.startedETMRead)
  29860. args->idx += MacSize(ssl);
  29861. #endif
  29862. }
  29863. ssl->options.havePeerVerify = 1;
  29864. /* Set final index */
  29865. args->idx += args->sz;
  29866. *inOutIdx = args->idx;
  29867. /* Advance state and proceed */
  29868. ssl->options.asyncState = TLS_ASYNC_END;
  29869. } /* case TLS_ASYNC_FINALIZE */
  29870. FALL_THROUGH;
  29871. case TLS_ASYNC_END:
  29872. {
  29873. break;
  29874. }
  29875. default:
  29876. ret = INPUT_CASE_ERROR;
  29877. } /* switch(ssl->options.asyncState) */
  29878. exit_dcv:
  29879. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  29880. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  29881. #ifdef WOLFSSL_ASYNC_CRYPT
  29882. /* Handle async operation */
  29883. if (ret == WC_PENDING_E) {
  29884. /* Mark message as not received so it can process again */
  29885. ssl->msgsReceived.got_certificate_verify = 0;
  29886. return ret;
  29887. }
  29888. #endif /* WOLFSSL_ASYNC_CRYPT */
  29889. #ifdef WOLFSSL_EXTRA_ALERTS
  29890. if (ret == BUFFER_ERROR)
  29891. SendAlert(ssl, alert_fatal, decode_error);
  29892. else if (ret == SIG_VERIFY_E)
  29893. SendAlert(ssl, alert_fatal, decrypt_error);
  29894. else if (ret != 0)
  29895. SendAlert(ssl, alert_fatal, bad_certificate);
  29896. #endif
  29897. /* Digest is not allocated, so do this to prevent free */
  29898. ssl->buffers.digest.buffer = NULL;
  29899. ssl->buffers.digest.length = 0;
  29900. #ifdef WOLFSSL_ASYNC_CRYPT
  29901. /* Cleanup async */
  29902. FreeAsyncCtx(ssl, 0);
  29903. #else
  29904. FreeDcvArgs(ssl, args);
  29905. #endif
  29906. /* Final cleanup */
  29907. FreeKeyExchange(ssl);
  29908. if (ret != 0) {
  29909. WOLFSSL_ERROR_VERBOSE(ret);
  29910. }
  29911. return ret;
  29912. }
  29913. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  29914. /* handle generation of server_hello_done (14) */
  29915. int SendServerHelloDone(WOLFSSL* ssl)
  29916. {
  29917. byte* output;
  29918. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  29919. int ret;
  29920. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  29921. WOLFSSL_ENTER("SendServerHelloDone");
  29922. #ifdef WOLFSSL_DTLS
  29923. if (ssl->options.dtls)
  29924. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29925. #endif
  29926. if (IsEncryptionOn(ssl, 1))
  29927. sendSz += MAX_MSG_EXTRA;
  29928. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  29929. * is not advanced yet */
  29930. ssl->options.buildingMsg = 1;
  29931. /* check for available size */
  29932. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  29933. return ret;
  29934. /* get output buffer */
  29935. output = ssl->buffers.outputBuffer.buffer +
  29936. ssl->buffers.outputBuffer.length;
  29937. AddHeaders(output, 0, server_hello_done, ssl);
  29938. if (IsEncryptionOn(ssl, 1)) {
  29939. byte* input;
  29940. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  29941. int recordHeaderSz = RECORD_HEADER_SZ;
  29942. if (ssl->options.dtls) {
  29943. recordHeaderSz += DTLS_RECORD_EXTRA;
  29944. inputSz += DTLS_HANDSHAKE_EXTRA;
  29945. }
  29946. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29947. if (input == NULL)
  29948. return MEMORY_E;
  29949. XMEMCPY(input, output + recordHeaderSz, inputSz);
  29950. #ifdef WOLFSSL_DTLS
  29951. if (IsDtlsNotSctpMode(ssl) &&
  29952. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
  29953. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29954. return ret;
  29955. }
  29956. #endif
  29957. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  29958. handshake, 1, 0, 0, CUR_ORDER);
  29959. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29960. if (sendSz < 0)
  29961. return sendSz;
  29962. } else {
  29963. #ifdef WOLFSSL_DTLS
  29964. if (IsDtlsNotSctpMode(ssl)) {
  29965. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
  29966. return ret;
  29967. }
  29968. if (ssl->options.dtls)
  29969. DtlsSEQIncrement(ssl, CUR_ORDER);
  29970. #endif
  29971. ret = HashOutput(ssl, output, sendSz, 0);
  29972. if (ret != 0)
  29973. return ret;
  29974. }
  29975. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  29976. if (ssl->hsInfoOn)
  29977. AddPacketName(ssl, "ServerHelloDone");
  29978. if (ssl->toInfoOn) {
  29979. ret = AddPacketInfo(ssl, "ServerHelloDone", handshake, output,
  29980. sendSz, WRITE_PROTO, 0, ssl->heap);
  29981. if (ret != 0)
  29982. return ret;
  29983. }
  29984. #endif
  29985. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  29986. ssl->options.buildingMsg = 0;
  29987. ssl->buffers.outputBuffer.length += sendSz;
  29988. ret = SendBuffered(ssl);
  29989. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  29990. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  29991. return ret;
  29992. }
  29993. #endif /* !WOLFSSL_NO_TLS12 */
  29994. #ifdef HAVE_SESSION_TICKET
  29995. /* create a new session ticket, 0 on success */
  29996. int CreateTicket(WOLFSSL* ssl)
  29997. {
  29998. InternalTicket* it;
  29999. ExternalTicket* et;
  30000. int encLen;
  30001. int ret;
  30002. int error;
  30003. word32 itHash = 0;
  30004. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  30005. WOLFSSL_ASSERT_SIZEOF_GE(ssl->session->staticTicket, *et);
  30006. WOLFSSL_ASSERT_SIZEOF_GE(et->enc_ticket, *it);
  30007. if (ssl->session->ticket != ssl->session->staticTicket) {
  30008. /* Always use the static ticket buffer */
  30009. XFREE(ssl->session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  30010. ssl->session->ticket = ssl->session->staticTicket;
  30011. ssl->session->ticketLenAlloc = 0;
  30012. }
  30013. et = (ExternalTicket*)ssl->session->ticket;
  30014. it = (InternalTicket*)et->enc_ticket;
  30015. #ifdef WOLFSSL_ASYNC_CRYPT
  30016. if (ssl->error != WC_PENDING_E)
  30017. #endif
  30018. {
  30019. XMEMSET(et, 0, sizeof(*et));
  30020. }
  30021. /* build internal */
  30022. it->pv.major = ssl->version.major;
  30023. it->pv.minor = ssl->version.minor;
  30024. it->suite[0] = ssl->options.cipherSuite0;
  30025. it->suite[1] = ssl->options.cipherSuite;
  30026. #ifdef WOLFSSL_EARLY_DATA
  30027. c32toa(ssl->options.maxEarlyDataSz, it->maxEarlyDataSz);
  30028. #endif
  30029. if (!ssl->options.tls1_3) {
  30030. XMEMCPY(it->msecret, ssl->arrays->masterSecret, SECRET_LEN);
  30031. #ifndef NO_ASN_TIME
  30032. c32toa(LowResTimer(), it->timestamp);
  30033. #endif
  30034. it->haveEMS = (byte) ssl->options.haveEMS;
  30035. }
  30036. else {
  30037. #ifdef WOLFSSL_TLS13
  30038. #ifdef WOLFSSL_32BIT_MILLI_TIME
  30039. word32 now = TimeNowInMilliseconds();
  30040. #else
  30041. sword64 now = TimeNowInMilliseconds();
  30042. #endif
  30043. if (now == 0) {
  30044. ret = GETTIME_ERROR;
  30045. goto error;
  30046. }
  30047. /* Client adds to ticket age to obfuscate. */
  30048. ret = wc_RNG_GenerateBlock(ssl->rng, it->ageAdd,
  30049. sizeof(it->ageAdd));
  30050. if (ret != 0) {
  30051. ret = BAD_TICKET_ENCRYPT;
  30052. goto error;
  30053. }
  30054. ato32(it->ageAdd, &ssl->session->ticketAdd);
  30055. c16toa(ssl->session->namedGroup, it->namedGroup);
  30056. #ifdef WOLFSSL_32BIT_MILLI_TIME
  30057. c32toa(now, it->timestamp);
  30058. #else
  30059. c32toa((word32)(now >> 32), it->timestamp);
  30060. c32toa((word32)now , it->timestamp + OPAQUE32_LEN);
  30061. #endif
  30062. /* Resumption master secret. */
  30063. XMEMCPY(it->msecret, ssl->session->masterSecret, SECRET_LEN);
  30064. if (ssl->session->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ) {
  30065. WOLFSSL_MSG("Bad ticket nonce value");
  30066. ret = BAD_TICKET_MSG_SZ;
  30067. goto error;
  30068. }
  30069. XMEMCPY(it->ticketNonce, ssl->session->ticketNonce.data,
  30070. ssl->session->ticketNonce.len);
  30071. it->ticketNonceLen = ssl->session->ticketNonce.len;
  30072. #endif
  30073. }
  30074. #ifdef WOLFSSL_TICKET_HAVE_ID
  30075. {
  30076. const byte* id = NULL;
  30077. byte idSz = 0;
  30078. if (ssl->session->haveAltSessionID) {
  30079. id = ssl->session->altSessionID;
  30080. idSz = ID_LEN;
  30081. }
  30082. else if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
  30083. id = ssl->arrays->sessionID;
  30084. idSz = ssl->arrays->sessionIDSz;
  30085. }
  30086. else {
  30087. id = ssl->session->sessionID;
  30088. idSz = ssl->session->sessionIDSz;
  30089. }
  30090. if (idSz == 0) {
  30091. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID,
  30092. ID_LEN);
  30093. if (ret != 0)
  30094. goto error;
  30095. ssl->session->haveAltSessionID = 1;
  30096. id = ssl->session->altSessionID;
  30097. idSz = ID_LEN;
  30098. }
  30099. /* make sure idSz is not larger than ID_LEN */
  30100. if (idSz > ID_LEN)
  30101. idSz = ID_LEN;
  30102. XMEMCPY(it->id, id, idSz);
  30103. }
  30104. #endif
  30105. /* encrypt */
  30106. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  30107. if (ssl->ctx->ticketEncCb == NULL
  30108. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  30109. ||
  30110. /* SSL_OP_NO_TICKET turns off tickets in < 1.2. Forces
  30111. * "stateful" tickets for 1.3 so just use the regular
  30112. * stateless ones. */
  30113. (!IsAtLeastTLSv1_3(ssl->version) &&
  30114. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  30115. #endif
  30116. ) {
  30117. /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
  30118. ret = BAD_TICKET_ENCRYPT;
  30119. }
  30120. else {
  30121. itHash = HashObject((byte*)it, sizeof(*it), &error);
  30122. if (error == 0) {
  30123. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac,
  30124. 1, et->enc_ticket, sizeof(InternalTicket), &encLen,
  30125. ssl->ctx->ticketEncCtx);
  30126. }
  30127. else {
  30128. ret = WOLFSSL_TICKET_RET_FATAL;
  30129. }
  30130. }
  30131. if (ret != WOLFSSL_TICKET_RET_OK) {
  30132. #ifdef WOLFSSL_ASYNC_CRYPT
  30133. if (ret == WC_PENDING_E) {
  30134. return ret;
  30135. }
  30136. #endif
  30137. goto error;
  30138. }
  30139. if (encLen < (int)sizeof(InternalTicket) ||
  30140. encLen > (int)WOLFSSL_TICKET_ENC_SZ) {
  30141. WOLFSSL_MSG("Bad user ticket encrypt size");
  30142. ret = BAD_TICKET_KEY_CB_SZ;
  30143. }
  30144. /* sanity checks on encrypt callback */
  30145. /* internal ticket can't be the same if encrypted */
  30146. if (itHash == HashObject((byte*)it, sizeof(*it), &error) || error != 0)
  30147. {
  30148. WOLFSSL_MSG("User ticket encrypt didn't encrypt or hash failed");
  30149. ret = BAD_TICKET_ENCRYPT;
  30150. goto error;
  30151. }
  30152. XMEMSET(zeros, 0, sizeof(zeros));
  30153. /* name */
  30154. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  30155. WOLFSSL_MSG("User ticket encrypt didn't set name");
  30156. ret = BAD_TICKET_ENCRYPT;
  30157. goto error;
  30158. }
  30159. /* iv */
  30160. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  30161. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  30162. ret = BAD_TICKET_ENCRYPT;
  30163. goto error;
  30164. }
  30165. /* mac */
  30166. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  30167. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  30168. ret = BAD_TICKET_ENCRYPT;
  30169. goto error;
  30170. }
  30171. /* set size */
  30172. c16toa((word16)encLen, et->enc_len);
  30173. if (encLen < (int)WOLFSSL_TICKET_ENC_SZ) {
  30174. /* move mac up since whole enc buffer not used */
  30175. XMEMMOVE(et->enc_ticket + encLen, et->mac,
  30176. WOLFSSL_TICKET_MAC_SZ);
  30177. }
  30178. ssl->session->ticketLen =
  30179. (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  30180. return ret;
  30181. error:
  30182. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30183. /* Ticket has sensitive data in it now. */
  30184. wc_MemZero_Add("Create Ticket internal", it, sizeof(InternalTicket));
  30185. #endif
  30186. ForceZero(it, sizeof(*it));
  30187. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30188. wc_MemZero_Check(it, sizeof(InternalTicket));
  30189. #endif
  30190. WOLFSSL_ERROR_VERBOSE(ret);
  30191. return ret;
  30192. }
  30193. /* Parse ticket sent by client, returns callback return value */
  30194. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  30195. {
  30196. ExternalTicket* et;
  30197. InternalTicket* it;
  30198. int ret;
  30199. int outLen;
  30200. word16 inLen;
  30201. WOLFSSL_START(WC_FUNC_TICKET_DO);
  30202. WOLFSSL_ENTER("DoClientTicket");
  30203. if (len > SESSION_TICKET_LEN ||
  30204. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  30205. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
  30206. return WOLFSSL_TICKET_RET_REJECT;
  30207. }
  30208. et = (ExternalTicket*)input;
  30209. /* decrypt */
  30210. ato16(et->enc_len, &inLen);
  30211. if (inLen > WOLFSSL_TICKET_ENC_SZ) {
  30212. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
  30213. return WOLFSSL_TICKET_RET_REJECT;
  30214. }
  30215. outLen = (int)inLen; /* may be reduced by user padding */
  30216. if (ssl->ctx->ticketEncCb == NULL
  30217. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  30218. ||
  30219. /* SSL_OP_NO_TICKET turns off tickets in < 1.2. Forces
  30220. * "stateful" tickets for 1.3 so just use the regular
  30221. * stateless ones. */
  30222. (!IsAtLeastTLSv1_3(ssl->version) &&
  30223. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  30224. #endif
  30225. ) {
  30226. /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
  30227. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_ENCRYPT);
  30228. ret = WOLFSSL_TICKET_RET_REJECT;
  30229. }
  30230. else {
  30231. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv,
  30232. et->enc_ticket + inLen, 0,
  30233. et->enc_ticket, inLen, &outLen,
  30234. ssl->ctx->ticketEncCtx);
  30235. }
  30236. if (ret != WOLFSSL_TICKET_RET_OK) {
  30237. #ifdef WOLFSSL_ASYNC_CRYPT
  30238. if (ret == WC_PENDING_E) {
  30239. return ret;
  30240. }
  30241. #endif /* WOLFSSL_ASYNC_CRYPT */
  30242. if (ret != WOLFSSL_TICKET_RET_CREATE) {
  30243. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
  30244. return WOLFSSL_TICKET_RET_REJECT;
  30245. }
  30246. }
  30247. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  30248. WOLFSSL_MSG("Bad user ticket decrypt len");
  30249. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
  30250. return BAD_TICKET_KEY_CB_SZ;
  30251. }
  30252. it = (InternalTicket*)et->enc_ticket;
  30253. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30254. /* Internal ticket successfully decrypted. */
  30255. wc_MemZero_Add("Do Client Ticket internal", it, sizeof(InternalTicket));
  30256. #endif
  30257. /* get master secret */
  30258. if (ret == WOLFSSL_TICKET_RET_OK || ret == WOLFSSL_TICKET_RET_CREATE) {
  30259. if (ssl->version.minor < it->pv.minor) {
  30260. WOLFSSL_MSG("Ticket has greater version");
  30261. ret = VERSION_ERROR;
  30262. goto error;
  30263. }
  30264. else if (ssl->version.minor > it->pv.minor) {
  30265. if (IsAtLeastTLSv1_3(it->pv) != IsAtLeastTLSv1_3(ssl->version)) {
  30266. WOLFSSL_MSG("Tickets cannot be shared between "
  30267. "TLS 1.3 and TLS 1.2 and lower");
  30268. ret = VERSION_ERROR;
  30269. goto error;
  30270. }
  30271. if (!ssl->options.downgrade) {
  30272. WOLFSSL_MSG("Ticket has lesser version");
  30273. ret = VERSION_ERROR;
  30274. goto error;
  30275. }
  30276. WOLFSSL_MSG("Downgrading protocol due to ticket");
  30277. if (it->pv.minor < ssl->options.minDowngrade) {
  30278. WOLFSSL_MSG("Ticket has lesser version than allowed");
  30279. ret = VERSION_ERROR;
  30280. goto error;
  30281. }
  30282. ssl->version.minor = it->pv.minor;
  30283. }
  30284. #ifdef WOLFSSL_TICKET_HAVE_ID
  30285. {
  30286. ssl->session->haveAltSessionID = 1;
  30287. XMEMCPY(ssl->session->altSessionID, it->id, ID_LEN);
  30288. if (wolfSSL_GetSession(ssl, NULL, 1) != NULL) {
  30289. WOLFSSL_MSG("Found session matching the session id"
  30290. " found in the ticket");
  30291. }
  30292. else {
  30293. WOLFSSL_MSG("Can't find session matching the session id"
  30294. " found in the ticket");
  30295. }
  30296. }
  30297. #endif
  30298. if (!IsAtLeastTLSv1_3(ssl->version)) {
  30299. XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN);
  30300. /* Copy the haveExtendedMasterSecret property from the ticket to
  30301. * the saved session, so the property may be checked later. */
  30302. ssl->session->haveEMS = it->haveEMS;
  30303. ato32((const byte*)&it->timestamp, &ssl->session->bornOn);
  30304. #ifndef NO_RESUME_SUITE_CHECK
  30305. ssl->session->cipherSuite0 = it->suite[0];
  30306. ssl->session->cipherSuite = it->suite[1];
  30307. #endif
  30308. }
  30309. else {
  30310. #ifdef WOLFSSL_TLS13
  30311. /* Restore information to renegotiate. */
  30312. #ifdef WOLFSSL_32BIT_MILLI_TIME
  30313. ato32(it->timestamp, &ssl->session->ticketSeen);
  30314. #else
  30315. word32 seenHi, seenLo;
  30316. ato32(it->timestamp , &seenHi);
  30317. ato32(it->timestamp + OPAQUE32_LEN, &seenLo);
  30318. ssl->session->ticketSeen = ((sword64)seenHi << 32) + seenLo;
  30319. #endif
  30320. ato32(it->ageAdd, &ssl->session->ticketAdd);
  30321. ssl->session->cipherSuite0 = it->suite[0];
  30322. ssl->session->cipherSuite = it->suite[1];
  30323. #ifdef WOLFSSL_EARLY_DATA
  30324. ato32(it->maxEarlyDataSz, &ssl->session->maxEarlyDataSz);
  30325. #endif
  30326. /* Resumption master secret. */
  30327. XMEMCPY(ssl->session->masterSecret, it->msecret, SECRET_LEN);
  30328. if (it->ticketNonceLen > MAX_TICKET_NONCE_STATIC_SZ) {
  30329. WOLFSSL_MSG("Unsupported ticketNonce len in ticket");
  30330. return BAD_TICKET_ENCRYPT;
  30331. }
  30332. #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \
  30333. (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))
  30334. if (ssl->session->ticketNonce.data
  30335. != ssl->session->ticketNonce.dataStatic) {
  30336. XFREE(ssl->session->ticketNonce.data, ssl->heap,
  30337. DYNAMIC_TYPE_SESSION_TICK);
  30338. ssl->session->ticketNonce.data =
  30339. ssl->session->ticketNonce.dataStatic;
  30340. }
  30341. #endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */
  30342. XMEMCPY(ssl->session->ticketNonce.data, it->ticketNonce,
  30343. it->ticketNonceLen);
  30344. ssl->session->ticketNonce.len = it->ticketNonceLen;
  30345. ato16(it->namedGroup, &ssl->session->namedGroup);
  30346. #endif
  30347. }
  30348. }
  30349. ForceZero(it, sizeof(*it));
  30350. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30351. wc_MemZero_Check(it, sizeof(InternalTicket));
  30352. #endif
  30353. WOLFSSL_LEAVE("DoClientTicket", ret);
  30354. WOLFSSL_END(WC_FUNC_TICKET_DO);
  30355. return ret;
  30356. error:
  30357. ForceZero(it, sizeof(*it));
  30358. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30359. wc_MemZero_Check(it, sizeof(InternalTicket));
  30360. #endif
  30361. WOLFSSL_ERROR_VERBOSE(ret);
  30362. return WOLFSSL_TICKET_RET_REJECT;
  30363. }
  30364. /* send Session Ticket */
  30365. int SendTicket(WOLFSSL* ssl)
  30366. {
  30367. byte* output;
  30368. int ret;
  30369. int sendSz;
  30370. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  30371. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  30372. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  30373. WOLFSSL_ENTER("SendTicket");
  30374. if (ssl->options.createTicket) {
  30375. ret = CreateTicket(ssl);
  30376. if (ret != 0)
  30377. return ret;
  30378. }
  30379. length += ssl->session->ticketLen;
  30380. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  30381. if (!ssl->options.dtls) {
  30382. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  30383. sendSz += MAX_MSG_EXTRA;
  30384. }
  30385. else {
  30386. #ifdef WOLFSSL_DTLS
  30387. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30388. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30389. #endif
  30390. }
  30391. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  30392. sendSz += cipherExtraData(ssl);
  30393. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  30394. * is not advanced yet */
  30395. ssl->options.buildingMsg = 1;
  30396. /* check for available size */
  30397. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  30398. return ret;
  30399. /* get output buffer */
  30400. output = ssl->buffers.outputBuffer.buffer +
  30401. ssl->buffers.outputBuffer.length;
  30402. AddHeaders(output, length, session_ticket, ssl);
  30403. /* hint */
  30404. c32toa(ssl->ctx->ticketHint, output + idx);
  30405. idx += SESSION_HINT_SZ;
  30406. /* length */
  30407. c16toa(ssl->session->ticketLen, output + idx);
  30408. idx += LENGTH_SZ;
  30409. /* ticket */
  30410. XMEMCPY(output + idx, ssl->session->ticket, ssl->session->ticketLen);
  30411. idx += ssl->session->ticketLen;
  30412. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  30413. byte* input;
  30414. int inputSz = idx; /* build msg adds rec hdr */
  30415. int recordHeaderSz = RECORD_HEADER_SZ;
  30416. if (ssl->options.dtls)
  30417. recordHeaderSz += DTLS_RECORD_EXTRA;
  30418. inputSz -= recordHeaderSz;
  30419. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30420. if (input == NULL)
  30421. return MEMORY_E;
  30422. XMEMCPY(input, output + recordHeaderSz, inputSz);
  30423. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  30424. handshake, 1, 0, 0, CUR_ORDER);
  30425. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30426. if (sendSz < 0)
  30427. return sendSz;
  30428. }
  30429. else {
  30430. #ifdef WOLFSSL_DTLS
  30431. if (ssl->options.dtls) {
  30432. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
  30433. return ret;
  30434. DtlsSEQIncrement(ssl, CUR_ORDER);
  30435. }
  30436. #endif
  30437. ret = HashOutput(ssl, output, sendSz, 0);
  30438. if (ret != 0)
  30439. return ret;
  30440. }
  30441. ssl->buffers.outputBuffer.length += sendSz;
  30442. ssl->options.buildingMsg = 0;
  30443. if (!ssl->options.groupMessages)
  30444. ret = SendBuffered(ssl);
  30445. WOLFSSL_LEAVE("SendTicket", ret);
  30446. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  30447. return ret;
  30448. }
  30449. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  30450. /* Initialize the context for session ticket encryption.
  30451. *
  30452. * @param [in] ctx SSL context.
  30453. * @param [in] keyCtx Context for session ticket encryption.
  30454. * @return 0 on success.
  30455. * @return BAD_MUTEX_E when initializing mutex fails.
  30456. */
  30457. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
  30458. {
  30459. int ret = 0;
  30460. XMEMSET(keyCtx, 0, sizeof(*keyCtx));
  30461. keyCtx->ctx = ctx;
  30462. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30463. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->name", keyCtx->name,
  30464. sizeof(keyCtx->name));
  30465. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[0]", keyCtx->key[0],
  30466. sizeof(keyCtx->key[0]));
  30467. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[1]", keyCtx->key[1],
  30468. sizeof(keyCtx->key[1]));
  30469. #endif
  30470. #ifndef SINGLE_THREADED
  30471. ret = wc_InitMutex(&keyCtx->mutex);
  30472. #endif
  30473. return ret;
  30474. }
  30475. /* Setup the session ticket encryption context for this.
  30476. *
  30477. * Initialize RNG, generate name, generate primary key and set primary key
  30478. * expirary.
  30479. *
  30480. * @param [in] keyCtx Context for session ticket encryption.
  30481. * @param [in] heap Dynamic memory allocation hint.
  30482. * @param [in] devId Device identifier.
  30483. * @return 0 on success.
  30484. * @return Other value when random number generator fails.
  30485. */
  30486. static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
  30487. {
  30488. int ret;
  30489. #ifndef SINGLE_THREADED
  30490. ret = 0;
  30491. /* Check that key wasn't set up while waiting. */
  30492. if (keyCtx->expirary[0] == 0)
  30493. #endif
  30494. {
  30495. ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
  30496. if (ret == 0) {
  30497. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
  30498. sizeof(keyCtx->name));
  30499. }
  30500. if (ret == 0) {
  30501. /* Mask of the bottom bit - used for index of key. */
  30502. keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
  30503. /* Generate initial primary key. */
  30504. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
  30505. WOLFSSL_TICKET_KEY_SZ);
  30506. }
  30507. if (ret == 0) {
  30508. keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
  30509. }
  30510. }
  30511. return ret;
  30512. }
  30513. /* Free the context for session ticket encryption.
  30514. *
  30515. * Zeroize keys and name.
  30516. *
  30517. * @param [in] keyCtx Context for session ticket encryption.
  30518. */
  30519. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
  30520. {
  30521. /* Zeroize sensitive data. */
  30522. ForceZero(keyCtx->name, sizeof(keyCtx->name));
  30523. ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
  30524. ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
  30525. #ifdef WOLFSSL_CHECK_MEM_ZERO
  30526. wc_MemZero_Check(keyCtx->name, sizeof(keyCtx->name));
  30527. wc_MemZero_Check(keyCtx->key[0], sizeof(keyCtx->key[0]));
  30528. wc_MemZero_Check(keyCtx->key[1], sizeof(keyCtx->key[1]));
  30529. #endif
  30530. #ifndef SINGLE_THREADED
  30531. wc_FreeMutex(&keyCtx->mutex);
  30532. #endif
  30533. wc_FreeRng(&keyCtx->rng);
  30534. }
  30535. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  30536. !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
  30537. !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
  30538. /* Ticket encryption/decryption implementation.
  30539. *
  30540. * @param [in] key Key for encryption/decryption.
  30541. * @param [in] keyLen Length of key in bytes.
  30542. * @param [in] iv IV/Nonce for encryption/decryption.
  30543. * @param [in] aad Additional authentication data.
  30544. * @param [in] aadSz Length of additional authentication data.
  30545. * @param [in] in Data to encrypt/decrypt.
  30546. * @param [in] inLen Length of encrypted data.
  30547. * @param [out] out Resulting data from encrypt/decrypt.
  30548. * @param [out] outLen Size of resulting data.
  30549. * @param [in] tag Authentication tag for encrypted data.
  30550. * @param [in] heap Dynamic memory allocation data hint.
  30551. * @param [in] enc 1 when encrypting, 0 when decrypting.
  30552. * @return 0 on success.
  30553. * @return Other value when encryption/decryption fails.
  30554. */
  30555. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  30556. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  30557. void* heap, int enc)
  30558. {
  30559. int ret;
  30560. (void)keyLen;
  30561. (void)heap;
  30562. if (enc) {
  30563. ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
  30564. tag);
  30565. }
  30566. else {
  30567. ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
  30568. out);
  30569. }
  30570. *outLen = inLen;
  30571. return ret;
  30572. }
  30573. #elif defined(HAVE_AESGCM)
  30574. /* Ticket encryption/decryption implementation.
  30575. *
  30576. * @param [in] key Key for encryption/decryption.
  30577. * @param [in] keyLen Length of key in bytes.
  30578. * @param [in] iv IV/Nonce for encryption/decryption.
  30579. * @param [in] aad Additional authentication data.
  30580. * @param [in] aadSz Length of additional authentication data.
  30581. * @param [in] in Data to encrypt/decrypt.
  30582. * @param [in] inLen Length of encrypted data.
  30583. * @param [out] out Resulting data from encrypt/decrypt.
  30584. * @param [out] outLen Size of resulting data.
  30585. * @param [in] tag Authentication tag for encrypted data.
  30586. * @param [in] heap Dynamic memory allocation data hint.
  30587. * @param [in] enc 1 when encrypting, 0 when decrypting.
  30588. * @return 0 on success.
  30589. * @return MEMORY_E when dynamic memory allocation fails.
  30590. * @return Other value when encryption/decryption fails.
  30591. */
  30592. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  30593. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  30594. void* heap, int enc)
  30595. {
  30596. int ret;
  30597. #ifdef WOLFSSL_SMALL_STACK
  30598. Aes* aes;
  30599. #else
  30600. Aes aes[1];
  30601. #endif
  30602. (void)heap;
  30603. #ifdef WOLFSSL_SMALL_STACK
  30604. aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
  30605. if (aes == NULL)
  30606. return MEMORY_E;
  30607. #endif
  30608. if (enc) {
  30609. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  30610. if (ret == 0) {
  30611. ret = wc_AesGcmSetKey(aes, key, keyLen);
  30612. }
  30613. if (ret == 0) {
  30614. ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  30615. tag, AES_BLOCK_SIZE, aad, aadSz);
  30616. }
  30617. wc_AesFree(aes);
  30618. }
  30619. else {
  30620. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  30621. if (ret == 0) {
  30622. ret = wc_AesGcmSetKey(aes, key, keyLen);
  30623. }
  30624. if (ret == 0) {
  30625. ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  30626. tag, AES_BLOCK_SIZE, aad, aadSz);
  30627. }
  30628. wc_AesFree(aes);
  30629. }
  30630. #ifdef WOLFSSL_SMALL_STACK
  30631. XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
  30632. #endif
  30633. *outLen = inLen;
  30634. return ret;
  30635. }
  30636. #else
  30637. #error "No encryption algorithm available for default ticket encryption."
  30638. #endif
  30639. /* Choose a key to use for encryption.
  30640. *
  30641. * Generate a new key if the current ones are expired.
  30642. * If the secondary key has not been used and the primary key has expired then
  30643. * generate a new primary key.
  30644. *
  30645. * @param [in] Ticket encryption callback context.
  30646. * @param [in] Session ticket lifetime.
  30647. * @param [out] Index of key to use for encryption.
  30648. * @return 0 on success.
  30649. * @return Other value when random number generation fails.
  30650. */
  30651. static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
  30652. int* keyIdx)
  30653. {
  30654. int ret = 0;
  30655. /* Get new current time as lock may have taken some time. */
  30656. word32 now = LowResTimer();
  30657. /* Check expirary of primary key for encrypt. */
  30658. if (keyCtx->expirary[0] >= now + ticketHint) {
  30659. *keyIdx = 0;
  30660. }
  30661. /* Check expirary of primary key for encrypt. */
  30662. else if (keyCtx->expirary[1] >= now + ticketHint) {
  30663. *keyIdx = 1;
  30664. }
  30665. /* No key available to use. */
  30666. else {
  30667. int genKey;
  30668. /* Generate which ever key is expired for decrypt - primary first. */
  30669. if (keyCtx->expirary[0] < now) {
  30670. genKey = 0;
  30671. }
  30672. else if (keyCtx->expirary[1] < now) {
  30673. genKey = 1;
  30674. }
  30675. /* Timeouts and expirary should not allow this to happen. */
  30676. else {
  30677. return BAD_STATE_E;
  30678. }
  30679. /* Generate the required key */
  30680. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
  30681. WOLFSSL_TICKET_KEY_SZ);
  30682. if (ret == 0) {
  30683. keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
  30684. *keyIdx = genKey;
  30685. }
  30686. }
  30687. return ret;
  30688. }
  30689. /* Default Session Ticket encryption/decryption callback.
  30690. *
  30691. * Use ChaCha20-Poly1305 or AES-GCM to encrypt/decrypt the ticket.
  30692. * Two keys are used:
  30693. * - When the first expires for encryption, then use the other.
  30694. * - Don't encrypt with key if the ticket lifetime will go beyond expirary.
  30695. * - Generate a new primary key when primary key expired for decrypt and
  30696. * no secondary key is activate for encryption.
  30697. * - Generate a new secondary key when expired and needed.
  30698. * - Calculate expirary starting from first encrypted ticket.
  30699. * - Key name has last bit set to indicate index of key.
  30700. * Keys expire for decryption after ticket key lifetime from the first encrypted
  30701. * ticket.
  30702. * Keys can only be use for encryption while the ticket hint does not exceed
  30703. * the key lifetime.
  30704. * Lifetime of a key must be greater than the lifetime of a ticket. This means
  30705. * that if one ticket is only valid for decryption, then the other will be
  30706. * valid for encryption.
  30707. * AAD = key_name | iv | ticket len (16-bits network order)
  30708. *
  30709. * @param [in] ssl SSL connection.
  30710. * @param [in,out] key_name Name of key from client.
  30711. * Encrypt: name of key returned.
  30712. * Decrypt: name from ticket message to check.
  30713. * @param [in] iv IV to use in encryption/decryption.
  30714. * @param [in] mac MAC for authentication of encrypted data.
  30715. * @param [in] enc 1 when encrypting ticket, 0 when decrypting.
  30716. * @param [in,out] ticket Encrypted/decrypted session ticket bytes.
  30717. * @param [in] inLen Length of incoming ticket.
  30718. * @param [out] outLen Length of outgoing ticket.
  30719. * @param [in] userCtx Context for encryption/decryption of ticket.
  30720. * @return WOLFSSL_TICKET_RET_OK when successful.
  30721. * @return WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
  30722. * be created for TLS 1.2 and below.
  30723. * @return WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
  30724. * decrypted ticket.
  30725. * @return WOLFSSL_TICKET_RET_FATAL when key name does not match.
  30726. */
  30727. static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
  30728. byte iv[WOLFSSL_TICKET_IV_SZ],
  30729. byte mac[WOLFSSL_TICKET_MAC_SZ],
  30730. int enc, byte* ticket, int inLen, int* outLen,
  30731. void* userCtx)
  30732. {
  30733. int ret;
  30734. TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
  30735. WOLFSSL_CTX* ctx = keyCtx->ctx;
  30736. word16 sLen = XHTONS((word16)inLen);
  30737. byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
  30738. int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
  30739. byte* p = aad;
  30740. int keyIdx = 0;
  30741. WOLFSSL_ENTER("DefTicketEncCb");
  30742. /* Check we have setup the RNG, name and primary key. */
  30743. if (keyCtx->expirary[0] == 0) {
  30744. #ifndef SINGLE_THREADED
  30745. /* Lock around access to expirary and key - stop initial key being
  30746. * generated twice at the same time. */
  30747. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  30748. WOLFSSL_MSG("Couldn't lock key context mutex");
  30749. return WOLFSSL_TICKET_RET_REJECT;
  30750. }
  30751. #endif
  30752. /* Sets expirary of primary key in setup. */
  30753. ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
  30754. #ifndef SINGLE_THREADED
  30755. wc_UnLockMutex(&keyCtx->mutex);
  30756. #endif
  30757. if (ret != 0)
  30758. return ret;
  30759. }
  30760. if (enc) {
  30761. /* Return the name of the key - missing key index. */
  30762. XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  30763. /* Generate a new IV into buffer to be returned.
  30764. * Don't use the RNG in keyCtx as it's for generating private data. */
  30765. ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
  30766. if (ret != 0) {
  30767. return WOLFSSL_TICKET_RET_REJECT;
  30768. }
  30769. }
  30770. else {
  30771. /* Mask of last bit that is the key index. */
  30772. byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
  30773. /* For decryption, see if we know this key - check all but last byte. */
  30774. if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
  30775. return WOLFSSL_TICKET_RET_FATAL;
  30776. }
  30777. /* Ensure last byte without index bit matches too. */
  30778. if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
  30779. return WOLFSSL_TICKET_RET_FATAL;
  30780. }
  30781. }
  30782. /* Build AAD from: key name, iv, and length of ticket. */
  30783. XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  30784. p += WOLFSSL_TICKET_NAME_SZ;
  30785. XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
  30786. p += WOLFSSL_TICKET_IV_SZ;
  30787. XMEMCPY(p, &sLen, sizeof(sLen));
  30788. /* Encrypt ticket. */
  30789. if (enc) {
  30790. word32 now;
  30791. now = LowResTimer();
  30792. /* As long as encryption expirary isn't imminent - no lock. */
  30793. if (keyCtx->expirary[0] > now + ctx->ticketHint) {
  30794. keyIdx = 0;
  30795. }
  30796. else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
  30797. keyIdx = 1;
  30798. }
  30799. else {
  30800. #ifndef SINGLE_THREADED
  30801. /* Lock around access to expirary and key - stop key being generated
  30802. * twice at the same time. */
  30803. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  30804. WOLFSSL_MSG("Couldn't lock key context mutex");
  30805. return WOLFSSL_TICKET_RET_REJECT;
  30806. }
  30807. #endif
  30808. ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
  30809. #ifndef SINGLE_THREADED
  30810. wc_UnLockMutex(&keyCtx->mutex);
  30811. #endif
  30812. if (ret != 0) {
  30813. return WOLFSSL_TICKET_RET_REJECT;
  30814. }
  30815. }
  30816. /* Set the name of the key to the index chosen. */
  30817. key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  30818. /* Update AAD too. */
  30819. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  30820. /* Encrypt ticket data. */
  30821. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  30822. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  30823. 1);
  30824. if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
  30825. }
  30826. /* Decrypt ticket. */
  30827. else {
  30828. /* Get index of key from name. */
  30829. keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
  30830. /* Update AAD with index. */
  30831. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  30832. /* Check expirary */
  30833. if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
  30834. return WOLFSSL_TICKET_RET_REJECT;
  30835. }
  30836. /* Decrypt ticket data. */
  30837. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  30838. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  30839. 0);
  30840. if (ret != 0) {
  30841. return WOLFSSL_TICKET_RET_REJECT;
  30842. }
  30843. }
  30844. #ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
  30845. if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
  30846. return WOLFSSL_TICKET_RET_CREATE;
  30847. #endif
  30848. return WOLFSSL_TICKET_RET_OK;
  30849. }
  30850. #endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
  30851. #endif /* HAVE_SESSION_TICKET */
  30852. #ifndef WOLFSSL_NO_TLS12
  30853. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  30854. !defined(NO_WOLFSSL_SERVER)
  30855. /* handle generation of server's hello_request (0) */
  30856. int SendHelloRequest(WOLFSSL* ssl)
  30857. {
  30858. byte* output;
  30859. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  30860. int ret;
  30861. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  30862. WOLFSSL_ENTER("SendHelloRequest");
  30863. if (IsEncryptionOn(ssl, 1))
  30864. sendSz += MAX_MSG_EXTRA;
  30865. if (ssl->options.dtls)
  30866. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30867. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  30868. * is not advanced yet */
  30869. ssl->options.buildingMsg = 1;
  30870. /* check for available size */
  30871. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  30872. return ret;
  30873. /* get output buffer */
  30874. output = ssl->buffers.outputBuffer.buffer +
  30875. ssl->buffers.outputBuffer.length;
  30876. AddHeaders(output, 0, hello_request, ssl);
  30877. if (IsEncryptionOn(ssl, 1)) {
  30878. byte* input;
  30879. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  30880. int recordHeaderSz = RECORD_HEADER_SZ;
  30881. if (ssl->options.dtls) {
  30882. recordHeaderSz += DTLS_RECORD_EXTRA;
  30883. inputSz += DTLS_HANDSHAKE_EXTRA;
  30884. }
  30885. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30886. if (input == NULL)
  30887. return MEMORY_E;
  30888. XMEMCPY(input, output + recordHeaderSz, inputSz);
  30889. #ifdef WOLFSSL_DTLS
  30890. if (IsDtlsNotSctpMode(ssl) &&
  30891. (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
  30892. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30893. return ret;
  30894. }
  30895. #endif
  30896. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  30897. handshake, 0, 0, 0, CUR_ORDER);
  30898. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30899. if (sendSz < 0)
  30900. return sendSz;
  30901. }
  30902. ssl->buffers.outputBuffer.length += sendSz;
  30903. ssl->options.buildingMsg = 0;
  30904. ret = SendBuffered(ssl);
  30905. WOLFSSL_LEAVE("SendHelloRequest", ret);
  30906. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  30907. return ret;
  30908. }
  30909. #endif /* HAVE_SECURE_RENEGOTIATION && !NO_WOLFSSL_SERVER */
  30910. #ifdef WOLFSSL_DTLS
  30911. /* handle generation of DTLS hello_verify_request (3) */
  30912. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  30913. const byte* cookie, byte cookieSz)
  30914. {
  30915. byte* output;
  30916. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  30917. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  30918. int sendSz = length + idx;
  30919. int ret;
  30920. /* are we in scr */
  30921. if (IsEncryptionOn(ssl, 1)) {
  30922. sendSz += MAX_MSG_EXTRA;
  30923. }
  30924. /* reset hashes */
  30925. ret = InitHandshakeHashes(ssl);
  30926. if (ret != 0)
  30927. return ret;
  30928. /* check for available size */
  30929. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  30930. return ret;
  30931. /* get output buffer */
  30932. output = ssl->buffers.outputBuffer.buffer +
  30933. ssl->buffers.outputBuffer.length;
  30934. /* Hello Verify Request should use the same sequence number
  30935. * as the Client Hello unless we are in renegotiation then
  30936. * don't change numbers */
  30937. #ifdef HAVE_SECURE_RENEGOTIATION
  30938. if (!IsSCR(ssl))
  30939. #endif
  30940. {
  30941. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  30942. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  30943. }
  30944. AddHeaders(output, length, hello_verify_request, ssl);
  30945. #ifdef OPENSSL_EXTRA
  30946. output[idx++] = DTLS_MAJOR;
  30947. output[idx++] = DTLS_MINOR;
  30948. #else
  30949. output[idx++] = ssl->version.major;
  30950. output[idx++] = ssl->version.minor;
  30951. #endif
  30952. output[idx++] = cookieSz;
  30953. if (cookie == NULL || cookieSz == 0)
  30954. return COOKIE_ERROR;
  30955. XMEMCPY(output + idx, cookie, cookieSz);
  30956. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  30957. if (ssl->hsInfoOn)
  30958. AddPacketName(ssl, "HelloVerifyRequest");
  30959. if (ssl->toInfoOn) {
  30960. ret = AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  30961. sendSz, WRITE_PROTO, 0, ssl->heap);
  30962. if (ret != 0)
  30963. return ret;
  30964. }
  30965. #endif
  30966. /* are we in scr */
  30967. if (IsEncryptionOn(ssl, 1)) {
  30968. byte* input;
  30969. int inputSz = DTLS_HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
  30970. int recordHeaderSz = DTLS_RECORD_HEADER_SZ;
  30971. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30972. if (input == NULL)
  30973. return MEMORY_E;
  30974. XMEMCPY(input, output + recordHeaderSz, inputSz);
  30975. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  30976. handshake, 0, 0, 0, CUR_ORDER);
  30977. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30978. if (sendSz < 0)
  30979. return sendSz;
  30980. }
  30981. ssl->buffers.outputBuffer.length += sendSz;
  30982. DtlsResetState(ssl);
  30983. return SendBuffered(ssl);
  30984. }
  30985. #endif /* WOLFSSL_DTLS */
  30986. typedef struct DckeArgs {
  30987. byte* output; /* not allocated */
  30988. word32 length;
  30989. word32 idx;
  30990. word32 begin;
  30991. word32 sigSz;
  30992. #ifndef NO_RSA
  30993. int lastErr;
  30994. #endif
  30995. } DckeArgs;
  30996. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  30997. {
  30998. DckeArgs* args = (DckeArgs*)pArgs;
  30999. (void)ssl;
  31000. (void)args;
  31001. }
  31002. /* handle processing client_key_exchange (16) */
  31003. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  31004. word32 size)
  31005. {
  31006. int ret;
  31007. #ifdef WOLFSSL_ASYNC_CRYPT
  31008. DckeArgs* args = NULL;
  31009. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  31010. #else
  31011. DckeArgs args[1];
  31012. #endif
  31013. (void)size;
  31014. (void)input;
  31015. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  31016. WOLFSSL_ENTER("DoClientKeyExchange");
  31017. #ifdef WOLFSSL_ASYNC_CRYPT
  31018. if (ssl->async == NULL) {
  31019. ssl->async = (struct WOLFSSL_ASYNC*)
  31020. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  31021. DYNAMIC_TYPE_ASYNC);
  31022. if (ssl->async == NULL)
  31023. ERROR_OUT(MEMORY_E, exit_dcke);
  31024. }
  31025. args = (DckeArgs*)ssl->async->args;
  31026. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  31027. if (ret != WC_NOT_PENDING_E) {
  31028. /* Check for error */
  31029. if (ret < 0)
  31030. goto exit_dcke;
  31031. }
  31032. else
  31033. #endif /* WOLFSSL_ASYNC_CRYPT */
  31034. {
  31035. /* Reset state */
  31036. ret = 0;
  31037. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  31038. XMEMSET(args, 0, sizeof(DckeArgs));
  31039. args->idx = *inOutIdx;
  31040. args->begin = *inOutIdx;
  31041. #ifdef WOLFSSL_ASYNC_CRYPT
  31042. ssl->async->freeArgs = FreeDckeArgs;
  31043. #endif
  31044. }
  31045. /* Do Client Key Exchange State Machine */
  31046. switch(ssl->options.asyncState)
  31047. {
  31048. case TLS_ASYNC_BEGIN:
  31049. {
  31050. /* Sanity checks */
  31051. /* server side checked in SanityCheckMsgReceived */
  31052. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  31053. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  31054. SendAlert(ssl, alert_fatal, unexpected_message);
  31055. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  31056. }
  31057. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  31058. if (ssl->options.verifyPeer &&
  31059. (ssl->options.mutualAuth || ssl->options.failNoCert)) {
  31060. if (!ssl->options.havePeerCert) {
  31061. WOLFSSL_MSG("client didn't present peer cert");
  31062. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  31063. }
  31064. }
  31065. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  31066. if (!ssl->options.havePeerCert &&
  31067. !ssl->options.usingPSK_cipher) {
  31068. WOLFSSL_MSG("client didn't present peer cert");
  31069. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  31070. }
  31071. }
  31072. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  31073. #if defined(WOLFSSL_CALLBACKS)
  31074. if (ssl->hsInfoOn) {
  31075. AddPacketName(ssl, "ClientKeyExchange");
  31076. }
  31077. if (ssl->toInfoOn) {
  31078. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  31079. }
  31080. #endif
  31081. if (ssl->arrays->preMasterSecret == NULL) {
  31082. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  31083. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  31084. ssl->heap, DYNAMIC_TYPE_SECRET);
  31085. if (ssl->arrays->preMasterSecret == NULL) {
  31086. ERROR_OUT(MEMORY_E, exit_dcke);
  31087. }
  31088. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  31089. }
  31090. switch (ssl->specs.kea) {
  31091. #ifndef NO_RSA
  31092. case rsa_kea:
  31093. {
  31094. break;
  31095. } /* rsa_kea */
  31096. #endif /* !NO_RSA */
  31097. #ifndef NO_PSK
  31098. case psk_kea:
  31099. {
  31100. /* sanity check that PSK server callback has been set */
  31101. if (ssl->options.server_psk_cb == NULL) {
  31102. WOLFSSL_MSG("No server PSK callback set");
  31103. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31104. }
  31105. break;
  31106. }
  31107. #endif /* !NO_PSK */
  31108. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31109. defined(HAVE_CURVE448)
  31110. case ecc_diffie_hellman_kea:
  31111. {
  31112. break;
  31113. }
  31114. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  31115. #ifndef NO_DH
  31116. case diffie_hellman_kea:
  31117. {
  31118. break;
  31119. }
  31120. #endif /* !NO_DH */
  31121. #if !defined(NO_DH) && !defined(NO_PSK)
  31122. case dhe_psk_kea:
  31123. {
  31124. /* sanity check that PSK server callback has been set */
  31125. if (ssl->options.server_psk_cb == NULL) {
  31126. WOLFSSL_MSG("No server PSK callback set");
  31127. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31128. }
  31129. break;
  31130. }
  31131. #endif /* !NO_DH && !NO_PSK */
  31132. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31133. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  31134. case ecdhe_psk_kea:
  31135. {
  31136. /* sanity check that PSK server callback has been set */
  31137. if (ssl->options.server_psk_cb == NULL) {
  31138. WOLFSSL_MSG("No server PSK callback set");
  31139. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31140. }
  31141. break;
  31142. }
  31143. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  31144. default:
  31145. WOLFSSL_MSG("Bad kea type");
  31146. ret = BAD_KEA_TYPE_E;
  31147. } /* switch (ssl->specs.kea) */
  31148. /* Check for error */
  31149. if (ret != 0) {
  31150. goto exit_dcke;
  31151. }
  31152. /* Advance state and proceed */
  31153. ssl->options.asyncState = TLS_ASYNC_BUILD;
  31154. } /* TLS_ASYNC_BEGIN */
  31155. FALL_THROUGH;
  31156. case TLS_ASYNC_BUILD:
  31157. {
  31158. switch (ssl->specs.kea) {
  31159. #ifndef NO_RSA
  31160. case rsa_kea:
  31161. {
  31162. word16 keySz;
  31163. ssl->buffers.keyType = rsa_sa_algo;
  31164. ret = DecodePrivateKey(ssl, &keySz);
  31165. if (ret != 0) {
  31166. goto exit_dcke;
  31167. }
  31168. args->length = (word32)keySz;
  31169. ssl->arrays->preMasterSz = SECRET_LEN;
  31170. if (ssl->options.tls) {
  31171. word16 check;
  31172. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  31173. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31174. }
  31175. ato16(input + args->idx, &check);
  31176. args->idx += OPAQUE16_LEN;
  31177. if ((word32)check != args->length) {
  31178. WOLFSSL_MSG("RSA explicit size doesn't match");
  31179. #ifdef WOLFSSL_EXTRA_ALERTS
  31180. SendAlert(ssl, alert_fatal, bad_record_mac);
  31181. #endif
  31182. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  31183. }
  31184. }
  31185. if ((args->idx - args->begin) + args->length > size) {
  31186. WOLFSSL_MSG("RSA message too big");
  31187. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31188. }
  31189. /* pre-load PreMasterSecret with RNG data */
  31190. ret = wc_RNG_GenerateBlock(ssl->rng,
  31191. &ssl->arrays->preMasterSecret[VERSION_SZ],
  31192. SECRET_LEN - VERSION_SZ);
  31193. if (ret != 0) {
  31194. goto exit_dcke;
  31195. }
  31196. args->output = NULL;
  31197. break;
  31198. } /* rsa_kea */
  31199. #endif /* !NO_RSA */
  31200. #ifndef NO_PSK
  31201. case psk_kea:
  31202. {
  31203. byte* pms = ssl->arrays->preMasterSecret;
  31204. word16 ci_sz;
  31205. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  31206. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31207. }
  31208. ato16(input + args->idx, &ci_sz);
  31209. args->idx += OPAQUE16_LEN;
  31210. if (ci_sz > MAX_PSK_ID_LEN) {
  31211. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  31212. }
  31213. if ((args->idx - args->begin) + ci_sz > size) {
  31214. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31215. }
  31216. XMEMCPY(ssl->arrays->client_identity,
  31217. input + args->idx, ci_sz);
  31218. args->idx += ci_sz;
  31219. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  31220. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  31221. ssl->arrays->client_identity, ssl->arrays->psk_key,
  31222. MAX_PSK_KEY_LEN);
  31223. if (ssl->arrays->psk_keySz == 0 ||
  31224. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  31225. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  31226. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  31227. SendAlert(ssl, alert_fatal,
  31228. unknown_psk_identity);
  31229. #endif
  31230. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31231. }
  31232. /* SERVER: Pre-shared Key for peer authentication. */
  31233. ssl->options.peerAuthGood = 1;
  31234. /* make psk pre master secret */
  31235. /* length of key + length 0s + length of key + key */
  31236. c16toa((word16) ssl->arrays->psk_keySz, pms);
  31237. pms += OPAQUE16_LEN;
  31238. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  31239. pms += ssl->arrays->psk_keySz;
  31240. c16toa((word16) ssl->arrays->psk_keySz, pms);
  31241. pms += OPAQUE16_LEN;
  31242. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  31243. ssl->arrays->preMasterSz =
  31244. (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
  31245. break;
  31246. }
  31247. #endif /* !NO_PSK */
  31248. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31249. defined(HAVE_CURVE448)
  31250. case ecc_diffie_hellman_kea:
  31251. {
  31252. #ifdef HAVE_ECC
  31253. ecc_key* private_key = ssl->eccTempKey;
  31254. /* handle static private key */
  31255. if (ssl->specs.static_ecdh &&
  31256. ssl->ecdhCurveOID != ECC_X25519_OID &&
  31257. ssl->ecdhCurveOID != ECC_X448_OID) {
  31258. word16 keySz;
  31259. ssl->buffers.keyType = ecc_dsa_sa_algo;
  31260. ret = DecodePrivateKey(ssl, &keySz);
  31261. if (ret != 0) {
  31262. goto exit_dcke;
  31263. }
  31264. private_key = (ecc_key*)ssl->hsKey;
  31265. }
  31266. #endif
  31267. /* import peer ECC key */
  31268. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  31269. #ifdef WOLFSSL_EXTRA_ALERTS
  31270. SendAlert(ssl, alert_fatal, decode_error);
  31271. #endif
  31272. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31273. }
  31274. args->length = input[args->idx++];
  31275. if ((args->idx - args->begin) + args->length > size) {
  31276. #ifdef WOLFSSL_EXTRA_ALERTS
  31277. SendAlert(ssl, alert_fatal, decode_error);
  31278. #endif
  31279. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31280. }
  31281. #ifdef HAVE_CURVE25519
  31282. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  31283. #ifdef HAVE_PK_CALLBACKS
  31284. /* if callback then use it for shared secret */
  31285. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  31286. break;
  31287. }
  31288. #endif
  31289. if (ssl->peerX25519Key == NULL) {
  31290. /* alloc/init on demand */
  31291. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  31292. (void**)&ssl->peerX25519Key);
  31293. if (ret != 0) {
  31294. goto exit_dcke;
  31295. }
  31296. } else if (ssl->peerX25519KeyPresent) {
  31297. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  31298. ssl->peerX25519Key);
  31299. ssl->peerX25519KeyPresent = 0;
  31300. if (ret != 0) {
  31301. goto exit_dcke;
  31302. }
  31303. }
  31304. if ((ret = wc_curve25519_check_public(
  31305. input + args->idx, args->length,
  31306. EC25519_LITTLE_ENDIAN)) != 0) {
  31307. #ifdef WOLFSSL_EXTRA_ALERTS
  31308. if (ret == BUFFER_E)
  31309. SendAlert(ssl, alert_fatal, decode_error);
  31310. else if (ret == ECC_OUT_OF_RANGE_E)
  31311. SendAlert(ssl, alert_fatal, bad_record_mac);
  31312. else {
  31313. SendAlert(ssl, alert_fatal,
  31314. illegal_parameter);
  31315. }
  31316. #endif
  31317. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31318. }
  31319. if (wc_curve25519_import_public_ex(
  31320. input + args->idx, args->length,
  31321. ssl->peerX25519Key,
  31322. EC25519_LITTLE_ENDIAN)) {
  31323. #ifdef WOLFSSL_EXTRA_ALERTS
  31324. SendAlert(ssl, alert_fatal, illegal_parameter);
  31325. #endif
  31326. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31327. }
  31328. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  31329. ssl->peerX25519KeyPresent = 1;
  31330. break;
  31331. }
  31332. #endif
  31333. #ifdef HAVE_CURVE448
  31334. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  31335. #ifdef HAVE_PK_CALLBACKS
  31336. /* if callback then use it for shared secret */
  31337. if (ssl->ctx->X448SharedSecretCb != NULL) {
  31338. break;
  31339. }
  31340. #endif
  31341. if (ssl->peerX448Key == NULL) {
  31342. /* alloc/init on demand */
  31343. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  31344. (void**)&ssl->peerX448Key);
  31345. if (ret != 0) {
  31346. goto exit_dcke;
  31347. }
  31348. } else if (ssl->peerX448KeyPresent) {
  31349. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  31350. ssl->peerX448Key);
  31351. ssl->peerX448KeyPresent = 0;
  31352. if (ret != 0) {
  31353. goto exit_dcke;
  31354. }
  31355. }
  31356. if ((ret = wc_curve448_check_public(
  31357. input + args->idx, args->length,
  31358. EC448_LITTLE_ENDIAN)) != 0) {
  31359. #ifdef WOLFSSL_EXTRA_ALERTS
  31360. if (ret == BUFFER_E)
  31361. SendAlert(ssl, alert_fatal, decode_error);
  31362. else if (ret == ECC_OUT_OF_RANGE_E)
  31363. SendAlert(ssl, alert_fatal, bad_record_mac);
  31364. else {
  31365. SendAlert(ssl, alert_fatal,
  31366. illegal_parameter);
  31367. }
  31368. #endif
  31369. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31370. }
  31371. if (wc_curve448_import_public_ex(
  31372. input + args->idx, args->length,
  31373. ssl->peerX448Key,
  31374. EC448_LITTLE_ENDIAN)) {
  31375. #ifdef WOLFSSL_EXTRA_ALERTS
  31376. SendAlert(ssl, alert_fatal, illegal_parameter);
  31377. #endif
  31378. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31379. }
  31380. ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
  31381. ssl->peerX448KeyPresent = 1;
  31382. break;
  31383. }
  31384. #endif
  31385. #ifdef HAVE_ECC
  31386. #ifdef HAVE_PK_CALLBACKS
  31387. /* if callback then use it for shared secret */
  31388. if (ssl->ctx->EccSharedSecretCb != NULL) {
  31389. break;
  31390. }
  31391. #endif
  31392. if (!ssl->specs.static_ecdh &&
  31393. ssl->eccTempKeyPresent == 0) {
  31394. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  31395. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  31396. }
  31397. if (ssl->peerEccKey == NULL) {
  31398. /* alloc/init on demand */
  31399. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  31400. (void**)&ssl->peerEccKey);
  31401. if (ret != 0) {
  31402. goto exit_dcke;
  31403. }
  31404. } else if (ssl->peerEccKeyPresent) {
  31405. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  31406. ssl->peerEccKey);
  31407. ssl->peerEccKeyPresent = 0;
  31408. if (ret != 0) {
  31409. goto exit_dcke;
  31410. }
  31411. }
  31412. if (wc_ecc_import_x963_ex(input + args->idx,
  31413. args->length, ssl->peerEccKey,
  31414. private_key->dp->id)) {
  31415. #ifdef WOLFSSL_EXTRA_ALERTS
  31416. SendAlert(ssl, alert_fatal, illegal_parameter);
  31417. #endif
  31418. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31419. }
  31420. ssl->arrays->preMasterSz = private_key->dp->size;
  31421. ssl->peerEccKeyPresent = 1;
  31422. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  31423. /* client_hello may have sent FFEDH2048, which sets namedGroup,
  31424. but that is not being used, so clear it */
  31425. /* resolves issue with server side wolfSSL_get_curve_name */
  31426. ssl->namedGroup = 0;
  31427. #endif
  31428. #endif /* HAVE_ECC */
  31429. break;
  31430. }
  31431. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  31432. #ifndef NO_DH
  31433. case diffie_hellman_kea:
  31434. {
  31435. word16 clientPubSz;
  31436. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  31437. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31438. }
  31439. ato16(input + args->idx, &clientPubSz);
  31440. args->idx += OPAQUE16_LEN;
  31441. if ((args->idx - args->begin) + clientPubSz > size) {
  31442. #ifdef WOLFSSL_EXTRA_ALERTS
  31443. SendAlert(ssl, alert_fatal, decode_error);
  31444. #endif
  31445. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31446. }
  31447. args->sigSz = clientPubSz;
  31448. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  31449. (void**)&ssl->buffers.serverDH_Key);
  31450. if (ret != 0) {
  31451. goto exit_dcke;
  31452. }
  31453. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  31454. ssl->buffers.serverDH_P.buffer,
  31455. ssl->buffers.serverDH_P.length,
  31456. ssl->buffers.serverDH_G.buffer,
  31457. ssl->buffers.serverDH_G.length);
  31458. /* set the max agree result size */
  31459. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  31460. break;
  31461. }
  31462. #endif /* !NO_DH */
  31463. #if !defined(NO_DH) && !defined(NO_PSK)
  31464. case dhe_psk_kea:
  31465. {
  31466. word16 clientSz;
  31467. /* Read in the PSK hint */
  31468. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  31469. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31470. }
  31471. ato16(input + args->idx, &clientSz);
  31472. args->idx += OPAQUE16_LEN;
  31473. if (clientSz > MAX_PSK_ID_LEN) {
  31474. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  31475. }
  31476. if ((args->idx - args->begin) + clientSz > size) {
  31477. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31478. }
  31479. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  31480. clientSz);
  31481. args->idx += clientSz;
  31482. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  31483. /* Read in the DHE business */
  31484. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  31485. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31486. }
  31487. ato16(input + args->idx, &clientSz);
  31488. args->idx += OPAQUE16_LEN;
  31489. if ((args->idx - args->begin) + clientSz > size) {
  31490. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31491. }
  31492. args->sigSz = clientSz;
  31493. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  31494. (void**)&ssl->buffers.serverDH_Key);
  31495. if (ret != 0) {
  31496. goto exit_dcke;
  31497. }
  31498. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  31499. ssl->buffers.serverDH_P.buffer,
  31500. ssl->buffers.serverDH_P.length,
  31501. ssl->buffers.serverDH_G.buffer,
  31502. ssl->buffers.serverDH_G.length);
  31503. break;
  31504. }
  31505. #endif /* !NO_DH && !NO_PSK */
  31506. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31507. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  31508. case ecdhe_psk_kea:
  31509. {
  31510. word16 clientSz;
  31511. /* Read in the PSK hint */
  31512. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  31513. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31514. }
  31515. ato16(input + args->idx, &clientSz);
  31516. args->idx += OPAQUE16_LEN;
  31517. if (clientSz > MAX_PSK_ID_LEN) {
  31518. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  31519. }
  31520. if ((args->idx - args->begin) + clientSz > size) {
  31521. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31522. }
  31523. XMEMCPY(ssl->arrays->client_identity,
  31524. input + args->idx, clientSz);
  31525. args->idx += clientSz;
  31526. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  31527. /* import peer ECC key */
  31528. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  31529. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31530. }
  31531. args->length = input[args->idx++];
  31532. if ((args->idx - args->begin) + args->length > size) {
  31533. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  31534. }
  31535. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  31536. #ifdef HAVE_CURVE25519
  31537. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  31538. #ifdef HAVE_PK_CALLBACKS
  31539. /* if callback then use it for shared secret */
  31540. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  31541. break;
  31542. }
  31543. #endif
  31544. if (ssl->eccTempKeyPresent == 0) {
  31545. WOLFSSL_MSG(
  31546. "X25519 ephemeral key not made correctly");
  31547. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  31548. }
  31549. if (ssl->peerX25519Key == NULL) {
  31550. /* alloc/init on demand */
  31551. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  31552. (void**)&ssl->peerX25519Key);
  31553. if (ret != 0) {
  31554. goto exit_dcke;
  31555. }
  31556. } else if (ssl->peerX25519KeyPresent) {
  31557. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  31558. ssl->peerX25519Key);
  31559. ssl->peerX25519KeyPresent = 0;
  31560. if (ret != 0) {
  31561. goto exit_dcke;
  31562. }
  31563. }
  31564. if ((ret = wc_curve25519_check_public(
  31565. input + args->idx, args->length,
  31566. EC25519_LITTLE_ENDIAN)) != 0) {
  31567. #ifdef WOLFSSL_EXTRA_ALERTS
  31568. if (ret == BUFFER_E)
  31569. SendAlert(ssl, alert_fatal, decode_error);
  31570. else if (ret == ECC_OUT_OF_RANGE_E)
  31571. SendAlert(ssl, alert_fatal, bad_record_mac);
  31572. else {
  31573. SendAlert(ssl, alert_fatal,
  31574. illegal_parameter);
  31575. }
  31576. #endif
  31577. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31578. }
  31579. if (wc_curve25519_import_public_ex(
  31580. input + args->idx, args->length,
  31581. ssl->peerX25519Key,
  31582. EC25519_LITTLE_ENDIAN)) {
  31583. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31584. }
  31585. ssl->peerX25519KeyPresent = 1;
  31586. break;
  31587. }
  31588. #endif
  31589. #ifdef HAVE_CURVE448
  31590. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  31591. #ifdef HAVE_PK_CALLBACKS
  31592. /* if callback then use it for shared secret */
  31593. if (ssl->ctx->X448SharedSecretCb != NULL) {
  31594. break;
  31595. }
  31596. #endif
  31597. if (ssl->eccTempKeyPresent == 0) {
  31598. WOLFSSL_MSG(
  31599. "X448 ephemeral key not made correctly");
  31600. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  31601. }
  31602. if (ssl->peerX448Key == NULL) {
  31603. /* alloc/init on demand */
  31604. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  31605. (void**)&ssl->peerX448Key);
  31606. if (ret != 0) {
  31607. goto exit_dcke;
  31608. }
  31609. } else if (ssl->peerX448KeyPresent) {
  31610. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  31611. ssl->peerX448Key);
  31612. ssl->peerX448KeyPresent = 0;
  31613. if (ret != 0) {
  31614. goto exit_dcke;
  31615. }
  31616. }
  31617. if ((ret = wc_curve448_check_public(
  31618. input + args->idx, args->length,
  31619. EC448_LITTLE_ENDIAN)) != 0) {
  31620. #ifdef WOLFSSL_EXTRA_ALERTS
  31621. if (ret == BUFFER_E)
  31622. SendAlert(ssl, alert_fatal, decode_error);
  31623. else if (ret == ECC_OUT_OF_RANGE_E)
  31624. SendAlert(ssl, alert_fatal, bad_record_mac);
  31625. else {
  31626. SendAlert(ssl, alert_fatal,
  31627. illegal_parameter);
  31628. }
  31629. #endif
  31630. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31631. }
  31632. if (wc_curve448_import_public_ex(
  31633. input + args->idx, args->length,
  31634. ssl->peerX448Key,
  31635. EC448_LITTLE_ENDIAN)) {
  31636. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31637. }
  31638. ssl->peerX448KeyPresent = 1;
  31639. break;
  31640. }
  31641. #endif
  31642. #ifdef HAVE_PK_CALLBACKS
  31643. /* if callback then use it for shared secret */
  31644. if (ssl->ctx->EccSharedSecretCb != NULL) {
  31645. break;
  31646. }
  31647. #endif
  31648. if (ssl->eccTempKeyPresent == 0) {
  31649. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  31650. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  31651. }
  31652. if (ssl->peerEccKey == NULL) {
  31653. /* alloc/init on demand */
  31654. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  31655. (void**)&ssl->peerEccKey);
  31656. if (ret != 0) {
  31657. goto exit_dcke;
  31658. }
  31659. }
  31660. else if (ssl->peerEccKeyPresent) {
  31661. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  31662. ssl->peerEccKey);
  31663. ssl->peerEccKeyPresent = 0;
  31664. if (ret != 0) {
  31665. goto exit_dcke;
  31666. }
  31667. }
  31668. if (wc_ecc_import_x963_ex(input + args->idx,
  31669. args->length, ssl->peerEccKey,
  31670. ssl->eccTempKey->dp->id)) {
  31671. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  31672. }
  31673. ssl->peerEccKeyPresent = 1;
  31674. break;
  31675. }
  31676. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  31677. default:
  31678. ret = BAD_KEA_TYPE_E;
  31679. } /* switch (ssl->specs.kea) */
  31680. /* Check for error */
  31681. if (ret != 0) {
  31682. goto exit_dcke;
  31683. }
  31684. /* Advance state and proceed */
  31685. ssl->options.asyncState = TLS_ASYNC_DO;
  31686. } /* TLS_ASYNC_BUILD */
  31687. FALL_THROUGH;
  31688. case TLS_ASYNC_DO:
  31689. {
  31690. switch (ssl->specs.kea) {
  31691. #ifndef NO_RSA
  31692. case rsa_kea:
  31693. {
  31694. RsaKey* key = (RsaKey*)ssl->hsKey;
  31695. ret = RsaDec(ssl,
  31696. input + args->idx,
  31697. args->length,
  31698. &args->output,
  31699. &args->sigSz,
  31700. key,
  31701. #ifdef HAVE_PK_CALLBACKS
  31702. ssl->buffers.key
  31703. #else
  31704. NULL
  31705. #endif
  31706. );
  31707. /* Errors that can occur here that should be
  31708. * indistinguishable:
  31709. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  31710. */
  31711. #ifdef WOLFSSL_ASYNC_CRYPT
  31712. if (ret == WC_PENDING_E)
  31713. goto exit_dcke;
  31714. #endif
  31715. if (ret == BAD_FUNC_ARG)
  31716. goto exit_dcke;
  31717. args->lastErr = ret - (SECRET_LEN - args->sigSz);
  31718. ret = 0;
  31719. break;
  31720. } /* rsa_kea */
  31721. #endif /* !NO_RSA */
  31722. #ifndef NO_PSK
  31723. case psk_kea:
  31724. {
  31725. break;
  31726. }
  31727. #endif /* !NO_PSK */
  31728. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31729. defined(HAVE_CURVE448)
  31730. case ecc_diffie_hellman_kea:
  31731. {
  31732. void* private_key = ssl->eccTempKey;
  31733. (void)private_key;
  31734. #ifdef HAVE_CURVE25519
  31735. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  31736. ret = X25519SharedSecret(ssl,
  31737. (curve25519_key*)private_key,
  31738. ssl->peerX25519Key,
  31739. input + args->idx, &args->length,
  31740. ssl->arrays->preMasterSecret,
  31741. &ssl->arrays->preMasterSz,
  31742. WOLFSSL_SERVER_END
  31743. );
  31744. break;
  31745. }
  31746. #endif
  31747. #ifdef HAVE_CURVE448
  31748. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  31749. ret = X448SharedSecret(ssl,
  31750. (curve448_key*)private_key,
  31751. ssl->peerX448Key,
  31752. input + args->idx, &args->length,
  31753. ssl->arrays->preMasterSecret,
  31754. &ssl->arrays->preMasterSz,
  31755. WOLFSSL_SERVER_END
  31756. );
  31757. break;
  31758. }
  31759. #endif
  31760. #ifdef HAVE_ECC
  31761. if (ssl->specs.static_ecdh) {
  31762. private_key = ssl->hsKey;
  31763. }
  31764. /* Generate shared secret */
  31765. ret = EccSharedSecret(ssl,
  31766. (ecc_key*)private_key, ssl->peerEccKey,
  31767. input + args->idx, &args->length,
  31768. ssl->arrays->preMasterSecret,
  31769. &ssl->arrays->preMasterSz,
  31770. WOLFSSL_SERVER_END
  31771. );
  31772. #ifdef WOLFSSL_ASYNC_CRYPT
  31773. if (ret != WC_PENDING_E)
  31774. #endif
  31775. {
  31776. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  31777. (void**)&ssl->peerEccKey);
  31778. ssl->peerEccKeyPresent = 0;
  31779. }
  31780. #endif
  31781. break;
  31782. }
  31783. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  31784. #ifndef NO_DH
  31785. case diffie_hellman_kea:
  31786. {
  31787. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  31788. ssl->buffers.serverDH_Priv.buffer,
  31789. ssl->buffers.serverDH_Priv.length,
  31790. input + args->idx,
  31791. (word16)args->sigSz,
  31792. ssl->arrays->preMasterSecret,
  31793. &ssl->arrays->preMasterSz,
  31794. ssl->buffers.serverDH_P.buffer,
  31795. ssl->buffers.serverDH_P.length);
  31796. break;
  31797. }
  31798. #endif /* !NO_DH */
  31799. #if !defined(NO_DH) && !defined(NO_PSK)
  31800. case dhe_psk_kea:
  31801. {
  31802. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  31803. ssl->buffers.serverDH_Priv.buffer,
  31804. ssl->buffers.serverDH_Priv.length,
  31805. input + args->idx,
  31806. (word16)args->sigSz,
  31807. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  31808. &ssl->arrays->preMasterSz,
  31809. ssl->buffers.serverDH_P.buffer,
  31810. ssl->buffers.serverDH_P.length);
  31811. break;
  31812. }
  31813. #endif /* !NO_DH && !NO_PSK */
  31814. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31815. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  31816. case ecdhe_psk_kea:
  31817. {
  31818. #ifdef HAVE_CURVE25519
  31819. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  31820. ret = X25519SharedSecret(ssl,
  31821. (curve25519_key*)ssl->eccTempKey,
  31822. ssl->peerX25519Key,
  31823. input + args->idx, &args->length,
  31824. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  31825. &args->sigSz,
  31826. WOLFSSL_SERVER_END
  31827. );
  31828. #ifdef WOLFSSL_ASYNC_CRYPT
  31829. if (ret != WC_PENDING_E)
  31830. #endif
  31831. {
  31832. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  31833. (void**)&ssl->peerX25519Key);
  31834. ssl->peerX25519KeyPresent = 0;
  31835. }
  31836. break;
  31837. }
  31838. #endif
  31839. #ifdef HAVE_CURVE448
  31840. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  31841. ret = X448SharedSecret(ssl,
  31842. (curve448_key*)ssl->eccTempKey,
  31843. ssl->peerX448Key,
  31844. input + args->idx, &args->length,
  31845. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  31846. &args->sigSz,
  31847. WOLFSSL_SERVER_END
  31848. );
  31849. #ifdef WOLFSSL_ASYNC_CRYPT
  31850. if (ret != WC_PENDING_E)
  31851. #endif
  31852. {
  31853. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  31854. (void**)&ssl->peerX448Key);
  31855. ssl->peerX448KeyPresent = 0;
  31856. }
  31857. break;
  31858. }
  31859. #endif
  31860. /* Generate shared secret */
  31861. ret = EccSharedSecret(ssl,
  31862. ssl->eccTempKey, ssl->peerEccKey,
  31863. input + args->idx, &args->length,
  31864. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  31865. &args->sigSz,
  31866. WOLFSSL_SERVER_END
  31867. );
  31868. if (!ssl->specs.static_ecdh
  31869. #ifdef WOLFSSL_ASYNC_CRYPT
  31870. && ret != WC_PENDING_E
  31871. #endif
  31872. ) {
  31873. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  31874. (void**)&ssl->peerEccKey);
  31875. ssl->peerEccKeyPresent = 0;
  31876. }
  31877. break;
  31878. }
  31879. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  31880. default:
  31881. ret = BAD_KEA_TYPE_E;
  31882. } /* switch (ssl->specs.kea) */
  31883. /* Check for error */
  31884. if (ret != 0) {
  31885. goto exit_dcke;
  31886. }
  31887. /* Advance state and proceed */
  31888. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  31889. } /* TLS_ASYNC_DO */
  31890. FALL_THROUGH;
  31891. case TLS_ASYNC_VERIFY:
  31892. {
  31893. switch (ssl->specs.kea) {
  31894. #ifndef NO_RSA
  31895. case rsa_kea:
  31896. {
  31897. byte *tmpRsa;
  31898. byte mask;
  31899. int i;
  31900. /* Add the signature length to idx */
  31901. args->idx += args->length;
  31902. #ifdef DEBUG_WOLFSSL
  31903. /* check version (debug warning message only) */
  31904. if (args->output != NULL) {
  31905. if (args->output[0] != ssl->chVersion.major ||
  31906. args->output[1] != ssl->chVersion.minor) {
  31907. WOLFSSL_MSG("preMasterSecret version mismatch");
  31908. }
  31909. }
  31910. #endif
  31911. /* RFC5246 7.4.7.1:
  31912. * Treat incorrectly formatted message blocks and/or
  31913. * mismatched version numbers in a manner
  31914. * indistinguishable from correctly formatted RSA blocks
  31915. */
  31916. ret = args->lastErr;
  31917. args->lastErr = 0; /* reset */
  31918. /* On error 'ret' will be negative */
  31919. mask = ((unsigned int)ret >>
  31920. ((sizeof(ret) * 8) - 1)) - 1;
  31921. /* build PreMasterSecret */
  31922. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  31923. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  31924. tmpRsa = input + args->idx - VERSION_SZ - SECRET_LEN;
  31925. ctMaskCopy(~mask, (byte*)&args->output, (byte*)&tmpRsa,
  31926. sizeof(args->output));
  31927. if (args->output != NULL) {
  31928. /* Use random secret on error */
  31929. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  31930. ssl->arrays->preMasterSecret[i] =
  31931. ctMaskSel(mask, args->output[i],
  31932. ssl->arrays->preMasterSecret[i]);
  31933. }
  31934. }
  31935. /* preMasterSecret has RNG and version set
  31936. * return proper length and ignore error
  31937. * error will be caught as decryption error
  31938. */
  31939. args->sigSz = SECRET_LEN;
  31940. ret = 0;
  31941. break;
  31942. } /* rsa_kea */
  31943. #endif /* !NO_RSA */
  31944. #ifndef NO_PSK
  31945. case psk_kea:
  31946. {
  31947. break;
  31948. }
  31949. #endif /* !NO_PSK */
  31950. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31951. defined(HAVE_CURVE448)
  31952. case ecc_diffie_hellman_kea:
  31953. {
  31954. /* skip past the imported peer key */
  31955. args->idx += args->length;
  31956. break;
  31957. }
  31958. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  31959. #ifndef NO_DH
  31960. case diffie_hellman_kea:
  31961. {
  31962. args->idx += (word16)args->sigSz;
  31963. break;
  31964. }
  31965. #endif /* !NO_DH */
  31966. #if !defined(NO_DH) && !defined(NO_PSK)
  31967. case dhe_psk_kea:
  31968. {
  31969. byte* pms = ssl->arrays->preMasterSecret;
  31970. word16 clientSz = (word16)args->sigSz;
  31971. args->idx += clientSz;
  31972. c16toa((word16)ssl->arrays->preMasterSz, pms);
  31973. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  31974. pms += ssl->arrays->preMasterSz;
  31975. /* Use the PSK hint to look up the PSK and add it to the
  31976. * preMasterSecret here. */
  31977. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  31978. ssl->arrays->client_identity, ssl->arrays->psk_key,
  31979. MAX_PSK_KEY_LEN);
  31980. if (ssl->arrays->psk_keySz == 0 ||
  31981. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  31982. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  31983. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  31984. SendAlert(ssl, alert_fatal,
  31985. unknown_psk_identity);
  31986. #endif
  31987. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31988. }
  31989. /* SERVER: Pre-shared Key for peer authentication. */
  31990. ssl->options.peerAuthGood = 1;
  31991. c16toa((word16) ssl->arrays->psk_keySz, pms);
  31992. pms += OPAQUE16_LEN;
  31993. XMEMCPY(pms, ssl->arrays->psk_key,
  31994. ssl->arrays->psk_keySz);
  31995. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
  31996. OPAQUE16_LEN;
  31997. break;
  31998. }
  31999. #endif /* !NO_DH && !NO_PSK */
  32000. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  32001. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  32002. case ecdhe_psk_kea:
  32003. {
  32004. byte* pms = ssl->arrays->preMasterSecret;
  32005. word16 clientSz = (word16)args->sigSz;
  32006. /* skip past the imported peer key */
  32007. args->idx += args->length;
  32008. /* Add preMasterSecret */
  32009. c16toa(clientSz, pms);
  32010. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  32011. pms += ssl->arrays->preMasterSz;
  32012. /* Use the PSK hint to look up the PSK and add it to the
  32013. * preMasterSecret here. */
  32014. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  32015. ssl->arrays->client_identity, ssl->arrays->psk_key,
  32016. MAX_PSK_KEY_LEN);
  32017. if (ssl->arrays->psk_keySz == 0 ||
  32018. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  32019. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  32020. }
  32021. /* SERVER: Pre-shared Key for peer authentication. */
  32022. ssl->options.peerAuthGood = 1;
  32023. c16toa((word16) ssl->arrays->psk_keySz, pms);
  32024. pms += OPAQUE16_LEN;
  32025. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  32026. ssl->arrays->preMasterSz +=
  32027. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  32028. break;
  32029. }
  32030. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  32031. default:
  32032. ret = BAD_KEA_TYPE_E;
  32033. } /* switch (ssl->specs.kea) */
  32034. /* Check for error */
  32035. if (ret != 0) {
  32036. goto exit_dcke;
  32037. }
  32038. /* Advance state and proceed */
  32039. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  32040. } /* TLS_ASYNC_VERIFY */
  32041. FALL_THROUGH;
  32042. case TLS_ASYNC_FINALIZE:
  32043. {
  32044. if (IsEncryptionOn(ssl, 0)) {
  32045. args->idx += ssl->keys.padSz;
  32046. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  32047. if (ssl->options.startedETMRead)
  32048. args->idx += MacSize(ssl);
  32049. #endif
  32050. }
  32051. ret = MakeMasterSecret(ssl);
  32052. /* Check for error */
  32053. if (ret != 0) {
  32054. goto exit_dcke;
  32055. }
  32056. /* Advance state and proceed */
  32057. ssl->options.asyncState = TLS_ASYNC_END;
  32058. } /* TLS_ASYNC_FINALIZE */
  32059. FALL_THROUGH;
  32060. case TLS_ASYNC_END:
  32061. {
  32062. /* Set final index */
  32063. *inOutIdx = args->idx;
  32064. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  32065. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  32066. if (ssl->options.verifyPeer) {
  32067. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  32068. }
  32069. #endif
  32070. break;
  32071. } /* TLS_ASYNC_END */
  32072. default:
  32073. ret = INPUT_CASE_ERROR;
  32074. } /* switch(ssl->options.asyncState) */
  32075. exit_dcke:
  32076. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  32077. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  32078. #ifdef WOLFSSL_ASYNC_CRYPT
  32079. /* Handle async operation */
  32080. if (ret == WC_PENDING_E) {
  32081. /* Mark message as not received so it can process again */
  32082. ssl->msgsReceived.got_client_key_exchange = 0;
  32083. return ret;
  32084. }
  32085. /* Cleanup async */
  32086. FreeAsyncCtx(ssl, 0);
  32087. #else
  32088. FreeDckeArgs(ssl, args);
  32089. #endif /* WOLFSSL_ASYNC_CRYPT */
  32090. #ifdef OPENSSL_ALL
  32091. /* add error ret value to error queue */
  32092. if (ret != 0) {
  32093. WOLFSSL_ERROR(ret);
  32094. }
  32095. #endif
  32096. /* Cleanup PMS */
  32097. if (ssl->arrays->preMasterSecret != NULL) {
  32098. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  32099. }
  32100. ssl->arrays->preMasterSz = 0;
  32101. /* Final cleanup */
  32102. FreeKeyExchange(ssl);
  32103. return ret;
  32104. }
  32105. #endif /* !WOLFSSL_NO_TLS12 */
  32106. #ifdef HAVE_SNI
  32107. int SNI_Callback(WOLFSSL* ssl)
  32108. {
  32109. int ad = 0;
  32110. int sniRet = 0;
  32111. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  32112. * when SNI is received. Call it now if exists */
  32113. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  32114. WOLFSSL_MSG("Calling custom sni callback");
  32115. sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg);
  32116. switch (sniRet) {
  32117. case warning_return:
  32118. WOLFSSL_MSG("Error in custom sni callback. Warning alert");
  32119. SendAlert(ssl, alert_warning, ad);
  32120. break;
  32121. case fatal_return:
  32122. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  32123. SendAlert(ssl, alert_fatal, ad);
  32124. return FATAL_ERROR;
  32125. case noack_return:
  32126. WOLFSSL_MSG("Server quietly not acking servername.");
  32127. break;
  32128. default:
  32129. break;
  32130. }
  32131. }
  32132. return 0;
  32133. }
  32134. #endif /* HAVE_SNI */
  32135. #endif /* NO_WOLFSSL_SERVER */
  32136. #ifdef WOLFSSL_ASYNC_CRYPT
  32137. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  32138. {
  32139. int ret = 0;
  32140. WC_ASYNC_DEV* asyncDev;
  32141. WOLF_EVENT* event;
  32142. if (ssl == NULL) {
  32143. return BAD_FUNC_ARG;
  32144. }
  32145. /* check for pending async */
  32146. asyncDev = ssl->asyncDev;
  32147. if (asyncDev) {
  32148. /* grab event pointer */
  32149. event = &asyncDev->event;
  32150. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  32151. if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) {
  32152. /* advance key share state if doesn't need called again */
  32153. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  32154. (*state)++;
  32155. }
  32156. /* clear event */
  32157. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  32158. /* clear async dev */
  32159. ssl->asyncDev = NULL;
  32160. }
  32161. }
  32162. else {
  32163. ret = WC_NOT_PENDING_E;
  32164. }
  32165. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  32166. return ret;
  32167. }
  32168. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  32169. {
  32170. int ret;
  32171. WOLF_EVENT* event;
  32172. if (ssl == NULL || asyncDev == NULL) {
  32173. return BAD_FUNC_ARG;
  32174. }
  32175. /* grab event pointer */
  32176. event = &asyncDev->event;
  32177. /* init event */
  32178. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  32179. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  32180. return ret;
  32181. }
  32182. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  32183. {
  32184. int ret;
  32185. WOLF_EVENT* event;
  32186. if (ssl == NULL || asyncDev == NULL) {
  32187. return BAD_FUNC_ARG;
  32188. }
  32189. /* grab event pointer */
  32190. event = &asyncDev->event;
  32191. /* store reference to active async operation */
  32192. ssl->asyncDev = asyncDev;
  32193. /* place event into queue */
  32194. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  32195. /* success means return WC_PENDING_E */
  32196. if (ret == 0) {
  32197. ret = WC_PENDING_E;
  32198. }
  32199. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  32200. return ret;
  32201. }
  32202. #endif /* WOLFSSL_ASYNC_CRYPT */
  32203. /**
  32204. * Return the max fragment size. This is essentially the maximum
  32205. * fragment_length available.
  32206. * @param ssl WOLFSSL object containing ciphersuite information.
  32207. * @param maxFragment The amount of space we want to check is available. This
  32208. * is only the fragment length WITHOUT the (D)TLS headers.
  32209. * @return Max fragment size
  32210. */
  32211. int wolfSSL_GetMaxFragSize(WOLFSSL* ssl, int maxFragment)
  32212. {
  32213. (void) ssl; /* Avoid compiler warnings */
  32214. if (maxFragment > MAX_RECORD_SIZE) {
  32215. maxFragment = MAX_RECORD_SIZE;
  32216. }
  32217. #ifdef HAVE_MAX_FRAGMENT
  32218. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  32219. maxFragment = ssl->max_fragment;
  32220. }
  32221. #endif /* HAVE_MAX_FRAGMENT */
  32222. #ifdef WOLFSSL_DTLS
  32223. if (IsDtlsNotSctpMode(ssl)) {
  32224. int outputSz, mtuSz;
  32225. /* Given a input buffer size of maxFragment, how big will the
  32226. * encrypted output be? */
  32227. if (IsEncryptionOn(ssl, 1)) {
  32228. outputSz = BuildMessage(ssl, NULL, 0, NULL,
  32229. maxFragment + DTLS_HANDSHAKE_HEADER_SZ,
  32230. application_data, 0, 1, 0, CUR_ORDER);
  32231. }
  32232. else {
  32233. outputSz = maxFragment + DTLS_RECORD_HEADER_SZ +
  32234. DTLS_HANDSHAKE_HEADER_SZ;
  32235. }
  32236. /* Readjust maxFragment for MTU size. */
  32237. #if defined(WOLFSSL_DTLS_MTU)
  32238. mtuSz = ssl->dtlsMtuSz;
  32239. #else
  32240. mtuSz = MAX_MTU;
  32241. #endif
  32242. maxFragment = ModifyForMTU(ssl, maxFragment, outputSz, mtuSz);
  32243. }
  32244. #endif
  32245. return maxFragment;
  32246. }
  32247. #if defined(WOLFSSL_IOTSAFE) && defined(HAVE_PK_CALLBACKS)
  32248. IOTSAFE *wolfSSL_get_iotsafe_ctx(WOLFSSL *ssl)
  32249. {
  32250. if (ssl == NULL)
  32251. return NULL;
  32252. return &ssl->iotsafe;
  32253. }
  32254. int wolfSSL_set_iotsafe_ctx(WOLFSSL *ssl, IOTSAFE *iotsafe)
  32255. {
  32256. if ((ssl == NULL) || (iotsafe == NULL))
  32257. return BAD_FUNC_ARG;
  32258. XMEMCPY(&ssl->iotsafe, iotsafe, sizeof(IOTSAFE));
  32259. return 0;
  32260. }
  32261. #endif
  32262. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  32263. /* create an instance of WOLFSSL_BY_DIR_HASH structure */
  32264. WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void)
  32265. {
  32266. WOLFSSL_BY_DIR_HASH* dir_hash;
  32267. WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new");
  32268. dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL,
  32269. DYNAMIC_TYPE_OPENSSL);
  32270. if (dir_hash) {
  32271. XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH));
  32272. }
  32273. return dir_hash;
  32274. }
  32275. /* release a WOLFSSL_BY_DIR_HASH resource */
  32276. void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash)
  32277. {
  32278. if (dir_hash == NULL)
  32279. return;
  32280. XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL);
  32281. }
  32282. /* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */
  32283. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void)
  32284. {
  32285. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  32286. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null");
  32287. if (sk) {
  32288. sk->type = STACK_TYPE_BY_DIR_hash;
  32289. }
  32290. return sk;
  32291. }
  32292. /* returns value less than 0 on fail to match
  32293. * On a successful match the priority level found is returned
  32294. */
  32295. int wolfSSL_sk_BY_DIR_HASH_find(
  32296. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind)
  32297. {
  32298. WOLFSSL_STACK* next;
  32299. int i, sz;
  32300. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find");
  32301. if (sk == NULL || toFind == NULL) {
  32302. return WOLFSSL_FAILURE;
  32303. }
  32304. sz = wolfSSL_sk_BY_DIR_HASH_num(sk);
  32305. next = sk;
  32306. for (i = 0; i < sz && next != NULL; i++) {
  32307. if (next->data.dir_hash->hash_value == toFind->hash_value) {
  32308. return sz - i; /* reverse because stack pushed highest on first */
  32309. }
  32310. next = next->next;
  32311. }
  32312. return -1;
  32313. }
  32314. /* return a number of WOLFSSL_BY_DIR_HASH in stack */
  32315. int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  32316. {
  32317. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num");
  32318. if (sk == NULL)
  32319. return -1;
  32320. return (int)sk->num;
  32321. }
  32322. /* return WOLFSSL_BY_DIR_HASH instance at i */
  32323. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value(
  32324. const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i)
  32325. {
  32326. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value");
  32327. for (; sk != NULL && i > 0; i--)
  32328. sk = sk->next;
  32329. if (i != 0 || sk == NULL)
  32330. return NULL;
  32331. return sk->data.dir_hash;
  32332. }
  32333. /* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */
  32334. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop(
  32335. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk)
  32336. {
  32337. WOLFSSL_STACK* node;
  32338. WOLFSSL_BY_DIR_HASH* hash;
  32339. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop");
  32340. if (sk == NULL) {
  32341. return NULL;
  32342. }
  32343. node = sk->next;
  32344. hash = sk->data.dir_hash;
  32345. if (node != NULL) { /* update sk and remove node from stack */
  32346. sk->data.dir_hash = node->data.dir_hash;
  32347. sk->next = node->next;
  32348. wolfSSL_sk_free_node(node);
  32349. }
  32350. else { /* last x509 in stack */
  32351. sk->data.dir_hash = NULL;
  32352. }
  32353. if (sk->num > 0) {
  32354. sk->num -= 1;
  32355. }
  32356. return hash;
  32357. }
  32358. /* release all contents in stack, and then release stack itself. */
  32359. /* Second argument is a function pointer to release resouces. */
  32360. /* It calls the function to release resouces when t is passed */
  32361. /* instead of wolfSSL_BY_DIR_HASH_free(). */
  32362. void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk,
  32363. void (*f) (WOLFSSL_BY_DIR_HASH*))
  32364. {
  32365. WOLFSSL_STACK* node;
  32366. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free");
  32367. if (sk == NULL) {
  32368. return;
  32369. }
  32370. /* parse through stack freeing each node */
  32371. node = sk->next;
  32372. while (node && sk->num > 1) {
  32373. WOLFSSL_STACK* tmp = node;
  32374. node = node->next;
  32375. if (f)
  32376. f(tmp->data.dir_hash);
  32377. else
  32378. wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash);
  32379. tmp->data.dir_hash = NULL;
  32380. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  32381. sk->num -= 1;
  32382. }
  32383. /* free head of stack */
  32384. if (sk->num == 1) {
  32385. if (f)
  32386. f(sk->data.dir_hash);
  32387. else
  32388. wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash);
  32389. sk->data.dir_hash = NULL;
  32390. }
  32391. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  32392. }
  32393. /* release all contents in stack, and then release stack itself */
  32394. void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  32395. {
  32396. wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL);
  32397. }
  32398. /* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and
  32399. * tries to free it when the stack is free'd.
  32400. *
  32401. * return 1 on success 0 on fail
  32402. */
  32403. int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk,
  32404. WOLFSSL_BY_DIR_HASH* in)
  32405. {
  32406. WOLFSSL_STACK* node;
  32407. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push");
  32408. if (sk == NULL || in == NULL) {
  32409. return WOLFSSL_FAILURE;
  32410. }
  32411. /* no previous values in stack */
  32412. if (sk->data.dir_hash == NULL) {
  32413. sk->data.dir_hash = in;
  32414. sk->num += 1;
  32415. return WOLFSSL_SUCCESS;
  32416. }
  32417. /* stack already has value(s) create a new node and add more */
  32418. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  32419. DYNAMIC_TYPE_OPENSSL);
  32420. if (node == NULL) {
  32421. WOLFSSL_MSG("Memory error");
  32422. return WOLFSSL_FAILURE;
  32423. }
  32424. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  32425. /* push new obj onto head of stack */
  32426. node->data.dir_hash = sk->data.dir_hash;
  32427. node->next = sk->next;
  32428. node->type = sk->type;
  32429. sk->next = node;
  32430. sk->data.dir_hash = in;
  32431. sk->num += 1;
  32432. return WOLFSSL_SUCCESS;
  32433. }
  32434. /* create an instance of WOLFSSL_BY_DIR_entry structure */
  32435. WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void)
  32436. {
  32437. WOLFSSL_BY_DIR_entry* entry;
  32438. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new");
  32439. entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL,
  32440. DYNAMIC_TYPE_OPENSSL);
  32441. if (entry) {
  32442. XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry));
  32443. }
  32444. return entry;
  32445. }
  32446. /* release a WOLFSSL_BY_DIR_entry resource */
  32447. void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry)
  32448. {
  32449. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free");
  32450. if (entry == NULL)
  32451. return;
  32452. if (entry->hashes) {
  32453. wolfSSL_sk_BY_DIR_HASH_free(entry->hashes);
  32454. }
  32455. if (entry->dir_name != NULL) {
  32456. XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL);
  32457. }
  32458. XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL);
  32459. }
  32460. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void)
  32461. {
  32462. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  32463. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null");
  32464. if (sk) {
  32465. sk->type = STACK_TYPE_BY_DIR_entry;
  32466. }
  32467. return sk;
  32468. }
  32469. /* return a number of WOLFSSL_BY_DIR_entry in stack */
  32470. int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk)
  32471. {
  32472. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num");
  32473. if (sk == NULL)
  32474. return -1;
  32475. return (int)sk->num;
  32476. }
  32477. /* return WOLFSSL_BY_DIR_entry instance at i */
  32478. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value(
  32479. const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i)
  32480. {
  32481. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value");
  32482. for (; sk != NULL && i > 0; i--)
  32483. sk = sk->next;
  32484. if (i != 0 || sk == NULL)
  32485. return NULL;
  32486. return sk->data.dir_entry;
  32487. }
  32488. /* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */
  32489. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop(
  32490. WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk)
  32491. {
  32492. WOLFSSL_STACK* node;
  32493. WOLFSSL_BY_DIR_entry* entry;
  32494. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop");
  32495. if (sk == NULL) {
  32496. return NULL;
  32497. }
  32498. node = sk->next;
  32499. entry = sk->data.dir_entry;
  32500. if (node != NULL) { /* update sk and remove node from stack */
  32501. sk->data.dir_entry = node->data.dir_entry;
  32502. sk->next = node->next;
  32503. wolfSSL_sk_free_node(node);
  32504. }
  32505. else { /* last x509 in stack */
  32506. sk->data.dir_entry = NULL;
  32507. }
  32508. if (sk->num > 0) {
  32509. sk->num -= 1;
  32510. }
  32511. return entry;
  32512. }
  32513. /* release all contents in stack, and then release stack itself. */
  32514. /* Second argument is a function pointer to release resouces. */
  32515. /* It calls the function to release resouces when t is passed */
  32516. /* instead of wolfSSL_BY_DIR_entry_free(). */
  32517. void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  32518. void (*f) (WOLFSSL_BY_DIR_entry*))
  32519. {
  32520. WOLFSSL_STACK* node;
  32521. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free");
  32522. if (sk == NULL) {
  32523. return;
  32524. }
  32525. /* parse through stack freeing each node */
  32526. node = sk->next;
  32527. while (node && sk->num > 1) {
  32528. WOLFSSL_STACK* tmp = node;
  32529. node = node->next;
  32530. if (f)
  32531. f(tmp->data.dir_entry);
  32532. else
  32533. wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry);
  32534. tmp->data.dir_entry = NULL;
  32535. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  32536. sk->num -= 1;
  32537. }
  32538. /* free head of stack */
  32539. if (sk->num == 1) {
  32540. if (f)
  32541. f(sk->data.dir_entry);
  32542. else
  32543. wolfSSL_BY_DIR_entry_free(sk->data.dir_entry);
  32544. sk->data.dir_entry = NULL;
  32545. }
  32546. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  32547. }
  32548. /* release all contents in stack, and then release stack itself */
  32549. void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk)
  32550. {
  32551. wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL);
  32552. }
  32553. /* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and
  32554. * tries to free it when the stack is free'd.
  32555. *
  32556. * return 1 on success 0 on fail
  32557. */
  32558. int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  32559. WOLFSSL_BY_DIR_entry* in)
  32560. {
  32561. WOLFSSL_STACK* node;
  32562. if (sk == NULL || in == NULL) {
  32563. return WOLFSSL_FAILURE;
  32564. }
  32565. /* no previous values in stack */
  32566. if (sk->data.dir_entry == NULL) {
  32567. sk->data.dir_entry = in;
  32568. sk->num += 1;
  32569. return WOLFSSL_SUCCESS;
  32570. }
  32571. /* stack already has value(s) create a new node and add more */
  32572. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  32573. DYNAMIC_TYPE_OPENSSL);
  32574. if (node == NULL) {
  32575. WOLFSSL_MSG("Memory error");
  32576. return WOLFSSL_FAILURE;
  32577. }
  32578. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  32579. /* push new obj onto head of stack */
  32580. node->data.dir_entry = sk->data.dir_entry;
  32581. node->next = sk->next;
  32582. node->type = sk->type;
  32583. sk->next = node;
  32584. sk->data.dir_entry = in;
  32585. sk->num += 1;
  32586. return WOLFSSL_SUCCESS;
  32587. }
  32588. #endif /* OPENSSL_ALL */
  32589. #undef ERROR_OUT
  32590. #endif /* WOLFCRYPT_ONLY */