internal.c 1.2 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287
  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. */
  75. #ifdef EXTERNAL_OPTS_OPENVPN
  76. #error EXTERNAL_OPTS_OPENVPN should not be defined\
  77. when building wolfSSL
  78. #endif
  79. #ifndef WOLFCRYPT_ONLY
  80. #include <wolfssl/internal.h>
  81. #include <wolfssl/error-ssl.h>
  82. #include <wolfssl/wolfcrypt/asn.h>
  83. #include <wolfssl/wolfcrypt/dh.h>
  84. #ifdef NO_INLINE
  85. #include <wolfssl/wolfcrypt/misc.h>
  86. #else
  87. #define WOLFSSL_MISC_INCLUDED
  88. #include <wolfcrypt/src/misc.c>
  89. #endif
  90. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
  91. #include <wolfssl/wolfcrypt/srp.h>
  92. #endif
  93. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  94. #include <wolfssl/wolfcrypt/coding.h>
  95. #endif
  96. #ifdef HAVE_LIBZ
  97. #include "zlib.h"
  98. #endif
  99. #ifdef WOLFSSL_QNX_CAAM
  100. /* included to get CAAM devId value */
  101. #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
  102. #endif
  103. #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
  104. defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
  105. #ifndef NO_STDIO_FILESYSTEM
  106. #ifdef FUSION_RTOS
  107. #include <fclstdio.h>
  108. #else
  109. #include <stdio.h>
  110. #endif
  111. #endif
  112. #endif
  113. #ifdef __sun
  114. #include <sys/filio.h>
  115. #endif
  116. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  117. #ifdef _MSC_VER
  118. /* disable for while(0) cases at the .c level for now */
  119. #pragma warning(disable:4127)
  120. #endif
  121. #if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
  122. #error \
  123. WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
  124. #endif
  125. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
  126. #error Cannot use both secure-renegotiation and renegotiation-indication
  127. #endif
  128. #ifndef WOLFSSL_NO_TLS12
  129. #ifndef NO_WOLFSSL_CLIENT
  130. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  131. word32* inOutIdx, word32 size);
  132. #ifndef NO_CERTS
  133. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input,
  134. word32* inOutIdx, word32 size);
  135. #endif
  136. #ifdef HAVE_SESSION_TICKET
  137. static int DoSessionTicket(WOLFSSL* ssl, const byte* input,
  138. word32* inOutIdx, word32 size);
  139. #endif
  140. #endif
  141. #ifndef NO_WOLFSSL_SERVER
  142. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input,
  143. word32* inOutIdx, word32 size);
  144. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  145. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  146. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  147. word32* inOutIdx, word32 size);
  148. #endif
  149. #ifdef WOLFSSL_DTLS
  150. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  151. const byte* cookie, byte cookieSz);
  152. #endif /* WOLFSSL_DTLS */
  153. #endif /* !NO_WOLFSSL_SERVER */
  154. #endif /* !WOLFSSL_NO_TLS12 */
  155. #ifndef NO_WOLFSSL_SERVER
  156. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  157. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx,
  158. TicketEncCbCtx* keyCtx);
  159. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx);
  160. static int DefTicketEncCb(WOLFSSL* ssl,
  161. byte key_name[WOLFSSL_TICKET_NAME_SZ],
  162. byte iv[WOLFSSL_TICKET_IV_SZ],
  163. byte mac[WOLFSSL_TICKET_MAC_SZ],
  164. int enc, byte* ticket, int inLen, int* outLen,
  165. void* userCtx);
  166. #endif
  167. #endif
  168. #ifdef WOLFSSL_DTLS
  169. static int _DtlsCheckWindow(WOLFSSL* ssl);
  170. static int _DtlsUpdateWindow(WOLFSSL* ssl);
  171. #endif
  172. #ifdef WOLFSSL_DTLS13
  173. #ifndef WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT
  174. #define WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT 0
  175. #endif
  176. #endif /* WOLFSSL_DTLS13 */
  177. enum processReply {
  178. doProcessInit = 0,
  179. #ifndef NO_WOLFSSL_SERVER
  180. runProcessOldClientHello,
  181. #endif
  182. getRecordLayerHeader,
  183. getData,
  184. verifyEncryptedMessage,
  185. decryptMessage,
  186. verifyMessage,
  187. runProcessingOneRecord,
  188. runProcessingOneMessage
  189. };
  190. #ifndef WOLFSSL_NO_TLS12
  191. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  192. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  193. static const byte tls13Downgrade[7] = {
  194. 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
  195. };
  196. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  197. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  198. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  199. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  200. int padLen, int content, int verify, int epochOrder);
  201. #endif
  202. #endif /* !WOLFSSL_NO_TLS12 */
  203. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  204. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  205. #endif
  206. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  207. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  208. int* secretSz, void* ctx);
  209. #ifdef WOLFSSL_TLS13
  210. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  211. const unsigned char* secret, int secretSz, void* ctx);
  212. #endif
  213. /* Label string for client random. */
  214. #define SSC_CR "CLIENT_RANDOM"
  215. /*
  216. * This function builds up string for key-logging then call user's
  217. * key-log-callback to pass the string for TLS1.2 and older.
  218. * The user's key-logging callback has been set via
  219. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  220. * "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  221. * parameter
  222. * - ssl: WOLFSSL object
  223. * - secret: pointer to the buffer holding master-secret
  224. * - secretSz: size of secret
  225. * - ctx: not used
  226. * returns 0 on success, negative value on failure.
  227. */
  228. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  229. int* secretSz, void* ctx)
  230. {
  231. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  232. int msSz;
  233. int hasVal;
  234. int i;
  235. const char* label = SSC_CR;
  236. int labelSz = sizeof(SSC_CR);
  237. int buffSz;
  238. byte* log = NULL;
  239. word32 outSz;
  240. int idx;
  241. int ret;
  242. (void)ctx;
  243. if (ssl == NULL || secret == NULL || *secretSz == 0)
  244. return BAD_FUNC_ARG;
  245. if (ssl->arrays == NULL)
  246. return BAD_FUNC_ARG;
  247. /* get the user-callback func from CTX*/
  248. logCb = ssl->ctx->keyLogCb;
  249. if (logCb == NULL)
  250. return 0;
  251. /* need to make sure the given master-secret has a meaningful value */
  252. msSz = *secretSz;
  253. hasVal = 0;
  254. for (i = 0; i < msSz; i++) {
  255. if (*((byte*)secret) != 0) {
  256. hasVal = 1;
  257. break;
  258. }
  259. }
  260. if (hasVal == 0)
  261. return 0; /* master-secret looks invalid */
  262. /* build up a hex-decoded keylog string
  263. "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  264. note that each keylog string does not have CR/LF.
  265. */
  266. buffSz = labelSz + (RAN_LEN * 2) + 1 + ((*secretSz) * 2) + 1;
  267. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  268. if (log == NULL)
  269. return MEMORY_E;
  270. #ifdef WOLFSSL_CHECK_MEM_ZERO
  271. wc_MemZero_Add("SessionSecret log", log, buffSz);
  272. #endif
  273. XMEMSET(log, 0, buffSz);
  274. XMEMCPY(log, label, labelSz -1); /* put label w/o terminator */
  275. log[labelSz - 1] = ' '; /* '\0' -> ' ' */
  276. idx = labelSz;
  277. outSz = buffSz - idx;
  278. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  279. log + idx, &outSz)) == 0) {
  280. idx += (outSz - 1); /* reduce terminator byte */
  281. outSz = buffSz - idx;
  282. if (outSz > 1) {
  283. log[idx++] = ' '; /* add space*/
  284. outSz = buffSz - idx;
  285. if ((ret = Base16_Encode((byte*)secret, *secretSz,
  286. log + idx, &outSz)) == 0) {
  287. /* pass the log to the client callback*/
  288. logCb(ssl, (char*)log);
  289. ret = 0;
  290. }
  291. }
  292. else
  293. ret = MEMORY_E;
  294. }
  295. /* Zero out Base16 encoded secret and other data. */
  296. ForceZero(log, buffSz);
  297. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  298. return ret;
  299. }
  300. #if defined(WOLFSSL_TLS13)
  301. /* Label string for client early traffic secret. */
  302. #define SSC_TLS13_CETS "CLIENT_EARLY_TRAFFIC_SECRET"
  303. /* Label string for client handshake traffic secret. */
  304. #define SSC_TLS13_CHTS "CLIENT_HANDSHAKE_TRAFFIC_SECRET"
  305. /* Label string for server handshake traffic secret. */
  306. #define SSC_TLS13_SHTS "SERVER_HANDSHAKE_TRAFFIC_SECRET"
  307. /* Label string for client traffic secret. */
  308. #define SSC_TLS13_CTS "CLIENT_TRAFFIC_SECRET_0"
  309. /* Label string for server traffic secret. */
  310. #define SSC_TLS13_STS "SERVER_TRAFFIC_SECRET_0"
  311. /* Label string for early exporter secret. */
  312. #define SSC_TLS13_EES "EARLY_EXPORTER_SECRET"
  313. /* Label string for exporter secret. */
  314. #define SSC_TLS13_ES "EXPORTER_SECRET"
  315. /*
  316. * This function builds up string for key-logging then call user's
  317. * key-log-callback to pass the string for TLS1.3.
  318. * The user's key-logging callback has been set via
  319. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  320. * "<Label> <hex-encoded client random> <hex-encoded secret>"
  321. *
  322. * parameter
  323. * - ssl: WOLFSSL object
  324. * - id: type of secret for logging
  325. * - secret: pointer to the buffer holding secret
  326. * - secretSz: size of secret
  327. * - ctx: not used
  328. * returns 0 on success, negative value on failure.
  329. */
  330. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  331. const unsigned char* secret, int secretSz, void* ctx)
  332. {
  333. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  334. const char* label;
  335. int labelSz = 0;
  336. int buffSz = 0;
  337. byte* log = NULL;
  338. word32 outSz;
  339. int idx;
  340. int ret;
  341. (void)ctx;
  342. if (ssl == NULL || secret == NULL || secretSz == 0)
  343. return BAD_FUNC_ARG;
  344. if (ssl->arrays == NULL)
  345. return BAD_FUNC_ARG;
  346. /* get the user-callback func from CTX*/
  347. logCb = ssl->ctx->keyLogCb;
  348. if (logCb == NULL)
  349. return 0;
  350. switch (id) {
  351. case CLIENT_EARLY_TRAFFIC_SECRET:
  352. labelSz = sizeof(SSC_TLS13_CETS);
  353. label = SSC_TLS13_CETS;
  354. break;
  355. case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
  356. labelSz = sizeof(SSC_TLS13_CHTS);
  357. label = SSC_TLS13_CHTS;
  358. break;
  359. case SERVER_HANDSHAKE_TRAFFIC_SECRET:
  360. labelSz = sizeof(SSC_TLS13_SHTS);
  361. label = SSC_TLS13_SHTS;
  362. break;
  363. case CLIENT_TRAFFIC_SECRET:
  364. labelSz = sizeof(SSC_TLS13_CTS);
  365. label = SSC_TLS13_CTS;
  366. break;
  367. case SERVER_TRAFFIC_SECRET:
  368. labelSz = sizeof(SSC_TLS13_STS);
  369. label = SSC_TLS13_STS;
  370. break;
  371. case EARLY_EXPORTER_SECRET:
  372. labelSz = sizeof(SSC_TLS13_EES);
  373. label = SSC_TLS13_EES;
  374. break;
  375. case EXPORTER_SECRET:
  376. labelSz = sizeof(SSC_TLS13_ES);
  377. label = SSC_TLS13_ES;
  378. break;
  379. default:
  380. return BAD_FUNC_ARG;
  381. }
  382. /* prepare a log string for passing user callback
  383. * "<Label> <hex-encoded client random> <hex-encoded secret>" */
  384. buffSz = labelSz + (RAN_LEN * 2) + 1 + secretSz * 2 + 1;
  385. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  386. if (log == NULL)
  387. return MEMORY_E;
  388. #ifdef WOLFSSL_CHECK_MEM_ZERO
  389. wc_MemZero_Add("SessionSecret log", log, buffSz);
  390. #endif
  391. XMEMSET(log, 0, buffSz);
  392. XMEMCPY(log, label, labelSz - 1); /* put label w/o terminator */
  393. log[labelSz - 1] = ' '; /* '\0' -> ' ' */
  394. idx = labelSz;
  395. outSz = buffSz - idx;
  396. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  397. log + idx, &outSz)) == 0) {
  398. idx += (outSz - 1); /* reduce terminator byte */
  399. outSz = buffSz - idx;
  400. if (outSz >1) {
  401. log[idx++] = ' '; /* add space*/
  402. outSz = buffSz - idx;
  403. if ((ret = Base16_Encode((byte*)secret, secretSz,
  404. log + idx, &outSz)) == 0) {
  405. logCb(ssl, (char*)log);
  406. ret = 0;
  407. }
  408. }
  409. else
  410. ret = MEMORY_E;
  411. }
  412. /* Zero out Base16 encoded secret and other data. */
  413. ForceZero(log, buffSz);
  414. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  415. return ret;
  416. }
  417. #endif /* WOLFSSL_TLS13*/
  418. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK*/
  419. int IsTLS(const WOLFSSL* ssl)
  420. {
  421. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  422. return 1;
  423. return 0;
  424. }
  425. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  426. {
  427. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  428. return 1;
  429. #ifdef WOLFSSL_DTLS
  430. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  431. return 1;
  432. #endif
  433. return 0;
  434. }
  435. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  436. {
  437. int ret;
  438. ret = (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  439. #ifdef WOLFSSL_DTLS13
  440. if (ret == 0 && pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_3_MINOR)
  441. return 1;
  442. #endif
  443. return ret;
  444. }
  445. static WC_INLINE int IsEncryptionOn(WOLFSSL* ssl, int isSend)
  446. {
  447. #ifdef WOLFSSL_DTLS
  448. /* For DTLS, epoch 0 is always not encrypted. */
  449. if (ssl->options.dtls && !isSend) {
  450. if (!IsAtLeastTLSv1_3(ssl->version) && ssl->keys.curEpoch == 0)
  451. return 0;
  452. #ifdef WOLFSSL_DTLS13
  453. else if (IsAtLeastTLSv1_3(ssl->version)
  454. && w64IsZero(ssl->keys.curEpoch64))
  455. return 0;
  456. #endif /* WOLFSSL_DTLS13 */
  457. }
  458. #endif /* WOLFSSL_DTLS */
  459. #ifdef WOLFSSL_QUIC
  460. if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version)) {
  461. return 0;
  462. }
  463. #endif
  464. return ssl->keys.encryptionOn &&
  465. (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
  466. }
  467. #ifdef WOLFSSL_DTLS
  468. /* Stream Control Transmission Protocol */
  469. /* If SCTP is not enabled returns the state of the dtls option.
  470. * If SCTP is enabled returns dtls && !sctp. */
  471. int IsDtlsNotSctpMode(WOLFSSL* ssl)
  472. {
  473. #ifdef WOLFSSL_SCTP
  474. return ssl->options.dtls && !ssl->options.dtlsSctp;
  475. #else
  476. return ssl->options.dtls;
  477. #endif
  478. }
  479. #if !defined(WOLFSSL_NO_TLS12) && !defined(NO_WOLFSSL_SERVER)
  480. /* Secure Real-time Transport Protocol */
  481. /* If SRTP is not enabled returns the state of the dtls option.
  482. * If SRTP is enabled returns dtls && !dtlsSrtpProfiles. */
  483. static WC_INLINE int IsDtlsNotSrtpMode(WOLFSSL* ssl)
  484. {
  485. #ifdef WOLFSSL_SRTP
  486. return ssl->options.dtls && !ssl->dtlsSrtpProfiles;
  487. #else
  488. return ssl->options.dtls;
  489. #endif
  490. }
  491. #endif /* !WOLFSSL_NO_TLS12 && !NO_WOLFSSL_SERVER */
  492. #endif /* WOLFSSL_DTLS */
  493. #ifdef HAVE_LIBZ
  494. /* alloc user allocs to work with zlib */
  495. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  496. {
  497. (void)opaque;
  498. return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  499. }
  500. static void myFree(void* opaque, void* memory)
  501. {
  502. (void)opaque;
  503. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  504. }
  505. /* init zlib comp/decomp streams, 0 on success */
  506. static int InitStreams(WOLFSSL* ssl)
  507. {
  508. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  509. ssl->c_stream.zfree = (free_func)myFree;
  510. ssl->c_stream.opaque = (voidpf)ssl->heap;
  511. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  512. return ZLIB_INIT_ERROR;
  513. ssl->didStreamInit = 1;
  514. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  515. ssl->d_stream.zfree = (free_func)myFree;
  516. ssl->d_stream.opaque = (voidpf)ssl->heap;
  517. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  518. return 0;
  519. }
  520. static void FreeStreams(WOLFSSL* ssl)
  521. {
  522. if (ssl->didStreamInit) {
  523. deflateEnd(&ssl->c_stream);
  524. inflateEnd(&ssl->d_stream);
  525. }
  526. }
  527. /* compress in to out, return out size or error */
  528. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  529. {
  530. int err;
  531. int currTotal = (int)ssl->c_stream.total_out;
  532. ssl->c_stream.next_in = in;
  533. ssl->c_stream.avail_in = inSz;
  534. ssl->c_stream.next_out = out;
  535. ssl->c_stream.avail_out = outSz;
  536. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  537. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  538. return (int)ssl->c_stream.total_out - currTotal;
  539. }
  540. /* decompress in to out, return out size or error */
  541. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  542. {
  543. int err;
  544. int currTotal = (int)ssl->d_stream.total_out;
  545. ssl->d_stream.next_in = in;
  546. ssl->d_stream.avail_in = inSz;
  547. ssl->d_stream.next_out = out;
  548. ssl->d_stream.avail_out = outSz;
  549. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  550. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  551. return (int)ssl->d_stream.total_out - currTotal;
  552. }
  553. #endif /* HAVE_LIBZ */
  554. #ifdef WOLFSSL_SESSION_EXPORT
  555. /**
  556. * serializes the cipher specs struct for exporting
  557. * @return the amount written to 'exp' buffer
  558. */
  559. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  560. int type)
  561. {
  562. word32 idx = 0;
  563. CipherSpecs* specs;
  564. WOLFSSL_ENTER("ExportCipherSpecState");
  565. if (exp == NULL || ssl == NULL) {
  566. return BAD_FUNC_ARG;
  567. }
  568. specs = &ssl->specs;
  569. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  570. return BUFFER_E;
  571. }
  572. XMEMSET(exp, 0, WOLFSSL_EXPORT_SPC_SZ);
  573. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  574. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  575. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  576. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  577. exp[idx++] = specs->bulk_cipher_algorithm;
  578. exp[idx++] = specs->cipher_type;
  579. exp[idx++] = specs->mac_algorithm;
  580. exp[idx++] = specs->kea;
  581. exp[idx++] = specs->sig_algo;
  582. exp[idx++] = specs->hash_size;
  583. exp[idx++] = specs->pad_size;
  584. exp[idx++] = specs->static_ecdh;
  585. if (idx != WOLFSSL_EXPORT_SPC_SZ) {
  586. WOLFSSL_MSG("WOLFSSL_EXPORT_SPC_SZ needs updated and export version");
  587. return DTLS_EXPORT_VER_E;
  588. }
  589. /* send over state of AES too */
  590. if (type == WOLFSSL_EXPORT_TLS &&
  591. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  592. byte *pt = (byte*)ssl->encrypt.aes->reg;
  593. if ((idx + 2*AES_BLOCK_SIZE) > len) {
  594. WOLFSSL_MSG("Can not fit AES state into buffer");
  595. return BUFFER_E;
  596. }
  597. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  598. idx += AES_BLOCK_SIZE;
  599. pt = (byte*)ssl->decrypt.aes->reg;
  600. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  601. idx += AES_BLOCK_SIZE;
  602. }
  603. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  604. (void)ver;
  605. return idx;
  606. }
  607. /* serializes the key struct for exporting */
  608. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  609. byte small, int type)
  610. {
  611. word32 idx = 0;
  612. byte sz;
  613. Keys* keys;
  614. WOLFSSL_ENTER("ExportKeyState");
  615. if (exp == NULL || ssl == NULL) {
  616. return BAD_FUNC_ARG;
  617. }
  618. keys = &(ssl->keys);
  619. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  620. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  621. return BUFFER_E;
  622. }
  623. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  624. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  625. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  626. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  627. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  628. #if defined(WOLFSSL_DTLS)
  629. if (type == WOLFSSL_EXPORT_DTLS) {
  630. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  631. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  632. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  633. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  634. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  635. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  636. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  637. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  638. c16toa(keys->dtls_peer_handshake_number, exp + idx);
  639. idx += OPAQUE16_LEN;
  640. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  641. idx += OPAQUE16_LEN;
  642. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  643. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  644. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx);
  645. idx += OPAQUE16_LEN;
  646. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx);
  647. idx += OPAQUE32_LEN;
  648. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  649. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  650. }
  651. #endif
  652. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  653. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  654. exp[idx++] = keys->encryptionOn;
  655. exp[idx++] = keys->decryptedCur;
  656. /* from here on the buffer needs checked because is variable length that
  657. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  658. #ifdef WOLFSSL_DTLS
  659. if (type == WOLFSSL_EXPORT_DTLS) {
  660. word32 i;
  661. if ((OPAQUE16_LEN * 2) + idx +
  662. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  663. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  664. return BUFFER_E;
  665. }
  666. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  667. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  668. c32toa(keys->peerSeq[0].window[i], exp + idx);
  669. idx += OPAQUE32_LEN;
  670. }
  671. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  672. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  673. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  674. idx += OPAQUE32_LEN;
  675. }
  676. }
  677. #endif
  678. if (idx >= len) {
  679. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  680. return BUFFER_E;
  681. }
  682. #ifdef HAVE_TRUNCATED_HMAC
  683. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  684. exp[idx++] = ssl->truncated_hmac;
  685. #else
  686. sz = ssl->specs.hash_size;
  687. exp[idx++] = 0; /* no truncated hmac */
  688. #endif
  689. sz = (small)? 0: sz;
  690. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  691. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  692. return BUFFER_E;
  693. }
  694. exp[idx++] = sz;
  695. if (sz > 0) {
  696. #ifndef WOLFSSL_AEAD_ONLY
  697. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  698. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  699. #else
  700. XMEMSET(exp + idx, 0, sz); idx += sz;
  701. XMEMSET(exp + idx, 0, sz); idx += sz;
  702. #endif
  703. }
  704. sz = (small)? 0: ssl->specs.key_size;
  705. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  706. WOLFSSL_MSG("Buffer not large enough for write key");
  707. return BUFFER_E;
  708. }
  709. exp[idx++] = sz;
  710. if (sz > 0) {
  711. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  712. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  713. }
  714. sz = (small)? 0: ssl->specs.iv_size;
  715. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  716. WOLFSSL_MSG("Buffer not large enough for IVs");
  717. return BUFFER_E;
  718. }
  719. exp[idx++] = sz;
  720. if (sz > 0) {
  721. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  722. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  723. }
  724. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  725. idx += AEAD_MAX_EXP_SZ;
  726. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  727. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  728. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  729. return BUFFER_E;
  730. }
  731. exp[idx++] = sz;
  732. if (sz > 0) {
  733. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  734. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  735. }
  736. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  737. if (idx > DTLS_EXPORT_KEY_SZ) {
  738. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  739. return DTLS_EXPORT_VER_E;
  740. }
  741. WOLFSSL_LEAVE("ExportKeyState", idx);
  742. (void)ver;
  743. (void)type;
  744. return idx;
  745. }
  746. /**
  747. * Imports the buffer 'exp' into the 'ssl' CipherSpec structure.
  748. * @param ssl WOLFSSL structure to import into
  749. * @param exp input buffer to read from
  750. * @param len length of exp buffer
  751. * @param ver version of import buffer found
  752. * @param type flag for importing a TLS session or DTLS
  753. *
  754. * @return size of exp buffer consumed on success and negative value on fail
  755. */
  756. static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len,
  757. byte ver, int type)
  758. {
  759. word32 idx = 0;
  760. CipherSpecs* specs;
  761. word32 tmp_seq_peer_lo;
  762. word32 tmp_seq_peer_hi;
  763. word32 tmp_seq_lo;
  764. word32 tmp_seq_hi;
  765. WOLFSSL_ENTER("ImportCipherSpecState");
  766. if (exp == NULL || ssl == NULL) {
  767. return BAD_FUNC_ARG;
  768. }
  769. specs= &(ssl->specs);
  770. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  771. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  772. return BUFFER_E;
  773. }
  774. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  775. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  776. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  777. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  778. specs->bulk_cipher_algorithm = exp[idx++];
  779. specs->cipher_type = exp[idx++];
  780. specs->mac_algorithm = exp[idx++];
  781. specs->kea = exp[idx++];
  782. specs->sig_algo = exp[idx++];
  783. specs->hash_size = exp[idx++];
  784. specs->pad_size = exp[idx++];
  785. specs->static_ecdh = exp[idx++];
  786. if (specs->pad_size != PAD_MD5 && specs->pad_size != PAD_SHA) {
  787. WOLFSSL_MSG("Importing bad or unknown pad size");
  788. return BAD_STATE_E;
  789. }
  790. /* temporarily save the sequence numbers */
  791. tmp_seq_peer_lo = ssl->keys.peer_sequence_number_lo;
  792. tmp_seq_peer_hi = ssl->keys.peer_sequence_number_hi;
  793. tmp_seq_lo = ssl->keys.sequence_number_lo;
  794. tmp_seq_hi = ssl->keys.sequence_number_hi;
  795. SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  796. /* reset sequence numbers after setting keys */
  797. ssl->keys.peer_sequence_number_lo = tmp_seq_peer_lo;
  798. ssl->keys.peer_sequence_number_hi = tmp_seq_peer_hi;
  799. ssl->keys.sequence_number_lo = tmp_seq_lo;
  800. ssl->keys.sequence_number_hi = tmp_seq_hi;
  801. if (type == WOLFSSL_EXPORT_TLS &&
  802. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  803. byte *pt = (byte*)ssl->encrypt.aes->reg;
  804. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  805. idx += AES_BLOCK_SIZE;
  806. pt = (byte*)ssl->decrypt.aes->reg;
  807. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  808. idx += AES_BLOCK_SIZE;
  809. }
  810. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  811. (void)ver;
  812. return idx;
  813. }
  814. /**
  815. * Import the Key structure
  816. *
  817. * @param ssl WOLFSSL structure to import into
  818. * @param exp buffer to read Key values from
  819. * @param len max length of buffer 'exp'
  820. * @param ver version of import buffer found
  821. * @param type flag for TLS vs DTLS
  822. *
  823. * @return amount of data read from exp on success or negative on fail
  824. */
  825. static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  826. int type)
  827. {
  828. word32 idx = 0;
  829. byte sz;
  830. Keys *keys;
  831. WOLFSSL_ENTER("ImportKeyState");
  832. if (exp == NULL || ssl == NULL) {
  833. return BAD_FUNC_ARG;
  834. }
  835. keys = &(ssl->keys);
  836. /* check minimum length -- includes byte used for size indicators */
  837. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  838. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  839. return BUFFER_E;
  840. }
  841. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  842. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  843. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  844. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  845. #if defined(WOLFSSL_DTLS)
  846. if (type == WOLFSSL_EXPORT_DTLS) {
  847. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  848. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  849. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  850. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  851. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  852. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  853. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  854. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  855. ato16(exp + idx, &keys->dtls_peer_handshake_number);
  856. idx += OPAQUE16_LEN;
  857. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  858. idx += OPAQUE16_LEN;
  859. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  860. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  861. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi);
  862. idx += OPAQUE16_LEN;
  863. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo);
  864. idx += OPAQUE32_LEN;
  865. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  866. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  867. }
  868. #endif
  869. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  870. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  871. keys->encryptionOn = exp[idx++];
  872. keys->decryptedCur = exp[idx++];
  873. #if defined(WOLFSSL_DTLS)
  874. if (type == WOLFSSL_EXPORT_DTLS) {
  875. word16 i, wordCount, wordAdj = 0;
  876. /* do window */
  877. ato16(exp + idx, &wordCount);
  878. idx += OPAQUE16_LEN;
  879. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  880. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  881. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  882. }
  883. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  884. for (i = 0; i < wordCount; i++) {
  885. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  886. idx += OPAQUE32_LEN;
  887. }
  888. idx += wordAdj;
  889. /* do prevWindow */
  890. ato16(exp + idx, &wordCount);
  891. idx += OPAQUE16_LEN;
  892. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  893. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  894. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  895. }
  896. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  897. for (i = 0; i < wordCount; i++) {
  898. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  899. idx += OPAQUE32_LEN;
  900. }
  901. idx += wordAdj;
  902. }
  903. #endif
  904. #ifdef HAVE_TRUNCATED_HMAC
  905. ssl->truncated_hmac = exp[idx++];
  906. #else
  907. idx++; /* no truncated hmac */
  908. #endif
  909. sz = exp[idx++];
  910. #ifndef WOLFSSL_AEAD_ONLY
  911. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  912. WOLFSSL_MSG("Buffer not large enough for MAC import");
  913. return BUFFER_E;
  914. }
  915. if (sz > 0) {
  916. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  917. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  918. }
  919. #else
  920. if (sz + idx > len) {
  921. return BUFFER_E;
  922. }
  923. idx += sz; idx += sz;
  924. #endif
  925. sz = exp[idx++];
  926. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  927. WOLFSSL_MSG("Buffer not large enough for key import");
  928. return BUFFER_E;
  929. }
  930. if (sz > 0) {
  931. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  932. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  933. }
  934. sz = exp[idx++];
  935. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  936. WOLFSSL_MSG("Buffer not large enough for write IV import");
  937. return BUFFER_E;
  938. }
  939. if (sz > 0) {
  940. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  941. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  942. }
  943. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  944. idx += AEAD_MAX_EXP_SZ;
  945. sz = exp[idx++];
  946. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  947. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  948. return BUFFER_E;
  949. }
  950. if (sz > 0) {
  951. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  952. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  953. }
  954. WOLFSSL_LEAVE("ImportKeyState", idx);
  955. (void)ver;
  956. (void)type;
  957. return idx;
  958. }
  959. /* copy over necessary information from Options struct to buffer
  960. * On success returns size of buffer used on failure returns a negative value */
  961. static int ExportOptions(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  962. int type)
  963. {
  964. int idx = 0;
  965. word16 zero = 0;
  966. Options *options;
  967. WOLFSSL_ENTER("ExportOptions");
  968. if (ssl == NULL || exp == NULL || len < DTLS_EXPORT_OPT_SZ) {
  969. return BAD_FUNC_ARG;
  970. }
  971. options = &ssl->options;
  972. if (options == NULL) {
  973. return BAD_FUNC_ARG;
  974. }
  975. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  976. /* these options are kept and sent to indicate verify status and strength
  977. * of handshake */
  978. exp[idx++] = options->sendVerify;
  979. exp[idx++] = options->verifyPeer;
  980. exp[idx++] = options->verifyNone;
  981. exp[idx++] = options->downgrade;
  982. #ifndef NO_DH
  983. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  984. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  985. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  986. #else
  987. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  988. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  989. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  990. #endif
  991. #ifndef NO_RSA
  992. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  993. #else
  994. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  995. #endif
  996. #ifdef HAVE_ECC
  997. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  998. #else
  999. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  1000. #endif
  1001. /* these options are kept to indicate state and behavior */
  1002. #ifndef NO_PSK
  1003. exp[idx++] = options->havePSK;
  1004. #else
  1005. exp[idx++] = 0;
  1006. #endif
  1007. exp[idx++] = options->sessionCacheOff;
  1008. exp[idx++] = options->sessionCacheFlushOff;
  1009. exp[idx++] = options->side;
  1010. exp[idx++] = options->resuming;
  1011. exp[idx++] = options->haveSessionId;
  1012. exp[idx++] = options->tls;
  1013. exp[idx++] = options->tls1_1;
  1014. exp[idx++] = options->dtls;
  1015. exp[idx++] = options->connReset;
  1016. exp[idx++] = options->isClosed;
  1017. exp[idx++] = options->closeNotify;
  1018. exp[idx++] = options->sentNotify;
  1019. exp[idx++] = options->usingCompression;
  1020. exp[idx++] = options->haveRSA;
  1021. exp[idx++] = options->haveECC;
  1022. exp[idx++] = options->haveDH;
  1023. exp[idx++] = 0; /* Historical: haveNTRU */
  1024. exp[idx++] = 0; /* Historical: haveQSH */
  1025. exp[idx++] = options->haveECDSAsig;
  1026. exp[idx++] = options->haveStaticECC;
  1027. exp[idx++] = options->havePeerVerify;
  1028. exp[idx++] = options->usingPSK_cipher;
  1029. exp[idx++] = options->usingAnon_cipher;
  1030. exp[idx++] = 0; /* Historical: options->sendAlertState */
  1031. exp[idx++] = options->partialWrite;
  1032. exp[idx++] = options->quietShutdown;
  1033. exp[idx++] = options->groupMessages;
  1034. #ifdef HAVE_POLY1305
  1035. exp[idx++] = options->oldPoly;
  1036. #else
  1037. exp[idx++] = 0;
  1038. #endif
  1039. #ifdef HAVE_ANON
  1040. exp[idx++] = options->haveAnon;
  1041. #else
  1042. exp[idx++] = 0;
  1043. #endif
  1044. #ifdef HAVE_SESSION_TICKET
  1045. exp[idx++] = options->createTicket;
  1046. exp[idx++] = options->useTicket;
  1047. exp[idx++] = options->noTicketTls12;
  1048. #ifdef WOLFSSL_TLS13
  1049. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1050. exp[idx++] = options->noTicketTls13;
  1051. }
  1052. #else
  1053. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1054. exp[idx++] = 0;
  1055. }
  1056. #endif
  1057. #else
  1058. exp[idx++] = 0;
  1059. exp[idx++] = 0;
  1060. exp[idx++] = 0;
  1061. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1062. exp[idx++] = 0;
  1063. }
  1064. #endif
  1065. exp[idx++] = options->processReply;
  1066. exp[idx++] = options->cipherSuite0;
  1067. exp[idx++] = options->cipherSuite;
  1068. exp[idx++] = options->serverState;
  1069. exp[idx++] = options->clientState;
  1070. exp[idx++] = options->handShakeState;
  1071. exp[idx++] = options->handShakeDone;
  1072. exp[idx++] = options->minDowngrade;
  1073. exp[idx++] = options->connectState;
  1074. exp[idx++] = options->acceptState;
  1075. exp[idx++] = options->asyncState;
  1076. if (type == WOLFSSL_EXPORT_TLS) {
  1077. #ifdef HAVE_ENCRYPT_THEN_MAC
  1078. exp[idx++] = options->disallowEncThenMac;
  1079. exp[idx++] = options->encThenMac;
  1080. exp[idx++] = options->startedETMRead;
  1081. exp[idx++] = options->startedETMWrite;
  1082. #else
  1083. exp[idx++] = 0;
  1084. exp[idx++] = 0;
  1085. exp[idx++] = 0;
  1086. exp[idx++] = 0;
  1087. #endif
  1088. }
  1089. /* version of connection */
  1090. exp[idx++] = ssl->version.major;
  1091. exp[idx++] = ssl->version.minor;
  1092. (void)zero;
  1093. /* check if changes were made and notify of need to update export version */
  1094. switch (ver) {
  1095. case WOLFSSL_EXPORT_VERSION_3:
  1096. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  1097. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1098. return DTLS_EXPORT_VER_E;
  1099. }
  1100. break;
  1101. case WOLFSSL_EXPORT_VERSION:
  1102. if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) {
  1103. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1104. return DTLS_EXPORT_VER_E;
  1105. }
  1106. break;
  1107. default:
  1108. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  1109. return DTLS_EXPORT_VER_E;
  1110. }
  1111. WOLFSSL_LEAVE("ExportOptions", idx);
  1112. (void)type;
  1113. return idx;
  1114. }
  1115. /* copy items from Export struct to Options struct
  1116. * On success returns size of buffer used on failure returns a negative value */
  1117. static int ImportOptions(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  1118. int type)
  1119. {
  1120. int idx = 0;
  1121. Options* options = &ssl->options;
  1122. switch (ver) {
  1123. case WOLFSSL_EXPORT_VERSION:
  1124. if (len < DTLS_EXPORT_OPT_SZ) {
  1125. WOLFSSL_MSG("Sanity check on buffer size failed");
  1126. return BAD_FUNC_ARG;
  1127. }
  1128. break;
  1129. case WOLFSSL_EXPORT_VERSION_3:
  1130. if (len < DTLS_EXPORT_OPT_SZ_3) {
  1131. WOLFSSL_MSG("Sanity check on buffer size failed");
  1132. return BAD_FUNC_ARG;
  1133. }
  1134. break;
  1135. default:
  1136. WOLFSSL_MSG("Export version not supported");
  1137. return BAD_FUNC_ARG;
  1138. }
  1139. if (exp == NULL || options == NULL) {
  1140. return BAD_FUNC_ARG;
  1141. }
  1142. /* these options are kept and sent to indicate verify status and strength
  1143. * of handshake */
  1144. options->sendVerify = exp[idx++];
  1145. options->verifyPeer = exp[idx++];
  1146. options->verifyNone = exp[idx++];
  1147. options->downgrade = exp[idx++];
  1148. #ifndef NO_DH
  1149. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  1150. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  1151. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  1152. #else
  1153. idx += OPAQUE16_LEN;
  1154. idx += OPAQUE16_LEN;
  1155. idx += OPAQUE16_LEN;
  1156. #endif
  1157. #ifndef NO_RSA
  1158. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  1159. #else
  1160. idx += OPAQUE16_LEN;
  1161. #endif
  1162. #ifdef HAVE_ECC
  1163. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  1164. #else
  1165. idx += OPAQUE16_LEN;
  1166. #endif
  1167. /* these options are kept to indicate state and behavior */
  1168. #ifndef NO_PSK
  1169. options->havePSK = exp[idx++];
  1170. #else
  1171. idx++;
  1172. #endif
  1173. options->sessionCacheOff = exp[idx++];
  1174. options->sessionCacheFlushOff = exp[idx++];
  1175. options->side = exp[idx++];
  1176. options->resuming = exp[idx++];
  1177. options->haveSessionId = exp[idx++];
  1178. options->tls = exp[idx++];
  1179. options->tls1_1 = exp[idx++];
  1180. options->dtls = exp[idx++];
  1181. options->connReset = exp[idx++];
  1182. options->isClosed = exp[idx++];
  1183. options->closeNotify = exp[idx++];
  1184. options->sentNotify = exp[idx++];
  1185. options->usingCompression = exp[idx++];
  1186. options->haveRSA = exp[idx++];
  1187. options->haveECC = exp[idx++];
  1188. options->haveDH = exp[idx++];
  1189. idx++; /* Historical: haveNTRU */
  1190. idx++; /* Historical: haveQSH */
  1191. options->haveECDSAsig = exp[idx++];
  1192. options->haveStaticECC = exp[idx++];
  1193. options->havePeerVerify = exp[idx++];
  1194. options->usingPSK_cipher = exp[idx++];
  1195. options->usingAnon_cipher = exp[idx++];
  1196. idx++; /* Historical: options->sendAlertState */
  1197. options->partialWrite = exp[idx++];
  1198. options->quietShutdown = exp[idx++];
  1199. options->groupMessages = exp[idx++];
  1200. #ifdef HAVE_POLY1305
  1201. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  1202. #else
  1203. idx++;
  1204. #endif
  1205. #ifdef HAVE_ANON
  1206. options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */
  1207. #else
  1208. idx++;
  1209. #endif
  1210. #ifdef HAVE_SESSION_TICKET
  1211. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  1212. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  1213. options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
  1214. #ifdef WOLFSSL_TLS13
  1215. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1216. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  1217. }
  1218. #else
  1219. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1220. idx++;
  1221. }
  1222. #endif
  1223. #else
  1224. idx++;
  1225. idx++;
  1226. idx++;
  1227. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1228. idx++;
  1229. }
  1230. #endif
  1231. options->processReply = exp[idx++];
  1232. options->cipherSuite0 = exp[idx++];
  1233. options->cipherSuite = exp[idx++];
  1234. options->serverState = exp[idx++];
  1235. options->clientState = exp[idx++];
  1236. options->handShakeState = exp[idx++];
  1237. options->handShakeDone = exp[idx++];
  1238. options->minDowngrade = exp[idx++];
  1239. options->connectState = exp[idx++];
  1240. options->acceptState = exp[idx++];
  1241. options->asyncState = exp[idx++];
  1242. if (type == WOLFSSL_EXPORT_TLS) {
  1243. #ifdef HAVE_ENCRYPT_THEN_MAC
  1244. options->disallowEncThenMac = exp[idx++];
  1245. options->encThenMac = exp[idx++];
  1246. options->startedETMRead = exp[idx++];
  1247. options->startedETMWrite = exp[idx++];
  1248. #else
  1249. idx++;
  1250. idx++;
  1251. idx++;
  1252. idx++;
  1253. #endif
  1254. }
  1255. /* version of connection */
  1256. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  1257. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  1258. return VERSION_ERROR;
  1259. }
  1260. /* set TLS 1.3 flag in options if this was a TLS 1.3 connection */
  1261. if (ssl->version.major == SSLv3_MAJOR &&
  1262. ssl->version.minor == TLSv1_3_MINOR) {
  1263. options->tls1_3 = 1;
  1264. }
  1265. return idx;
  1266. }
  1267. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  1268. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  1269. {
  1270. int idx = 0;
  1271. int ipSz = MAX_EXPORT_IP; /* start as max size */
  1272. int fam = 0;
  1273. word16 port = 0;
  1274. char ip[MAX_EXPORT_IP];
  1275. if (ver != WOLFSSL_EXPORT_VERSION) {
  1276. WOLFSSL_MSG("Export version not supported");
  1277. return BAD_FUNC_ARG;
  1278. }
  1279. if (ssl == NULL || exp == NULL ||
  1280. len < (sizeof(ip) + 3 * WOLFSSL_EXPORT_LEN)) {
  1281. return BAD_FUNC_ARG;
  1282. }
  1283. if (ssl->ctx->CBGetPeer == NULL) {
  1284. WOLFSSL_MSG("No get peer call back set");
  1285. return BAD_FUNC_ARG;
  1286. }
  1287. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  1288. WOLFSSL_MSG("Get peer callback error");
  1289. return SOCKET_ERROR_E;
  1290. }
  1291. /* check that ipSz/fam is not negative or too large since user can set cb */
  1292. if (ipSz < 0 || ipSz > MAX_EXPORT_IP || fam < 0) {
  1293. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  1294. return SOCKET_ERROR_E;
  1295. }
  1296. c16toa((word16)fam, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1297. c16toa((word16)ipSz, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1298. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  1299. c16toa(port, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1300. return idx;
  1301. }
  1302. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  1303. static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
  1304. {
  1305. word16 idx = 0;
  1306. word16 ipSz;
  1307. word16 fam;
  1308. word16 port;
  1309. char ip[MAX_EXPORT_IP];
  1310. if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_3) {
  1311. WOLFSSL_MSG("Export version not supported");
  1312. return BAD_FUNC_ARG;
  1313. }
  1314. if (len == 0) {
  1315. WOLFSSL_MSG("No peer info sent");
  1316. return 0;
  1317. }
  1318. if (ssl == NULL || buf == NULL || len < 3 * WOLFSSL_EXPORT_LEN) {
  1319. return BAD_FUNC_ARG;
  1320. }
  1321. /* import sin family */
  1322. ato16(buf + idx, &fam); idx += WOLFSSL_EXPORT_LEN;
  1323. /* import ip address idx, and ipSz are unsigned but cast for enum */
  1324. ato16(buf + idx, &ipSz); idx += WOLFSSL_EXPORT_LEN;
  1325. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + WOLFSSL_EXPORT_LEN) > len) {
  1326. return BUFFER_E;
  1327. }
  1328. XMEMSET(ip, 0, sizeof(ip));
  1329. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  1330. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  1331. ato16(buf + idx, &port); idx += WOLFSSL_EXPORT_LEN;
  1332. /* sanity check for a function to call, then use it to import peer info */
  1333. if (ssl->ctx->CBSetPeer == NULL) {
  1334. WOLFSSL_MSG("No set peer function");
  1335. return BAD_FUNC_ARG;
  1336. }
  1337. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  1338. WOLFSSL_MSG("Error setting peer info");
  1339. return SOCKET_ERROR_E;
  1340. }
  1341. return idx;
  1342. }
  1343. #ifdef WOLFSSL_DTLS
  1344. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1345. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1346. * passed in.
  1347. * On success returns the size of serialized session state.*/
  1348. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1349. {
  1350. int ret;
  1351. word32 idx = 0;
  1352. word32 totalLen = 0;
  1353. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1354. if (buf == NULL || ssl == NULL) {
  1355. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1356. return BAD_FUNC_ARG;
  1357. }
  1358. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1359. /* each of the following have a 2 byte length before data */
  1360. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1361. if (totalLen > sz) {
  1362. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1363. return BUFFER_E;
  1364. }
  1365. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1366. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1367. ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1368. idx += WOLFSSL_EXPORT_LEN; /* leave room for total length */
  1369. /* export keys struct and dtls state -- variable length stored in ret */
  1370. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1371. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1372. WOLFSSL_EXPORT_VERSION, 1, WOLFSSL_EXPORT_DTLS)) < 0) {
  1373. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1374. return ret;
  1375. }
  1376. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1377. /* place total length of exported buffer minus 2 bytes protocol/version */
  1378. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1379. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1380. /* if compiled with debug options then print the version, protocol, size */
  1381. {
  1382. char debug[256];
  1383. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1384. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1385. , (int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1386. WOLFSSL_MSG(debug);
  1387. }
  1388. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1389. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1390. return idx;
  1391. }
  1392. /* On success return amount of buffer consumed */
  1393. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1394. {
  1395. word32 idx = 0;
  1396. word16 length = 0;
  1397. int version;
  1398. int ret;
  1399. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1400. /* check at least enough room for protocol and length */
  1401. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1402. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1403. return BAD_FUNC_ARG;
  1404. }
  1405. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1406. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1407. WOLFSSL_MSG("Incorrect protocol");
  1408. return BAD_FUNC_ARG;
  1409. }
  1410. version = buf[idx++] & 0x0F;
  1411. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1412. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1413. WOLFSSL_MSG("Buffer size sanity check failed");
  1414. return BUFFER_E;
  1415. }
  1416. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1417. /* if compiled with debug options then print the version, protocol, size */
  1418. {
  1419. char debug[256];
  1420. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1421. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1422. , (int)version, buf[0], (buf[1] >> 4), length);
  1423. WOLFSSL_MSG(debug);
  1424. }
  1425. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1426. /* perform sanity checks and extract Options information used */
  1427. switch (version) {
  1428. case WOLFSSL_EXPORT_VERSION:
  1429. break;
  1430. default:
  1431. WOLFSSL_MSG("Bad export state version");
  1432. return BAD_FUNC_ARG;
  1433. }
  1434. /* perform sanity checks and extract Keys struct */
  1435. if (WOLFSSL_EXPORT_LEN + idx > sz) {
  1436. WOLFSSL_MSG("Import Key struct error");
  1437. return BUFFER_E;
  1438. }
  1439. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1440. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1441. WOLFSSL_MSG("Import Key struct error");
  1442. return BUFFER_E;
  1443. }
  1444. if ((ret = ImportKeyState(ssl, buf + idx, length, version,
  1445. WOLFSSL_EXPORT_DTLS)) < 0) {
  1446. WOLFSSL_MSG("Import Key struct error");
  1447. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1448. return ret;
  1449. }
  1450. idx += ret;
  1451. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1452. return idx;
  1453. }
  1454. #endif /* WOLFSSL_DTLS */
  1455. /**
  1456. * Imports a serialized buffer (both TLS and DTLS)
  1457. *
  1458. * @param ssl WOLFSSL structure to import into
  1459. * @param buf buffer containing serialized session
  1460. * @param sz size of buffer 'buf'
  1461. * @param type flag for TLS or DTLS
  1462. *
  1463. * @return the size of serialized buffer on success
  1464. */
  1465. int wolfSSL_session_import_internal(WOLFSSL* ssl, const unsigned char* buf,
  1466. unsigned int sz, int type)
  1467. {
  1468. word32 idx = 0;
  1469. word16 length = 0;
  1470. int version = 0;
  1471. int ret = 0;
  1472. int optSz = 0;
  1473. int rc;
  1474. byte validProto = 0; /* did we find a valid protocol */
  1475. WOLFSSL_ENTER("wolfSSL_session_import_internal");
  1476. /* check at least enough room for protocol and length */
  1477. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1478. ret = BAD_FUNC_ARG;
  1479. }
  1480. /* Check if is TLS export protocol */
  1481. if (ret == 0) {
  1482. if (buf[idx] == (byte)TLS_EXPORT_PRO &&
  1483. (buf[idx + 1] & 0xF0) == ((byte)TLS_EXPORT_PRO & 0xF0)) {
  1484. validProto = 1;
  1485. }
  1486. /* Check if is DTLS export protocol */
  1487. if (buf[idx] == (byte)DTLS_EXPORT_PRO &&
  1488. (buf[idx + 1] & 0xF0) == ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1489. validProto = 1;
  1490. }
  1491. if (validProto == 0) {
  1492. #ifdef WOLFSSL_DTLS
  1493. /* check if importing state only */
  1494. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1495. #else
  1496. WOLFSSL_MSG("Invalid serialized session protocol value");
  1497. ret = BAD_FUNC_ARG;
  1498. #endif
  1499. }
  1500. idx += 1;
  1501. }
  1502. if (ret == 0) {
  1503. version = buf[idx++] & 0x0F;
  1504. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1505. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1506. ret = BUFFER_E;
  1507. }
  1508. }
  1509. /* if compiled with debug options then print the version, protocol, size */
  1510. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1511. {
  1512. char debug[256];
  1513. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1514. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1515. , (int)version, buf[0], (buf[1] >> 4), length);
  1516. WOLFSSL_MSG(debug);
  1517. }
  1518. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1519. /* perform sanity checks and extract Options information used */
  1520. if (ret == 0) {
  1521. switch (version) {
  1522. case WOLFSSL_EXPORT_VERSION:
  1523. if (type == WOLFSSL_EXPORT_DTLS) {
  1524. optSz = DTLS_EXPORT_OPT_SZ;
  1525. }
  1526. else {
  1527. optSz = TLS_EXPORT_OPT_SZ;
  1528. }
  1529. break;
  1530. case WOLFSSL_EXPORT_VERSION_3:
  1531. WOLFSSL_MSG("Importing older version 3");
  1532. optSz = DTLS_EXPORT_OPT_SZ_3;
  1533. break;
  1534. default:
  1535. WOLFSSL_MSG("Bad export version");
  1536. ret = BAD_FUNC_ARG;
  1537. }
  1538. }
  1539. if (ret == 0 && (WOLFSSL_EXPORT_LEN + optSz + idx > sz)) {
  1540. WOLFSSL_MSG("Import Options struct error");
  1541. ret = BUFFER_E;
  1542. }
  1543. if (ret == 0) {
  1544. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1545. if (length != optSz) {
  1546. WOLFSSL_MSG("Import Options struct error");
  1547. ret = BUFFER_E;
  1548. }
  1549. }
  1550. if (ret == 0) {
  1551. rc = ImportOptions(ssl, buf + idx, length, version, type);
  1552. if (rc < 0) {
  1553. WOLFSSL_MSG("Import Options struct error");
  1554. ret = rc;
  1555. }
  1556. else {
  1557. idx += length;
  1558. }
  1559. }
  1560. /* perform sanity checks and extract Keys struct */
  1561. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1562. WOLFSSL_MSG("Import Key struct error");
  1563. ret = BUFFER_E;
  1564. }
  1565. if (ret == 0) {
  1566. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1567. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1568. WOLFSSL_MSG("Import Key struct error");
  1569. ret = BUFFER_E;
  1570. }
  1571. }
  1572. if (ret == 0) {
  1573. rc = ImportKeyState(ssl, buf + idx, length, version, type);
  1574. if (rc < 0) {
  1575. WOLFSSL_MSG("Import Key struct error");
  1576. ret = rc;
  1577. }
  1578. else {
  1579. idx += rc;
  1580. }
  1581. }
  1582. /* perform sanity checks and extract CipherSpecs struct */
  1583. if (ret == 0 && (WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ + idx > sz)) {
  1584. WOLFSSL_MSG("Import CipherSpecs struct error");
  1585. ret = BUFFER_E;
  1586. }
  1587. if (ret == 0) {
  1588. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1589. if (length != WOLFSSL_EXPORT_SPC_SZ) {
  1590. WOLFSSL_MSG("Import CipherSpecs struct error");
  1591. ret = BUFFER_E;
  1592. }
  1593. }
  1594. if (ret == 0) {
  1595. rc = ImportCipherSpecState(ssl, buf + idx, length, version, type);
  1596. if (rc < 0) {
  1597. WOLFSSL_MSG("Import CipherSpecs struct error");
  1598. ret = rc;
  1599. }
  1600. else {
  1601. idx += rc;
  1602. }
  1603. }
  1604. /* perform sanity checks and extract DTLS peer info */
  1605. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1606. WOLFSSL_MSG("Import DTLS peer info error");
  1607. ret = BUFFER_E;
  1608. }
  1609. if (ret == 0) {
  1610. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1611. if (idx + length > sz) {
  1612. WOLFSSL_MSG("Import DTLS peer info error");
  1613. ret = BUFFER_E;
  1614. }
  1615. }
  1616. if (ret == 0) {
  1617. rc = ImportPeerInfo(ssl, buf + idx, length, version);
  1618. if (rc < 0) {
  1619. WOLFSSL_MSG("Import Peer Addr error");
  1620. ret = rc;
  1621. }
  1622. else {
  1623. idx += rc;
  1624. }
  1625. }
  1626. /* make sure is a valid suite used */
  1627. if (ret == 0 && wolfSSL_get_cipher(ssl) == NULL) {
  1628. WOLFSSL_MSG("Can not match cipher suite imported");
  1629. ret = MATCH_SUITE_ERROR;
  1630. }
  1631. #ifndef WOLFSSL_AEAD_ONLY
  1632. /* set hmac function to use when verifying */
  1633. if (ret == 0 && (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1634. ssl->options.dtls == 1)) {
  1635. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  1636. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  1637. ssl->hmac = TLS_hmac;
  1638. #else
  1639. ssl->hmac = Renesas_cmn_TLS_hmac;
  1640. #endif
  1641. }
  1642. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1643. if (ret == 0 && ssl->specs.cipher_type == stream &&
  1644. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1645. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1646. ret = SANITY_CIPHER_E;
  1647. }
  1648. #endif /* !WOLFSSL_AEAD_ONLY */
  1649. if (ret != 0) {
  1650. idx = ret;
  1651. }
  1652. WOLFSSL_LEAVE("wolfSSL_session_import_internal", idx);
  1653. return idx;
  1654. }
  1655. /**
  1656. * Handles serializing the session information.
  1657. *
  1658. * @param ssl WOLFSSL structure to serialize session from
  1659. * @param buf output buffer to hold serialized session
  1660. * @param sz the size of buffer 'buf', if too small then gets updated
  1661. * @param type if the input WOLFSSL structure is expected to be TLS or DTLS
  1662. * 1 for yes is TLS and 0 for no is DTLS
  1663. *
  1664. * @return the size of serialized buffer on success and negative values on fail
  1665. */
  1666. int wolfSSL_session_export_internal(WOLFSSL* ssl, byte* buf, word32* sz,
  1667. int type)
  1668. {
  1669. int ret = 0;
  1670. word32 idx = 0;
  1671. word32 totalLen = 0;
  1672. WOLFSSL_ENTER("wolfSSL_session_export_internal");
  1673. if (ssl == NULL) {
  1674. WOLFSSL_MSG("unexpected null argument");
  1675. ret = BAD_FUNC_ARG;
  1676. }
  1677. if (ret == 0) {
  1678. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1679. /* each of the following have a 2 byte length before data */
  1680. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1681. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1682. totalLen += WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ;
  1683. #ifdef WOLFSSL_DTLS
  1684. if (type == WOLFSSL_EXPORT_DTLS) {
  1685. totalLen += WOLFSSL_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1686. }
  1687. #endif
  1688. }
  1689. /* check is at least the minimum size needed, TLS cipher states add more */
  1690. if (ret == 0 && (totalLen > *sz || buf == NULL)) {
  1691. WOLFSSL_MSG("export buffer was too small or null");
  1692. *sz = totalLen;
  1693. /* possible AES state needed */
  1694. if (type == WOLFSSL_EXPORT_TLS) {
  1695. *sz += AES_BLOCK_SIZE*2;
  1696. }
  1697. ret = LENGTH_ONLY_E;
  1698. }
  1699. if (ret == 0) {
  1700. buf[idx++] = (byte)(type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1701. DTLS_EXPORT_PRO;
  1702. buf[idx++] = ((byte)((type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1703. DTLS_EXPORT_PRO) & 0xF0)
  1704. | ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1705. idx += WOLFSSL_EXPORT_LEN; /* leave spot for length of total buffer */
  1706. idx += WOLFSSL_EXPORT_LEN;
  1707. ret = ExportOptions(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1708. type);
  1709. if (ret >= 0) {
  1710. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1711. idx += ret;
  1712. ret = 0;
  1713. }
  1714. }
  1715. /* export keys struct and dtls state -- variable length stored in ret */
  1716. if (ret == 0) {
  1717. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1718. ret = ExportKeyState(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1719. 0, type);
  1720. if (ret >= 0) {
  1721. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1722. ret = 0;
  1723. }
  1724. }
  1725. /* export of cipher specs struct */
  1726. if (ret == 0) {
  1727. c16toa((word16)WOLFSSL_EXPORT_SPC_SZ, buf + idx);
  1728. idx += WOLFSSL_EXPORT_LEN;
  1729. ret = ExportCipherSpecState(ssl, buf + idx, *sz - idx,
  1730. WOLFSSL_EXPORT_VERSION, type);
  1731. if (ret >= 0) {
  1732. idx += ret;
  1733. ret = 0;
  1734. }
  1735. }
  1736. /* export of peer information */
  1737. if (ret == 0) {
  1738. idx += WOLFSSL_EXPORT_LEN;
  1739. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1740. ret = 0; /* not saving peer port/ip information */
  1741. #else
  1742. ret = ExportPeerInfo(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION);
  1743. #endif
  1744. if (ret >= 0) {
  1745. c16toa(ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1746. idx += ret;
  1747. ret = 0;
  1748. }
  1749. }
  1750. if (ret != 0 && buf != NULL) {
  1751. /*in a fail case clear the buffer which could contain partial key info*/
  1752. XMEMSET(buf, 0, *sz);
  1753. }
  1754. /* place total length of exported buffer minus 2 bytes protocol/version */
  1755. if (ret == 0) {
  1756. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1757. ret = idx;
  1758. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1759. {
  1760. char debug[256];
  1761. XSNPRINTF(debug, sizeof(debug), "Exporting TLS session\n"
  1762. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1763. ,(int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1764. WOLFSSL_MSG(debug);
  1765. }
  1766. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1767. }
  1768. if (ret >= 0) {
  1769. *sz = ret;
  1770. }
  1771. WOLFSSL_LEAVE("wolfSSL_session_export_internal", ret);
  1772. return ret;
  1773. }
  1774. #endif /* WOLFSSL_SESSION_EXPORT */
  1775. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1776. {
  1777. method->version = pv;
  1778. method->side = WOLFSSL_CLIENT_END;
  1779. method->downgrade = 0;
  1780. }
  1781. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) || \
  1782. defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  1783. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1784. {
  1785. if (ssl == NULL)
  1786. return BAD_FUNC_ARG;
  1787. /* set side */
  1788. ssl->options.side = side;
  1789. /* reset options that are side specific */
  1790. #ifdef HAVE_ECC
  1791. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1792. ssl->options.haveECDSAsig = 1; /* always on client side */
  1793. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1794. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1795. }
  1796. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1797. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1798. ssl->options.haveECDSAsig = 1; /* always on client side */
  1799. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1800. }
  1801. #endif
  1802. #ifdef HAVE_PQC
  1803. #ifdef HAVE_FALCON
  1804. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1805. ssl->options.haveFalconSig = 1; /* always on client side */
  1806. }
  1807. #endif /* HAVE_FALCON */
  1808. #ifdef HAVE_DILITHIUM
  1809. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1810. ssl->options.haveDilithiumSig = 1; /* always on client side */
  1811. }
  1812. #endif /* HAVE_DILITHIUM */
  1813. #endif /* HAVE_PQC */
  1814. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1815. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1816. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1817. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1818. ssl->options.haveEMS = 1;
  1819. }
  1820. #ifdef WOLFSSL_DTLS
  1821. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1822. ssl->options.haveEMS = 1;
  1823. #endif /* WOLFSSL_DTLS */
  1824. }
  1825. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1826. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  1827. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  1828. int ret;
  1829. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  1830. if (ret != 0) {
  1831. WOLFSSL_MSG("DTLS Cookie Secret error");
  1832. return ret;
  1833. }
  1834. }
  1835. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  1836. return InitSSL_Suites(ssl);
  1837. }
  1838. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1839. /* Initialize SSL context, return 0 on success */
  1840. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1841. {
  1842. int ret = 0;
  1843. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1844. ctx->method = method;
  1845. ctx->refCount = 1; /* so either CTX_free or SSL_free can release */
  1846. ctx->heap = ctx; /* defaults to self */
  1847. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1848. #ifdef WOLFSSL_DTLS
  1849. if (method->version.major == DTLS_MAJOR) {
  1850. ctx->minDowngrade = WOLFSSL_MIN_DTLS_DOWNGRADE;
  1851. }
  1852. else
  1853. #endif /* WOLFSSL_DTLS */
  1854. {
  1855. /* current default: TLSv1_MINOR */
  1856. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE;
  1857. }
  1858. if (wc_InitMutex(&ctx->countMutex) < 0) {
  1859. WOLFSSL_MSG("Mutex error on CTX init");
  1860. ctx->err = CTX_INIT_MUTEX_E;
  1861. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  1862. return BAD_MUTEX_E;
  1863. }
  1864. #ifndef NO_CERTS
  1865. ctx->privateKeyDevId = INVALID_DEVID;
  1866. #endif
  1867. #ifndef NO_DH
  1868. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1869. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1870. #endif
  1871. #ifndef NO_RSA
  1872. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1873. #endif
  1874. #ifdef HAVE_ECC
  1875. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1876. ctx->eccTempKeySz = ECDHE_SIZE;
  1877. #endif
  1878. #ifdef HAVE_PQC
  1879. #ifdef HAVE_FALCON
  1880. ctx->minFalconKeySz = MIN_FALCONKEY_SZ;
  1881. #endif /* HAVE_FALCON */
  1882. #ifdef HAVE_DILITHIUM
  1883. ctx->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ;
  1884. #endif /* HAVE_DILITHIUM */
  1885. #endif /* HAVE_PQC */
  1886. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1887. #ifdef OPENSSL_EXTRA
  1888. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1889. #endif
  1890. #ifdef HAVE_NETX
  1891. ctx->CBIORecv = NetX_Receive;
  1892. ctx->CBIOSend = NetX_Send;
  1893. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1894. ctx->CBIORecv = Mynewt_Receive;
  1895. ctx->CBIOSend = Mynewt_Send;
  1896. #elif defined WOLFSSL_LWIP_NATIVE
  1897. ctx->CBIORecv = LwIPNativeReceive;
  1898. ctx->CBIOSend = LwIPNativeSend;
  1899. #elif defined(WOLFSSL_GNRC)
  1900. ctx->CBIORecv = GNRC_ReceiveFrom;
  1901. ctx->CBIOSend = GNRC_SendTo;
  1902. #elif defined WOLFSSL_ISOTP
  1903. ctx->CBIORecv = ISOTP_Receive;
  1904. ctx->CBIOSend = ISOTP_Send;
  1905. #elif !defined(WOLFSSL_USER_IO)
  1906. #ifdef MICRIUM
  1907. ctx->CBIORecv = MicriumReceive;
  1908. ctx->CBIOSend = MicriumSend;
  1909. #ifdef WOLFSSL_DTLS
  1910. if (method->version.major == DTLS_MAJOR) {
  1911. ctx->CBIORecv = MicriumReceiveFrom;
  1912. ctx->CBIOSend = MicriumSendTo;
  1913. }
  1914. #ifdef WOLFSSL_SESSION_EXPORT
  1915. #error Micrium port does not support DTLS session export yet
  1916. #endif
  1917. #endif
  1918. #elif defined WOLFSSL_UIP
  1919. ctx->CBIORecv = uIPReceive;
  1920. ctx->CBIOSend = uIPSend;
  1921. #ifdef WOLFSSL_DTLS
  1922. if (method->version.major == DTLS_MAJOR) {
  1923. ctx->CBIOSendTo = uIPSendTo;
  1924. ctx->CBIORecvFrom = uIPRecvFrom;
  1925. }
  1926. #endif
  1927. #else
  1928. ctx->CBIORecv = EmbedReceive;
  1929. ctx->CBIOSend = EmbedSend;
  1930. #ifdef WOLFSSL_SESSION_EXPORT
  1931. ctx->CBGetPeer = EmbedGetPeer;
  1932. ctx->CBSetPeer = EmbedSetPeer;
  1933. #endif
  1934. #ifdef WOLFSSL_DTLS
  1935. if (method->version.major == DTLS_MAJOR) {
  1936. ctx->CBIORecv = EmbedReceiveFrom;
  1937. ctx->CBIOSend = EmbedSendTo;
  1938. }
  1939. #endif
  1940. #endif /* MICRIUM */
  1941. #endif /* WOLFSSL_USER_IO */
  1942. #ifdef HAVE_PQC
  1943. #ifdef HAVE_FALCON
  1944. if (method->side == WOLFSSL_CLIENT_END)
  1945. ctx->haveFalconSig = 1; /* always on client side */
  1946. /* server can turn on by loading key */
  1947. #endif /* HAVE_FALCON */
  1948. #ifdef HAVE_DILITHIUM
  1949. if (method->side == WOLFSSL_CLIENT_END)
  1950. ctx->haveDilithiumSig = 1; /* always on client side */
  1951. /* server can turn on by loading key */
  1952. #endif /* HAVE_DILITHIUM */
  1953. #endif /* HAVE_PQC */
  1954. #ifdef HAVE_ECC
  1955. if (method->side == WOLFSSL_CLIENT_END) {
  1956. ctx->haveECDSAsig = 1; /* always on client side */
  1957. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1958. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  1959. }
  1960. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1961. if (method->side == WOLFSSL_CLIENT_END) {
  1962. ctx->haveECDSAsig = 1; /* always on client side */
  1963. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1964. }
  1965. #endif
  1966. #ifdef WOLFSSL_QNX_CAAM
  1967. /* default to try using CAAM when built */
  1968. ctx->devId = WOLFSSL_CAAM_DEVID;
  1969. #else
  1970. ctx->devId = INVALID_DEVID;
  1971. #endif
  1972. #if defined(WOLFSSL_DTLS)
  1973. #ifdef WOLFSSL_SCTP
  1974. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  1975. #elif defined(WOLFSSL_DTLS_MTU)
  1976. ctx->dtlsMtuSz = MAX_MTU;
  1977. #endif
  1978. #endif
  1979. #ifndef NO_CERTS
  1980. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  1981. if (ctx->cm == NULL) {
  1982. WOLFSSL_MSG("Bad Cert Manager New");
  1983. WOLFSSL_ERROR_VERBOSE(BAD_CERT_MANAGER_ERROR);
  1984. return BAD_CERT_MANAGER_ERROR;
  1985. }
  1986. #ifdef OPENSSL_EXTRA
  1987. /* setup WOLFSSL_X509_STORE */
  1988. ctx->x509_store.cm = ctx->cm;
  1989. /* set pointer back to x509 store */
  1990. ctx->cm->x509_store_p = &ctx->x509_store;
  1991. /* WOLFSSL_X509_VERIFY_PARAM */
  1992. if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  1993. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  1994. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  1995. WOLFSSL_MSG("ctx->param memory error");
  1996. return MEMORY_E;
  1997. }
  1998. XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  1999. /* WOLFSSL_X509_LOOKUP */
  2000. if ((ctx->x509_store.lookup.dirs =
  2001. (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR),
  2002. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  2003. WOLFSSL_MSG("ctx-x509_store.lookup.dir memory allocation error");
  2004. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  2005. ctx->param = NULL;
  2006. return MEMORY_E;
  2007. }
  2008. XMEMSET(ctx->x509_store.lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
  2009. if (wc_InitMutex(&ctx->x509_store.lookup.dirs->lock) != 0) {
  2010. WOLFSSL_MSG("Bad mutex init");
  2011. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  2012. ctx->param = NULL;
  2013. XFREE(ctx->x509_store.lookup.dirs, heap, DYNAMIC_TYPE_OPENSSL);
  2014. ctx->x509_store.lookup.dirs = NULL;
  2015. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  2016. return BAD_MUTEX_E;
  2017. }
  2018. #endif
  2019. #endif
  2020. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  2021. if (method->side == WOLFSSL_CLIENT_END) {
  2022. if ((method->version.major == SSLv3_MAJOR) &&
  2023. (method->version.minor >= TLSv1_MINOR)) {
  2024. ctx->haveEMS = 1;
  2025. }
  2026. #ifdef WOLFSSL_DTLS
  2027. if (method->version.major == DTLS_MAJOR)
  2028. ctx->haveEMS = 1;
  2029. #endif /* WOLFSSL_DTLS */
  2030. }
  2031. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  2032. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  2033. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  2034. ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
  2035. if (ret != 0) return ret;
  2036. ctx->ticketEncCb = DefTicketEncCb;
  2037. ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
  2038. #endif
  2039. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  2040. #if defined(WOLFSSL_TLS13)
  2041. ctx->maxTicketTls13 = 1; /* default to sending a session ticket if compiled
  2042. in */
  2043. #endif
  2044. #endif
  2045. #ifdef WOLFSSL_EARLY_DATA
  2046. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  2047. #endif
  2048. #if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
  2049. ctx->noPskDheKe = 1;
  2050. #endif
  2051. #if defined(WOLFSSL_QT) && !defined(NO_PSK)
  2052. /* Qt retrieves supported cipher list at initialization
  2053. * from get_cipher_compat().
  2054. * Qt doesn't allow to use a cipher if it is not in the supported list.
  2055. * Therefore, we need to enable PSK cipher at the beginning.
  2056. */
  2057. ctx->havePSK = 1;
  2058. #endif
  2059. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  2060. #ifdef HAVE_WOLF_EVENT
  2061. ret = wolfEventQueue_Init(&ctx->event_queue);
  2062. #endif /* HAVE_WOLF_EVENT */
  2063. return ret;
  2064. }
  2065. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2066. void wolfSSL_CRYPTO_cleanup_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data)
  2067. {
  2068. int n_ex_data = (int)(sizeof ex_data->ex_data / sizeof ex_data->ex_data[0]);
  2069. for (--n_ex_data; n_ex_data >= 0; --n_ex_data) {
  2070. if (ex_data->ex_data[n_ex_data] != NULL)
  2071. (void)wolfSSL_CRYPTO_set_ex_data_with_cleanup(ex_data, n_ex_data,
  2072. NULL, NULL);
  2073. }
  2074. }
  2075. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  2076. /* In case contexts are held in array and don't want to free actual ctx. */
  2077. /* The allocations done in InitSSL_Ctx must be free'd with ctx->onHeapHint
  2078. * logic. A WOLFSSL_CTX can be assigned a static memory heap hint using
  2079. * wolfSSL_CTX_load_static_memory after CTX creation, which means variables
  2080. * allocated in InitSSL_Ctx were allocated from heap and should be free'd with
  2081. * a NULL heap hint. */
  2082. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  2083. {
  2084. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
  2085. defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
  2086. int i;
  2087. #endif
  2088. void* heapAtCTXInit = ctx->heap;
  2089. #ifdef WOLFSSL_STATIC_MEMORY
  2090. if (ctx->onHeapHint == 0) {
  2091. heapAtCTXInit = NULL;
  2092. }
  2093. #endif
  2094. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2095. wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
  2096. #endif
  2097. #ifdef HAVE_WOLF_EVENT
  2098. wolfEventQueue_Free(&ctx->event_queue);
  2099. #endif /* HAVE_WOLF_EVENT */
  2100. XFREE(ctx->method, heapAtCTXInit, DYNAMIC_TYPE_METHOD);
  2101. ctx->method = NULL;
  2102. if (ctx->suites) {
  2103. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  2104. ctx->suites = NULL;
  2105. }
  2106. #ifndef NO_DH
  2107. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2108. ctx->serverDH_G.buffer = NULL;
  2109. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2110. ctx->serverDH_P.buffer = NULL;
  2111. #endif /* !NO_DH */
  2112. #ifdef SINGLE_THREADED
  2113. if (ctx->rng) {
  2114. wc_FreeRng(ctx->rng);
  2115. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  2116. ctx->rng = NULL;
  2117. }
  2118. #endif /* SINGLE_THREADED */
  2119. #ifndef NO_CERTS
  2120. if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) {
  2121. ForceZero(ctx->privateKey->buffer, ctx->privateKey->length);
  2122. }
  2123. FreeDer(&ctx->privateKey);
  2124. #ifdef OPENSSL_ALL
  2125. wolfSSL_EVP_PKEY_free(ctx->privateKeyPKey);
  2126. #endif
  2127. FreeDer(&ctx->certificate);
  2128. #ifdef KEEP_OUR_CERT
  2129. if (ctx->ourCert && ctx->ownOurCert) {
  2130. wolfSSL_X509_free(ctx->ourCert);
  2131. ctx->ourCert = NULL;
  2132. }
  2133. #endif /* KEEP_OUR_CERT */
  2134. FreeDer(&ctx->certChain);
  2135. wolfSSL_CertManagerFree(ctx->cm);
  2136. ctx->cm = NULL;
  2137. #ifdef OPENSSL_ALL
  2138. if (ctx->x509_store.objs != NULL) {
  2139. wolfSSL_sk_X509_OBJECT_pop_free(ctx->x509_store.objs, NULL);
  2140. ctx->x509_store.objs = NULL;
  2141. }
  2142. #endif
  2143. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
  2144. defined(WOLFSSL_WPAS_SMALL)
  2145. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  2146. #endif
  2147. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  2148. wolfSSL_sk_X509_NAME_pop_free(ctx->ca_names, NULL);
  2149. ctx->ca_names = NULL;
  2150. #endif
  2151. #ifdef OPENSSL_EXTRA
  2152. if (ctx->x509Chain) {
  2153. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  2154. ctx->x509Chain = NULL;
  2155. }
  2156. #endif
  2157. #endif /* !NO_CERTS */
  2158. #ifdef HAVE_TLS_EXTENSIONS
  2159. #if !defined(NO_TLS)
  2160. TLSX_FreeAll(ctx->extensions, ctx->heap);
  2161. #endif /* !NO_TLS */
  2162. #ifndef NO_WOLFSSL_SERVER
  2163. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  2164. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  2165. if (ctx->certOcspRequest) {
  2166. FreeOcspRequest(ctx->certOcspRequest);
  2167. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2168. }
  2169. #endif
  2170. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2171. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  2172. if (ctx->chainOcspRequest[i]) {
  2173. FreeOcspRequest(ctx->chainOcspRequest[i]);
  2174. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2175. ctx->chainOcspRequest[i] = NULL;
  2176. }
  2177. }
  2178. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2179. #endif /* !NO_WOLFSSL_SERVER */
  2180. #endif /* HAVE_TLS_EXTENSIONS */
  2181. #ifdef OPENSSL_EXTRA
  2182. if (ctx->alpn_cli_protos) {
  2183. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  2184. ctx->alpn_cli_protos = NULL;
  2185. }
  2186. if (ctx->param) {
  2187. XFREE(ctx->param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2188. ctx->param = NULL;
  2189. }
  2190. if (ctx->x509_store.lookup.dirs) {
  2191. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  2192. if (ctx->x509_store.lookup.dirs->dir_entry) {
  2193. wolfSSL_sk_BY_DIR_entry_free(ctx->x509_store.lookup.dirs->dir_entry);
  2194. }
  2195. #endif
  2196. wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
  2197. XFREE(ctx->x509_store.lookup.dirs, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2198. }
  2199. #endif
  2200. #ifdef WOLFSSL_STATIC_EPHEMERAL
  2201. #ifndef NO_DH
  2202. FreeDer(&ctx->staticKE.dhKey);
  2203. #endif
  2204. #ifdef HAVE_ECC
  2205. FreeDer(&ctx->staticKE.ecKey);
  2206. #endif
  2207. #ifdef HAVE_CURVE25519
  2208. FreeDer(&ctx->staticKE.x25519Key);
  2209. #endif
  2210. #ifdef HAVE_CURVE448
  2211. FreeDer(&ctx->staticKE.x448Key);
  2212. #endif
  2213. #ifndef SINGLE_THREADED
  2214. if (ctx->staticKELockInit) {
  2215. wc_FreeMutex(&ctx->staticKELock);
  2216. ctx->staticKELockInit = 0;
  2217. }
  2218. #endif
  2219. #endif
  2220. (void)heapAtCTXInit;
  2221. }
  2222. #ifdef WOLFSSL_STATIC_MEMORY
  2223. static void SSL_CtxResourceFreeStaticMem(void* heap)
  2224. {
  2225. if (heap != NULL
  2226. #ifdef WOLFSSL_HEAP_TEST
  2227. /* avoid dereferencing a test value */
  2228. && heap != (void*)WOLFSSL_HEAP_TEST
  2229. #endif
  2230. ) {
  2231. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)heap;
  2232. WOLFSSL_HEAP* mem = hint->memory;
  2233. wc_FreeMutex(&mem->memory_mutex);
  2234. }
  2235. }
  2236. #endif /* WOLFSSL_STATIC_MEMORY */
  2237. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  2238. {
  2239. int refCount;
  2240. void* heap = ctx->heap;
  2241. #ifdef WOLFSSL_STATIC_MEMORY
  2242. if (ctx->onHeapHint == 0) {
  2243. heap = NULL;
  2244. }
  2245. #endif
  2246. /* decrement CTX reference count */
  2247. if ((refCount = SSL_CTX_RefCount(ctx, -1)) < 0) {
  2248. /* check error state, if mutex error code then mutex init failed but
  2249. * CTX was still malloc'd */
  2250. if (ctx->err == CTX_INIT_MUTEX_E) {
  2251. SSL_CtxResourceFree(ctx);
  2252. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2253. #ifdef WOLFSSL_STATIC_MEMORY
  2254. SSL_CtxResourceFreeStaticMem(heap);
  2255. #endif
  2256. }
  2257. return;
  2258. }
  2259. if (refCount == 0) {
  2260. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  2261. SSL_CtxResourceFree(ctx);
  2262. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  2263. !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  2264. TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
  2265. #endif
  2266. wc_FreeMutex(&ctx->countMutex);
  2267. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2268. #ifdef WOLFSSL_STATIC_MEMORY
  2269. SSL_CtxResourceFreeStaticMem(heap);
  2270. #endif
  2271. }
  2272. else {
  2273. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  2274. }
  2275. (void)heap; /* not used in some builds */
  2276. }
  2277. /* Set cipher pointers to null */
  2278. void InitCiphers(WOLFSSL* ssl)
  2279. {
  2280. #ifdef BUILD_ARC4
  2281. ssl->encrypt.arc4 = NULL;
  2282. ssl->decrypt.arc4 = NULL;
  2283. #endif
  2284. #ifdef BUILD_DES3
  2285. ssl->encrypt.des3 = NULL;
  2286. ssl->decrypt.des3 = NULL;
  2287. #endif
  2288. #ifdef BUILD_AES
  2289. ssl->encrypt.aes = NULL;
  2290. ssl->decrypt.aes = NULL;
  2291. #endif
  2292. #ifdef HAVE_CAMELLIA
  2293. ssl->encrypt.cam = NULL;
  2294. ssl->decrypt.cam = NULL;
  2295. #endif
  2296. #ifdef HAVE_CHACHA
  2297. ssl->encrypt.chacha = NULL;
  2298. ssl->decrypt.chacha = NULL;
  2299. #endif
  2300. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2301. ssl->auth.poly1305 = NULL;
  2302. #endif
  2303. ssl->encrypt.setup = 0;
  2304. ssl->decrypt.setup = 0;
  2305. #ifdef HAVE_ONE_TIME_AUTH
  2306. ssl->auth.setup = 0;
  2307. #endif
  2308. #ifdef WOLFSSL_DTLS13
  2309. XMEMSET(&ssl->dtlsRecordNumberEncrypt, 0,
  2310. sizeof(ssl->dtlsRecordNumberEncrypt));
  2311. XMEMSET(&ssl->dtlsRecordNumberDecrypt, 0,
  2312. sizeof(ssl->dtlsRecordNumberEncrypt));
  2313. #endif /* WOLFSSL_DTLS13 */
  2314. }
  2315. /* Free ciphers */
  2316. void FreeCiphers(WOLFSSL* ssl)
  2317. {
  2318. (void)ssl;
  2319. #ifdef BUILD_ARC4
  2320. wc_Arc4Free(ssl->encrypt.arc4);
  2321. wc_Arc4Free(ssl->decrypt.arc4);
  2322. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2323. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2324. #endif
  2325. #ifdef BUILD_DES3
  2326. wc_Des3Free(ssl->encrypt.des3);
  2327. wc_Des3Free(ssl->decrypt.des3);
  2328. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2329. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2330. #endif
  2331. #if defined(BUILD_AES) || defined(BUILD_AESGCM) /* See: InitKeys() in keys.c
  2332. * on addition of BUILD_AESGCM
  2333. * check (enc->aes, dec->aes) */
  2334. wc_AesFree(ssl->encrypt.aes);
  2335. wc_AesFree(ssl->decrypt.aes);
  2336. #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \
  2337. !defined(WOLFSSL_NO_TLS12)
  2338. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2339. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2340. #endif
  2341. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2342. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2343. #endif
  2344. #ifdef CIPHER_NONCE
  2345. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2346. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2347. #endif
  2348. #ifdef HAVE_CAMELLIA
  2349. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2350. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2351. #endif
  2352. #ifdef HAVE_CHACHA
  2353. if (ssl->encrypt.chacha)
  2354. ForceZero(ssl->encrypt.chacha, sizeof(ChaCha));
  2355. if (ssl->decrypt.chacha)
  2356. ForceZero(ssl->decrypt.chacha, sizeof(ChaCha));
  2357. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2358. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2359. #endif
  2360. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2361. if (ssl->auth.poly1305)
  2362. ForceZero(ssl->auth.poly1305, sizeof(Poly1305));
  2363. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2364. #endif
  2365. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  2366. wc_HmacFree(ssl->encrypt.hmac);
  2367. wc_HmacFree(ssl->decrypt.hmac);
  2368. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2369. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2370. #endif
  2371. #ifdef WOLFSSL_DTLS13
  2372. #ifdef BUILD_AES
  2373. if (ssl->dtlsRecordNumberEncrypt.aes != NULL) {
  2374. wc_AesFree(ssl->dtlsRecordNumberEncrypt.aes);
  2375. XFREE(ssl->dtlsRecordNumberEncrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2376. ssl->dtlsRecordNumberEncrypt.aes = NULL;
  2377. }
  2378. if (ssl->dtlsRecordNumberDecrypt.aes != NULL) {
  2379. wc_AesFree(ssl->dtlsRecordNumberDecrypt.aes);
  2380. XFREE(ssl->dtlsRecordNumberDecrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2381. ssl->dtlsRecordNumberDecrypt.aes = NULL;
  2382. }
  2383. #endif /* BUILD_AES */
  2384. #ifdef HAVE_CHACHA
  2385. XFREE(ssl->dtlsRecordNumberEncrypt.chacha,
  2386. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2387. XFREE(ssl->dtlsRecordNumberDecrypt.chacha,
  2388. ssl->heap, DYNAMIC_TYPE_CIPHER);
  2389. ssl->dtlsRecordNumberEncrypt.chacha = NULL;
  2390. ssl->dtlsRecordNumberDecrypt.chacha = NULL;
  2391. #endif /* HAVE_CHACHA */
  2392. #endif /* WOLFSSL_DTLS13 */
  2393. }
  2394. void InitCipherSpecs(CipherSpecs* cs)
  2395. {
  2396. XMEMSET(cs, 0, sizeof(CipherSpecs));
  2397. cs->bulk_cipher_algorithm = INVALID_BYTE;
  2398. cs->cipher_type = INVALID_BYTE;
  2399. cs->mac_algorithm = INVALID_BYTE;
  2400. cs->kea = INVALID_BYTE;
  2401. cs->sig_algo = INVALID_BYTE;
  2402. }
  2403. #if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
  2404. defined(HAVE_ECC))
  2405. static int GetMacDigestSize(byte macAlgo)
  2406. {
  2407. switch (macAlgo) {
  2408. #ifndef NO_SHA
  2409. case sha_mac:
  2410. return WC_SHA_DIGEST_SIZE;
  2411. #endif
  2412. #ifndef NO_SHA256
  2413. case sha256_mac:
  2414. return WC_SHA256_DIGEST_SIZE;
  2415. #endif
  2416. #ifdef WOLFSSL_SHA384
  2417. case sha384_mac:
  2418. return WC_SHA384_DIGEST_SIZE;
  2419. #endif
  2420. #ifdef WOLFSSL_SHA512
  2421. case sha512_mac:
  2422. return WC_SHA512_DIGEST_SIZE;
  2423. #endif
  2424. default:
  2425. break;
  2426. }
  2427. return NOT_COMPILED_IN;
  2428. }
  2429. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2430. static WC_INLINE void AddSuiteHashSigAlgo(Suites* suites, byte macAlgo,
  2431. byte sigAlgo, int keySz, word16* inOutIdx)
  2432. {
  2433. int addSigAlgo = 1;
  2434. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  2435. if (sigAlgo == ecc_dsa_sa_algo) {
  2436. int digestSz = GetMacDigestSize(macAlgo);
  2437. /* do not add sig/algos with digest size larger than key size */
  2438. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  2439. addSigAlgo = 0;
  2440. }
  2441. }
  2442. #else
  2443. (void)keySz;
  2444. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2445. if (addSigAlgo) {
  2446. #ifdef HAVE_ED25519
  2447. if (sigAlgo == ed25519_sa_algo) {
  2448. suites->hashSigAlgo[*inOutIdx] = ED25519_SA_MAJOR;
  2449. *inOutIdx += 1;
  2450. suites->hashSigAlgo[*inOutIdx] = ED25519_SA_MINOR;
  2451. *inOutIdx += 1;
  2452. }
  2453. else
  2454. #endif
  2455. #ifdef HAVE_ED448
  2456. if (sigAlgo == ed448_sa_algo) {
  2457. suites->hashSigAlgo[*inOutIdx] = ED448_SA_MAJOR;
  2458. *inOutIdx += 1;
  2459. suites->hashSigAlgo[*inOutIdx] = ED448_SA_MINOR;
  2460. *inOutIdx += 1;
  2461. }
  2462. else
  2463. #endif
  2464. #ifdef HAVE_PQC
  2465. #ifdef HAVE_FALCON
  2466. if (sigAlgo == falcon_level1_sa_algo) {
  2467. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL1_SA_MAJOR;
  2468. *inOutIdx += 1;
  2469. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL1_SA_MINOR;
  2470. *inOutIdx += 1;
  2471. }
  2472. else
  2473. if (sigAlgo == falcon_level5_sa_algo) {
  2474. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL5_SA_MAJOR;
  2475. *inOutIdx += 1;
  2476. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL5_SA_MINOR;
  2477. *inOutIdx += 1;
  2478. }
  2479. else
  2480. #endif /* HAVE_FALCON */
  2481. #ifdef HAVE_DILITHIUM
  2482. if (sigAlgo == dilithium_level2_sa_algo) {
  2483. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL2_SA_MAJOR;
  2484. *inOutIdx += 1;
  2485. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL2_SA_MINOR;
  2486. *inOutIdx += 1;
  2487. }
  2488. else
  2489. if (sigAlgo == dilithium_level3_sa_algo) {
  2490. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL3_SA_MAJOR;
  2491. *inOutIdx += 1;
  2492. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL3_SA_MINOR;
  2493. *inOutIdx += 1;
  2494. }
  2495. else
  2496. if (sigAlgo == dilithium_level5_sa_algo) {
  2497. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL5_SA_MAJOR;
  2498. *inOutIdx += 1;
  2499. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_LEVEL5_SA_MINOR;
  2500. *inOutIdx += 1;
  2501. }
  2502. else
  2503. if (sigAlgo == dilithium_aes_level2_sa_algo) {
  2504. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL2_SA_MAJOR;
  2505. *inOutIdx += 1;
  2506. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL2_SA_MINOR;
  2507. *inOutIdx += 1;
  2508. }
  2509. else
  2510. if (sigAlgo == dilithium_aes_level3_sa_algo) {
  2511. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL3_SA_MAJOR;
  2512. *inOutIdx += 1;
  2513. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL3_SA_MINOR;
  2514. *inOutIdx += 1;
  2515. }
  2516. else
  2517. if (sigAlgo == dilithium_aes_level5_sa_algo) {
  2518. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL5_SA_MAJOR;
  2519. *inOutIdx += 1;
  2520. suites->hashSigAlgo[*inOutIdx] = DILITHIUM_AES_LEVEL5_SA_MINOR;
  2521. *inOutIdx += 1;
  2522. }
  2523. else
  2524. #endif /* HAVE_DILITHIUM */
  2525. #endif /* HAVE_PQC */
  2526. #ifdef WC_RSA_PSS
  2527. if (sigAlgo == rsa_pss_sa_algo) {
  2528. /* RSA PSS is sig then mac */
  2529. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2530. *inOutIdx += 1;
  2531. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  2532. *inOutIdx += 1;
  2533. #ifdef WOLFSSL_TLS13
  2534. /* Add the certificate algorithm as well */
  2535. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2536. *inOutIdx += 1;
  2537. suites->hashSigAlgo[*inOutIdx] = PSS_RSAE_TO_PSS_PSS(macAlgo);
  2538. *inOutIdx += 1;
  2539. #endif
  2540. }
  2541. else
  2542. #endif
  2543. {
  2544. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  2545. *inOutIdx += 1;
  2546. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2547. *inOutIdx += 1;
  2548. }
  2549. }
  2550. }
  2551. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  2552. int haveFalconSig, int haveDilithiumSig,
  2553. int haveAnon, int tls1_2, int keySz)
  2554. {
  2555. word16 idx = 0;
  2556. (void)tls1_2;
  2557. (void)keySz;
  2558. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  2559. if (haveECDSAsig) {
  2560. #ifdef HAVE_ECC
  2561. #ifdef WOLFSSL_SHA512
  2562. AddSuiteHashSigAlgo(suites, sha512_mac, ecc_dsa_sa_algo, keySz, &idx);
  2563. #endif
  2564. #ifdef WOLFSSL_SHA384
  2565. AddSuiteHashSigAlgo(suites, sha384_mac, ecc_dsa_sa_algo, keySz, &idx);
  2566. #endif
  2567. #ifndef NO_SHA256
  2568. AddSuiteHashSigAlgo(suites, sha256_mac, ecc_dsa_sa_algo, keySz, &idx);
  2569. #endif
  2570. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2571. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2572. AddSuiteHashSigAlgo(suites, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  2573. #endif
  2574. #endif
  2575. #ifdef HAVE_ED25519
  2576. AddSuiteHashSigAlgo(suites, no_mac, ed25519_sa_algo, keySz, &idx);
  2577. #endif
  2578. #ifdef HAVE_ED448
  2579. AddSuiteHashSigAlgo(suites, no_mac, ed448_sa_algo, keySz, &idx);
  2580. #endif
  2581. }
  2582. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  2583. if (haveFalconSig) {
  2584. #if defined(HAVE_PQC)
  2585. #ifdef HAVE_FALCON
  2586. AddSuiteHashSigAlgo(suites, no_mac, falcon_level1_sa_algo, keySz, &idx);
  2587. AddSuiteHashSigAlgo(suites, no_mac, falcon_level5_sa_algo, keySz, &idx);
  2588. #endif /* HAVE_FALCON */
  2589. #endif /* HAVE_PQC */
  2590. }
  2591. if (haveDilithiumSig) {
  2592. #if defined(HAVE_PQC)
  2593. #ifdef HAVE_DILITHIUM
  2594. AddSuiteHashSigAlgo(suites, no_mac, dilithium_level2_sa_algo, keySz,
  2595. &idx);
  2596. AddSuiteHashSigAlgo(suites, no_mac, dilithium_level3_sa_algo, keySz,
  2597. &idx);
  2598. AddSuiteHashSigAlgo(suites, no_mac, dilithium_level5_sa_algo, keySz,
  2599. &idx);
  2600. AddSuiteHashSigAlgo(suites, no_mac, dilithium_aes_level2_sa_algo, keySz,
  2601. &idx);
  2602. AddSuiteHashSigAlgo(suites, no_mac, dilithium_aes_level3_sa_algo, keySz,
  2603. &idx);
  2604. AddSuiteHashSigAlgo(suites, no_mac, dilithium_aes_level5_sa_algo, keySz,
  2605. &idx);
  2606. #endif /* HAVE_DILITHIUM */
  2607. #endif /* HAVE_PQC */
  2608. }
  2609. if (haveRSAsig) {
  2610. #ifdef WC_RSA_PSS
  2611. if (tls1_2) {
  2612. #ifdef WOLFSSL_SHA512
  2613. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_pss_sa_algo, keySz,
  2614. &idx);
  2615. #endif
  2616. #ifdef WOLFSSL_SHA384
  2617. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_pss_sa_algo, keySz,
  2618. &idx);
  2619. #endif
  2620. #ifndef NO_SHA256
  2621. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_pss_sa_algo, keySz,
  2622. &idx);
  2623. #endif
  2624. }
  2625. #endif
  2626. #ifdef WOLFSSL_SHA512
  2627. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_sa_algo, keySz, &idx);
  2628. #endif
  2629. #ifdef WOLFSSL_SHA384
  2630. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_sa_algo, keySz, &idx);
  2631. #endif
  2632. #ifndef NO_SHA256
  2633. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_sa_algo, keySz, &idx);
  2634. #endif
  2635. #ifdef WOLFSSL_SHA224
  2636. AddSuiteHashSigAlgo(suites, sha224_mac, rsa_sa_algo, keySz, &idx);
  2637. #endif
  2638. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2639. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2640. AddSuiteHashSigAlgo(suites, sha_mac, rsa_sa_algo, keySz, &idx);
  2641. #endif
  2642. }
  2643. #ifdef HAVE_ANON
  2644. if (haveAnon) {
  2645. AddSuiteHashSigAlgo(suites, sha_mac, anonymous_sa_algo, keySz, &idx);
  2646. }
  2647. #endif
  2648. (void)haveAnon;
  2649. (void)haveECDSAsig;
  2650. suites->hashSigAlgoSz = idx;
  2651. }
  2652. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  2653. word16 havePSK, word16 haveDH, word16 haveECDSAsig,
  2654. word16 haveECC, word16 haveStaticRSA, word16 haveStaticECC,
  2655. word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon,
  2656. word16 haveNull, int side)
  2657. {
  2658. word16 idx = 0;
  2659. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  2660. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  2661. #ifdef WOLFSSL_TLS13
  2662. int tls1_3 = IsAtLeastTLSv1_3(pv);
  2663. #endif
  2664. int dtls = 0;
  2665. int haveRSAsig = 1;
  2666. #ifdef WOLFSSL_DTLS
  2667. /* If DTLS v1.2 or later than set tls1_2 flag */
  2668. if (pv.major == DTLS_MAJOR && pv.minor <= DTLSv1_2_MINOR) {
  2669. tls1_2 = 1;
  2670. }
  2671. #endif
  2672. (void)tls; /* shut up compiler */
  2673. (void)tls1_2;
  2674. (void)dtls;
  2675. (void)haveDH;
  2676. (void)havePSK;
  2677. (void)haveStaticRSA;
  2678. (void)haveStaticECC;
  2679. (void)haveECC;
  2680. (void)side;
  2681. (void)haveRSA; /* some builds won't read */
  2682. (void)haveRSAsig; /* non ecc builds won't read */
  2683. (void)haveAnon; /* anon ciphers optional */
  2684. (void)haveNull;
  2685. (void)haveFalconSig;
  2686. (void)haveDilithiumSig;
  2687. if (suites == NULL) {
  2688. WOLFSSL_MSG("InitSuites pointer error");
  2689. return;
  2690. }
  2691. if (suites->setSuites)
  2692. return; /* trust user settings, don't override */
  2693. #ifdef WOLFSSL_TLS13
  2694. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  2695. if (tls1_3) {
  2696. suites->suites[idx++] = TLS13_BYTE;
  2697. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  2698. }
  2699. #endif
  2700. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  2701. if (tls1_3) {
  2702. suites->suites[idx++] = TLS13_BYTE;
  2703. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  2704. }
  2705. #endif
  2706. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  2707. if (tls1_3) {
  2708. suites->suites[idx++] = TLS13_BYTE;
  2709. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  2710. }
  2711. #endif
  2712. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  2713. if (tls1_3) {
  2714. suites->suites[idx++] = TLS13_BYTE;
  2715. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  2716. }
  2717. #endif
  2718. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  2719. if (tls1_3) {
  2720. suites->suites[idx++] = TLS13_BYTE;
  2721. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  2722. }
  2723. #endif
  2724. #ifdef HAVE_NULL_CIPHER
  2725. #ifdef BUILD_TLS_SHA256_SHA256
  2726. if (tls1_3 && haveNull) {
  2727. suites->suites[idx++] = ECC_BYTE;
  2728. suites->suites[idx++] = TLS_SHA256_SHA256;
  2729. }
  2730. #endif
  2731. #ifdef BUILD_TLS_SHA384_SHA384
  2732. if (tls1_3 && haveNull) {
  2733. suites->suites[idx++] = ECC_BYTE;
  2734. suites->suites[idx++] = TLS_SHA384_SHA384;
  2735. }
  2736. #endif
  2737. #endif
  2738. #endif /* WOLFSSL_TLS13 */
  2739. #ifndef WOLFSSL_NO_TLS12
  2740. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  2741. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  2742. haveRSA = 0; /* can't do RSA with ECDSA key */
  2743. }
  2744. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  2745. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  2746. }
  2747. #endif /* !NO_WOLFSSL_SERVER */
  2748. #ifdef WOLFSSL_DTLS
  2749. if (pv.major == DTLS_MAJOR) {
  2750. dtls = 1;
  2751. tls = 1;
  2752. /* May be dead assignments dependent upon configuration */
  2753. (void) dtls;
  2754. (void) tls;
  2755. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  2756. }
  2757. #endif
  2758. #ifdef HAVE_RENEGOTIATION_INDICATION
  2759. if (side == WOLFSSL_CLIENT_END) {
  2760. suites->suites[idx++] = CIPHER_BYTE;
  2761. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  2762. }
  2763. #endif
  2764. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2765. if (tls1_2 && haveECC) {
  2766. suites->suites[idx++] = ECC_BYTE;
  2767. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2768. }
  2769. #endif
  2770. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2771. if (tls1_2 && haveECC) {
  2772. suites->suites[idx++] = ECC_BYTE;
  2773. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2774. }
  2775. #endif
  2776. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2777. if (tls1_2 && haveRSA) {
  2778. suites->suites[idx++] = ECC_BYTE;
  2779. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2780. }
  2781. #endif
  2782. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2783. if (tls1_2 && haveRSA) {
  2784. suites->suites[idx++] = ECC_BYTE;
  2785. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2786. }
  2787. #endif
  2788. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2789. if (tls1_2 && haveDH && haveRSA) {
  2790. suites->suites[idx++] = CIPHER_BYTE;
  2791. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2792. }
  2793. #endif
  2794. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2795. if (tls1_2 && haveDH && haveRSA) {
  2796. suites->suites[idx++] = CIPHER_BYTE;
  2797. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2798. }
  2799. #endif
  2800. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  2801. if (tls1_2 && haveRSA && haveStaticRSA) {
  2802. suites->suites[idx++] = CIPHER_BYTE;
  2803. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  2804. }
  2805. #endif
  2806. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  2807. if (tls1_2 && haveRSA && haveStaticRSA) {
  2808. suites->suites[idx++] = CIPHER_BYTE;
  2809. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  2810. }
  2811. #endif
  2812. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  2813. if (tls1_2 && haveECC && haveStaticECC) {
  2814. suites->suites[idx++] = ECC_BYTE;
  2815. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  2816. }
  2817. #endif
  2818. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  2819. if (tls1_2 && haveECC && haveStaticECC) {
  2820. suites->suites[idx++] = ECC_BYTE;
  2821. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  2822. }
  2823. #endif
  2824. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  2825. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2826. suites->suites[idx++] = ECC_BYTE;
  2827. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  2828. }
  2829. #endif
  2830. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  2831. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2832. suites->suites[idx++] = ECC_BYTE;
  2833. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  2834. }
  2835. #endif
  2836. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  2837. if (tls1_2 && haveDH && havePSK) {
  2838. suites->suites[idx++] = CIPHER_BYTE;
  2839. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  2840. }
  2841. #endif
  2842. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  2843. if (tls1_2 && haveDH && haveAnon) {
  2844. suites->suites[idx++] = CIPHER_BYTE;
  2845. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  2846. }
  2847. #endif
  2848. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  2849. if (tls1_2 && haveDH && haveAnon) {
  2850. suites->suites[idx++] = CIPHER_BYTE;
  2851. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  2852. }
  2853. #endif
  2854. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  2855. if (tls1_2 && haveDH && havePSK) {
  2856. suites->suites[idx++] = CIPHER_BYTE;
  2857. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  2858. }
  2859. #endif
  2860. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  2861. if (tls1_2 && havePSK) {
  2862. suites->suites[idx++] = CIPHER_BYTE;
  2863. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  2864. }
  2865. #endif
  2866. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  2867. if (tls1_2 && havePSK) {
  2868. suites->suites[idx++] = CIPHER_BYTE;
  2869. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  2870. }
  2871. #endif
  2872. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  2873. if (tls1_2 && haveECC) {
  2874. suites->suites[idx++] = CHACHA_BYTE;
  2875. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  2876. }
  2877. #endif
  2878. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2879. if (tls1_2 && haveRSA) {
  2880. suites->suites[idx++] = CHACHA_BYTE;
  2881. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2882. }
  2883. #endif
  2884. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2885. if (tls1_2 && haveRSA) {
  2886. suites->suites[idx++] = CHACHA_BYTE;
  2887. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2888. }
  2889. #endif
  2890. /* Place as higher priority for MYSQL */
  2891. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  2892. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2893. if (tls && haveDH && haveRSA) {
  2894. suites->suites[idx++] = CIPHER_BYTE;
  2895. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2896. }
  2897. #endif
  2898. #endif
  2899. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  2900. if (tls1_2 && haveRSA) {
  2901. suites->suites[idx++] = ECC_BYTE;
  2902. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  2903. }
  2904. #endif
  2905. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  2906. if (tls1_2 && haveECC) {
  2907. suites->suites[idx++] = ECC_BYTE;
  2908. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  2909. }
  2910. #endif
  2911. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  2912. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2913. suites->suites[idx++] = ECC_BYTE;
  2914. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  2915. }
  2916. #endif
  2917. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  2918. if (tls1_2 && haveECC && haveStaticECC) {
  2919. suites->suites[idx++] = ECC_BYTE;
  2920. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  2921. }
  2922. #endif
  2923. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  2924. if (tls1_2 && haveRSA) {
  2925. suites->suites[idx++] = ECC_BYTE;
  2926. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  2927. }
  2928. #endif
  2929. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2930. if (tls1_2 && haveECC) {
  2931. suites->suites[idx++] = ECC_BYTE;
  2932. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  2933. }
  2934. #endif
  2935. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  2936. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2937. suites->suites[idx++] = ECC_BYTE;
  2938. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  2939. }
  2940. #endif
  2941. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  2942. if (tls1_2 && haveECC && haveStaticECC) {
  2943. suites->suites[idx++] = ECC_BYTE;
  2944. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  2945. }
  2946. #endif
  2947. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  2948. if (tls && haveECC) {
  2949. suites->suites[idx++] = ECC_BYTE;
  2950. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  2951. }
  2952. #endif
  2953. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  2954. if (tls && haveECC && haveStaticECC) {
  2955. suites->suites[idx++] = ECC_BYTE;
  2956. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  2957. }
  2958. #endif
  2959. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  2960. if (tls && haveECC) {
  2961. suites->suites[idx++] = ECC_BYTE;
  2962. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  2963. }
  2964. #endif
  2965. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  2966. if (tls && haveECC && haveStaticECC) {
  2967. suites->suites[idx++] = ECC_BYTE;
  2968. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  2969. }
  2970. #endif
  2971. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  2972. if (!dtls && tls && haveECC) {
  2973. suites->suites[idx++] = ECC_BYTE;
  2974. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  2975. }
  2976. #endif
  2977. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  2978. if (!dtls && tls && haveECC && haveStaticECC) {
  2979. suites->suites[idx++] = ECC_BYTE;
  2980. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  2981. }
  2982. #endif
  2983. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  2984. if (tls && haveECC) {
  2985. suites->suites[idx++] = ECC_BYTE;
  2986. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2987. }
  2988. #endif
  2989. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  2990. if (tls && haveECC && haveStaticECC) {
  2991. suites->suites[idx++] = ECC_BYTE;
  2992. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2993. }
  2994. #endif
  2995. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  2996. if (tls && haveRSA) {
  2997. suites->suites[idx++] = ECC_BYTE;
  2998. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  2999. }
  3000. #endif
  3001. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  3002. if (tls && haveRSAsig && haveStaticECC) {
  3003. suites->suites[idx++] = ECC_BYTE;
  3004. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  3005. }
  3006. #endif
  3007. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  3008. if (tls && haveRSA) {
  3009. suites->suites[idx++] = ECC_BYTE;
  3010. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  3011. }
  3012. #endif
  3013. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  3014. if (tls && haveRSAsig && haveStaticECC) {
  3015. suites->suites[idx++] = ECC_BYTE;
  3016. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  3017. }
  3018. #endif
  3019. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  3020. if (!dtls && tls && haveRSA) {
  3021. suites->suites[idx++] = ECC_BYTE;
  3022. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  3023. }
  3024. #endif
  3025. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  3026. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  3027. suites->suites[idx++] = ECC_BYTE;
  3028. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  3029. }
  3030. #endif
  3031. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  3032. if (tls && haveRSA) {
  3033. suites->suites[idx++] = ECC_BYTE;
  3034. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  3035. }
  3036. #endif
  3037. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  3038. if (tls && haveRSAsig && haveStaticECC) {
  3039. suites->suites[idx++] = ECC_BYTE;
  3040. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  3041. }
  3042. #endif
  3043. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  3044. if (tls1_2 && haveECC) {
  3045. suites->suites[idx++] = ECC_BYTE;
  3046. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  3047. }
  3048. #endif
  3049. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  3050. if (tls1_2 && haveECC) {
  3051. suites->suites[idx++] = ECC_BYTE;
  3052. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  3053. }
  3054. #endif
  3055. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  3056. if (tls1_2 && haveECC) {
  3057. suites->suites[idx++] = ECC_BYTE;
  3058. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  3059. }
  3060. #endif
  3061. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  3062. if (tls1_2 && haveRSA && haveStaticRSA) {
  3063. suites->suites[idx++] = ECC_BYTE;
  3064. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  3065. }
  3066. #endif
  3067. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  3068. if (tls1_2 && haveRSA && haveStaticRSA) {
  3069. suites->suites[idx++] = ECC_BYTE;
  3070. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  3071. }
  3072. #endif
  3073. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  3074. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3075. if (tls1_2 && haveDH && haveRSA)
  3076. #else
  3077. if (tls && haveDH && haveRSA)
  3078. #endif
  3079. {
  3080. suites->suites[idx++] = CIPHER_BYTE;
  3081. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  3082. }
  3083. #endif
  3084. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  3085. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3086. if (tls1_2 && haveDH && haveRSA)
  3087. #else
  3088. if (tls && haveDH && haveRSA)
  3089. #endif
  3090. {
  3091. suites->suites[idx++] = CIPHER_BYTE;
  3092. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  3093. }
  3094. #endif
  3095. /* Place as higher priority for MYSQL testing */
  3096. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  3097. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  3098. if (tls && haveDH && haveRSA) {
  3099. suites->suites[idx++] = CIPHER_BYTE;
  3100. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  3101. }
  3102. #endif
  3103. #endif
  3104. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  3105. if (tls && haveDH && haveRSA) {
  3106. suites->suites[idx++] = CIPHER_BYTE;
  3107. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  3108. }
  3109. #endif
  3110. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  3111. if (tls && haveDH && haveRSA) {
  3112. suites->suites[idx++] = CIPHER_BYTE;
  3113. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  3114. }
  3115. #endif
  3116. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  3117. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3118. if (tls1_2 && haveRSA && haveStaticRSA)
  3119. #else
  3120. if (tls && haveRSA && haveStaticRSA)
  3121. #endif
  3122. {
  3123. suites->suites[idx++] = CIPHER_BYTE;
  3124. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  3125. }
  3126. #endif
  3127. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  3128. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3129. if (tls1_2 && haveRSA && haveStaticRSA)
  3130. #else
  3131. if (tls && haveRSA && haveStaticRSA)
  3132. #endif
  3133. {
  3134. suites->suites[idx++] = CIPHER_BYTE;
  3135. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  3136. }
  3137. #endif
  3138. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  3139. if (tls && haveRSA && haveStaticRSA) {
  3140. suites->suites[idx++] = CIPHER_BYTE;
  3141. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  3142. }
  3143. #endif
  3144. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  3145. if (tls && haveRSA && haveStaticRSA) {
  3146. suites->suites[idx++] = CIPHER_BYTE;
  3147. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  3148. }
  3149. #endif
  3150. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3151. if (tls1_2 && haveECC) {
  3152. suites->suites[idx++] = CHACHA_BYTE;
  3153. suites->suites[idx++] =
  3154. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3155. }
  3156. #endif
  3157. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3158. if (tls1_2 && haveRSA) {
  3159. suites->suites[idx++] = CHACHA_BYTE;
  3160. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3161. }
  3162. #endif
  3163. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  3164. if (tls1_2 && haveRSA) {
  3165. suites->suites[idx++] = CHACHA_BYTE;
  3166. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  3167. }
  3168. #endif
  3169. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  3170. if (tls && haveECC && haveNull) {
  3171. suites->suites[idx++] = ECC_BYTE;
  3172. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  3173. }
  3174. #endif
  3175. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  3176. if (tls && haveRSA && haveNull && haveStaticRSA) {
  3177. suites->suites[idx++] = CIPHER_BYTE;
  3178. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  3179. }
  3180. #endif
  3181. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  3182. if (tls && haveRSA && haveNull && haveStaticRSA) {
  3183. suites->suites[idx++] = CIPHER_BYTE;
  3184. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  3185. }
  3186. #endif
  3187. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  3188. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3189. if (tls1_2 && haveRSA && haveNull && haveStaticRSA)
  3190. #else
  3191. if (tls && haveRSA && haveNull && haveStaticRSA)
  3192. #endif
  3193. {
  3194. suites->suites[idx++] = CIPHER_BYTE;
  3195. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  3196. }
  3197. #endif
  3198. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  3199. if (tls && havePSK) {
  3200. suites->suites[idx++] = CIPHER_BYTE;
  3201. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  3202. }
  3203. #endif
  3204. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  3205. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3206. if (tls1_2 && haveDH && havePSK)
  3207. #else
  3208. if (tls && haveDH && havePSK)
  3209. #endif
  3210. {
  3211. suites->suites[idx++] = CIPHER_BYTE;
  3212. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  3213. }
  3214. #endif
  3215. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  3216. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3217. if (tls1_2 && havePSK)
  3218. #else
  3219. if (tls && havePSK)
  3220. #endif
  3221. {
  3222. suites->suites[idx++] = CIPHER_BYTE;
  3223. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  3224. }
  3225. #endif
  3226. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  3227. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3228. if (tls1_2 && haveDH && havePSK)
  3229. #else
  3230. if (tls && haveDH && havePSK)
  3231. #endif
  3232. {
  3233. suites->suites[idx++] = CIPHER_BYTE;
  3234. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  3235. }
  3236. #endif
  3237. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  3238. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3239. if (tls1_2 && havePSK)
  3240. #else
  3241. if (tls1 && havePSK)
  3242. #endif
  3243. {
  3244. suites->suites[idx++] = CIPHER_BYTE;
  3245. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  3246. }
  3247. #endif
  3248. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  3249. if (tls && havePSK) {
  3250. suites->suites[idx++] = CIPHER_BYTE;
  3251. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  3252. }
  3253. #endif
  3254. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  3255. if (tls && haveDH && havePSK) {
  3256. suites->suites[idx++] = ECC_BYTE;
  3257. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  3258. }
  3259. #endif
  3260. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  3261. if (tls && haveDH && havePSK) {
  3262. suites->suites[idx++] = ECC_BYTE;
  3263. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  3264. }
  3265. #endif
  3266. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  3267. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3268. if (tls1_2 && havePSK)
  3269. #else
  3270. if (tls && havePSK)
  3271. #endif
  3272. {
  3273. suites->suites[idx++] = CHACHA_BYTE;
  3274. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3275. }
  3276. #endif
  3277. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3278. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3279. if (tls1_2 && havePSK)
  3280. #else
  3281. if (tls && havePSK)
  3282. #endif
  3283. {
  3284. suites->suites[idx++] = CHACHA_BYTE;
  3285. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3286. }
  3287. #endif
  3288. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3289. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3290. if (tls1_2 && havePSK)
  3291. #else
  3292. if (tls && havePSK)
  3293. #endif
  3294. {
  3295. suites->suites[idx++] = CHACHA_BYTE;
  3296. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3297. }
  3298. #endif
  3299. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  3300. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3301. if (tls1_2 && havePSK)
  3302. #else
  3303. if (tls && havePSK)
  3304. #endif
  3305. {
  3306. suites->suites[idx++] = ECC_BYTE;
  3307. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  3308. }
  3309. #endif
  3310. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
  3311. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3312. if (tls1_2 && havePSK)
  3313. #else
  3314. if (tls && havePSK)
  3315. #endif
  3316. {
  3317. suites->suites[idx++] = ECDHE_PSK_BYTE;
  3318. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256;
  3319. }
  3320. #endif
  3321. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  3322. if (tls && havePSK) {
  3323. suites->suites[idx++] = ECC_BYTE;
  3324. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  3325. }
  3326. #endif
  3327. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  3328. if (tls && havePSK) {
  3329. suites->suites[idx++] = ECC_BYTE;
  3330. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  3331. }
  3332. #endif
  3333. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  3334. if (tls && havePSK) {
  3335. suites->suites[idx++] = ECC_BYTE;
  3336. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  3337. }
  3338. #endif
  3339. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  3340. if (tls && havePSK) {
  3341. suites->suites[idx++] = ECC_BYTE;
  3342. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  3343. }
  3344. #endif
  3345. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  3346. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3347. if (tls1_2 && haveDH && havePSK)
  3348. #else
  3349. if (tls && haveDH && havePSK && haveNull)
  3350. #endif
  3351. {
  3352. suites->suites[idx++] = CIPHER_BYTE;
  3353. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  3354. }
  3355. #endif
  3356. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  3357. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3358. if (tls1_2 && havePSK && haveNull)
  3359. #else
  3360. if (tls && havePSK && haveNull)
  3361. #endif
  3362. {
  3363. suites->suites[idx++] = CIPHER_BYTE;
  3364. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  3365. }
  3366. #endif
  3367. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  3368. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3369. if (tls1_2 && havePSK && haveNull)
  3370. #else
  3371. if (tls && havePSK && haveNull)
  3372. #endif
  3373. {
  3374. suites->suites[idx++] = ECC_BYTE;
  3375. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  3376. }
  3377. #endif
  3378. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  3379. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3380. if (tls1_2 && haveDH && havePSK && haveNull)
  3381. #else
  3382. if (tls && haveDH && havePSK && haveNull)
  3383. #endif
  3384. {
  3385. suites->suites[idx++] = CIPHER_BYTE;
  3386. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  3387. }
  3388. #endif
  3389. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  3390. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3391. if (tls1_2 && havePSK && haveNull)
  3392. #else
  3393. if (tls && havePSK && haveNull)
  3394. #endif
  3395. {
  3396. suites->suites[idx++] = CIPHER_BYTE;
  3397. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  3398. }
  3399. #endif
  3400. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  3401. if (tls && havePSK && haveNull) {
  3402. suites->suites[idx++] = CIPHER_BYTE;
  3403. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  3404. }
  3405. #endif
  3406. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  3407. if (!dtls && haveRSA && haveStaticRSA) {
  3408. suites->suites[idx++] = CIPHER_BYTE;
  3409. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  3410. }
  3411. #endif
  3412. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  3413. if (!dtls && haveRSA && haveStaticRSA) {
  3414. suites->suites[idx++] = CIPHER_BYTE;
  3415. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  3416. }
  3417. #endif
  3418. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  3419. if (haveRSA && haveStaticRSA) {
  3420. suites->suites[idx++] = CIPHER_BYTE;
  3421. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  3422. }
  3423. #endif
  3424. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  3425. if (tls && haveRSA && haveStaticRSA) {
  3426. suites->suites[idx++] = CIPHER_BYTE;
  3427. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3428. }
  3429. #endif
  3430. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  3431. if (tls && haveDH && haveRSA && haveStaticRSA) {
  3432. suites->suites[idx++] = CIPHER_BYTE;
  3433. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3434. }
  3435. #endif
  3436. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  3437. if (tls && haveRSA && haveStaticRSA) {
  3438. suites->suites[idx++] = CIPHER_BYTE;
  3439. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3440. }
  3441. #endif
  3442. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  3443. if (tls && haveDH && haveRSA && haveStaticRSA) {
  3444. suites->suites[idx++] = CIPHER_BYTE;
  3445. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3446. }
  3447. #endif
  3448. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3449. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3450. if (tls1_2 && haveRSA && haveStaticRSA)
  3451. #else
  3452. if (tls && haveRSA && haveStaticRSA)
  3453. #endif
  3454. {
  3455. suites->suites[idx++] = CIPHER_BYTE;
  3456. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3457. }
  3458. #endif
  3459. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3460. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3461. if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
  3462. #else
  3463. if (tls && haveDH && haveRSA && haveStaticRSA)
  3464. #endif
  3465. {
  3466. suites->suites[idx++] = CIPHER_BYTE;
  3467. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3468. }
  3469. #endif
  3470. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3471. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3472. if (tls1_2 && haveRSA && haveStaticRSA)
  3473. #else
  3474. if (tls && haveRSA && haveStaticRSA)
  3475. #endif
  3476. {
  3477. suites->suites[idx++] = CIPHER_BYTE;
  3478. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3479. }
  3480. #endif
  3481. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3482. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3483. if (tls1_2 && haveDH && haveRSA && haveStaticRSA)
  3484. #else
  3485. if (tls && haveDH && haveRSA && haveStaticRSA)
  3486. #endif
  3487. {
  3488. suites->suites[idx++] = CIPHER_BYTE;
  3489. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3490. }
  3491. #endif
  3492. #endif /* !WOLFSSL_NO_TLS12 */
  3493. suites->suiteSz = idx;
  3494. if (suites->hashSigAlgoSz == 0) {
  3495. InitSuitesHashSigAlgo(suites, haveECDSAsig | haveECC,
  3496. haveRSAsig | haveRSA, haveFalconSig,
  3497. haveDilithiumSig, 0, tls1_2, keySz);
  3498. }
  3499. }
  3500. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  3501. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  3502. /* Decode the signature algorithm.
  3503. *
  3504. * input The encoded signature algorithm.
  3505. * hashalgo The hash algorithm.
  3506. * hsType The signature type.
  3507. */
  3508. static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  3509. {
  3510. *hsType = invalid_sa_algo;
  3511. switch (input[0]) {
  3512. case NEW_SA_MAJOR:
  3513. #ifdef HAVE_ED25519
  3514. /* ED25519: 0x0807 */
  3515. if (input[1] == ED25519_SA_MINOR) {
  3516. *hsType = ed25519_sa_algo;
  3517. /* Hash performed as part of sign/verify operation. */
  3518. *hashAlgo = sha512_mac;
  3519. }
  3520. else
  3521. #endif
  3522. #ifdef HAVE_ED448
  3523. /* ED448: 0x0808 */
  3524. if (input[1] == ED448_SA_MINOR) {
  3525. *hsType = ed448_sa_algo;
  3526. /* Hash performed as part of sign/verify operation. */
  3527. *hashAlgo = sha512_mac;
  3528. }
  3529. else
  3530. #endif
  3531. #ifdef WC_RSA_PSS
  3532. /* PSS PSS signatures: 0x080[9-b] */
  3533. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  3534. *hsType = rsa_pss_pss_algo;
  3535. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  3536. }
  3537. else
  3538. #endif
  3539. {
  3540. *hsType = input[0];
  3541. *hashAlgo = input[1];
  3542. }
  3543. break;
  3544. #ifdef HAVE_PQC
  3545. case PQC_SA_MAJOR:
  3546. /* Hash performed as part of sign/verify operation. */
  3547. #ifdef HAVE_FALCON
  3548. if (input[1] == FALCON_LEVEL1_SA_MINOR) {
  3549. *hsType = falcon_level1_sa_algo;
  3550. *hashAlgo = sha512_mac;
  3551. }
  3552. else if (input[1] == FALCON_LEVEL5_SA_MINOR) {
  3553. *hsType = falcon_level5_sa_algo;
  3554. *hashAlgo = sha512_mac;
  3555. }
  3556. #endif /* HAVE_FALCON */
  3557. #ifdef HAVE_DILITHIUM
  3558. if (input[1] == DILITHIUM_LEVEL2_SA_MINOR) {
  3559. *hsType = dilithium_level2_sa_algo;
  3560. *hashAlgo = sha512_mac;
  3561. }
  3562. else if (input[1] == DILITHIUM_LEVEL3_SA_MINOR) {
  3563. *hsType = dilithium_level3_sa_algo;
  3564. *hashAlgo = sha512_mac;
  3565. }
  3566. else if (input[1] == DILITHIUM_LEVEL5_SA_MINOR) {
  3567. *hsType = dilithium_level5_sa_algo;
  3568. *hashAlgo = sha512_mac;
  3569. }
  3570. else if (input[1] == DILITHIUM_AES_LEVEL2_SA_MINOR) {
  3571. *hsType = dilithium_aes_level2_sa_algo;
  3572. *hashAlgo = sha512_mac;
  3573. }
  3574. else if (input[1] == DILITHIUM_AES_LEVEL3_SA_MINOR) {
  3575. *hsType = dilithium_aes_level3_sa_algo;
  3576. *hashAlgo = sha512_mac;
  3577. }
  3578. else if (input[1] == DILITHIUM_AES_LEVEL5_SA_MINOR) {
  3579. *hsType = dilithium_aes_level5_sa_algo;
  3580. *hashAlgo = sha512_mac;
  3581. }
  3582. #endif /* HAVE_DILITHIUM */
  3583. break;
  3584. #endif
  3585. default:
  3586. *hashAlgo = input[0];
  3587. *hsType = input[1];
  3588. break;
  3589. }
  3590. }
  3591. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  3592. #ifndef WOLFSSL_NO_TLS12
  3593. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3594. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  3595. defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
  3596. static enum wc_HashType HashAlgoToType(int hashAlgo)
  3597. {
  3598. switch (hashAlgo) {
  3599. #ifdef WOLFSSL_SHA512
  3600. case sha512_mac:
  3601. return WC_HASH_TYPE_SHA512;
  3602. #endif
  3603. #ifdef WOLFSSL_SHA384
  3604. case sha384_mac:
  3605. return WC_HASH_TYPE_SHA384;
  3606. #endif
  3607. #ifndef NO_SHA256
  3608. case sha256_mac:
  3609. return WC_HASH_TYPE_SHA256;
  3610. #endif
  3611. #ifdef WOLFSSL_SHA224
  3612. case sha224_mac:
  3613. return WC_HASH_TYPE_SHA224;
  3614. #endif
  3615. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  3616. defined(WOLFSSL_ALLOW_TLS_SHA1))
  3617. case sha_mac:
  3618. return WC_HASH_TYPE_SHA;
  3619. #endif
  3620. default:
  3621. WOLFSSL_MSG("Bad hash sig algo");
  3622. break;
  3623. }
  3624. return WC_HASH_TYPE_NONE;
  3625. }
  3626. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  3627. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3628. #endif /* !WOLFSSL_NO_TLS12 */
  3629. #ifndef NO_CERTS
  3630. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
  3631. {
  3632. (void)dynamicFlag;
  3633. if (name != NULL) {
  3634. XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME));
  3635. name->name = name->staticName;
  3636. name->heap = heap;
  3637. name->dynamicName = 0;
  3638. }
  3639. }
  3640. void FreeX509Name(WOLFSSL_X509_NAME* name)
  3641. {
  3642. if (name != NULL) {
  3643. if (name->dynamicName) {
  3644. XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
  3645. name->name = NULL;
  3646. }
  3647. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3648. {
  3649. int i;
  3650. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  3651. if (name->entry[i].object != NULL)
  3652. wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
  3653. if (name->entry[i].value != NULL)
  3654. wolfSSL_ASN1_STRING_free(name->entry[i].value);
  3655. XMEMSET(&name->entry[i], 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  3656. }
  3657. }
  3658. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3659. #ifdef OPENSSL_ALL
  3660. if (name->entries) {
  3661. wolfSSL_sk_X509_NAME_ENTRY_free(name->entries);
  3662. name->entries = NULL;
  3663. }
  3664. #endif
  3665. }
  3666. }
  3667. /* Initialize wolfSSL X509 type */
  3668. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  3669. {
  3670. if (x509 == NULL) {
  3671. WOLFSSL_MSG("Null parameter passed in!");
  3672. return;
  3673. }
  3674. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  3675. x509->heap = heap;
  3676. InitX509Name(&x509->issuer, 0, heap);
  3677. InitX509Name(&x509->subject, 0, heap);
  3678. x509->dynamicMemory = (byte)dynamicFlag;
  3679. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  3680. x509->refCount = 1;
  3681. #ifndef SINGLE_THREADED
  3682. (void)wc_InitMutex(&x509->refMutex);
  3683. #endif
  3684. #endif
  3685. }
  3686. /* Free wolfSSL X509 type */
  3687. void FreeX509(WOLFSSL_X509* x509)
  3688. {
  3689. if (x509 == NULL)
  3690. return;
  3691. FreeX509Name(&x509->issuer);
  3692. FreeX509Name(&x509->subject);
  3693. if (x509->pubKey.buffer) {
  3694. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  3695. x509->pubKey.buffer = NULL;
  3696. }
  3697. FreeDer(&x509->derCert);
  3698. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  3699. x509->sig.buffer = NULL;
  3700. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3701. if (x509->authKeyIdSrc != NULL) {
  3702. XFREE(x509->authKeyIdSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3703. }
  3704. else {
  3705. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3706. }
  3707. x509->authKeyIdSrc = NULL;
  3708. x509->authKeyId = NULL;
  3709. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3710. x509->subjKeyId = NULL;
  3711. if (x509->authInfo != NULL) {
  3712. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3713. x509->authInfo = NULL;
  3714. }
  3715. if (x509->rawCRLInfo != NULL) {
  3716. XFREE(x509->rawCRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3717. x509->rawCRLInfo = NULL;
  3718. }
  3719. if (x509->CRLInfo != NULL) {
  3720. XFREE(x509->CRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3721. x509->CRLInfo = NULL;
  3722. }
  3723. #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \
  3724. defined(WOLFSSL_QT)
  3725. if (x509->authInfoCaIssuer != NULL) {
  3726. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3727. }
  3728. if (x509->ext_sk != NULL) {
  3729. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk, NULL);
  3730. }
  3731. if (x509->ext_sk_full != NULL) {
  3732. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk_full, NULL);
  3733. }
  3734. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  3735. #ifdef OPENSSL_EXTRA
  3736. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  3737. if (x509->serialNumber != NULL) {
  3738. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  3739. }
  3740. #endif
  3741. if (x509->extKeyUsageSrc != NULL) {
  3742. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3743. x509->extKeyUsageSrc= NULL;
  3744. }
  3745. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3746. #if defined(OPENSSL_ALL)
  3747. if (x509->algor.algorithm) {
  3748. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  3749. x509->algor.algorithm = NULL;
  3750. }
  3751. if (x509->key.algor) {
  3752. wolfSSL_X509_ALGOR_free(x509->key.algor);
  3753. x509->key.algor = NULL;
  3754. }
  3755. if (x509->key.pkey) {
  3756. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  3757. x509->key.pkey = NULL;
  3758. }
  3759. if (x509->subjAltNameSrc != NULL) {
  3760. XFREE(x509->subjAltNameSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3761. x509->subjAltNameSrc= NULL;
  3762. }
  3763. #endif /* OPENSSL_ALL */
  3764. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
  3765. if (x509->reqAttributes) {
  3766. wolfSSL_sk_pop_free(x509->reqAttributes, NULL);
  3767. }
  3768. #endif /* WOLFSSL_CERT_REQ */
  3769. if (x509->altNames) {
  3770. FreeAltNames(x509->altNames, x509->heap);
  3771. x509->altNames = NULL;
  3772. }
  3773. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3774. #ifndef SINGLE_THREADED
  3775. wc_FreeMutex(&x509->refMutex);
  3776. #endif
  3777. #endif
  3778. }
  3779. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3780. #if !defined(WOLFSSL_NO_TLS12)
  3781. /* Encode the signature algorithm into buffer.
  3782. *
  3783. * hashalgo The hash algorithm.
  3784. * hsType The signature type.
  3785. * output The buffer to encode into.
  3786. */
  3787. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  3788. {
  3789. switch (hsType) {
  3790. #ifdef HAVE_ECC
  3791. case ecc_dsa_sa_algo:
  3792. output[0] = hashAlgo;
  3793. output[1] = ecc_dsa_sa_algo;
  3794. break;
  3795. #endif
  3796. #ifdef HAVE_ED25519
  3797. case ed25519_sa_algo:
  3798. output[0] = ED25519_SA_MAJOR;
  3799. output[1] = ED25519_SA_MINOR;
  3800. (void)hashAlgo;
  3801. break;
  3802. #endif
  3803. #ifdef HAVE_ED448
  3804. case ed448_sa_algo:
  3805. output[0] = ED448_SA_MAJOR;
  3806. output[1] = ED448_SA_MINOR;
  3807. (void)hashAlgo;
  3808. break;
  3809. #endif
  3810. #ifndef NO_RSA
  3811. case rsa_sa_algo:
  3812. output[0] = hashAlgo;
  3813. output[1] = rsa_sa_algo;
  3814. break;
  3815. #ifdef WC_RSA_PSS
  3816. /* PSS signatures: 0x080[4-6] */
  3817. case rsa_pss_sa_algo:
  3818. output[0] = rsa_pss_sa_algo;
  3819. output[1] = hashAlgo;
  3820. break;
  3821. #endif
  3822. #endif
  3823. default:
  3824. break;
  3825. }
  3826. (void)hashAlgo;
  3827. (void)output;
  3828. }
  3829. #endif
  3830. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  3831. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  3832. {
  3833. switch (hashAlgo) {
  3834. #ifndef NO_SHA
  3835. case sha_mac:
  3836. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  3837. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  3838. break;
  3839. #endif /* !NO_SHA */
  3840. #ifndef NO_SHA256
  3841. case sha256_mac:
  3842. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  3843. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  3844. break;
  3845. #endif /* !NO_SHA256 */
  3846. #ifdef WOLFSSL_SHA384
  3847. case sha384_mac:
  3848. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  3849. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  3850. break;
  3851. #endif /* WOLFSSL_SHA384 */
  3852. #ifdef WOLFSSL_SHA512
  3853. case sha512_mac:
  3854. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  3855. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  3856. break;
  3857. #endif /* WOLFSSL_SHA512 */
  3858. default:
  3859. break;
  3860. } /* switch */
  3861. }
  3862. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  3863. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3864. #endif /* !NO_CERTS */
  3865. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3866. static word32 MacSize(WOLFSSL* ssl)
  3867. {
  3868. #ifdef HAVE_TRUNCATED_HMAC
  3869. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  3870. : ssl->specs.hash_size;
  3871. #else
  3872. word32 digestSz = ssl->specs.hash_size;
  3873. #endif
  3874. return digestSz;
  3875. }
  3876. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  3877. #ifndef NO_RSA
  3878. #if !defined(WOLFSSL_NO_TLS12) || \
  3879. (defined(WC_RSA_PSS) && defined(HAVE_PK_CALLBACKS))
  3880. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3881. static int TypeHash(int hashAlgo)
  3882. {
  3883. switch (hashAlgo) {
  3884. #ifdef WOLFSSL_SHA512
  3885. case sha512_mac:
  3886. return SHA512h;
  3887. #endif
  3888. #ifdef WOLFSSL_SHA384
  3889. case sha384_mac:
  3890. return SHA384h;
  3891. #endif
  3892. #ifndef NO_SHA256
  3893. case sha256_mac:
  3894. return SHA256h;
  3895. #endif
  3896. #ifdef WOLFSSL_SHA224
  3897. case sha224_mac:
  3898. return SHA224h;
  3899. #endif
  3900. #ifndef NO_SHA
  3901. case sha_mac:
  3902. return SHAh;
  3903. #endif
  3904. default:
  3905. break;
  3906. }
  3907. return 0;
  3908. }
  3909. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  3910. #endif /* !WOLFSSL_NO_TLS12 */
  3911. #if defined(WC_RSA_PSS)
  3912. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  3913. {
  3914. switch (hashAlgo) {
  3915. #ifdef WOLFSSL_SHA512
  3916. case sha512_mac:
  3917. *hashType = WC_HASH_TYPE_SHA512;
  3918. if (mgf != NULL)
  3919. *mgf = WC_MGF1SHA512;
  3920. break;
  3921. #endif
  3922. #ifdef WOLFSSL_SHA384
  3923. case sha384_mac:
  3924. *hashType = WC_HASH_TYPE_SHA384;
  3925. if (mgf != NULL)
  3926. *mgf = WC_MGF1SHA384;
  3927. break;
  3928. #endif
  3929. #ifndef NO_SHA256
  3930. case sha256_mac:
  3931. *hashType = WC_HASH_TYPE_SHA256;
  3932. if (mgf != NULL)
  3933. *mgf = WC_MGF1SHA256;
  3934. break;
  3935. #endif
  3936. default:
  3937. return BAD_FUNC_ARG;
  3938. }
  3939. return 0;
  3940. }
  3941. #endif
  3942. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3943. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3944. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3945. DerBuffer* keyBufInfo)
  3946. {
  3947. int ret;
  3948. #ifdef HAVE_PK_CALLBACKS
  3949. const byte* keyBuf = NULL;
  3950. word32 keySz = 0;
  3951. if (keyBufInfo) {
  3952. keyBuf = keyBufInfo->buffer;
  3953. keySz = keyBufInfo->length;
  3954. }
  3955. #endif
  3956. (void)ssl;
  3957. (void)keyBufInfo;
  3958. (void)sigAlgo;
  3959. (void)hashAlgo;
  3960. WOLFSSL_ENTER("RsaSign");
  3961. #ifdef WOLFSSL_ASYNC_CRYPT
  3962. /* initialize event */
  3963. if (key) {
  3964. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3965. if (ret != 0)
  3966. return ret;
  3967. }
  3968. #endif
  3969. #if defined(WC_RSA_PSS)
  3970. if (sigAlgo == rsa_pss_sa_algo) {
  3971. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3972. int mgf = 0;
  3973. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3974. if (ret != 0)
  3975. return ret;
  3976. #if defined(HAVE_PK_CALLBACKS)
  3977. if (ssl->ctx->RsaPssSignCb) {
  3978. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3979. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  3980. TypeHash(hashAlgo), mgf,
  3981. keyBuf, keySz, ctx);
  3982. }
  3983. else
  3984. #endif
  3985. {
  3986. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  3987. ssl->rng);
  3988. }
  3989. }
  3990. else
  3991. #endif
  3992. #if defined(HAVE_PK_CALLBACKS)
  3993. if (ssl->ctx->RsaSignCb) {
  3994. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3995. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3996. ctx);
  3997. }
  3998. else
  3999. #endif /*HAVE_PK_CALLBACKS */
  4000. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  4001. /* Handle async pending response */
  4002. #ifdef WOLFSSL_ASYNC_CRYPT
  4003. if (key && ret == WC_PENDING_E) {
  4004. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4005. }
  4006. #endif /* WOLFSSL_ASYNC_CRYPT */
  4007. /* For positive response return in outSz */
  4008. if (ret > 0) {
  4009. *outSz = ret;
  4010. ret = 0;
  4011. }
  4012. WOLFSSL_LEAVE("RsaSign", ret);
  4013. return ret;
  4014. }
  4015. #endif
  4016. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  4017. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  4018. {
  4019. int ret = SIG_VERIFY_E;
  4020. #ifdef HAVE_PK_CALLBACKS
  4021. const byte* keyBuf = NULL;
  4022. word32 keySz = 0;
  4023. if (keyBufInfo) {
  4024. keyBuf = keyBufInfo->buffer;
  4025. keySz = keyBufInfo->length;
  4026. }
  4027. #endif
  4028. (void)ssl;
  4029. (void)keyBufInfo;
  4030. (void)sigAlgo;
  4031. (void)hashAlgo;
  4032. WOLFSSL_ENTER("RsaVerify");
  4033. #ifdef WOLFSSL_ASYNC_CRYPT
  4034. /* initialize event */
  4035. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4036. if (ret != 0)
  4037. return ret;
  4038. #endif
  4039. #if defined(WC_RSA_PSS)
  4040. if (sigAlgo == rsa_pss_sa_algo) {
  4041. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4042. int mgf = 0;
  4043. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4044. if (ret != 0)
  4045. return ret;
  4046. #ifdef HAVE_PK_CALLBACKS
  4047. if (ssl->ctx->RsaPssVerifyCb) {
  4048. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  4049. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  4050. TypeHash(hashAlgo), mgf,
  4051. keyBuf, keySz, ctx);
  4052. }
  4053. else
  4054. #endif /*HAVE_PK_CALLBACKS */
  4055. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  4056. }
  4057. else
  4058. #endif
  4059. #ifdef HAVE_PK_CALLBACKS
  4060. if (ssl->ctx->RsaVerifyCb) {
  4061. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  4062. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  4063. }
  4064. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4065. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4066. else
  4067. #else
  4068. if (!ssl->ctx->RsaVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4069. #endif
  4070. #endif /*HAVE_PK_CALLBACKS */
  4071. {
  4072. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  4073. }
  4074. /* Handle async pending response */
  4075. #ifdef WOLFSSL_ASYNC_CRYPT
  4076. if (ret == WC_PENDING_E) {
  4077. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4078. }
  4079. #endif /* WOLFSSL_ASYNC_CRYPT */
  4080. WOLFSSL_LEAVE("RsaVerify", ret);
  4081. return ret;
  4082. }
  4083. /* Verify RSA signature, 0 on success */
  4084. /* This function is used to check the sign result */
  4085. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  4086. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  4087. DerBuffer* keyBufInfo)
  4088. {
  4089. byte* out = NULL; /* inline result */
  4090. int ret;
  4091. #ifdef HAVE_PK_CALLBACKS
  4092. const byte* keyBuf = NULL;
  4093. word32 keySz = 0;
  4094. if (keyBufInfo) {
  4095. keyBuf = keyBufInfo->buffer;
  4096. keySz = keyBufInfo->length;
  4097. }
  4098. #endif
  4099. (void)ssl;
  4100. (void)keyBufInfo;
  4101. (void)sigAlgo;
  4102. (void)hashAlgo;
  4103. WOLFSSL_ENTER("VerifyRsaSign");
  4104. if (verifySig == NULL || plain == NULL) {
  4105. return BAD_FUNC_ARG;
  4106. }
  4107. if (sigSz > ENCRYPT_LEN) {
  4108. WOLFSSL_MSG("Signature buffer too big");
  4109. return BUFFER_E;
  4110. }
  4111. #ifdef WOLFSSL_ASYNC_CRYPT
  4112. /* initialize event */
  4113. if (key) {
  4114. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4115. if (ret != 0)
  4116. return ret;
  4117. }
  4118. #endif
  4119. #if defined(WC_RSA_PSS)
  4120. if (sigAlgo == rsa_pss_sa_algo) {
  4121. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  4122. int mgf = 0;
  4123. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  4124. if (ret != 0)
  4125. return ret;
  4126. #ifdef HAVE_PK_CALLBACKS
  4127. if (ssl->ctx->RsaPssSignCheckCb) {
  4128. /* The key buffer includes private/public portion,
  4129. but only public is used */
  4130. /* If HSM hardware is checking the signature result you can
  4131. optionally skip the sign check and return 0 */
  4132. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  4133. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  4134. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  4135. TypeHash(hashAlgo), mgf,
  4136. keyBuf, keySz, ctx);
  4137. if (ret > 0) {
  4138. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  4139. hashType);
  4140. if (ret != 0) {
  4141. ret = VERIFY_CERT_ERROR;
  4142. WOLFSSL_ERROR_VERBOSE(ret);
  4143. }
  4144. }
  4145. }
  4146. else
  4147. #endif /* HAVE_PK_CALLBACKS */
  4148. {
  4149. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  4150. key);
  4151. if (ret > 0) {
  4152. #ifdef HAVE_SELFTEST
  4153. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  4154. hashType);
  4155. #else
  4156. ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret,
  4157. hashType, -1,
  4158. mp_count_bits(&key->n));
  4159. #endif
  4160. if (ret != 0) {
  4161. ret = VERIFY_CERT_ERROR;
  4162. WOLFSSL_ERROR_VERBOSE(ret);
  4163. }
  4164. }
  4165. }
  4166. }
  4167. else
  4168. #endif /* WC_RSA_PSS */
  4169. {
  4170. #ifdef HAVE_PK_CALLBACKS
  4171. if (ssl->ctx->RsaSignCheckCb) {
  4172. /* The key buffer includes private/public portion,
  4173. but only public is used */
  4174. /* If HSM hardware is checking the signature result you can
  4175. optionally skip the sign check and return 0 */
  4176. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  4177. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  4178. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  4179. keyBuf, keySz, ctx);
  4180. }
  4181. else
  4182. #endif /* HAVE_PK_CALLBACKS */
  4183. {
  4184. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  4185. }
  4186. if (ret > 0) {
  4187. if (ret != (int)plainSz || !out ||
  4188. XMEMCMP(plain, out, plainSz) != 0) {
  4189. WOLFSSL_MSG("RSA Signature verification failed");
  4190. ret = RSA_SIGN_FAULT;
  4191. WOLFSSL_ERROR_VERBOSE(ret);
  4192. }
  4193. else {
  4194. ret = 0; /* RSA reset */
  4195. }
  4196. }
  4197. }
  4198. /* Handle async pending response */
  4199. #ifdef WOLFSSL_ASYNC_CRYPT
  4200. if (key && ret == WC_PENDING_E) {
  4201. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4202. }
  4203. #endif /* WOLFSSL_ASYNC_CRYPT */
  4204. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  4205. return ret;
  4206. }
  4207. #ifndef WOLFSSL_NO_TLS12
  4208. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  4209. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  4210. RsaKey* key, DerBuffer* keyBufInfo)
  4211. {
  4212. byte *outTmp;
  4213. byte mask;
  4214. int ret;
  4215. #ifdef HAVE_PK_CALLBACKS
  4216. const byte* keyBuf = NULL;
  4217. word32 keySz = 0;
  4218. if (keyBufInfo) {
  4219. keyBuf = keyBufInfo->buffer;
  4220. keySz = keyBufInfo->length;
  4221. }
  4222. #endif
  4223. (void)ssl;
  4224. (void)keyBufInfo;
  4225. WOLFSSL_ENTER("RsaDec");
  4226. outTmp = *out;
  4227. #ifdef WOLFSSL_ASYNC_CRYPT
  4228. /* initialize event */
  4229. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4230. if (ret != 0)
  4231. return ret;
  4232. #endif
  4233. #ifdef HAVE_PK_CALLBACKS
  4234. if (ssl->ctx->RsaDecCb) {
  4235. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  4236. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, &outTmp, keyBuf, keySz, ctx);
  4237. }
  4238. else
  4239. #endif /* HAVE_PK_CALLBACKS */
  4240. {
  4241. #ifdef WC_RSA_BLINDING
  4242. ret = wc_RsaSetRNG(key, ssl->rng);
  4243. if (ret != 0)
  4244. return ret;
  4245. #endif
  4246. ret = wc_RsaPrivateDecryptInline(in, inSz, &outTmp, key);
  4247. }
  4248. /* Handle async pending response */
  4249. #ifdef WOLFSSL_ASYNC_CRYPT
  4250. if (ret == WC_PENDING_E) {
  4251. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4252. }
  4253. #endif /* WOLFSSL_ASYNC_CRYPT */
  4254. mask = ctMaskGT(ret, 0);
  4255. *outSz = (word32)(ret & (int)(sword8)mask);
  4256. ret &= (int)(sword8)(~mask);
  4257. /* Copy pointer */
  4258. ctMaskCopy(mask, (byte*)out, (byte*)&outTmp, sizeof(*out));
  4259. WOLFSSL_LEAVE("RsaDec", ret);
  4260. return ret;
  4261. }
  4262. #endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
  4263. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  4264. RsaKey* key, buffer* keyBufInfo)
  4265. {
  4266. int ret = BAD_FUNC_ARG;
  4267. #ifdef HAVE_PK_CALLBACKS
  4268. const byte* keyBuf = NULL;
  4269. word32 keySz = 0;
  4270. if (keyBufInfo) {
  4271. keyBuf = keyBufInfo->buffer;
  4272. keySz = keyBufInfo->length;
  4273. }
  4274. #endif
  4275. (void)ssl;
  4276. (void)keyBufInfo;
  4277. WOLFSSL_ENTER("RsaEnc");
  4278. #ifdef WOLFSSL_ASYNC_CRYPT
  4279. /* initialize event */
  4280. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4281. if (ret != 0)
  4282. return ret;
  4283. #endif
  4284. #ifdef HAVE_PK_CALLBACKS
  4285. if (ssl->ctx->RsaEncCb) {
  4286. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  4287. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  4288. }
  4289. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4290. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4291. else
  4292. #else
  4293. if (!ssl->ctx->RsaEncCb || ret == CRYPTOCB_UNAVAILABLE)
  4294. #endif
  4295. #endif /* HAVE_PK_CALLBACKS */
  4296. {
  4297. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  4298. }
  4299. /* Handle async pending response */
  4300. #ifdef WOLFSSL_ASYNC_CRYPT
  4301. if (ret == WC_PENDING_E) {
  4302. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4303. }
  4304. #endif /* WOLFSSL_ASYNC_CRYPT */
  4305. /* For positive response return in outSz */
  4306. if (ret > 0) {
  4307. *outSz = ret;
  4308. ret = 0;
  4309. }
  4310. WOLFSSL_LEAVE("RsaEnc", ret);
  4311. return ret;
  4312. }
  4313. #endif /* !WOLFSSL_NO_TLS12 */
  4314. #endif /* NO_RSA */
  4315. #ifdef HAVE_ECC
  4316. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4317. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  4318. {
  4319. int ret;
  4320. #ifdef HAVE_PK_CALLBACKS
  4321. const byte* keyBuf = NULL;
  4322. word32 keySz = 0;
  4323. if (keyBufInfo) {
  4324. keyBuf = keyBufInfo->buffer;
  4325. keySz = keyBufInfo->length;
  4326. }
  4327. #endif
  4328. (void)ssl;
  4329. (void)keyBufInfo;
  4330. WOLFSSL_ENTER("EccSign");
  4331. #ifdef WOLFSSL_ASYNC_CRYPT
  4332. /* initialize event */
  4333. if (key) {
  4334. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4335. if (ret != 0)
  4336. return ret;
  4337. }
  4338. #endif
  4339. #if defined(HAVE_PK_CALLBACKS)
  4340. if (ssl->ctx->EccSignCb) {
  4341. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  4342. if (ctx == NULL) {
  4343. /* Try to get the WOLFSSL_CTX EccSignCtx*/
  4344. ctx = wolfSSL_CTX_GetEccSignCtx(ssl->ctx);
  4345. }
  4346. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  4347. keySz, ctx);
  4348. }
  4349. else
  4350. #endif /* HAVE_PK_CALLBACKS */
  4351. {
  4352. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4353. }
  4354. /* Handle async pending response */
  4355. #ifdef WOLFSSL_ASYNC_CRYPT
  4356. if (key && ret == WC_PENDING_E) {
  4357. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4358. }
  4359. #endif /* WOLFSSL_ASYNC_CRYPT */
  4360. WOLFSSL_LEAVE("EccSign", ret);
  4361. return ret;
  4362. }
  4363. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  4364. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  4365. {
  4366. int ret = SIG_VERIFY_E;
  4367. #ifdef HAVE_PK_CALLBACKS
  4368. const byte* keyBuf = NULL;
  4369. word32 keySz = 0;
  4370. if (keyBufInfo) {
  4371. keyBuf = keyBufInfo->buffer;
  4372. keySz = keyBufInfo->length;
  4373. }
  4374. #endif
  4375. (void)ssl;
  4376. (void)keyBufInfo;
  4377. WOLFSSL_ENTER("EccVerify");
  4378. #ifdef WOLFSSL_ASYNC_CRYPT
  4379. /* initialize event */
  4380. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4381. if (ret != 0)
  4382. return ret;
  4383. #endif
  4384. #ifdef HAVE_PK_CALLBACKS
  4385. if (ssl->ctx->EccVerifyCb) {
  4386. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  4387. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4388. &ssl->eccVerifyRes, ctx);
  4389. }
  4390. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4391. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4392. else
  4393. #else
  4394. if (!ssl->ctx->EccVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4395. #endif
  4396. #endif /* HAVE_PK_CALLBACKS */
  4397. {
  4398. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  4399. }
  4400. /* Handle async pending response */
  4401. #ifdef WOLFSSL_ASYNC_CRYPT
  4402. if (ret == WC_PENDING_E) {
  4403. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4404. }
  4405. else
  4406. #endif /* WOLFSSL_ASYNC_CRYPT */
  4407. {
  4408. if (ret != 0 || ssl->eccVerifyRes == 0) {
  4409. ret = VERIFY_SIGN_ERROR;
  4410. WOLFSSL_ERROR_VERBOSE(ret);
  4411. }
  4412. else {
  4413. ret = 0;
  4414. }
  4415. }
  4416. WOLFSSL_LEAVE("EccVerify", ret);
  4417. return ret;
  4418. }
  4419. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  4420. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  4421. int side)
  4422. {
  4423. int ret;
  4424. #ifdef WOLFSSL_ASYNC_CRYPT
  4425. WC_ASYNC_DEV* asyncDev = NULL;
  4426. #endif
  4427. (void)ssl;
  4428. (void)pubKeyDer;
  4429. (void)pubKeySz;
  4430. (void)side;
  4431. WOLFSSL_ENTER("EccSharedSecret");
  4432. #ifdef WOLFSSL_ASYNC_CRYPT
  4433. /* initialize event */
  4434. if (priv_key != NULL) {
  4435. asyncDev = &priv_key->asyncDev;
  4436. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4437. if (ret != 0)
  4438. return ret;
  4439. }
  4440. #endif
  4441. #ifdef HAVE_PK_CALLBACKS
  4442. if (ssl->ctx->EccSharedSecretCb) {
  4443. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  4444. ecc_key* otherKey = (side == WOLFSSL_CLIENT_END) ? pub_key : priv_key;
  4445. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  4446. pubKeySz, out, outlen, side, ctx);
  4447. }
  4448. else
  4449. #endif
  4450. {
  4451. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  4452. !defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2)) && \
  4453. !defined(HAVE_SELFTEST)
  4454. ret = wc_ecc_set_rng(priv_key, ssl->rng);
  4455. if (ret == 0)
  4456. #endif
  4457. {
  4458. PRIVATE_KEY_UNLOCK();
  4459. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  4460. PRIVATE_KEY_LOCK();
  4461. }
  4462. }
  4463. /* Handle async pending response */
  4464. #ifdef WOLFSSL_ASYNC_CRYPT
  4465. if (ret == WC_PENDING_E) {
  4466. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  4467. }
  4468. #endif /* WOLFSSL_ASYNC_CRYPT */
  4469. WOLFSSL_LEAVE("EccSharedSecret", ret);
  4470. return ret;
  4471. }
  4472. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  4473. {
  4474. int ret = 0;
  4475. int keySz = 0;
  4476. int ecc_curve = ECC_CURVE_DEF;
  4477. WOLFSSL_ENTER("EccMakeKey");
  4478. #ifdef WOLFSSL_ASYNC_CRYPT
  4479. /* initialize event */
  4480. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4481. if (ret != 0)
  4482. return ret;
  4483. #endif
  4484. /* get key size */
  4485. if (peer == NULL || peer->dp == NULL) {
  4486. keySz = ssl->eccTempKeySz;
  4487. /* get curve type */
  4488. if (ssl->ecdhCurveOID > 0) {
  4489. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  4490. }
  4491. }
  4492. else {
  4493. keySz = peer->dp->size;
  4494. ecc_curve = peer->dp->id;
  4495. }
  4496. #ifdef HAVE_PK_CALLBACKS
  4497. if (ssl->ctx->EccKeyGenCb) {
  4498. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  4499. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  4500. }
  4501. else
  4502. #endif
  4503. {
  4504. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  4505. }
  4506. /* make sure the curve is set for TLS */
  4507. if (ret == 0 && key->dp) {
  4508. ssl->ecdhCurveOID = key->dp->oidSum;
  4509. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4510. ssl->namedGroup = 0;
  4511. #endif
  4512. }
  4513. /* Handle async pending response */
  4514. #ifdef WOLFSSL_ASYNC_CRYPT
  4515. if (ret == WC_PENDING_E) {
  4516. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4517. }
  4518. #endif /* WOLFSSL_ASYNC_CRYPT */
  4519. WOLFSSL_LEAVE("EccMakeKey", ret);
  4520. return ret;
  4521. }
  4522. #endif /* HAVE_ECC */
  4523. #ifdef HAVE_ED25519
  4524. /* Check whether the key contains a public key.
  4525. * If not then pull it out of the leaf certificate.
  4526. *
  4527. * ssl SSL/TLS object.
  4528. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4529. * 0 on success.
  4530. */
  4531. int Ed25519CheckPubKey(WOLFSSL* ssl)
  4532. {
  4533. #ifndef HAVE_ED25519_KEY_IMPORT
  4534. (void)ssl;
  4535. return NOT_COMPILED_IN;
  4536. #else /* HAVE_ED25519_KEY_IMPORT */
  4537. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  4538. int ret = 0;
  4539. /* Public key required for signing. */
  4540. if (key != NULL && !key->pubKeySet) {
  4541. DerBuffer* leaf = ssl->buffers.certificate;
  4542. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert),
  4543. ssl->heap, DYNAMIC_TYPE_DCERT);
  4544. if (cert == NULL)
  4545. ret = MEMORY_E;
  4546. if (ret == 0) {
  4547. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4548. ret = DecodeToKey(cert, 0);
  4549. }
  4550. if (ret == 0) {
  4551. ret = wc_ed25519_import_public(cert->publicKey, cert->pubKeySize,
  4552. key);
  4553. }
  4554. if (cert != NULL) {
  4555. FreeDecodedCert(cert);
  4556. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4557. }
  4558. }
  4559. return ret;
  4560. #endif /* HAVE_ED25519_KEY_IMPORT */
  4561. }
  4562. /* Sign the data using EdDSA and key using Ed25519.
  4563. *
  4564. * ssl SSL object.
  4565. * in Data or message to sign.
  4566. * inSz Length of the data.
  4567. * out Buffer to hold signature.
  4568. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4569. * key The private Ed25519 key data.
  4570. * keySz The length of the private key data in bytes.
  4571. * ctx The callback context.
  4572. * returns 0 on success, otherwise the value is an error.
  4573. */
  4574. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4575. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  4576. {
  4577. #ifndef HAVE_ED25519_SIGN
  4578. (void)ssl;
  4579. (void)in;
  4580. (void)inSz;
  4581. (void)out;
  4582. (void)outSz;
  4583. (void)key;
  4584. (void)keyBufInfo;
  4585. return NOT_COMPILED_IN;
  4586. #else /* HAVE_ED25519_SIGN */
  4587. int ret;
  4588. #ifdef HAVE_PK_CALLBACKS
  4589. const byte* keyBuf = NULL;
  4590. word32 keySz = 0;
  4591. if (keyBufInfo) {
  4592. keyBuf = keyBufInfo->buffer;
  4593. keySz = keyBufInfo->length;
  4594. }
  4595. #endif
  4596. (void)ssl;
  4597. (void)keyBufInfo;
  4598. WOLFSSL_ENTER("Ed25519Sign");
  4599. #ifdef WOLFSSL_ASYNC_CRYPT
  4600. /* initialize event */
  4601. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4602. if (ret != 0)
  4603. return ret;
  4604. #endif
  4605. #if defined(HAVE_PK_CALLBACKS)
  4606. if (ssl->ctx->Ed25519SignCb) {
  4607. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  4608. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  4609. keySz, ctx);
  4610. }
  4611. else
  4612. #endif /* HAVE_PK_CALLBACKS */
  4613. {
  4614. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  4615. }
  4616. /* Handle async pending response */
  4617. #ifdef WOLFSSL_ASYNC_CRYPT
  4618. if (ret == WC_PENDING_E) {
  4619. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4620. }
  4621. #endif /* WOLFSSL_ASYNC_CRYPT */
  4622. WOLFSSL_LEAVE("Ed25519Sign", ret);
  4623. return ret;
  4624. #endif /* HAVE_ED25519_SIGN */
  4625. }
  4626. /* Verify the data using EdDSA and key using Ed25519.
  4627. *
  4628. * ssl SSL object.
  4629. * in Signature data.
  4630. * inSz Length of the signature data in bytes.
  4631. * msg Message to verify.
  4632. * outSz Length of message in bytes.
  4633. * key The public Ed25519 key data.
  4634. * keySz The length of the private key data in bytes.
  4635. * ctx The callback context.
  4636. * returns 0 on success, otherwise the value is an error.
  4637. */
  4638. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4639. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  4640. {
  4641. #ifndef HAVE_ED25519_VERIFY
  4642. (void)ssl;
  4643. (void)in;
  4644. (void)inSz;
  4645. (void)msg;
  4646. (void)msgSz;
  4647. (void)key;
  4648. (void)keyBufInfo;
  4649. return NOT_COMPILED_IN;
  4650. #else /* HAVE_ED25519_VERIFY */
  4651. int ret;
  4652. #ifdef HAVE_PK_CALLBACKS
  4653. const byte* keyBuf = NULL;
  4654. word32 keySz = 0;
  4655. if (keyBufInfo) {
  4656. keyBuf = keyBufInfo->buffer;
  4657. keySz = keyBufInfo->length;
  4658. }
  4659. #endif
  4660. (void)ssl;
  4661. (void)keyBufInfo;
  4662. WOLFSSL_ENTER("Ed25519Verify");
  4663. #ifdef WOLFSSL_ASYNC_CRYPT
  4664. /* initialize event */
  4665. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4666. if (ret != 0)
  4667. return ret;
  4668. #endif
  4669. #ifdef HAVE_PK_CALLBACKS
  4670. if (ssl->ctx->Ed25519VerifyCb) {
  4671. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  4672. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  4673. keySz, &ssl->eccVerifyRes, ctx);
  4674. }
  4675. else
  4676. #endif /* HAVE_PK_CALLBACKS */
  4677. {
  4678. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  4679. &ssl->eccVerifyRes, key);
  4680. }
  4681. /* Handle async pending response */
  4682. #ifdef WOLFSSL_ASYNC_CRYPT
  4683. if (ret == WC_PENDING_E) {
  4684. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4685. }
  4686. else
  4687. #endif /* WOLFSSL_ASYNC_CRYPT */
  4688. {
  4689. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4690. }
  4691. WOLFSSL_LEAVE("Ed25519Verify", ret);
  4692. return ret;
  4693. #endif /* HAVE_ED25519_VERIFY */
  4694. }
  4695. #endif /* HAVE_ED25519 */
  4696. #ifndef WOLFSSL_NO_TLS12
  4697. #ifdef HAVE_CURVE25519
  4698. #ifdef HAVE_PK_CALLBACKS
  4699. /* Gets X25519 key for shared secret callback testing
  4700. * Client side: returns peer key
  4701. * Server side: returns private key
  4702. */
  4703. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  4704. {
  4705. int ret = NO_PEER_KEY;
  4706. struct curve25519_key* tmpKey = NULL;
  4707. if (ssl == NULL || otherKey == NULL) {
  4708. return BAD_FUNC_ARG;
  4709. }
  4710. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4711. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  4712. !ssl->peerX25519Key->dp) {
  4713. return NO_PEER_KEY;
  4714. }
  4715. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  4716. }
  4717. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4718. if (!ssl->eccTempKeyPresent) {
  4719. return NO_PRIVATE_KEY;
  4720. }
  4721. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  4722. }
  4723. if (tmpKey) {
  4724. *otherKey = (curve25519_key *)tmpKey;
  4725. ret = 0;
  4726. }
  4727. return ret;
  4728. }
  4729. #endif /* HAVE_PK_CALLBACKS */
  4730. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  4731. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  4732. byte* out, word32* outlen, int side)
  4733. {
  4734. int ret;
  4735. (void)ssl;
  4736. (void)pubKeyDer;
  4737. (void)pubKeySz;
  4738. (void)side;
  4739. WOLFSSL_ENTER("X25519SharedSecret");
  4740. #ifdef WOLFSSL_ASYNC_CRYPT
  4741. /* initialize event */
  4742. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4743. if (ret != 0)
  4744. return ret;
  4745. #endif
  4746. #ifdef HAVE_PK_CALLBACKS
  4747. if (ssl->ctx->X25519SharedSecretCb) {
  4748. curve25519_key* otherKey = NULL;
  4749. ret = X25519GetKey(ssl, &otherKey);
  4750. if (ret == 0) {
  4751. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  4752. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  4753. pubKeySz, out, outlen, side, ctx);
  4754. }
  4755. }
  4756. else
  4757. #endif
  4758. {
  4759. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  4760. EC25519_LITTLE_ENDIAN);
  4761. }
  4762. /* Handle async pending response */
  4763. #ifdef WOLFSSL_ASYNC_CRYPT
  4764. if (ret == WC_PENDING_E) {
  4765. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4766. }
  4767. #endif /* WOLFSSL_ASYNC_CRYPT */
  4768. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  4769. return ret;
  4770. }
  4771. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  4772. curve25519_key* peer)
  4773. {
  4774. int ret = 0;
  4775. (void)peer;
  4776. WOLFSSL_ENTER("X25519MakeKey");
  4777. #ifdef WOLFSSL_ASYNC_CRYPT
  4778. /* initialize event */
  4779. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4780. if (ret != 0)
  4781. return ret;
  4782. #endif
  4783. #ifdef HAVE_PK_CALLBACKS
  4784. if (ssl->ctx->X25519KeyGenCb) {
  4785. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  4786. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  4787. }
  4788. else
  4789. #endif
  4790. {
  4791. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  4792. }
  4793. if (ret == 0) {
  4794. ssl->ecdhCurveOID = ECC_X25519_OID;
  4795. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4796. ssl->namedGroup = 0;
  4797. #endif
  4798. }
  4799. /* Handle async pending response */
  4800. #ifdef WOLFSSL_ASYNC_CRYPT
  4801. if (ret == WC_PENDING_E) {
  4802. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4803. }
  4804. #endif /* WOLFSSL_ASYNC_CRYPT */
  4805. WOLFSSL_LEAVE("X25519MakeKey", ret);
  4806. return ret;
  4807. }
  4808. #endif /* HAVE_CURVE25519 */
  4809. #endif /* !WOLFSSL_NO_TLS12 */
  4810. #ifdef HAVE_ED448
  4811. /* Check whether the key contains a public key.
  4812. * If not then pull it out of the leaf certificate.
  4813. *
  4814. * ssl SSL/TLS object.
  4815. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4816. * 0 on success.
  4817. */
  4818. int Ed448CheckPubKey(WOLFSSL* ssl)
  4819. {
  4820. #ifndef HAVE_ED448_KEY_IMPORT
  4821. (void)ssl;
  4822. return NOT_COMPILED_IN;
  4823. #else /* HAVE_ED448_KEY_IMPORT */
  4824. ed448_key* key = (ed448_key*)ssl->hsKey;
  4825. int ret = 0;
  4826. /* Public key required for signing. */
  4827. if (key != NULL && !key->pubKeySet) {
  4828. DerBuffer* leaf = ssl->buffers.certificate;
  4829. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert), ssl->heap,
  4830. DYNAMIC_TYPE_DCERT);
  4831. if (cert == NULL)
  4832. ret = MEMORY_E;
  4833. if (ret == 0) {
  4834. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4835. ret = DecodeToKey(cert, 0);
  4836. }
  4837. if (ret == 0) {
  4838. ret = wc_ed448_import_public(cert->publicKey, cert->pubKeySize,
  4839. key);
  4840. }
  4841. if (cert != NULL) {
  4842. FreeDecodedCert(cert);
  4843. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4844. }
  4845. }
  4846. return ret;
  4847. #endif /* HAVE_ED448_KEY_IMPORT */
  4848. }
  4849. /* Sign the data using EdDSA and key using Ed448.
  4850. *
  4851. * ssl SSL object.
  4852. * in Data or message to sign.
  4853. * inSz Length of the data.
  4854. * out Buffer to hold signature.
  4855. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4856. * key The private Ed448 key data.
  4857. * keySz The length of the private key data in bytes.
  4858. * ctx The callback context.
  4859. * returns 0 on success, otherwise the value is an error.
  4860. */
  4861. int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4862. word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
  4863. {
  4864. #ifndef HAVE_ED448_SIGN
  4865. (void)ssl;
  4866. (void)in;
  4867. (void)inSz;
  4868. (void)out;
  4869. (void)outSz;
  4870. (void)key;
  4871. (void)keyBufInfo;
  4872. return NOT_COMPILED_IN;
  4873. #else /* HAVE_ED448_SIGN */
  4874. int ret;
  4875. #ifdef HAVE_PK_CALLBACKS
  4876. const byte* keyBuf = NULL;
  4877. word32 keySz = 0;
  4878. if (keyBufInfo) {
  4879. keyBuf = keyBufInfo->buffer;
  4880. keySz = keyBufInfo->length;
  4881. }
  4882. #endif
  4883. (void)ssl;
  4884. (void)keyBufInfo;
  4885. WOLFSSL_ENTER("Ed448Sign");
  4886. #ifdef WOLFSSL_ASYNC_CRYPT
  4887. /* initialize event */
  4888. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4889. if (ret != 0)
  4890. return ret;
  4891. #endif
  4892. #if defined(HAVE_PK_CALLBACKS)
  4893. if (ssl->ctx->Ed448SignCb) {
  4894. void* ctx = wolfSSL_GetEd448SignCtx(ssl);
  4895. ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4896. ctx);
  4897. }
  4898. else
  4899. #endif /* HAVE_PK_CALLBACKS */
  4900. {
  4901. ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
  4902. }
  4903. /* Handle async pending response */
  4904. #ifdef WOLFSSL_ASYNC_CRYPT
  4905. if (ret == WC_PENDING_E) {
  4906. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4907. }
  4908. #endif /* WOLFSSL_ASYNC_CRYPT */
  4909. WOLFSSL_LEAVE("Ed448Sign", ret);
  4910. return ret;
  4911. #endif /* HAVE_ED448_SIGN */
  4912. }
  4913. /* Verify the data using EdDSA and key using Ed448.
  4914. *
  4915. * ssl SSL object.
  4916. * in Signature data.
  4917. * inSz Length of the signature data in bytes.
  4918. * msg Message to verify.
  4919. * outSz Length of message in bytes.
  4920. * key The public Ed448 key data.
  4921. * keySz The length of the private key data in bytes.
  4922. * ctx The callback context.
  4923. * returns 0 on success, otherwise the value is an error.
  4924. */
  4925. int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4926. word32 msgSz, ed448_key* key, buffer* keyBufInfo)
  4927. {
  4928. #ifndef HAVE_ED448_VERIFY
  4929. (void)ssl;
  4930. (void)in;
  4931. (void)inSz;
  4932. (void)msg;
  4933. (void)msgSz;
  4934. (void)key;
  4935. (void)keyBufInfo;
  4936. return NOT_COMPILED_IN;
  4937. #else /* HAVE_ED448_VERIFY */
  4938. int ret;
  4939. #ifdef HAVE_PK_CALLBACKS
  4940. const byte* keyBuf = NULL;
  4941. word32 keySz = 0;
  4942. if (keyBufInfo) {
  4943. keyBuf = keyBufInfo->buffer;
  4944. keySz = keyBufInfo->length;
  4945. }
  4946. #endif
  4947. (void)ssl;
  4948. (void)keyBufInfo;
  4949. WOLFSSL_ENTER("Ed448Verify");
  4950. #ifdef WOLFSSL_ASYNC_CRYPT
  4951. /* initialize event */
  4952. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4953. if (ret != 0)
  4954. return ret;
  4955. #endif
  4956. #ifdef HAVE_PK_CALLBACKS
  4957. if (ssl->ctx->Ed448VerifyCb) {
  4958. void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
  4959. ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
  4960. &ssl->eccVerifyRes, ctx);
  4961. }
  4962. else
  4963. #endif /* HAVE_PK_CALLBACKS */
  4964. {
  4965. ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
  4966. NULL, 0);
  4967. }
  4968. /* Handle async pending response */
  4969. #ifdef WOLFSSL_ASYNC_CRYPT
  4970. if (ret == WC_PENDING_E) {
  4971. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4972. }
  4973. else
  4974. #endif /* WOLFSSL_ASYNC_CRYPT */
  4975. {
  4976. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4977. }
  4978. WOLFSSL_LEAVE("Ed448Verify", ret);
  4979. return ret;
  4980. #endif /* HAVE_ED448_VERIFY */
  4981. }
  4982. #endif /* HAVE_ED448 */
  4983. #ifndef WOLFSSL_NO_TLS12
  4984. #ifdef HAVE_CURVE448
  4985. #ifdef HAVE_PK_CALLBACKS
  4986. /* Gets X448 key for shared secret callback testing
  4987. * Client side: returns peer key
  4988. * Server side: returns private key
  4989. */
  4990. static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
  4991. {
  4992. int ret = NO_PEER_KEY;
  4993. struct curve448_key* tmpKey = NULL;
  4994. if (ssl == NULL || otherKey == NULL) {
  4995. return BAD_FUNC_ARG;
  4996. }
  4997. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4998. if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
  4999. return NO_PEER_KEY;
  5000. }
  5001. tmpKey = (struct curve448_key*)ssl->peerX448Key;
  5002. }
  5003. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  5004. if (!ssl->eccTempKeyPresent) {
  5005. return NO_PRIVATE_KEY;
  5006. }
  5007. tmpKey = (struct curve448_key*)ssl->eccTempKey;
  5008. }
  5009. if (tmpKey) {
  5010. *otherKey = (curve448_key *)tmpKey;
  5011. ret = 0;
  5012. }
  5013. return ret;
  5014. }
  5015. #endif /* HAVE_PK_CALLBACKS */
  5016. static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
  5017. curve448_key* pub_key, byte* pubKeyDer,
  5018. word32* pubKeySz, byte* out, word32* outlen,
  5019. int side)
  5020. {
  5021. int ret;
  5022. (void)ssl;
  5023. (void)pubKeyDer;
  5024. (void)pubKeySz;
  5025. (void)side;
  5026. WOLFSSL_ENTER("X448SharedSecret");
  5027. #ifdef WOLFSSL_ASYNC_CRYPT
  5028. /* initialize event */
  5029. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  5030. if (ret != 0)
  5031. return ret;
  5032. #endif
  5033. #ifdef HAVE_PK_CALLBACKS
  5034. if (ssl->ctx->X448SharedSecretCb) {
  5035. curve448_key* otherKey = NULL;
  5036. ret = X448GetKey(ssl, &otherKey);
  5037. if (ret == 0) {
  5038. void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
  5039. ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
  5040. pubKeySz, out, outlen, side, ctx);
  5041. }
  5042. }
  5043. else
  5044. #endif
  5045. {
  5046. ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
  5047. EC448_LITTLE_ENDIAN);
  5048. }
  5049. /* Handle async pending response */
  5050. #ifdef WOLFSSL_ASYNC_CRYPT
  5051. if (ret == WC_PENDING_E) {
  5052. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  5053. }
  5054. #endif /* WOLFSSL_ASYNC_CRYPT */
  5055. WOLFSSL_LEAVE("X448SharedSecret", ret);
  5056. return ret;
  5057. }
  5058. static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
  5059. {
  5060. int ret = 0;
  5061. (void)peer;
  5062. WOLFSSL_ENTER("X448MakeKey");
  5063. #ifdef WOLFSSL_ASYNC_CRYPT
  5064. /* initialize event */
  5065. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  5066. if (ret != 0)
  5067. return ret;
  5068. #endif
  5069. #ifdef HAVE_PK_CALLBACKS
  5070. if (ssl->ctx->X448KeyGenCb) {
  5071. void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
  5072. ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
  5073. }
  5074. else
  5075. #endif
  5076. {
  5077. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  5078. }
  5079. if (ret == 0) {
  5080. ssl->ecdhCurveOID = ECC_X448_OID;
  5081. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  5082. ssl->namedGroup = 0;
  5083. #endif
  5084. }
  5085. /* Handle async pending response */
  5086. #ifdef WOLFSSL_ASYNC_CRYPT
  5087. if (ret == WC_PENDING_E) {
  5088. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  5089. }
  5090. #endif /* WOLFSSL_ASYNC_CRYPT */
  5091. WOLFSSL_LEAVE("X448MakeKey", ret);
  5092. return ret;
  5093. }
  5094. #endif /* HAVE_CURVE448 */
  5095. #endif /* !WOLFSSL_NO_TLS12 */
  5096. #if !defined(NO_CERTS) || !defined(NO_PSK)
  5097. #if !defined(NO_DH)
  5098. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  5099. byte* priv, word32* privSz,
  5100. byte* pub, word32* pubSz)
  5101. {
  5102. int ret;
  5103. WOLFSSL_ENTER("DhGenKeyPair");
  5104. #ifdef WOLFSSL_ASYNC_CRYPT
  5105. /* initialize event */
  5106. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5107. if (ret != 0)
  5108. return ret;
  5109. #endif
  5110. PRIVATE_KEY_UNLOCK();
  5111. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  5112. PRIVATE_KEY_LOCK();
  5113. /* Handle async pending response */
  5114. #ifdef WOLFSSL_ASYNC_CRYPT
  5115. if (ret == WC_PENDING_E) {
  5116. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  5117. }
  5118. #endif /* WOLFSSL_ASYNC_CRYPT */
  5119. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  5120. return ret;
  5121. }
  5122. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  5123. const byte* priv, word32 privSz,
  5124. const byte* otherPub, word32 otherPubSz,
  5125. byte* agree, word32* agreeSz,
  5126. const byte* prime, word32 primeSz)
  5127. {
  5128. int ret;
  5129. (void)ssl;
  5130. WOLFSSL_ENTER("DhAgree");
  5131. #ifdef WOLFSSL_ASYNC_CRYPT
  5132. /* initialize event */
  5133. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  5134. if (ret != 0)
  5135. return ret;
  5136. #endif
  5137. #ifdef HAVE_PK_CALLBACKS
  5138. if (ssl->ctx->DhAgreeCb) {
  5139. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  5140. WOLFSSL_MSG("Calling DhAgree Callback Function");
  5141. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  5142. otherPub, otherPubSz, agree, agreeSz, ctx);
  5143. }
  5144. else
  5145. #endif
  5146. {
  5147. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  5148. /* check the public key has valid number */
  5149. if (dhKey != NULL && (prime == NULL || primeSz == 0)) {
  5150. /* wc_DhCheckPubKey does not do exponentiation */
  5151. ret = wc_DhCheckPubKey(dhKey, otherPub, otherPubSz);
  5152. }
  5153. else {
  5154. ret = wc_DhCheckPubValue(prime, primeSz, otherPub, otherPubSz);
  5155. }
  5156. if (ret != 0) {
  5157. /* translate to valid error (wc_DhCheckPubValue returns MP_VAL -1) */
  5158. ret = PEER_KEY_ERROR;
  5159. WOLFSSL_ERROR_VERBOSE(ret);
  5160. #ifdef OPENSSL_EXTRA
  5161. SendAlert(ssl, alert_fatal, illegal_parameter);
  5162. #endif
  5163. }
  5164. else
  5165. #endif
  5166. {
  5167. PRIVATE_KEY_UNLOCK();
  5168. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  5169. otherPubSz);
  5170. PRIVATE_KEY_LOCK();
  5171. }
  5172. }
  5173. /* Handle async pending response */
  5174. #ifdef WOLFSSL_ASYNC_CRYPT
  5175. if (ret == WC_PENDING_E) {
  5176. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  5177. }
  5178. #endif /* WOLFSSL_ASYNC_CRYPT */
  5179. WOLFSSL_LEAVE("DhAgree", ret);
  5180. (void)prime;
  5181. (void)primeSz;
  5182. return ret;
  5183. }
  5184. #endif /* !NO_DH */
  5185. #endif /* !NO_CERTS || !NO_PSK */
  5186. #ifdef HAVE_PK_CALLBACKS
  5187. int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
  5188. {
  5189. int pkcbset = 0;
  5190. (void)ssl;
  5191. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5192. !defined(NO_RSA)
  5193. if (0
  5194. #ifdef HAVE_ECC
  5195. || (ssl->ctx->EccSignCb != NULL &&
  5196. ssl->buffers.keyType == ecc_dsa_sa_algo)
  5197. #endif
  5198. #ifdef HAVE_ED25519
  5199. || (ssl->ctx->Ed25519SignCb != NULL &&
  5200. ssl->buffers.keyType == ed25519_sa_algo)
  5201. #endif
  5202. #ifdef HAVE_ED448
  5203. || (ssl->ctx->Ed448SignCb != NULL &&
  5204. ssl->buffers.keyType == ed448_sa_algo)
  5205. #endif
  5206. #ifndef NO_RSA
  5207. || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
  5208. || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
  5209. #ifdef WC_RSA_PSS
  5210. || (ssl->ctx->RsaPssSignCb != NULL &&
  5211. ssl->buffers.keyType == rsa_pss_sa_algo)
  5212. #endif
  5213. #endif
  5214. ) {
  5215. pkcbset = 1;
  5216. }
  5217. #endif
  5218. return pkcbset;
  5219. }
  5220. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  5221. {
  5222. int pkcbset = 0;
  5223. (void)ctx;
  5224. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  5225. !defined(NO_RSA)
  5226. if (0
  5227. #ifdef HAVE_ECC
  5228. || ctx->EccSignCb != NULL
  5229. #endif
  5230. #ifdef HAVE_ED25519
  5231. || ctx->Ed25519SignCb != NULL
  5232. #endif
  5233. #ifdef HAVE_ED448
  5234. || ctx->Ed448SignCb != NULL
  5235. #endif
  5236. #ifndef NO_RSA
  5237. || ctx->RsaSignCb != NULL
  5238. || ctx->RsaDecCb != NULL
  5239. #ifdef WC_RSA_PSS
  5240. || ctx->RsaPssSignCb != NULL
  5241. #endif
  5242. #endif
  5243. ) {
  5244. pkcbset = 1;
  5245. }
  5246. #endif
  5247. return pkcbset;
  5248. }
  5249. #endif /* HAVE_PK_CALLBACKS */
  5250. int InitSSL_Suites(WOLFSSL* ssl)
  5251. {
  5252. int keySz = 0;
  5253. byte havePSK = 0;
  5254. byte haveAnon = 0;
  5255. byte haveRSA = 0;
  5256. byte haveMcast = 0;
  5257. (void)haveAnon; /* Squash unused var warnings */
  5258. (void)haveMcast;
  5259. if (!ssl)
  5260. return BAD_FUNC_ARG;
  5261. #ifndef NO_RSA
  5262. haveRSA = 1;
  5263. #endif
  5264. #ifndef NO_PSK
  5265. havePSK = (byte)ssl->options.havePSK;
  5266. #endif /* NO_PSK */
  5267. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5268. #ifdef HAVE_ANON
  5269. haveAnon = (byte)ssl->options.haveAnon;
  5270. #endif /* HAVE_ANON*/
  5271. #ifdef WOLFSSL_MULTICAST
  5272. haveMcast = (byte)ssl->options.haveMcast;
  5273. #endif /* WOLFSSL_MULTICAST */
  5274. #endif /* !NO_CERTS && !WOLFSSL_SESSION_EXPORT */
  5275. #ifdef WOLFSSL_EARLY_DATA
  5276. if (ssl->options.side == WOLFSSL_SERVER_END)
  5277. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  5278. #endif
  5279. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5280. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5281. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5282. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5283. ssl->buffers.keyType == ed25519_sa_algo ||
  5284. ssl->buffers.keyType == ed448_sa_algo;
  5285. #endif
  5286. #ifndef NO_CERTS
  5287. keySz = ssl->buffers.keySz;
  5288. #endif
  5289. /* make sure server has DH parms, and add PSK if there */
  5290. if (ssl->options.side == WOLFSSL_SERVER_END) {
  5291. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  5292. ssl->options.haveDH, ssl->options.haveECDSAsig,
  5293. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  5294. ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
  5295. ssl->options.haveAnon, TRUE, ssl->options.side);
  5296. }
  5297. else {
  5298. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, TRUE,
  5299. ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE,
  5300. ssl->options.haveStaticECC, ssl->options.haveFalconSig,
  5301. ssl->options.haveDilithiumSig, ssl->options.haveAnon, TRUE,
  5302. ssl->options.side);
  5303. }
  5304. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5305. /* make sure server has cert and key unless using PSK, Anon, or
  5306. * Multicast. This should be true even if just switching ssl ctx */
  5307. if (ssl->options.side == WOLFSSL_SERVER_END &&
  5308. !havePSK && !haveAnon && !haveMcast) {
  5309. /* server certificate must be loaded */
  5310. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  5311. WOLFSSL_MSG("Server missing certificate");
  5312. WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
  5313. return NO_PRIVATE_KEY;
  5314. }
  5315. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  5316. /* allow no private key if using existing key */
  5317. #ifdef WOLF_PRIVATE_KEY_ID
  5318. if (ssl->devId != INVALID_DEVID
  5319. #ifdef HAVE_PK_CALLBACKS
  5320. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  5321. #endif
  5322. ) {
  5323. WOLFSSL_MSG("Allowing no server private key (external)");
  5324. }
  5325. else
  5326. #endif
  5327. {
  5328. WOLFSSL_MSG("Server missing private key");
  5329. WOLFSSL_ERROR_VERBOSE(NO_PRIVATE_KEY);
  5330. return NO_PRIVATE_KEY;
  5331. }
  5332. }
  5333. }
  5334. #endif
  5335. return WOLFSSL_SUCCESS;
  5336. }
  5337. /* returns new reference count. Arg incr positive=up or negative=down */
  5338. int SSL_CTX_RefCount(WOLFSSL_CTX* ctx, int incr)
  5339. {
  5340. int refCount;
  5341. if (ctx == NULL) {
  5342. return BAD_FUNC_ARG;
  5343. }
  5344. if (wc_LockMutex(&ctx->countMutex) != 0) {
  5345. WOLFSSL_MSG("Couldn't lock CTX count mutex");
  5346. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  5347. return BAD_MUTEX_E;
  5348. }
  5349. ctx->refCount += incr;
  5350. /* make sure refCount is never negative */
  5351. if (ctx->refCount < 0) {
  5352. ctx->refCount = 0;
  5353. }
  5354. refCount = ctx->refCount;
  5355. wc_UnLockMutex(&ctx->countMutex);
  5356. return refCount;
  5357. }
  5358. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  5359. It is used during initialization and to switch an ssl's CTX with
  5360. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  5361. unless writeDup is on.
  5362. ssl object to initialize
  5363. ctx parent factory
  5364. writeDup flag indicating this is a write dup only
  5365. WOLFSSL_SUCCESS return value on success */
  5366. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5367. {
  5368. int ret;
  5369. byte newSSL;
  5370. if (!ssl || !ctx)
  5371. return BAD_FUNC_ARG;
  5372. #ifndef SINGLE_THREADED
  5373. if (ssl->suites == NULL && !writeDup)
  5374. return BAD_FUNC_ARG;
  5375. #endif
  5376. newSSL = ssl->ctx == NULL; /* Assign after null check */
  5377. #ifndef NO_PSK
  5378. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  5379. return BAD_FUNC_ARG; /* needed for copy below */
  5380. }
  5381. #endif
  5382. /* decrement previous CTX reference count if exists.
  5383. * This should only happen if switching ctxs!*/
  5384. if (!newSSL) {
  5385. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  5386. wolfSSL_CTX_free(ssl->ctx);
  5387. }
  5388. /* increment CTX reference count */
  5389. if ((ret = SSL_CTX_RefCount(ctx, 1)) < 0) {
  5390. return ret;
  5391. }
  5392. ret = WOLFSSL_SUCCESS; /* set default ret */
  5393. ssl->ctx = ctx; /* only for passing to calls, options could change */
  5394. /* Don't change version on a SSL object that has already started a
  5395. * handshake */
  5396. if (!ssl->msgsReceived.got_client_hello &&
  5397. !ssl->msgsReceived.got_server_hello)
  5398. ssl->version = ctx->method->version;
  5399. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  5400. ssl->options.mask = ctx->mask;
  5401. ssl->options.minProto = ctx->minProto;
  5402. ssl->options.maxProto = ctx->maxProto;
  5403. #endif
  5404. #ifdef OPENSSL_EXTRA
  5405. #ifdef WOLFSSL_TLS13
  5406. if (ssl->version.minor == TLSv1_3_MINOR &&
  5407. (ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  5408. if (!ctx->method->downgrade) {
  5409. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
  5410. "allowed and downgrading disabled.");
  5411. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5412. return VERSION_ERROR;
  5413. }
  5414. WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
  5415. ssl->version.minor = TLSv1_2_MINOR;
  5416. }
  5417. #endif
  5418. if (ssl->version.minor == TLSv1_2_MINOR &&
  5419. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  5420. if (!ctx->method->downgrade) {
  5421. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
  5422. "allowed and downgrading disabled.");
  5423. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5424. return VERSION_ERROR;
  5425. }
  5426. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  5427. ssl->version.minor = TLSv1_1_MINOR;
  5428. }
  5429. if (ssl->version.minor == TLSv1_1_MINOR &&
  5430. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  5431. if (!ctx->method->downgrade) {
  5432. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
  5433. "allowed and downgrading disabled.");
  5434. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5435. return VERSION_ERROR;
  5436. }
  5437. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  5438. ssl->options.tls1_1 = 0;
  5439. ssl->version.minor = TLSv1_MINOR;
  5440. }
  5441. if (ssl->version.minor == TLSv1_MINOR &&
  5442. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  5443. if (!ctx->method->downgrade) {
  5444. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
  5445. "allowed and downgrading disabled.");
  5446. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5447. return VERSION_ERROR;
  5448. }
  5449. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  5450. ssl->options.tls = 0;
  5451. ssl->options.tls1_1 = 0;
  5452. ssl->version.minor = SSLv3_MINOR;
  5453. }
  5454. if (ssl->version.minor == SSLv3_MINOR &&
  5455. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  5456. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  5457. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5458. return VERSION_ERROR;
  5459. }
  5460. if (ssl->version.minor < ssl->options.minDowngrade) {
  5461. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  5462. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  5463. return VERSION_ERROR;
  5464. }
  5465. #endif
  5466. #ifdef HAVE_ECC
  5467. ssl->eccTempKeySz = ctx->eccTempKeySz;
  5468. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  5469. #endif
  5470. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  5471. ssl->pkCurveOID = ctx->pkCurveOID;
  5472. #endif
  5473. #ifdef OPENSSL_EXTRA
  5474. ssl->CBIS = ctx->CBIS;
  5475. #endif
  5476. ssl->timeout = ctx->timeout;
  5477. ssl->verifyCallback = ctx->verifyCallback;
  5478. /* If we are setting the ctx on an already initialized SSL object
  5479. * then we possibly already have a side defined. Don't overwrite unless
  5480. * the context has a well defined role. */
  5481. if (newSSL || ctx->method->side != WOLFSSL_NEITHER_END)
  5482. ssl->options.side = ctx->method->side;
  5483. ssl->options.downgrade = ctx->method->downgrade;
  5484. ssl->options.minDowngrade = ctx->minDowngrade;
  5485. ssl->options.haveRSA = ctx->haveRSA;
  5486. ssl->options.haveDH = ctx->haveDH;
  5487. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  5488. ssl->options.haveECC = ctx->haveECC;
  5489. ssl->options.haveStaticECC = ctx->haveStaticECC;
  5490. ssl->options.haveFalconSig = ctx->haveFalconSig;
  5491. ssl->options.haveDilithiumSig = ctx->haveDilithiumSig;
  5492. #ifndef NO_PSK
  5493. ssl->options.havePSK = ctx->havePSK;
  5494. ssl->options.client_psk_cb = ctx->client_psk_cb;
  5495. ssl->options.server_psk_cb = ctx->server_psk_cb;
  5496. ssl->options.psk_ctx = ctx->psk_ctx;
  5497. #ifdef WOLFSSL_TLS13
  5498. ssl->options.client_psk_cs_cb = ctx->client_psk_cs_cb;
  5499. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  5500. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  5501. #endif
  5502. #endif /* NO_PSK */
  5503. #ifdef WOLFSSL_EARLY_DATA
  5504. if (ssl->options.side == WOLFSSL_SERVER_END)
  5505. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  5506. #endif
  5507. #ifdef HAVE_ANON
  5508. ssl->options.haveAnon = ctx->haveAnon;
  5509. #endif
  5510. #ifndef NO_DH
  5511. ssl->options.minDhKeySz = ctx->minDhKeySz;
  5512. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  5513. #endif
  5514. #ifndef NO_RSA
  5515. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  5516. #endif
  5517. #ifdef HAVE_ECC
  5518. ssl->options.minEccKeySz = ctx->minEccKeySz;
  5519. #endif
  5520. #ifdef HAVE_PQC
  5521. #ifdef HAVE_FALCON
  5522. ssl->options.minFalconKeySz = ctx->minFalconKeySz;
  5523. #endif /* HAVE_FALCON */
  5524. #ifdef HAVE_DILITHIUM
  5525. ssl->options.minDilithiumKeySz = ctx->minDilithiumKeySz;
  5526. #endif /* HAVE_DILITHIUM */
  5527. #endif /* HAVE_PQC */
  5528. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  5529. ssl->options.verifyDepth = ctx->verifyDepth;
  5530. #endif
  5531. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  5532. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  5533. #ifdef HAVE_EXT_CACHE
  5534. ssl->options.internalCacheOff = ctx->internalCacheOff;
  5535. ssl->options.internalCacheLookupOff = ctx->internalCacheLookupOff;
  5536. #endif
  5537. ssl->options.verifyPeer = ctx->verifyPeer;
  5538. ssl->options.verifyNone = ctx->verifyNone;
  5539. ssl->options.failNoCert = ctx->failNoCert;
  5540. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  5541. ssl->options.sendVerify = ctx->sendVerify;
  5542. ssl->options.partialWrite = ctx->partialWrite;
  5543. ssl->options.quietShutdown = ctx->quietShutdown;
  5544. ssl->options.groupMessages = ctx->groupMessages;
  5545. #ifndef NO_DH
  5546. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5547. !defined(HAVE_SELFTEST)
  5548. ssl->options.dhKeyTested = ctx->dhKeyTested;
  5549. #endif
  5550. ssl->buffers.serverDH_P = ctx->serverDH_P;
  5551. ssl->buffers.serverDH_G = ctx->serverDH_G;
  5552. #endif
  5553. #ifndef NO_CERTS
  5554. /* ctx still owns certificate, certChain, key, dh, and cm */
  5555. ssl->buffers.certificate = ctx->certificate;
  5556. ssl->buffers.certChain = ctx->certChain;
  5557. #ifdef WOLFSSL_TLS13
  5558. ssl->buffers.certChainCnt = ctx->certChainCnt;
  5559. #endif
  5560. ssl->buffers.key = ctx->privateKey;
  5561. ssl->buffers.keyType = ctx->privateKeyType;
  5562. ssl->buffers.keyId = ctx->privateKeyId;
  5563. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  5564. ssl->buffers.keySz = ctx->privateKeySz;
  5565. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  5566. #endif
  5567. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5568. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5569. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5570. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5571. ssl->buffers.keyType == ed25519_sa_algo ||
  5572. ssl->buffers.keyType == ed448_sa_algo;
  5573. #endif
  5574. #ifdef WOLFSSL_ASYNC_CRYPT
  5575. ssl->devId = ctx->devId;
  5576. #endif
  5577. if (writeDup == 0) {
  5578. #ifndef NO_PSK
  5579. if (ctx->server_hint[0]) { /* set in CTX */
  5580. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  5581. sizeof(ssl->arrays->server_hint));
  5582. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  5583. }
  5584. #endif /* NO_PSK */
  5585. if (ctx->suites) {
  5586. #ifndef SINGLE_THREADED
  5587. *ssl->suites = *ctx->suites;
  5588. #else
  5589. ssl->suites = ctx->suites;
  5590. #endif
  5591. }
  5592. else {
  5593. XMEMSET(ssl->suites, 0, sizeof(Suites));
  5594. }
  5595. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  5596. /* Defer initializing suites until accept or connect */
  5597. ret = InitSSL_Suites(ssl);
  5598. }
  5599. } /* writeDup check */
  5600. if (ctx->mask != 0 && wolfSSL_set_options(ssl, ctx->mask) == 0) {
  5601. WOLFSSL_MSG("wolfSSL_set_options error");
  5602. return BAD_FUNC_ARG;
  5603. }
  5604. #ifdef WOLFSSL_SESSION_EXPORT
  5605. #ifdef WOLFSSL_DTLS
  5606. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  5607. #endif
  5608. #endif
  5609. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  5610. ssl->AcceptFilter = ctx->AcceptFilter;
  5611. ssl->AcceptFilter_arg = ctx->AcceptFilter_arg;
  5612. ssl->ConnectFilter = ctx->ConnectFilter;
  5613. ssl->ConnectFilter_arg = ctx->ConnectFilter_arg;
  5614. #endif
  5615. #ifdef OPENSSL_EXTRA
  5616. ssl->readAhead = ctx->readAhead;
  5617. #endif
  5618. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5619. /* Don't change recv callback if currently using BIO's */
  5620. if (ssl->CBIORecv != BioReceive)
  5621. #endif
  5622. ssl->CBIORecv = ctx->CBIORecv;
  5623. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5624. /* Don't change send callback if currently using BIO's */
  5625. if (ssl->CBIOSend != BioSend)
  5626. #endif
  5627. ssl->CBIOSend = ctx->CBIOSend;
  5628. ssl->verifyDepth = ctx->verifyDepth;
  5629. return ret;
  5630. }
  5631. int InitHandshakeHashes(WOLFSSL* ssl)
  5632. {
  5633. int ret;
  5634. /* make sure existing handshake hashes are free'd */
  5635. if (ssl->hsHashes != NULL) {
  5636. FreeHandshakeHashes(ssl);
  5637. }
  5638. /* allocate handshake hashes */
  5639. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  5640. DYNAMIC_TYPE_HASHES);
  5641. if (ssl->hsHashes == NULL) {
  5642. WOLFSSL_MSG("HS_Hashes Memory error");
  5643. return MEMORY_E;
  5644. }
  5645. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  5646. #ifndef NO_OLD_TLS
  5647. #ifndef NO_MD5
  5648. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  5649. if (ret != 0)
  5650. return ret;
  5651. #ifdef WOLFSSL_HASH_FLAGS
  5652. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  5653. #endif
  5654. #endif
  5655. #ifndef NO_SHA
  5656. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  5657. if (ret != 0)
  5658. return ret;
  5659. #ifdef WOLFSSL_HASH_FLAGS
  5660. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  5661. #endif
  5662. #endif
  5663. #endif /* !NO_OLD_TLS */
  5664. #ifndef NO_SHA256
  5665. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  5666. if (ret != 0)
  5667. return ret;
  5668. #ifdef WOLFSSL_HASH_FLAGS
  5669. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  5670. #endif
  5671. #endif
  5672. #ifdef WOLFSSL_SHA384
  5673. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  5674. if (ret != 0)
  5675. return ret;
  5676. #ifdef WOLFSSL_HASH_FLAGS
  5677. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  5678. #endif
  5679. #endif
  5680. #ifdef WOLFSSL_SHA512
  5681. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  5682. if (ret != 0)
  5683. return ret;
  5684. #ifdef WOLFSSL_HASH_FLAGS
  5685. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  5686. #endif
  5687. #endif
  5688. return ret;
  5689. }
  5690. void FreeHandshakeHashes(WOLFSSL* ssl)
  5691. {
  5692. if (ssl->hsHashes) {
  5693. #ifndef NO_OLD_TLS
  5694. #ifndef NO_MD5
  5695. wc_Md5Free(&ssl->hsHashes->hashMd5);
  5696. #endif
  5697. #ifndef NO_SHA
  5698. wc_ShaFree(&ssl->hsHashes->hashSha);
  5699. #endif
  5700. #endif /* !NO_OLD_TLS */
  5701. #ifndef NO_SHA256
  5702. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  5703. #endif
  5704. #ifdef WOLFSSL_SHA384
  5705. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  5706. #endif
  5707. #ifdef WOLFSSL_SHA512
  5708. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  5709. #endif
  5710. #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \
  5711. !defined(WOLFSSL_NO_CLIENT_AUTH)
  5712. if (ssl->hsHashes->messages != NULL) {
  5713. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  5714. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  5715. ssl->hsHashes->messages = NULL;
  5716. }
  5717. #endif
  5718. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  5719. ssl->hsHashes = NULL;
  5720. }
  5721. }
  5722. /* called if user attempts to re-use WOLFSSL object for a new session.
  5723. * For example wolfSSL_clear() is called then wolfSSL_connect or accept */
  5724. int ReinitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5725. {
  5726. int ret = 0;
  5727. /* arrays */
  5728. if (!writeDup && ssl->arrays == NULL) {
  5729. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  5730. DYNAMIC_TYPE_ARRAYS);
  5731. if (ssl->arrays == NULL) {
  5732. WOLFSSL_MSG("Arrays Memory error");
  5733. return MEMORY_E;
  5734. }
  5735. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5736. wc_MemZero_Add("SSL Arrays", ssl->arrays, sizeof(*ssl->arrays));
  5737. #endif
  5738. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  5739. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  5740. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  5741. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  5742. DYNAMIC_TYPE_SECRET);
  5743. if (ssl->arrays->preMasterSecret == NULL) {
  5744. return MEMORY_E;
  5745. }
  5746. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5747. wc_MemZero_Add("SSL Arrays", ssl->arrays->preMasterSecret, ENCRYPT_LEN);
  5748. #endif
  5749. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  5750. #endif
  5751. }
  5752. /* RNG */
  5753. #ifdef SINGLE_THREADED
  5754. if (ssl->rng == NULL) {
  5755. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  5756. }
  5757. #endif
  5758. if (ssl->rng == NULL) {
  5759. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  5760. if (ssl->rng == NULL) {
  5761. WOLFSSL_MSG("RNG Memory error");
  5762. return MEMORY_E;
  5763. }
  5764. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  5765. ssl->options.weOwnRng = 1;
  5766. /* FIPS RNG API does not accept a heap hint */
  5767. #ifndef HAVE_FIPS
  5768. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  5769. WOLFSSL_MSG("RNG Init error");
  5770. return ret;
  5771. }
  5772. #else
  5773. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  5774. WOLFSSL_MSG("RNG Init error");
  5775. return ret;
  5776. }
  5777. #endif
  5778. }
  5779. (void)ctx;
  5780. return ret;
  5781. }
  5782. /* init everything to 0, NULL, default values before calling anything that may
  5783. fail so that destructor has a "good" state to cleanup
  5784. ssl object to initialize
  5785. ctx parent factory
  5786. writeDup flag indicating this is a write dup only
  5787. 0 on success */
  5788. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5789. {
  5790. int ret;
  5791. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  5792. #ifdef WOLFSSL_CHECK_MEM_ZERO
  5793. wc_MemZero_Add("SSL Keys", &ssl->keys, sizeof(ssl->keys));
  5794. #ifdef WOLFSSL_TLS13
  5795. wc_MemZero_Add("SSL client secret", &ssl->clientSecret,
  5796. sizeof(ssl->clientSecret));
  5797. wc_MemZero_Add("SSL client secret", &ssl->serverSecret,
  5798. sizeof(ssl->serverSecret));
  5799. #endif
  5800. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  5801. wc_MemZero_Add("ClientFinished hash", &ssl->clientFinished,
  5802. TLS_FINISHED_SZ_MAX);
  5803. wc_MemZero_Add("ServerFinished hash", &ssl->serverFinished,
  5804. TLS_FINISHED_SZ_MAX);
  5805. #endif
  5806. #endif
  5807. #if defined(WOLFSSL_STATIC_MEMORY)
  5808. if (ctx->heap != NULL) {
  5809. WOLFSSL_HEAP_HINT* ssl_hint;
  5810. WOLFSSL_HEAP_HINT* ctx_hint;
  5811. /* avoid dereferencing a test value */
  5812. #ifdef WOLFSSL_HEAP_TEST
  5813. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  5814. ssl->heap = ctx->heap;
  5815. }
  5816. else {
  5817. #endif
  5818. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  5819. ctx->heap, DYNAMIC_TYPE_SSL);
  5820. if (ssl->heap == NULL) {
  5821. return MEMORY_E;
  5822. }
  5823. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  5824. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  5825. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  5826. /* lock and check IO count / handshake count */
  5827. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5828. WOLFSSL_MSG("Bad memory_mutex lock");
  5829. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5830. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5831. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  5832. return BAD_MUTEX_E;
  5833. }
  5834. if (ctx_hint->memory->maxHa > 0 &&
  5835. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  5836. WOLFSSL_MSG("At max number of handshakes for static memory");
  5837. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5838. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5839. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5840. return MEMORY_E;
  5841. }
  5842. if (ctx_hint->memory->maxIO > 0 &&
  5843. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  5844. WOLFSSL_MSG("At max number of IO allowed for static memory");
  5845. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5846. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5847. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5848. return MEMORY_E;
  5849. }
  5850. ctx_hint->memory->curIO++;
  5851. ctx_hint->memory->curHa++;
  5852. ssl_hint->memory = ctx_hint->memory;
  5853. ssl_hint->haFlag = 1;
  5854. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5855. /* check if tracking stats */
  5856. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  5857. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  5858. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  5859. if (ssl_hint->stats == NULL) {
  5860. return MEMORY_E;
  5861. }
  5862. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  5863. }
  5864. /* check if using fixed IO buffers */
  5865. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  5866. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5867. WOLFSSL_MSG("Bad memory_mutex lock");
  5868. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  5869. return BAD_MUTEX_E;
  5870. }
  5871. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  5872. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5873. return MEMORY_E;
  5874. }
  5875. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  5876. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5877. return MEMORY_E;
  5878. }
  5879. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  5880. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  5881. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5882. return MEMORY_E;
  5883. }
  5884. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5885. }
  5886. #ifdef WOLFSSL_HEAP_TEST
  5887. }
  5888. #endif
  5889. }
  5890. else {
  5891. ssl->heap = ctx->heap;
  5892. }
  5893. #else
  5894. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  5895. #endif /* WOLFSSL_STATIC_MEMORY */
  5896. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  5897. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5898. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  5899. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5900. #ifdef KEEP_PEER_CERT
  5901. InitX509(&ssl->peerCert, 0, ssl->heap);
  5902. #endif
  5903. ssl->rfd = -1; /* set to invalid descriptor */
  5904. ssl->wfd = -1;
  5905. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  5906. /* initialize states */
  5907. ssl->options.serverState = NULL_STATE;
  5908. ssl->options.clientState = NULL_STATE;
  5909. ssl->options.connectState = CONNECT_BEGIN;
  5910. ssl->options.acceptState = ACCEPT_BEGIN;
  5911. ssl->options.handShakeState = NULL_STATE;
  5912. ssl->options.processReply = doProcessInit;
  5913. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  5914. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  5915. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  5916. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  5917. #ifndef NO_DH
  5918. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5919. !defined(HAVE_SELFTEST)
  5920. ssl->options.dhDoKeyTest = 1;
  5921. #endif
  5922. #endif
  5923. #ifdef WOLFSSL_DTLS
  5924. #ifdef WOLFSSL_SCTP
  5925. ssl->options.dtlsSctp = ctx->dtlsSctp;
  5926. #endif
  5927. #ifdef WOLFSSL_SRTP
  5928. ssl->dtlsSrtpProfiles = ctx->dtlsSrtpProfiles;
  5929. #endif
  5930. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  5931. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  5932. /* Add some bytes so that we can operate with slight difference
  5933. * in set MTU size on each peer */
  5934. ssl->dtls_expected_rx = ssl->dtlsMtuSz +
  5935. DTLS_MTU_ADDITIONAL_READ_BUFFER;
  5936. #else
  5937. ssl->dtls_expected_rx = MAX_MTU;
  5938. #endif
  5939. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  5940. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  5941. ssl->dtls_timeout = ssl->dtls_timeout_init;
  5942. ssl->buffers.dtlsCtx.rfd = -1;
  5943. ssl->buffers.dtlsCtx.wfd = -1;
  5944. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx; /* prevent invalid pointer access if not */
  5945. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx; /* correctly set */
  5946. #else
  5947. #ifdef HAVE_NETX
  5948. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  5949. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  5950. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  5951. ssl->mnCtx = mynewt_ctx_new();
  5952. if(!ssl->mnCtx) {
  5953. return MEMORY_E;
  5954. }
  5955. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  5956. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  5957. #elif defined (WOLFSSL_GNRC)
  5958. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  5959. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  5960. #else
  5961. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  5962. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  5963. #endif
  5964. #endif
  5965. #ifndef WOLFSSL_AEAD_ONLY
  5966. #ifndef NO_OLD_TLS
  5967. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  5968. #elif !defined(WOLFSSL_NO_TLS12) && !defined(NO_TLS)
  5969. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  5970. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  5971. ssl->hmac = TLS_hmac;
  5972. #else
  5973. ssl->hmac = Renesas_cmn_TLS_hmac;
  5974. #endif
  5975. #endif
  5976. #endif
  5977. #if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
  5978. /* Save arrays by default for OpenVPN */
  5979. ssl->options.saveArrays = 1;
  5980. #endif
  5981. ssl->cipher.ssl = ssl;
  5982. #ifdef HAVE_EXTENDED_MASTER
  5983. ssl->options.haveEMS = ctx->haveEMS;
  5984. #endif
  5985. ssl->options.useClientOrder = ctx->useClientOrder;
  5986. ssl->options.mutualAuth = ctx->mutualAuth;
  5987. #ifdef WOLFSSL_TLS13
  5988. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  5989. ssl->options.maxTicketTls13 = ctx->maxTicketTls13;
  5990. #endif
  5991. #ifdef HAVE_SESSION_TICKET
  5992. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  5993. #endif
  5994. ssl->options.noPskDheKe = ctx->noPskDheKe;
  5995. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5996. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  5997. ssl->options.verifyPostHandshake = ctx->verifyPostHandshake;
  5998. #endif
  5999. if (ctx->numGroups > 0) {
  6000. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  6001. ssl->numGroups = ctx->numGroups;
  6002. }
  6003. #endif
  6004. #ifdef HAVE_TLS_EXTENSIONS
  6005. #ifdef HAVE_MAX_FRAGMENT
  6006. ssl->max_fragment = MAX_RECORD_SIZE;
  6007. #endif
  6008. #ifdef HAVE_ALPN
  6009. ssl->alpn_client_list = NULL;
  6010. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  6011. ssl->alpnSelect = ctx->alpnSelect;
  6012. ssl->alpnSelectArg = ctx->alpnSelectArg;
  6013. #endif
  6014. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  6015. if (ctx->alpn_cli_protos != NULL && ctx->alpn_cli_protos_len > 0) {
  6016. ret = wolfSSL_set_alpn_protos(ssl, ctx->alpn_cli_protos,
  6017. ctx->alpn_cli_protos_len);
  6018. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  6019. if (ret) {
  6020. #else
  6021. if (!ret) {
  6022. #endif
  6023. WOLFSSL_MSG("failed to set alpn protos to ssl object");
  6024. return ret;
  6025. }
  6026. }
  6027. #endif
  6028. #endif
  6029. #ifdef HAVE_SUPPORTED_CURVES
  6030. ssl->options.userCurves = ctx->userCurves;
  6031. #endif
  6032. #endif /* HAVE_TLS_EXTENSIONS */
  6033. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  6034. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  6035. #endif
  6036. /* default alert state (none) */
  6037. ssl->alert_history.last_rx.code = -1;
  6038. ssl->alert_history.last_rx.level = -1;
  6039. ssl->alert_history.last_tx.code = -1;
  6040. ssl->alert_history.last_tx.level = -1;
  6041. #ifdef OPENSSL_EXTRA
  6042. /* copy over application session context ID */
  6043. ssl->sessionCtxSz = ctx->sessionCtxSz;
  6044. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  6045. ssl->cbioFlag = ctx->cbioFlag;
  6046. ssl->protoMsgCb = ctx->protoMsgCb;
  6047. ssl->protoMsgCtx = ctx->protoMsgCtx;
  6048. /* follow default behavior of setting toInfoOn similar to
  6049. * wolfSSL_set_msg_callback when the callback is set */
  6050. if (ctx->protoMsgCb != NULL) {
  6051. ssl->toInfoOn = 1;
  6052. }
  6053. ssl->disabledCurves = ctx->disabledCurves;
  6054. #endif
  6055. InitCiphers(ssl);
  6056. InitCipherSpecs(&ssl->specs);
  6057. /* all done with init, now can return errors, call other stuff */
  6058. if ((ret = ReinitSSL(ssl, ctx, writeDup)) != 0) {
  6059. return ret;
  6060. }
  6061. if (!writeDup) {
  6062. #ifdef OPENSSL_EXTRA
  6063. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  6064. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  6065. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  6066. WOLFSSL_MSG("ssl->param memory error");
  6067. return MEMORY_E;
  6068. }
  6069. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  6070. #endif
  6071. #ifdef SINGLE_THREADED
  6072. if (ctx->suites == NULL)
  6073. #endif
  6074. {
  6075. /* suites */
  6076. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  6077. DYNAMIC_TYPE_SUITES);
  6078. if (ssl->suites == NULL) {
  6079. WOLFSSL_MSG("Suites Memory error");
  6080. return MEMORY_E;
  6081. }
  6082. #ifdef OPENSSL_ALL
  6083. ssl->suites->stack = NULL;
  6084. #endif
  6085. #ifdef SINGLE_THREADED
  6086. ssl->options.ownSuites = 1;
  6087. #endif
  6088. }
  6089. #ifdef SINGLE_THREADED
  6090. else {
  6091. ssl->options.ownSuites = 0;
  6092. }
  6093. #endif
  6094. } /* !writeDup */
  6095. /* Initialize SSL with the appropriate fields from it's ctx */
  6096. /* requires valid arrays and suites unless writeDup ing */
  6097. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS)
  6098. return ret;
  6099. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  6100. #ifdef HAVE_WRITE_DUP
  6101. if (writeDup) {
  6102. /* all done */
  6103. return 0;
  6104. }
  6105. #endif
  6106. /* hsHashes */
  6107. ret = InitHandshakeHashes(ssl);
  6108. if (ret != 0)
  6109. return ret;
  6110. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  6111. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  6112. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  6113. if (ret != 0) {
  6114. WOLFSSL_MSG("DTLS Cookie Secret error");
  6115. return ret;
  6116. }
  6117. }
  6118. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  6119. #ifdef HAVE_SECRET_CALLBACK
  6120. ssl->sessionSecretCb = NULL;
  6121. ssl->sessionSecretCtx = NULL;
  6122. #ifdef WOLFSSL_TLS13
  6123. ssl->tls13SecretCb = NULL;
  6124. ssl->tls13SecretCtx = NULL;
  6125. #endif
  6126. #endif
  6127. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  6128. if (ctx->keyLogCb != NULL) {
  6129. ssl->keyLogCb = SessionSecret_callback;
  6130. #if defined(WOLFSSL_TLS13)
  6131. ssl->tls13KeyLogCb = SessionSecret_callback_Tls13;
  6132. #endif /*WOLFSSL_TLS13*/
  6133. }
  6134. #endif /*OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  6135. ssl->session = wolfSSL_NewSession(ssl->heap);
  6136. if (ssl->session == NULL) {
  6137. WOLFSSL_MSG("SSL Session Memory error");
  6138. return MEMORY_E;
  6139. }
  6140. #ifdef HAVE_SESSION_TICKET
  6141. ssl->options.noTicketTls12 = ctx->noTicketTls12;
  6142. #endif
  6143. #ifdef WOLFSSL_MULTICAST
  6144. if (ctx->haveMcast) {
  6145. int i;
  6146. ssl->options.haveMcast = 1;
  6147. ssl->options.mcastID = ctx->mcastID;
  6148. /* Force the state to look like handshake has completed. */
  6149. /* Keying material is supplied externally. */
  6150. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  6151. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  6152. ssl->options.connectState = SECOND_REPLY_DONE;
  6153. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  6154. ssl->options.handShakeState = HANDSHAKE_DONE;
  6155. ssl->options.handShakeDone = 1;
  6156. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  6157. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  6158. }
  6159. #endif
  6160. #ifdef HAVE_SECURE_RENEGOTIATION
  6161. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  6162. int useSecureReneg = ssl->ctx->useSecureReneg;
  6163. /* use secure renegotiation by default (not recommend) */
  6164. #ifdef WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT
  6165. useSecureReneg = 1;
  6166. #endif
  6167. if (useSecureReneg) {
  6168. ret = wolfSSL_UseSecureRenegotiation(ssl);
  6169. if (ret != WOLFSSL_SUCCESS)
  6170. return ret;
  6171. }
  6172. }
  6173. #endif /* HAVE_SECURE_RENEGOTIATION */
  6174. #ifdef WOLFSSL_DTLS13
  6175. /* setup 0 (un-protected) epoch */
  6176. ssl->dtls13Epochs[0].isValid = 1;
  6177. ssl->dtls13Epochs[0].side = ENCRYPT_AND_DECRYPT_SIDE;
  6178. ssl->dtls13EncryptEpoch = &ssl->dtls13Epochs[0];
  6179. ssl->dtls13DecryptEpoch = &ssl->dtls13Epochs[0];
  6180. ssl->options.dtls13SendMoreAcks = WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT;
  6181. ssl->dtls13Rtx.rtxRecordTailPtr = &ssl->dtls13Rtx.rtxRecords;
  6182. #endif /* WOLFSSL_DTLS13 */
  6183. #ifdef WOLFSSL_QUIC
  6184. if (ctx->quic.method) {
  6185. ret = wolfSSL_set_quic_method(ssl, ctx->quic.method);
  6186. if (ret != WOLFSSL_SUCCESS)
  6187. return ret;
  6188. }
  6189. #endif
  6190. return 0;
  6191. }
  6192. /* free use of temporary arrays */
  6193. void FreeArrays(WOLFSSL* ssl, int keep)
  6194. {
  6195. if (ssl->arrays) {
  6196. if (keep && !IsAtLeastTLSv1_3(ssl->version)) {
  6197. /* keeps session id for user retrieval */
  6198. XMEMCPY(ssl->session->sessionID, ssl->arrays->sessionID, ID_LEN);
  6199. ssl->session->sessionIDSz = ssl->arrays->sessionIDSz;
  6200. }
  6201. if (ssl->arrays->preMasterSecret) {
  6202. ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
  6203. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  6204. ssl->arrays->preMasterSecret = NULL;
  6205. }
  6206. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  6207. ssl->arrays->pendingMsg = NULL;
  6208. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  6209. }
  6210. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  6211. ssl->arrays = NULL;
  6212. }
  6213. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  6214. {
  6215. if (ssl && pKey && *pKey) {
  6216. switch (type) {
  6217. #ifndef NO_RSA
  6218. case DYNAMIC_TYPE_RSA:
  6219. wc_FreeRsaKey((RsaKey*)*pKey);
  6220. break;
  6221. #endif /* ! NO_RSA */
  6222. #ifdef HAVE_ECC
  6223. case DYNAMIC_TYPE_ECC:
  6224. wc_ecc_free((ecc_key*)*pKey);
  6225. break;
  6226. #endif /* HAVE_ECC */
  6227. #ifdef HAVE_ED25519
  6228. case DYNAMIC_TYPE_ED25519:
  6229. wc_ed25519_free((ed25519_key*)*pKey);
  6230. break;
  6231. #endif /* HAVE_ED25519 */
  6232. #ifdef HAVE_CURVE25519
  6233. case DYNAMIC_TYPE_CURVE25519:
  6234. wc_curve25519_free((curve25519_key*)*pKey);
  6235. break;
  6236. #endif /* HAVE_CURVE25519 */
  6237. #ifdef HAVE_ED448
  6238. case DYNAMIC_TYPE_ED448:
  6239. wc_ed448_free((ed448_key*)*pKey);
  6240. break;
  6241. #endif /* HAVE_ED448 */
  6242. #ifdef HAVE_CURVE448
  6243. case DYNAMIC_TYPE_CURVE448:
  6244. wc_curve448_free((curve448_key*)*pKey);
  6245. break;
  6246. #endif /* HAVE_CURVE448 */
  6247. #if defined(HAVE_PQC)
  6248. #if defined(HAVE_FALCON)
  6249. case DYNAMIC_TYPE_FALCON:
  6250. wc_falcon_free((falcon_key*)*pKey);
  6251. break;
  6252. #endif /* HAVE_FALCON */
  6253. #if defined(HAVE_DILITHIUM)
  6254. case DYNAMIC_TYPE_DILITHIUM:
  6255. wc_dilithium_free((dilithium_key*)*pKey);
  6256. break;
  6257. #endif /* HAVE_DILITHIUM */
  6258. #endif /* HAVE_PQC */
  6259. #ifndef NO_DH
  6260. case DYNAMIC_TYPE_DH:
  6261. wc_FreeDhKey((DhKey*)*pKey);
  6262. break;
  6263. #endif /* !NO_DH */
  6264. default:
  6265. break;
  6266. }
  6267. XFREE(*pKey, ssl->heap, type);
  6268. /* Reset pointer */
  6269. *pKey = NULL;
  6270. }
  6271. }
  6272. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  6273. {
  6274. int ret = BAD_FUNC_ARG;
  6275. int sz = 0;
  6276. if (ssl == NULL || pKey == NULL) {
  6277. return BAD_FUNC_ARG;
  6278. }
  6279. /* Sanity check key destination */
  6280. if (*pKey != NULL) {
  6281. WOLFSSL_MSG("Key already present!");
  6282. return BAD_STATE_E;
  6283. }
  6284. /* Determine size */
  6285. switch (type) {
  6286. #ifndef NO_RSA
  6287. case DYNAMIC_TYPE_RSA:
  6288. sz = sizeof(RsaKey);
  6289. break;
  6290. #endif /* ! NO_RSA */
  6291. #ifdef HAVE_ECC
  6292. case DYNAMIC_TYPE_ECC:
  6293. sz = sizeof(ecc_key);
  6294. break;
  6295. #endif /* HAVE_ECC */
  6296. #ifdef HAVE_ED25519
  6297. case DYNAMIC_TYPE_ED25519:
  6298. sz = sizeof(ed25519_key);
  6299. break;
  6300. #endif /* HAVE_ED25519 */
  6301. #ifdef HAVE_CURVE25519
  6302. case DYNAMIC_TYPE_CURVE25519:
  6303. sz = sizeof(curve25519_key);
  6304. break;
  6305. #endif /* HAVE_CURVE25519 */
  6306. #ifdef HAVE_ED448
  6307. case DYNAMIC_TYPE_ED448:
  6308. sz = sizeof(ed448_key);
  6309. break;
  6310. #endif /* HAVE_ED448 */
  6311. #ifdef HAVE_CURVE448
  6312. case DYNAMIC_TYPE_CURVE448:
  6313. sz = sizeof(curve448_key);
  6314. break;
  6315. #endif /* HAVE_CURVE448 */
  6316. #if defined(HAVE_PQC)
  6317. #if defined(HAVE_FALCON)
  6318. case DYNAMIC_TYPE_FALCON:
  6319. sz = sizeof(falcon_key);
  6320. break;
  6321. #endif /* HAVE_FALCON */
  6322. #if defined(HAVE_DILITHIUM)
  6323. case DYNAMIC_TYPE_DILITHIUM:
  6324. sz = sizeof(dilithium_key);
  6325. break;
  6326. #endif /* HAVE_DILITHIUM */
  6327. #endif /* HAVE_PQC */
  6328. #ifndef NO_DH
  6329. case DYNAMIC_TYPE_DH:
  6330. sz = sizeof(DhKey);
  6331. break;
  6332. #endif /* !NO_DH */
  6333. default:
  6334. return BAD_FUNC_ARG;
  6335. }
  6336. /* Allocate memory for key */
  6337. *pKey = (void *)XMALLOC(sz, ssl->heap, type);
  6338. if (*pKey == NULL) {
  6339. return MEMORY_E;
  6340. }
  6341. /* Initialize key */
  6342. switch (type) {
  6343. #ifndef NO_RSA
  6344. case DYNAMIC_TYPE_RSA:
  6345. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  6346. break;
  6347. #endif /* ! NO_RSA */
  6348. #ifdef HAVE_ECC
  6349. case DYNAMIC_TYPE_ECC:
  6350. ret = wc_ecc_init_ex((ecc_key*)*pKey, ssl->heap, ssl->devId);
  6351. break;
  6352. #endif /* HAVE_ECC */
  6353. #ifdef HAVE_ED25519
  6354. case DYNAMIC_TYPE_ED25519:
  6355. wc_ed25519_init_ex((ed25519_key*)*pKey, ssl->heap, ssl->devId);
  6356. ret = 0;
  6357. break;
  6358. #endif /* HAVE_CURVE25519 */
  6359. #ifdef HAVE_CURVE25519
  6360. case DYNAMIC_TYPE_CURVE25519:
  6361. wc_curve25519_init_ex((curve25519_key*)*pKey, ssl->heap, ssl->devId);
  6362. ret = 0;
  6363. break;
  6364. #endif /* HAVE_CURVE25519 */
  6365. #ifdef HAVE_ED448
  6366. case DYNAMIC_TYPE_ED448:
  6367. wc_ed448_init_ex((ed448_key*)*pKey, ssl->heap, ssl->devId);
  6368. ret = 0;
  6369. break;
  6370. #endif /* HAVE_CURVE448 */
  6371. #if defined(HAVE_PQC)
  6372. #if defined(HAVE_FALCON)
  6373. case DYNAMIC_TYPE_FALCON:
  6374. wc_falcon_init((falcon_key*)*pKey);
  6375. ret = 0;
  6376. break;
  6377. #endif /* HAVE_FALCON */
  6378. #if defined(HAVE_DILITHIUM)
  6379. case DYNAMIC_TYPE_DILITHIUM:
  6380. wc_dilithium_init((dilithium_key*)*pKey);
  6381. ret = 0;
  6382. break;
  6383. #endif /* HAVE_DILITHIUM */
  6384. #endif /* HAVE_PQC */
  6385. #ifdef HAVE_CURVE448
  6386. case DYNAMIC_TYPE_CURVE448:
  6387. wc_curve448_init((curve448_key*)*pKey);
  6388. ret = 0;
  6389. break;
  6390. #endif /* HAVE_CURVE448 */
  6391. #ifndef NO_DH
  6392. case DYNAMIC_TYPE_DH:
  6393. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  6394. break;
  6395. #endif /* !NO_DH */
  6396. default:
  6397. return BAD_FUNC_ARG;
  6398. }
  6399. /* On error free handshake key */
  6400. if (ret != 0) {
  6401. FreeKey(ssl, type, pKey);
  6402. }
  6403. return ret;
  6404. }
  6405. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  6406. defined(HAVE_CURVE25519) || defined(HAVE_ED448) || \
  6407. defined(HAVE_CURVE448) || (defined(HAVE_PQC) && defined(HAVE_FALCON)) || \
  6408. (defined(HAVE_PQC) && defined(HAVE_DILITHIUM))
  6409. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  6410. {
  6411. int ret = 0;
  6412. (void)ssl;
  6413. switch (type) {
  6414. #ifndef NO_RSA
  6415. case DYNAMIC_TYPE_RSA:
  6416. wc_FreeRsaKey((RsaKey*)pKey);
  6417. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  6418. break;
  6419. #endif /* ! NO_RSA */
  6420. #ifdef HAVE_ECC
  6421. case DYNAMIC_TYPE_ECC:
  6422. wc_ecc_free((ecc_key*)pKey);
  6423. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  6424. break;
  6425. #endif /* HAVE_ECC */
  6426. #ifdef HAVE_ED25519
  6427. case DYNAMIC_TYPE_ED25519:
  6428. wc_ed25519_free((ed25519_key*)pKey);
  6429. ret = wc_ed25519_init_ex((ed25519_key*)pKey, ssl->heap,
  6430. ssl->devId);
  6431. break;
  6432. #endif /* HAVE_CURVE25519 */
  6433. #ifdef HAVE_CURVE25519
  6434. case DYNAMIC_TYPE_CURVE25519:
  6435. wc_curve25519_free((curve25519_key*)pKey);
  6436. ret = wc_curve25519_init_ex((curve25519_key*)pKey, ssl->heap,
  6437. ssl->devId);
  6438. break;
  6439. #endif /* HAVE_CURVE25519 */
  6440. #ifdef HAVE_ED448
  6441. case DYNAMIC_TYPE_ED448:
  6442. wc_ed448_free((ed448_key*)pKey);
  6443. ret = wc_ed448_init_ex((ed448_key*)pKey, ssl->heap, ssl->devId);
  6444. break;
  6445. #endif /* HAVE_CURVE448 */
  6446. #ifdef HAVE_CURVE448
  6447. case DYNAMIC_TYPE_CURVE448:
  6448. wc_curve448_free((curve448_key*)pKey);
  6449. ret = wc_curve448_init((curve448_key*)pKey);
  6450. break;
  6451. #endif /* HAVE_CURVE448 */
  6452. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  6453. case DYNAMIC_TYPE_FALCON:
  6454. wc_falcon_free((falcon_key*)pKey);
  6455. ret = wc_falcon_init((falcon_key*)pKey);
  6456. break;
  6457. #endif /* HAVE_PQC && HAVE_FALCON */
  6458. #ifndef NO_DH
  6459. case DYNAMIC_TYPE_DH:
  6460. wc_FreeDhKey((DhKey*)pKey);
  6461. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  6462. break;
  6463. #endif /* !NO_DH */
  6464. default:
  6465. return BAD_FUNC_ARG;
  6466. }
  6467. return ret;
  6468. }
  6469. #endif
  6470. #ifdef WOLFSSL_ASYNC_IO
  6471. void FreeAsyncCtx(WOLFSSL* ssl, byte freeAsync)
  6472. {
  6473. if (ssl->async != NULL) {
  6474. if (ssl->async->freeArgs != NULL) {
  6475. ssl->async->freeArgs(ssl, ssl->async->args);
  6476. ssl->async->freeArgs = NULL;
  6477. }
  6478. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WOLFSSL_NO_TLS12)
  6479. if (ssl->options.buildArgsSet) {
  6480. FreeBuildMsgArgs(ssl, &ssl->async->buildArgs);
  6481. ssl->options.buildArgsSet = 0;
  6482. }
  6483. #endif
  6484. if (freeAsync) {
  6485. XFREE(ssl->async, ssl->heap, DYNAMIC_TYPE_ASYNC);
  6486. ssl->async = NULL;
  6487. }
  6488. }
  6489. }
  6490. #endif
  6491. void FreeKeyExchange(WOLFSSL* ssl)
  6492. {
  6493. /* Cleanup signature buffer */
  6494. if (ssl->buffers.sig.buffer) {
  6495. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  6496. ssl->buffers.sig.buffer = NULL;
  6497. ssl->buffers.sig.length = 0;
  6498. }
  6499. /* Cleanup digest buffer */
  6500. if (ssl->buffers.digest.buffer) {
  6501. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  6502. ssl->buffers.digest.buffer = NULL;
  6503. ssl->buffers.digest.length = 0;
  6504. }
  6505. /* Free handshake key */
  6506. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  6507. #ifndef NO_DH
  6508. /* Free temp DH key */
  6509. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  6510. #endif
  6511. }
  6512. /* Free up all memory used by Suites structure from WOLFSSL */
  6513. void FreeSuites(WOLFSSL* ssl)
  6514. {
  6515. #ifdef SINGLE_THREADED
  6516. if (ssl->options.ownSuites)
  6517. #endif
  6518. {
  6519. #ifdef OPENSSL_ALL
  6520. if (ssl->suites != NULL) {
  6521. /* Enough to free stack structure since WOLFSSL_CIPHER
  6522. * isn't allocated separately. */
  6523. wolfSSL_sk_SSL_CIPHER_free(ssl->suites->stack);
  6524. }
  6525. #endif
  6526. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  6527. }
  6528. ssl->suites = NULL;
  6529. }
  6530. /* In case holding SSL object in array and don't want to free actual ssl */
  6531. void SSL_ResourceFree(WOLFSSL* ssl)
  6532. {
  6533. /* Note: any resources used during the handshake should be released in the
  6534. * function FreeHandshakeResources(). Be careful with the special cases
  6535. * like the RNG which may optionally be kept for the whole session. (For
  6536. * example with the RNG, it isn't used beyond the handshake except when
  6537. * using stream ciphers where it is retained. */
  6538. if (ssl->options.side == WOLFSSL_SERVER_END) {
  6539. WOLFSSL_MSG("Free'ing server ssl");
  6540. }
  6541. else {
  6542. WOLFSSL_MSG("Free'ing client ssl");
  6543. }
  6544. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  6545. wolfSSL_CRYPTO_cleanup_ex_data(&ssl->ex_data);
  6546. #endif
  6547. FreeCiphers(ssl);
  6548. FreeArrays(ssl, 0);
  6549. FreeKeyExchange(ssl);
  6550. #ifdef WOLFSSL_ASYNC_IO
  6551. /* Cleanup async */
  6552. FreeAsyncCtx(ssl, 1);
  6553. #endif
  6554. if (ssl->options.weOwnRng) {
  6555. wc_FreeRng(ssl->rng);
  6556. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  6557. }
  6558. FreeSuites(ssl);
  6559. FreeHandshakeHashes(ssl);
  6560. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  6561. /* clear keys struct after session */
  6562. ForceZero(&ssl->keys, sizeof(Keys));
  6563. #ifdef WOLFSSL_TLS13
  6564. if (ssl->options.tls1_3) {
  6565. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  6566. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  6567. }
  6568. #endif
  6569. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  6570. ForceZero(&ssl->clientFinished, TLS_FINISHED_SZ_MAX);
  6571. ForceZero(&ssl->serverFinished, TLS_FINISHED_SZ_MAX);
  6572. ssl->serverFinished_len = 0;
  6573. ssl->clientFinished_len = 0;
  6574. #endif
  6575. #ifndef NO_DH
  6576. if (ssl->buffers.serverDH_Priv.buffer != NULL) {
  6577. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  6578. ssl->buffers.serverDH_Priv.length);
  6579. }
  6580. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6581. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6582. /* parameters (p,g) may be owned by ctx */
  6583. if (ssl->buffers.weOwnDH) {
  6584. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6585. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6586. }
  6587. #endif /* !NO_DH */
  6588. #ifndef NO_CERTS
  6589. ssl->keepCert = 0; /* make sure certificate is free'd */
  6590. wolfSSL_UnloadCertsKeys(ssl);
  6591. #endif
  6592. #ifndef NO_RSA
  6593. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  6594. ssl->peerRsaKeyPresent = 0;
  6595. #endif
  6596. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT)
  6597. XFREE(ssl->peerSceTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
  6598. Renesas_cmn_Cleanup(ssl);
  6599. #endif
  6600. if (ssl->buffers.inputBuffer.dynamicFlag)
  6601. ShrinkInputBuffer(ssl, FORCED_FREE);
  6602. if (ssl->buffers.outputBuffer.dynamicFlag)
  6603. ShrinkOutputBuffer(ssl);
  6604. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  6605. if (ssl->buffers.tls13CookieSecret.buffer != NULL) {
  6606. ForceZero(ssl->buffers.tls13CookieSecret.buffer,
  6607. ssl->buffers.tls13CookieSecret.length);
  6608. }
  6609. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  6610. DYNAMIC_TYPE_COOKIE_PWD);
  6611. #endif
  6612. #ifdef WOLFSSL_DTLS
  6613. DtlsMsgPoolReset(ssl);
  6614. if (ssl->dtls_rx_msg_list != NULL) {
  6615. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  6616. ssl->dtls_rx_msg_list = NULL;
  6617. ssl->dtls_rx_msg_list_sz = 0;
  6618. }
  6619. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  6620. ssl->buffers.dtlsCtx.peer.sa = NULL;
  6621. #ifndef NO_WOLFSSL_SERVER
  6622. if (ssl->buffers.dtlsCookieSecret.buffer != NULL) {
  6623. ForceZero(ssl->buffers.dtlsCookieSecret.buffer,
  6624. ssl->buffers.dtlsCookieSecret.length);
  6625. }
  6626. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  6627. DYNAMIC_TYPE_COOKIE_PWD);
  6628. #endif
  6629. #ifdef WOLFSSL_DTLS13
  6630. if (ssl->dtls13ClientHello != NULL) {
  6631. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  6632. ssl->dtls13ClientHello = NULL;
  6633. ssl->dtls13ClientHelloSz = 0;
  6634. }
  6635. #endif /* WOLFSSL_DTLS13 */
  6636. #endif /* WOLFSSL_DTLS */
  6637. #ifdef OPENSSL_EXTRA
  6638. #ifndef NO_BIO
  6639. /* Don't free if there was/is a previous element in the chain.
  6640. * This means that this BIO was part of a chain that will be
  6641. * free'd separately. */
  6642. if (ssl->biord != ssl->biowr) /* only free write if different */
  6643. if (ssl->biowr != NULL && ssl->biowr->prev == NULL)
  6644. wolfSSL_BIO_free(ssl->biowr);
  6645. if (ssl->biord != NULL && ssl->biord->prev == NULL)
  6646. wolfSSL_BIO_free(ssl->biord);
  6647. ssl->biowr = NULL;
  6648. ssl->biord = NULL;
  6649. #endif
  6650. #endif
  6651. #ifdef HAVE_LIBZ
  6652. FreeStreams(ssl);
  6653. #endif
  6654. #ifdef HAVE_ECC
  6655. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  6656. ssl->peerEccKeyPresent = 0;
  6657. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  6658. ssl->peerEccDsaKeyPresent = 0;
  6659. #endif
  6660. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
  6661. {
  6662. int dtype = 0;
  6663. #ifdef HAVE_ECC
  6664. dtype = DYNAMIC_TYPE_ECC;
  6665. #endif
  6666. #ifdef HAVE_CURVE25519
  6667. if (ssl->peerX25519KeyPresent
  6668. #ifdef HAVE_ECC
  6669. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
  6670. #endif /* HAVE_ECC */
  6671. )
  6672. {
  6673. dtype = DYNAMIC_TYPE_CURVE25519;
  6674. }
  6675. #endif /* HAVE_CURVE25519 */
  6676. #ifdef HAVE_CURVE448
  6677. if (ssl->peerX448KeyPresent
  6678. #ifdef HAVE_ECC
  6679. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
  6680. #endif /* HAVE_ECC */
  6681. )
  6682. {
  6683. dtype = DYNAMIC_TYPE_CURVE448;
  6684. }
  6685. #endif /* HAVE_CURVE448 */
  6686. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  6687. ssl->eccTempKeyPresent = 0;
  6688. }
  6689. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  6690. #ifdef HAVE_CURVE25519
  6691. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  6692. ssl->peerX25519KeyPresent = 0;
  6693. #endif
  6694. #ifdef HAVE_ED25519
  6695. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  6696. ssl->peerEd25519KeyPresent = 0;
  6697. #ifdef HAVE_PK_CALLBACKS
  6698. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  6699. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  6700. DYNAMIC_TYPE_ED25519);
  6701. ssl->buffers.peerEd25519Key.buffer = NULL;
  6702. }
  6703. #endif
  6704. #endif
  6705. #ifdef HAVE_CURVE448
  6706. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  6707. ssl->peerX448KeyPresent = 0;
  6708. #endif
  6709. #ifdef HAVE_ED448
  6710. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  6711. ssl->peerEd448KeyPresent = 0;
  6712. #ifdef HAVE_PK_CALLBACKS
  6713. if (ssl->buffers.peerEd448Key.buffer != NULL) {
  6714. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
  6715. DYNAMIC_TYPE_ED448);
  6716. ssl->buffers.peerEd448Key.buffer = NULL;
  6717. }
  6718. #endif
  6719. #endif
  6720. #ifdef HAVE_PQC
  6721. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  6722. ssl->peerFalconKeyPresent = 0;
  6723. #endif
  6724. #ifdef HAVE_PK_CALLBACKS
  6725. #ifdef HAVE_ECC
  6726. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  6727. #endif /* HAVE_ECC */
  6728. #ifndef NO_RSA
  6729. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  6730. #endif /* NO_RSA */
  6731. #endif /* HAVE_PK_CALLBACKS */
  6732. #ifdef HAVE_TLS_EXTENSIONS
  6733. #if !defined(NO_TLS)
  6734. TLSX_FreeAll(ssl->extensions, ssl->heap);
  6735. #endif /* !NO_TLS */
  6736. #ifdef HAVE_ALPN
  6737. if (ssl->alpn_client_list != NULL) {
  6738. XFREE(ssl->alpn_client_list, ssl->heap, DYNAMIC_TYPE_ALPN);
  6739. ssl->alpn_client_list = NULL;
  6740. }
  6741. #endif
  6742. #endif /* HAVE_TLS_EXTENSIONS */
  6743. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  6744. if (ssl->mnCtx) {
  6745. mynewt_ctx_clear(ssl->mnCtx);
  6746. ssl->mnCtx = NULL;
  6747. }
  6748. #endif
  6749. #ifdef HAVE_NETX
  6750. if (ssl->nxCtx.nxPacket)
  6751. nx_packet_release(ssl->nxCtx.nxPacket);
  6752. #endif
  6753. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  6754. if (ssl->x509_store_pt)
  6755. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  6756. #endif
  6757. #ifdef KEEP_PEER_CERT
  6758. FreeX509(&ssl->peerCert);
  6759. #endif
  6760. if (ssl->session != NULL)
  6761. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  6762. #ifdef HAVE_WRITE_DUP
  6763. if (ssl->dupWrite) {
  6764. FreeWriteDup(ssl);
  6765. }
  6766. #endif
  6767. #ifdef OPENSSL_EXTRA
  6768. if (ssl->param) {
  6769. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  6770. }
  6771. #endif
  6772. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6773. while (ssl->certReqCtx != NULL) {
  6774. CertReqCtx* curr = ssl->certReqCtx;
  6775. ssl->certReqCtx = curr->next;
  6776. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6777. }
  6778. #endif
  6779. #ifdef WOLFSSL_STATIC_EPHEMERAL
  6780. #ifndef NO_DH
  6781. FreeDer(&ssl->staticKE.dhKey);
  6782. #endif
  6783. #ifdef HAVE_ECC
  6784. FreeDer(&ssl->staticKE.ecKey);
  6785. #endif
  6786. #ifdef HAVE_CURVE25519
  6787. FreeDer(&ssl->staticKE.x25519Key);
  6788. #endif
  6789. #ifdef HAVE_CURVE448
  6790. FreeDer(&ssl->staticKE.x448Key);
  6791. #endif
  6792. #endif
  6793. #ifdef WOLFSSL_STATIC_MEMORY
  6794. /* check if using fixed io buffers and free them */
  6795. if (ssl->heap != NULL) {
  6796. #ifdef WOLFSSL_HEAP_TEST
  6797. /* avoid dereferencing a test value */
  6798. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  6799. #endif
  6800. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  6801. WOLFSSL_HEAP* ctx_heap;
  6802. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  6803. ctx_heap = ssl_hint->memory;
  6804. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  6805. WOLFSSL_MSG("Bad memory_mutex lock");
  6806. }
  6807. ctx_heap->curIO--;
  6808. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  6809. WOLFSSL_MSG("Error freeing fixed output buffer");
  6810. }
  6811. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  6812. WOLFSSL_MSG("Error freeing fixed output buffer");
  6813. }
  6814. if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/
  6815. ctx_heap->curHa--;
  6816. }
  6817. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  6818. /* check if tracking stats */
  6819. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  6820. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  6821. }
  6822. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  6823. #ifdef WOLFSSL_HEAP_TEST
  6824. }
  6825. #endif
  6826. }
  6827. #endif /* WOLFSSL_STATIC_MEMORY */
  6828. #ifdef OPENSSL_EXTRA
  6829. /* Enough to free stack structure since WOLFSSL_CIPHER
  6830. * isn't allocated separately. */
  6831. wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
  6832. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  6833. #ifdef KEEP_OUR_CERT
  6834. wolfSSL_sk_X509_pop_free(ssl->ourCertChain, NULL);
  6835. #endif
  6836. #endif
  6837. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  6838. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  6839. ssl->ca_names = NULL;
  6840. #endif
  6841. #ifdef WOLFSSL_DTLS13
  6842. Dtls13FreeFsmResources(ssl);
  6843. #endif /* WOLFSSL_DTLS13 */
  6844. #ifdef WOLFSSL_QUIC
  6845. wolfSSL_quic_free(ssl);
  6846. #endif
  6847. }
  6848. /* Free any handshake resources no longer needed */
  6849. void FreeHandshakeResources(WOLFSSL* ssl)
  6850. {
  6851. WOLFSSL_ENTER("FreeHandshakeResources");
  6852. #ifdef WOLFSSL_DTLS
  6853. if (ssl->options.dtls) {
  6854. /* DTLS_POOL (DTLSv1.3 flushes the queue autonomously) */
  6855. if(!IsAtLeastTLSv1_3(ssl->version)) {
  6856. DtlsMsgPoolReset(ssl);
  6857. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  6858. ssl->dtls_rx_msg_list = NULL;
  6859. ssl->dtls_rx_msg_list_sz = 0;
  6860. }
  6861. #ifdef WOLFSSL_DTLS13
  6862. if (ssl->dtls13ClientHello != NULL) {
  6863. XFREE(ssl->dtls13ClientHello, ssl->heap, DYNAMIC_TYPE_DTLS_MSG);
  6864. ssl->dtls13ClientHello = NULL;
  6865. ssl->dtls13ClientHelloSz = 0;
  6866. }
  6867. #endif /* WOLFSSL_DTLS13 */
  6868. }
  6869. #endif
  6870. #ifdef HAVE_SECURE_RENEGOTIATION
  6871. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  6872. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  6873. return;
  6874. }
  6875. #endif
  6876. /* input buffer */
  6877. if (ssl->buffers.inputBuffer.dynamicFlag)
  6878. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  6879. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6880. if (!ssl->options.tls1_3)
  6881. #endif
  6882. {
  6883. #ifndef OPENSSL_EXTRA
  6884. /* free suites unless using compatibility layer */
  6885. FreeSuites(ssl);
  6886. #endif
  6887. /* hsHashes */
  6888. FreeHandshakeHashes(ssl);
  6889. }
  6890. /* RNG */
  6891. if (ssl->options.tls1_1 == 0
  6892. #ifndef WOLFSSL_AEAD_ONLY
  6893. || ssl->specs.cipher_type == stream
  6894. #endif
  6895. #if defined(WOLFSSL_TLS13)
  6896. /* Post-handshake auth requires random on client side for TLS 1.3.
  6897. * Session ticket requires random on server side.
  6898. */
  6899. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && !defined(HAVE_SESSION_TICKET)
  6900. || ssl->options.tls1_3
  6901. #elif !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && defined(HAVE_SESSION_TICKET)
  6902. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_CLIENT_END)
  6903. #elif !defined(HAVE_SESSION_TICKET)
  6904. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  6905. #endif
  6906. #endif
  6907. ) {
  6908. if (ssl->options.weOwnRng) {
  6909. wc_FreeRng(ssl->rng);
  6910. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  6911. ssl->rng = NULL;
  6912. ssl->options.weOwnRng = 0;
  6913. }
  6914. }
  6915. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  6916. defined(HAVE_SESSION_TICKET)
  6917. if (!ssl->options.tls1_3)
  6918. #endif
  6919. /* arrays */
  6920. if (ssl->options.saveArrays == 0)
  6921. FreeArrays(ssl, 1);
  6922. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6923. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  6924. #endif
  6925. {
  6926. #ifndef NO_RSA
  6927. /* peerRsaKey */
  6928. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  6929. ssl->peerRsaKeyPresent = 0;
  6930. #endif
  6931. #ifdef HAVE_ECC
  6932. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  6933. ssl->peerEccDsaKeyPresent = 0;
  6934. #endif /* HAVE_ECC */
  6935. #ifdef HAVE_ED25519
  6936. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  6937. ssl->peerEd25519KeyPresent = 0;
  6938. #endif /* HAVE_ED25519 */
  6939. #ifdef HAVE_ED448
  6940. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  6941. ssl->peerEd448KeyPresent = 0;
  6942. #endif /* HAVE_ED448 */
  6943. #ifdef HAVE_PQC
  6944. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  6945. ssl->peerFalconKeyPresent = 0;
  6946. #endif /* HAVE_PQC */
  6947. }
  6948. #ifdef HAVE_ECC
  6949. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  6950. ssl->peerEccKeyPresent = 0;
  6951. #endif
  6952. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  6953. {
  6954. int dtype;
  6955. #ifdef HAVE_ECC
  6956. dtype = DYNAMIC_TYPE_ECC;
  6957. #elif defined(HAVE_CURVE25519)
  6958. dtype = DYNAMIC_TYPE_CURVE25519;
  6959. #else
  6960. dtype = DYNAMIC_TYPE_CURVE448;
  6961. #endif
  6962. #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
  6963. if (ssl->peerX25519KeyPresent ||
  6964. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  6965. {
  6966. dtype = DYNAMIC_TYPE_CURVE25519;
  6967. }
  6968. #endif
  6969. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  6970. defined(HAVE_CURVE448)
  6971. if (ssl->peerX448KeyPresent ||
  6972. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
  6973. {
  6974. dtype = DYNAMIC_TYPE_CURVE448;
  6975. }
  6976. #endif
  6977. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  6978. ssl->eccTempKeyPresent = 0;
  6979. }
  6980. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  6981. #ifdef HAVE_CURVE25519
  6982. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  6983. ssl->peerX25519KeyPresent = 0;
  6984. #endif
  6985. #ifdef HAVE_CURVE448
  6986. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  6987. ssl->peerX448KeyPresent = 0;
  6988. #endif
  6989. #ifndef NO_DH
  6990. if (ssl->buffers.serverDH_Priv.buffer) {
  6991. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  6992. ssl->buffers.serverDH_Priv.length);
  6993. }
  6994. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6995. ssl->buffers.serverDH_Priv.buffer = NULL;
  6996. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6997. ssl->buffers.serverDH_Pub.buffer = NULL;
  6998. /* parameters (p,g) may be owned by ctx */
  6999. if (ssl->buffers.weOwnDH) {
  7000. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7001. ssl->buffers.serverDH_G.buffer = NULL;
  7002. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  7003. ssl->buffers.serverDH_P.buffer = NULL;
  7004. }
  7005. #endif /* !NO_DH */
  7006. #ifndef NO_CERTS
  7007. wolfSSL_UnloadCertsKeys(ssl);
  7008. #endif
  7009. #ifdef HAVE_PK_CALLBACKS
  7010. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  7011. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  7012. #endif
  7013. {
  7014. #ifdef HAVE_ECC
  7015. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  7016. ssl->buffers.peerEccDsaKey.buffer = NULL;
  7017. #endif /* HAVE_ECC */
  7018. #ifndef NO_RSA
  7019. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  7020. ssl->buffers.peerRsaKey.buffer = NULL;
  7021. #endif /* NO_RSA */
  7022. #ifdef HAVE_ED25519
  7023. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  7024. DYNAMIC_TYPE_ED25519);
  7025. ssl->buffers.peerEd25519Key.buffer = NULL;
  7026. #endif
  7027. #ifdef HAVE_ED448
  7028. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
  7029. ssl->buffers.peerEd448Key.buffer = NULL;
  7030. #endif
  7031. }
  7032. #endif /* HAVE_PK_CALLBACKS */
  7033. #if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \
  7034. !defined(NO_TLS) && !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  7035. !defined(WOLFSSL_DTLS_CID)
  7036. /* Some extensions need to be kept for post-handshake querying. */
  7037. TLSX_FreeAll(ssl->extensions, ssl->heap);
  7038. ssl->extensions = NULL;
  7039. #endif
  7040. #ifdef WOLFSSL_STATIC_MEMORY
  7041. /* when done with handshake decrement current handshake count */
  7042. if (ssl->heap != NULL) {
  7043. #ifdef WOLFSSL_HEAP_TEST
  7044. /* avoid dereferencing a test value */
  7045. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  7046. #endif
  7047. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  7048. WOLFSSL_HEAP* ctx_heap;
  7049. ctx_heap = ssl_hint->memory;
  7050. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  7051. WOLFSSL_MSG("Bad memory_mutex lock");
  7052. }
  7053. ctx_heap->curHa--;
  7054. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  7055. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  7056. #ifdef WOLFSSL_HEAP_TEST
  7057. }
  7058. #endif
  7059. }
  7060. #endif /* WOLFSSL_STATIC_MEMORY */
  7061. }
  7062. /* heap argument is the heap hint used when creating SSL */
  7063. void FreeSSL(WOLFSSL* ssl, void* heap)
  7064. {
  7065. WOLFSSL_CTX* ctx = ssl->ctx;
  7066. SSL_ResourceFree(ssl);
  7067. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  7068. if (ctx)
  7069. FreeSSL_Ctx(ctx); /* will decrement and free underlying CTX if 0 */
  7070. (void)heap;
  7071. #ifdef WOLFSSL_CHECK_MEM_ZERO
  7072. wc_MemZero_Check(ssl, sizeof(*ssl));
  7073. #endif
  7074. }
  7075. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  7076. !defined(WOLFSSL_NO_TLS12) || \
  7077. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \
  7078. && defined(HAVE_AEAD))
  7079. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  7080. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  7081. {
  7082. if (verify) {
  7083. seq[0] = ssl->keys.peer_sequence_number_hi;
  7084. seq[1] = ssl->keys.peer_sequence_number_lo++;
  7085. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  7086. /* handle rollover */
  7087. ssl->keys.peer_sequence_number_hi++;
  7088. }
  7089. }
  7090. else {
  7091. seq[0] = ssl->keys.sequence_number_hi;
  7092. seq[1] = ssl->keys.sequence_number_lo++;
  7093. if (seq[1] > ssl->keys.sequence_number_lo) {
  7094. /* handle rollover */
  7095. ssl->keys.sequence_number_hi++;
  7096. }
  7097. }
  7098. }
  7099. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  7100. #ifdef WOLFSSL_DTLS
  7101. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  7102. {
  7103. #ifdef HAVE_SECURE_RENEGOTIATION
  7104. order = DtlsCheckOrder(ssl, order);
  7105. #endif
  7106. if (order == PREV_ORDER) {
  7107. /* Previous epoch case */
  7108. if (ssl->options.haveMcast) {
  7109. #ifdef WOLFSSL_MULTICAST
  7110. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  7111. (ssl->options.mcastID << 8) |
  7112. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  7113. #endif
  7114. }
  7115. else
  7116. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  7117. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  7118. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  7119. }
  7120. else if (order == PEER_ORDER) {
  7121. if (ssl->options.haveMcast) {
  7122. #ifdef WOLFSSL_MULTICAST
  7123. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  7124. (ssl->keys.curPeerId << 8) |
  7125. (ssl->keys.curSeq_hi & 0xFF);
  7126. #endif
  7127. }
  7128. else
  7129. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  7130. (ssl->keys.curSeq_hi & 0xFFFF);
  7131. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  7132. }
  7133. else {
  7134. if (ssl->options.haveMcast) {
  7135. #ifdef WOLFSSL_MULTICAST
  7136. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  7137. (ssl->options.mcastID << 8) |
  7138. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  7139. #endif
  7140. }
  7141. else
  7142. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  7143. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  7144. seq[1] = ssl->keys.dtls_sequence_number_lo;
  7145. }
  7146. }
  7147. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  7148. {
  7149. word32 seq;
  7150. #ifdef HAVE_SECURE_RENEGOTIATION
  7151. order = DtlsCheckOrder(ssl, order);
  7152. #endif
  7153. if (order == PREV_ORDER) {
  7154. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  7155. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  7156. /* handle rollover */
  7157. ssl->keys.dtls_prev_sequence_number_hi++;
  7158. }
  7159. }
  7160. else if (order == PEER_ORDER) {
  7161. seq = ssl->keys.peer_sequence_number_lo++;
  7162. if (seq > ssl->keys.peer_sequence_number_lo) {
  7163. /* handle rollover */
  7164. ssl->keys.peer_sequence_number_hi++;
  7165. }
  7166. }
  7167. else {
  7168. seq = ssl->keys.dtls_sequence_number_lo++;
  7169. if (seq > ssl->keys.dtls_sequence_number_lo) {
  7170. /* handle rollover */
  7171. ssl->keys.dtls_sequence_number_hi++;
  7172. }
  7173. }
  7174. }
  7175. #endif /* WOLFSSL_DTLS */
  7176. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  7177. void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  7178. {
  7179. word32 seq[2] = {0, 0};
  7180. if (!ssl->options.dtls) {
  7181. GetSEQIncrement(ssl, verifyOrder, seq);
  7182. }
  7183. else {
  7184. #ifdef WOLFSSL_DTLS
  7185. DtlsGetSEQ(ssl, verifyOrder, seq);
  7186. #endif
  7187. }
  7188. c32toa(seq[0], out);
  7189. c32toa(seq[1], out + OPAQUE32_LEN);
  7190. }
  7191. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  7192. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
  7193. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */
  7194. #ifdef WOLFSSL_DTLS
  7195. /* functions for managing DTLS datagram reordering */
  7196. /* Need to allocate space for the handshake message header. The hashing
  7197. * routines assume the message pointer is still within the buffer that
  7198. * has the headers, and will include those headers in the hash. The store
  7199. * routines need to take that into account as well. New will allocate
  7200. * extra space for the headers. */
  7201. DtlsMsg* DtlsMsgNew(word32 sz, void* heap)
  7202. {
  7203. DtlsMsg* msg;
  7204. WOLFSSL_ENTER("DtlsMsgNew()");
  7205. (void)heap;
  7206. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  7207. if (msg != NULL) {
  7208. XMEMSET(msg, 0, sizeof(DtlsMsg));
  7209. msg->buf = (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ,
  7210. heap, DYNAMIC_TYPE_DTLS_BUFFER);
  7211. if (msg->buf != NULL) {
  7212. msg->sz = sz;
  7213. msg->type = no_shake;
  7214. msg->msg = msg->buf + DTLS_HANDSHAKE_HEADER_SZ;
  7215. }
  7216. else {
  7217. XFREE(msg, heap, DYNAMIC_TYPE_DTLS_MSG);
  7218. msg = NULL;
  7219. }
  7220. }
  7221. return msg;
  7222. }
  7223. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  7224. {
  7225. (void)heap;
  7226. WOLFSSL_ENTER("DtlsMsgDelete()");
  7227. if (item != NULL) {
  7228. DtlsFrag* cur = item->fragList;
  7229. while (cur != NULL) {
  7230. DtlsFrag* next = cur->next;
  7231. XFREE(cur, heap, DYNAMIC_TYPE_DTLS_FRAG);
  7232. cur = next;
  7233. }
  7234. if (item->buf != NULL)
  7235. XFREE(item->buf, heap, DYNAMIC_TYPE_DTLS_BUFFER);
  7236. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  7237. }
  7238. }
  7239. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  7240. {
  7241. DtlsMsg* next;
  7242. WOLFSSL_ENTER("DtlsMsgListDelete()");
  7243. while (head) {
  7244. next = head->next;
  7245. DtlsMsgDelete(head, heap);
  7246. head = next;
  7247. }
  7248. }
  7249. /**
  7250. * Drop messages when they are no longer going to be retransmitted
  7251. */
  7252. void DtlsTxMsgListClean(WOLFSSL* ssl)
  7253. {
  7254. DtlsMsg* head = ssl->dtls_tx_msg_list;
  7255. DtlsMsg* next;
  7256. WOLFSSL_ENTER("DtlsTxMsgListClean()");
  7257. while (head) {
  7258. next = head->next;
  7259. if (VerifyForTxDtlsMsgDelete(ssl, head))
  7260. DtlsMsgDelete(head, ssl->heap);
  7261. else
  7262. /* Stored packets should be in order so break on first failed
  7263. * verify */
  7264. break;
  7265. ssl->dtls_tx_msg_list_sz--;
  7266. head = next;
  7267. }
  7268. ssl->dtls_tx_msg_list = head;
  7269. }
  7270. /* Create a DTLS Fragment from *begin - end, adjust new *begin and bytesLeft */
  7271. static DtlsFrag* CreateFragment(word32* begin, word32 end, const byte* data,
  7272. byte* buf, word32* bytesLeft, void* heap)
  7273. {
  7274. DtlsFrag* newFrag;
  7275. word32 added = end - *begin + 1;
  7276. WOLFSSL_ENTER("CreateFragment()");
  7277. (void)heap;
  7278. newFrag = (DtlsFrag*)XMALLOC(sizeof(DtlsFrag), heap,
  7279. DYNAMIC_TYPE_DTLS_FRAG);
  7280. if (newFrag != NULL) {
  7281. newFrag->next = NULL;
  7282. newFrag->begin = *begin;
  7283. newFrag->end = end;
  7284. XMEMCPY(buf + *begin, data, added);
  7285. *bytesLeft -= added;
  7286. *begin = newFrag->end + 1;
  7287. }
  7288. return newFrag;
  7289. }
  7290. int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
  7291. word32 fragOffset, word32 fragSz, void* heap)
  7292. {
  7293. WOLFSSL_ENTER("DtlsMsgSet()");
  7294. if (msg != NULL && data != NULL && msg->fragSz <= msg->sz &&
  7295. fragSz <= msg->sz && fragOffset <= msg->sz &&
  7296. (fragOffset + fragSz) <= msg->sz) {
  7297. DtlsFrag* cur = msg->fragList;
  7298. DtlsFrag* prev = cur;
  7299. DtlsFrag* newFrag;
  7300. word32 bytesLeft = fragSz; /* could be overlapping fragment */
  7301. word32 startOffset = fragOffset;
  7302. word32 added;
  7303. msg->seq = seq;
  7304. msg->epoch = epoch;
  7305. msg->type = type;
  7306. if (fragOffset == 0) {
  7307. XMEMCPY(msg->buf, data - DTLS_HANDSHAKE_HEADER_SZ,
  7308. DTLS_HANDSHAKE_HEADER_SZ);
  7309. c32to24(msg->sz, msg->msg - DTLS_HANDSHAKE_FRAG_SZ);
  7310. }
  7311. /* if no message data, just return */
  7312. if (fragSz == 0)
  7313. return 0;
  7314. /* if list is empty add full fragment to front */
  7315. if (cur == NULL) {
  7316. newFrag = CreateFragment(&fragOffset, fragOffset + fragSz - 1, data,
  7317. msg->msg, &bytesLeft, heap);
  7318. if (newFrag == NULL)
  7319. return MEMORY_E;
  7320. msg->fragSz = fragSz;
  7321. msg->fragList = newFrag;
  7322. return 0;
  7323. }
  7324. /* add to front if before current front, up to next->begin */
  7325. if (fragOffset < cur->begin) {
  7326. word32 end = fragOffset + fragSz - 1;
  7327. if (end >= cur->begin)
  7328. end = cur->begin - 1;
  7329. added = end - fragOffset + 1;
  7330. newFrag = CreateFragment(&fragOffset, end, data, msg->msg,
  7331. &bytesLeft, heap);
  7332. if (newFrag == NULL)
  7333. return MEMORY_E;
  7334. msg->fragSz += added;
  7335. newFrag->next = cur;
  7336. msg->fragList = newFrag;
  7337. }
  7338. /* while we have bytes left, try to find a gap to fill */
  7339. while (bytesLeft > 0) {
  7340. /* get previous packet in list */
  7341. while (cur && (fragOffset >= cur->begin)) {
  7342. prev = cur;
  7343. cur = cur->next;
  7344. }
  7345. /* don't add duplicate data */
  7346. if (prev->end >= fragOffset) {
  7347. if ( (fragOffset + bytesLeft - 1) <= prev->end)
  7348. return 0;
  7349. fragOffset = prev->end + 1;
  7350. bytesLeft = startOffset + fragSz - fragOffset;
  7351. }
  7352. if (cur == NULL)
  7353. /* we're at the end */
  7354. added = bytesLeft;
  7355. else
  7356. /* we're in between two frames */
  7357. added = min(bytesLeft, cur->begin - fragOffset);
  7358. /* data already there */
  7359. if (added == 0)
  7360. continue;
  7361. newFrag = CreateFragment(&fragOffset, fragOffset + added - 1,
  7362. data + fragOffset - startOffset,
  7363. msg->msg, &bytesLeft, heap);
  7364. if (newFrag == NULL)
  7365. return MEMORY_E;
  7366. msg->fragSz += added;
  7367. newFrag->next = prev->next;
  7368. prev->next = newFrag;
  7369. }
  7370. }
  7371. return 0;
  7372. }
  7373. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word16 epoch, word32 seq)
  7374. {
  7375. WOLFSSL_ENTER("DtlsMsgFind()");
  7376. while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
  7377. head = head->next;
  7378. }
  7379. return head;
  7380. }
  7381. void DtlsMsgStore(WOLFSSL* ssl, word16 epoch, word32 seq, const byte* data,
  7382. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  7383. {
  7384. /* See if seq exists in the list. If it isn't in the list, make
  7385. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  7386. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  7387. * the seq is in the list and it isn't full, copy fragSz bytes from
  7388. * data to msg->msg starting at offset fragOffset, and add fragSz to
  7389. * msg->fragSz. Insertions take into account data already in the list
  7390. * in case there are overlaps in the handshake message due to retransmit
  7391. * messages. The new item should be inserted into the list in its
  7392. * proper position.
  7393. *
  7394. * 1. Find seq in list, or where seq should go in list. If seq not in
  7395. * list, create new item and insert into list. Either case, keep
  7396. * pointer to item.
  7397. * 2. Copy the data from the message to the stored message where it
  7398. * belongs without overlaps.
  7399. */
  7400. DtlsMsg* head = ssl->dtls_rx_msg_list;
  7401. WOLFSSL_ENTER("DtlsMsgStore()");
  7402. if (head != NULL) {
  7403. DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
  7404. if (cur == NULL) {
  7405. cur = DtlsMsgNew(dataSz, heap);
  7406. if (cur != NULL) {
  7407. if (DtlsMsgSet(cur, seq, epoch, data, type,
  7408. fragOffset, fragSz, heap) < 0) {
  7409. DtlsMsgDelete(cur, heap);
  7410. }
  7411. else {
  7412. ssl->dtls_rx_msg_list_sz++;
  7413. head = DtlsMsgInsert(head, cur);
  7414. }
  7415. }
  7416. }
  7417. else {
  7418. /* If this fails, the data is just dropped. */
  7419. DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
  7420. fragSz, heap);
  7421. }
  7422. }
  7423. else {
  7424. head = DtlsMsgNew(dataSz, heap);
  7425. if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
  7426. fragSz, heap) < 0) {
  7427. DtlsMsgDelete(head, heap);
  7428. head = NULL;
  7429. }
  7430. else {
  7431. ssl->dtls_rx_msg_list_sz++;
  7432. }
  7433. }
  7434. ssl->dtls_rx_msg_list = head;
  7435. }
  7436. /* DtlsMsgInsert() is an in-order insert. */
  7437. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  7438. {
  7439. WOLFSSL_ENTER("DtlsMsgInsert()");
  7440. if (head == NULL || (item->epoch <= head->epoch &&
  7441. item->seq < head->seq)) {
  7442. item->next = head;
  7443. head = item;
  7444. }
  7445. else if (head->next == NULL) {
  7446. head->next = item;
  7447. }
  7448. else {
  7449. DtlsMsg* cur = head->next;
  7450. DtlsMsg* prev = head;
  7451. while (cur) {
  7452. if (item->epoch <= cur->epoch &&
  7453. item->seq < cur->seq) {
  7454. item->next = cur;
  7455. prev->next = item;
  7456. break;
  7457. }
  7458. prev = cur;
  7459. cur = cur->next;
  7460. }
  7461. if (cur == NULL) {
  7462. prev->next = item;
  7463. }
  7464. }
  7465. return head;
  7466. }
  7467. /**
  7468. * DtlsMsgPoolSave() adds the message to the end of the stored transmit
  7469. * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
  7470. * anything else that increments ssl->keys.dtls_handshake_number.
  7471. */
  7472. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
  7473. enum HandShakeType type)
  7474. {
  7475. DtlsMsg* item;
  7476. int ret = 0;
  7477. WOLFSSL_ENTER("DtlsMsgPoolSave()");
  7478. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  7479. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  7480. return DTLS_POOL_SZ_E;
  7481. }
  7482. item = DtlsMsgNew(dataSz, ssl->heap);
  7483. if (item != NULL) {
  7484. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  7485. XMEMCPY(item->buf, data, dataSz);
  7486. item->sz = dataSz;
  7487. item->epoch = ssl->keys.dtls_epoch;
  7488. item->seq = ssl->keys.dtls_handshake_number;
  7489. item->type = type;
  7490. if (cur == NULL)
  7491. ssl->dtls_tx_msg_list = item;
  7492. else {
  7493. while (cur->next)
  7494. cur = cur->next;
  7495. cur->next = item;
  7496. }
  7497. ssl->dtls_tx_msg_list_sz++;
  7498. }
  7499. else
  7500. ret = MEMORY_E;
  7501. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  7502. return ret;
  7503. }
  7504. /* DtlsMsgPoolTimeout() updates the timeout time. */
  7505. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  7506. {
  7507. int result = -1;
  7508. WOLFSSL_ENTER("DtlsMsgPoolTimeout()");
  7509. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  7510. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  7511. result = 0;
  7512. }
  7513. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  7514. return result;
  7515. }
  7516. /* DtlsMsgPoolReset() deletes the stored transmit list. */
  7517. void DtlsMsgPoolReset(WOLFSSL* ssl)
  7518. {
  7519. WOLFSSL_ENTER("DtlsMsgPoolReset()");
  7520. if (ssl->dtls_tx_msg_list) {
  7521. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  7522. ssl->dtls_tx_msg_list = NULL;
  7523. ssl->dtls_tx_msg = NULL;
  7524. ssl->dtls_tx_msg_list_sz = 0;
  7525. }
  7526. }
  7527. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  7528. {
  7529. /**
  7530. * only the first message from previous flight should be valid
  7531. * to be used for triggering retransmission of whole DtlsMsgPool.
  7532. * change cipher suite type is not verified here
  7533. */
  7534. return ((fragOffset == 0) &&
  7535. (((ssl->options.side == WOLFSSL_SERVER_END) &&
  7536. ((type == client_hello) ||
  7537. ((ssl->options.verifyPeer) && (type == certificate)) ||
  7538. ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
  7539. ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  7540. (type == hello_request || type == server_hello))));
  7541. }
  7542. /**
  7543. * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
  7544. * depending on the current state of the handshake negotiation.
  7545. */
  7546. int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
  7547. {
  7548. WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete()");
  7549. if (item->epoch < ssl->keys.dtls_epoch - 1)
  7550. /* Messages not from current or previous epoch can be deleted */
  7551. return 1;
  7552. switch (ssl->options.side) {
  7553. case WOLFSSL_CLIENT_END:
  7554. if (item->type == client_hello &&
  7555. ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
  7556. return 1; /* client can forget first client_hello if received full
  7557. * flight of packets from server */
  7558. else
  7559. return 0;
  7560. case WOLFSSL_SERVER_END:
  7561. if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
  7562. item->type == hello_request)
  7563. return 1; /* Server can forget HelloRequest if client sent a valid
  7564. * ClientHello */
  7565. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
  7566. item->type <= server_hello_done)
  7567. return 1; /* server can forget everything up to ServerHelloDone if
  7568. * a client finished message has been received and
  7569. * successfully processed */
  7570. else
  7571. return 0;
  7572. default:
  7573. return 0;
  7574. }
  7575. }
  7576. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  7577. * updated with new sequence numbers, and will be re-encrypted if needed. */
  7578. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  7579. {
  7580. int ret = 0;
  7581. DtlsMsg* pool;
  7582. int epochOrder;
  7583. WOLFSSL_ENTER("DtlsMsgPoolSend()");
  7584. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  7585. if (pool != NULL) {
  7586. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  7587. !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
  7588. ssl->options.acceptState == SERVER_HELLO_DONE ||
  7589. ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
  7590. ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
  7591. (ssl->options.side == WOLFSSL_CLIENT_END &&
  7592. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  7593. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  7594. ssl->options.connectState == FINISHED_DONE ||
  7595. ssl->options.connectState == SECOND_REPLY_DONE))) {
  7596. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  7597. ssl->error = DTLS_RETX_OVER_TX;
  7598. return WOLFSSL_FATAL_ERROR;
  7599. }
  7600. while (pool != NULL) {
  7601. if (pool->epoch == 0) {
  7602. DtlsRecordLayerHeader* dtls;
  7603. dtls = (DtlsRecordLayerHeader*)pool->buf;
  7604. /* If the stored record's epoch is 0, and the currently set
  7605. * epoch is 0, use the "current order" sequence number.
  7606. * If the stored record's epoch is 0 and the currently set
  7607. * epoch is not 0, the stored record is considered a "previous
  7608. * order" sequence number. */
  7609. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  7610. CUR_ORDER : PREV_ORDER;
  7611. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  7612. DtlsSEQIncrement(ssl, epochOrder);
  7613. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  7614. WOLFSSL_ERROR(ret);
  7615. return ret;
  7616. }
  7617. XMEMCPY(ssl->buffers.outputBuffer.buffer +
  7618. ssl->buffers.outputBuffer.idx +
  7619. ssl->buffers.outputBuffer.length,
  7620. pool->buf, pool->sz);
  7621. ssl->buffers.outputBuffer.length += pool->sz;
  7622. }
  7623. else {
  7624. /* Handle sending packets from previous epoch */
  7625. byte* input;
  7626. byte* output;
  7627. int inputSz, sendSz;
  7628. input = pool->buf;
  7629. inputSz = pool->sz;
  7630. sendSz = inputSz + cipherExtraData(ssl);
  7631. #ifdef HAVE_SECURE_RENEGOTIATION
  7632. /*
  7633. * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
  7634. * ssl->keys otherwise
  7635. * PREV_ORDER will always use ssl->keys
  7636. */
  7637. if (DtlsSCRKeysSet(ssl)) {
  7638. if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  7639. epochOrder = CUR_ORDER;
  7640. else
  7641. epochOrder = PREV_ORDER;
  7642. }
  7643. else {
  7644. epochOrder = CUR_ORDER;
  7645. }
  7646. #else
  7647. epochOrder = CUR_ORDER;
  7648. #endif
  7649. /* add back in header space from saved pool size */
  7650. sendSz += DTLS_HANDSHAKE_EXTRA;
  7651. sendSz += DTLS_RECORD_EXTRA;
  7652. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  7653. WOLFSSL_ERROR(ret);
  7654. return ret;
  7655. }
  7656. output = ssl->buffers.outputBuffer.buffer +
  7657. ssl->buffers.outputBuffer.length;
  7658. if (inputSz != ENUM_LEN)
  7659. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  7660. handshake, 0, 0, 0, epochOrder);
  7661. else
  7662. /* inputSz == ENUM_LEN must mean that this is a change cipher
  7663. * spec message */
  7664. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  7665. change_cipher_spec, 0, 0, 0, epochOrder);
  7666. if (sendSz < 0) {
  7667. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  7668. return BUILD_MSG_ERROR;
  7669. }
  7670. ssl->buffers.outputBuffer.length += sendSz;
  7671. }
  7672. if (!ssl->options.groupMessages)
  7673. ret = SendBuffered(ssl);
  7674. /**
  7675. * on server side, retransmission is being triggered only by sending
  7676. * first message of given flight, in order to trigger client
  7677. * to retransmit its whole flight. Sending the whole previous flight
  7678. * could lead to retransmission of previous client flight for each
  7679. * server message from previous flight. Therefore one message should
  7680. * be enough to do the trick.
  7681. */
  7682. if (sendOnlyFirstPacket &&
  7683. ssl->options.side == WOLFSSL_SERVER_END)
  7684. pool = NULL;
  7685. else
  7686. pool = pool->next;
  7687. ssl->dtls_tx_msg = pool;
  7688. }
  7689. if (ret == 0 && ssl->options.groupMessages)
  7690. ret = SendBuffered(ssl);
  7691. }
  7692. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  7693. return ret;
  7694. }
  7695. #endif /* WOLFSSL_DTLS */
  7696. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  7697. ProtocolVersion MakeSSLv3(void)
  7698. {
  7699. ProtocolVersion pv;
  7700. pv.major = SSLv3_MAJOR;
  7701. pv.minor = SSLv3_MINOR;
  7702. return pv;
  7703. }
  7704. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  7705. #ifdef WOLFSSL_DTLS
  7706. ProtocolVersion MakeDTLSv1(void)
  7707. {
  7708. ProtocolVersion pv;
  7709. pv.major = DTLS_MAJOR;
  7710. pv.minor = DTLS_MINOR;
  7711. return pv;
  7712. }
  7713. #ifndef WOLFSSL_NO_TLS12
  7714. ProtocolVersion MakeDTLSv1_2(void)
  7715. {
  7716. ProtocolVersion pv;
  7717. pv.major = DTLS_MAJOR;
  7718. pv.minor = DTLSv1_2_MINOR;
  7719. return pv;
  7720. }
  7721. #endif /* !WOLFSSL_NO_TLS12 */
  7722. #ifdef WOLFSSL_DTLS13
  7723. ProtocolVersion MakeDTLSv1_3(void)
  7724. {
  7725. ProtocolVersion pv;
  7726. pv.major = DTLS_MAJOR;
  7727. pv.minor = DTLSv1_3_MINOR;
  7728. return pv;
  7729. }
  7730. #endif /* WOLFSSL_DTLS13 */
  7731. #endif /* WOLFSSL_DTLS */
  7732. #ifndef NO_ASN_TIME
  7733. #if defined(USER_TICKS)
  7734. #if 0
  7735. word32 LowResTimer(void)
  7736. {
  7737. /*
  7738. write your own clock tick function if don't want time(0)
  7739. needs second accuracy but doesn't have to correlated to EPOCH
  7740. */
  7741. }
  7742. #endif
  7743. #elif defined(TIME_OVERRIDES)
  7744. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  7745. /* use same asn time overrides unless user wants tick override above */
  7746. word32 LowResTimer(void)
  7747. {
  7748. return (word32) wc_Time(0);
  7749. }
  7750. #else
  7751. #ifndef HAVE_TIME_T_TYPE
  7752. typedef long time_t;
  7753. #endif
  7754. extern time_t XTIME(time_t * timer);
  7755. word32 LowResTimer(void)
  7756. {
  7757. return (word32) XTIME(0);
  7758. }
  7759. #endif
  7760. #elif defined(USE_WINDOWS_API)
  7761. word32 LowResTimer(void)
  7762. {
  7763. static int init = 0;
  7764. static LARGE_INTEGER freq;
  7765. LARGE_INTEGER count;
  7766. if (!init) {
  7767. QueryPerformanceFrequency(&freq);
  7768. init = 1;
  7769. }
  7770. QueryPerformanceCounter(&count);
  7771. return (word32)(count.QuadPart / freq.QuadPart);
  7772. }
  7773. #elif defined(HAVE_RTP_SYS)
  7774. #include "rtptime.h"
  7775. word32 LowResTimer(void)
  7776. {
  7777. return (word32)rtp_get_system_sec();
  7778. }
  7779. #elif defined(WOLFSSL_DEOS)
  7780. word32 LowResTimer(void)
  7781. {
  7782. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  7783. const volatile word32 *systemTickPtr = systemTickPointer();
  7784. return (word32) *systemTickPtr/systemTickTimeInHz;
  7785. }
  7786. #elif defined(MICRIUM)
  7787. word32 LowResTimer(void)
  7788. {
  7789. OS_TICK ticks = 0;
  7790. OS_ERR err;
  7791. ticks = OSTimeGet(&err);
  7792. return (word32) (ticks / OSCfg_TickRate_Hz);
  7793. }
  7794. #elif defined(MICROCHIP_TCPIP_V5)
  7795. word32 LowResTimer(void)
  7796. {
  7797. return (word32) (TickGet() / TICKS_PER_SECOND);
  7798. }
  7799. #elif defined(MICROCHIP_TCPIP)
  7800. #if defined(MICROCHIP_MPLAB_HARMONY)
  7801. #include <system/tmr/sys_tmr.h>
  7802. word32 LowResTimer(void)
  7803. {
  7804. return (word32) (SYS_TMR_TickCountGet() /
  7805. SYS_TMR_TickCounterFrequencyGet());
  7806. }
  7807. #else
  7808. word32 LowResTimer(void)
  7809. {
  7810. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  7811. }
  7812. #endif
  7813. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  7814. word32 LowResTimer(void)
  7815. {
  7816. TIME_STRUCT mqxTime;
  7817. _time_get_elapsed(&mqxTime);
  7818. return (word32) mqxTime.SECONDS;
  7819. }
  7820. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  7821. #include "include/task.h"
  7822. unsigned int LowResTimer(void)
  7823. {
  7824. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  7825. }
  7826. #elif defined(FREERTOS)
  7827. #include "task.h"
  7828. unsigned int LowResTimer(void)
  7829. {
  7830. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  7831. }
  7832. #elif defined(FREESCALE_KSDK_BM)
  7833. #include "lwip/sys.h" /* lwIP */
  7834. word32 LowResTimer(void)
  7835. {
  7836. return sys_now()/1000;
  7837. }
  7838. #elif defined(WOLFSSL_TIRTOS)
  7839. word32 LowResTimer(void)
  7840. {
  7841. return (word32) Seconds_get();
  7842. }
  7843. #elif defined(WOLFSSL_XILINX)
  7844. #include "xrtcpsu.h"
  7845. word32 LowResTimer(void)
  7846. {
  7847. XRtcPsu_Config* con;
  7848. XRtcPsu rtc;
  7849. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  7850. if (con != NULL) {
  7851. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  7852. == XST_SUCCESS) {
  7853. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  7854. }
  7855. else {
  7856. WOLFSSL_MSG("Unable to initialize RTC");
  7857. }
  7858. }
  7859. return 0;
  7860. }
  7861. #elif defined(WOLFSSL_UTASKER)
  7862. word32 LowResTimer(void)
  7863. {
  7864. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  7865. }
  7866. #elif defined(WOLFSSL_NUCLEUS_1_2)
  7867. #define NU_TICKS_PER_SECOND 100
  7868. word32 LowResTimer(void)
  7869. {
  7870. /* returns number of 10ms ticks, so 100 ticks/sec */
  7871. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  7872. }
  7873. #elif defined(WOLFSSL_APACHE_MYNEWT)
  7874. #include "os/os_time.h"
  7875. word32 LowResTimer(void)
  7876. {
  7877. word32 now;
  7878. struct os_timeval tv;
  7879. os_gettimeofday(&tv, NULL);
  7880. now = (word32)tv.tv_sec;
  7881. return now;
  7882. }
  7883. #elif defined(WOLFSSL_ZEPHYR)
  7884. word32 LowResTimer(void)
  7885. {
  7886. return k_uptime_get() / 1000;
  7887. }
  7888. #elif defined(WOLFSSL_LINUXKM)
  7889. word32 LowResTimer(void)
  7890. {
  7891. return (word32)time(NULL);
  7892. }
  7893. #else
  7894. /* Posix style time */
  7895. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  7896. #include <time.h>
  7897. #endif
  7898. word32 LowResTimer(void)
  7899. {
  7900. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  7901. return (word32)wc_Time(0);
  7902. #else
  7903. return (word32)XTIME(0);
  7904. #endif
  7905. }
  7906. #endif
  7907. #else
  7908. /* user must supply timer function to return elapsed seconds:
  7909. * word32 LowResTimer(void);
  7910. */
  7911. #endif /* !NO_ASN_TIME */
  7912. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  7913. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  7914. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  7915. /* Store the message for use with CertificateVerify using EdDSA.
  7916. *
  7917. * ssl SSL/TLS object.
  7918. * data Message to store.
  7919. * sz Size of message to store.
  7920. * returns MEMORY_E if not able to reallocate, otherwise 0.
  7921. */
  7922. static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
  7923. {
  7924. int ret = 0;
  7925. byte* msgs;
  7926. if (ssl->options.cacheMessages) {
  7927. msgs = (byte*)XMALLOC(ssl->hsHashes->length + sz, ssl->heap,
  7928. DYNAMIC_TYPE_HASHES);
  7929. if (msgs == NULL)
  7930. ret = MEMORY_E;
  7931. if ((ret == 0) && (ssl->hsHashes->messages != NULL)) {
  7932. XMEMCPY(msgs, ssl->hsHashes->messages, ssl->hsHashes->length);
  7933. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  7934. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  7935. }
  7936. if (ret == 0) {
  7937. #ifdef WOLFSSL_CHECK_MEM_ZERO
  7938. wc_MemZero_Add("Handshake messages", msgs,
  7939. ssl->hsHashes->length + sz);
  7940. #endif
  7941. ssl->hsHashes->messages = msgs;
  7942. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  7943. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  7944. ssl->hsHashes->length += sz;
  7945. }
  7946. }
  7947. return ret;
  7948. }
  7949. #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  7950. int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
  7951. {
  7952. int ret = 0;
  7953. #ifdef WOLFSSL_DEBUG_TLS
  7954. byte digest[WC_MAX_DIGEST_SIZE];
  7955. WOLFSSL_MSG("HashRaw:");
  7956. WOLFSSL_MSG("Data:");
  7957. WOLFSSL_BUFFER(data, sz);
  7958. WOLFSSL_MSG("Hashes:");
  7959. #endif
  7960. (void)data;
  7961. (void)sz;
  7962. if (ssl->hsHashes == NULL) {
  7963. return BAD_FUNC_ARG;
  7964. }
  7965. #if defined(WOLFSSL_RENESAS_TSIP_TLS) && (WOLFSSL_RENESAS_TSIP_VER >= 115)
  7966. ret = tsip_StoreMessage(ssl, data, sz);
  7967. if (ret != 0 && ret != CRYPTOCB_UNAVAILABLE) {
  7968. return ret;
  7969. }
  7970. #endif /* WOLFSSL_RENESAS_TSIP_TLS && WOLFSSL_RENESAS_TSIP_VER >= 115 */
  7971. #ifndef NO_OLD_TLS
  7972. #ifndef NO_SHA
  7973. wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
  7974. #endif
  7975. #ifndef NO_MD5
  7976. wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
  7977. #endif
  7978. #endif /* NO_OLD_TLS */
  7979. if (IsAtLeastTLSv1_2(ssl)) {
  7980. #ifndef NO_SHA256
  7981. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
  7982. if (ret != 0)
  7983. return ret;
  7984. #ifdef WOLFSSL_DEBUG_TLS
  7985. WOLFSSL_MSG("Sha256");
  7986. wc_Sha256GetHash(&ssl->hsHashes->hashSha256, digest);
  7987. WOLFSSL_BUFFER(digest, WC_SHA224_DIGEST_SIZE);
  7988. #endif
  7989. #endif
  7990. #ifdef WOLFSSL_SHA384
  7991. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
  7992. if (ret != 0)
  7993. return ret;
  7994. #ifdef WOLFSSL_DEBUG_TLS
  7995. WOLFSSL_MSG("Sha384");
  7996. wc_Sha384GetHash(&ssl->hsHashes->hashSha384, digest);
  7997. WOLFSSL_BUFFER(digest, WC_SHA384_DIGEST_SIZE);
  7998. #endif
  7999. #endif
  8000. #ifdef WOLFSSL_SHA512
  8001. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
  8002. if (ret != 0)
  8003. return ret;
  8004. #ifdef WOLFSSL_DEBUG_TLS
  8005. WOLFSSL_MSG("Sha512");
  8006. wc_Sha512GetHash(&ssl->hsHashes->hashSha512, digest);
  8007. WOLFSSL_BUFFER(digest, WC_SHA512_DIGEST_SIZE);
  8008. #endif
  8009. #endif
  8010. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  8011. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  8012. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  8013. ret = EdDSA_Update(ssl, data, sz);
  8014. if (ret != 0)
  8015. return ret;
  8016. #endif
  8017. }
  8018. return ret;
  8019. }
  8020. /* add output to md5 and sha handshake hashes, exclude record header */
  8021. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  8022. {
  8023. const byte* adj;
  8024. if (ssl->hsHashes == NULL)
  8025. return BAD_FUNC_ARG;
  8026. adj = output + RECORD_HEADER_SZ + ivSz;
  8027. sz -= RECORD_HEADER_SZ;
  8028. #ifdef HAVE_FUZZER
  8029. if (ssl->fuzzerCb)
  8030. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  8031. #endif
  8032. #ifdef WOLFSSL_DTLS
  8033. if (ssl->options.dtls) {
  8034. if (IsAtLeastTLSv1_3(ssl->version)) {
  8035. #ifdef WOLFSSL_DTLS13
  8036. word16 dtls_record_extra;
  8037. dtls_record_extra = Dtls13GetRlHeaderLength(ssl, IsEncryptionOn(ssl, 1));
  8038. dtls_record_extra -= RECORD_HEADER_SZ;
  8039. adj += dtls_record_extra;
  8040. sz -= dtls_record_extra;
  8041. #endif /* WOLFSSL_DTLS13 */
  8042. } else {
  8043. adj += DTLS_RECORD_EXTRA;
  8044. sz -= DTLS_RECORD_EXTRA;
  8045. }
  8046. }
  8047. #endif
  8048. return HashRaw(ssl, adj, sz);
  8049. }
  8050. /* add input to md5 and sha handshake hashes, include handshake header */
  8051. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  8052. {
  8053. const byte* adj;
  8054. if (ssl->hsHashes == NULL) {
  8055. return BAD_FUNC_ARG;
  8056. }
  8057. adj = input - HANDSHAKE_HEADER_SZ;
  8058. sz += HANDSHAKE_HEADER_SZ;
  8059. #ifdef WOLFSSL_DTLS
  8060. if (ssl->options.dtls) {
  8061. adj -= DTLS_HANDSHAKE_EXTRA;
  8062. sz += DTLS_HANDSHAKE_EXTRA;
  8063. #ifdef WOLFSSL_DTLS13
  8064. if (IsAtLeastTLSv1_3(ssl->version))
  8065. return Dtls13HashHandshake(ssl, adj, sz);
  8066. #endif /* WOLFSSL_DTLS13 */
  8067. }
  8068. #endif
  8069. return HashRaw(ssl, adj, sz);
  8070. }
  8071. /* add record layer header for message */
  8072. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
  8073. {
  8074. RecordLayerHeader* rl;
  8075. (void)epochOrder;
  8076. /* record layer header */
  8077. rl = (RecordLayerHeader*)output;
  8078. if (rl == NULL) {
  8079. return;
  8080. }
  8081. rl->type = type;
  8082. rl->pvMajor = ssl->version.major; /* type and version same in each */
  8083. #ifdef WOLFSSL_TLS13
  8084. if (IsAtLeastTLSv1_3(ssl->version)) {
  8085. rl->pvMinor = TLSv1_2_MINOR;
  8086. }
  8087. else
  8088. #endif
  8089. rl->pvMinor = ssl->version.minor;
  8090. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  8091. if (ssl->options.side == WOLFSSL_CLIENT_END
  8092. && ssl->options.connectState == CONNECT_BEGIN
  8093. && !ssl->options.resuming) {
  8094. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  8095. : ssl->version.minor;
  8096. }
  8097. #endif
  8098. if (!ssl->options.dtls) {
  8099. c16toa((word16)length, rl->length);
  8100. }
  8101. else {
  8102. #ifdef WOLFSSL_DTLS
  8103. DtlsRecordLayerHeader* dtls;
  8104. /* dtls record layer header extensions */
  8105. dtls = (DtlsRecordLayerHeader*)output;
  8106. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  8107. c16toa((word16)length, dtls->length);
  8108. #endif
  8109. }
  8110. }
  8111. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  8112. !defined(NO_WOLFSSL_SERVER))
  8113. /* add handshake header for message */
  8114. static void AddHandShakeHeader(byte* output, word32 length,
  8115. word32 fragOffset, word32 fragLength,
  8116. byte type, WOLFSSL* ssl)
  8117. {
  8118. HandShakeHeader* hs;
  8119. (void)fragOffset;
  8120. (void)fragLength;
  8121. (void)ssl;
  8122. /* handshake header */
  8123. hs = (HandShakeHeader*)output;
  8124. if (hs == NULL)
  8125. return;
  8126. hs->type = type;
  8127. c32to24(length, hs->length); /* type and length same for each */
  8128. #ifdef WOLFSSL_DTLS
  8129. if (ssl->options.dtls) {
  8130. DtlsHandShakeHeader* dtls;
  8131. /* dtls handshake header extensions */
  8132. dtls = (DtlsHandShakeHeader*)output;
  8133. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  8134. c32to24(fragOffset, dtls->fragment_offset);
  8135. c32to24(fragLength, dtls->fragment_length);
  8136. }
  8137. #endif
  8138. }
  8139. /* add both headers for handshake message */
  8140. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  8141. {
  8142. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  8143. word32 outputAdj = RECORD_HEADER_SZ;
  8144. #ifdef WOLFSSL_DTLS
  8145. if (ssl->options.dtls) {
  8146. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  8147. outputAdj += DTLS_RECORD_EXTRA;
  8148. }
  8149. #endif
  8150. AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
  8151. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  8152. }
  8153. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  8154. #ifndef WOLFSSL_NO_TLS12
  8155. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
  8156. !defined(WOLFSSL_NO_CLIENT_AUTH)) || \
  8157. defined(WOLFSSL_DTLS)
  8158. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  8159. word32 length, byte type, WOLFSSL* ssl)
  8160. {
  8161. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  8162. word32 outputAdj = RECORD_HEADER_SZ;
  8163. (void)fragSz;
  8164. #ifdef WOLFSSL_DTLS
  8165. if (ssl->options.dtls) {
  8166. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  8167. outputAdj += DTLS_RECORD_EXTRA;
  8168. }
  8169. #endif
  8170. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
  8171. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  8172. }
  8173. #endif /* NO_CERTS */
  8174. #if !defined(NO_WOLFSSL_SERVER) || \
  8175. (!defined(NO_WOLFSSL_CLIENT) && !defined(NO_CERTS) && \
  8176. !defined(WOLFSSL_NO_CLIENT_AUTH))
  8177. /**
  8178. * Send the handshake message. This function handles fragmenting the message
  8179. * so that it will fit into the desired MTU or the max fragment size.
  8180. * @param ssl Connection object
  8181. * @param input Input starting at the record layer header. This function
  8182. * assumes that the appropriate record and handshake headers
  8183. * are present. These headers must assume no fragmentation.
  8184. * That is handled here.
  8185. * @param inputSz Length of message excluding headers (this is the total
  8186. * length of all fragments)
  8187. * @param type Type of message being sent
  8188. * @return 0 on success and negative otherwise
  8189. */
  8190. static int SendHandshakeMsg(WOLFSSL* ssl, byte* input, word32 inputSz,
  8191. enum HandShakeType type, const char* packetName)
  8192. {
  8193. int maxFrag;
  8194. int ret = 0;
  8195. int headerSz;
  8196. WOLFSSL_ENTER("SendHandshakeMsg");
  8197. (void)type;
  8198. (void)packetName;
  8199. if (ssl == NULL || input == NULL)
  8200. return BAD_FUNC_ARG;
  8201. #ifdef WOLFSSL_DTLS
  8202. if (ssl->options.dtls)
  8203. headerSz = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  8204. else
  8205. #endif
  8206. {
  8207. /* In TLS we send one handshake header in total, not one
  8208. * per fragment like in DTLS. The handshake header should
  8209. * already be in the input buffer. */
  8210. inputSz += HANDSHAKE_HEADER_SZ;
  8211. headerSz = RECORD_HEADER_SZ;
  8212. }
  8213. maxFrag = wolfSSL_GetMaxFragSize(ssl, (int)inputSz);
  8214. /* Make sure input is not the ssl output buffer as this
  8215. * function doesn't handle that */
  8216. if (input >= ssl->buffers.outputBuffer.buffer &&
  8217. input < ssl->buffers.outputBuffer.buffer +
  8218. ssl->buffers.outputBuffer.bufferSize) {
  8219. WOLFSSL_MSG("Can't use output buffer for input in SendHandshakeMsg");
  8220. return BAD_FUNC_ARG;
  8221. }
  8222. if (!ssl->options.buildingMsg) {
  8223. /* Hash it before the loop as we modify the input with
  8224. * encryption on */
  8225. ret = HashOutput(ssl, input, headerSz + (int)inputSz, 0);
  8226. if (ret != 0)
  8227. return ret;
  8228. #ifdef WOLFSSL_DTLS
  8229. /* Decrement msg number so that we continue to use the
  8230. * same msg number for this msg */
  8231. if (ssl->options.dtls)
  8232. ssl->keys.dtls_handshake_number--;
  8233. #endif
  8234. }
  8235. while (ssl->fragOffset < inputSz) {
  8236. byte* output;
  8237. int outputSz;
  8238. byte* data = input + ssl->fragOffset + headerSz;
  8239. word32 fragSz = (word32)maxFrag;
  8240. ssl->options.buildingMsg = 1;
  8241. if (inputSz - ssl->fragOffset < fragSz)
  8242. fragSz = inputSz - ssl->fragOffset;
  8243. /* check for available size */
  8244. outputSz = headerSz + fragSz;
  8245. if (IsEncryptionOn(ssl, 1))
  8246. outputSz += cipherExtraData(ssl);
  8247. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  8248. return ret;
  8249. if (ssl->buffers.outputBuffer.buffer == NULL)
  8250. return MEMORY_E;
  8251. output = ssl->buffers.outputBuffer.buffer +
  8252. ssl->buffers.outputBuffer.length;
  8253. if (IsEncryptionOn(ssl, 1)) {
  8254. /* First we need to add the fragment header ourselves.
  8255. * We do this in the input to minimize allocations */
  8256. int dataSz = (int)fragSz;
  8257. #ifdef WOLFSSL_DTLS
  8258. if (ssl->options.dtls) {
  8259. data -= DTLS_HANDSHAKE_HEADER_SZ;
  8260. dataSz += DTLS_HANDSHAKE_HEADER_SZ;
  8261. AddHandShakeHeader(data,
  8262. inputSz, ssl->fragOffset, fragSz, type, ssl);
  8263. ssl->keys.dtls_handshake_number--;
  8264. }
  8265. if (IsDtlsNotSctpMode(ssl) &&
  8266. (ret = DtlsMsgPoolSave(ssl, data,
  8267. fragSz + DTLS_HANDSHAKE_HEADER_SZ, type))
  8268. != 0)
  8269. return ret;
  8270. #endif
  8271. ret = BuildMessage(ssl, output, outputSz,
  8272. data, dataSz, handshake, 0, 0, 0, CUR_ORDER);
  8273. if (ret >= 0)
  8274. outputSz = ret;
  8275. else
  8276. return ret;
  8277. ret = 0;
  8278. }
  8279. else {
  8280. #ifdef WOLFSSL_DTLS
  8281. if (ssl->options.dtls)
  8282. AddFragHeaders(output, fragSz, ssl->fragOffset,
  8283. inputSz, type, ssl);
  8284. else
  8285. #endif
  8286. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  8287. XMEMCPY(output + headerSz, data, fragSz);
  8288. #ifdef WOLFSSL_DTLS
  8289. if (ssl->options.dtls) {
  8290. ssl->keys.dtls_handshake_number--;
  8291. DtlsSEQIncrement(ssl, CUR_ORDER);
  8292. }
  8293. if (IsDtlsNotSctpMode(ssl)) {
  8294. if ((ret = DtlsMsgPoolSave(ssl, output, headerSz + fragSz,
  8295. type)) != 0) {
  8296. return ret;
  8297. }
  8298. }
  8299. #endif
  8300. }
  8301. ssl->buffers.outputBuffer.length += outputSz;
  8302. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  8303. if (ssl->hsInfoOn) {
  8304. AddPacketName(ssl, packetName);
  8305. }
  8306. if (ssl->toInfoOn) {
  8307. AddPacketInfo(ssl, packetName, handshake,
  8308. output, outputSz, WRITE_PROTO, ssl->heap);
  8309. }
  8310. #endif
  8311. ssl->fragOffset += fragSz;
  8312. if (!ssl->options.groupMessages)
  8313. ret = SendBuffered(ssl);
  8314. if (ret != 0)
  8315. return ret;
  8316. }
  8317. #ifdef WOLFSSL_DTLS
  8318. /* Increment msg number once we sent all fragments */
  8319. if (ssl->options.dtls)
  8320. ssl->keys.dtls_handshake_number++;
  8321. #endif
  8322. ssl->fragOffset = 0;
  8323. ssl->options.buildingMsg = 0;
  8324. return ret;
  8325. }
  8326. #endif /* !NO_WOLFSSL_SERVER || (!NO_WOLFSSL_CLIENT && !NO_CERTS &&
  8327. * !WOLFSSL_NO_CLIENT_AUTH) */
  8328. #endif /* !WOLFSSL_NO_TLS12 */
  8329. /* return bytes received, -1 on error */
  8330. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  8331. {
  8332. int recvd;
  8333. int retryLimit = WOLFSSL_MODE_AUTO_RETRY_ATTEMPTS;
  8334. #ifdef WOLFSSL_QUIC
  8335. if (WOLFSSL_IS_QUIC(ssl)) {
  8336. /* QUIC only "reads" from data provided by the application
  8337. * via wolfSSL_provide_quic_data(). Transfer from there
  8338. * into the inputBuffer. */
  8339. return wolfSSL_quic_receive(ssl, buf, sz);
  8340. }
  8341. #endif
  8342. if (ssl->CBIORecv == NULL) {
  8343. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  8344. return -1;
  8345. }
  8346. retry:
  8347. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  8348. if (recvd < 0) {
  8349. switch (recvd) {
  8350. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  8351. #ifdef WOLFSSL_APACHE_HTTPD
  8352. #ifndef NO_BIO
  8353. if (ssl->biord) {
  8354. /* If retry and read flags are set, return WANT_READ */
  8355. if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
  8356. (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
  8357. return WANT_READ;
  8358. }
  8359. }
  8360. #endif
  8361. #endif
  8362. return -1;
  8363. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  8364. if (retryLimit > 0 && ssl->ctx->autoRetry &&
  8365. !ssl->options.handShakeDone && !ssl->options.dtls) {
  8366. retryLimit--;
  8367. goto retry;
  8368. }
  8369. return WANT_READ;
  8370. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  8371. #ifdef USE_WINDOWS_API
  8372. if (ssl->options.dtls) {
  8373. goto retry;
  8374. }
  8375. #endif
  8376. ssl->options.connReset = 1;
  8377. return -1;
  8378. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  8379. /* see if we got our timeout */
  8380. #ifdef WOLFSSL_CALLBACKS
  8381. if (ssl->toInfoOn) {
  8382. struct itimerval timeout;
  8383. getitimer(ITIMER_REAL, &timeout);
  8384. if (timeout.it_value.tv_sec == 0 &&
  8385. timeout.it_value.tv_usec == 0) {
  8386. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  8387. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  8388. ssl->timeoutInfo.timeoutName[
  8389. MAX_TIMEOUT_NAME_SZ] = '\0';
  8390. WOLFSSL_MSG("Got our timeout");
  8391. return WANT_READ;
  8392. }
  8393. }
  8394. #endif
  8395. goto retry;
  8396. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  8397. ssl->options.isClosed = 1;
  8398. return -1;
  8399. case WOLFSSL_CBIO_ERR_TIMEOUT:
  8400. #ifdef WOLFSSL_DTLS
  8401. #ifdef WOLFSSL_DTLS13
  8402. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  8403. /* TODO: support WANT_WRITE here */
  8404. if (Dtls13RtxTimeout(ssl) < 0) {
  8405. WOLFSSL_MSG(
  8406. "Error trying to retransmit DTLS buffered message");
  8407. return -1;
  8408. }
  8409. goto retry;
  8410. }
  8411. #endif /* WOLFSSL_DTLS13 */
  8412. if (IsDtlsNotSctpMode(ssl) &&
  8413. ssl->options.handShakeState != HANDSHAKE_DONE &&
  8414. DtlsMsgPoolTimeout(ssl) == 0 &&
  8415. DtlsMsgPoolSend(ssl, 0) == 0) {
  8416. /* retry read for DTLS during handshake only */
  8417. goto retry;
  8418. }
  8419. #endif
  8420. return -1;
  8421. default:
  8422. WOLFSSL_MSG("Unexpected recv return code");
  8423. return recvd;
  8424. }
  8425. }
  8426. return recvd;
  8427. }
  8428. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  8429. void ShrinkOutputBuffer(WOLFSSL* ssl)
  8430. {
  8431. WOLFSSL_MSG("Shrinking output buffer");
  8432. if (IsEncryptionOn(ssl, 0)) {
  8433. ForceZero(ssl->buffers.outputBuffer.buffer -
  8434. ssl->buffers.outputBuffer.offset,
  8435. ssl->buffers.outputBuffer.bufferSize);
  8436. }
  8437. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  8438. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  8439. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  8440. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  8441. ssl->buffers.outputBuffer.dynamicFlag = 0;
  8442. ssl->buffers.outputBuffer.offset = 0;
  8443. }
  8444. /* Switch dynamic input buffer back to static, keep any remaining input */
  8445. /* forced free means cleaning up */
  8446. /* Be *CAREFUL* where this function is called. ProcessReply relies on
  8447. * inputBuffer.idx *NOT* changing inside the ProcessReply function. ProcessReply
  8448. * calls ShrinkInputBuffer itself when it is safe to do so. Don't overuse it. */
  8449. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  8450. {
  8451. int usedLength = ssl->buffers.inputBuffer.length -
  8452. ssl->buffers.inputBuffer.idx;
  8453. if (!forcedFree && (usedLength > STATIC_BUFFER_LEN ||
  8454. ssl->buffers.clearOutputBuffer.length > 0))
  8455. return;
  8456. WOLFSSL_MSG("Shrinking input buffer");
  8457. if (!forcedFree && usedLength > 0) {
  8458. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  8459. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  8460. usedLength);
  8461. }
  8462. if (IsEncryptionOn(ssl, 1) || forcedFree) {
  8463. ForceZero(ssl->buffers.inputBuffer.buffer -
  8464. ssl->buffers.inputBuffer.offset,
  8465. ssl->buffers.inputBuffer.bufferSize);
  8466. }
  8467. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  8468. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  8469. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  8470. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  8471. ssl->buffers.inputBuffer.dynamicFlag = 0;
  8472. ssl->buffers.inputBuffer.offset = 0;
  8473. ssl->buffers.inputBuffer.idx = 0;
  8474. ssl->buffers.inputBuffer.length = usedLength;
  8475. }
  8476. int SendBuffered(WOLFSSL* ssl)
  8477. {
  8478. if (ssl->CBIOSend == NULL && !WOLFSSL_IS_QUIC(ssl)) {
  8479. WOLFSSL_MSG("Your IO Send callback is null, please set");
  8480. return SOCKET_ERROR_E;
  8481. }
  8482. #ifdef WOLFSSL_DEBUG_TLS
  8483. if (ssl->buffers.outputBuffer.idx == 0) {
  8484. WOLFSSL_MSG("Data to send");
  8485. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  8486. ssl->buffers.outputBuffer.length);
  8487. }
  8488. #endif
  8489. #ifdef WOLFSSL_QUIC
  8490. if (WOLFSSL_IS_QUIC(ssl)) {
  8491. return wolfSSL_quic_send(ssl);
  8492. }
  8493. #endif
  8494. while (ssl->buffers.outputBuffer.length > 0) {
  8495. int sent = ssl->CBIOSend(ssl,
  8496. (char*)ssl->buffers.outputBuffer.buffer +
  8497. ssl->buffers.outputBuffer.idx,
  8498. (int)ssl->buffers.outputBuffer.length,
  8499. ssl->IOCB_WriteCtx);
  8500. if (sent < 0) {
  8501. switch (sent) {
  8502. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  8503. return WANT_WRITE;
  8504. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  8505. ssl->options.connReset = 1;
  8506. break;
  8507. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  8508. /* see if we got our timeout */
  8509. #ifdef WOLFSSL_CALLBACKS
  8510. if (ssl->toInfoOn) {
  8511. struct itimerval timeout;
  8512. getitimer(ITIMER_REAL, &timeout);
  8513. if (timeout.it_value.tv_sec == 0 &&
  8514. timeout.it_value.tv_usec == 0) {
  8515. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  8516. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  8517. ssl->timeoutInfo.timeoutName[
  8518. MAX_TIMEOUT_NAME_SZ] = '\0';
  8519. WOLFSSL_MSG("Got our timeout");
  8520. return WANT_WRITE;
  8521. }
  8522. }
  8523. #endif
  8524. continue;
  8525. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  8526. ssl->options.connReset = 1; /* treat same as reset */
  8527. break;
  8528. default:
  8529. return SOCKET_ERROR_E;
  8530. }
  8531. return SOCKET_ERROR_E;
  8532. }
  8533. if (sent > (int)ssl->buffers.outputBuffer.length) {
  8534. WOLFSSL_MSG("SendBuffered() out of bounds read");
  8535. return SEND_OOB_READ_E;
  8536. }
  8537. ssl->buffers.outputBuffer.idx += sent;
  8538. ssl->buffers.outputBuffer.length -= sent;
  8539. }
  8540. ssl->buffers.outputBuffer.idx = 0;
  8541. if (ssl->buffers.outputBuffer.dynamicFlag)
  8542. ShrinkOutputBuffer(ssl);
  8543. return 0;
  8544. }
  8545. /* Grow the output buffer */
  8546. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  8547. {
  8548. byte* tmp;
  8549. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8550. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  8551. RECORD_HEADER_SZ;
  8552. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8553. #else
  8554. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8555. #endif
  8556. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8557. /* the encrypted data will be offset from the front of the buffer by
  8558. the header, if the user wants encrypted alignment they need
  8559. to define their alignment requirement */
  8560. while (align < hdrSz)
  8561. align *= 2;
  8562. #endif
  8563. tmp = (byte*)XMALLOC(size + ssl->buffers.outputBuffer.length + align,
  8564. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  8565. WOLFSSL_MSG("growing output buffer");
  8566. if (tmp == NULL)
  8567. return MEMORY_E;
  8568. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8569. if (align)
  8570. tmp += align - hdrSz;
  8571. #endif
  8572. #ifdef WOLFSSL_STATIC_MEMORY
  8573. /* can be from IO memory pool which does not need copy if same buffer */
  8574. if (ssl->buffers.outputBuffer.length &&
  8575. tmp == ssl->buffers.outputBuffer.buffer) {
  8576. ssl->buffers.outputBuffer.bufferSize =
  8577. size + ssl->buffers.outputBuffer.length;
  8578. return 0;
  8579. }
  8580. #endif
  8581. if (ssl->buffers.outputBuffer.length)
  8582. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  8583. ssl->buffers.outputBuffer.length);
  8584. if (ssl->buffers.outputBuffer.dynamicFlag) {
  8585. if (IsEncryptionOn(ssl, 0)) {
  8586. ForceZero(ssl->buffers.outputBuffer.buffer -
  8587. ssl->buffers.outputBuffer.offset,
  8588. ssl->buffers.outputBuffer.bufferSize);
  8589. }
  8590. XFREE(ssl->buffers.outputBuffer.buffer -
  8591. ssl->buffers.outputBuffer.offset, ssl->heap,
  8592. DYNAMIC_TYPE_OUT_BUFFER);
  8593. }
  8594. ssl->buffers.outputBuffer.dynamicFlag = 1;
  8595. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8596. if (align)
  8597. ssl->buffers.outputBuffer.offset = align - hdrSz;
  8598. else
  8599. #endif
  8600. ssl->buffers.outputBuffer.offset = 0;
  8601. ssl->buffers.outputBuffer.buffer = tmp;
  8602. ssl->buffers.outputBuffer.bufferSize = size +
  8603. ssl->buffers.outputBuffer.length;
  8604. return 0;
  8605. }
  8606. /* Grow the input buffer, should only be to read cert or big app data */
  8607. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  8608. {
  8609. byte* tmp;
  8610. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8611. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  8612. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  8613. #else
  8614. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8615. #endif
  8616. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8617. /* the encrypted data will be offset from the front of the buffer by
  8618. the dtls record header, if the user wants encrypted alignment they need
  8619. to define their alignment requirement. in tls we read record header
  8620. to get size of record and put actual data back at front, so don't need */
  8621. if (align) {
  8622. while (align < hdrSz)
  8623. align *= 2;
  8624. }
  8625. #endif
  8626. if (usedLength < 0 || size < 0) {
  8627. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  8628. return BAD_FUNC_ARG;
  8629. }
  8630. tmp = (byte*)XMALLOC(size + usedLength + align,
  8631. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  8632. WOLFSSL_MSG("growing input buffer");
  8633. if (tmp == NULL)
  8634. return MEMORY_E;
  8635. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8636. if (align)
  8637. tmp += align - hdrSz;
  8638. #endif
  8639. #ifdef WOLFSSL_STATIC_MEMORY
  8640. /* can be from IO memory pool which does not need copy if same buffer */
  8641. if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
  8642. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  8643. ssl->buffers.inputBuffer.idx = 0;
  8644. ssl->buffers.inputBuffer.length = usedLength;
  8645. return 0;
  8646. }
  8647. #endif
  8648. if (usedLength)
  8649. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  8650. ssl->buffers.inputBuffer.idx, usedLength);
  8651. if (ssl->buffers.inputBuffer.dynamicFlag) {
  8652. if (IsEncryptionOn(ssl, 1)) {
  8653. ForceZero(ssl->buffers.inputBuffer.buffer -
  8654. ssl->buffers.inputBuffer.offset,
  8655. ssl->buffers.inputBuffer.bufferSize);
  8656. }
  8657. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  8658. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  8659. }
  8660. ssl->buffers.inputBuffer.dynamicFlag = 1;
  8661. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8662. if (align)
  8663. ssl->buffers.inputBuffer.offset = align - hdrSz;
  8664. else
  8665. #endif
  8666. ssl->buffers.inputBuffer.offset = 0;
  8667. ssl->buffers.inputBuffer.buffer = tmp;
  8668. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  8669. ssl->buffers.inputBuffer.idx = 0;
  8670. ssl->buffers.inputBuffer.length = usedLength;
  8671. return 0;
  8672. }
  8673. /* Check available size into output buffer, make room if needed.
  8674. * This function needs to be called before anything gets put
  8675. * into the output buffers since it flushes pending data if it
  8676. * predicts that the msg will exceed MTU. */
  8677. int CheckAvailableSize(WOLFSSL *ssl, int size)
  8678. {
  8679. if (size < 0) {
  8680. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  8681. return BAD_FUNC_ARG;
  8682. }
  8683. #ifdef WOLFSSL_DTLS
  8684. if (ssl->options.dtls) {
  8685. if (size + ssl->buffers.outputBuffer.length -
  8686. ssl->buffers.outputBuffer.idx >
  8687. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  8688. ssl->dtlsMtuSz
  8689. #else
  8690. ssl->dtls_expected_rx
  8691. #endif
  8692. ) {
  8693. int ret;
  8694. WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
  8695. "to make room for new message");
  8696. if ((ret = SendBuffered(ssl)) != 0) {
  8697. return ret;
  8698. }
  8699. }
  8700. if (size > (int)
  8701. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  8702. ssl->dtlsMtuSz
  8703. #else
  8704. ssl->dtls_expected_rx
  8705. #endif
  8706. #ifdef WOLFSSL_DTLS13
  8707. /* DTLS1.3 uses the output buffer to store the full message and deal
  8708. with fragmentation later in dtls13HandshakeSend() */
  8709. && !IsAtLeastTLSv1_3(ssl->version)
  8710. #endif /* WOLFSSL_DTLS13 */
  8711. ) {
  8712. WOLFSSL_MSG("CheckAvailableSize() called with size greater than MTU.");
  8713. return DTLS_SIZE_ERROR;
  8714. }
  8715. }
  8716. #endif
  8717. if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
  8718. < (word32)size) {
  8719. if (GrowOutputBuffer(ssl, size) < 0)
  8720. return MEMORY_E;
  8721. }
  8722. return 0;
  8723. }
  8724. #ifdef WOLFSSL_DTLS13
  8725. static int GetInputData(WOLFSSL *ssl, word32 size);
  8726. static int GetDtls13RecordHeader(WOLFSSL* ssl, const byte* input,
  8727. word32* inOutIdx, RecordLayerHeader* rh, word16* size)
  8728. {
  8729. Dtls13UnifiedHdrInfo hdrInfo;
  8730. w64wrapper epochNumber;
  8731. byte epochBits;
  8732. int readSize;
  8733. int ret;
  8734. readSize = ssl->buffers.inputBuffer.length - *inOutIdx;
  8735. if (readSize < DTLS_UNIFIED_HEADER_MIN_SZ)
  8736. return BUFFER_ERROR;
  8737. epochBits = *(input + *inOutIdx) & EE_MASK;
  8738. ret = Dtls13ReconstructEpochNumber(ssl, epochBits, &epochNumber);
  8739. if (ret != 0)
  8740. return ret;
  8741. #ifdef WOLFSSL_DEBUG_TLS
  8742. WOLFSSL_MSG_EX("reconstructed epoch number: %ld",
  8743. epochNumber);
  8744. #endif /* WOLFSSL_DEBUG_TLS */
  8745. /* protected records always use unified_headers in DTLSv1.3 */
  8746. if (w64IsZero(epochNumber))
  8747. return SEQUENCE_ERROR;
  8748. if (ssl->dtls13DecryptEpoch == NULL)
  8749. return BAD_STATE_E;
  8750. #ifdef WOLFSSL_EARLY_DATA
  8751. if (w64Equal(epochNumber, w64From32(0x0, DTLS13_EPOCH_EARLYDATA)) &&
  8752. ssl->options.handShakeDone) {
  8753. WOLFSSL_MSG("discarding early data after handshake");
  8754. return SEQUENCE_ERROR;
  8755. }
  8756. #endif /* WOLFSSL_DTLS13 */
  8757. if (!w64Equal(ssl->dtls13DecryptEpoch->epochNumber, epochNumber)) {
  8758. ret = Dtls13SetEpochKeys(ssl, epochNumber, DECRYPT_SIDE_ONLY);
  8759. if (ret != 0)
  8760. return SEQUENCE_ERROR;
  8761. }
  8762. ret = Dtls13GetUnifiedHeaderSize(ssl,
  8763. *(input+*inOutIdx), &ssl->dtls13CurRlLength);
  8764. if (ret != 0)
  8765. return ret;
  8766. if (readSize < ssl->dtls13CurRlLength) {
  8767. /* when using DTLS over a medium that does not guarantee that a full
  8768. * message is received in a single read, we may end up without the full
  8769. * header */
  8770. ret = GetInputData(ssl, ssl->dtls13CurRlLength - readSize);
  8771. if (ret != 0)
  8772. return ret;
  8773. }
  8774. ret = Dtls13ParseUnifiedRecordLayer(ssl, input + *inOutIdx, readSize,
  8775. &hdrInfo);
  8776. if (ret != 0)
  8777. return ret;
  8778. *size = hdrInfo.recordLength;
  8779. c16toa(*size, rh->length);
  8780. /* type is implicit */
  8781. rh->type = application_data;
  8782. /* version is implicit */
  8783. rh->pvMajor = ssl->version.major;
  8784. rh->pvMinor = DTLSv1_2_MINOR;
  8785. ssl->keys.curEpoch64 = epochNumber;
  8786. ret = Dtls13ReconstructSeqNumber(ssl, &hdrInfo, &ssl->keys.curSeq);
  8787. if (ret != 0)
  8788. return ret;
  8789. #ifdef WOLFSSL_DEBUG_TLS
  8790. WOLFSSL_MSG_EX("reconstructed seq number: %ld",
  8791. ssl->keys.curSeq);
  8792. #endif /* WOLFSSL_DEBUG_TLS */
  8793. XMEMCPY(ssl->dtls13CurRL, input + *inOutIdx, ssl->dtls13CurRlLength);
  8794. *inOutIdx += ssl->dtls13CurRlLength;
  8795. return 0;
  8796. }
  8797. #endif /* WOLFSSL_DTLS13 */
  8798. #ifdef WOLFSSL_DTLS
  8799. static int GetDtlsRecordHeader(WOLFSSL* ssl, const byte* input,
  8800. word32* inOutIdx, RecordLayerHeader* rh, word16* size)
  8801. {
  8802. #ifdef HAVE_FUZZER
  8803. if (ssl->fuzzerCb)
  8804. ssl->fuzzerCb(ssl, input + *inOutIdx, DTLS_RECORD_HEADER_SZ,
  8805. FUZZ_HEAD, ssl->fuzzerCtx);
  8806. #endif
  8807. #ifdef WOLFSSL_DTLS13
  8808. word32 read_size;
  8809. int ret;
  8810. read_size = ssl->buffers.inputBuffer.length - *inOutIdx;
  8811. if (Dtls13IsUnifiedHeader(*(input + *inOutIdx))) {
  8812. /* version 1.3 already negotiated */
  8813. if (ssl->options.tls1_3) {
  8814. ret = GetDtls13RecordHeader(ssl, input, inOutIdx, rh, size);
  8815. if (ret == 0 || ret != SEQUENCE_ERROR || ret != DTLS_CID_ERROR)
  8816. return ret;
  8817. }
  8818. #ifndef NO_WOLFSSL_CLIENT
  8819. if (ssl->options.side == WOLFSSL_CLIENT_END
  8820. && ssl->options.serverState < SERVER_HELLO_COMPLETE
  8821. && IsAtLeastTLSv1_3(ssl->version)
  8822. && !ssl->options.handShakeDone) {
  8823. /* we may have lost ServerHello. Try to send a empty ACK to shortcut
  8824. Server retransmission timer */
  8825. ssl->dtls13Rtx.sendAcks = 1;
  8826. }
  8827. #endif
  8828. return SEQUENCE_ERROR;
  8829. }
  8830. /* not a unified header, check that we have at least
  8831. * DTLS_RECORD_HEADER_SZ */
  8832. if (read_size < DTLS_RECORD_HEADER_SZ) {
  8833. ret = GetInputData(ssl, DTLS_RECORD_HEADER_SZ - read_size);
  8834. if (ret != 0)
  8835. return LENGTH_ERROR;
  8836. }
  8837. #endif /* WOLFSSL_DTLS13 */
  8838. /* type and version in same spot */
  8839. XMEMCPY(rh, input + *inOutIdx, ENUM_LEN + VERSION_SZ);
  8840. *inOutIdx += ENUM_LEN + VERSION_SZ;
  8841. ato16(input + *inOutIdx, &ssl->keys.curEpoch);
  8842. #ifdef WOLFSSL_DTLS13
  8843. /* only non protected message can use the DTLSPlaintext record header */
  8844. if (ssl->options.tls1_3 && ssl->keys.curEpoch != 0)
  8845. return SEQUENCE_ERROR;
  8846. w64Zero(&ssl->keys.curEpoch64);
  8847. if (!w64IsZero(ssl->dtls13DecryptEpoch->epochNumber))
  8848. Dtls13SetEpochKeys(ssl, ssl->keys.curEpoch64, DECRYPT_SIDE_ONLY);
  8849. #endif /* WOLFSSL_DTLS13 */
  8850. *inOutIdx += OPAQUE16_LEN;
  8851. if (ssl->options.haveMcast) {
  8852. #ifdef WOLFSSL_MULTICAST
  8853. ssl->keys.curPeerId = input[*inOutIdx];
  8854. ssl->keys.curSeq_hi = input[*inOutIdx+1];
  8855. #endif
  8856. }
  8857. else
  8858. ato16(input + *inOutIdx, &ssl->keys.curSeq_hi);
  8859. *inOutIdx += OPAQUE16_LEN;
  8860. ato32(input + *inOutIdx, &ssl->keys.curSeq_lo);
  8861. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  8862. #ifdef WOLFSSL_DTLS13
  8863. /* DTLSv1.3 PlainText records use DTLSv1.2 sequence number encoding. Update
  8864. the DTLv1.3 word64 version as well */
  8865. ssl->keys.curSeq = w64From32(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo);
  8866. #endif /* WOLFSSL_DTLS13 */
  8867. ato16(input + *inOutIdx, size);
  8868. *inOutIdx += LENGTH_SZ;
  8869. return 0;
  8870. }
  8871. #endif /* WOLFSSL_DTLS */
  8872. /* do all verify and sanity checks on record header */
  8873. static int GetRecordHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  8874. RecordLayerHeader* rh, word16 *size)
  8875. {
  8876. byte tls12minor;
  8877. #ifdef WOLFSSL_DTLS
  8878. int ret;
  8879. #endif /* WOLFSSL_DTLS */
  8880. #ifdef OPENSSL_ALL
  8881. word32 start = *inOutIdx;
  8882. #endif
  8883. (void)tls12minor;
  8884. if (!ssl->options.dtls) {
  8885. #ifdef HAVE_FUZZER
  8886. if (ssl->fuzzerCb)
  8887. ssl->fuzzerCb(ssl, input + *inOutIdx, RECORD_HEADER_SZ, FUZZ_HEAD,
  8888. ssl->fuzzerCtx);
  8889. #endif
  8890. XMEMCPY(rh, input + *inOutIdx, RECORD_HEADER_SZ);
  8891. *inOutIdx += RECORD_HEADER_SZ;
  8892. ato16(rh->length, size);
  8893. }
  8894. else {
  8895. #ifdef WOLFSSL_DTLS
  8896. ret = GetDtlsRecordHeader(ssl, input, inOutIdx, rh, size);
  8897. if (ret != 0)
  8898. return ret;
  8899. #endif
  8900. }
  8901. #ifdef WOLFSSL_DTLS
  8902. /* DTLSv1.3 MUST check window after deprotecting to avoid timing channel
  8903. (RFC9147 Section 4.5.1) */
  8904. if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) {
  8905. if (!_DtlsCheckWindow(ssl) ||
  8906. (rh->type == application_data && ssl->keys.curEpoch == 0) ||
  8907. (rh->type == alert && ssl->options.handShakeDone &&
  8908. ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
  8909. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  8910. return SEQUENCE_ERROR;
  8911. }
  8912. }
  8913. #endif
  8914. tls12minor = TLSv1_2_MINOR;
  8915. #ifdef WOLFSSL_DTLS13
  8916. if (ssl->options.dtls)
  8917. tls12minor = DTLSv1_2_MINOR;
  8918. #endif /* WOLFSSL_DTLS13 */
  8919. /* catch version mismatch */
  8920. #ifndef WOLFSSL_TLS13
  8921. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  8922. #else
  8923. if (rh->pvMajor != ssl->version.major ||
  8924. (rh->pvMinor != ssl->version.minor &&
  8925. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != tls12minor)
  8926. ))
  8927. #endif
  8928. {
  8929. if (ssl->options.side == WOLFSSL_SERVER_END &&
  8930. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  8931. WOLFSSL_MSG("Client attempting to connect with different version");
  8932. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  8933. ssl->options.downgrade &&
  8934. ssl->options.connectState < FIRST_REPLY_DONE)
  8935. WOLFSSL_MSG("Server attempting to accept with different version");
  8936. else if (ssl->options.dtls && rh->type == handshake)
  8937. /* Check the DTLS handshake message RH version later. */
  8938. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  8939. #ifdef WOLFSSL_DTLS13
  8940. else if (ssl->options.dtls && !ssl->options.handShakeDone) {
  8941. /* we may have lost the ServerHello and this is a unified record
  8942. before version been negotiated */
  8943. if (Dtls13IsUnifiedHeader(*input)) {
  8944. return SEQUENCE_ERROR;
  8945. }
  8946. }
  8947. #endif /* WOLFSSL_DTLS13 */
  8948. else {
  8949. WOLFSSL_MSG("SSL version error");
  8950. /* send alert per RFC5246 Appendix E. Backward Compatibility */
  8951. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  8952. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  8953. SendAlert(ssl, alert_fatal, wc_protocol_version);
  8954. #else
  8955. SendAlert(ssl, alert_fatal, protocol_version);
  8956. #endif
  8957. }
  8958. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  8959. return VERSION_ERROR; /* only use requested version */
  8960. }
  8961. }
  8962. /* record layer length check */
  8963. #ifdef HAVE_MAX_FRAGMENT
  8964. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  8965. SendAlert(ssl, alert_fatal, record_overflow);
  8966. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  8967. return LENGTH_ERROR;
  8968. }
  8969. #else
  8970. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  8971. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  8972. return LENGTH_ERROR;
  8973. }
  8974. #endif
  8975. if (*size == 0 && rh->type != application_data) {
  8976. WOLFSSL_MSG("0 length, non-app data record.");
  8977. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  8978. return LENGTH_ERROR;
  8979. }
  8980. /* verify record type here as well */
  8981. switch (rh->type) {
  8982. case handshake:
  8983. case change_cipher_spec:
  8984. case application_data:
  8985. case alert:
  8986. #ifdef WOLFSSL_DTLS13
  8987. case ack:
  8988. #endif /* WOLFSSL_DTLS13 */
  8989. break;
  8990. case no_type:
  8991. default:
  8992. #ifdef OPENSSL_ALL
  8993. {
  8994. char *method = (char*)input + start;
  8995. /* Attempt to identify if this is a plain HTTP request.
  8996. * No size checks because this function assumes at least
  8997. * RECORD_HEADER_SZ size of data has been read which is
  8998. * also the longest string comparison in this if. */
  8999. if (XSTRNCMP(method, "GET ", XSTR_SIZEOF("GET ")) == 0 ||
  9000. XSTRNCMP(method, "POST ", XSTR_SIZEOF("POST ")) == 0 ||
  9001. XSTRNCMP(method, "HEAD ", XSTR_SIZEOF("HEAD ")) == 0 ||
  9002. XSTRNCMP(method, "PUT ", XSTR_SIZEOF("PUT ")) == 0) {
  9003. WOLFSSL_MSG("Plain HTTP request detected");
  9004. return SSL_R_HTTP_REQUEST;
  9005. }
  9006. }
  9007. #endif
  9008. WOLFSSL_MSG("Unknown Record Type");
  9009. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  9010. return UNKNOWN_RECORD_TYPE;
  9011. }
  9012. /* haven't decrypted this record yet */
  9013. ssl->keys.decryptedCur = 0;
  9014. return 0;
  9015. }
  9016. #ifndef WOLFSSL_NO_TLS12
  9017. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  9018. byte *type, word32 *size, word32 totalSz)
  9019. {
  9020. const byte *ptr = input + *inOutIdx;
  9021. (void)ssl;
  9022. *inOutIdx += HANDSHAKE_HEADER_SZ;
  9023. if (*inOutIdx > totalSz)
  9024. return BUFFER_E;
  9025. *type = ptr[0];
  9026. c24to32(&ptr[1], size);
  9027. return 0;
  9028. }
  9029. #endif
  9030. #ifdef WOLFSSL_DTLS
  9031. int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  9032. word32* inOutIdx, byte *type, word32 *size,
  9033. word32 *fragOffset, word32 *fragSz,
  9034. word32 totalSz)
  9035. {
  9036. word32 idx = *inOutIdx;
  9037. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  9038. if (*inOutIdx > totalSz) {
  9039. WOLFSSL_ERROR(BUFFER_E);
  9040. return BUFFER_E;
  9041. }
  9042. *type = input[idx++];
  9043. c24to32(input + idx, size);
  9044. idx += OPAQUE24_LEN;
  9045. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  9046. idx += DTLS_HANDSHAKE_SEQ_SZ;
  9047. c24to32(input + idx, fragOffset);
  9048. idx += DTLS_HANDSHAKE_FRAG_SZ;
  9049. c24to32(input + idx, fragSz);
  9050. if ((ssl->curRL.pvMajor != ssl->version.major) ||
  9051. (!IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != ssl->version.minor) ||
  9052. (IsAtLeastTLSv1_3(ssl->version) && ssl->curRL.pvMinor != DTLSv1_2_MINOR)
  9053. ) {
  9054. if (*type != client_hello && *type != hello_verify_request && *type != server_hello) {
  9055. WOLFSSL_ERROR(VERSION_ERROR);
  9056. return VERSION_ERROR;
  9057. }
  9058. else {
  9059. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  9060. }
  9061. }
  9062. return 0;
  9063. }
  9064. #endif
  9065. #if !defined(NO_OLD_TLS) || \
  9066. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  9067. /* fill with MD5 pad size since biggest required */
  9068. static const byte PAD1[PAD_MD5] =
  9069. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9070. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9071. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9072. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9073. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  9074. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  9075. };
  9076. static const byte PAD2[PAD_MD5] =
  9077. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9078. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9079. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9080. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9081. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  9082. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  9083. };
  9084. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  9085. #ifndef NO_OLD_TLS
  9086. /* calculate MD5 hash for finished */
  9087. #ifdef WOLFSSL_TI_HASH
  9088. #include <wolfssl/wolfcrypt/hash.h>
  9089. #endif
  9090. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9091. {
  9092. int ret;
  9093. byte md5_result[WC_MD5_DIGEST_SIZE];
  9094. #ifdef WOLFSSL_SMALL_STACK
  9095. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9096. if (md5 == NULL)
  9097. return MEMORY_E;
  9098. #else
  9099. wc_Md5 md5[1];
  9100. #endif
  9101. /* make md5 inner */
  9102. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  9103. if (ret == 0)
  9104. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  9105. if (ret == 0)
  9106. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  9107. if (ret == 0)
  9108. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  9109. if (ret == 0)
  9110. ret = wc_Md5Final(md5, md5_result);
  9111. /* make md5 outer */
  9112. if (ret == 0) {
  9113. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  9114. if (ret == 0) {
  9115. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  9116. if (ret == 0)
  9117. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  9118. if (ret == 0)
  9119. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  9120. if (ret == 0)
  9121. ret = wc_Md5Final(md5, hashes->md5);
  9122. wc_Md5Free(md5);
  9123. }
  9124. }
  9125. #ifdef WOLFSSL_SMALL_STACK
  9126. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9127. #endif
  9128. return ret;
  9129. }
  9130. /* calculate SHA hash for finished */
  9131. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9132. {
  9133. int ret;
  9134. byte sha_result[WC_SHA_DIGEST_SIZE];
  9135. #ifdef WOLFSSL_SMALL_STACK
  9136. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9137. if (sha == NULL)
  9138. return MEMORY_E;
  9139. #else
  9140. wc_Sha sha[1];
  9141. #endif
  9142. /* make sha inner */
  9143. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  9144. if (ret == 0)
  9145. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  9146. if (ret == 0)
  9147. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  9148. if (ret == 0)
  9149. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  9150. if (ret == 0)
  9151. ret = wc_ShaFinal(sha, sha_result);
  9152. /* make sha outer */
  9153. if (ret == 0) {
  9154. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  9155. if (ret == 0) {
  9156. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  9157. if (ret == 0)
  9158. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  9159. if (ret == 0)
  9160. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  9161. if (ret == 0)
  9162. ret = wc_ShaFinal(sha, hashes->sha);
  9163. wc_ShaFree(sha);
  9164. }
  9165. }
  9166. #ifdef WOLFSSL_SMALL_STACK
  9167. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  9168. #endif
  9169. return ret;
  9170. }
  9171. #endif
  9172. #ifndef WOLFSSL_NO_TLS12
  9173. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  9174. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  9175. {
  9176. int ret = 0;
  9177. if (ssl == NULL)
  9178. return BAD_FUNC_ARG;
  9179. #ifndef NO_TLS
  9180. if (ssl->options.tls) {
  9181. ret = BuildTlsFinished(ssl, hashes, sender);
  9182. }
  9183. #else
  9184. (void)hashes;
  9185. (void)sender;
  9186. #endif
  9187. #ifndef NO_OLD_TLS
  9188. if (!ssl->options.tls) {
  9189. ret = BuildMD5(ssl, hashes, sender);
  9190. if (ret == 0) {
  9191. ret = BuildSHA(ssl, hashes, sender);
  9192. }
  9193. }
  9194. #endif
  9195. return ret;
  9196. }
  9197. #endif /* WOLFSSL_NO_TLS12 */
  9198. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  9199. /* cipher requirements */
  9200. enum {
  9201. REQUIRES_RSA,
  9202. REQUIRES_DHE,
  9203. REQUIRES_ECC,
  9204. REQUIRES_ECC_STATIC,
  9205. REQUIRES_PSK,
  9206. REQUIRES_RSA_SIG,
  9207. REQUIRES_AEAD
  9208. };
  9209. /* Does this cipher suite (first, second) have the requirement
  9210. an ephemeral key exchange will still require the key for signing
  9211. the key exchange so ECDHE_RSA requires an rsa key thus rsa_kea */
  9212. static int CipherRequires(byte first, byte second, int requirement)
  9213. {
  9214. (void)requirement;
  9215. #ifndef WOLFSSL_NO_TLS12
  9216. #ifdef HAVE_CHACHA
  9217. if (first == CHACHA_BYTE) {
  9218. switch (second) {
  9219. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  9220. if (requirement == REQUIRES_RSA)
  9221. return 1;
  9222. break;
  9223. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  9224. if (requirement == REQUIRES_ECC)
  9225. return 1;
  9226. break;
  9227. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  9228. if (requirement == REQUIRES_RSA)
  9229. return 1;
  9230. if (requirement == REQUIRES_DHE)
  9231. return 1;
  9232. break;
  9233. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9234. if (requirement == REQUIRES_RSA)
  9235. return 1;
  9236. break;
  9237. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9238. if (requirement == REQUIRES_ECC)
  9239. return 1;
  9240. break;
  9241. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  9242. if (requirement == REQUIRES_RSA)
  9243. return 1;
  9244. if (requirement == REQUIRES_DHE)
  9245. return 1;
  9246. break;
  9247. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9248. if (requirement == REQUIRES_PSK)
  9249. return 1;
  9250. break;
  9251. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9252. if (requirement == REQUIRES_PSK)
  9253. return 1;
  9254. break;
  9255. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  9256. if (requirement == REQUIRES_PSK)
  9257. return 1;
  9258. if (requirement == REQUIRES_DHE)
  9259. return 1;
  9260. break;
  9261. }
  9262. if (requirement == REQUIRES_AEAD)
  9263. return 1;
  9264. }
  9265. #endif /* HAVE_CHACHA */
  9266. /* ECC extensions */
  9267. if (first == ECC_BYTE) {
  9268. switch (second) {
  9269. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9270. #ifndef NO_RSA
  9271. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  9272. if (requirement == REQUIRES_RSA)
  9273. return 1;
  9274. break;
  9275. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  9276. if (requirement == REQUIRES_ECC_STATIC)
  9277. return 1;
  9278. if (requirement == REQUIRES_RSA_SIG)
  9279. return 1;
  9280. break;
  9281. #ifndef NO_DES3
  9282. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  9283. if (requirement == REQUIRES_RSA)
  9284. return 1;
  9285. break;
  9286. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  9287. if (requirement == REQUIRES_ECC_STATIC)
  9288. return 1;
  9289. if (requirement == REQUIRES_RSA_SIG)
  9290. return 1;
  9291. break;
  9292. #endif /* !NO_DES3 */
  9293. #ifndef NO_RC4
  9294. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  9295. if (requirement == REQUIRES_RSA)
  9296. return 1;
  9297. break;
  9298. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  9299. if (requirement == REQUIRES_ECC_STATIC)
  9300. return 1;
  9301. if (requirement == REQUIRES_RSA_SIG)
  9302. return 1;
  9303. break;
  9304. #endif /* !NO_RC4 */
  9305. #endif /* NO_RSA */
  9306. #ifndef NO_DES3
  9307. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  9308. if (requirement == REQUIRES_ECC)
  9309. return 1;
  9310. break;
  9311. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  9312. if (requirement == REQUIRES_ECC_STATIC)
  9313. return 1;
  9314. break;
  9315. #endif /* !NO_DES3 */
  9316. #ifndef NO_RC4
  9317. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  9318. if (requirement == REQUIRES_ECC)
  9319. return 1;
  9320. break;
  9321. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  9322. if (requirement == REQUIRES_ECC_STATIC)
  9323. return 1;
  9324. break;
  9325. #endif /* !NO_RC4 */
  9326. #ifndef NO_RSA
  9327. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  9328. if (requirement == REQUIRES_RSA)
  9329. return 1;
  9330. break;
  9331. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  9332. if (requirement == REQUIRES_ECC_STATIC)
  9333. return 1;
  9334. if (requirement == REQUIRES_RSA_SIG)
  9335. return 1;
  9336. break;
  9337. #endif /* !NO_RSA */
  9338. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  9339. if (requirement == REQUIRES_ECC)
  9340. return 1;
  9341. break;
  9342. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  9343. if (requirement == REQUIRES_ECC_STATIC)
  9344. return 1;
  9345. break;
  9346. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  9347. if (requirement == REQUIRES_ECC)
  9348. return 1;
  9349. break;
  9350. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  9351. if (requirement == REQUIRES_ECC_STATIC)
  9352. return 1;
  9353. break;
  9354. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  9355. if (requirement == REQUIRES_ECC)
  9356. return 1;
  9357. if (requirement == REQUIRES_AEAD)
  9358. return 1;
  9359. break;
  9360. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  9361. if (requirement == REQUIRES_ECC)
  9362. return 1;
  9363. if (requirement == REQUIRES_AEAD)
  9364. return 1;
  9365. break;
  9366. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  9367. if (requirement == REQUIRES_ECC_STATIC)
  9368. return 1;
  9369. if (requirement == REQUIRES_AEAD)
  9370. return 1;
  9371. break;
  9372. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  9373. if (requirement == REQUIRES_ECC_STATIC)
  9374. return 1;
  9375. if (requirement == REQUIRES_AEAD)
  9376. return 1;
  9377. break;
  9378. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9379. #ifndef NO_RSA
  9380. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9381. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  9382. if (requirement == REQUIRES_RSA)
  9383. return 1;
  9384. if (requirement == REQUIRES_AEAD)
  9385. return 1;
  9386. break;
  9387. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  9388. if (requirement == REQUIRES_RSA)
  9389. return 1;
  9390. if (requirement == REQUIRES_AEAD)
  9391. return 1;
  9392. break;
  9393. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  9394. if (requirement == REQUIRES_ECC_STATIC)
  9395. return 1;
  9396. if (requirement == REQUIRES_RSA_SIG)
  9397. return 1;
  9398. if (requirement == REQUIRES_AEAD)
  9399. return 1;
  9400. break;
  9401. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  9402. if (requirement == REQUIRES_ECC_STATIC)
  9403. return 1;
  9404. if (requirement == REQUIRES_RSA_SIG)
  9405. return 1;
  9406. if (requirement == REQUIRES_AEAD)
  9407. return 1;
  9408. break;
  9409. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9410. #ifdef HAVE_AESCCM
  9411. case TLS_RSA_WITH_AES_128_CCM_8 :
  9412. case TLS_RSA_WITH_AES_256_CCM_8 :
  9413. if (requirement == REQUIRES_RSA)
  9414. return 1;
  9415. if (requirement == REQUIRES_RSA_SIG)
  9416. return 1;
  9417. if (requirement == REQUIRES_AEAD)
  9418. return 1;
  9419. break;
  9420. #endif /* HAVE_AESCCM */
  9421. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9422. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  9423. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  9424. if (requirement == REQUIRES_RSA)
  9425. return 1;
  9426. break;
  9427. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  9428. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  9429. if (requirement == REQUIRES_RSA_SIG)
  9430. return 1;
  9431. if (requirement == REQUIRES_ECC_STATIC)
  9432. return 1;
  9433. break;
  9434. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9435. #endif /* !NO_RSA */
  9436. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9437. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  9438. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  9439. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  9440. if (requirement == REQUIRES_ECC)
  9441. return 1;
  9442. if (requirement == REQUIRES_AEAD)
  9443. return 1;
  9444. break;
  9445. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  9446. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  9447. if (requirement == REQUIRES_ECC)
  9448. return 1;
  9449. break;
  9450. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  9451. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  9452. if (requirement == REQUIRES_ECC)
  9453. return 1;
  9454. if (requirement == REQUIRES_ECC_STATIC)
  9455. return 1;
  9456. break;
  9457. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9458. #ifndef NO_PSK
  9459. case TLS_PSK_WITH_AES_128_CCM:
  9460. case TLS_PSK_WITH_AES_256_CCM:
  9461. case TLS_PSK_WITH_AES_128_CCM_8:
  9462. case TLS_PSK_WITH_AES_256_CCM_8:
  9463. if (requirement == REQUIRES_PSK)
  9464. return 1;
  9465. if (requirement == REQUIRES_AEAD)
  9466. return 1;
  9467. break;
  9468. case TLS_DHE_PSK_WITH_AES_128_CCM:
  9469. case TLS_DHE_PSK_WITH_AES_256_CCM:
  9470. if (requirement == REQUIRES_PSK)
  9471. return 1;
  9472. if (requirement == REQUIRES_DHE)
  9473. return 1;
  9474. if (requirement == REQUIRES_AEAD)
  9475. return 1;
  9476. break;
  9477. #endif /* !NO_PSK */
  9478. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9479. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  9480. if (requirement == REQUIRES_ECC)
  9481. return 1;
  9482. break;
  9483. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  9484. if (requirement == REQUIRES_PSK)
  9485. return 1;
  9486. break;
  9487. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  9488. if (requirement == REQUIRES_PSK)
  9489. return 1;
  9490. break;
  9491. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9492. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  9493. case TLS_SHA256_SHA256:
  9494. break;
  9495. case TLS_SHA384_SHA384:
  9496. break;
  9497. #endif
  9498. default:
  9499. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  9500. return 0;
  9501. } /* switch */
  9502. } /* if */
  9503. /* ECC extensions */
  9504. if (first == ECDHE_PSK_BYTE) {
  9505. switch (second) {
  9506. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  9507. case TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 :
  9508. if (requirement == REQUIRES_PSK)
  9509. return 1;
  9510. break;
  9511. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9512. default:
  9513. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC PSK");
  9514. return 0;
  9515. } /* switch */
  9516. } /* if */
  9517. #endif /* !WOLFSSL_NO_TLS12 */
  9518. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  9519. if (first == TLS13_BYTE) {
  9520. switch (second) {
  9521. #ifdef WOLFSSL_TLS13
  9522. case TLS_AES_128_GCM_SHA256:
  9523. case TLS_AES_256_GCM_SHA384:
  9524. case TLS_CHACHA20_POLY1305_SHA256:
  9525. case TLS_AES_128_CCM_SHA256:
  9526. case TLS_AES_128_CCM_8_SHA256:
  9527. break;
  9528. #endif
  9529. default:
  9530. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  9531. "TLS v1.3");
  9532. return 0;
  9533. }
  9534. }
  9535. #ifndef WOLFSSL_NO_TLS12
  9536. if (first != ECC_BYTE && first != CHACHA_BYTE &&
  9537. first != TLS13_BYTE && first != ECDHE_PSK_BYTE) {
  9538. /* normal suites */
  9539. switch (second) {
  9540. #ifndef NO_RSA
  9541. #ifndef NO_RC4
  9542. case SSL_RSA_WITH_RC4_128_SHA :
  9543. if (requirement == REQUIRES_RSA)
  9544. return 1;
  9545. break;
  9546. case SSL_RSA_WITH_RC4_128_MD5 :
  9547. if (requirement == REQUIRES_RSA)
  9548. return 1;
  9549. break;
  9550. #endif /* NO_RC4 */
  9551. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  9552. if (requirement == REQUIRES_RSA)
  9553. return 1;
  9554. break;
  9555. case TLS_RSA_WITH_AES_128_CBC_SHA :
  9556. if (requirement == REQUIRES_RSA)
  9557. return 1;
  9558. break;
  9559. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  9560. if (requirement == REQUIRES_RSA)
  9561. return 1;
  9562. break;
  9563. case TLS_RSA_WITH_AES_256_CBC_SHA :
  9564. if (requirement == REQUIRES_RSA)
  9565. return 1;
  9566. break;
  9567. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  9568. if (requirement == REQUIRES_RSA)
  9569. return 1;
  9570. break;
  9571. case TLS_RSA_WITH_NULL_MD5 :
  9572. case TLS_RSA_WITH_NULL_SHA :
  9573. case TLS_RSA_WITH_NULL_SHA256 :
  9574. if (requirement == REQUIRES_RSA)
  9575. return 1;
  9576. break;
  9577. #endif /* !NO_RSA */
  9578. #ifndef NO_PSK
  9579. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  9580. if (requirement == REQUIRES_PSK)
  9581. return 1;
  9582. if (requirement == REQUIRES_AEAD)
  9583. return 1;
  9584. break;
  9585. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  9586. if (requirement == REQUIRES_PSK)
  9587. return 1;
  9588. if (requirement == REQUIRES_AEAD)
  9589. return 1;
  9590. break;
  9591. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  9592. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  9593. case TLS_PSK_WITH_AES_128_CBC_SHA :
  9594. case TLS_PSK_WITH_AES_256_CBC_SHA :
  9595. case TLS_PSK_WITH_NULL_SHA384 :
  9596. case TLS_PSK_WITH_NULL_SHA256 :
  9597. case TLS_PSK_WITH_NULL_SHA :
  9598. if (requirement == REQUIRES_PSK)
  9599. return 1;
  9600. break;
  9601. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  9602. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  9603. if (requirement == REQUIRES_DHE)
  9604. return 1;
  9605. if (requirement == REQUIRES_PSK)
  9606. return 1;
  9607. if (requirement == REQUIRES_AEAD)
  9608. return 1;
  9609. break;
  9610. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  9611. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  9612. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  9613. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  9614. if (requirement == REQUIRES_DHE)
  9615. return 1;
  9616. if (requirement == REQUIRES_PSK)
  9617. return 1;
  9618. break;
  9619. #endif /* NO_PSK */
  9620. #ifndef NO_RSA
  9621. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  9622. if (requirement == REQUIRES_RSA)
  9623. return 1;
  9624. if (requirement == REQUIRES_DHE)
  9625. return 1;
  9626. break;
  9627. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  9628. if (requirement == REQUIRES_RSA)
  9629. return 1;
  9630. if (requirement == REQUIRES_DHE)
  9631. return 1;
  9632. break;
  9633. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  9634. if (requirement == REQUIRES_RSA)
  9635. return 1;
  9636. if (requirement == REQUIRES_DHE)
  9637. return 1;
  9638. break;
  9639. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  9640. if (requirement == REQUIRES_RSA)
  9641. return 1;
  9642. if (requirement == REQUIRES_DHE)
  9643. return 1;
  9644. break;
  9645. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  9646. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  9647. if (requirement == REQUIRES_RSA)
  9648. return 1;
  9649. if (requirement == REQUIRES_AEAD)
  9650. return 1;
  9651. break;
  9652. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  9653. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  9654. if (requirement == REQUIRES_RSA)
  9655. return 1;
  9656. if (requirement == REQUIRES_DHE)
  9657. return 1;
  9658. if (requirement == REQUIRES_AEAD)
  9659. return 1;
  9660. break;
  9661. #ifdef HAVE_CAMELLIA
  9662. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  9663. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  9664. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  9665. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  9666. if (requirement == REQUIRES_RSA)
  9667. return 1;
  9668. break;
  9669. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  9670. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  9671. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  9672. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  9673. if (requirement == REQUIRES_RSA)
  9674. return 1;
  9675. if (requirement == REQUIRES_RSA_SIG)
  9676. return 1;
  9677. if (requirement == REQUIRES_DHE)
  9678. return 1;
  9679. break;
  9680. #endif /* HAVE_CAMELLIA */
  9681. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  9682. if (requirement == REQUIRES_RSA)
  9683. return 1;
  9684. if (requirement == REQUIRES_RSA_SIG)
  9685. return 1;
  9686. if (requirement == REQUIRES_DHE)
  9687. return 1;
  9688. break;
  9689. #endif
  9690. #ifdef HAVE_ANON
  9691. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  9692. if (requirement == REQUIRES_DHE)
  9693. return 1;
  9694. break;
  9695. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  9696. if (requirement == REQUIRES_DHE)
  9697. return 1;
  9698. if (requirement == REQUIRES_AEAD)
  9699. return 1;
  9700. break;
  9701. #endif
  9702. #ifdef WOLFSSL_MULTICAST
  9703. case WDM_WITH_NULL_SHA256 :
  9704. break;
  9705. #endif
  9706. default:
  9707. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  9708. return 0;
  9709. } /* switch */
  9710. } /* if ECC / Normal suites else */
  9711. #endif /* !WOLFSSL_NO_TLS12 */
  9712. return 0;
  9713. }
  9714. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  9715. #ifndef NO_CERTS
  9716. /* Match names with wildcards, each wildcard can represent a single name
  9717. component or fragment but not multiple names, i.e.,
  9718. *.z.com matches y.z.com but not x.y.z.com
  9719. return 1 on success */
  9720. int MatchDomainName(const char* pattern, int len, const char* str)
  9721. {
  9722. int ret = 0;
  9723. char p, s;
  9724. if (pattern == NULL || str == NULL || len <= 0)
  9725. return 0;
  9726. while (len > 0) {
  9727. p = (char)XTOLOWER((unsigned char)*pattern++);
  9728. if (p == '\0')
  9729. break;
  9730. if (p == '*') {
  9731. while (--len > 0 &&
  9732. (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') {
  9733. }
  9734. if (len == 0)
  9735. p = '\0';
  9736. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  9737. if (s == p)
  9738. break;
  9739. if (s == '.')
  9740. return 0;
  9741. str++;
  9742. }
  9743. }
  9744. else {
  9745. if (p != (char)XTOLOWER((unsigned char) *str))
  9746. return 0;
  9747. }
  9748. if (len > 0) {
  9749. str++;
  9750. len--;
  9751. }
  9752. }
  9753. if (*str == '\0' && len == 0) {
  9754. ret = 1; /* success */
  9755. }
  9756. return ret;
  9757. }
  9758. /* Check that alternative names, if they exists, match the domain.
  9759. * Fail if there are wild patterns and they didn't match.
  9760. * Check the common name if no alternative names matched.
  9761. *
  9762. * dCert Decoded cert to get the alternative names from.
  9763. * domain Domain name to compare against.
  9764. * checkCN Whether to check the common name.
  9765. * returns 1 : match was found.
  9766. * 0 : no match found.
  9767. * -1 : No matches and wild pattern match failed.
  9768. */
  9769. int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
  9770. {
  9771. int match = 0;
  9772. DNS_entry* altName = NULL;
  9773. char *buf;
  9774. word32 len;
  9775. WOLFSSL_MSG("Checking AltNames");
  9776. if (dCert)
  9777. altName = dCert->altNames;
  9778. if (checkCN != NULL) {
  9779. *checkCN = (altName == NULL) ? 1 : 0;
  9780. }
  9781. while (altName) {
  9782. WOLFSSL_MSG("\tindividual AltName check");
  9783. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  9784. if (altName->type == ASN_IP_TYPE) {
  9785. buf = altName->ipString;
  9786. len = (word32)XSTRLEN(buf);
  9787. }
  9788. else
  9789. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  9790. {
  9791. buf = altName->name;
  9792. len = altName->len;
  9793. }
  9794. if (MatchDomainName(buf, len, domain)) {
  9795. match = 1;
  9796. if (checkCN != NULL) {
  9797. *checkCN = 0;
  9798. }
  9799. WOLFSSL_MSG("\tmatch found");
  9800. break;
  9801. }
  9802. /* No matches and wild pattern match failed. */
  9803. else if (buf && (len >=1) && (buf[0] == '*')) {
  9804. match = -1;
  9805. WOLFSSL_MSG("\twildcard match failed");
  9806. }
  9807. altName = altName->next;
  9808. }
  9809. return match;
  9810. }
  9811. /* Check the domain name matches the subject alternative name or the subject
  9812. * name.
  9813. *
  9814. * dcert Decoded certificate.
  9815. * domainName The domain name.
  9816. * domainNameLen The length of the domain name.
  9817. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  9818. */
  9819. int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
  9820. {
  9821. int checkCN;
  9822. int ret = DOMAIN_NAME_MISMATCH;
  9823. /* Assume name is NUL terminated. */
  9824. (void)domainNameLen;
  9825. if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
  9826. WOLFSSL_MSG("DomainName match on alt names failed");
  9827. }
  9828. else {
  9829. ret = 0;
  9830. }
  9831. #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  9832. if (checkCN == 1) {
  9833. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  9834. domainName) == 1) {
  9835. ret = 0;
  9836. }
  9837. else {
  9838. WOLFSSL_MSG("DomainName match on common name failed");
  9839. }
  9840. }
  9841. #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
  9842. return ret;
  9843. }
  9844. int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
  9845. {
  9846. WOLFSSL_MSG("Checking IPAddr");
  9847. return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
  9848. }
  9849. #ifdef SESSION_CERTS
  9850. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  9851. byte* certBuf, word32 certSz)
  9852. {
  9853. if (chain->count < MAX_CHAIN_DEPTH &&
  9854. certSz < MAX_X509_SIZE) {
  9855. chain->certs[chain->count].length = certSz;
  9856. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  9857. chain->count++;
  9858. }
  9859. else {
  9860. WOLFSSL_MSG("Couldn't store chain cert for session");
  9861. }
  9862. }
  9863. #endif
  9864. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  9865. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9866. static void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType)
  9867. {
  9868. if (nameType == SUBJECT) {
  9869. XSTRNCPY(name->name, dCert->subject, ASN_NAME_MAX);
  9870. name->name[ASN_NAME_MAX - 1] = '\0';
  9871. name->sz = (int)XSTRLEN(name->name) + 1;
  9872. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  9873. name->rawLen = min(dCert->subjectRawLen, ASN_NAME_MAX);
  9874. XMEMCPY(name->raw, dCert->subjectRaw, name->rawLen);
  9875. #endif
  9876. }
  9877. else {
  9878. XSTRNCPY(name->name, dCert->issuer, ASN_NAME_MAX);
  9879. name->name[ASN_NAME_MAX - 1] = '\0';
  9880. name->sz = (int)XSTRLEN(name->name) + 1;
  9881. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)) \
  9882. && (defined(HAVE_PKCS7) || defined(WOLFSSL_CERT_EXT))
  9883. name->rawLen = min(dCert->issuerRawLen, ASN_NAME_MAX);
  9884. if (name->rawLen) {
  9885. XMEMCPY(name->raw, dCert->issuerRaw, name->rawLen);
  9886. }
  9887. #endif
  9888. }
  9889. }
  9890. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  9891. !defined(IGNORE_NAME_CONSTRAINTS)
  9892. /* copies over additional alt names such as dirName
  9893. * returns 0 on success
  9894. */
  9895. static int CopyAdditionalAltNames(DNS_entry** to, DNS_entry* from, int type,
  9896. void* heap)
  9897. {
  9898. DNS_entry* cur = from;
  9899. if (to == NULL) {
  9900. return BAD_FUNC_ARG;
  9901. }
  9902. while (cur != NULL) {
  9903. if (cur->type == type) {
  9904. DNS_entry* dnsEntry;
  9905. int strLen = cur->len;
  9906. dnsEntry = AltNameNew(heap);
  9907. if (dnsEntry == NULL) {
  9908. WOLFSSL_MSG("\tOut of Memory");
  9909. return MEMORY_E;
  9910. }
  9911. dnsEntry->type = type;
  9912. dnsEntry->name = (char*)XMALLOC(strLen + 1, heap,
  9913. DYNAMIC_TYPE_ALTNAME);
  9914. if (dnsEntry->name == NULL) {
  9915. WOLFSSL_MSG("\tOut of Memory");
  9916. XFREE(dnsEntry, heap, DYNAMIC_TYPE_ALTNAME);
  9917. return MEMORY_E;
  9918. }
  9919. dnsEntry->len = strLen;
  9920. XMEMCPY(dnsEntry->name, cur->name, strLen);
  9921. dnsEntry->name[strLen] = '\0';
  9922. dnsEntry->next = *to;
  9923. *to = dnsEntry;
  9924. }
  9925. cur = cur->next;
  9926. }
  9927. return 0;
  9928. }
  9929. #endif /* OPENSSL_EXTRA */
  9930. #ifdef WOLFSSL_CERT_REQ
  9931. static int CopyREQAttributes(WOLFSSL_X509* x509, DecodedCert* dCert)
  9932. {
  9933. int ret = 0;
  9934. if (dCert->cPwd) {
  9935. if (dCert->cPwdLen < CTC_NAME_SIZE) {
  9936. XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
  9937. x509->challengePw[dCert->cPwdLen] = '\0';
  9938. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  9939. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9940. NID_pkcs9_challengePassword,
  9941. MBSTRING_ASC,
  9942. (const byte*)dCert->cPwd,
  9943. dCert->cPwdLen) != WOLFSSL_SUCCESS) {
  9944. ret = REQ_ATTRIBUTE_E;
  9945. WOLFSSL_ERROR_VERBOSE(ret);
  9946. }
  9947. #endif
  9948. }
  9949. else {
  9950. WOLFSSL_MSG("Challenge password too long");
  9951. ret = MEMORY_E;
  9952. }
  9953. }
  9954. if (dCert->contentType) {
  9955. if (dCert->contentTypeLen < CTC_NAME_SIZE) {
  9956. XMEMCPY(x509->contentType, dCert->contentType, dCert->contentTypeLen);
  9957. x509->contentType[dCert->contentTypeLen] = '\0';
  9958. }
  9959. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  9960. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9961. NID_pkcs9_contentType,
  9962. MBSTRING_ASC,
  9963. (const byte*)dCert->contentType,
  9964. dCert->contentTypeLen) !=
  9965. WOLFSSL_SUCCESS) {
  9966. ret = REQ_ATTRIBUTE_E;
  9967. WOLFSSL_ERROR_VERBOSE(ret);
  9968. }
  9969. #endif
  9970. }
  9971. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN)
  9972. if (dCert->sNum) {
  9973. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9974. NID_serialNumber,
  9975. MBSTRING_ASC,
  9976. (const byte*)dCert->sNum,
  9977. dCert->sNumLen) != WOLFSSL_SUCCESS) {
  9978. ret = REQ_ATTRIBUTE_E;
  9979. WOLFSSL_ERROR_VERBOSE(ret);
  9980. }
  9981. }
  9982. if (dCert->unstructuredName) {
  9983. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9984. NID_pkcs9_unstructuredName,
  9985. MBSTRING_ASC,
  9986. (const byte*)dCert->unstructuredName,
  9987. dCert->unstructuredNameLen)
  9988. != WOLFSSL_SUCCESS) {
  9989. ret = REQ_ATTRIBUTE_E;
  9990. WOLFSSL_ERROR_VERBOSE(ret);
  9991. }
  9992. }
  9993. if (dCert->surname) {
  9994. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9995. NID_surname,
  9996. MBSTRING_ASC,
  9997. (const byte*)dCert->surname,
  9998. dCert->surnameLen) != WOLFSSL_SUCCESS) {
  9999. ret = REQ_ATTRIBUTE_E;
  10000. WOLFSSL_ERROR_VERBOSE(ret);
  10001. }
  10002. }
  10003. if (dCert->givenName) {
  10004. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10005. NID_givenName,
  10006. MBSTRING_ASC,
  10007. (const byte*)dCert->givenName,
  10008. dCert->givenNameLen) != WOLFSSL_SUCCESS) {
  10009. ret = REQ_ATTRIBUTE_E;
  10010. WOLFSSL_ERROR_VERBOSE(ret);
  10011. }
  10012. }
  10013. if (dCert->dnQualifier) {
  10014. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10015. NID_dnQualifier,
  10016. MBSTRING_ASC,
  10017. (const byte*)dCert->dnQualifier,
  10018. dCert->dnQualifierLen) != WOLFSSL_SUCCESS) {
  10019. ret = REQ_ATTRIBUTE_E;
  10020. WOLFSSL_ERROR_VERBOSE(ret);
  10021. }
  10022. }
  10023. if (dCert->initials) {
  10024. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  10025. NID_initials,
  10026. MBSTRING_ASC,
  10027. (const byte*)dCert->initials,
  10028. dCert->initialsLen) != WOLFSSL_SUCCESS) {
  10029. ret = REQ_ATTRIBUTE_E;
  10030. WOLFSSL_ERROR_VERBOSE(ret);
  10031. }
  10032. }
  10033. #endif /* OPENSSL_ALL */
  10034. return ret;
  10035. }
  10036. #endif /* WOLFSSL_CERT_REQ */
  10037. /* Copy parts X509 needs from Decoded cert, 0 on success */
  10038. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  10039. * altNames pointers could be free'd by second x509 still active by first */
  10040. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  10041. {
  10042. int ret = 0;
  10043. if (x509 == NULL || dCert == NULL ||
  10044. dCert->subjectCNLen < 0)
  10045. return BAD_FUNC_ARG;
  10046. if (x509->issuer.name == NULL || x509->subject.name == NULL) {
  10047. WOLFSSL_MSG("Either init was not called on X509 or programming error");
  10048. WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
  10049. return BAD_FUNC_ARG;
  10050. }
  10051. x509->version = dCert->version + 1;
  10052. CopyDecodedName(&x509->issuer, dCert, ISSUER);
  10053. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10054. if (dCert->issuerName != NULL) {
  10055. wolfSSL_X509_set_issuer_name(x509,
  10056. (WOLFSSL_X509_NAME*)dCert->issuerName);
  10057. x509->issuer.x509 = x509;
  10058. }
  10059. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10060. CopyDecodedName(&x509->subject, dCert, SUBJECT);
  10061. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10062. if (dCert->subjectName != NULL) {
  10063. wolfSSL_X509_set_subject_name(x509,
  10064. (WOLFSSL_X509_NAME*)dCert->subjectName);
  10065. x509->subject.x509 = x509;
  10066. }
  10067. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10068. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  10069. x509->serialSz = dCert->serialSz;
  10070. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  10071. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  10072. x509->subjectCN[dCert->subjectCNLen] = '\0';
  10073. }
  10074. else
  10075. x509->subjectCN[0] = '\0';
  10076. #ifdef WOLFSSL_CERT_REQ
  10077. x509->isCSR = dCert->isCSR;
  10078. /* CSR attributes */
  10079. if (x509->isCSR) {
  10080. ret = CopyREQAttributes(x509, dCert);
  10081. }
  10082. #endif /* WOLFSSL_CERT_REQ */
  10083. #ifdef WOLFSSL_SEP
  10084. {
  10085. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  10086. if (minSz > 0) {
  10087. x509->deviceTypeSz = minSz;
  10088. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  10089. }
  10090. else
  10091. x509->deviceTypeSz = 0;
  10092. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  10093. if (minSz > 0) {
  10094. x509->hwTypeSz = minSz;
  10095. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  10096. }
  10097. else
  10098. x509->hwTypeSz = 0;
  10099. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  10100. if (minSz > 0) {
  10101. x509->hwSerialNumSz = minSz;
  10102. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  10103. }
  10104. else
  10105. x509->hwSerialNumSz = 0;
  10106. }
  10107. #endif /* WOLFSSL_SEP */
  10108. {
  10109. int minSz;
  10110. if (dCert->beforeDateLen > 0) {
  10111. minSz = min(dCert->beforeDate[1], MAX_DATE_SZ);
  10112. x509->notBefore.type = dCert->beforeDate[0];
  10113. x509->notBefore.length = minSz;
  10114. XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
  10115. }
  10116. else
  10117. x509->notBefore.length = 0;
  10118. if (dCert->afterDateLen > 0) {
  10119. minSz = min(dCert->afterDate[1], MAX_DATE_SZ);
  10120. x509->notAfter.type = dCert->afterDate[0];
  10121. x509->notAfter.length = minSz;
  10122. XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
  10123. }
  10124. else
  10125. x509->notAfter.length = 0;
  10126. }
  10127. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  10128. x509->pubKey.buffer = (byte*)XMALLOC(
  10129. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  10130. if (x509->pubKey.buffer != NULL) {
  10131. x509->pubKeyOID = dCert->keyOID;
  10132. x509->pubKey.length = dCert->pubKeySize;
  10133. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  10134. }
  10135. else
  10136. ret = MEMORY_E;
  10137. #if defined(OPENSSL_ALL)
  10138. if (ret == 0) {
  10139. x509->key.pubKeyOID = dCert->keyOID;
  10140. if (!x509->key.algor) {
  10141. x509->key.algor = wolfSSL_X509_ALGOR_new();
  10142. } else {
  10143. wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
  10144. }
  10145. if (!x509->key.algor) {
  10146. ret = MEMORY_E;
  10147. } else {
  10148. if (!(x509->key.algor->algorithm =
  10149. wolfSSL_OBJ_nid2obj(oid2nid(dCert->keyOID, oidKeyType)))) {
  10150. ret = PUBLIC_KEY_E;
  10151. WOLFSSL_ERROR_VERBOSE(ret);
  10152. }
  10153. }
  10154. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  10155. if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
  10156. &dCert->publicKey,
  10157. dCert->pubKeySize))) {
  10158. ret = PUBLIC_KEY_E;
  10159. WOLFSSL_ERROR_VERBOSE(ret);
  10160. }
  10161. }
  10162. #endif
  10163. }
  10164. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  10165. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  10166. x509->sig.buffer = (byte*)XMALLOC(
  10167. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  10168. if (x509->sig.buffer == NULL) {
  10169. ret = MEMORY_E;
  10170. }
  10171. else {
  10172. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  10173. x509->sig.length = dCert->sigLength;
  10174. x509->sigOID = dCert->signatureOID;
  10175. }
  10176. #if defined(OPENSSL_ALL)
  10177. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  10178. if (!(x509->algor.algorithm =
  10179. wolfSSL_OBJ_nid2obj(oid2nid(dCert->signatureOID, oidSigType)))) {
  10180. ret = PUBLIC_KEY_E;
  10181. WOLFSSL_ERROR_VERBOSE(ret);
  10182. }
  10183. #endif
  10184. }
  10185. /* if der contains original source buffer then store for potential
  10186. * retrieval */
  10187. if (dCert->source != NULL && dCert->maxIdx > 0) {
  10188. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap)
  10189. == 0) {
  10190. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  10191. }
  10192. else {
  10193. ret = MEMORY_E;
  10194. }
  10195. }
  10196. x509->altNames = dCert->altNames;
  10197. dCert->weOwnAltNames = 0;
  10198. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  10199. !defined(IGNORE_NAME_CONSTRAINTS)
  10200. /* add copies of email names from dCert to X509 */
  10201. if (CopyAdditionalAltNames(&x509->altNames, dCert->altEmailNames,
  10202. ASN_RFC822_TYPE, x509->heap) != 0) {
  10203. return MEMORY_E;
  10204. }
  10205. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10206. #if defined(OPENSSL_EXTRA) && !defined(IGNORE_NAME_CONSTRAINTS)
  10207. /* add copies of alternate directory names from dCert to X509 */
  10208. if (CopyAdditionalAltNames(&x509->altNames, dCert->altDirNames,
  10209. ASN_DIR_TYPE, x509->heap) != 0) {
  10210. return MEMORY_E;
  10211. }
  10212. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10213. x509->altNamesNext = x509->altNames; /* index hint */
  10214. x509->isCa = dCert->isCA;
  10215. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10216. x509->pathLength = dCert->pathLength;
  10217. x509->keyUsage = dCert->extKeyUsage;
  10218. x509->CRLdistSet = dCert->extCRLdistSet;
  10219. x509->CRLdistCrit = dCert->extCRLdistCrit;
  10220. if (dCert->extCrlInfoRaw != NULL && dCert->extCrlInfoRawSz > 0) {
  10221. x509->rawCRLInfo = (byte*)XMALLOC(dCert->extCrlInfoRawSz, x509->heap,
  10222. DYNAMIC_TYPE_X509_EXT);
  10223. if (x509->rawCRLInfo != NULL) {
  10224. XMEMCPY(x509->rawCRLInfo, dCert->extCrlInfoRaw, dCert->extCrlInfoRawSz);
  10225. x509->rawCRLInfoSz = dCert->extCrlInfoRawSz;
  10226. }
  10227. else {
  10228. ret = MEMORY_E;
  10229. }
  10230. }
  10231. if (dCert->extCrlInfo != NULL && dCert->extCrlInfoSz > 0) {
  10232. x509->CRLInfo = (byte*)XMALLOC(dCert->extCrlInfoSz, x509->heap,
  10233. DYNAMIC_TYPE_X509_EXT);
  10234. if (x509->CRLInfo != NULL) {
  10235. XMEMCPY(x509->CRLInfo, dCert->extCrlInfo, dCert->extCrlInfoSz);
  10236. x509->CRLInfoSz = dCert->extCrlInfoSz;
  10237. }
  10238. else {
  10239. ret = MEMORY_E;
  10240. }
  10241. }
  10242. x509->authInfoSet = dCert->extAuthInfoSet;
  10243. x509->authInfoCrit = dCert->extAuthInfoCrit;
  10244. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  10245. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  10246. DYNAMIC_TYPE_X509_EXT);
  10247. if (x509->authInfo != NULL) {
  10248. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  10249. x509->authInfoSz = dCert->extAuthInfoSz;
  10250. }
  10251. else {
  10252. ret = MEMORY_E;
  10253. }
  10254. }
  10255. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  10256. if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
  10257. x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
  10258. DYNAMIC_TYPE_X509_EXT);
  10259. if (x509->authInfoCaIssuer != NULL) {
  10260. XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
  10261. x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
  10262. }
  10263. else {
  10264. ret = MEMORY_E;
  10265. }
  10266. }
  10267. #endif
  10268. x509->basicConstSet = dCert->extBasicConstSet;
  10269. x509->basicConstCrit = dCert->extBasicConstCrit;
  10270. x509->basicConstPlSet = dCert->pathLengthSet;
  10271. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  10272. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  10273. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  10274. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  10275. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  10276. #ifdef WOLFSSL_AKID_NAME
  10277. if (dCert->extRawAuthKeyIdSrc != NULL &&
  10278. dCert->extAuthKeyIdSrc > dCert->extRawAuthKeyIdSrc &&
  10279. dCert->extAuthKeyIdSrc <
  10280. (dCert->extRawAuthKeyIdSrc + dCert->extRawAuthKeyIdSz)) {
  10281. /* Confirmed: extAuthKeyIdSrc points inside extRawAuthKeyIdSrc */
  10282. x509->authKeyIdSrc = (byte*)XMALLOC(dCert->extRawAuthKeyIdSz,
  10283. x509->heap, DYNAMIC_TYPE_X509_EXT);
  10284. if (x509->authKeyIdSrc != NULL) {
  10285. XMEMCPY(x509->authKeyIdSrc, dCert->extRawAuthKeyIdSrc,
  10286. dCert->extRawAuthKeyIdSz);
  10287. x509->authKeyIdSrcSz = dCert->extRawAuthKeyIdSz;
  10288. /* Set authKeyId to same offset inside authKeyIdSrc */
  10289. x509->authKeyId = x509->authKeyIdSrc +
  10290. (dCert->extAuthKeyIdSrc - dCert->extRawAuthKeyIdSrc);
  10291. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  10292. }
  10293. else
  10294. ret = MEMORY_E;
  10295. }
  10296. #else
  10297. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  10298. DYNAMIC_TYPE_X509_EXT);
  10299. if (x509->authKeyId != NULL) {
  10300. XMEMCPY(x509->authKeyId,
  10301. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  10302. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  10303. }
  10304. #endif
  10305. else
  10306. ret = MEMORY_E;
  10307. }
  10308. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  10309. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  10310. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  10311. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  10312. DYNAMIC_TYPE_X509_EXT);
  10313. if (x509->subjKeyId != NULL) {
  10314. XMEMCPY(x509->subjKeyId,
  10315. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  10316. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  10317. }
  10318. else
  10319. ret = MEMORY_E;
  10320. }
  10321. x509->keyUsageSet = dCert->extKeyUsageSet;
  10322. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  10323. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  10324. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  10325. x509->heap, DYNAMIC_TYPE_X509_EXT);
  10326. if (x509->extKeyUsageSrc != NULL) {
  10327. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  10328. dCert->extExtKeyUsageSz);
  10329. x509->extKeyUsage = dCert->extExtKeyUsage;
  10330. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  10331. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  10332. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  10333. }
  10334. else {
  10335. ret = MEMORY_E;
  10336. }
  10337. }
  10338. #ifndef IGNORE_NETSCAPE_CERT_TYPE
  10339. x509->nsCertType = dCert->nsCertType;
  10340. #endif
  10341. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  10342. x509->certPolicySet = dCert->extCertPolicySet;
  10343. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  10344. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  10345. #ifdef WOLFSSL_CERT_EXT
  10346. {
  10347. int i;
  10348. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  10349. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  10350. MAX_CERTPOL_SZ);
  10351. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  10352. }
  10353. #endif /* WOLFSSL_CERT_EXT */
  10354. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  10355. #ifdef OPENSSL_ALL
  10356. if (dCert->extSubjAltNameSrc != NULL && dCert->extSubjAltNameSz != 0) {
  10357. x509->subjAltNameSrc = (byte*)XMALLOC(dCert->extSubjAltNameSz, x509->heap,
  10358. DYNAMIC_TYPE_X509_EXT);
  10359. if (x509->subjAltNameSrc != NULL) {
  10360. XMEMCPY(x509->subjAltNameSrc,
  10361. dCert->extSubjAltNameSrc, dCert->extSubjAltNameSz);
  10362. x509->subjAltNameSz = dCert->extSubjAltNameSz;
  10363. }
  10364. else
  10365. ret = MEMORY_E;
  10366. }
  10367. #endif
  10368. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  10369. x509->pkCurveOID = dCert->pkCurveOID;
  10370. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  10371. return ret;
  10372. }
  10373. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  10374. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  10375. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  10376. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10377. word32 status_length)
  10378. {
  10379. int ret = 0;
  10380. OcspRequest* request;
  10381. #ifdef WOLFSSL_SMALL_STACK
  10382. CertStatus* status;
  10383. OcspEntry* single;
  10384. OcspResponse* response;
  10385. #else
  10386. CertStatus status[1];
  10387. OcspEntry single[1];
  10388. OcspResponse response[1];
  10389. #endif
  10390. WOLFSSL_ENTER("ProcessCSR");
  10391. do {
  10392. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  10393. if (ssl->status_request) {
  10394. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  10395. ssl->status_request = 0;
  10396. break;
  10397. }
  10398. #endif
  10399. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10400. if (ssl->status_request_v2) {
  10401. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  10402. WOLFSSL_CSR2_OCSP, 0);
  10403. ssl->status_request_v2 = 0;
  10404. break;
  10405. }
  10406. #endif
  10407. return BUFFER_ERROR;
  10408. } while(0);
  10409. if (request == NULL)
  10410. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  10411. #ifdef WOLFSSL_SMALL_STACK
  10412. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  10413. DYNAMIC_TYPE_OCSP_STATUS);
  10414. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  10415. DYNAMIC_TYPE_OCSP_ENTRY);
  10416. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  10417. DYNAMIC_TYPE_OCSP_REQUEST);
  10418. if (status == NULL || single == NULL || response == NULL) {
  10419. if (status)
  10420. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  10421. if (single)
  10422. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  10423. if (response)
  10424. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  10425. return MEMORY_ERROR;
  10426. }
  10427. #endif
  10428. InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
  10429. if (OcspResponseDecode(response, SSL_CM(ssl), ssl->heap, 0) != 0)
  10430. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10431. else if (CompareOcspReqResp(request, response) != 0)
  10432. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10433. else if (response->responseStatus != OCSP_SUCCESSFUL)
  10434. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10435. else if (response->single->status->status == CERT_REVOKED)
  10436. ret = OCSP_CERT_REVOKED;
  10437. else if (response->single->status->status != CERT_GOOD)
  10438. ret = BAD_CERTIFICATE_STATUS_ERROR;
  10439. else {
  10440. XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
  10441. ssl->ocspProducedDateFormat = response->producedDateFormat;
  10442. }
  10443. *inOutIdx += status_length;
  10444. #ifdef WOLFSSL_SMALL_STACK
  10445. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  10446. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  10447. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  10448. #endif
  10449. WOLFSSL_LEAVE("ProcessCSR", ret);
  10450. return ret;
  10451. }
  10452. #endif
  10453. #ifdef HAVE_PK_CALLBACKS
  10454. #ifdef HAVE_ECC
  10455. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  10456. const unsigned char* hash, unsigned int hashSz,
  10457. const unsigned char* keyDer, unsigned int keySz,
  10458. int* result, void* ctx)
  10459. {
  10460. int ret = NOT_COMPILED_IN;
  10461. WOLFSSL* ssl = (WOLFSSL*)ctx;
  10462. if (ssl && ssl->ctx->EccVerifyCb) {
  10463. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  10464. keyDer, keySz, result, ssl->EccVerifyCtx);
  10465. }
  10466. return ret;
  10467. }
  10468. #endif
  10469. #ifndef NO_RSA
  10470. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  10471. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  10472. void* ctx)
  10473. {
  10474. int ret = NOT_COMPILED_IN;
  10475. WOLFSSL* ssl = (WOLFSSL*)ctx;
  10476. if (ssl && ssl->ctx->RsaVerifyCb) {
  10477. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  10478. ssl->RsaVerifyCtx);
  10479. }
  10480. return ret;
  10481. }
  10482. #endif
  10483. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  10484. {
  10485. if (ssl == NULL || sigCtx == NULL)
  10486. return BAD_FUNC_ARG;
  10487. /* only setup the verify callback if a PK is set */
  10488. #ifdef HAVE_ECC
  10489. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  10490. sigCtx->pkCbEcc = Renesas_cmn_SigPkCbEccVerify;
  10491. sigCtx->pkCtxEcc = (void*)&sigCtx->CertAtt;
  10492. (void)SigPkCbEccVerify;
  10493. #else
  10494. if (ssl->ctx->EccVerifyCb) {
  10495. sigCtx->pkCbEcc = SigPkCbEccVerify;
  10496. sigCtx->pkCtxEcc = ssl;
  10497. }
  10498. #endif
  10499. #endif
  10500. #ifndef NO_RSA
  10501. /* only setup the verify callback if a PK is set */
  10502. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  10503. sigCtx->pkCbRsa = Renesas_cmn_SigPkCbRsaVerify;
  10504. sigCtx->pkCtxRsa = (void*)&sigCtx->CertAtt;
  10505. (void)SigPkCbRsaVerify;
  10506. #else
  10507. if (ssl->ctx->RsaVerifyCb) {
  10508. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  10509. sigCtx->pkCtxRsa = ssl;
  10510. }
  10511. #endif
  10512. #endif
  10513. return 0;
  10514. }
  10515. #endif /* HAVE_PK_CALLBACKS */
  10516. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  10517. void DoCertFatalAlert(WOLFSSL* ssl, int ret)
  10518. {
  10519. int alertWhy;
  10520. if (ssl == NULL || ret == 0) {
  10521. return;
  10522. }
  10523. WOLFSSL_ERROR(ret);
  10524. /* Determine alert reason */
  10525. alertWhy = bad_certificate;
  10526. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
  10527. alertWhy = certificate_expired;
  10528. } else if (ret == ASN_NO_SIGNER_E) {
  10529. alertWhy = unknown_ca;
  10530. }
  10531. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD))
  10532. else if (ret == CRL_CERT_REVOKED) {
  10533. alertWhy = certificate_revoked;
  10534. }
  10535. #endif
  10536. else if (ret == NO_PEER_CERT) {
  10537. #ifdef WOLFSSL_TLS13
  10538. if (ssl->options.tls1_3) {
  10539. alertWhy = certificate_required;
  10540. }
  10541. else
  10542. #endif
  10543. {
  10544. alertWhy = handshake_failure;
  10545. }
  10546. }
  10547. /* send fatal alert and mark connection closed */
  10548. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  10549. ssl->options.isClosed = 1;
  10550. }
  10551. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  10552. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  10553. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  10554. * The intermediates are done first then peer leaf cert last. Use the
  10555. * store->error_depth member to determine index (0=peer, >1 intermediates)
  10556. */
  10557. int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret,
  10558. ProcPeerCertArgs* args)
  10559. {
  10560. int verify_ok = 0, use_cb = 0;
  10561. void *heap;
  10562. if (cm == NULL) {
  10563. return BAD_FUNC_ARG;
  10564. }
  10565. heap = (ssl != NULL) ? ssl->heap : cm->heap;
  10566. /* Determine if verify was okay */
  10567. if (ret == 0) {
  10568. verify_ok = 1;
  10569. }
  10570. /* Determine if verify callback should be used */
  10571. if (ret != 0) {
  10572. if ((ssl != NULL) && (!ssl->options.verifyNone)) {
  10573. use_cb = 1; /* always report errors */
  10574. }
  10575. }
  10576. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  10577. /* always use verify callback on peer leaf cert */
  10578. if (args->certIdx == 0) {
  10579. use_cb = 1;
  10580. }
  10581. #endif
  10582. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  10583. /* perform verify callback on other intermediate certs (not just peer) */
  10584. if (args->certIdx > 0) {
  10585. use_cb = 1;
  10586. }
  10587. #endif
  10588. #if defined(OPENSSL_EXTRA)
  10589. /* Perform domain and IP check only for the leaf certificate */
  10590. if (args->certIdx == 0) {
  10591. /* perform domain name check on the peer certificate */
  10592. if (args->dCertInit && args->dCert && (ssl != NULL) &&
  10593. ssl->param && ssl->param->hostName[0]) {
  10594. /* If altNames names is present, then subject common name is ignored */
  10595. if (args->dCert->altNames != NULL) {
  10596. if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
  10597. if (ret == 0) {
  10598. ret = DOMAIN_NAME_MISMATCH;
  10599. WOLFSSL_ERROR_VERBOSE(ret);
  10600. }
  10601. }
  10602. }
  10603. #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY
  10604. else {
  10605. if (args->dCert->subjectCN) {
  10606. if (MatchDomainName(args->dCert->subjectCN,
  10607. args->dCert->subjectCNLen,
  10608. ssl->param->hostName) == 0) {
  10609. if (ret == 0) {
  10610. ret = DOMAIN_NAME_MISMATCH;
  10611. WOLFSSL_ERROR_VERBOSE(ret);
  10612. }
  10613. }
  10614. }
  10615. }
  10616. #else
  10617. else {
  10618. if (ret == 0) {
  10619. ret = DOMAIN_NAME_MISMATCH;
  10620. WOLFSSL_ERROR_VERBOSE(ret);
  10621. }
  10622. }
  10623. #endif /* !WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY */
  10624. }
  10625. /* perform IP address check on the peer certificate */
  10626. if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
  10627. (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
  10628. if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
  10629. if (ret == 0) {
  10630. ret = IPADDR_MISMATCH;
  10631. WOLFSSL_ERROR_VERBOSE(ret);
  10632. }
  10633. }
  10634. }
  10635. }
  10636. #endif
  10637. /* if verify callback has been set */
  10638. if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
  10639. #ifdef OPENSSL_ALL
  10640. || (ssl->ctx->verifyCertCb != NULL)
  10641. #endif
  10642. ))
  10643. #ifndef NO_WOLFSSL_CM_VERIFY
  10644. || (cm->verifyCallback != NULL)
  10645. #endif
  10646. ) {
  10647. int verifyFail = 0;
  10648. #ifdef WOLFSSL_SMALL_STACK
  10649. WOLFSSL_X509_STORE_CTX* store;
  10650. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10651. WOLFSSL_X509* x509;
  10652. #endif
  10653. char* domain = NULL;
  10654. #else
  10655. WOLFSSL_X509_STORE_CTX store[1];
  10656. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10657. WOLFSSL_X509 x509[1];
  10658. #endif
  10659. char domain[ASN_NAME_MAX];
  10660. #endif
  10661. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10662. int x509Free = 0;
  10663. #endif
  10664. #ifdef WOLFSSL_SMALL_STACK
  10665. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  10666. sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE);
  10667. if (store == NULL) {
  10668. return MEMORY_E;
  10669. }
  10670. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10671. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  10672. DYNAMIC_TYPE_X509);
  10673. if (x509 == NULL) {
  10674. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  10675. return MEMORY_E;
  10676. }
  10677. #endif
  10678. domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
  10679. if (domain == NULL) {
  10680. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  10681. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10682. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  10683. #endif
  10684. return MEMORY_E;
  10685. }
  10686. #endif /* WOLFSSL_SMALL_STACK */
  10687. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  10688. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10689. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  10690. #endif
  10691. domain[0] = '\0';
  10692. /* build subject CN as string to return in store */
  10693. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  10694. int subjectCNLen = args->dCert->subjectCNLen;
  10695. if (subjectCNLen > ASN_NAME_MAX-1)
  10696. subjectCNLen = ASN_NAME_MAX-1;
  10697. if (subjectCNLen > 0) {
  10698. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  10699. domain[subjectCNLen] = '\0';
  10700. }
  10701. }
  10702. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  10703. store->error = ret;
  10704. #else
  10705. store->error = GetX509Error(ret);
  10706. #endif
  10707. store->error_depth = args->certIdx;
  10708. store->discardSessionCerts = 0;
  10709. store->domain = domain;
  10710. if (ssl != NULL) {
  10711. if (ssl->verifyCbCtx != NULL) {
  10712. /* Use the WOLFSSL user context if set */
  10713. store->userCtx = ssl->verifyCbCtx;
  10714. }
  10715. else {
  10716. /* Else use the WOLFSSL_CTX user context */
  10717. store->userCtx = ssl->ctx->verifyCbCtx;
  10718. }
  10719. }
  10720. else {
  10721. store->userCtx = cm;
  10722. }
  10723. store->certs = args->certs;
  10724. store->totalCerts = args->totalCerts;
  10725. #if defined(HAVE_EX_DATA) && \
  10726. (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  10727. if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
  10728. != WOLFSSL_SUCCESS) {
  10729. WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
  10730. }
  10731. #endif
  10732. if (ssl != NULL) {
  10733. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  10734. store->store = SSL_STORE(ssl);
  10735. #if defined(OPENSSL_EXTRA)
  10736. store->depth = args->count;
  10737. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  10738. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  10739. heap, DYNAMIC_TYPE_OPENSSL);
  10740. if (store->param == NULL) {
  10741. #ifdef WOLFSSL_SMALL_STACK
  10742. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  10743. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10744. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  10745. #endif
  10746. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  10747. #endif
  10748. return MEMORY_E;
  10749. }
  10750. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  10751. /* Overwrite with non-default param values in SSL */
  10752. if (ssl->param) {
  10753. if (ssl->param->check_time)
  10754. store->param->check_time = ssl->param->check_time;
  10755. if (ssl->param->flags)
  10756. store->param->flags = ssl->param->flags;
  10757. if (ssl->param->hostName[0])
  10758. XMEMCPY(store->param->hostName, ssl->param->hostName,
  10759. WOLFSSL_HOST_NAME_MAX);
  10760. }
  10761. #endif /* defined(OPENSSL_EXTRA) */
  10762. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  10763. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10764. #ifdef KEEP_PEER_CERT
  10765. if (args->certIdx == 0) {
  10766. store->current_cert = &ssl->peerCert; /* use existing X509 */
  10767. }
  10768. else
  10769. #endif
  10770. {
  10771. InitX509(x509, 0, heap);
  10772. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  10773. store->current_cert = x509;
  10774. x509Free = 1;
  10775. }
  10776. else {
  10777. FreeX509(x509);
  10778. }
  10779. }
  10780. #endif
  10781. #ifdef SESSION_CERTS
  10782. store->sesChain = &ssl->session->chain;
  10783. #endif
  10784. }
  10785. #ifndef NO_WOLFSSL_CM_VERIFY
  10786. /* non-zero return code indicates failure override */
  10787. if (cm->verifyCallback != NULL) {
  10788. store->userCtx = cm;
  10789. if (cm->verifyCallback(verify_ok, store)) {
  10790. if (ret != 0) {
  10791. WOLFSSL_MSG("Verify CM callback overriding error!");
  10792. ret = 0;
  10793. }
  10794. }
  10795. else {
  10796. verifyFail = 1;
  10797. }
  10798. }
  10799. #endif
  10800. if (ssl != NULL) {
  10801. #ifdef OPENSSL_ALL
  10802. /* non-zero return code indicates failure override */
  10803. if (ssl->ctx->verifyCertCb) {
  10804. if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
  10805. if (ret != 0) {
  10806. WOLFSSL_MSG("Verify Cert callback overriding error!");
  10807. ret = 0;
  10808. }
  10809. }
  10810. else {
  10811. verifyFail = 1;
  10812. }
  10813. }
  10814. #endif
  10815. /* non-zero return code indicates failure override */
  10816. if (ssl->verifyCallback) {
  10817. if (ssl->verifyCallback(verify_ok, store)) {
  10818. if (ret != 0) {
  10819. WOLFSSL_MSG("Verify callback overriding error!");
  10820. ret = 0;
  10821. }
  10822. }
  10823. else {
  10824. verifyFail = 1;
  10825. }
  10826. }
  10827. }
  10828. if (verifyFail) {
  10829. /* induce error if one not present */
  10830. if (ret == 0) {
  10831. ret = VERIFY_CERT_ERROR;
  10832. WOLFSSL_ERROR_VERBOSE(ret);
  10833. }
  10834. /* mark as verify error */
  10835. args->verifyErr = 1;
  10836. }
  10837. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10838. if (x509Free) {
  10839. FreeX509(x509);
  10840. }
  10841. #endif
  10842. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  10843. wolfSSL_sk_X509_pop_free(store->chain, NULL);
  10844. store->chain = NULL;
  10845. #endif
  10846. #ifdef SESSION_CERTS
  10847. if ((ssl != NULL) && (store->discardSessionCerts)) {
  10848. WOLFSSL_MSG("Verify callback requested discard sess certs");
  10849. ssl->session->chain.count = 0;
  10850. #ifdef WOLFSSL_ALT_CERT_CHAINS
  10851. ssl->session->altChain.count = 0;
  10852. #endif
  10853. }
  10854. #endif /* SESSION_CERTS */
  10855. #ifdef OPENSSL_EXTRA
  10856. if ((ssl != NULL) && (store->param)) {
  10857. XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL);
  10858. }
  10859. #endif
  10860. #ifdef WOLFSSL_SMALL_STACK
  10861. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  10862. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10863. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  10864. #endif
  10865. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  10866. #endif
  10867. }
  10868. (void)heap;
  10869. return ret;
  10870. }
  10871. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  10872. {
  10873. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  10874. (void)ssl;
  10875. if (args->certs) {
  10876. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  10877. args->certs = NULL;
  10878. }
  10879. #ifdef WOLFSSL_TLS13
  10880. if (args->exts) {
  10881. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  10882. args->exts = NULL;
  10883. }
  10884. #endif
  10885. if (args->dCert) {
  10886. if (args->dCertInit) {
  10887. FreeDecodedCert(args->dCert);
  10888. args->dCertInit = 0;
  10889. }
  10890. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  10891. args->dCert = NULL;
  10892. }
  10893. }
  10894. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  10895. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  10896. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  10897. /* load certificate file which has the form <hash>.(r)N[0..N] */
  10898. /* in the folder. */
  10899. /* (r), in the case of CRL file */
  10900. /* @param store a pointer to X509_STORE structure */
  10901. /* @param issuer a pointer to X509_NAME that presents an issuer */
  10902. /* @param type X509_LU_X509 or X509_LU_CRL */
  10903. /* @return WOLFSSL_SUCCESS on successful, otherwise WOLFSSL_FAILURE */
  10904. int LoadCertByIssuer(WOLFSSL_X509_STORE* store, X509_NAME* issuer, int type)
  10905. {
  10906. const int MAX_SUFFIX = 10;/* The number comes from CA_TABLE_SIZE=10 */
  10907. int ret = WOLFSSL_SUCCESS;
  10908. WOLFSSL_X509_LOOKUP* lookup;
  10909. WOLFSSL_BY_DIR_entry* entry;
  10910. WOLFSSL_BY_DIR_HASH hash_tmp;
  10911. WOLFSSL_BY_DIR_HASH* ph = NULL;
  10912. WOLFSSL_X509* x509;
  10913. unsigned long hash = 0;
  10914. char* filename = NULL;
  10915. const char* post = "";
  10916. byte* pbuf = NULL;
  10917. int len, num, i, idx;
  10918. int suffix = 0;
  10919. int retHash = NOT_COMPILED_IN;
  10920. byte dgt[WC_MAX_DIGEST_SIZE];
  10921. WOLFSSL_ENTER("LoadCertByIssuer");
  10922. /* sanity check */
  10923. if (store == NULL || issuer == NULL || (type != X509_LU_X509 && type != X509_LU_CRL)) {
  10924. return WOLFSSL_FAILURE;
  10925. }
  10926. lookup = &store->lookup;
  10927. if (lookup->dirs == NULL || lookup->type != 1) {
  10928. return WOLFSSL_FAILURE;
  10929. }
  10930. len = wolfSSL_i2d_X509_NAME_canon(issuer, &pbuf);
  10931. if (len > 0) {
  10932. #ifndef NO_SHA
  10933. retHash = wc_ShaHash((const byte*)pbuf, len, dgt);
  10934. #endif
  10935. if (retHash == 0) {
  10936. /* 4 bytes in little endian as unsigned long */
  10937. hash = (((unsigned long)dgt[3] << 24) |
  10938. ((unsigned long)dgt[2] << 16) |
  10939. ((unsigned long)dgt[1] << 8) |
  10940. ((unsigned long)dgt[0]));
  10941. } else {
  10942. WOLFSSL_MSG("failed hash operation");
  10943. return WOLFSSL_FAILURE;
  10944. }
  10945. wolfSSL_OPENSSL_free(pbuf);
  10946. }
  10947. /* try to load each hashed name file in path */
  10948. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  10949. if (type == X509_LU_CRL) {
  10950. post = "r";
  10951. }
  10952. num = wolfSSL_sk_BY_DIR_entry_num(lookup->dirs->dir_entry);
  10953. for (i=0; i<num; i++) {
  10954. entry = wolfSSL_sk_BY_DIR_entry_value(lookup->dirs->dir_entry, i);
  10955. if (type == X509_LU_CRL && entry->hashes != NULL &&
  10956. wolfSSL_sk_BY_DIR_HASH_num(entry->hashes) > 0) {
  10957. /* lock the list */
  10958. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  10959. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  10960. return BAD_MUTEX_E;
  10961. }
  10962. hash_tmp.hash_value = hash;
  10963. idx = wolfSSL_sk_BY_DIR_HASH_find(entry->hashes, &hash_tmp);
  10964. if (idx >= 0) {
  10965. WOLFSSL_MSG("find hashed CRL in list");
  10966. ph = wolfSSL_sk_BY_DIR_HASH_value(entry->hashes, idx);
  10967. suffix = ph->last_suffix;
  10968. } else {
  10969. ph = NULL;
  10970. suffix = 0;
  10971. }
  10972. wc_UnLockMutex(&lookup->dirs->lock);
  10973. }
  10974. /* Additional buffer length for file name memory allocation : */
  10975. /* / <hashvalue>.(r)N\0 */
  10976. /*|1| 8 |1|1|1|1| => 13 */
  10977. len = (int)XSTRLEN(entry->dir_name) + 13;
  10978. if (filename != NULL) {
  10979. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  10980. }
  10981. filename = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  10982. if (filename == NULL) {
  10983. WOLFSSL_MSG("memory allocation error");
  10984. return MEMORY_E;
  10985. }
  10986. /* set as FAILURE, if successfully loading cert of CRL, this becomes */
  10987. /* WOLFSSL_SUCCESS */
  10988. ret = WOLFSSL_FAILURE;
  10989. for (; suffix < MAX_SUFFIX; suffix++) {
  10990. /* /folder-path/<hash>.(r)N[0..9] */
  10991. if (XSNPRINTF(filename, len, "%s/%08lx.%s%d", entry->dir_name,
  10992. hash, post, suffix)
  10993. >= len)
  10994. {
  10995. WOLFSSL_MSG("buffer overrun in LoadCertByIssuer");
  10996. ret = BUFFER_E;
  10997. break;
  10998. }
  10999. if(wc_FileExists(filename) == 0/*0 file exists */) {
  11000. if (type == X509_LU_X509) {
  11001. x509 = wolfSSL_X509_load_certificate_file(filename,
  11002. WOLFSSL_FILETYPE_PEM);
  11003. if (x509 != NULL) {
  11004. ret = wolfSSL_X509_STORE_add_cert(store, x509);
  11005. wolfSSL_X509_free(x509);
  11006. } else {
  11007. WOLFSSL_MSG("failed to load certificate");
  11008. ret = WOLFSSL_FAILURE;
  11009. break;
  11010. }
  11011. }
  11012. else if (type == X509_LU_CRL) {
  11013. #if defined(HAVE_CRL)
  11014. ret = wolfSSL_X509_load_crl_file(&store->lookup, filename,
  11015. WOLFSSL_FILETYPE_PEM);
  11016. if (ret != WOLFSSL_SUCCESS) {
  11017. WOLFSSL_MSG("failed to load CRL");
  11018. break;
  11019. }
  11020. #else
  11021. WOLFSSL_MSG("CRL is not supported");
  11022. ret = WOLFSSL_FAILURE;
  11023. break;
  11024. #endif /* HAVE_CRL */
  11025. }
  11026. } else
  11027. break;
  11028. }
  11029. if (ret != WOLFSSL_SUCCESS) {
  11030. WOLFSSL_MSG("not found file");
  11031. ret = WOLFSSL_FAILURE;
  11032. } else {
  11033. if (type == X509_LU_CRL) {
  11034. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  11035. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  11036. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11037. WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E);
  11038. return BAD_MUTEX_E;
  11039. }
  11040. if (ph == NULL) {
  11041. ph = wolfSSL_BY_DIR_HASH_new();
  11042. if (ph == NULL) {
  11043. WOLFSSL_MSG("failed to allocate hash stack");
  11044. ret = WOLFSSL_FAILURE;
  11045. } else {
  11046. ph->hash_value = hash;
  11047. ph->last_suffix = suffix;
  11048. ret = wolfSSL_sk_BY_DIR_HASH_push(entry->hashes, ph);
  11049. }
  11050. }
  11051. wc_UnLockMutex(&lookup->dirs->lock);
  11052. }
  11053. }
  11054. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  11055. }
  11056. #else
  11057. (void) type;
  11058. (void) ret;
  11059. (void) x509;
  11060. (void) filename;
  11061. (void) suffix;
  11062. (void) num;
  11063. (void) i;
  11064. ret = WOLFSSL_NOT_IMPLEMENTED;
  11065. #endif
  11066. WOLFSSL_LEAVE("LoadCertByIssuer", ret);
  11067. return ret;
  11068. }
  11069. #endif
  11070. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  11071. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  11072. {
  11073. int ret = 0;
  11074. buffer* cert;
  11075. byte* subjectHash = NULL;
  11076. int alreadySigner = 0;
  11077. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11078. int sigRet = 0;
  11079. #endif
  11080. if (ssl == NULL || args == NULL
  11081. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  11082. || args->dCert == NULL
  11083. #endif
  11084. ) {
  11085. return BAD_FUNC_ARG;
  11086. }
  11087. /* check to make sure certificate index is valid */
  11088. if (args->certIdx > args->count)
  11089. return BUFFER_E;
  11090. /* check if returning from non-blocking OCSP */
  11091. /* skip this section because cert is already initialized and parsed */
  11092. #ifdef WOLFSSL_NONBLOCK_OCSP
  11093. if (args->lastErr == OCSP_WANT_READ) {
  11094. args->lastErr = 0; /* clear error */
  11095. return 0;
  11096. }
  11097. #endif
  11098. #ifdef WOLFSSL_TRUST_PEER_CERT
  11099. /* we have trusted peer */
  11100. if (args->haveTrustPeer) {
  11101. return 0;
  11102. }
  11103. #endif
  11104. /* get certificate buffer */
  11105. cert = &args->certs[args->certIdx];
  11106. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11107. if (verify == VERIFY) {
  11108. /* for small cert verify, release decoded cert during signature check to
  11109. reduce peak memory usage */
  11110. if (args->dCert != NULL) {
  11111. if (args->dCertInit) {
  11112. FreeDecodedCert(args->dCert);
  11113. args->dCertInit = 0;
  11114. }
  11115. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  11116. args->dCert = NULL;
  11117. }
  11118. /* perform cert parsing and signature check */
  11119. sigRet = CheckCertSignature(cert->buffer, cert->length,
  11120. ssl->heap, SSL_CM(ssl));
  11121. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  11122. /* verify name only in ParseCertRelative below, signature check done */
  11123. verify = VERIFY_NAME;
  11124. }
  11125. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  11126. /* make sure the decoded cert structure is allocated and initialized */
  11127. if (!args->dCertInit
  11128. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11129. || args->dCert == NULL
  11130. #endif
  11131. ) {
  11132. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11133. if (args->dCert == NULL) {
  11134. args->dCert = (DecodedCert*)XMALLOC(
  11135. sizeof(DecodedCert), ssl->heap,
  11136. DYNAMIC_TYPE_DCERT);
  11137. if (args->dCert == NULL) {
  11138. return MEMORY_E;
  11139. }
  11140. }
  11141. #endif
  11142. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  11143. args->dCertInit = 1;
  11144. args->dCert->sigCtx.devId = ssl->devId;
  11145. #ifdef WOLFSSL_ASYNC_CRYPT
  11146. args->dCert->sigCtx.asyncCtx = ssl;
  11147. #endif
  11148. #ifdef HAVE_PK_CALLBACKS
  11149. /* setup the PK callback context */
  11150. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  11151. if (ret != 0)
  11152. return ret;
  11153. #endif
  11154. }
  11155. /* Parse Certificate */
  11156. ret = ParseCertRelative(args->dCert, certType, verify, SSL_CM(ssl));
  11157. /* perform below checks for date failure cases */
  11158. if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) {
  11159. /* get subject and determine if already loaded */
  11160. #ifndef NO_SKID
  11161. if (args->dCert->extAuthKeyIdSet)
  11162. subjectHash = args->dCert->extSubjKeyId;
  11163. else
  11164. #endif
  11165. subjectHash = args->dCert->subjectHash;
  11166. alreadySigner = AlreadySigner(SSL_CM(ssl), subjectHash);
  11167. }
  11168. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  11169. /* get signature check failures from above */
  11170. if (ret == 0)
  11171. ret = sigRet;
  11172. #endif
  11173. if (pSubjectHash)
  11174. *pSubjectHash = subjectHash;
  11175. if (pAlreadySigner)
  11176. *pAlreadySigner = alreadySigner;
  11177. #ifdef WOLFSSL_ASYNC_CRYPT
  11178. if (ret == WC_PENDING_E) {
  11179. ret = wolfSSL_AsyncPush(ssl,
  11180. args->dCert->sigCtx.asyncDev);
  11181. }
  11182. #endif
  11183. return ret;
  11184. }
  11185. /* Check key sizes for certs. Is redundant check since
  11186. ProcessBuffer also performs this check. */
  11187. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  11188. {
  11189. int ret = 0;
  11190. if (ssl->options.verifyNone) {
  11191. return ret;
  11192. }
  11193. switch (args->dCert->keyOID) {
  11194. #ifndef NO_RSA
  11195. #ifdef WC_RSA_PSS
  11196. case RSAPSSk:
  11197. #endif
  11198. case RSAk:
  11199. if (ssl->options.minRsaKeySz < 0 ||
  11200. args->dCert->pubKeySize <
  11201. (word16)ssl->options.minRsaKeySz) {
  11202. WOLFSSL_MSG(
  11203. "RSA key size in cert chain error");
  11204. ret = RSA_KEY_SIZE_E;
  11205. WOLFSSL_ERROR_VERBOSE(ret);
  11206. }
  11207. break;
  11208. #endif /* !NO_RSA */
  11209. #ifdef HAVE_ECC
  11210. case ECDSAk:
  11211. if (ssl->options.minEccKeySz < 0 ||
  11212. args->dCert->pubKeySize <
  11213. (word16)ssl->options.minEccKeySz) {
  11214. WOLFSSL_MSG(
  11215. "ECC key size in cert chain error");
  11216. ret = ECC_KEY_SIZE_E;
  11217. WOLFSSL_ERROR_VERBOSE(ret);
  11218. }
  11219. break;
  11220. #endif /* HAVE_ECC */
  11221. #ifdef HAVE_ED25519
  11222. case ED25519k:
  11223. if (ssl->options.minEccKeySz < 0 ||
  11224. ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  11225. WOLFSSL_MSG(
  11226. "ECC key size in cert chain error");
  11227. ret = ECC_KEY_SIZE_E;
  11228. WOLFSSL_ERROR_VERBOSE(ret);
  11229. }
  11230. break;
  11231. #endif /* HAVE_ED25519 */
  11232. #ifdef HAVE_ED448
  11233. case ED448k:
  11234. if (ssl->options.minEccKeySz < 0 ||
  11235. ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  11236. WOLFSSL_MSG(
  11237. "ECC key size in cert chain error");
  11238. ret = ECC_KEY_SIZE_E;
  11239. WOLFSSL_ERROR_VERBOSE(ret);
  11240. }
  11241. break;
  11242. #endif /* HAVE_ED448 */
  11243. #if defined(HAVE_PQC)
  11244. #if defined(HAVE_FALCON)
  11245. case FALCON_LEVEL1k:
  11246. if (ssl->options.minFalconKeySz < 0 ||
  11247. FALCON_LEVEL1_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  11248. WOLFSSL_MSG("Falcon key size in cert chain error");
  11249. ret = FALCON_KEY_SIZE_E;
  11250. WOLFSSL_ERROR_VERBOSE(ret);
  11251. }
  11252. break;
  11253. case FALCON_LEVEL5k:
  11254. if (ssl->options.minFalconKeySz < 0 ||
  11255. FALCON_LEVEL5_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  11256. WOLFSSL_MSG("Falcon key size in cert chain error");
  11257. ret = FALCON_KEY_SIZE_E;
  11258. WOLFSSL_ERROR_VERBOSE(ret);
  11259. }
  11260. break;
  11261. #endif /* HAVE_FALCON */
  11262. #endif /* HAVE_PQC */
  11263. #if defined(HAVE_DILITHIUM)
  11264. case DILITHIUM_LEVEL2k:
  11265. case DILITHIUM_AES_LEVEL2k:
  11266. if (ssl->options.minDilithiumKeySz < 0 ||
  11267. DILITHIUM_LEVEL2_KEY_SIZE
  11268. < (word16)ssl->options.minDilithiumKeySz) {
  11269. WOLFSSL_MSG("Dilithium key size in cert chain error");
  11270. ret = DILITHIUM_KEY_SIZE_E;
  11271. }
  11272. break;
  11273. case DILITHIUM_LEVEL3k:
  11274. case DILITHIUM_AES_LEVEL3k:
  11275. if (ssl->options.minDilithiumKeySz < 0 ||
  11276. DILITHIUM_LEVEL3_KEY_SIZE
  11277. < (word16)ssl->options.minDilithiumKeySz) {
  11278. WOLFSSL_MSG( "Dilithium key size in cert chain error");
  11279. ret = DILITHIUM_KEY_SIZE_E;
  11280. }
  11281. break;
  11282. case DILITHIUM_LEVEL5k:
  11283. case DILITHIUM_AES_LEVEL5k:
  11284. if (ssl->options.minDilithiumKeySz < 0 ||
  11285. DILITHIUM_LEVEL5_KEY_SIZE
  11286. < (word16)ssl->options.minDilithiumKeySz) {
  11287. WOLFSSL_MSG("Dilithium key size in cert chain error");
  11288. ret = DILITHIUM_KEY_SIZE_E;
  11289. }
  11290. break;
  11291. #endif /* HAVE_DILITHIUM */
  11292. default:
  11293. WOLFSSL_MSG("Key size not checked");
  11294. /* key not being checked for size if not in
  11295. switch */
  11296. break;
  11297. }
  11298. return ret;
  11299. }
  11300. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11301. word32 totalSz)
  11302. {
  11303. int ret = 0;
  11304. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11305. ProcPeerCertArgs* args = NULL;
  11306. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  11307. #elif defined(WOLFSSL_SMALL_STACK)
  11308. ProcPeerCertArgs* args = NULL;
  11309. #else
  11310. ProcPeerCertArgs args[1];
  11311. #endif
  11312. byte* subjectHash = NULL;
  11313. int alreadySigner = 0;
  11314. WOLFSSL_ENTER("ProcessPeerCerts");
  11315. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11316. if (ssl->async == NULL) {
  11317. ssl->async = (struct WOLFSSL_ASYNC*)
  11318. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  11319. DYNAMIC_TYPE_ASYNC);
  11320. if (ssl->async == NULL)
  11321. ERROR_OUT(MEMORY_E, exit_ppc);
  11322. }
  11323. args = (ProcPeerCertArgs*)ssl->async->args;
  11324. #ifdef WOLFSSL_ASYNC_CRYPT
  11325. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  11326. if (ret != WC_NOT_PENDING_E) {
  11327. /* Check for error */
  11328. if (ret < 0)
  11329. goto exit_ppc;
  11330. }
  11331. else
  11332. #endif
  11333. #ifdef WOLFSSL_NONBLOCK_OCSP
  11334. if (ssl->error == OCSP_WANT_READ) {
  11335. /* Re-entry after non-blocking OCSP */
  11336. }
  11337. else
  11338. #endif
  11339. #elif defined(WOLFSSL_SMALL_STACK)
  11340. args = (ProcPeerCertArgs*)XMALLOC(
  11341. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11342. if (args == NULL) {
  11343. ERROR_OUT(MEMORY_E, exit_ppc);
  11344. }
  11345. #endif
  11346. {
  11347. /* Reset state */
  11348. ret = 0;
  11349. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  11350. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  11351. args->idx = *inOutIdx;
  11352. args->begin = *inOutIdx;
  11353. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11354. ssl->async->freeArgs = FreeProcPeerCertArgs;
  11355. #endif
  11356. }
  11357. switch (ssl->options.asyncState)
  11358. {
  11359. case TLS_ASYNC_BEGIN:
  11360. {
  11361. word32 listSz;
  11362. #ifdef WOLFSSL_CALLBACKS
  11363. if (ssl->hsInfoOn)
  11364. AddPacketName(ssl, "Certificate");
  11365. if (ssl->toInfoOn)
  11366. AddLateName("Certificate", &ssl->timeoutInfo);
  11367. #endif
  11368. #ifdef WOLFSSL_TLS13
  11369. if (ssl->options.tls1_3) {
  11370. byte ctxSz;
  11371. /* Certificate Request Context */
  11372. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  11373. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11374. ctxSz = *(input + args->idx);
  11375. args->idx++;
  11376. if ((args->idx - args->begin) + ctxSz > totalSz)
  11377. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11378. #ifndef NO_WOLFSSL_CLIENT
  11379. /* Must be empty when received from server. */
  11380. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11381. if (ctxSz != 0) {
  11382. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  11383. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  11384. }
  11385. }
  11386. #endif
  11387. #ifndef NO_WOLFSSL_SERVER
  11388. /* Must contain value sent in request. */
  11389. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11390. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  11391. ctxSz != 0) {
  11392. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  11393. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  11394. }
  11395. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  11396. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  11397. CertReqCtx* curr = ssl->certReqCtx;
  11398. CertReqCtx* prev = NULL;
  11399. while (curr != NULL) {
  11400. if ((ctxSz == curr->len) &&
  11401. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  11402. == 0) {
  11403. if (prev != NULL)
  11404. prev->next = curr->next;
  11405. else
  11406. ssl->certReqCtx = curr->next;
  11407. XFREE(curr, ssl->heap,
  11408. DYNAMIC_TYPE_TMP_BUFFER);
  11409. break;
  11410. }
  11411. prev = curr;
  11412. curr = curr->next;
  11413. }
  11414. if (curr == NULL)
  11415. #endif
  11416. {
  11417. WOLFSSL_ERROR_VERBOSE(INVALID_CERT_CTX_E);
  11418. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  11419. }
  11420. }
  11421. }
  11422. #endif
  11423. args->idx += ctxSz;
  11424. /* allocate buffer for cert extensions */
  11425. args->exts = (buffer*)XMALLOC(sizeof(buffer) *
  11426. MAX_CHAIN_DEPTH, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  11427. if (args->exts == NULL) {
  11428. ERROR_OUT(MEMORY_E, exit_ppc);
  11429. }
  11430. }
  11431. #endif
  11432. /* allocate buffer for certs */
  11433. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  11434. ssl->heap, DYNAMIC_TYPE_DER);
  11435. if (args->certs == NULL) {
  11436. ERROR_OUT(MEMORY_E, exit_ppc);
  11437. }
  11438. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  11439. /* Certificate List */
  11440. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  11441. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11442. }
  11443. c24to32(input + args->idx, &listSz);
  11444. args->idx += OPAQUE24_LEN;
  11445. if (listSz > MAX_CERTIFICATE_SZ) {
  11446. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11447. }
  11448. if ((args->idx - args->begin) + listSz != totalSz) {
  11449. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11450. }
  11451. WOLFSSL_MSG("Loading peer's cert chain");
  11452. /* first put cert chain into buffer so can verify top down
  11453. we're sent bottom up */
  11454. while (listSz) {
  11455. word32 certSz;
  11456. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11457. if (args->totalCerts >= MAX_CHAIN_DEPTH) {
  11458. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11459. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  11460. ret = MAX_CHAIN_ERROR;
  11461. WOLFSSL_ERROR_VERBOSE(ret);
  11462. WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
  11463. break; /* break out to avoid reading more certs then buffer
  11464. * can hold */
  11465. }
  11466. #else
  11467. if (args->totalCerts >= ssl->verifyDepth ||
  11468. args->totalCerts >= MAX_CHAIN_DEPTH) {
  11469. WOLFSSL_ERROR_VERBOSE(MAX_CHAIN_ERROR);
  11470. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  11471. }
  11472. #endif
  11473. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  11474. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11475. }
  11476. c24to32(input + args->idx, &certSz);
  11477. args->idx += OPAQUE24_LEN;
  11478. if ((args->idx - args->begin) + certSz > totalSz) {
  11479. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11480. }
  11481. args->certs[args->totalCerts].length = certSz;
  11482. args->certs[args->totalCerts].buffer = input + args->idx;
  11483. #ifdef SESSION_CERTS
  11484. AddSessionCertToChain(&ssl->session->chain,
  11485. input + args->idx, certSz);
  11486. #endif /* SESSION_CERTS */
  11487. args->idx += certSz;
  11488. listSz -= certSz + CERT_HEADER_SZ;
  11489. #ifdef WOLFSSL_TLS13
  11490. /* Extensions */
  11491. if (ssl->options.tls1_3) {
  11492. word16 extSz;
  11493. if (args->exts == NULL) {
  11494. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11495. }
  11496. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  11497. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11498. }
  11499. ato16(input + args->idx, &extSz);
  11500. args->idx += OPAQUE16_LEN;
  11501. if ((args->idx - args->begin) + extSz > totalSz) {
  11502. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  11503. }
  11504. /* Store extension data info for later processing. */
  11505. args->exts[args->totalCerts].length = extSz;
  11506. args->exts[args->totalCerts].buffer = input + args->idx;
  11507. args->idx += extSz;
  11508. listSz -= extSz + OPAQUE16_LEN;
  11509. WOLFSSL_MSG_EX("\tParsing %d bytes of cert extensions",
  11510. args->exts[args->totalCerts].length);
  11511. #if !defined(NO_TLS)
  11512. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  11513. (word16)args->exts[args->totalCerts].length,
  11514. certificate, NULL);
  11515. #endif /* !NO_TLS */
  11516. if (ret < 0) {
  11517. WOLFSSL_ERROR_VERBOSE(ret);
  11518. ERROR_OUT(ret, exit_ppc);
  11519. }
  11520. }
  11521. #endif
  11522. args->totalCerts++;
  11523. WOLFSSL_MSG("\tPut another cert into chain");
  11524. } /* while (listSz) */
  11525. args->count = args->totalCerts;
  11526. args->certIdx = 0; /* select peer cert (first one) */
  11527. if (args->count == 0) {
  11528. /* Empty certificate message. */
  11529. if ((ssl->options.side == WOLFSSL_SERVER_END) &&
  11530. (ssl->options.mutualAuth || (ssl->options.failNoCert &&
  11531. IsAtLeastTLSv1_3(ssl->version)))) {
  11532. WOLFSSL_MSG("No peer cert from Client");
  11533. ret = NO_PEER_CERT;
  11534. WOLFSSL_ERROR_VERBOSE(ret);
  11535. DoCertFatalAlert(ssl, ret);
  11536. }
  11537. else if ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  11538. IsAtLeastTLSv1_3(ssl->version)) {
  11539. WOLFSSL_MSG("No peer cert from Server");
  11540. ret = NO_PEER_CERT;
  11541. WOLFSSL_ERROR_VERBOSE(ret);
  11542. SendAlert(ssl, alert_fatal, decode_error);
  11543. }
  11544. }
  11545. args->dCertInit = 0;
  11546. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  11547. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  11548. DYNAMIC_TYPE_DCERT);
  11549. if (args->dCert == NULL) {
  11550. ERROR_OUT(MEMORY_E, exit_ppc);
  11551. }
  11552. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  11553. #endif
  11554. /* Advance state and proceed */
  11555. ssl->options.asyncState = TLS_ASYNC_BUILD;
  11556. } /* case TLS_ASYNC_BEGIN */
  11557. FALL_THROUGH;
  11558. case TLS_ASYNC_BUILD:
  11559. {
  11560. if (args->count > 0) {
  11561. /* check for trusted peer and get untrustedDepth */
  11562. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  11563. if (args->certIdx == 0) {
  11564. #ifdef WOLFSSL_TRUST_PEER_CERT
  11565. TrustedPeerCert* tp;
  11566. #endif
  11567. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  11568. &subjectHash, &alreadySigner);
  11569. if (ret != 0)
  11570. goto exit_ppc;
  11571. #ifdef OPENSSL_EXTRA
  11572. /* Determine untrusted depth */
  11573. if (!alreadySigner && (!args->dCert ||
  11574. !args->dCertInit || !args->dCert->selfSigned)) {
  11575. args->untrustedDepth = 1;
  11576. }
  11577. #endif
  11578. #ifdef WOLFSSL_TRUST_PEER_CERT
  11579. tp = GetTrustedPeer(SSL_CM(ssl), args->dCert);
  11580. WOLFSSL_MSG("Checking for trusted peer cert");
  11581. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  11582. WOLFSSL_MSG("Found matching trusted peer cert");
  11583. args->haveTrustPeer = 1;
  11584. }
  11585. else if (tp == NULL) {
  11586. /* no trusted peer cert */
  11587. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  11588. }
  11589. else {
  11590. WOLFSSL_MSG("Trusted peer cert did not match!");
  11591. }
  11592. if (!args->haveTrustPeer)
  11593. #endif
  11594. {
  11595. /* free cert if not trusted peer */
  11596. FreeDecodedCert(args->dCert);
  11597. args->dCertInit = 0;
  11598. }
  11599. }
  11600. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  11601. /* check certificate up to peer's first */
  11602. /* do not verify chain if trusted peer cert found */
  11603. while (args->count > 1
  11604. #ifdef WOLFSSL_TRUST_PEER_CERT
  11605. && !args->haveTrustPeer
  11606. #endif /* WOLFSSL_TRUST_PEER_CERT */
  11607. ) {
  11608. int skipAddCA = 0;
  11609. /* select last certificate */
  11610. args->certIdx = args->count - 1;
  11611. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  11612. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  11613. &subjectHash, &alreadySigner);
  11614. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  11615. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  11616. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11617. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  11618. WOLFSSL_MSG("try to load certificate if hash dir is set");
  11619. ret = LoadCertByIssuer(SSL_STORE(ssl),
  11620. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  11621. X509_LU_X509);
  11622. if (ret == WOLFSSL_SUCCESS) {
  11623. FreeDecodedCert(args->dCert);
  11624. args->dCertInit = 0;
  11625. /* once again */
  11626. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  11627. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  11628. &subjectHash, &alreadySigner);
  11629. }
  11630. else {
  11631. ret = ASN_NO_SIGNER_E;
  11632. WOLFSSL_ERROR_VERBOSE(ret);
  11633. }
  11634. }
  11635. #endif
  11636. #ifdef WOLFSSL_ASYNC_CRYPT
  11637. if (ret == WC_PENDING_E)
  11638. goto exit_ppc;
  11639. #endif
  11640. if (ret == 0) {
  11641. ret = ProcessPeerCertCheckKey(ssl, args);
  11642. }
  11643. if (ret == 0 && args->dCert->isCA == 0) {
  11644. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  11645. }
  11646. else if (ret == 0 && ssl->options.verifyNone) {
  11647. WOLFSSL_MSG("Chain cert not verified by option, "
  11648. "not adding as CA");
  11649. }
  11650. else if (ret == 0) {
  11651. #ifdef OPENSSL_EXTRA
  11652. if (args->certIdx > args->untrustedDepth) {
  11653. args->untrustedDepth = (char)args->certIdx + 1;
  11654. }
  11655. #endif
  11656. if (alreadySigner) {
  11657. WOLFSSL_MSG("Verified CA from chain and already had it");
  11658. }
  11659. }
  11660. else {
  11661. WOLFSSL_MSG("Failed to verify CA from chain");
  11662. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11663. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11664. ssl->peerVerifyRet = X509_V_ERR_INVALID_CA;
  11665. #endif
  11666. }
  11667. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  11668. if (ret == 0) {
  11669. int doCrlLookup = 1;
  11670. #ifdef HAVE_OCSP
  11671. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  11672. if (ssl->status_request_v2) {
  11673. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  11674. args->dCert, 0, ssl->heap);
  11675. }
  11676. else /* skips OCSP and force CRL check */
  11677. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  11678. if (SSL_CM(ssl)->ocspEnabled &&
  11679. SSL_CM(ssl)->ocspCheckAll) {
  11680. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  11681. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  11682. args->dCert, NULL, ssl);
  11683. #ifdef WOLFSSL_NONBLOCK_OCSP
  11684. if (ret == OCSP_WANT_READ) {
  11685. args->lastErr = ret;
  11686. goto exit_ppc;
  11687. }
  11688. #endif
  11689. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  11690. if (ret != 0) {
  11691. doCrlLookup = 0;
  11692. WOLFSSL_ERROR_VERBOSE(ret);
  11693. WOLFSSL_MSG("\tOCSP Lookup not ok");
  11694. }
  11695. }
  11696. #endif /* HAVE_OCSP */
  11697. #ifdef HAVE_CRL
  11698. if (ret == 0 && doCrlLookup &&
  11699. SSL_CM(ssl)->crlEnabled &&
  11700. SSL_CM(ssl)->crlCheckAll) {
  11701. WOLFSSL_MSG("Doing Non Leaf CRL check");
  11702. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  11703. #ifdef WOLFSSL_NONBLOCK_OCSP
  11704. if (ret == OCSP_WANT_READ) {
  11705. args->lastErr = ret;
  11706. goto exit_ppc;
  11707. }
  11708. #endif
  11709. if (ret != 0) {
  11710. WOLFSSL_ERROR_VERBOSE(ret);
  11711. WOLFSSL_MSG("\tCRL check not ok");
  11712. }
  11713. }
  11714. #endif /* HAVE_CRL */
  11715. (void)doCrlLookup;
  11716. }
  11717. #endif /* HAVE_OCSP || HAVE_CRL */
  11718. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11719. if (ret == 0 &&
  11720. /* extend the limit "+1" until reaching
  11721. * an ultimately trusted issuer.*/
  11722. args->count > (ssl->verifyDepth + 1)) {
  11723. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11724. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  11725. ret = MAX_CHAIN_ERROR;
  11726. WOLFSSL_ERROR_VERBOSE(ret);
  11727. }
  11728. #endif
  11729. #ifdef WOLFSSL_ALT_CERT_CHAINS
  11730. /* For alternate cert chain, its okay for a CA cert to fail
  11731. with ASN_NO_SIGNER_E here. The "alternate" certificate
  11732. chain mode only requires that the peer certificate
  11733. validate to a trusted CA */
  11734. if (ret != 0 && args->dCert->isCA) {
  11735. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  11736. if (!ssl->options.usingAltCertChain) {
  11737. WOLFSSL_MSG("Trying alternate cert chain");
  11738. ssl->options.usingAltCertChain = 1;
  11739. }
  11740. ret = 0; /* clear errors and continue */
  11741. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11742. ssl->peerVerifyRet = 0;
  11743. #endif
  11744. args->verifyErr = 0;
  11745. }
  11746. /* do not add to certificate manager */
  11747. skipAddCA = 1;
  11748. }
  11749. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  11750. /* Do verify callback */
  11751. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  11752. if (ssl->options.verifyNone &&
  11753. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  11754. ret == CRL_CERT_DATE_ERR)) {
  11755. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  11756. ret = ssl->error = 0;
  11757. }
  11758. /* If valid CA then add to Certificate Manager */
  11759. if (ret == 0 && args->dCert->isCA &&
  11760. !ssl->options.verifyNone && !skipAddCA) {
  11761. buffer* cert = &args->certs[args->certIdx];
  11762. /* Is valid CA */
  11763. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  11764. /* if using alternate chain, store the cert used */
  11765. if (ssl->options.usingAltCertChain) {
  11766. AddSessionCertToChain(&ssl->session->altChain,
  11767. cert->buffer, cert->length);
  11768. }
  11769. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  11770. if (!alreadySigner) {
  11771. DerBuffer* add = NULL;
  11772. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  11773. if (ret < 0)
  11774. goto exit_ppc;
  11775. XMEMCPY(add->buffer, cert->buffer, cert->length);
  11776. /* CA already verified above in ParseCertRelative */
  11777. WOLFSSL_MSG("Adding CA from chain");
  11778. ret = AddCA(SSL_CM(ssl), &add, WOLFSSL_CHAIN_CA,
  11779. NO_VERIFY);
  11780. if (ret == WOLFSSL_SUCCESS) {
  11781. ret = 0;
  11782. }
  11783. }
  11784. }
  11785. /* Handle error codes */
  11786. if (ret != 0) {
  11787. if (!ssl->options.verifyNone) {
  11788. WOLFSSL_ERROR_VERBOSE(ret);
  11789. DoCertFatalAlert(ssl, ret);
  11790. }
  11791. ssl->error = ret; /* Report SSL error */
  11792. if (args->lastErr == 0) {
  11793. args->lastErr = ret; /* save error from last time */
  11794. ret = 0; /* reset error */
  11795. }
  11796. }
  11797. FreeDecodedCert(args->dCert);
  11798. args->dCertInit = 0;
  11799. args->count--;
  11800. } /* while (count > 0 && !args->haveTrustPeer) */
  11801. } /* if (count > 0) */
  11802. /* Check for error */
  11803. if (ret != 0) {
  11804. goto exit_ppc;
  11805. }
  11806. /* Advance state and proceed */
  11807. ssl->options.asyncState = TLS_ASYNC_DO;
  11808. } /* case TLS_ASYNC_BUILD */
  11809. FALL_THROUGH;
  11810. case TLS_ASYNC_DO:
  11811. {
  11812. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  11813. if (args->count > 0) {
  11814. WOLFSSL_MSG("Verifying Peer's cert");
  11815. /* select peer cert (first one) */
  11816. args->certIdx = 0;
  11817. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  11818. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  11819. &subjectHash, &alreadySigner);
  11820. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  11821. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  11822. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11823. if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) {
  11824. WOLFSSL_MSG("try to load certificate if hash dir is set");
  11825. ret = LoadCertByIssuer(SSL_STORE(ssl),
  11826. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  11827. X509_LU_X509);
  11828. if (ret == WOLFSSL_SUCCESS) {
  11829. FreeDecodedCert(args->dCert);
  11830. args->dCertInit = 0;
  11831. /* once again */
  11832. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  11833. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  11834. &subjectHash, &alreadySigner);
  11835. }
  11836. else {
  11837. ret = ASN_NO_SIGNER_E;
  11838. WOLFSSL_ERROR_VERBOSE(ret);
  11839. }
  11840. }
  11841. #endif
  11842. #ifdef WOLFSSL_ASYNC_CRYPT
  11843. if (ret == WC_PENDING_E)
  11844. goto exit_ppc;
  11845. #endif
  11846. if (ret == 0) {
  11847. WOLFSSL_MSG("Verified Peer's cert");
  11848. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11849. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11850. ssl->peerVerifyRet = X509_V_OK;
  11851. #endif
  11852. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  11853. /* if using alternate chain, store the cert used */
  11854. if (ssl->options.usingAltCertChain) {
  11855. buffer* cert = &args->certs[args->certIdx];
  11856. AddSessionCertToChain(&ssl->session->altChain,
  11857. cert->buffer, cert->length);
  11858. }
  11859. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  11860. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  11861. /* Check peer's certificate version number. TLS 1.2 / 1.3
  11862. * requires the clients certificate be version 3 unless a
  11863. * different version has been negotiated using RFC 7250.
  11864. * OpenSSL doesn't appear to be performing this check.
  11865. * For TLS 1.3 see RFC8446 Section 4.4.2.3 */
  11866. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11867. if (args->dCert->version != WOLFSSL_X509_V3) {
  11868. WOLFSSL_MSG("Peers certificate was not version 3!");
  11869. args->lastErr = ASN_VERSION_E;
  11870. /* setting last error but not considering it fatal
  11871. * giving the user a chance to override */
  11872. }
  11873. }
  11874. #endif
  11875. /* check if fatal error */
  11876. if (args->verifyErr) {
  11877. args->fatal = 1;
  11878. ret = args->lastErr;
  11879. }
  11880. else {
  11881. args->fatal = 0;
  11882. }
  11883. }
  11884. else if (ret == ASN_PARSE_E || ret == BUFFER_E) {
  11885. WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR");
  11886. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
  11887. defined(OPENSSL_EXTRA_X509_SMALL)
  11888. DoCertFatalAlert(ssl, ret);
  11889. #endif
  11890. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11891. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11892. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  11893. #endif
  11894. args->fatal = 1;
  11895. }
  11896. else {
  11897. WOLFSSL_MSG("Failed to verify Peer's cert");
  11898. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11899. if (ssl->peerVerifyRet == 0) { /* Return first cert error here */
  11900. if (ret == ASN_BEFORE_DATE_E) {
  11901. ssl->peerVerifyRet =
  11902. (unsigned long)X509_V_ERR_CERT_NOT_YET_VALID;
  11903. }
  11904. else if (ret == ASN_AFTER_DATE_E) {
  11905. ssl->peerVerifyRet =
  11906. (unsigned long)X509_V_ERR_CERT_HAS_EXPIRED;
  11907. }
  11908. else {
  11909. ssl->peerVerifyRet =
  11910. (unsigned long)
  11911. X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  11912. }
  11913. }
  11914. #endif
  11915. if (ssl->verifyCallback) {
  11916. WOLFSSL_MSG(
  11917. "\tCallback override available, will continue");
  11918. /* check if fatal error */
  11919. args->fatal = (args->verifyErr) ? 1 : 0;
  11920. if (args->fatal)
  11921. DoCertFatalAlert(ssl, ret);
  11922. }
  11923. else {
  11924. WOLFSSL_MSG("\tNo callback override available, fatal");
  11925. args->fatal = 1;
  11926. DoCertFatalAlert(ssl, ret);
  11927. }
  11928. }
  11929. #ifdef HAVE_SECURE_RENEGOTIATION
  11930. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  11931. && ssl->secure_renegotiation
  11932. && ssl->secure_renegotiation->enabled) {
  11933. if (IsEncryptionOn(ssl, 0)) {
  11934. /* compare against previous time */
  11935. if (ssl->secure_renegotiation->subject_hash_set) {
  11936. if (XMEMCMP(args->dCert->subjectHash,
  11937. ssl->secure_renegotiation->subject_hash,
  11938. KEYID_SIZE) != 0) {
  11939. WOLFSSL_MSG(
  11940. "Peer sent different cert during scr, fatal");
  11941. args->fatal = 1;
  11942. ret = SCR_DIFFERENT_CERT_E;
  11943. WOLFSSL_ERROR_VERBOSE(ret);
  11944. }
  11945. }
  11946. }
  11947. /* cache peer's hash */
  11948. if (args->fatal == 0) {
  11949. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  11950. args->dCert->subjectHash, KEYID_SIZE);
  11951. ssl->secure_renegotiation->subject_hash_set = 1;
  11952. }
  11953. }
  11954. #endif /* HAVE_SECURE_RENEGOTIATION */
  11955. } /* if (count > 0) */
  11956. /* Check for error */
  11957. if (args->fatal && ret != 0) {
  11958. goto exit_ppc;
  11959. }
  11960. /* Advance state and proceed */
  11961. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  11962. } /* case TLS_ASYNC_DO */
  11963. FALL_THROUGH;
  11964. case TLS_ASYNC_VERIFY:
  11965. {
  11966. if (args->count > 0) {
  11967. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  11968. /* only attempt to check OCSP or CRL if not previous error such
  11969. * as ASN_BEFORE_DATE_E or ASN_AFTER_DATE_E */
  11970. if (args->fatal == 0 && ret == 0) {
  11971. int doLookup = 1;
  11972. WOLFSSL_MSG("Checking if ocsp needed");
  11973. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11974. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  11975. if (ssl->status_request) {
  11976. args->fatal = (TLSX_CSR_InitRequest(ssl->extensions,
  11977. args->dCert, ssl->heap) != 0);
  11978. doLookup = 0;
  11979. WOLFSSL_MSG("\tHave status request");
  11980. #if defined(WOLFSSL_TLS13)
  11981. if (ssl->options.tls1_3) {
  11982. TLSX* ext = TLSX_Find(ssl->extensions,
  11983. TLSX_STATUS_REQUEST);
  11984. if (ext != NULL) {
  11985. word32 idx = 0;
  11986. CertificateStatusRequest* csr =
  11987. (CertificateStatusRequest*)ext->data;
  11988. ret = ProcessCSR(ssl, csr->response.buffer,
  11989. &idx, csr->response.length);
  11990. if (ret < 0) {
  11991. WOLFSSL_ERROR_VERBOSE(ret);
  11992. goto exit_ppc;
  11993. }
  11994. }
  11995. }
  11996. #endif
  11997. }
  11998. /* Ensure a stapling response was seen */
  11999. else if (ssl->options.tls1_3 &&
  12000. SSL_CM(ssl)->ocspMustStaple) {
  12001. ret = OCSP_CERT_UNKNOWN;
  12002. goto exit_ppc;
  12003. }
  12004. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  12005. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  12006. if (ssl->status_request_v2) {
  12007. args->fatal = (TLSX_CSR2_InitRequests(ssl->extensions,
  12008. args->dCert, 1, ssl->heap) != 0);
  12009. doLookup = 0;
  12010. WOLFSSL_MSG("\tHave status request v2");
  12011. }
  12012. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  12013. }
  12014. #ifdef HAVE_OCSP
  12015. if (doLookup && SSL_CM(ssl)->ocspEnabled) {
  12016. WOLFSSL_MSG("Doing Leaf OCSP check");
  12017. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  12018. args->dCert, NULL, ssl);
  12019. #ifdef WOLFSSL_NONBLOCK_OCSP
  12020. if (ret == OCSP_WANT_READ) {
  12021. goto exit_ppc;
  12022. }
  12023. #endif
  12024. doLookup = (ret == OCSP_CERT_UNKNOWN);
  12025. if (ret != 0) {
  12026. WOLFSSL_MSG("\tOCSP Lookup not ok");
  12027. args->fatal = 0;
  12028. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12029. if (ssl->peerVerifyRet == 0) {
  12030. /* Return first cert error here */
  12031. ssl->peerVerifyRet =
  12032. ret == OCSP_CERT_REVOKED
  12033. ? X509_V_ERR_CERT_REVOKED
  12034. : X509_V_ERR_CERT_REJECTED;
  12035. }
  12036. #endif
  12037. }
  12038. }
  12039. #endif /* HAVE_OCSP */
  12040. #ifdef HAVE_CRL
  12041. if (ret == 0 && doLookup && SSL_CM(ssl)->crlEnabled) {
  12042. WOLFSSL_MSG("Doing Leaf CRL check");
  12043. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  12044. #ifdef WOLFSSL_NONBLOCK_OCSP
  12045. if (ret == OCSP_WANT_READ) {
  12046. goto exit_ppc;
  12047. }
  12048. #endif
  12049. if (ret != 0) {
  12050. WOLFSSL_MSG("\tCRL check not ok");
  12051. args->fatal = 0;
  12052. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12053. if (ssl->peerVerifyRet == 0) {
  12054. /* Return first cert error here */
  12055. ssl->peerVerifyRet =
  12056. ret == CRL_CERT_REVOKED
  12057. ? X509_V_ERR_CERT_REVOKED
  12058. : X509_V_ERR_CERT_REJECTED;;
  12059. }
  12060. #endif
  12061. }
  12062. }
  12063. #endif /* HAVE_CRL */
  12064. (void)doLookup;
  12065. }
  12066. #endif /* HAVE_OCSP || HAVE_CRL */
  12067. #ifdef KEEP_PEER_CERT
  12068. if (args->fatal == 0) {
  12069. int copyRet = 0;
  12070. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  12071. if (ssl->options.handShakeDone) {
  12072. FreeX509(&ssl->peerCert);
  12073. InitX509(&ssl->peerCert, 0, ssl->heap);
  12074. }
  12075. else
  12076. #endif
  12077. #ifdef HAVE_SECURE_RENEGOTIATION
  12078. if (ssl->secure_renegotiation &&
  12079. ssl->secure_renegotiation->enabled) {
  12080. /* free old peer cert */
  12081. FreeX509(&ssl->peerCert);
  12082. InitX509(&ssl->peerCert, 0, ssl->heap);
  12083. }
  12084. else
  12085. #endif
  12086. {
  12087. }
  12088. /* set X509 format for peer cert */
  12089. copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
  12090. if (copyRet == MEMORY_E) {
  12091. args->fatal = 1;
  12092. }
  12093. }
  12094. #endif /* KEEP_PEER_CERT */
  12095. #ifndef IGNORE_KEY_EXTENSIONS
  12096. #if defined(OPENSSL_EXTRA)
  12097. /* when compatibility layer is turned on and no verify is
  12098. * set then ignore the certificate key extension */
  12099. if (args->dCert->extKeyUsageSet &&
  12100. args->dCert->extKeyUsageCrit == 0 &&
  12101. ssl->options.verifyNone) {
  12102. WOLFSSL_MSG("Not verifying certificate key usage");
  12103. }
  12104. else
  12105. #endif
  12106. if (args->dCert->extKeyUsageSet) {
  12107. if ((ssl->specs.kea == rsa_kea) &&
  12108. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  12109. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  12110. ret = KEYUSE_ENCIPHER_E;
  12111. WOLFSSL_ERROR_VERBOSE(ret);
  12112. }
  12113. if ((ssl->specs.kea != rsa_kea) &&
  12114. (ssl->specs.sig_algo == rsa_sa_algo ||
  12115. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  12116. !ssl->specs.static_ecdh)) &&
  12117. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  12118. WOLFSSL_MSG("KeyUse Digital Sig not set");
  12119. ret = KEYUSE_SIGNATURE_E;
  12120. WOLFSSL_ERROR_VERBOSE(ret);
  12121. }
  12122. }
  12123. #if defined(OPENSSL_EXTRA)
  12124. /* when compatibility layer is turned on and no verify is
  12125. * set then ignore the certificate key extension */
  12126. if (args->dCert->extExtKeyUsageSet &&
  12127. args->dCert->extExtKeyUsageCrit == 0 &&
  12128. ssl->options.verifyNone) {
  12129. WOLFSSL_MSG("Not verifying certificate ext key usage");
  12130. }
  12131. else
  12132. #endif
  12133. if (args->dCert->extExtKeyUsageSet) {
  12134. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12135. if ((args->dCert->extExtKeyUsage &
  12136. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  12137. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  12138. ret = EXTKEYUSE_AUTH_E;
  12139. WOLFSSL_ERROR_VERBOSE(ret);
  12140. }
  12141. }
  12142. else {
  12143. if ((args->dCert->extExtKeyUsage &
  12144. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  12145. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  12146. ret = EXTKEYUSE_AUTH_E;
  12147. WOLFSSL_ERROR_VERBOSE(ret);
  12148. }
  12149. }
  12150. }
  12151. #endif /* IGNORE_KEY_EXTENSIONS */
  12152. if (args->fatal) {
  12153. ssl->error = ret;
  12154. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12155. SendAlert(ssl, alert_fatal, bad_certificate);
  12156. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12157. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  12158. #endif
  12159. goto exit_ppc;
  12160. }
  12161. /* Certificate validated and stored. */
  12162. ssl->options.havePeerCert = 1;
  12163. #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_RSA)
  12164. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  12165. ssl->specs.sig_algo == rsa_kea) {
  12166. /* CLIENT: No ServerKeyExchange message sent by server. */
  12167. ssl->options.peerAuthGood = 1;
  12168. }
  12169. #endif
  12170. #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_ECC)
  12171. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  12172. ssl->specs.static_ecdh) {
  12173. /* CLIENT: No ServerKeyExchange message sent by server. */
  12174. ssl->options.peerAuthGood = 1;
  12175. }
  12176. #endif
  12177. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  12178. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  12179. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  12180. * are to be bound into a certificate, the subject
  12181. * alternative name extension MUST be used." */
  12182. if (args->dCert->altNames) {
  12183. if (CheckForAltNames(args->dCert,
  12184. (char*)ssl->buffers.domainName.buffer,
  12185. NULL) != 1) {
  12186. WOLFSSL_MSG("DomainName match on alt names failed");
  12187. /* try to get peer key still */
  12188. ret = DOMAIN_NAME_MISMATCH;
  12189. WOLFSSL_ERROR_VERBOSE(ret);
  12190. }
  12191. }
  12192. else {
  12193. if (MatchDomainName(
  12194. args->dCert->subjectCN,
  12195. args->dCert->subjectCNLen,
  12196. (char*)ssl->buffers.domainName.buffer) == 0) {
  12197. WOLFSSL_MSG("DomainName match on common name failed");
  12198. ret = DOMAIN_NAME_MISMATCH;
  12199. WOLFSSL_ERROR_VERBOSE(ret);
  12200. }
  12201. }
  12202. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  12203. /* Old behavior. */
  12204. if (MatchDomainName(args->dCert->subjectCN,
  12205. args->dCert->subjectCNLen,
  12206. (char*)ssl->buffers.domainName.buffer) == 0) {
  12207. WOLFSSL_MSG("DomainName match on common name failed");
  12208. if (CheckForAltNames(args->dCert,
  12209. (char*)ssl->buffers.domainName.buffer,
  12210. NULL) != 1) {
  12211. WOLFSSL_MSG(
  12212. "DomainName match on alt names failed too");
  12213. /* try to get peer key still */
  12214. ret = DOMAIN_NAME_MISMATCH;
  12215. WOLFSSL_ERROR_VERBOSE(ret);
  12216. }
  12217. }
  12218. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  12219. }
  12220. /* decode peer key */
  12221. switch (args->dCert->keyOID) {
  12222. #ifndef NO_RSA
  12223. #ifdef WC_RSA_PSS
  12224. case RSAPSSk:
  12225. #endif
  12226. case RSAk:
  12227. {
  12228. word32 keyIdx = 0;
  12229. int keyRet = 0;
  12230. if (ssl->peerRsaKey == NULL) {
  12231. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  12232. (void**)&ssl->peerRsaKey);
  12233. } else if (ssl->peerRsaKeyPresent) {
  12234. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  12235. ssl->peerRsaKey);
  12236. ssl->peerRsaKeyPresent = 0;
  12237. }
  12238. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  12239. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  12240. args->dCert->pubKeySize) != 0) {
  12241. ret = PEER_KEY_ERROR;
  12242. WOLFSSL_ERROR_VERBOSE(ret);
  12243. }
  12244. else {
  12245. ssl->peerRsaKeyPresent = 1;
  12246. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || \
  12247. defined(WOLFSSL_RENESAS_SCEPROTECT)
  12248. /* copy encrypted tsip key index into ssl object */
  12249. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  12250. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12251. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  12252. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  12253. ssl->heap, DYNAMIC_TYPE_RSA);
  12254. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12255. args->lastErr = MEMORY_E;
  12256. goto exit_ppc;
  12257. }
  12258. }
  12259. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  12260. args->dCert->sce_tsip_encRsaKeyIdx,
  12261. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  12262. }
  12263. #endif
  12264. #ifdef HAVE_PK_CALLBACKS
  12265. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  12266. defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  12267. if (ssl->buffers.peerRsaKey.buffer) {
  12268. XFREE(ssl->buffers.peerRsaKey.buffer,
  12269. ssl->heap, DYNAMIC_TYPE_RSA);
  12270. ssl->buffers.peerRsaKey.buffer = NULL;
  12271. }
  12272. #endif
  12273. ssl->buffers.peerRsaKey.buffer =
  12274. (byte*)XMALLOC(args->dCert->pubKeySize,
  12275. ssl->heap, DYNAMIC_TYPE_RSA);
  12276. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  12277. ret = MEMORY_ERROR;
  12278. }
  12279. else {
  12280. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  12281. args->dCert->publicKey,
  12282. args->dCert->pubKeySize);
  12283. ssl->buffers.peerRsaKey.length =
  12284. args->dCert->pubKeySize;
  12285. }
  12286. #endif /* HAVE_PK_CALLBACKS */
  12287. }
  12288. /* check size of peer RSA key */
  12289. if (ret == 0 && ssl->peerRsaKeyPresent &&
  12290. !ssl->options.verifyNone &&
  12291. wc_RsaEncryptSize(ssl->peerRsaKey)
  12292. < ssl->options.minRsaKeySz) {
  12293. ret = RSA_KEY_SIZE_E;
  12294. WOLFSSL_ERROR_VERBOSE(ret);
  12295. WOLFSSL_MSG("Peer RSA key is too small");
  12296. }
  12297. break;
  12298. }
  12299. #endif /* NO_RSA */
  12300. #ifdef HAVE_ECC
  12301. case ECDSAk:
  12302. {
  12303. int keyRet = 0;
  12304. word32 idx = 0;
  12305. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || \
  12306. defined(WOLFSSL_RENESAS_TSIP_TLS)
  12307. /* copy encrypted tsip/sce key index into ssl object */
  12308. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  12309. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12310. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  12311. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  12312. ssl->heap, DYNAMIC_TYPE_RSA);
  12313. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  12314. args->lastErr = MEMORY_E;
  12315. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12316. }
  12317. }
  12318. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  12319. args->dCert->sce_tsip_encRsaKeyIdx,
  12320. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  12321. }
  12322. #endif
  12323. if (ssl->peerEccDsaKey == NULL) {
  12324. /* alloc/init on demand */
  12325. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  12326. (void**)&ssl->peerEccDsaKey);
  12327. } else if (ssl->peerEccDsaKeyPresent) {
  12328. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  12329. ssl->peerEccDsaKey);
  12330. ssl->peerEccDsaKeyPresent = 0;
  12331. }
  12332. if (keyRet != 0 ||
  12333. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  12334. ssl->peerEccDsaKey,
  12335. args->dCert->pubKeySize) != 0) {
  12336. ret = PEER_KEY_ERROR;
  12337. WOLFSSL_ERROR_VERBOSE(ret);
  12338. }
  12339. else {
  12340. ssl->peerEccDsaKeyPresent = 1;
  12341. #ifdef HAVE_PK_CALLBACKS
  12342. if (ssl->buffers.peerEccDsaKey.buffer)
  12343. XFREE(ssl->buffers.peerEccDsaKey.buffer,
  12344. ssl->heap, DYNAMIC_TYPE_ECC);
  12345. ssl->buffers.peerEccDsaKey.buffer =
  12346. (byte*)XMALLOC(args->dCert->pubKeySize,
  12347. ssl->heap, DYNAMIC_TYPE_ECC);
  12348. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  12349. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12350. }
  12351. else {
  12352. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  12353. args->dCert->publicKey,
  12354. args->dCert->pubKeySize);
  12355. ssl->buffers.peerEccDsaKey.length =
  12356. args->dCert->pubKeySize;
  12357. }
  12358. #endif /* HAVE_PK_CALLBACKS */
  12359. }
  12360. /* check size of peer ECC key */
  12361. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  12362. !ssl->options.verifyNone &&
  12363. wc_ecc_size(ssl->peerEccDsaKey)
  12364. < ssl->options.minEccKeySz) {
  12365. ret = ECC_KEY_SIZE_E;
  12366. WOLFSSL_ERROR_VERBOSE(ret);
  12367. WOLFSSL_MSG("Peer ECC key is too small");
  12368. }
  12369. /* populate curve oid - if missing */
  12370. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  12371. ssl->ecdhCurveOID = args->dCert->pkCurveOID;
  12372. break;
  12373. }
  12374. #endif /* HAVE_ECC */
  12375. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  12376. case ED25519k:
  12377. {
  12378. int keyRet = 0;
  12379. if (ssl->peerEd25519Key == NULL) {
  12380. /* alloc/init on demand */
  12381. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  12382. (void**)&ssl->peerEd25519Key);
  12383. } else if (ssl->peerEd25519KeyPresent) {
  12384. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  12385. ssl->peerEd25519Key);
  12386. ssl->peerEd25519KeyPresent = 0;
  12387. }
  12388. if (keyRet != 0 ||
  12389. wc_ed25519_import_public(args->dCert->publicKey,
  12390. args->dCert->pubKeySize,
  12391. ssl->peerEd25519Key)
  12392. != 0) {
  12393. ret = PEER_KEY_ERROR;
  12394. WOLFSSL_ERROR_VERBOSE(ret);
  12395. }
  12396. else {
  12397. ssl->peerEd25519KeyPresent = 1;
  12398. #ifdef HAVE_PK_CALLBACKS
  12399. ssl->buffers.peerEd25519Key.buffer =
  12400. (byte*)XMALLOC(args->dCert->pubKeySize,
  12401. ssl->heap, DYNAMIC_TYPE_ED25519);
  12402. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  12403. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12404. }
  12405. else {
  12406. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  12407. args->dCert->publicKey,
  12408. args->dCert->pubKeySize);
  12409. ssl->buffers.peerEd25519Key.length =
  12410. args->dCert->pubKeySize;
  12411. }
  12412. #endif /*HAVE_PK_CALLBACKS */
  12413. }
  12414. /* check size of peer ECC key */
  12415. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  12416. !ssl->options.verifyNone &&
  12417. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  12418. ret = ECC_KEY_SIZE_E;
  12419. WOLFSSL_ERROR_VERBOSE(ret);
  12420. WOLFSSL_MSG("Peer ECC key is too small");
  12421. }
  12422. /* populate curve oid - if missing */
  12423. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  12424. ssl->ecdhCurveOID = ECC_X25519_OID;
  12425. break;
  12426. }
  12427. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  12428. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  12429. case ED448k:
  12430. {
  12431. int keyRet = 0;
  12432. if (ssl->peerEd448Key == NULL) {
  12433. /* alloc/init on demand */
  12434. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
  12435. (void**)&ssl->peerEd448Key);
  12436. } else if (ssl->peerEd448KeyPresent) {
  12437. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
  12438. ssl->peerEd448Key);
  12439. ssl->peerEd448KeyPresent = 0;
  12440. }
  12441. if (keyRet != 0 ||
  12442. wc_ed448_import_public(args->dCert->publicKey,
  12443. args->dCert->pubKeySize,
  12444. ssl->peerEd448Key) != 0) {
  12445. ret = PEER_KEY_ERROR;
  12446. WOLFSSL_ERROR_VERBOSE(ret);
  12447. }
  12448. else {
  12449. ssl->peerEd448KeyPresent = 1;
  12450. #ifdef HAVE_PK_CALLBACKS
  12451. ssl->buffers.peerEd448Key.buffer =
  12452. (byte*)XMALLOC(args->dCert->pubKeySize,
  12453. ssl->heap, DYNAMIC_TYPE_ED448);
  12454. if (ssl->buffers.peerEd448Key.buffer == NULL) {
  12455. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  12456. }
  12457. else {
  12458. XMEMCPY(ssl->buffers.peerEd448Key.buffer,
  12459. args->dCert->publicKey,
  12460. args->dCert->pubKeySize);
  12461. ssl->buffers.peerEd448Key.length =
  12462. args->dCert->pubKeySize;
  12463. }
  12464. #endif /*HAVE_PK_CALLBACKS */
  12465. }
  12466. /* check size of peer ECC key */
  12467. if (ret == 0 && ssl->peerEd448KeyPresent &&
  12468. !ssl->options.verifyNone &&
  12469. ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  12470. ret = ECC_KEY_SIZE_E;
  12471. WOLFSSL_ERROR_VERBOSE(ret);
  12472. WOLFSSL_MSG("Peer ECC key is too small");
  12473. }
  12474. /* populate curve oid - if missing */
  12475. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  12476. ssl->ecdhCurveOID = ECC_X448_OID;
  12477. break;
  12478. }
  12479. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  12480. #if defined(HAVE_PQC)
  12481. #if defined(HAVE_FALCON)
  12482. case FALCON_LEVEL1k:
  12483. case FALCON_LEVEL5k:
  12484. {
  12485. int keyRet = 0;
  12486. if (ssl->peerFalconKey == NULL) {
  12487. /* alloc/init on demand */
  12488. keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON,
  12489. (void**)&ssl->peerFalconKey);
  12490. } else if (ssl->peerFalconKeyPresent) {
  12491. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_FALCON,
  12492. ssl->peerFalconKey);
  12493. ssl->peerFalconKeyPresent = 0;
  12494. }
  12495. if (keyRet == 0) {
  12496. if (args->dCert->keyOID == FALCON_LEVEL1k) {
  12497. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  12498. 1);
  12499. }
  12500. else {
  12501. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  12502. 5);
  12503. }
  12504. }
  12505. if (keyRet != 0 ||
  12506. wc_falcon_import_public(args->dCert->publicKey,
  12507. args->dCert->pubKeySize,
  12508. ssl->peerFalconKey) != 0) {
  12509. ret = PEER_KEY_ERROR;
  12510. WOLFSSL_ERROR_VERBOSE(ret);
  12511. }
  12512. else {
  12513. ssl->peerFalconKeyPresent = 1;
  12514. }
  12515. /* check size of peer Falcon key */
  12516. if (ret == 0 && ssl->peerFalconKeyPresent &&
  12517. !ssl->options.verifyNone &&
  12518. FALCON_MAX_KEY_SIZE <
  12519. ssl->options.minFalconKeySz) {
  12520. ret = FALCON_KEY_SIZE_E;
  12521. WOLFSSL_ERROR_VERBOSE(ret);
  12522. WOLFSSL_MSG("Peer Falcon key is too small");
  12523. }
  12524. break;
  12525. }
  12526. #endif /* HAVE_FALCON */
  12527. #if defined(HAVE_DILITHIUM)
  12528. case DILITHIUM_LEVEL2k:
  12529. case DILITHIUM_LEVEL3k:
  12530. case DILITHIUM_LEVEL5k:
  12531. case DILITHIUM_AES_LEVEL2k:
  12532. case DILITHIUM_AES_LEVEL3k:
  12533. case DILITHIUM_AES_LEVEL5k:
  12534. {
  12535. int keyRet = 0;
  12536. if (ssl->peerDilithiumKey == NULL) {
  12537. /* alloc/init on demand */
  12538. keyRet = AllocKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  12539. (void**)&ssl->peerDilithiumKey);
  12540. } else if (ssl->peerDilithiumKeyPresent) {
  12541. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_DILITHIUM,
  12542. ssl->peerDilithiumKey);
  12543. ssl->peerDilithiumKeyPresent = 0;
  12544. }
  12545. if (keyRet == 0) {
  12546. if (args->dCert->keyOID == DILITHIUM_LEVEL2k) {
  12547. keyRet = wc_dilithium_set_level_and_sym(
  12548. ssl->peerDilithiumKey, 2,
  12549. SHAKE_VARIANT);
  12550. }
  12551. else if (args->dCert->keyOID == DILITHIUM_LEVEL3k) {
  12552. keyRet = wc_dilithium_set_level_and_sym(
  12553. ssl->peerDilithiumKey, 3,
  12554. SHAKE_VARIANT);
  12555. }
  12556. else if (args->dCert->keyOID == DILITHIUM_LEVEL5k) {
  12557. keyRet = wc_dilithium_set_level_and_sym(
  12558. ssl->peerDilithiumKey, 5,
  12559. SHAKE_VARIANT);
  12560. }
  12561. else if (args->dCert->keyOID
  12562. == DILITHIUM_AES_LEVEL2k) {
  12563. keyRet = wc_dilithium_set_level_and_sym(
  12564. ssl->peerDilithiumKey, 2,
  12565. AES_VARIANT);
  12566. }
  12567. else if (args->dCert->keyOID
  12568. == DILITHIUM_AES_LEVEL3k) {
  12569. keyRet = wc_dilithium_set_level_and_sym(
  12570. ssl->peerDilithiumKey, 3,
  12571. AES_VARIANT);
  12572. }
  12573. else if (args->dCert->keyOID
  12574. == DILITHIUM_AES_LEVEL5k) {
  12575. keyRet = wc_dilithium_set_level_and_sym(
  12576. ssl->peerDilithiumKey, 5,
  12577. AES_VARIANT);
  12578. }
  12579. }
  12580. if (keyRet != 0 ||
  12581. wc_dilithium_import_public(args->dCert->publicKey,
  12582. args->dCert->pubKeySize,
  12583. ssl->peerDilithiumKey)
  12584. != 0) {
  12585. ret = PEER_KEY_ERROR;
  12586. }
  12587. else {
  12588. ssl->peerDilithiumKeyPresent = 1;
  12589. }
  12590. /* check size of peer Dilithium key */
  12591. if (ret == 0 && ssl->peerDilithiumKeyPresent &&
  12592. !ssl->options.verifyNone &&
  12593. DILITHIUM_MAX_KEY_SIZE <
  12594. ssl->options.minDilithiumKeySz) {
  12595. ret = DILITHIUM_KEY_SIZE_E;
  12596. WOLFSSL_MSG("Peer Dilithium key is too small");
  12597. }
  12598. break;
  12599. }
  12600. #endif /* HAVE_DILITHIUM */
  12601. #endif /* HAVE_PQC */
  12602. default:
  12603. break;
  12604. }
  12605. /* args->dCert free'd in function cleanup after callback */
  12606. } /* if (count > 0) */
  12607. /* Check for error */
  12608. if (args->fatal && ret != 0) {
  12609. goto exit_ppc;
  12610. }
  12611. /* Advance state and proceed */
  12612. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  12613. } /* case TLS_ASYNC_VERIFY */
  12614. FALL_THROUGH;
  12615. case TLS_ASYNC_FINALIZE:
  12616. {
  12617. /* load last error */
  12618. if (args->lastErr != 0 && ret == 0) {
  12619. ret = args->lastErr;
  12620. }
  12621. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  12622. /* limit compliant with OpenSSL verify Depth + 1
  12623. * OpenSSL tries to expand the chain one longer than limit until
  12624. * reaching an ultimately trusted issuer. Becoming failure if
  12625. * we hit the limit, with X509_V_ERR_CERT_CHAIN_TOO_LONG
  12626. */
  12627. if (args->untrustedDepth > (ssl->options.verifyDepth + 1)) {
  12628. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  12629. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  12630. ret = MAX_CHAIN_ERROR;
  12631. WOLFSSL_ERROR_VERBOSE(ret);
  12632. }
  12633. #endif
  12634. /* Do verify callback */
  12635. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  12636. if (ssl->options.verifyNone &&
  12637. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  12638. ret == CRL_CERT_DATE_ERR)) {
  12639. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  12640. ret = ssl->error = 0;
  12641. }
  12642. if (ret != 0) {
  12643. if (!ssl->options.verifyNone) {
  12644. DoCertFatalAlert(ssl, ret);
  12645. }
  12646. ssl->error = ret; /* Report SSL error */
  12647. }
  12648. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  12649. ssl->options.serverState = SERVER_CERT_COMPLETE;
  12650. }
  12651. if (IsEncryptionOn(ssl, 0)) {
  12652. args->idx += ssl->keys.padSz;
  12653. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12654. if (ssl->options.startedETMRead)
  12655. args->idx += MacSize(ssl);
  12656. #endif
  12657. }
  12658. /* Advance state and proceed */
  12659. ssl->options.asyncState = TLS_ASYNC_END;
  12660. } /* case TLS_ASYNC_FINALIZE */
  12661. FALL_THROUGH;
  12662. case TLS_ASYNC_END:
  12663. {
  12664. /* Set final index */
  12665. *inOutIdx = args->idx;
  12666. break;
  12667. }
  12668. default:
  12669. ret = INPUT_CASE_ERROR;
  12670. break;
  12671. } /* switch(ssl->options.asyncState) */
  12672. exit_ppc:
  12673. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  12674. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12675. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  12676. /* Mark message as not received so it can process again */
  12677. ssl->msgsReceived.got_certificate = 0;
  12678. return ret;
  12679. }
  12680. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  12681. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12682. /* Cleanup async */
  12683. FreeAsyncCtx(ssl, 0);
  12684. #elif defined(WOLFSSL_SMALL_STACK)
  12685. if (args)
  12686. {
  12687. FreeProcPeerCertArgs(ssl, args);
  12688. }
  12689. #else
  12690. FreeProcPeerCertArgs(ssl, args);
  12691. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
  12692. #if !defined(WOLFSSL_ASYNC_CRYPT) && defined(WOLFSSL_SMALL_STACK)
  12693. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  12694. #endif
  12695. FreeKeyExchange(ssl);
  12696. return ret;
  12697. }
  12698. #endif
  12699. #ifndef WOLFSSL_NO_TLS12
  12700. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  12701. /* handle processing of certificate (11) */
  12702. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12703. word32 size)
  12704. {
  12705. int ret;
  12706. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  12707. WOLFSSL_ENTER("DoCertificate");
  12708. #ifdef SESSION_CERTS
  12709. /* Reset the session cert chain count in case the session resume failed. */
  12710. ssl->session->chain.count = 0;
  12711. #ifdef WOLFSSL_ALT_CERT_CHAINS
  12712. ssl->session->altChain.count = 0;
  12713. #endif
  12714. #endif /* SESSION_CERTS */
  12715. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  12716. #ifdef WOLFSSL_EXTRA_ALERTS
  12717. if (ret == BUFFER_ERROR || ret == ASN_PARSE_E)
  12718. SendAlert(ssl, alert_fatal, decode_error);
  12719. #endif
  12720. #ifdef OPENSSL_EXTRA
  12721. ssl->options.serverState = SERVER_CERT_COMPLETE;
  12722. #endif
  12723. WOLFSSL_LEAVE("DoCertificate", ret);
  12724. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  12725. return ret;
  12726. }
  12727. /* handle processing of certificate_status (22) */
  12728. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12729. word32 size)
  12730. {
  12731. int ret = 0;
  12732. byte status_type;
  12733. word32 status_length;
  12734. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  12735. WOLFSSL_ENTER("DoCertificateStatus");
  12736. if (size < ENUM_LEN + OPAQUE24_LEN)
  12737. return BUFFER_ERROR;
  12738. status_type = input[(*inOutIdx)++];
  12739. c24to32(input + *inOutIdx, &status_length);
  12740. *inOutIdx += OPAQUE24_LEN;
  12741. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  12742. return BUFFER_ERROR;
  12743. switch (status_type) {
  12744. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  12745. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  12746. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  12747. case WOLFSSL_CSR2_OCSP:
  12748. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  12749. break;
  12750. #endif
  12751. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  12752. case WOLFSSL_CSR2_OCSP_MULTI: {
  12753. OcspRequest* request;
  12754. word32 list_length = status_length;
  12755. byte idx = 0;
  12756. #ifdef WOLFSSL_SMALL_STACK
  12757. CertStatus* status;
  12758. OcspEntry* single;
  12759. OcspResponse* response;
  12760. #else
  12761. CertStatus status[1];
  12762. OcspEntry single[1];
  12763. OcspResponse response[1];
  12764. #endif
  12765. do {
  12766. if (ssl->status_request_v2) {
  12767. ssl->status_request_v2 = 0;
  12768. break;
  12769. }
  12770. return BUFFER_ERROR;
  12771. } while(0);
  12772. #ifdef WOLFSSL_SMALL_STACK
  12773. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  12774. DYNAMIC_TYPE_OCSP_STATUS);
  12775. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  12776. DYNAMIC_TYPE_OCSP_ENTRY);
  12777. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  12778. DYNAMIC_TYPE_OCSP_REQUEST);
  12779. if (status == NULL || single == NULL || response == NULL) {
  12780. if (status)
  12781. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  12782. if (single)
  12783. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  12784. if (response)
  12785. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  12786. return MEMORY_ERROR;
  12787. }
  12788. #endif
  12789. while (list_length && ret == 0) {
  12790. if (OPAQUE24_LEN > list_length) {
  12791. ret = BUFFER_ERROR;
  12792. break;
  12793. }
  12794. c24to32(input + *inOutIdx, &status_length);
  12795. *inOutIdx += OPAQUE24_LEN;
  12796. list_length -= OPAQUE24_LEN;
  12797. if (status_length > list_length) {
  12798. ret = BUFFER_ERROR;
  12799. break;
  12800. }
  12801. if (status_length) {
  12802. InitOcspResponse(response, single, status, input +*inOutIdx,
  12803. status_length, ssl->heap);
  12804. if ((OcspResponseDecode(response, SSL_CM(ssl), ssl->heap,
  12805. 0) != 0)
  12806. || (response->responseStatus != OCSP_SUCCESSFUL)
  12807. || (response->single->status->status != CERT_GOOD))
  12808. ret = BAD_CERTIFICATE_STATUS_ERROR;
  12809. while (ret == 0) {
  12810. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  12811. ssl->extensions, status_type, idx++);
  12812. if (request == NULL)
  12813. ret = BAD_CERTIFICATE_STATUS_ERROR;
  12814. else if (CompareOcspReqResp(request, response) == 0)
  12815. break;
  12816. else if (idx == 1) /* server cert must be OK */
  12817. ret = BAD_CERTIFICATE_STATUS_ERROR;
  12818. }
  12819. FreeOcspResponse(response);
  12820. *inOutIdx += status_length;
  12821. list_length -= status_length;
  12822. }
  12823. }
  12824. ssl->status_request_v2 = 0;
  12825. #ifdef WOLFSSL_SMALL_STACK
  12826. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  12827. XFREE(single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
  12828. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  12829. #endif
  12830. }
  12831. break;
  12832. #endif
  12833. default:
  12834. ret = BUFFER_ERROR;
  12835. }
  12836. if (ret != 0) {
  12837. WOLFSSL_ERROR_VERBOSE(ret);
  12838. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  12839. }
  12840. if (IsEncryptionOn(ssl, 0)) {
  12841. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12842. if (ssl->options.startedETMRead) {
  12843. word32 digestSz = MacSize(ssl);
  12844. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  12845. return BUFFER_E;
  12846. *inOutIdx += ssl->keys.padSz + digestSz;
  12847. }
  12848. else
  12849. #endif
  12850. {
  12851. if (*inOutIdx + ssl->keys.padSz > size)
  12852. return BUFFER_E;
  12853. *inOutIdx += ssl->keys.padSz;
  12854. }
  12855. }
  12856. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  12857. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  12858. return ret;
  12859. }
  12860. #endif
  12861. #endif /* !WOLFSSL_NO_TLS12 */
  12862. #endif /* !NO_CERTS */
  12863. #ifndef WOLFSSL_NO_TLS12
  12864. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  12865. word32 size, word32 totalSz)
  12866. {
  12867. (void)input;
  12868. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  12869. WOLFSSL_ENTER("DoHelloRequest");
  12870. if (size) /* must be 0 */
  12871. return BUFFER_ERROR;
  12872. if (IsEncryptionOn(ssl, 0)) {
  12873. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  12874. * about padding */
  12875. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12876. if (ssl->options.startedETMRead) {
  12877. word32 digestSz = MacSize(ssl);
  12878. if (size != totalSz &&
  12879. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  12880. return BUFFER_E;
  12881. *inOutIdx += ssl->keys.padSz + digestSz;
  12882. }
  12883. else
  12884. #endif
  12885. {
  12886. /* access beyond input + size should be checked against totalSz */
  12887. if (size != totalSz &&
  12888. *inOutIdx + ssl->keys.padSz > totalSz)
  12889. return BUFFER_E;
  12890. *inOutIdx += ssl->keys.padSz;
  12891. }
  12892. }
  12893. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12894. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  12895. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  12896. return FATAL_ERROR;
  12897. }
  12898. #ifdef HAVE_SECURE_RENEGOTIATION
  12899. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  12900. ssl->secure_renegotiation->startScr = 1;
  12901. WOLFSSL_LEAVE("DoHelloRequest", 0);
  12902. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  12903. return 0;
  12904. }
  12905. #endif
  12906. else {
  12907. return SendAlert(ssl, alert_warning, no_renegotiation);
  12908. }
  12909. }
  12910. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  12911. word32 totalSz, int sniff)
  12912. {
  12913. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  12914. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  12915. WOLFSSL_ENTER("DoFinished");
  12916. if (finishedSz != size)
  12917. return BUFFER_ERROR;
  12918. /* check against totalSz
  12919. * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
  12920. * padding */
  12921. if (size != totalSz) {
  12922. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12923. if (ssl->options.startedETMRead) {
  12924. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  12925. return BUFFER_E;
  12926. }
  12927. else
  12928. #endif
  12929. {
  12930. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  12931. return BUFFER_E;
  12932. }
  12933. }
  12934. #ifdef WOLFSSL_CALLBACKS
  12935. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  12936. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  12937. #endif
  12938. if (sniff == NO_SNIFF) {
  12939. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  12940. WOLFSSL_MSG("Verify finished error on hashes");
  12941. #ifdef WOLFSSL_EXTRA_ALERTS
  12942. SendAlert(ssl, alert_fatal, decrypt_error);
  12943. #endif
  12944. WOLFSSL_ERROR_VERBOSE(VERIFY_FINISHED_ERROR);
  12945. return VERIFY_FINISHED_ERROR;
  12946. }
  12947. }
  12948. #ifdef HAVE_SECURE_RENEGOTIATION
  12949. if (ssl->secure_renegotiation) {
  12950. /* save peer's state */
  12951. if (ssl->options.side == WOLFSSL_CLIENT_END)
  12952. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  12953. input + *inOutIdx, TLS_FINISHED_SZ);
  12954. else
  12955. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  12956. input + *inOutIdx, TLS_FINISHED_SZ);
  12957. ssl->secure_renegotiation->verifySet = 1;
  12958. }
  12959. #endif
  12960. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  12961. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12962. XMEMCPY(ssl->serverFinished,
  12963. input + *inOutIdx, TLS_FINISHED_SZ);
  12964. ssl->serverFinished_len = TLS_FINISHED_SZ;
  12965. }
  12966. else {
  12967. XMEMCPY(ssl->clientFinished,
  12968. input + *inOutIdx, TLS_FINISHED_SZ);
  12969. ssl->clientFinished_len = TLS_FINISHED_SZ;
  12970. }
  12971. #endif
  12972. /* force input exhaustion at ProcessReply consuming padSz */
  12973. *inOutIdx += size + ssl->keys.padSz;
  12974. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12975. if (ssl->options.startedETMRead)
  12976. *inOutIdx += MacSize(ssl);
  12977. #endif
  12978. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12979. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  12980. #ifdef OPENSSL_EXTRA
  12981. ssl->cbmode = SSL_CB_MODE_WRITE;
  12982. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  12983. #endif
  12984. if (!ssl->options.resuming) {
  12985. #ifdef OPENSSL_EXTRA
  12986. if (ssl->CBIS != NULL) {
  12987. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  12988. }
  12989. #endif
  12990. ssl->options.handShakeState = HANDSHAKE_DONE;
  12991. ssl->options.handShakeDone = 1;
  12992. }
  12993. }
  12994. else {
  12995. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  12996. #ifdef OPENSSL_EXTRA
  12997. ssl->cbmode = SSL_CB_MODE_READ;
  12998. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  12999. #endif
  13000. if (ssl->options.resuming) {
  13001. #ifdef OPENSSL_EXTRA
  13002. if (ssl->CBIS != NULL) {
  13003. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  13004. }
  13005. #endif
  13006. ssl->options.handShakeState = HANDSHAKE_DONE;
  13007. ssl->options.handShakeDone = 1;
  13008. }
  13009. }
  13010. #ifdef WOLFSSL_DTLS
  13011. if (ssl->options.dtls) {
  13012. if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
  13013. (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
  13014. DtlsMsgPoolReset(ssl);
  13015. ssl->keys.dtls_handshake_number = 0;
  13016. ssl->keys.dtls_expected_peer_handshake_number = 0;
  13017. }
  13018. }
  13019. #endif
  13020. WOLFSSL_LEAVE("DoFinished", 0);
  13021. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  13022. return 0;
  13023. }
  13024. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  13025. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  13026. {
  13027. /* verify not a duplicate, mark received, check state */
  13028. switch (type) {
  13029. #ifndef NO_WOLFSSL_CLIENT
  13030. case hello_request:
  13031. #ifndef NO_WOLFSSL_SERVER
  13032. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13033. WOLFSSL_MSG("HelloRequest received by server");
  13034. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13035. return SIDE_ERROR;
  13036. }
  13037. #endif
  13038. if (ssl->msgsReceived.got_hello_request) {
  13039. WOLFSSL_MSG("Duplicate HelloRequest received");
  13040. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13041. return DUPLICATE_MSG_E;
  13042. }
  13043. ssl->msgsReceived.got_hello_request = 1;
  13044. break;
  13045. #endif
  13046. #ifndef NO_WOLFSSL_SERVER
  13047. case client_hello:
  13048. #ifndef NO_WOLFSSL_CLIENT
  13049. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13050. WOLFSSL_MSG("ClientHello received by client");
  13051. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13052. return SIDE_ERROR;
  13053. }
  13054. #endif
  13055. if (ssl->msgsReceived.got_client_hello) {
  13056. WOLFSSL_MSG("Duplicate ClientHello received");
  13057. #ifdef WOLFSSL_EXTRA_ALERTS
  13058. SendAlert(ssl, alert_fatal, unexpected_message);
  13059. #endif
  13060. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13061. return DUPLICATE_MSG_E;
  13062. }
  13063. ssl->msgsReceived.got_client_hello = 1;
  13064. break;
  13065. #endif
  13066. #ifndef NO_WOLFSSL_CLIENT
  13067. case server_hello:
  13068. #ifndef NO_WOLFSSL_SERVER
  13069. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13070. WOLFSSL_MSG("ServerHello received by server");
  13071. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13072. return SIDE_ERROR;
  13073. }
  13074. #endif
  13075. if (ssl->msgsReceived.got_server_hello) {
  13076. WOLFSSL_MSG("Duplicate ServerHello received");
  13077. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13078. return DUPLICATE_MSG_E;
  13079. }
  13080. ssl->msgsReceived.got_server_hello = 1;
  13081. break;
  13082. #endif
  13083. #ifndef NO_WOLFSSL_CLIENT
  13084. case hello_verify_request:
  13085. #ifndef NO_WOLFSSL_SERVER
  13086. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13087. WOLFSSL_MSG("HelloVerifyRequest received by server");
  13088. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13089. return SIDE_ERROR;
  13090. }
  13091. #endif
  13092. if (ssl->msgsReceived.got_hello_verify_request) {
  13093. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  13094. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13095. return DUPLICATE_MSG_E;
  13096. }
  13097. ssl->msgsReceived.got_hello_verify_request = 1;
  13098. break;
  13099. #endif
  13100. #ifndef NO_WOLFSSL_CLIENT
  13101. case session_ticket:
  13102. #ifndef NO_WOLFSSL_SERVER
  13103. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13104. WOLFSSL_MSG("SessionTicket received by server");
  13105. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13106. return SIDE_ERROR;
  13107. }
  13108. #endif
  13109. if (ssl->msgsReceived.got_session_ticket) {
  13110. WOLFSSL_MSG("Duplicate SessionTicket received");
  13111. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13112. return DUPLICATE_MSG_E;
  13113. }
  13114. ssl->msgsReceived.got_session_ticket = 1;
  13115. break;
  13116. #endif
  13117. case certificate:
  13118. if (ssl->msgsReceived.got_certificate) {
  13119. WOLFSSL_MSG("Duplicate Certificate received");
  13120. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13121. return DUPLICATE_MSG_E;
  13122. }
  13123. ssl->msgsReceived.got_certificate = 1;
  13124. #ifndef NO_WOLFSSL_CLIENT
  13125. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13126. if ( ssl->msgsReceived.got_server_hello == 0) {
  13127. WOLFSSL_MSG("No ServerHello before Cert");
  13128. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13129. return OUT_OF_ORDER_E;
  13130. }
  13131. }
  13132. #endif
  13133. #ifndef NO_WOLFSSL_SERVER
  13134. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13135. if ( ssl->msgsReceived.got_client_hello == 0) {
  13136. WOLFSSL_MSG("No ClientHello before Cert");
  13137. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13138. return OUT_OF_ORDER_E;
  13139. }
  13140. }
  13141. #endif
  13142. break;
  13143. #ifndef NO_WOLFSSL_CLIENT
  13144. case certificate_status:
  13145. #ifndef NO_WOLFSSL_SERVER
  13146. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13147. WOLFSSL_MSG("CertificateStatus received by server");
  13148. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13149. return SIDE_ERROR;
  13150. }
  13151. #endif
  13152. if (ssl->msgsReceived.got_certificate_status) {
  13153. WOLFSSL_MSG("Duplicate CertificateStatus received");
  13154. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13155. return DUPLICATE_MSG_E;
  13156. }
  13157. ssl->msgsReceived.got_certificate_status = 1;
  13158. if (ssl->msgsReceived.got_certificate == 0) {
  13159. WOLFSSL_MSG("No Certificate before CertificateStatus");
  13160. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13161. return OUT_OF_ORDER_E;
  13162. }
  13163. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  13164. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  13165. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13166. return OUT_OF_ORDER_E;
  13167. }
  13168. break;
  13169. #endif
  13170. #ifndef NO_WOLFSSL_CLIENT
  13171. case server_key_exchange:
  13172. #ifndef NO_WOLFSSL_SERVER
  13173. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13174. WOLFSSL_MSG("ServerKeyExchange received by server");
  13175. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13176. return SIDE_ERROR;
  13177. }
  13178. #endif
  13179. if (ssl->msgsReceived.got_server_key_exchange) {
  13180. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  13181. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13182. return DUPLICATE_MSG_E;
  13183. }
  13184. ssl->msgsReceived.got_server_key_exchange = 1;
  13185. if (ssl->msgsReceived.got_server_hello == 0) {
  13186. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  13187. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13188. return OUT_OF_ORDER_E;
  13189. }
  13190. if (ssl->msgsReceived.got_certificate_status == 0) {
  13191. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  13192. if (ssl->status_request) {
  13193. int ret;
  13194. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  13195. if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0)
  13196. return ret;
  13197. }
  13198. #endif
  13199. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13200. if (ssl->status_request_v2) {
  13201. int ret;
  13202. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  13203. if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0)
  13204. return ret;
  13205. }
  13206. #endif
  13207. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  13208. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  13209. /* Check that a status request extension was seen as the
  13210. * CertificateStatus wasn't when an OCSP staple is required.
  13211. */
  13212. if (
  13213. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  13214. !ssl->status_request &&
  13215. #endif
  13216. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  13217. !ssl->status_request_v2 &&
  13218. #endif
  13219. SSL_CM(ssl)->ocspMustStaple) {
  13220. WOLFSSL_ERROR_VERBOSE(OCSP_CERT_UNKNOWN);
  13221. return OCSP_CERT_UNKNOWN;
  13222. }
  13223. #endif
  13224. }
  13225. break;
  13226. #endif
  13227. #ifndef NO_WOLFSSL_CLIENT
  13228. case certificate_request:
  13229. #ifndef NO_WOLFSSL_SERVER
  13230. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13231. WOLFSSL_MSG("CertificateRequest received by server");
  13232. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13233. return SIDE_ERROR;
  13234. }
  13235. #endif
  13236. if (ssl->msgsReceived.got_certificate_request) {
  13237. WOLFSSL_MSG("Duplicate CertificateRequest received");
  13238. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13239. return DUPLICATE_MSG_E;
  13240. }
  13241. ssl->msgsReceived.got_certificate_request = 1;
  13242. break;
  13243. #endif
  13244. #ifndef NO_WOLFSSL_CLIENT
  13245. case server_hello_done:
  13246. #ifndef NO_WOLFSSL_SERVER
  13247. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13248. WOLFSSL_MSG("ServerHelloDone received by server");
  13249. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13250. return SIDE_ERROR;
  13251. }
  13252. #endif
  13253. if (ssl->msgsReceived.got_server_hello_done) {
  13254. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  13255. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13256. return DUPLICATE_MSG_E;
  13257. }
  13258. ssl->msgsReceived.got_server_hello_done = 1;
  13259. if (ssl->msgsReceived.got_certificate == 0) {
  13260. if (ssl->specs.kea == psk_kea ||
  13261. ssl->specs.kea == dhe_psk_kea ||
  13262. ssl->specs.kea == ecdhe_psk_kea ||
  13263. ssl->options.usingAnon_cipher) {
  13264. WOLFSSL_MSG("No Cert required");
  13265. }
  13266. else {
  13267. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  13268. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13269. return OUT_OF_ORDER_E;
  13270. }
  13271. }
  13272. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  13273. int pskNoServerHint = 0; /* not required in this case */
  13274. #ifndef NO_PSK
  13275. if (ssl->specs.kea == psk_kea &&
  13276. ssl->arrays != NULL &&
  13277. ssl->arrays->server_hint[0] == 0)
  13278. pskNoServerHint = 1;
  13279. #endif
  13280. if (ssl->specs.static_ecdh == 1 ||
  13281. ssl->specs.kea == rsa_kea ||
  13282. pskNoServerHint) {
  13283. WOLFSSL_MSG("No KeyExchange required");
  13284. }
  13285. else {
  13286. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  13287. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13288. return OUT_OF_ORDER_E;
  13289. }
  13290. }
  13291. break;
  13292. #endif
  13293. #ifndef NO_WOLFSSL_SERVER
  13294. case certificate_verify:
  13295. #ifndef NO_WOLFSSL_CLIENT
  13296. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13297. WOLFSSL_MSG("CertificateVerify received by client");
  13298. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13299. return SIDE_ERROR;
  13300. }
  13301. #endif
  13302. if (ssl->msgsReceived.got_certificate_verify) {
  13303. WOLFSSL_MSG("Duplicate CertificateVerify received");
  13304. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13305. return DUPLICATE_MSG_E;
  13306. }
  13307. ssl->msgsReceived.got_certificate_verify = 1;
  13308. if ( ssl->msgsReceived.got_certificate == 0) {
  13309. WOLFSSL_MSG("No Cert before CertVerify");
  13310. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13311. return OUT_OF_ORDER_E;
  13312. }
  13313. break;
  13314. #endif
  13315. #ifndef NO_WOLFSSL_SERVER
  13316. case client_key_exchange:
  13317. #ifndef NO_WOLFSSL_CLIENT
  13318. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13319. WOLFSSL_MSG("ClientKeyExchange received by client");
  13320. WOLFSSL_ERROR_VERBOSE(SIDE_ERROR);
  13321. return SIDE_ERROR;
  13322. }
  13323. #endif
  13324. if (ssl->msgsReceived.got_client_key_exchange) {
  13325. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  13326. #ifdef WOLFSSL_EXTRA_ALERTS
  13327. SendAlert(ssl, alert_fatal, unexpected_message);
  13328. #endif
  13329. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13330. return DUPLICATE_MSG_E;
  13331. }
  13332. ssl->msgsReceived.got_client_key_exchange = 1;
  13333. if (ssl->msgsReceived.got_client_hello == 0) {
  13334. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  13335. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13336. return OUT_OF_ORDER_E;
  13337. }
  13338. break;
  13339. #endif
  13340. case finished:
  13341. if (ssl->msgsReceived.got_finished) {
  13342. WOLFSSL_MSG("Duplicate Finished received");
  13343. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13344. return DUPLICATE_MSG_E;
  13345. }
  13346. #ifdef WOLFSSL_DTLS
  13347. if (ssl->options.dtls) {
  13348. if (ssl->keys.curEpoch == 0) {
  13349. WOLFSSL_MSG("Finished received with epoch 0");
  13350. WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR);
  13351. return SEQUENCE_ERROR;
  13352. }
  13353. }
  13354. #endif
  13355. ssl->msgsReceived.got_finished = 1;
  13356. if (ssl->msgsReceived.got_change_cipher == 0) {
  13357. WOLFSSL_MSG("Finished received before ChangeCipher");
  13358. #ifdef WOLFSSL_EXTRA_ALERTS
  13359. SendAlert(ssl, alert_fatal, unexpected_message);
  13360. #endif
  13361. WOLFSSL_ERROR_VERBOSE(NO_CHANGE_CIPHER_E);
  13362. return NO_CHANGE_CIPHER_E;
  13363. }
  13364. break;
  13365. case change_cipher_hs:
  13366. if (ssl->msgsReceived.got_change_cipher) {
  13367. WOLFSSL_MSG("Duplicate ChangeCipher received");
  13368. WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E);
  13369. return DUPLICATE_MSG_E;
  13370. }
  13371. /* DTLS is going to ignore the CCS message if the client key
  13372. * exchange message wasn't received yet. */
  13373. if (!ssl->options.dtls)
  13374. ssl->msgsReceived.got_change_cipher = 1;
  13375. #ifndef NO_WOLFSSL_CLIENT
  13376. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13377. if (!ssl->options.resuming) {
  13378. if (ssl->msgsReceived.got_server_hello_done == 0) {
  13379. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  13380. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13381. return OUT_OF_ORDER_E;
  13382. }
  13383. }
  13384. else {
  13385. if (ssl->msgsReceived.got_server_hello == 0) {
  13386. WOLFSSL_MSG("No ServerHello before ChangeCipher on "
  13387. "Resume");
  13388. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13389. return OUT_OF_ORDER_E;
  13390. }
  13391. }
  13392. #ifdef HAVE_SESSION_TICKET
  13393. if (ssl->expect_session_ticket) {
  13394. WOLFSSL_MSG("Expected session ticket missing");
  13395. #ifdef WOLFSSL_DTLS
  13396. if (ssl->options.dtls) {
  13397. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13398. return OUT_OF_ORDER_E;
  13399. }
  13400. #endif
  13401. WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
  13402. return SESSION_TICKET_EXPECT_E;
  13403. }
  13404. #endif
  13405. }
  13406. #endif
  13407. #ifndef NO_WOLFSSL_SERVER
  13408. if (ssl->options.side == WOLFSSL_SERVER_END) {
  13409. if (!ssl->options.resuming &&
  13410. ssl->msgsReceived.got_client_key_exchange == 0) {
  13411. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  13412. #ifdef WOLFSSL_EXTRA_ALERTS
  13413. SendAlert(ssl, alert_fatal, unexpected_message);
  13414. #endif
  13415. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13416. return OUT_OF_ORDER_E;
  13417. }
  13418. #ifndef NO_CERTS
  13419. if (ssl->options.verifyPeer &&
  13420. ssl->options.havePeerCert) {
  13421. if (!ssl->options.havePeerVerify ||
  13422. !ssl->msgsReceived.got_certificate_verify) {
  13423. WOLFSSL_MSG("client didn't send cert verify");
  13424. #ifdef WOLFSSL_DTLS
  13425. if (ssl->options.dtls) {
  13426. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13427. return OUT_OF_ORDER_E;
  13428. }
  13429. #endif
  13430. WOLFSSL_ERROR_VERBOSE(NO_PEER_VERIFY);
  13431. return NO_PEER_VERIFY;
  13432. }
  13433. }
  13434. #endif
  13435. }
  13436. #endif
  13437. if (ssl->options.dtls)
  13438. ssl->msgsReceived.got_change_cipher = 1;
  13439. break;
  13440. default:
  13441. WOLFSSL_MSG("Unknown message type");
  13442. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  13443. return SANITY_MSG_E;
  13444. }
  13445. return 0;
  13446. }
  13447. static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  13448. byte type, word32 size, word32 totalSz)
  13449. {
  13450. int ret = 0;
  13451. word32 expectedIdx;
  13452. WOLFSSL_ENTER("DoHandShakeMsgType");
  13453. #ifdef WOLFSSL_TLS13
  13454. if (type == hello_retry_request) {
  13455. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  13456. totalSz);
  13457. }
  13458. #endif
  13459. /* make sure can read the message */
  13460. if (*inOutIdx + size > totalSz) {
  13461. WOLFSSL_MSG("Incomplete Data");
  13462. WOLFSSL_ERROR_VERBOSE(INCOMPLETE_DATA);
  13463. return INCOMPLETE_DATA;
  13464. }
  13465. expectedIdx = *inOutIdx + size +
  13466. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  13467. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13468. if (ssl->options.startedETMRead && ssl->keys.encryptionOn)
  13469. expectedIdx += MacSize(ssl);
  13470. #endif
  13471. #if !defined(NO_WOLFSSL_SERVER) && \
  13472. defined(HAVE_SECURE_RENEGOTIATION) && \
  13473. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  13474. if (ssl->options.handShakeDone && type == client_hello &&
  13475. ssl->secure_renegotiation &&
  13476. ssl->secure_renegotiation->enabled)
  13477. {
  13478. WOLFSSL_MSG("Reset handshake state");
  13479. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  13480. ssl->options.serverState = NULL_STATE;
  13481. ssl->options.clientState = NULL_STATE;
  13482. ssl->options.connectState = CONNECT_BEGIN;
  13483. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  13484. ssl->options.handShakeState = NULL_STATE;
  13485. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  13486. ret = InitHandshakeHashes(ssl);
  13487. if (ret != 0)
  13488. return ret;
  13489. }
  13490. #endif
  13491. /* sanity check msg received */
  13492. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  13493. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  13494. return ret;
  13495. }
  13496. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  13497. /* add name later, add on record and handshake header part back on */
  13498. if (ssl->toInfoOn) {
  13499. int add = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  13500. AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - add,
  13501. size + add, READ_PROTO, ssl->heap);
  13502. #ifdef WOLFSSL_CALLBACKS
  13503. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  13504. #endif
  13505. }
  13506. #endif
  13507. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  13508. WOLFSSL_MSG("HandShake message after handshake complete");
  13509. SendAlert(ssl, alert_fatal, unexpected_message);
  13510. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13511. return OUT_OF_ORDER_E;
  13512. }
  13513. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  13514. ssl->options.serverState == NULL_STATE && type != server_hello) {
  13515. WOLFSSL_MSG("First server message not server hello");
  13516. SendAlert(ssl, alert_fatal, unexpected_message);
  13517. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13518. return OUT_OF_ORDER_E;
  13519. }
  13520. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  13521. type == server_hello_done &&
  13522. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  13523. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  13524. SendAlert(ssl, alert_fatal, unexpected_message);
  13525. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13526. return OUT_OF_ORDER_E;
  13527. }
  13528. if (ssl->options.side == WOLFSSL_SERVER_END &&
  13529. ssl->options.clientState == NULL_STATE && type != client_hello) {
  13530. WOLFSSL_MSG("First client message not client hello");
  13531. SendAlert(ssl, alert_fatal, unexpected_message);
  13532. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13533. return OUT_OF_ORDER_E;
  13534. }
  13535. /* above checks handshake state */
  13536. /* hello_request not hashed */
  13537. /* Also, skip hashing the client_hello message here for DTLS. It will be
  13538. * hashed later if the DTLS cookie is correct. */
  13539. if (type != hello_request
  13540. #ifdef WOLFSSL_ASYNC_CRYPT
  13541. && ssl->error != WC_PENDING_E
  13542. #endif
  13543. #ifdef WOLFSSL_NONBLOCK_OCSP
  13544. && ssl->error != OCSP_WANT_READ
  13545. #endif
  13546. ) {
  13547. ret = HashInput(ssl, input + *inOutIdx, size);
  13548. if (ret != 0) {
  13549. WOLFSSL_MSG("Incomplete handshake hashes");
  13550. return ret;
  13551. }
  13552. }
  13553. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13554. switch (type) {
  13555. case certificate:
  13556. case server_key_exchange:
  13557. case certificate_request:
  13558. case server_hello_done:
  13559. if (ssl->options.resuming) {
  13560. #ifdef WOLFSSL_WPAS
  13561. /* This can occur when ssl->sessionSecretCb is set. EAP-FAST
  13562. * (RFC 4851) allows for detecting server session resumption
  13563. * based on the msg received after the ServerHello. */
  13564. WOLFSSL_MSG("Not resuming as thought");
  13565. ssl->options.resuming = 0;
  13566. /* No longer resuming, reset peer authentication state. */
  13567. ssl->options.peerAuthGood = 0;
  13568. #else
  13569. /* Fatal error. Only try to send an alert. RFC 5246 does not
  13570. * allow for reverting back to a full handshake after the
  13571. * server has indicated the intention to do a resumption. */
  13572. (void)SendAlert(ssl, alert_fatal, unexpected_message);
  13573. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  13574. return OUT_OF_ORDER_E;
  13575. #endif
  13576. }
  13577. }
  13578. }
  13579. #ifdef OPENSSL_EXTRA
  13580. if (ssl->CBIS != NULL){
  13581. ssl->cbmode = SSL_CB_MODE_READ;
  13582. ssl->cbtype = type;
  13583. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  13584. }
  13585. #endif
  13586. switch (type) {
  13587. case hello_request:
  13588. WOLFSSL_MSG("processing hello request");
  13589. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  13590. break;
  13591. #ifndef NO_WOLFSSL_CLIENT
  13592. case hello_verify_request:
  13593. WOLFSSL_MSG("processing hello verify request");
  13594. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  13595. if (IsEncryptionOn(ssl, 0)) {
  13596. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13597. if (ssl->options.startedETMRead) {
  13598. word32 digestSz = MacSize(ssl);
  13599. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  13600. return BUFFER_E;
  13601. *inOutIdx += ssl->keys.padSz + digestSz;
  13602. }
  13603. else
  13604. #endif
  13605. {
  13606. /* access beyond input + size should be checked against totalSz
  13607. */
  13608. if (*inOutIdx + ssl->keys.padSz > totalSz)
  13609. return BUFFER_E;
  13610. *inOutIdx += ssl->keys.padSz;
  13611. }
  13612. }
  13613. break;
  13614. case server_hello:
  13615. WOLFSSL_MSG("processing server hello");
  13616. ret = DoServerHello(ssl, input, inOutIdx, size);
  13617. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  13618. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  13619. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  13620. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  13621. IsAtLeastTLSv1_3(ssl->version)) {
  13622. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13623. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  13624. #endif
  13625. {
  13626. ssl->options.cacheMessages = 0;
  13627. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  13628. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  13629. XFREE(ssl->hsHashes->messages, ssl->heap,
  13630. DYNAMIC_TYPE_HASHES);
  13631. ssl->hsHashes->messages = NULL;
  13632. }
  13633. }
  13634. }
  13635. #endif
  13636. break;
  13637. #ifndef NO_CERTS
  13638. case certificate_request:
  13639. WOLFSSL_MSG("processing certificate request");
  13640. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  13641. break;
  13642. #endif
  13643. case server_key_exchange:
  13644. WOLFSSL_MSG("processing server key exchange");
  13645. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  13646. break;
  13647. #ifdef HAVE_SESSION_TICKET
  13648. case session_ticket:
  13649. WOLFSSL_MSG("processing session ticket");
  13650. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  13651. break;
  13652. #endif /* HAVE_SESSION_TICKET */
  13653. #endif
  13654. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  13655. !defined(WOLFSSL_NO_CLIENT_AUTH))
  13656. case certificate:
  13657. WOLFSSL_MSG("processing certificate");
  13658. ret = DoCertificate(ssl, input, inOutIdx, size);
  13659. break;
  13660. case certificate_status:
  13661. WOLFSSL_MSG("processing certificate status");
  13662. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  13663. break;
  13664. #endif
  13665. case server_hello_done:
  13666. WOLFSSL_MSG("processing server hello done");
  13667. #ifdef WOLFSSL_CALLBACKS
  13668. if (ssl->hsInfoOn)
  13669. AddPacketName(ssl, "ServerHelloDone");
  13670. if (ssl->toInfoOn)
  13671. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  13672. #endif
  13673. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  13674. if (IsEncryptionOn(ssl, 0)) {
  13675. *inOutIdx += ssl->keys.padSz;
  13676. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13677. if (ssl->options.startedETMRead)
  13678. *inOutIdx += MacSize(ssl);
  13679. #endif
  13680. }
  13681. break;
  13682. case finished:
  13683. WOLFSSL_MSG("processing finished");
  13684. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  13685. break;
  13686. #ifndef NO_WOLFSSL_SERVER
  13687. case client_hello:
  13688. WOLFSSL_MSG("processing client hello");
  13689. ret = DoClientHello(ssl, input, inOutIdx, size);
  13690. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  13691. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  13692. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  13693. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  13694. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  13695. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13696. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  13697. #endif
  13698. {
  13699. ssl->options.cacheMessages = 0;
  13700. if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
  13701. ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length);
  13702. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  13703. ssl->hsHashes->messages = NULL;
  13704. }
  13705. }
  13706. }
  13707. #endif
  13708. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  13709. * about padding */
  13710. if (IsEncryptionOn(ssl, 0)) {
  13711. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13712. if (ssl->options.startedETMRead) {
  13713. word32 digestSz = MacSize(ssl);
  13714. if (size != totalSz &&
  13715. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  13716. return BUFFER_E;
  13717. *inOutIdx += ssl->keys.padSz + digestSz;
  13718. }
  13719. else
  13720. #endif
  13721. {
  13722. /* access beyond input + size should be checked against totalSz
  13723. */
  13724. if (size != totalSz &&
  13725. *inOutIdx + ssl->keys.padSz > totalSz)
  13726. return BUFFER_E;
  13727. *inOutIdx += ssl->keys.padSz;
  13728. }
  13729. }
  13730. break;
  13731. case client_key_exchange:
  13732. WOLFSSL_MSG("processing client key exchange");
  13733. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  13734. break;
  13735. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  13736. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  13737. case certificate_verify:
  13738. WOLFSSL_MSG("processing certificate verify");
  13739. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  13740. break;
  13741. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  13742. #endif /* !NO_WOLFSSL_SERVER */
  13743. default:
  13744. WOLFSSL_MSG("Unknown handshake message type");
  13745. ret = UNKNOWN_HANDSHAKE_TYPE;
  13746. break;
  13747. }
  13748. if (ret == 0 && expectedIdx != *inOutIdx) {
  13749. WOLFSSL_MSG("Extra data in handshake message");
  13750. if (!ssl->options.dtls)
  13751. SendAlert(ssl, alert_fatal, decode_error);
  13752. ret = DECODE_E;
  13753. WOLFSSL_ERROR_VERBOSE(ret);
  13754. }
  13755. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  13756. /* if async, offset index so this msg will be processed again */
  13757. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  13758. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  13759. #ifdef WOLFSSL_DTLS
  13760. if (ssl->options.dtls) {
  13761. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  13762. }
  13763. #endif
  13764. }
  13765. /* make sure async error is cleared */
  13766. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  13767. ssl->error = 0;
  13768. }
  13769. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  13770. #ifdef WOLFSSL_DTLS
  13771. if (ret == 0) {
  13772. if (type == client_hello) {
  13773. /* Advance expected number only if cookie exchange complete */
  13774. if (ssl->msgsReceived.got_client_hello)
  13775. ssl->keys.dtls_expected_peer_handshake_number =
  13776. ssl->keys.dtls_peer_handshake_number + 1;
  13777. }
  13778. else if (type != finished) {
  13779. ssl->keys.dtls_expected_peer_handshake_number++;
  13780. }
  13781. }
  13782. #endif
  13783. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  13784. return ret;
  13785. }
  13786. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  13787. word32 totalSz)
  13788. {
  13789. int ret = 0;
  13790. word32 inputLength;
  13791. WOLFSSL_ENTER("DoHandShakeMsg()");
  13792. if (ssl->arrays == NULL) {
  13793. byte type;
  13794. word32 size;
  13795. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0) {
  13796. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  13797. return PARSE_ERROR;
  13798. }
  13799. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  13800. }
  13801. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  13802. /* If there is a pending fragmented handshake message,
  13803. * pending message size will be non-zero. */
  13804. if (ssl->arrays->pendingMsgSz == 0) {
  13805. byte type;
  13806. word32 size;
  13807. if (GetHandShakeHeader(ssl, input, inOutIdx, &type, &size,
  13808. totalSz) != 0) {
  13809. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  13810. return PARSE_ERROR;
  13811. }
  13812. /* Cap the maximum size of a handshake message to something reasonable.
  13813. * By default is the maximum size of a certificate message assuming
  13814. * nine 2048-bit RSA certificates in the chain. */
  13815. if (size > MAX_HANDSHAKE_SZ) {
  13816. WOLFSSL_MSG("Handshake message too large");
  13817. WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR);
  13818. return HANDSHAKE_SIZE_ERROR;
  13819. }
  13820. /* size is the size of the certificate message payload */
  13821. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  13822. ssl->arrays->pendingMsgType = type;
  13823. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  13824. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  13825. ssl->heap,
  13826. DYNAMIC_TYPE_ARRAYS);
  13827. if (ssl->arrays->pendingMsg == NULL)
  13828. return MEMORY_E;
  13829. XMEMCPY(ssl->arrays->pendingMsg,
  13830. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  13831. inputLength);
  13832. ssl->arrays->pendingMsgOffset = inputLength;
  13833. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  13834. return 0;
  13835. }
  13836. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  13837. }
  13838. else {
  13839. word32 pendSz =
  13840. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  13841. /* Catch the case where there may be the remainder of a fragmented
  13842. * handshake message and the next handshake message in the same
  13843. * record. */
  13844. if (inputLength > pendSz)
  13845. inputLength = pendSz;
  13846. #ifdef WOLFSSL_ASYNC_CRYPT
  13847. if (ssl->error != WC_PENDING_E)
  13848. #endif
  13849. {
  13850. /* for async this copy was already done, do not replace, since
  13851. * contents may have been changed for inline operations */
  13852. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  13853. input + *inOutIdx, inputLength);
  13854. }
  13855. ssl->arrays->pendingMsgOffset += inputLength;
  13856. *inOutIdx += inputLength;
  13857. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  13858. {
  13859. word32 idx = HANDSHAKE_HEADER_SZ;
  13860. ret = DoHandShakeMsgType(ssl,
  13861. ssl->arrays->pendingMsg,
  13862. &idx, ssl->arrays->pendingMsgType,
  13863. ssl->arrays->pendingMsgSz - idx,
  13864. ssl->arrays->pendingMsgSz);
  13865. #ifdef WOLFSSL_ASYNC_CRYPT
  13866. if (ret == WC_PENDING_E) {
  13867. /* setup to process fragment again */
  13868. ssl->arrays->pendingMsgOffset -= inputLength;
  13869. *inOutIdx -= inputLength;
  13870. }
  13871. else
  13872. #endif
  13873. {
  13874. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  13875. ssl->arrays->pendingMsg = NULL;
  13876. ssl->arrays->pendingMsgSz = 0;
  13877. }
  13878. }
  13879. }
  13880. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  13881. return ret;
  13882. }
  13883. #endif /* !WOLFSSL_NO_TLS12 */
  13884. #ifdef WOLFSSL_DTLS
  13885. static int _DtlsCheckWindow(WOLFSSL* ssl)
  13886. {
  13887. word32* window;
  13888. word16 cur_hi, next_hi;
  13889. word32 cur_lo, next_lo, diff;
  13890. int curLT;
  13891. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  13892. if (!ssl->options.haveMcast)
  13893. peerSeq = ssl->keys.peerSeq;
  13894. else {
  13895. #ifdef WOLFSSL_MULTICAST
  13896. WOLFSSL_DTLS_PEERSEQ* p;
  13897. int i;
  13898. for (i = 0, p = ssl->keys.peerSeq;
  13899. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  13900. i++, p++) {
  13901. if (p->peerId == ssl->keys.curPeerId) {
  13902. peerSeq = p;
  13903. break;
  13904. }
  13905. }
  13906. #endif
  13907. }
  13908. if (peerSeq == NULL) {
  13909. WOLFSSL_MSG("Could not find peer sequence");
  13910. return 0;
  13911. }
  13912. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  13913. next_hi = peerSeq->nextSeq_hi;
  13914. next_lo = peerSeq->nextSeq_lo;
  13915. window = peerSeq->window;
  13916. }
  13917. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  13918. next_hi = peerSeq->prevSeq_hi;
  13919. next_lo = peerSeq->prevSeq_lo;
  13920. window = peerSeq->prevWindow;
  13921. }
  13922. else {
  13923. return 0;
  13924. }
  13925. cur_hi = ssl->keys.curSeq_hi;
  13926. cur_lo = ssl->keys.curSeq_lo;
  13927. /* If the difference between next and cur is > 2^32, way outside window. */
  13928. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  13929. WOLFSSL_MSG("Current record from way too far in the future.");
  13930. return 0;
  13931. }
  13932. if (cur_hi == next_hi) {
  13933. curLT = cur_lo < next_lo;
  13934. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  13935. }
  13936. else {
  13937. curLT = cur_hi < next_hi;
  13938. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  13939. }
  13940. /* Check to see that the next value is greater than the number of messages
  13941. * trackable in the window, and that the difference between the next
  13942. * expected sequence number and the received sequence number is inside the
  13943. * window. */
  13944. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  13945. curLT && (diff > DTLS_SEQ_BITS)) {
  13946. WOLFSSL_MSG("Current record sequence number from the past.");
  13947. return 0;
  13948. }
  13949. #ifdef WOLFSSL_DTLS_DISALLOW_FUTURE
  13950. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  13951. WOLFSSL_MSG("Rejecting message too far into the future.");
  13952. return 0;
  13953. }
  13954. #endif
  13955. else if (curLT) {
  13956. word32 idx;
  13957. word32 newDiff;
  13958. if (diff == 0) {
  13959. WOLFSSL_MSG("DTLS sanity check failed");
  13960. return 0;
  13961. }
  13962. diff--;
  13963. idx = diff / DTLS_WORD_BITS;
  13964. newDiff = diff % DTLS_WORD_BITS;
  13965. /* verify idx is valid for window array */
  13966. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  13967. WOLFSSL_MSG("Invalid DTLS windows index");
  13968. return 0;
  13969. }
  13970. if (window[idx] & (1 << newDiff)) {
  13971. WOLFSSL_MSG("Current record sequence number already received.");
  13972. return 0;
  13973. }
  13974. }
  13975. return 1;
  13976. }
  13977. #ifdef WOLFSSL_DTLS13
  13978. static WC_INLINE int Dtls13CheckWindow(WOLFSSL* ssl)
  13979. {
  13980. w64wrapper nextSeq, seq;
  13981. w64wrapper diff64;
  13982. word32 *window;
  13983. int wordOffset;
  13984. int wordIndex;
  13985. word32 diff;
  13986. if (ssl->dtls13DecryptEpoch == NULL) {
  13987. WOLFSSL_MSG("Can't find decrypting epoch");
  13988. return 0;
  13989. }
  13990. nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber;
  13991. window = ssl->dtls13DecryptEpoch->window;
  13992. seq = ssl->keys.curSeq;
  13993. if (w64GTE(seq, nextSeq))
  13994. return 1;
  13995. /* seq < nextSeq, nextSeq - seq */
  13996. diff64 = w64Sub(nextSeq, seq);
  13997. /* diff >= DTLS_SEQ_BITS, outside of the window */
  13998. if (w64GT(diff64, w64From32(0, DTLS_SEQ_BITS)))
  13999. return 0;
  14000. /* we are assuming DTLS_SEQ_BITS <= 2**32 */
  14001. diff = w64GetLow32(diff64);
  14002. /* zero based index */
  14003. diff--;
  14004. wordIndex = ((int)diff) / DTLS_WORD_BITS;
  14005. wordOffset = ((int)diff) % DTLS_WORD_BITS;
  14006. if (window[wordIndex] & (1 << wordOffset))
  14007. return 0;
  14008. return 1;
  14009. }
  14010. #endif /* WOLFSSL_DTLS13 */
  14011. #ifdef WOLFSSL_MULTICAST
  14012. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  14013. word32 second, word32 high)
  14014. {
  14015. word32 newCur = 0;
  14016. if (cur < first)
  14017. newCur = first;
  14018. else if (cur < second)
  14019. newCur = second;
  14020. else if (cur < high)
  14021. newCur = high;
  14022. return newCur;
  14023. }
  14024. #endif /* WOLFSSL_MULTICAST */
  14025. /* diff is the difference between the message sequence and the
  14026. * expected sequence number. 0 is special where it is an overflow. */
  14027. static void _DtlsUpdateWindowGTSeq(word32 diff, word32* window)
  14028. {
  14029. word32 idx, temp, i;
  14030. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  14031. if (diff == 0 || diff >= DTLS_SEQ_BITS)
  14032. XMEMSET(window, 0, DTLS_SEQ_SZ);
  14033. else {
  14034. temp = 0;
  14035. idx = diff / DTLS_WORD_BITS;
  14036. diff %= DTLS_WORD_BITS;
  14037. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  14038. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  14039. if (i < idx)
  14040. window[i] = 0;
  14041. else {
  14042. temp |= (oldWindow[i-idx] << diff);
  14043. window[i] = temp;
  14044. if (diff > 0)
  14045. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - diff);
  14046. else
  14047. temp = 0;
  14048. }
  14049. }
  14050. }
  14051. window[0] |= 1;
  14052. }
  14053. int wolfSSL_DtlsUpdateWindow(word16 cur_hi, word32 cur_lo,
  14054. word16* next_hi, word32* next_lo, word32 *window)
  14055. {
  14056. word32 diff;
  14057. int curLT;
  14058. if (cur_hi == *next_hi) {
  14059. curLT = cur_lo < *next_lo;
  14060. diff = curLT ? *next_lo - cur_lo : cur_lo - *next_lo;
  14061. }
  14062. else {
  14063. if (cur_hi > *next_hi + 1) {
  14064. /* reset window */
  14065. _DtlsUpdateWindowGTSeq(0, window);
  14066. *next_lo = cur_lo + 1;
  14067. if (*next_lo == 0)
  14068. *next_hi = cur_hi + 1;
  14069. else
  14070. *next_hi = cur_hi;
  14071. return 1;
  14072. }
  14073. else if (*next_hi > cur_hi + 1) {
  14074. return 1;
  14075. }
  14076. else {
  14077. curLT = cur_hi < *next_hi;
  14078. if (curLT) {
  14079. if (*next_lo < DTLS_SEQ_BITS &&
  14080. cur_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS)) {
  14081. /* diff here can still result in a difference that can not
  14082. * be stored in the window. The index is checked against
  14083. * WOLFSSL_DTLS_WINDOW_WORDS later. */
  14084. diff = *next_lo + ((word32)0xFFFFFFFF - cur_lo) + 1;
  14085. }
  14086. else {
  14087. /* Too far back to update */
  14088. return 1;
  14089. }
  14090. }
  14091. else {
  14092. if (*next_lo >= (((word32)0xFFFFFFFF) - DTLS_SEQ_BITS) &&
  14093. cur_lo < DTLS_SEQ_BITS) {
  14094. /* diff here can still result in a difference that can not
  14095. * be stored in the window. The index is checked against
  14096. * WOLFSSL_DTLS_WINDOW_WORDS later. */
  14097. diff = cur_lo - *next_lo;
  14098. }
  14099. else {
  14100. _DtlsUpdateWindowGTSeq(0, window);
  14101. *next_lo = cur_lo + 1;
  14102. if (*next_lo == 0)
  14103. *next_hi = cur_hi + 1;
  14104. else
  14105. *next_hi = cur_hi;
  14106. return 1;
  14107. }
  14108. }
  14109. }
  14110. }
  14111. if (curLT) {
  14112. word32 idx;
  14113. diff--;
  14114. idx = diff / DTLS_WORD_BITS;
  14115. diff %= DTLS_WORD_BITS;
  14116. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  14117. window[idx] |= (1 << diff);
  14118. }
  14119. else {
  14120. _DtlsUpdateWindowGTSeq(diff + 1, window);
  14121. *next_lo = cur_lo + 1;
  14122. if (*next_lo == 0)
  14123. *next_hi = cur_hi + 1;
  14124. else
  14125. *next_hi = cur_hi;
  14126. }
  14127. return 1;
  14128. }
  14129. static int _DtlsUpdateWindow(WOLFSSL* ssl)
  14130. {
  14131. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  14132. word16 *next_hi;
  14133. word32 *next_lo;
  14134. word32* window;
  14135. #ifdef WOLFSSL_MULTICAST
  14136. word32 cur_lo = ssl->keys.curSeq_lo;
  14137. if (ssl->options.haveMcast) {
  14138. WOLFSSL_DTLS_PEERSEQ* p;
  14139. int i;
  14140. peerSeq = NULL;
  14141. for (i = 0, p = ssl->keys.peerSeq;
  14142. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  14143. i++, p++) {
  14144. if (p->peerId == ssl->keys.curPeerId) {
  14145. peerSeq = p;
  14146. break;
  14147. }
  14148. }
  14149. if (peerSeq == NULL) {
  14150. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  14151. return 0;
  14152. }
  14153. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  14154. int cbError = 0;
  14155. if (ssl->ctx->mcastHwCb)
  14156. cbError = ssl->ctx->mcastHwCb(p->peerId,
  14157. ssl->ctx->mcastMaxSeq,
  14158. cur_lo, ssl->mcastHwCbCtx);
  14159. if (cbError) {
  14160. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  14161. return MCAST_HIGHWATER_CB_E;
  14162. }
  14163. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  14164. ssl->ctx->mcastFirstSeq,
  14165. ssl->ctx->mcastSecondSeq,
  14166. ssl->ctx->mcastMaxSeq);
  14167. }
  14168. }
  14169. #endif
  14170. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  14171. next_hi = &peerSeq->nextSeq_hi;
  14172. next_lo = &peerSeq->nextSeq_lo;
  14173. window = peerSeq->window;
  14174. }
  14175. else {
  14176. next_hi = &peerSeq->prevSeq_hi;
  14177. next_lo = &peerSeq->prevSeq_lo;
  14178. window = peerSeq->prevWindow;
  14179. }
  14180. return wolfSSL_DtlsUpdateWindow(ssl->keys.curSeq_hi, ssl->keys.curSeq_lo,
  14181. next_hi, next_lo, window);
  14182. }
  14183. #ifdef WOLFSSL_DTLS13
  14184. static WC_INLINE int Dtls13UpdateWindow(WOLFSSL* ssl)
  14185. {
  14186. w64wrapper nextSeq, seq;
  14187. w64wrapper diff64;
  14188. word32 *window;
  14189. int wordOffset;
  14190. int wordIndex;
  14191. word32 diff;
  14192. if (ssl->dtls13DecryptEpoch == NULL) {
  14193. WOLFSSL_MSG("Can't find decrypting Epoch");
  14194. return BAD_STATE_E;
  14195. }
  14196. nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber;
  14197. window = ssl->dtls13DecryptEpoch->window;
  14198. seq = ssl->keys.curSeq;
  14199. /* seq < nextSeq */
  14200. if (w64LT(seq, nextSeq)) {
  14201. diff64 = w64Sub(nextSeq, seq);
  14202. /* zero based index */
  14203. w64Decrement(&diff64);
  14204. /* FIXME: check that diff64 < DTLS_WORDS_BITS */
  14205. diff = w64GetLow32(diff64);
  14206. wordIndex = ((int)diff) / DTLS_WORD_BITS;
  14207. wordOffset = ((int)diff) % DTLS_WORD_BITS;
  14208. if (wordIndex >= WOLFSSL_DTLS_WINDOW_WORDS) {
  14209. WOLFSSL_MSG("Invalid sequence number to Dtls13UpdateWindow");
  14210. return BAD_STATE_E;
  14211. }
  14212. window[wordIndex] |= (1 << wordOffset);
  14213. return 1;
  14214. }
  14215. /* seq >= nextSeq, seq - nextSeq */
  14216. diff64 = w64Sub(seq, nextSeq);
  14217. /* as we are considering nextSeq inside the window, we should add + 1 */
  14218. w64Increment(&diff64);
  14219. _DtlsUpdateWindowGTSeq(w64GetLow32(diff64), window);
  14220. w64Increment(&seq);
  14221. ssl->dtls13DecryptEpoch->nextPeerSeqNumber = seq;
  14222. return 1;
  14223. }
  14224. #endif /* WOLFSSL_DTLS13 */
  14225. int DtlsMsgDrain(WOLFSSL* ssl)
  14226. {
  14227. DtlsMsg* item = ssl->dtls_rx_msg_list;
  14228. int ret = 0;
  14229. WOLFSSL_ENTER("DtlsMsgDrain()");
  14230. /* While there is an item in the store list, and it is the expected
  14231. * message, and it is complete, and there hasn't been an error in the
  14232. * last message... */
  14233. while (item != NULL &&
  14234. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  14235. item->fragSz == item->sz &&
  14236. ret == 0) {
  14237. word32 idx = 0;
  14238. #ifdef WOLFSSL_NO_TLS12
  14239. ret = DoTls13HandShakeMsgType(ssl, item->msg, &idx, item->type,
  14240. item->sz, item->sz);
  14241. #else
  14242. ret = DoHandShakeMsgType(ssl, item->msg, &idx, item->type,
  14243. item->sz, item->sz);
  14244. #endif
  14245. if (ret == 0) {
  14246. DtlsTxMsgListClean(ssl);
  14247. }
  14248. #ifdef WOLFSSL_ASYNC_CRYPT
  14249. if (ret == WC_PENDING_E) {
  14250. break;
  14251. }
  14252. #endif
  14253. ssl->dtls_rx_msg_list = item->next;
  14254. DtlsMsgDelete(item, ssl->heap);
  14255. item = ssl->dtls_rx_msg_list;
  14256. ssl->dtls_rx_msg_list_sz--;
  14257. }
  14258. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  14259. return ret;
  14260. }
  14261. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  14262. word32 totalSz)
  14263. {
  14264. byte type;
  14265. word32 size;
  14266. word32 fragOffset, fragSz;
  14267. int ret = 0;
  14268. int ignoreFinished = 0;
  14269. WOLFSSL_ENTER("DoDtlsHandShakeMsg()");
  14270. /* parse header */
  14271. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  14272. &size, &fragOffset, &fragSz, totalSz) != 0) {
  14273. WOLFSSL_ERROR(PARSE_ERROR);
  14274. return PARSE_ERROR;
  14275. }
  14276. /* Cap the maximum size of a handshake message to something reasonable.
  14277. * By default is the maximum size of a certificate message assuming
  14278. * nine 2048-bit RSA certificates in the chain. */
  14279. if (size > MAX_HANDSHAKE_SZ) {
  14280. WOLFSSL_MSG("Handshake message too large");
  14281. return HANDSHAKE_SIZE_ERROR;
  14282. }
  14283. /* check that we have complete fragment */
  14284. if (*inOutIdx + fragSz > totalSz) {
  14285. WOLFSSL_ERROR(INCOMPLETE_DATA);
  14286. return INCOMPLETE_DATA;
  14287. }
  14288. /* check that the fragment is contained in the message */
  14289. if (fragOffset + fragSz > size) {
  14290. WOLFSSL_ERROR(LENGTH_ERROR);
  14291. return LENGTH_ERROR;
  14292. }
  14293. if (type == finished && ssl->keys.dtls_peer_handshake_number >=
  14294. ssl->keys.dtls_expected_peer_handshake_number &&
  14295. ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
  14296. /* finished msg should be ignore from the current epoch
  14297. * if it comes from a previous handshake */
  14298. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  14299. ignoreFinished = ssl->options.connectState < FINISHED_DONE;
  14300. }
  14301. else {
  14302. ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
  14303. }
  14304. }
  14305. /* Check the handshake sequence number first. If out of order,
  14306. * add the current message to the list. If the message is in order,
  14307. * but it is a fragment, add the current message to the list, then
  14308. * check the head of the list to see if it is complete, if so, pop
  14309. * it out as the current message. If the message is complete and in
  14310. * order, process it. Check the head of the list to see if it is in
  14311. * order, if so, process it. (Repeat until list exhausted.) If the
  14312. * head is out of order, return for more processing.
  14313. */
  14314. if (ssl->keys.dtls_peer_handshake_number >
  14315. ssl->keys.dtls_expected_peer_handshake_number &&
  14316. /* Only client_hello shouldn't be ignored if the handshake
  14317. * num is greater */
  14318. (type == client_hello ||
  14319. ssl->options.handShakeState != HANDSHAKE_DONE) &&
  14320. !ignoreFinished) {
  14321. /* Current message is out of order. It will get stored in the list.
  14322. * Storing also takes care of defragmentation. If the messages is a
  14323. * client hello, we need to process this out of order; the server
  14324. * is not supposed to keep state, but the second client hello will
  14325. * have a different handshake sequence number than is expected, and
  14326. * the server shouldn't be expecting any particular handshake sequence
  14327. * number. (If the cookie changes multiple times in quick succession,
  14328. * the client could be sending multiple new client hello messages
  14329. * with newer and newer cookies.) */
  14330. if (type != client_hello) {
  14331. WOLFSSL_MSG("Current message is out of order");
  14332. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  14333. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  14334. ssl->keys.dtls_peer_handshake_number,
  14335. input + *inOutIdx, size, type,
  14336. fragOffset, fragSz, ssl->heap);
  14337. }
  14338. *inOutIdx += fragSz;
  14339. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14340. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14341. word32 digestSz = MacSize(ssl);
  14342. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) {
  14343. WOLFSSL_ERROR(BUFFER_E);
  14344. return BUFFER_E;
  14345. }
  14346. *inOutIdx += digestSz;
  14347. }
  14348. else
  14349. #endif
  14350. {
  14351. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  14352. WOLFSSL_ERROR(BUFFER_E);
  14353. return BUFFER_E;
  14354. }
  14355. }
  14356. *inOutIdx += ssl->keys.padSz;
  14357. ret = 0;
  14358. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  14359. /* If we receive an out of order last flight msg then retransmit */
  14360. if (type == server_hello_done || type == finished) {
  14361. ret = DtlsMsgPoolSend(ssl, 0);
  14362. }
  14363. #endif
  14364. }
  14365. else {
  14366. if (fragSz < size) {
  14367. /* a fragmented ClientHello, very probably forged or
  14368. erroneous. Even if the packet is valid, we don't want to save
  14369. state while processing a ClientHello to avoid DoS attacks */
  14370. WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
  14371. *inOutIdx = totalSz;
  14372. }
  14373. else {
  14374. #ifdef WOLFSSL_NO_TLS12
  14375. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  14376. totalSz);
  14377. #else
  14378. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size,
  14379. totalSz);
  14380. #endif
  14381. }
  14382. }
  14383. }
  14384. else if (ssl->keys.dtls_peer_handshake_number <
  14385. ssl->keys.dtls_expected_peer_handshake_number ||
  14386. /* ignore all handshake messages if we are done with the
  14387. * handshake */
  14388. (ssl->keys.dtls_peer_handshake_number >
  14389. ssl->keys.dtls_expected_peer_handshake_number &&
  14390. ssl->options.handShakeState == HANDSHAKE_DONE) ||
  14391. ignoreFinished) {
  14392. /* Already saw this message and processed it. It can be ignored. */
  14393. WOLFSSL_MSG("Already saw this message and processed it");
  14394. *inOutIdx += fragSz;
  14395. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14396. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14397. word32 digestSz = MacSize(ssl);
  14398. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz) {
  14399. WOLFSSL_ERROR(BUFFER_E);
  14400. return BUFFER_E;
  14401. }
  14402. *inOutIdx += digestSz;
  14403. }
  14404. else
  14405. #endif
  14406. {
  14407. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  14408. WOLFSSL_ERROR(BUFFER_E);
  14409. return BUFFER_E;
  14410. }
  14411. }
  14412. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  14413. if (IsDtlsNotSctpMode(ssl) &&
  14414. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  14415. ret = DtlsMsgPoolSend(ssl, 0);
  14416. }
  14417. #endif
  14418. *inOutIdx += ssl->keys.padSz;
  14419. }
  14420. else if (fragSz < size) {
  14421. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  14422. * be pointing to the message with this fragment in it. Check it to see
  14423. * if it is completed. */
  14424. WOLFSSL_MSG("Branch is in order, but fragmented");
  14425. if (type == client_hello) {
  14426. WOLFSSL_MSG("Ignoring datagram with fragmented ClientHello");
  14427. *inOutIdx = totalSz;
  14428. return 0;
  14429. }
  14430. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  14431. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  14432. ssl->keys.dtls_peer_handshake_number,
  14433. input + *inOutIdx, size, type,
  14434. fragOffset, fragSz, ssl->heap);
  14435. }
  14436. *inOutIdx += fragSz;
  14437. *inOutIdx += ssl->keys.padSz;
  14438. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14439. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14440. word32 digestSz = MacSize(ssl);
  14441. if (*inOutIdx + digestSz > totalSz) {
  14442. WOLFSSL_ERROR(BUFFER_E);
  14443. return BUFFER_E;
  14444. }
  14445. *inOutIdx += digestSz;
  14446. }
  14447. #endif
  14448. ret = 0;
  14449. if (ssl->dtls_rx_msg_list != NULL &&
  14450. ssl->dtls_rx_msg_list->fragSz >= ssl->dtls_rx_msg_list->sz)
  14451. ret = DtlsMsgDrain(ssl);
  14452. }
  14453. else {
  14454. /* This branch is in order next, and a complete message. On success
  14455. * clean the tx list. */
  14456. WOLFSSL_MSG("Branch is in order and a complete message");
  14457. #ifdef WOLFSSL_ASYNC_CRYPT
  14458. if (ssl->devId != INVALID_DEVID) {
  14459. word32 idx = *inOutIdx;
  14460. if (ssl->dtls_rx_msg_list_sz >= DTLS_POOL_SZ) {
  14461. WOLFSSL_ERROR(BUFFER_ERROR);
  14462. return BUFFER_ERROR;
  14463. }
  14464. if (idx + fragSz + ssl->keys.padSz > totalSz)
  14465. return BUFFER_E;
  14466. *inOutIdx = idx + fragSz + ssl->keys.padSz;
  14467. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14468. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  14469. word32 digestSz = MacSize(ssl);
  14470. if (*inOutIdx + digestSz > totalSz)
  14471. return BUFFER_E;
  14472. *inOutIdx += digestSz;
  14473. }
  14474. #endif
  14475. /* In async mode always store the message and process it with
  14476. * DtlsMsgDrain because in case of a WC_PENDING_E it will be
  14477. * easier this way. */
  14478. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  14479. ssl->keys.dtls_peer_handshake_number,
  14480. input + idx, size, type,
  14481. fragOffset, fragSz, ssl->heap);
  14482. ret = DtlsMsgDrain(ssl);
  14483. }
  14484. else
  14485. #endif
  14486. {
  14487. #ifdef WOLFSSL_NO_TLS12
  14488. ret = DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  14489. totalSz);
  14490. #else
  14491. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  14492. #endif
  14493. if (ret == 0) {
  14494. DtlsTxMsgListClean(ssl);
  14495. if (ssl->dtls_rx_msg_list != NULL) {
  14496. ret = DtlsMsgDrain(ssl);
  14497. }
  14498. }
  14499. }
  14500. }
  14501. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  14502. return ret;
  14503. }
  14504. #endif /* WOLFSSL_DTLS13 */
  14505. #ifndef WOLFSSL_NO_TLS12
  14506. #ifdef HAVE_AEAD
  14507. #if (!defined(NO_PUBLIC_GCM_SET_IV) && \
  14508. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  14509. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
  14510. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
  14511. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  14512. {
  14513. int i;
  14514. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  14515. if (++ssl->keys.aead_exp_IV[i]) return;
  14516. }
  14517. }
  14518. #endif
  14519. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && !defined(NO_CHAPOL_AEAD)
  14520. /* Used for the older version of creating AEAD tags with Poly1305 */
  14521. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  14522. byte* cipher, word16 sz, byte* tag)
  14523. {
  14524. int ret = 0;
  14525. int msglen = (sz - ssl->specs.aead_mac_size);
  14526. word32 keySz = 32;
  14527. byte padding[8]; /* used to temporarily store lengths */
  14528. #ifdef CHACHA_AEAD_TEST
  14529. printf("Using old version of poly1305 input.\n");
  14530. #endif
  14531. if (msglen < 0)
  14532. return INPUT_CASE_ERROR;
  14533. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  14534. return ret;
  14535. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  14536. AEAD_AUTH_DATA_SZ)) != 0)
  14537. return ret;
  14538. /* length of additional input plus padding */
  14539. XMEMSET(padding, 0, sizeof(padding));
  14540. padding[0] = AEAD_AUTH_DATA_SZ;
  14541. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  14542. sizeof(padding))) != 0)
  14543. return ret;
  14544. /* add cipher info and then its length */
  14545. XMEMSET(padding, 0, sizeof(padding));
  14546. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  14547. return ret;
  14548. /* 32 bit size of cipher to 64 bit endian */
  14549. padding[0] = msglen & 0xff;
  14550. padding[1] = (msglen >> 8) & 0xff;
  14551. padding[2] = ((word32)msglen >> 16) & 0xff;
  14552. padding[3] = ((word32)msglen >> 24) & 0xff;
  14553. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  14554. != 0)
  14555. return ret;
  14556. /* generate tag */
  14557. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  14558. return ret;
  14559. return ret;
  14560. }
  14561. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  14562. * the implementation follows an older draft for creating the nonce and MAC.
  14563. * The flag oldPoly gets set automatically depending on what cipher suite was
  14564. * negotiated in the handshake. This is able to be done because the IDs for the
  14565. * cipher suites was updated in RFC7905 giving unique values for the older
  14566. * draft in comparison to the more recent RFC.
  14567. *
  14568. * ssl WOLFSSL structure to get cipher and TLS state from
  14569. * out output buffer to hold encrypted data
  14570. * input data to encrypt
  14571. * sz size of input
  14572. *
  14573. * Return 0 on success negative values in error case
  14574. */
  14575. int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  14576. word16 sz)
  14577. {
  14578. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  14579. int ret = 0;
  14580. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  14581. byte tag[POLY1305_AUTH_SZ];
  14582. byte add[AEAD_AUTH_DATA_SZ];
  14583. byte nonce[CHACHA20_NONCE_SZ];
  14584. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  14585. #ifdef CHACHA_AEAD_TEST
  14586. int i;
  14587. #endif
  14588. Keys* keys = &ssl->keys;
  14589. XMEMSET(tag, 0, sizeof(tag));
  14590. XMEMSET(nonce, 0, sizeof(nonce));
  14591. XMEMSET(poly, 0, sizeof(poly));
  14592. XMEMSET(add, 0, sizeof(add));
  14593. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  14594. /*
  14595. * For epochs 2+:
  14596. * * use ssl->secure_renegotiation when encrypting the current epoch as it
  14597. * has the current epoch cipher material
  14598. * * use PREV_ORDER if encrypting the epoch not in
  14599. * ssl->secure_renegotiation
  14600. */
  14601. /* opaque SEQ number stored for AD */
  14602. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  14603. if (ssl->keys.dtls_epoch ==
  14604. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  14605. keys = &ssl->secure_renegotiation->tmp_keys;
  14606. WriteSEQ(ssl, CUR_ORDER, add);
  14607. }
  14608. else
  14609. WriteSEQ(ssl, PREV_ORDER, add);
  14610. }
  14611. else
  14612. #endif
  14613. WriteSEQ(ssl, CUR_ORDER, add);
  14614. if (ssl->options.oldPoly != 0) {
  14615. /* get nonce. SEQ should not be incremented again here */
  14616. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  14617. }
  14618. /* Store the type, version. Unfortunately, they are in
  14619. * the input buffer ahead of the plaintext. */
  14620. #ifdef WOLFSSL_DTLS
  14621. if (ssl->options.dtls) {
  14622. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  14623. }
  14624. #endif
  14625. /* add TLS message size to additional data */
  14626. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  14627. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  14628. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  14629. #ifdef CHACHA_AEAD_TEST
  14630. printf("Encrypt Additional : ");
  14631. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  14632. printf("%02x", add[i]);
  14633. }
  14634. printf("\n\n");
  14635. printf("input before encryption :\n");
  14636. for (i = 0; i < sz; i++) {
  14637. printf("%02x", input[i]);
  14638. if ((i + 1) % 16 == 0)
  14639. printf("\n");
  14640. }
  14641. printf("\n");
  14642. #endif
  14643. if (ssl->options.oldPoly == 0) {
  14644. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  14645. * record sequence number XORed with client_write_IV/server_write_IV */
  14646. XMEMCPY(nonce, keys->aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  14647. nonce[4] ^= add[0];
  14648. nonce[5] ^= add[1];
  14649. nonce[6] ^= add[2];
  14650. nonce[7] ^= add[3];
  14651. nonce[8] ^= add[4];
  14652. nonce[9] ^= add[5];
  14653. nonce[10] ^= add[6];
  14654. nonce[11] ^= add[7];
  14655. }
  14656. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14657. wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
  14658. #endif
  14659. /* set the nonce for chacha and get poly1305 key */
  14660. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  14661. ForceZero(nonce, CHACHA20_NONCE_SZ);
  14662. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14663. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14664. #endif
  14665. return ret;
  14666. }
  14667. /* create Poly1305 key using chacha20 keystream */
  14668. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  14669. poly, sizeof(poly))) != 0) {
  14670. ForceZero(nonce, CHACHA20_NONCE_SZ);
  14671. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14672. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14673. #endif
  14674. return ret;
  14675. }
  14676. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14677. wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
  14678. #endif
  14679. /* set the counter after getting poly1305 key */
  14680. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
  14681. ForceZero(nonce, CHACHA20_NONCE_SZ);
  14682. ForceZero(poly, sizeof(poly));
  14683. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14684. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14685. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14686. #endif
  14687. return ret;
  14688. }
  14689. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  14690. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14691. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14692. #endif
  14693. /* encrypt the plain text */
  14694. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  14695. input, msgLen)) != 0) {
  14696. ForceZero(poly, sizeof(poly));
  14697. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14698. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14699. #endif
  14700. return ret;
  14701. }
  14702. /* get the poly1305 tag using either old padding scheme or more recent */
  14703. if (ssl->options.oldPoly != 0) {
  14704. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  14705. poly, sz, tag)) != 0) {
  14706. ForceZero(poly, sizeof(poly));
  14707. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14708. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14709. #endif
  14710. return ret;
  14711. }
  14712. }
  14713. else {
  14714. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  14715. sizeof(poly))) != 0) {
  14716. ForceZero(poly, sizeof(poly));
  14717. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14718. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14719. #endif
  14720. return ret;
  14721. }
  14722. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  14723. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  14724. ForceZero(poly, sizeof(poly));
  14725. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14726. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14727. #endif
  14728. return ret;
  14729. }
  14730. }
  14731. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  14732. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14733. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14734. #endif
  14735. /* append tag to ciphertext */
  14736. XMEMCPY(out + msgLen, tag, sizeof(tag));
  14737. AeadIncrementExpIV(ssl);
  14738. #ifdef CHACHA_AEAD_TEST
  14739. printf("mac tag :\n");
  14740. for (i = 0; i < 16; i++) {
  14741. printf("%02x", tag[i]);
  14742. if ((i + 1) % 16 == 0)
  14743. printf("\n");
  14744. }
  14745. printf("\n\noutput after encrypt :\n");
  14746. for (i = 0; i < sz; i++) {
  14747. printf("%02x", out[i]);
  14748. if ((i + 1) % 16 == 0)
  14749. printf("\n");
  14750. }
  14751. printf("\n");
  14752. #endif
  14753. return ret;
  14754. }
  14755. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  14756. * the implementation follows an older draft for creating the nonce and MAC.
  14757. * The flag oldPoly gets set automatically depending on what cipher suite was
  14758. * negotiated in the handshake. This is able to be done because the IDs for the
  14759. * cipher suites was updated in RFC7905 giving unique values for the older
  14760. * draft in comparison to the more recent RFC.
  14761. *
  14762. * ssl WOLFSSL structure to get cipher and TLS state from
  14763. * plain output buffer to hold decrypted data
  14764. * input data to decrypt
  14765. * sz size of input
  14766. *
  14767. * Return 0 on success negative values in error case
  14768. */
  14769. static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  14770. word16 sz)
  14771. {
  14772. byte add[AEAD_AUTH_DATA_SZ];
  14773. byte nonce[CHACHA20_NONCE_SZ];
  14774. byte tag[POLY1305_AUTH_SZ];
  14775. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  14776. int ret = 0;
  14777. int msgLen = (sz - ssl->specs.aead_mac_size);
  14778. Keys* keys = &ssl->keys;
  14779. #ifdef CHACHA_AEAD_TEST
  14780. int i;
  14781. printf("input before decrypt :\n");
  14782. for (i = 0; i < sz; i++) {
  14783. printf("%02x", input[i]);
  14784. if ((i + 1) % 16 == 0)
  14785. printf("\n");
  14786. }
  14787. printf("\n");
  14788. #endif
  14789. XMEMSET(tag, 0, sizeof(tag));
  14790. XMEMSET(poly, 0, sizeof(poly));
  14791. XMEMSET(nonce, 0, sizeof(nonce));
  14792. XMEMSET(add, 0, sizeof(add));
  14793. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  14794. /*
  14795. * For epochs 2+:
  14796. * * use ssl->secure_renegotiation when decrypting the latest epoch as it
  14797. * has the latest epoch cipher material
  14798. */
  14799. if (ssl->options.dtls && DtlsSCRKeysSet(ssl) &&
  14800. ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  14801. keys = &ssl->secure_renegotiation->tmp_keys;
  14802. #endif
  14803. /* sequence number field is 64-bits */
  14804. WriteSEQ(ssl, PEER_ORDER, add);
  14805. if (ssl->options.oldPoly != 0) {
  14806. /* get nonce, SEQ should not be incremented again here */
  14807. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  14808. }
  14809. /* get AD info */
  14810. /* Store the type, version. */
  14811. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  14812. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  14813. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  14814. /* add TLS message size to additional data */
  14815. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  14816. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  14817. #ifdef CHACHA_AEAD_TEST
  14818. printf("Decrypt Additional : ");
  14819. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  14820. printf("%02x", add[i]);
  14821. }
  14822. printf("\n\n");
  14823. #endif
  14824. if (ssl->options.oldPoly == 0) {
  14825. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  14826. * record sequence number XORed with client_write_IV/server_write_IV */
  14827. XMEMCPY(nonce, keys->aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  14828. nonce[4] ^= add[0];
  14829. nonce[5] ^= add[1];
  14830. nonce[6] ^= add[2];
  14831. nonce[7] ^= add[3];
  14832. nonce[8] ^= add[4];
  14833. nonce[9] ^= add[5];
  14834. nonce[10] ^= add[6];
  14835. nonce[11] ^= add[7];
  14836. }
  14837. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14838. wc_MemZero_Add("ChachaAEADEncrypt nonce", nonce, CHACHA20_NONCE_SZ);
  14839. #endif
  14840. /* set nonce and get poly1305 key */
  14841. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  14842. ForceZero(nonce, CHACHA20_NONCE_SZ);
  14843. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14844. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14845. #endif
  14846. return ret;
  14847. }
  14848. /* use chacha20 keystream to get poly1305 key for tag */
  14849. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  14850. poly, sizeof(poly))) != 0) {
  14851. ForceZero(nonce, CHACHA20_NONCE_SZ);
  14852. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14853. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14854. #endif
  14855. return ret;
  14856. }
  14857. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14858. wc_MemZero_Add("ChachaAEADEncrypt poly", poly, CHACHA20_256_KEY_SIZE);
  14859. #endif
  14860. /* set counter after getting poly1305 key */
  14861. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
  14862. ForceZero(nonce, CHACHA20_NONCE_SZ);
  14863. ForceZero(poly, sizeof(poly));
  14864. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14865. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14866. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14867. #endif
  14868. return ret;
  14869. }
  14870. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  14871. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14872. wc_MemZero_Check(nonce, CHACHA20_NONCE_SZ);
  14873. #endif
  14874. /* get the tag using Poly1305 */
  14875. if (ssl->options.oldPoly != 0) {
  14876. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  14877. ForceZero(poly, sizeof(poly));
  14878. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14879. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14880. #endif
  14881. return ret;
  14882. }
  14883. }
  14884. else {
  14885. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  14886. sizeof(poly))) != 0) {
  14887. ForceZero(poly, sizeof(poly));
  14888. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14889. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14890. #endif
  14891. return ret;
  14892. }
  14893. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  14894. sizeof(add), input, msgLen, tag, sizeof(tag))) != 0) {
  14895. ForceZero(poly, sizeof(poly));
  14896. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14897. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14898. #endif
  14899. return ret;
  14900. }
  14901. }
  14902. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  14903. #ifdef WOLFSSL_CHECK_MEM_ZERO
  14904. wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE);
  14905. #endif
  14906. /* check tag sent along with packet */
  14907. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  14908. WOLFSSL_MSG("MAC did not match");
  14909. if (!ssl->options.dtls)
  14910. SendAlert(ssl, alert_fatal, bad_record_mac);
  14911. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  14912. return VERIFY_MAC_ERROR;
  14913. }
  14914. /* if the tag was good decrypt message */
  14915. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  14916. input, msgLen)) != 0)
  14917. return ret;
  14918. #ifdef CHACHA_AEAD_TEST
  14919. printf("plain after decrypt :\n");
  14920. for (i = 0; i < sz; i++) {
  14921. printf("%02x", plain[i]);
  14922. if ((i + 1) % 16 == 0)
  14923. printf("\n");
  14924. }
  14925. printf("\n");
  14926. #endif
  14927. return ret;
  14928. }
  14929. #endif /* HAVE_CHACHA && HAVE_POLY1305 && !NO_CHAPOL_AEAD*/
  14930. #endif /* HAVE_AEAD */
  14931. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  14932. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  14933. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  14934. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  14935. /* The following type is used to share code between AES-GCM and AES-CCM. */
  14936. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  14937. const byte* in, word32 sz,
  14938. byte* iv, word32 ivSz,
  14939. byte* authTag, word32 authTagSz,
  14940. const byte* authIn, word32 authInSz);
  14941. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  14942. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  14943. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  14944. #else
  14945. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  14946. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  14947. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  14948. #endif
  14949. #endif
  14950. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  14951. word16 sz, int asyncOkay)
  14952. {
  14953. int ret = 0;
  14954. #ifdef WOLFSSL_ASYNC_CRYPT
  14955. WC_ASYNC_DEV* asyncDev = NULL;
  14956. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  14957. #else
  14958. (void)asyncOkay;
  14959. #endif
  14960. (void)out;
  14961. (void)input;
  14962. (void)sz;
  14963. if (input == NULL) {
  14964. return BAD_FUNC_ARG;
  14965. }
  14966. switch (ssl->specs.bulk_cipher_algorithm) {
  14967. #ifdef BUILD_ARC4
  14968. case wolfssl_rc4:
  14969. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  14970. break;
  14971. #endif
  14972. #ifdef BUILD_DES3
  14973. case wolfssl_triple_des:
  14974. #ifdef WOLFSSL_ASYNC_CRYPT
  14975. /* initialize event */
  14976. asyncDev = &ssl->encrypt.des3->asyncDev;
  14977. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  14978. if (ret != 0)
  14979. break;
  14980. #endif
  14981. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  14982. #ifdef WOLFSSL_ASYNC_CRYPT
  14983. if (ret == WC_PENDING_E && asyncOkay) {
  14984. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  14985. }
  14986. #endif
  14987. break;
  14988. #endif
  14989. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  14990. case wolfssl_aes:
  14991. #ifdef WOLFSSL_ASYNC_CRYPT
  14992. /* initialize event */
  14993. asyncDev = &ssl->encrypt.aes->asyncDev;
  14994. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  14995. if (ret != 0)
  14996. break;
  14997. #endif
  14998. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  14999. #ifdef WOLFSSL_ASYNC_CRYPT
  15000. if (ret == WC_PENDING_E && asyncOkay) {
  15001. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15002. }
  15003. #endif
  15004. break;
  15005. #endif
  15006. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15007. case wolfssl_aes_gcm:
  15008. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  15009. {
  15010. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  15011. const byte* additionalSrc;
  15012. #ifdef WOLFSSL_ASYNC_CRYPT
  15013. /* initialize event */
  15014. asyncDev = &ssl->encrypt.aes->asyncDev;
  15015. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  15016. if (ret != 0)
  15017. break;
  15018. #endif
  15019. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  15020. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  15021. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  15022. #elif defined(BUILD_AESGCM)
  15023. aes_auth_fn = AES_GCM_ENCRYPT;
  15024. #else
  15025. aes_auth_fn = AES_CCM_ENCRYPT;
  15026. #endif
  15027. additionalSrc = input - 5;
  15028. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  15029. /* sequence number field is 64-bits */
  15030. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  15031. /* Store the type, version. Unfortunately, they are in
  15032. * the input buffer ahead of the plaintext. */
  15033. #ifdef WOLFSSL_DTLS
  15034. if (ssl->options.dtls) {
  15035. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  15036. }
  15037. #endif
  15038. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  15039. additionalSrc, 3);
  15040. /* Store the length of the plain text minus the explicit
  15041. * IV length minus the authentication tag size. */
  15042. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15043. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  15044. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15045. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  15046. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  15047. XMEMCPY(ssl->encrypt.nonce,
  15048. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  15049. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  15050. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  15051. #endif
  15052. ret = aes_auth_fn(ssl->encrypt.aes,
  15053. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  15054. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15055. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  15056. out + sz - ssl->specs.aead_mac_size,
  15057. ssl->specs.aead_mac_size,
  15058. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  15059. #ifdef WOLFSSL_ASYNC_CRYPT
  15060. if (ret == WC_PENDING_E && asyncOkay) {
  15061. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  15062. }
  15063. #endif
  15064. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15065. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  15066. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  15067. XMEMCPY(out,
  15068. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  15069. #endif
  15070. }
  15071. break;
  15072. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15073. #ifdef HAVE_CAMELLIA
  15074. case wolfssl_camellia:
  15075. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  15076. break;
  15077. #endif
  15078. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  15079. !defined(NO_CHAPOL_AEAD)
  15080. case wolfssl_chacha:
  15081. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  15082. break;
  15083. #endif
  15084. #ifdef HAVE_NULL_CIPHER
  15085. case wolfssl_cipher_null:
  15086. if (input != out) {
  15087. XMEMMOVE(out, input, sz);
  15088. }
  15089. break;
  15090. #endif
  15091. default:
  15092. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  15093. ret = ENCRYPT_ERROR;
  15094. WOLFSSL_ERROR_VERBOSE(ret);
  15095. }
  15096. #ifdef WOLFSSL_ASYNC_CRYPT
  15097. /* if async is not okay, then block */
  15098. if (ret == WC_PENDING_E && !asyncOkay) {
  15099. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  15100. }
  15101. #endif
  15102. return ret;
  15103. }
  15104. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input,
  15105. word16 sz, int asyncOkay)
  15106. {
  15107. int ret = 0;
  15108. #ifdef WOLFSSL_ASYNC_CRYPT
  15109. if (ssl->error == WC_PENDING_E) {
  15110. ssl->error = 0; /* clear async */
  15111. }
  15112. #endif
  15113. switch (ssl->encrypt.state) {
  15114. case CIPHER_STATE_BEGIN:
  15115. {
  15116. if (ssl->encrypt.setup == 0) {
  15117. WOLFSSL_MSG("Encrypt ciphers not setup");
  15118. WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
  15119. return ENCRYPT_ERROR;
  15120. }
  15121. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  15122. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  15123. XMEMCPY(ssl->encrypt.sanityCheck, input,
  15124. min(sz, sizeof(ssl->encrypt.sanityCheck)));
  15125. }
  15126. #endif
  15127. #ifdef HAVE_FUZZER
  15128. if (ssl->fuzzerCb)
  15129. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  15130. #endif
  15131. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15132. /* make sure AES GCM/CCM memory is allocated */
  15133. /* free for these happens in FreeCiphers */
  15134. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15135. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  15136. /* make sure auth iv and auth are allocated */
  15137. if (ssl->encrypt.additional == NULL)
  15138. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  15139. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15140. if (ssl->encrypt.nonce == NULL) {
  15141. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  15142. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15143. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15144. if (ssl->encrypt.nonce != NULL) {
  15145. wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce,
  15146. AESGCM_NONCE_SZ);
  15147. }
  15148. #endif
  15149. }
  15150. if (ssl->encrypt.additional == NULL ||
  15151. ssl->encrypt.nonce == NULL) {
  15152. return MEMORY_E;
  15153. }
  15154. }
  15155. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15156. /* Advance state and proceed */
  15157. ssl->encrypt.state = CIPHER_STATE_DO;
  15158. }
  15159. FALL_THROUGH;
  15160. case CIPHER_STATE_DO:
  15161. {
  15162. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  15163. /* Advance state */
  15164. ssl->encrypt.state = CIPHER_STATE_END;
  15165. #ifdef WOLFSSL_ASYNC_CRYPT
  15166. /* If pending, then leave and return will resume below */
  15167. if (ret == WC_PENDING_E) {
  15168. return ret;
  15169. }
  15170. #endif
  15171. }
  15172. FALL_THROUGH;
  15173. case CIPHER_STATE_END:
  15174. {
  15175. #ifdef WOLFSSL_CIPHER_TEXT_CHECK
  15176. if (ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null &&
  15177. XMEMCMP(out, ssl->encrypt.sanityCheck,
  15178. min(sz, sizeof(ssl->encrypt.sanityCheck))) == 0) {
  15179. WOLFSSL_MSG("Encrypt sanity check failed! Glitch?");
  15180. WOLFSSL_ERROR_VERBOSE(ENCRYPT_ERROR);
  15181. return ENCRYPT_ERROR;
  15182. }
  15183. ForceZero(ssl->encrypt.sanityCheck,
  15184. sizeof(ssl->encrypt.sanityCheck));
  15185. #endif
  15186. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15187. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15188. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  15189. {
  15190. /* finalize authentication cipher */
  15191. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  15192. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  15193. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  15194. AeadIncrementExpIV(ssl);
  15195. #endif
  15196. if (ssl->encrypt.nonce)
  15197. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  15198. }
  15199. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15200. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15201. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  15202. (out != input) && (ret == 0)) {
  15203. wc_MemZero_Add("TLS Encrypt plaintext", input, sz);
  15204. }
  15205. #endif
  15206. break;
  15207. }
  15208. default:
  15209. break;
  15210. }
  15211. /* Reset state */
  15212. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  15213. return ret;
  15214. }
  15215. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  15216. word16 sz)
  15217. {
  15218. int ret = 0;
  15219. (void)plain;
  15220. (void)input;
  15221. (void)sz;
  15222. switch (ssl->specs.bulk_cipher_algorithm)
  15223. {
  15224. #ifdef BUILD_ARC4
  15225. case wolfssl_rc4:
  15226. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  15227. break;
  15228. #endif
  15229. #ifdef BUILD_DES3
  15230. case wolfssl_triple_des:
  15231. #ifdef WOLFSSL_ASYNC_CRYPT
  15232. /* initialize event */
  15233. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  15234. WC_ASYNC_FLAG_CALL_AGAIN);
  15235. if (ret != 0)
  15236. break;
  15237. #endif
  15238. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  15239. #ifdef WOLFSSL_ASYNC_CRYPT
  15240. if (ret == WC_PENDING_E) {
  15241. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  15242. }
  15243. #endif
  15244. break;
  15245. #endif
  15246. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  15247. case wolfssl_aes:
  15248. #ifdef WOLFSSL_ASYNC_CRYPT
  15249. /* initialize event */
  15250. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  15251. WC_ASYNC_FLAG_CALL_AGAIN);
  15252. if (ret != 0)
  15253. break;
  15254. #endif
  15255. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  15256. #ifdef WOLFSSL_ASYNC_CRYPT
  15257. if (ret == WC_PENDING_E) {
  15258. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  15259. }
  15260. #endif
  15261. break;
  15262. #endif
  15263. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15264. case wolfssl_aes_gcm:
  15265. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  15266. {
  15267. wc_AesAuthDecryptFunc aes_auth_fn;
  15268. #ifdef WOLFSSL_ASYNC_CRYPT
  15269. /* initialize event */
  15270. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  15271. WC_ASYNC_FLAG_CALL_AGAIN);
  15272. if (ret != 0)
  15273. break;
  15274. #endif
  15275. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  15276. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  15277. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  15278. #elif defined(BUILD_AESGCM)
  15279. aes_auth_fn = wc_AesGcmDecrypt;
  15280. #else
  15281. aes_auth_fn = wc_AesCcmDecrypt;
  15282. #endif
  15283. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  15284. /* sequence number field is 64-bits */
  15285. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  15286. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  15287. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  15288. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  15289. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15290. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  15291. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15292. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  15293. XMEMCPY(ssl->decrypt.nonce,
  15294. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  15295. AESGCM_IMP_IV_SZ);
  15296. else
  15297. #endif
  15298. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  15299. AESGCM_IMP_IV_SZ);
  15300. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  15301. AESGCM_EXP_IV_SZ);
  15302. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  15303. plain + AESGCM_EXP_IV_SZ,
  15304. input + AESGCM_EXP_IV_SZ,
  15305. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  15306. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  15307. input + sz - ssl->specs.aead_mac_size,
  15308. ssl->specs.aead_mac_size,
  15309. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  15310. #ifdef WOLFSSL_ASYNC_CRYPT
  15311. if (ret == WC_PENDING_E) {
  15312. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  15313. }
  15314. #endif
  15315. }
  15316. }
  15317. break;
  15318. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15319. #ifdef HAVE_CAMELLIA
  15320. case wolfssl_camellia:
  15321. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  15322. break;
  15323. #endif
  15324. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  15325. !defined(NO_CHAPOL_AEAD)
  15326. case wolfssl_chacha:
  15327. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  15328. break;
  15329. #endif
  15330. #ifdef HAVE_NULL_CIPHER
  15331. case wolfssl_cipher_null:
  15332. if (input != plain) {
  15333. XMEMMOVE(plain, input, sz);
  15334. }
  15335. break;
  15336. #endif
  15337. default:
  15338. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  15339. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  15340. ret = DECRYPT_ERROR;
  15341. }
  15342. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15343. if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) &&
  15344. (ret == 0)) {
  15345. wc_MemZero_Add("Decrypted data", plain, sz);
  15346. }
  15347. #endif
  15348. return ret;
  15349. }
  15350. static int DecryptTls(WOLFSSL* ssl, byte* plain, const byte* input, word16 sz)
  15351. {
  15352. int ret = 0;
  15353. #ifdef WOLFSSL_ASYNC_CRYPT
  15354. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  15355. if (ret != WC_NOT_PENDING_E) {
  15356. /* check for still pending */
  15357. if (ret == WC_PENDING_E)
  15358. return ret;
  15359. ssl->error = 0; /* clear async */
  15360. /* let failures through so CIPHER_STATE_END logic is run */
  15361. }
  15362. else
  15363. #endif
  15364. {
  15365. /* Reset state */
  15366. ret = 0;
  15367. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  15368. }
  15369. switch (ssl->decrypt.state) {
  15370. case CIPHER_STATE_BEGIN:
  15371. {
  15372. if (ssl->decrypt.setup == 0) {
  15373. WOLFSSL_MSG("Decrypt ciphers not setup");
  15374. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  15375. return DECRYPT_ERROR;
  15376. }
  15377. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15378. /* make sure AES GCM/CCM memory is allocated */
  15379. /* free for these happens in FreeCiphers */
  15380. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15381. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  15382. /* make sure auth iv and auth are allocated */
  15383. if (ssl->decrypt.additional == NULL)
  15384. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  15385. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15386. if (ssl->decrypt.nonce == NULL) {
  15387. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  15388. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  15389. #ifdef WOLFSSL_CHECK_MEM_ZERO
  15390. if (ssl->decrypt.nonce != NULL) {
  15391. wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce,
  15392. AESGCM_NONCE_SZ);
  15393. }
  15394. #endif
  15395. }
  15396. if (ssl->decrypt.additional == NULL ||
  15397. ssl->decrypt.nonce == NULL) {
  15398. return MEMORY_E;
  15399. }
  15400. }
  15401. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15402. /* Advance state and proceed */
  15403. ssl->decrypt.state = CIPHER_STATE_DO;
  15404. }
  15405. FALL_THROUGH;
  15406. case CIPHER_STATE_DO:
  15407. {
  15408. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  15409. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  15410. /* For epochs >1 the current cipher parameters are located in
  15411. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  15412. * parameters and for epoch 1 use ssl->keys */
  15413. if (ssl->keys.curEpoch ==
  15414. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  15415. if (ssl->decrypt.src != SCR) {
  15416. ssl->secure_renegotiation->cache_status =
  15417. SCR_CACHE_NEEDED;
  15418. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  15419. break;
  15420. }
  15421. }
  15422. else {
  15423. if (ssl->decrypt.src != KEYS) {
  15424. ssl->secure_renegotiation->cache_status =
  15425. SCR_CACHE_NULL;
  15426. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  15427. break;
  15428. }
  15429. }
  15430. }
  15431. #endif
  15432. ret = DecryptDo(ssl, plain, input, sz);
  15433. /* Advance state */
  15434. ssl->decrypt.state = CIPHER_STATE_END;
  15435. #ifdef WOLFSSL_ASYNC_CRYPT
  15436. /* If pending, leave and return below */
  15437. if (ret == WC_PENDING_E) {
  15438. return ret;
  15439. }
  15440. #endif
  15441. }
  15442. FALL_THROUGH;
  15443. case CIPHER_STATE_END:
  15444. {
  15445. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  15446. /* make sure AES GCM/CCM nonce is cleared */
  15447. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  15448. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  15449. if (ssl->decrypt.nonce)
  15450. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  15451. if (ret < 0) {
  15452. ret = VERIFY_MAC_ERROR;
  15453. WOLFSSL_ERROR_VERBOSE(ret);
  15454. }
  15455. }
  15456. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  15457. break;
  15458. }
  15459. default:
  15460. break;
  15461. }
  15462. /* Reset state */
  15463. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  15464. return ret;
  15465. }
  15466. #endif /* !WOLFSSL_NO_TLS12 */
  15467. /* Check conditions for a cipher to have an explicit IV.
  15468. *
  15469. * ssl The SSL/TLS object.
  15470. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  15471. */
  15472. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  15473. {
  15474. #ifdef WOLFSSL_TLS13
  15475. if (ssl->options.tls1_3)
  15476. return 0;
  15477. #endif
  15478. return (ssl->specs.cipher_type == aead) &&
  15479. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  15480. }
  15481. /* check cipher text size for sanity */
  15482. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  15483. {
  15484. #ifdef HAVE_TRUNCATED_HMAC
  15485. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  15486. : ssl->specs.hash_size;
  15487. #else
  15488. word32 minLength = ssl->specs.hash_size; /* covers stream */
  15489. #endif
  15490. #ifndef WOLFSSL_AEAD_ONLY
  15491. if (ssl->specs.cipher_type == block) {
  15492. #ifdef HAVE_ENCRYPT_THEN_MAC
  15493. if (ssl->options.startedETMRead) {
  15494. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  15495. WOLFSSL_MSG("Block ciphertext not block size");
  15496. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  15497. return SANITY_CIPHER_E;
  15498. }
  15499. }
  15500. else
  15501. #endif
  15502. if (encryptSz % ssl->specs.block_size) {
  15503. WOLFSSL_MSG("Block ciphertext not block size");
  15504. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  15505. return SANITY_CIPHER_E;
  15506. }
  15507. minLength++; /* pad byte */
  15508. if (ssl->specs.block_size > minLength)
  15509. minLength = ssl->specs.block_size;
  15510. if (ssl->options.tls1_1)
  15511. minLength += ssl->specs.block_size; /* explicit IV */
  15512. }
  15513. else
  15514. #endif
  15515. if (ssl->specs.cipher_type == aead) {
  15516. minLength = ssl->specs.aead_mac_size; /* authTag size */
  15517. if (CipherHasExpIV(ssl))
  15518. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  15519. }
  15520. if (encryptSz < minLength) {
  15521. WOLFSSL_MSG("Ciphertext not minimum size");
  15522. WOLFSSL_ERROR_VERBOSE(SANITY_CIPHER_E);
  15523. return SANITY_CIPHER_E;
  15524. }
  15525. return 0;
  15526. }
  15527. #ifndef WOLFSSL_AEAD_ONLY
  15528. #ifdef WOLSSL_OLD_TIMINGPADVERIFY
  15529. #define COMPRESS_LOWER 64
  15530. #define COMPRESS_UPPER 55
  15531. #define COMPRESS_CONSTANT 13
  15532. #ifndef NO_OLD_TLS
  15533. static WC_INLINE void Md5Rounds(int rounds, const byte* data, int sz)
  15534. {
  15535. wc_Md5 md5;
  15536. int i;
  15537. wc_InitMd5(&md5); /* no error check on purpose, dummy round */
  15538. for (i = 0; i < rounds; i++)
  15539. wc_Md5Update(&md5, data, sz);
  15540. wc_Md5Free(&md5); /* in case needed to release resources */
  15541. }
  15542. /* do a dummy sha round */
  15543. static WC_INLINE void ShaRounds(int rounds, const byte* data, int sz)
  15544. {
  15545. wc_Sha sha;
  15546. int i;
  15547. wc_InitSha(&sha); /* no error check on purpose, dummy round */
  15548. for (i = 0; i < rounds; i++)
  15549. wc_ShaUpdate(&sha, data, sz);
  15550. wc_ShaFree(&sha); /* in case needed to release resources */
  15551. }
  15552. #endif
  15553. #ifndef NO_SHA256
  15554. static WC_INLINE void Sha256Rounds(int rounds, const byte* data, int sz)
  15555. {
  15556. wc_Sha256 sha256;
  15557. int i;
  15558. wc_InitSha256(&sha256); /* no error check on purpose, dummy round */
  15559. for (i = 0; i < rounds; i++) {
  15560. wc_Sha256Update(&sha256, data, sz);
  15561. /* no error check on purpose, dummy round */
  15562. }
  15563. wc_Sha256Free(&sha256); /* in case needed to release resources */
  15564. }
  15565. #endif
  15566. #ifdef WOLFSSL_SHA384
  15567. static WC_INLINE void Sha384Rounds(int rounds, const byte* data, int sz)
  15568. {
  15569. wc_Sha384 sha384;
  15570. int i;
  15571. wc_InitSha384(&sha384); /* no error check on purpose, dummy round */
  15572. for (i = 0; i < rounds; i++) {
  15573. wc_Sha384Update(&sha384, data, sz);
  15574. /* no error check on purpose, dummy round */
  15575. }
  15576. wc_Sha384Free(&sha384); /* in case needed to release resources */
  15577. }
  15578. #endif
  15579. #ifdef WOLFSSL_SHA512
  15580. static WC_INLINE void Sha512Rounds(int rounds, const byte* data, int sz)
  15581. {
  15582. wc_Sha512 sha512;
  15583. int i;
  15584. wc_InitSha512(&sha512); /* no error check on purpose, dummy round */
  15585. for (i = 0; i < rounds; i++) {
  15586. wc_Sha512Update(&sha512, data, sz);
  15587. /* no error check on purpose, dummy round */
  15588. }
  15589. wc_Sha512Free(&sha512); /* in case needed to release resources */
  15590. }
  15591. #endif
  15592. #ifdef WOLFSSL_RIPEMD
  15593. static WC_INLINE void RmdRounds(int rounds, const byte* data, int sz)
  15594. {
  15595. RipeMd ripemd;
  15596. int i;
  15597. wc_InitRipeMd(&ripemd);
  15598. for (i = 0; i < rounds; i++)
  15599. wc_RipeMdUpdate(&ripemd, data, sz);
  15600. }
  15601. #endif
  15602. /* Do dummy rounds */
  15603. static WC_INLINE void DoRounds(int type, int rounds, const byte* data, int sz)
  15604. {
  15605. (void)rounds;
  15606. (void)data;
  15607. (void)sz;
  15608. switch (type) {
  15609. case no_mac :
  15610. break;
  15611. #ifndef NO_OLD_TLS
  15612. #ifndef NO_MD5
  15613. case md5_mac :
  15614. Md5Rounds(rounds, data, sz);
  15615. break;
  15616. #endif
  15617. #ifndef NO_SHA
  15618. case sha_mac :
  15619. ShaRounds(rounds, data, sz);
  15620. break;
  15621. #endif
  15622. #endif
  15623. #ifndef NO_SHA256
  15624. case sha256_mac :
  15625. Sha256Rounds(rounds, data, sz);
  15626. break;
  15627. #endif
  15628. #ifdef WOLFSSL_SHA384
  15629. case sha384_mac :
  15630. Sha384Rounds(rounds, data, sz);
  15631. break;
  15632. #endif
  15633. #ifdef WOLFSSL_SHA512
  15634. case sha512_mac :
  15635. Sha512Rounds(rounds, data, sz);
  15636. break;
  15637. #endif
  15638. #ifdef WOLFSSL_RIPEMD
  15639. case rmd_mac :
  15640. RmdRounds(rounds, data, sz);
  15641. break;
  15642. #endif
  15643. default:
  15644. WOLFSSL_MSG("Bad round type");
  15645. break;
  15646. }
  15647. }
  15648. /* do number of compression rounds on dummy data */
  15649. static WC_INLINE void CompressRounds(WOLFSSL* ssl, int rounds, const byte* dummy)
  15650. {
  15651. if (rounds)
  15652. DoRounds(ssl->specs.mac_algorithm, rounds, dummy, COMPRESS_LOWER);
  15653. }
  15654. /* check all length bytes for the pad value, return 0 on success */
  15655. static int PadCheck(const byte* a, byte pad, int length)
  15656. {
  15657. int i;
  15658. int compareSum = 0;
  15659. for (i = 0; i < length; i++) {
  15660. compareSum |= a[i] ^ pad;
  15661. }
  15662. return compareSum;
  15663. }
  15664. /* get compression extra rounds */
  15665. static WC_INLINE int GetRounds(int pLen, int padLen, int t)
  15666. {
  15667. int roundL1 = 1; /* round up flags */
  15668. int roundL2 = 1;
  15669. int L1 = COMPRESS_CONSTANT + pLen - t;
  15670. int L2 = COMPRESS_CONSTANT + pLen - padLen - 1 - t;
  15671. L1 -= COMPRESS_UPPER;
  15672. L2 -= COMPRESS_UPPER;
  15673. if ( (L1 % COMPRESS_LOWER) == 0)
  15674. roundL1 = 0;
  15675. if ( (L2 % COMPRESS_LOWER) == 0)
  15676. roundL2 = 0;
  15677. L1 /= COMPRESS_LOWER;
  15678. L2 /= COMPRESS_LOWER;
  15679. L1 += roundL1;
  15680. L2 += roundL2;
  15681. return L1 - L2;
  15682. }
  15683. /* timing resistant pad/verify check, return 0 on success */
  15684. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int t,
  15685. int pLen, int content)
  15686. {
  15687. byte verify[WC_MAX_DIGEST_SIZE];
  15688. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  15689. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  15690. int ret = 0;
  15691. (void)dmy;
  15692. if ( (t + padLen + 1) > pLen) {
  15693. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  15694. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE);
  15695. /* still compare */
  15696. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  15697. ConstantCompare(verify, input + pLen - t, t);
  15698. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  15699. return VERIFY_MAC_ERROR;
  15700. }
  15701. if (PadCheck(input + pLen - (padLen + 1), (byte)padLen, padLen + 1) != 0) {
  15702. WOLFSSL_MSG("PadCheck failed");
  15703. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  15704. /* still compare */
  15705. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  15706. ConstantCompare(verify, input + pLen - t, t);
  15707. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  15708. return VERIFY_MAC_ERROR;
  15709. }
  15710. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  15711. ret = ssl->hmac(ssl, verify, input, pLen - padLen - 1 - t, -1, content,
  15712. 1, PEER_ORDER);
  15713. CompressRounds(ssl, GetRounds(pLen, padLen, t), dummy);
  15714. if (ConstantCompare(verify, input + (pLen - padLen - 1 - t), t) != 0) {
  15715. WOLFSSL_MSG("Verify MAC compare failed");
  15716. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  15717. return VERIFY_MAC_ERROR;
  15718. }
  15719. /* treat any failure as verify MAC error */
  15720. if (ret != 0) {
  15721. ret = VERIFY_MAC_ERROR;
  15722. WOLFSSL_ERROR_VERBOSE(ret);
  15723. }
  15724. return ret;
  15725. }
  15726. #else
  15727. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  15728. /* check all length bytes for the pad value, return 0 on success */
  15729. static int PadCheck(const byte* a, byte pad, int length)
  15730. {
  15731. int i;
  15732. int compareSum = 0;
  15733. for (i = 0; i < length; i++) {
  15734. compareSum |= a[i] ^ pad;
  15735. }
  15736. return compareSum;
  15737. }
  15738. /* Mask the padding bytes with the expected values.
  15739. * Constant time implementation - does maximum pad size possible.
  15740. *
  15741. * data Message data.
  15742. * sz Size of the message including MAC and padding and padding length.
  15743. * macSz Size of the MAC.
  15744. * returns 0 on success, otherwise failure.
  15745. */
  15746. static byte MaskPadding(const byte* data, int sz, int macSz)
  15747. {
  15748. int i;
  15749. int checkSz = sz - 1;
  15750. byte paddingSz = data[sz - 1];
  15751. byte mask;
  15752. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  15753. if (checkSz > TLS_MAX_PAD_SZ)
  15754. checkSz = TLS_MAX_PAD_SZ;
  15755. for (i = 0; i < checkSz; i++) {
  15756. mask = ctMaskLTE(i, paddingSz);
  15757. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  15758. }
  15759. return good;
  15760. }
  15761. /* Mask the MAC in the message with the MAC calculated.
  15762. * Constant time implementation - starts looking for MAC where maximum padding
  15763. * size has it.
  15764. *
  15765. * data Message data.
  15766. * sz Size of the message including MAC and padding and padding length.
  15767. * macSz Size of the MAC data.
  15768. * expMac Expected MAC value.
  15769. * returns 0 on success, otherwise failure.
  15770. */
  15771. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  15772. {
  15773. int i, j;
  15774. unsigned char mac[WC_MAX_DIGEST_SIZE];
  15775. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  15776. int macEnd = sz - 1 - data[sz - 1];
  15777. int macStart = macEnd - macSz;
  15778. int r = 0;
  15779. unsigned char started, notEnded;
  15780. unsigned char good = 0;
  15781. scanStart &= ctMaskIntGTE(scanStart, 0);
  15782. macStart &= ctMaskIntGTE(macStart, 0);
  15783. /* Div on Intel has different speeds depending on value.
  15784. * Use a bitwise AND or mod a specific value (converted to mul). */
  15785. if ((macSz & (macSz - 1)) == 0)
  15786. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  15787. #ifndef NO_SHA
  15788. else if (macSz == WC_SHA_DIGEST_SIZE)
  15789. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  15790. #endif
  15791. #ifdef WOLFSSL_SHA384
  15792. else if (macSz == WC_SHA384_DIGEST_SIZE)
  15793. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  15794. #endif
  15795. XMEMSET(mac, 0, macSz);
  15796. for (i = scanStart; i < sz; i += macSz) {
  15797. for (j = 0; j < macSz && j + i < sz; j++) {
  15798. started = ctMaskGTE(i + j, macStart);
  15799. notEnded = ctMaskLT(i + j, macEnd);
  15800. mac[j] |= started & notEnded & data[i + j];
  15801. }
  15802. }
  15803. if ((macSz & (macSz - 1)) == 0) {
  15804. for (i = 0; i < macSz; i++)
  15805. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  15806. }
  15807. #ifndef NO_SHA
  15808. else if (macSz == WC_SHA_DIGEST_SIZE) {
  15809. for (i = 0; i < macSz; i++)
  15810. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  15811. }
  15812. #endif
  15813. #ifdef WOLFSSL_SHA384
  15814. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  15815. for (i = 0; i < macSz; i++)
  15816. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  15817. }
  15818. #endif
  15819. return good;
  15820. }
  15821. /* timing resistant pad/verify check, return 0 on success */
  15822. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  15823. int pLen, int content)
  15824. {
  15825. byte verify[WC_MAX_DIGEST_SIZE];
  15826. byte good;
  15827. int ret = 0;
  15828. good = MaskPadding(input, pLen, macSz);
  15829. /* 4th argument has potential to underflow, ssl->hmac function should
  15830. * either increment the size by (macSz + padLen + 1) before use or check on
  15831. * the size to make sure is valid. */
  15832. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  15833. content, 1, PEER_ORDER);
  15834. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  15835. /* Non-zero on failure. */
  15836. good = (byte)~(word32)good;
  15837. good &= good >> 4;
  15838. good &= good >> 2;
  15839. good &= good >> 1;
  15840. /* Make ret negative on masking failure. */
  15841. ret -= 1 - good;
  15842. /* Treat any failure as verify MAC error. */
  15843. if (ret != 0) {
  15844. ret = VERIFY_MAC_ERROR;
  15845. WOLFSSL_ERROR_VERBOSE(ret);
  15846. }
  15847. return ret;
  15848. }
  15849. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  15850. #endif /* WOLSSL_OLD_TIMINGPADVERIFY */
  15851. #endif /* WOLFSSL_AEAD_ONLY */
  15852. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx, int sniff)
  15853. {
  15854. word32 msgSz = WOLFSSL_IS_QUIC(ssl)? ssl->curSize : ssl->keys.encryptSz;
  15855. word32 idx = *inOutIdx;
  15856. int dataSz;
  15857. int ivExtra = 0;
  15858. byte* rawData = input + idx; /* keep current for hmac */
  15859. #ifdef HAVE_LIBZ
  15860. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  15861. #endif
  15862. #ifdef WOLFSSL_EARLY_DATA
  15863. if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
  15864. int process = 0;
  15865. if (ssl->options.side == WOLFSSL_SERVER_END) {
  15866. if ((ssl->earlyData != no_early_data) &&
  15867. (ssl->options.clientState == CLIENT_HELLO_COMPLETE)) {
  15868. process = 1;
  15869. }
  15870. if (!process) {
  15871. WOLFSSL_MSG("Ignoring EarlyData!");
  15872. *inOutIdx += ssl->curSize;
  15873. if (*inOutIdx > ssl->buffers.inputBuffer.length)
  15874. return BUFFER_E;
  15875. return 0;
  15876. }
  15877. }
  15878. if (!process) {
  15879. WOLFSSL_MSG("Received App data before a handshake completed");
  15880. if (sniff == NO_SNIFF) {
  15881. SendAlert(ssl, alert_fatal, unexpected_message);
  15882. }
  15883. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  15884. return OUT_OF_ORDER_E;
  15885. }
  15886. }
  15887. else
  15888. #endif
  15889. if (ssl->options.handShakeDone == 0) {
  15890. WOLFSSL_MSG("Received App data before a handshake completed");
  15891. if (sniff == NO_SNIFF) {
  15892. SendAlert(ssl, alert_fatal, unexpected_message);
  15893. }
  15894. WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E);
  15895. return OUT_OF_ORDER_E;
  15896. }
  15897. #ifndef WOLFSSL_AEAD_ONLY
  15898. if (ssl->specs.cipher_type == block) {
  15899. if (ssl->options.tls1_1)
  15900. ivExtra = ssl->specs.block_size;
  15901. }
  15902. else
  15903. #endif
  15904. if (ssl->specs.cipher_type == aead) {
  15905. if (CipherHasExpIV(ssl))
  15906. ivExtra = AESGCM_EXP_IV_SZ;
  15907. }
  15908. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  15909. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15910. if (ssl->options.startedETMRead)
  15911. dataSz -= MacSize(ssl);
  15912. #endif
  15913. if (dataSz < 0) {
  15914. WOLFSSL_MSG("App data buffer error, malicious input?");
  15915. if (sniff == NO_SNIFF) {
  15916. SendAlert(ssl, alert_fatal, unexpected_message);
  15917. }
  15918. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  15919. return BUFFER_ERROR;
  15920. }
  15921. #ifdef WOLFSSL_EARLY_DATA
  15922. if (ssl->earlyData > early_data_ext) {
  15923. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  15924. if (sniff == NO_SNIFF) {
  15925. SendAlert(ssl, alert_fatal, unexpected_message);
  15926. }
  15927. return WOLFSSL_FATAL_ERROR;
  15928. }
  15929. ssl->earlyDataSz += dataSz;
  15930. }
  15931. #endif
  15932. /* read data */
  15933. if (dataSz) {
  15934. int rawSz = dataSz; /* keep raw size for idx adjustment */
  15935. #ifdef HAVE_LIBZ
  15936. if (ssl->options.usingCompression) {
  15937. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  15938. if (dataSz < 0) return dataSz;
  15939. }
  15940. #endif
  15941. idx += rawSz;
  15942. ssl->buffers.clearOutputBuffer.buffer = rawData;
  15943. ssl->buffers.clearOutputBuffer.length = dataSz;
  15944. }
  15945. idx += ssl->keys.padSz;
  15946. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15947. if (ssl->options.startedETMRead)
  15948. idx += MacSize(ssl);
  15949. #endif
  15950. #ifdef HAVE_LIBZ
  15951. /* decompress could be bigger, overwrite after verify */
  15952. if (ssl->options.usingCompression)
  15953. XMEMMOVE(rawData, decomp, dataSz);
  15954. #endif
  15955. *inOutIdx = idx;
  15956. #ifdef HAVE_SECURE_RENEGOTIATION
  15957. if (IsSCR(ssl)) {
  15958. /* Reset the processReply state since
  15959. * we finished processing this message. */
  15960. ssl->options.processReply = doProcessInit;
  15961. /* If we are in a secure renegotiation then APP DATA is treated
  15962. * differently */
  15963. return APP_DATA_READY;
  15964. }
  15965. #endif
  15966. return 0;
  15967. }
  15968. const char* AlertTypeToString(int type)
  15969. {
  15970. switch (type) {
  15971. case close_notify:
  15972. {
  15973. static const char close_notify_str[] =
  15974. "close_notify";
  15975. return close_notify_str;
  15976. }
  15977. case unexpected_message:
  15978. {
  15979. static const char unexpected_message_str[] =
  15980. "unexpected_message";
  15981. return unexpected_message_str;
  15982. }
  15983. case bad_record_mac:
  15984. {
  15985. static const char bad_record_mac_str[] =
  15986. "bad_record_mac";
  15987. return bad_record_mac_str;
  15988. }
  15989. case record_overflow:
  15990. {
  15991. static const char record_overflow_str[] =
  15992. "record_overflow";
  15993. return record_overflow_str;
  15994. }
  15995. case decompression_failure:
  15996. {
  15997. static const char decompression_failure_str[] =
  15998. "decompression_failure";
  15999. return decompression_failure_str;
  16000. }
  16001. case handshake_failure:
  16002. {
  16003. static const char handshake_failure_str[] =
  16004. "handshake_failure";
  16005. return handshake_failure_str;
  16006. }
  16007. case no_certificate:
  16008. {
  16009. static const char no_certificate_str[] =
  16010. "no_certificate";
  16011. return no_certificate_str;
  16012. }
  16013. case bad_certificate:
  16014. {
  16015. static const char bad_certificate_str[] =
  16016. "bad_certificate";
  16017. return bad_certificate_str;
  16018. }
  16019. case unsupported_certificate:
  16020. {
  16021. static const char unsupported_certificate_str[] =
  16022. "unsupported_certificate";
  16023. return unsupported_certificate_str;
  16024. }
  16025. case certificate_revoked:
  16026. {
  16027. static const char certificate_revoked_str[] =
  16028. "certificate_revoked";
  16029. return certificate_revoked_str;
  16030. }
  16031. case certificate_expired:
  16032. {
  16033. static const char certificate_expired_str[] =
  16034. "certificate_expired";
  16035. return certificate_expired_str;
  16036. }
  16037. case certificate_unknown:
  16038. {
  16039. static const char certificate_unknown_str[] =
  16040. "certificate_unknown";
  16041. return certificate_unknown_str;
  16042. }
  16043. case illegal_parameter:
  16044. {
  16045. static const char illegal_parameter_str[] =
  16046. "illegal_parameter";
  16047. return illegal_parameter_str;
  16048. }
  16049. case unknown_ca:
  16050. {
  16051. static const char unknown_ca_str[] =
  16052. "unknown_ca";
  16053. return unknown_ca_str;
  16054. }
  16055. case access_denied:
  16056. {
  16057. static const char access_denied_str[] =
  16058. "access_denied";
  16059. return access_denied_str;
  16060. }
  16061. case decode_error:
  16062. {
  16063. static const char decode_error_str[] =
  16064. "decode_error";
  16065. return decode_error_str;
  16066. }
  16067. case decrypt_error:
  16068. {
  16069. static const char decrypt_error_str[] =
  16070. "decrypt_error";
  16071. return decrypt_error_str;
  16072. }
  16073. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  16074. /* catch name conflict for enum protocol with MYSQL build */
  16075. case wc_protocol_version:
  16076. {
  16077. static const char wc_protocol_version_str[] =
  16078. "wc_protocol_version";
  16079. return wc_protocol_version_str;
  16080. }
  16081. #else
  16082. case protocol_version:
  16083. {
  16084. static const char protocol_version_str[] =
  16085. "protocol_version";
  16086. return protocol_version_str;
  16087. }
  16088. #endif
  16089. case insufficient_security:
  16090. {
  16091. static const char insufficient_security_str[] =
  16092. "insufficient_security";
  16093. return insufficient_security_str;
  16094. }
  16095. case internal_error:
  16096. {
  16097. static const char internal_error_str[] =
  16098. "internal_error";
  16099. return internal_error_str;
  16100. }
  16101. case user_canceled:
  16102. {
  16103. static const char user_canceled_str[] =
  16104. "user_canceled";
  16105. return user_canceled_str;
  16106. }
  16107. case no_renegotiation:
  16108. {
  16109. static const char no_renegotiation_str[] =
  16110. "no_renegotiation";
  16111. return no_renegotiation_str;
  16112. }
  16113. case unrecognized_name:
  16114. {
  16115. static const char unrecognized_name_str[] =
  16116. "unrecognized_name";
  16117. return unrecognized_name_str;
  16118. }
  16119. case bad_certificate_status_response:
  16120. {
  16121. static const char bad_certificate_status_response_str[] =
  16122. "bad_certificate_status_response";
  16123. return bad_certificate_status_response_str;
  16124. }
  16125. case no_application_protocol:
  16126. {
  16127. static const char no_application_protocol_str[] =
  16128. "no_application_protocol";
  16129. return no_application_protocol_str;
  16130. }
  16131. default:
  16132. WOLFSSL_MSG("Unknown Alert");
  16133. return NULL;
  16134. }
  16135. }
  16136. static void LogAlert(int type)
  16137. {
  16138. #ifdef DEBUG_WOLFSSL
  16139. const char* typeStr;
  16140. char buff[60];
  16141. typeStr = AlertTypeToString(type);
  16142. if (typeStr != NULL) {
  16143. XSNPRINTF(buff, sizeof(buff), "Alert type: %s", typeStr);
  16144. WOLFSSL_MSG(buff);
  16145. }
  16146. #else
  16147. (void)type;
  16148. #endif /* DEBUG_WOLFSSL */
  16149. }
  16150. /* process alert, return level */
  16151. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
  16152. {
  16153. byte level;
  16154. byte code;
  16155. word32 dataSz = (word32)ssl->curSize;
  16156. int ivExtra = 0;
  16157. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16158. if (ssl->hsInfoOn)
  16159. AddPacketName(ssl, "Alert");
  16160. if (ssl->toInfoOn)
  16161. /* add record header back on to info + alert bytes level/code */
  16162. AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx -
  16163. RECORD_HEADER_SZ, RECORD_HEADER_SZ + ALERT_SIZE,
  16164. READ_PROTO, ssl->heap);
  16165. #endif
  16166. if (IsEncryptionOn(ssl, 0)) {
  16167. #ifndef WOLFSSL_AEAD_ONLY
  16168. if (ssl->specs.cipher_type == block) {
  16169. if (ssl->options.tls1_1)
  16170. ivExtra = ssl->specs.block_size;
  16171. }
  16172. else
  16173. #endif
  16174. if (ssl->specs.cipher_type == aead) {
  16175. if (CipherHasExpIV(ssl))
  16176. ivExtra = AESGCM_EXP_IV_SZ;
  16177. }
  16178. dataSz -= ivExtra;
  16179. dataSz -= ssl->keys.padSz;
  16180. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16181. if (ssl->options.startedETMRead)
  16182. dataSz -= MacSize(ssl);
  16183. #endif
  16184. }
  16185. /* make sure can read the message */
  16186. if (dataSz != ALERT_SIZE) {
  16187. #ifdef WOLFSSL_EXTRA_ALERTS
  16188. SendAlert(ssl, alert_fatal, unexpected_message);
  16189. #endif
  16190. return BUFFER_E;
  16191. }
  16192. level = input[(*inOutIdx)++];
  16193. code = input[(*inOutIdx)++];
  16194. ssl->alert_history.last_rx.code = code;
  16195. ssl->alert_history.last_rx.level = level;
  16196. *type = code;
  16197. if (level == alert_fatal) {
  16198. ssl->options.isClosed = 1; /* Don't send close_notify */
  16199. }
  16200. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  16201. WOLFSSL_MSG("Alert count exceeded");
  16202. #ifdef WOLFSSL_EXTRA_ALERTS
  16203. if (level != alert_warning || code != close_notify)
  16204. SendAlert(ssl, alert_fatal, unexpected_message);
  16205. #endif
  16206. WOLFSSL_ERROR_VERBOSE(ALERT_COUNT_E);
  16207. return ALERT_COUNT_E;
  16208. }
  16209. LogAlert(*type);
  16210. if (*type == close_notify) {
  16211. ssl->options.closeNotify = 1;
  16212. }
  16213. else {
  16214. /*
  16215. * A close_notify alert doesn't mean there's been an error, so we only
  16216. * add other types of alerts to the error queue
  16217. */
  16218. WOLFSSL_ERROR(*type);
  16219. }
  16220. if (IsEncryptionOn(ssl, 0)) {
  16221. *inOutIdx += ssl->keys.padSz;
  16222. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16223. if (ssl->options.startedETMRead)
  16224. *inOutIdx += MacSize(ssl);
  16225. #endif
  16226. }
  16227. return level;
  16228. }
  16229. static int GetInputData(WOLFSSL *ssl, word32 size)
  16230. {
  16231. int in;
  16232. int inSz;
  16233. int maxLength;
  16234. int usedLength;
  16235. int dtlsExtra = 0;
  16236. /* check max input length */
  16237. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  16238. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  16239. inSz = (int)(size - usedLength); /* from last partial read */
  16240. #ifdef WOLFSSL_DTLS
  16241. if (ssl->options.dtls) {
  16242. if (size < ssl->dtls_expected_rx)
  16243. dtlsExtra = (int)(ssl->dtls_expected_rx - size);
  16244. inSz = ssl->dtls_expected_rx;
  16245. }
  16246. #endif
  16247. /* check that no lengths or size values are negative */
  16248. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  16249. return BUFFER_ERROR;
  16250. }
  16251. if (inSz > maxLength) {
  16252. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  16253. return MEMORY_E;
  16254. }
  16255. /* Put buffer data at start if not there */
  16256. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  16257. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  16258. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  16259. usedLength);
  16260. /* remove processed data */
  16261. ssl->buffers.inputBuffer.idx = 0;
  16262. ssl->buffers.inputBuffer.length = usedLength;
  16263. /* read data from network */
  16264. do {
  16265. in = wolfSSLReceive(ssl,
  16266. ssl->buffers.inputBuffer.buffer +
  16267. ssl->buffers.inputBuffer.length,
  16268. inSz);
  16269. if (in == WANT_READ)
  16270. return WANT_READ;
  16271. if (in < 0) {
  16272. WOLFSSL_ERROR_VERBOSE(SOCKET_ERROR_E);
  16273. return SOCKET_ERROR_E;
  16274. }
  16275. if (in > inSz) {
  16276. WOLFSSL_ERROR_VERBOSE(RECV_OVERFLOW_E);
  16277. return RECV_OVERFLOW_E;
  16278. }
  16279. ssl->buffers.inputBuffer.length += in;
  16280. inSz -= in;
  16281. } while (ssl->buffers.inputBuffer.length < size);
  16282. #ifdef WOLFSSL_DEBUG_TLS
  16283. if (ssl->buffers.inputBuffer.idx == 0) {
  16284. WOLFSSL_MSG("Data received");
  16285. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  16286. ssl->buffers.inputBuffer.length);
  16287. }
  16288. #endif
  16289. return 0;
  16290. }
  16291. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16292. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  16293. int content)
  16294. {
  16295. int ret;
  16296. #ifdef HAVE_TRUNCATED_HMAC
  16297. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  16298. : ssl->specs.hash_size;
  16299. #else
  16300. word32 digestSz = ssl->specs.hash_size;
  16301. #endif
  16302. byte verify[WC_MAX_DIGEST_SIZE];
  16303. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  16304. if (msgSz < digestSz) {
  16305. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16306. return VERIFY_MAC_ERROR;
  16307. }
  16308. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
  16309. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  16310. if (ret != 0) {
  16311. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16312. return VERIFY_MAC_ERROR;
  16313. }
  16314. return 0;
  16315. }
  16316. #endif
  16317. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  16318. int content, word32* padSz)
  16319. {
  16320. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  16321. int ivExtra = 0;
  16322. int ret;
  16323. word32 pad = 0;
  16324. word32 padByte = 0;
  16325. #ifdef HAVE_TRUNCATED_HMAC
  16326. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  16327. : ssl->specs.hash_size;
  16328. #else
  16329. word32 digestSz = ssl->specs.hash_size;
  16330. #endif
  16331. byte verify[WC_MAX_DIGEST_SIZE];
  16332. if (ssl->specs.cipher_type == block) {
  16333. if (ssl->options.tls1_1)
  16334. ivExtra = ssl->specs.block_size;
  16335. pad = *(input + msgSz - ivExtra - 1);
  16336. padByte = 1;
  16337. if (ssl->options.tls) {
  16338. #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
  16339. ret = PROTOCOLCB_UNAVAILABLE;
  16340. if(ssl->ctx->VerifyMacCb) {
  16341. void* ctx = wolfSSL_GetVerifyMacCtx(ssl);
  16342. ret = ssl->ctx->VerifyMacCb(ssl, input,
  16343. (msgSz - ivExtra) - digestSz - pad - 1,
  16344. digestSz, content, ctx);
  16345. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  16346. return ret;
  16347. }
  16348. }
  16349. if (!ssl->ctx->VerifyMacCb || ret == PROTOCOLCB_UNAVAILABLE)
  16350. #endif
  16351. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  16352. content);
  16353. if (ret != 0)
  16354. return ret;
  16355. }
  16356. else { /* sslv3, some implementations have bad padding, but don't
  16357. * allow bad read */
  16358. int badPadLen = 0;
  16359. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE];
  16360. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  16361. XMEMSET(dmy, 0, sizeof(dmy));
  16362. if (pad > (msgSz - digestSz - 1)) {
  16363. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  16364. pad = 0; /* no bad read */
  16365. badPadLen = 1;
  16366. }
  16367. (void)PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  16368. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
  16369. pad, content, 1, PEER_ORDER);
  16370. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  16371. digestSz) != 0) {
  16372. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16373. return VERIFY_MAC_ERROR;
  16374. }
  16375. if (ret != 0 || badPadLen) {
  16376. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16377. return VERIFY_MAC_ERROR;
  16378. }
  16379. }
  16380. }
  16381. else if (ssl->specs.cipher_type == stream) {
  16382. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
  16383. PEER_ORDER);
  16384. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0) {
  16385. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16386. return VERIFY_MAC_ERROR;
  16387. }
  16388. if (ret != 0) {
  16389. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  16390. return VERIFY_MAC_ERROR;
  16391. }
  16392. }
  16393. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  16394. if (ssl->specs.cipher_type == aead) {
  16395. *padSz = ssl->specs.aead_mac_size;
  16396. }
  16397. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  16398. else {
  16399. *padSz = digestSz + pad + padByte;
  16400. }
  16401. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  16402. (void)input;
  16403. (void)msgSz;
  16404. (void)content;
  16405. return 0;
  16406. }
  16407. int ProcessReply(WOLFSSL* ssl)
  16408. {
  16409. return ProcessReplyEx(ssl, 0);
  16410. }
  16411. /* Process input requests. Return 0 is done, 1 is call again to complete, and
  16412. negative number is error. If allowSocketErr is set, SOCKET_ERROR_E in
  16413. ssl->error will be whitelisted. This is useful when the connection has been
  16414. closed and the endpoint wants to check for an alert sent by the other end. */
  16415. int ProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
  16416. {
  16417. int ret = 0, type = internal_error, readSz;
  16418. int atomicUser = 0;
  16419. word32 startIdx = 0;
  16420. #if defined(WOLFSSL_DTLS)
  16421. int used;
  16422. #endif
  16423. #ifdef ATOMIC_USER
  16424. if (ssl->ctx->DecryptVerifyCb)
  16425. atomicUser = 1;
  16426. #endif
  16427. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  16428. #ifdef HAVE_SECURE_RENEGOTIATION
  16429. && ssl->error != APP_DATA_READY
  16430. #endif
  16431. #ifdef WOLFSSL_ASYNC_CRYPT
  16432. && ssl->error != WC_PENDING_E
  16433. #endif
  16434. #ifdef WOLFSSL_NONBLOCK_OCSP
  16435. && ssl->error != OCSP_WANT_READ
  16436. #endif
  16437. && (allowSocketErr != 1 || ssl->error != SOCKET_ERROR_E)
  16438. ) {
  16439. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  16440. return ssl->error;
  16441. }
  16442. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
  16443. /* process any pending DTLS messages - this flow can happen with async */
  16444. if (ssl->dtls_rx_msg_list != NULL) {
  16445. word32 pendingMsg = ssl->dtls_rx_msg_list_sz;
  16446. if(IsAtLeastTLSv1_3(ssl->version)) {
  16447. #ifdef WOLFSSL_DTLS13
  16448. ret = Dtls13ProcessBufferedMessages(ssl);
  16449. #else
  16450. ret = NOT_COMPILED_IN;
  16451. #endif /* WOLFSSL_DTLS13 */
  16452. }
  16453. else {
  16454. ret = DtlsMsgDrain(ssl);
  16455. }
  16456. if (ret != 0) {
  16457. WOLFSSL_ERROR(ret);
  16458. return ret;
  16459. }
  16460. /* we processed some messages, return so connect/accept can make
  16461. progress */
  16462. if (ssl->dtls_rx_msg_list_sz != pendingMsg)
  16463. return ret;
  16464. }
  16465. #endif
  16466. ret = RetrySendAlert(ssl);
  16467. if (ret != 0)
  16468. return ret;
  16469. for (;;) {
  16470. switch (ssl->options.processReply) {
  16471. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  16472. * old client hello */
  16473. case doProcessInit:
  16474. readSz = RECORD_HEADER_SZ;
  16475. #ifdef WOLFSSL_DTLS
  16476. if (ssl->options.dtls) {
  16477. readSz = DTLS_RECORD_HEADER_SZ;
  16478. #ifdef WOLFSSL_DTLS13
  16479. if (ssl->options.tls1_3) {
  16480. /* dtls1.3 unified header can be as little as 2 bytes */
  16481. readSz = DTLS_UNIFIED_HEADER_MIN_SZ;
  16482. }
  16483. #endif /* WOLFSSL_DTLS13 */
  16484. }
  16485. #endif
  16486. /* get header or return error */
  16487. if (!ssl->options.dtls) {
  16488. if ((ret = GetInputData(ssl, readSz)) < 0)
  16489. return ret;
  16490. } else {
  16491. #ifdef WOLFSSL_DTLS
  16492. /* read ahead may already have header */
  16493. used = ssl->buffers.inputBuffer.length -
  16494. ssl->buffers.inputBuffer.idx;
  16495. if (used < readSz) {
  16496. if ((ret = GetInputData(ssl, readSz)) < 0)
  16497. return ret;
  16498. }
  16499. #endif
  16500. }
  16501. #ifdef OLD_HELLO_ALLOWED
  16502. /* see if sending SSLv2 client hello */
  16503. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  16504. ssl->options.clientState == NULL_STATE &&
  16505. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  16506. != handshake) {
  16507. byte b0, b1;
  16508. ssl->options.processReply = runProcessOldClientHello;
  16509. /* sanity checks before getting size at front */
  16510. if (ssl->buffers.inputBuffer.buffer[
  16511. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  16512. WOLFSSL_MSG("Not a valid old client hello");
  16513. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  16514. return PARSE_ERROR;
  16515. }
  16516. if (ssl->buffers.inputBuffer.buffer[
  16517. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  16518. ssl->buffers.inputBuffer.buffer[
  16519. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  16520. WOLFSSL_MSG("Not a valid version in old client hello");
  16521. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  16522. return PARSE_ERROR;
  16523. }
  16524. /* how many bytes need ProcessOldClientHello */
  16525. b0 =
  16526. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  16527. b1 =
  16528. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  16529. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  16530. }
  16531. else {
  16532. ssl->options.processReply = getRecordLayerHeader;
  16533. continue;
  16534. }
  16535. FALL_THROUGH;
  16536. /* in the WOLFSSL_SERVER case, run the old client hello */
  16537. case runProcessOldClientHello:
  16538. /* get sz bytes or return error */
  16539. if (!ssl->options.dtls) {
  16540. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  16541. return ret;
  16542. } else {
  16543. #ifdef WOLFSSL_DTLS
  16544. /* read ahead may already have */
  16545. used = ssl->buffers.inputBuffer.length -
  16546. ssl->buffers.inputBuffer.idx;
  16547. if (used < ssl->curSize)
  16548. if ((ret = GetInputData(ssl, ssl->curSize - used)) < 0)
  16549. return ret;
  16550. #endif /* WOLFSSL_DTLS */
  16551. }
  16552. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  16553. &ssl->buffers.inputBuffer.idx,
  16554. ssl->buffers.inputBuffer.length -
  16555. ssl->buffers.inputBuffer.idx,
  16556. ssl->curSize);
  16557. if (ret < 0)
  16558. return ret;
  16559. else if (ssl->buffers.inputBuffer.idx ==
  16560. ssl->buffers.inputBuffer.length) {
  16561. ssl->options.processReply = doProcessInit;
  16562. return 0;
  16563. }
  16564. #endif /* OLD_HELLO_ALLOWED */
  16565. FALL_THROUGH;
  16566. /* get the record layer header */
  16567. case getRecordLayerHeader:
  16568. /* DTLSv1.3 record numbers in the header are encrypted, and AAD
  16569. * uses the unecrypted form. Because of this we need to modify the
  16570. * header, decrypting the numbers inside
  16571. * DtlsParseUnifiedRecordLayer(). This violates the const attribute
  16572. * of the buffer parameter of GetRecordHeader() used here. */
  16573. ret = GetRecordHeader(ssl, ssl->buffers.inputBuffer.buffer,
  16574. &ssl->buffers.inputBuffer.idx,
  16575. &ssl->curRL, &ssl->curSize);
  16576. #ifdef WOLFSSL_DTLS
  16577. if (ssl->options.dtls &&
  16578. (ret == SEQUENCE_ERROR || ret == DTLS_CID_ERROR)) {
  16579. WOLFSSL_MSG("Silently dropping DTLS message");
  16580. ssl->options.processReply = doProcessInit;
  16581. ssl->buffers.inputBuffer.length = 0;
  16582. ssl->buffers.inputBuffer.idx = 0;
  16583. #ifdef WOLFSSL_DTLS_DROP_STATS
  16584. ssl->replayDropCount++;
  16585. #endif /* WOLFSSL_DTLS_DROP_STATS */
  16586. #ifdef WOLFSSL_DTLS13
  16587. /* return to send ACKS and shortcut rtx timer */
  16588. if (IsAtLeastTLSv1_3(ssl->version)
  16589. && ssl->dtls13Rtx.sendAcks)
  16590. return 0;
  16591. #endif /* WOLFSSL_DTLS13 */
  16592. continue;
  16593. }
  16594. #endif
  16595. if (ret != 0)
  16596. return ret;
  16597. #ifdef WOLFSSL_TLS13
  16598. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  16599. ssl->curRL.type != application_data &&
  16600. ssl->curRL.type != change_cipher_spec) {
  16601. SendAlert(ssl, alert_fatal, unexpected_message);
  16602. WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
  16603. return PARSE_ERROR;
  16604. }
  16605. #endif
  16606. ssl->options.processReply = getData;
  16607. FALL_THROUGH;
  16608. /* retrieve record layer data */
  16609. case getData:
  16610. /* get sz bytes or return error */
  16611. if (!ssl->options.dtls) {
  16612. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  16613. #ifdef WOLFSSL_EXTRA_ALERTS
  16614. if (ret != WANT_READ)
  16615. SendAlert(ssl, alert_fatal, bad_record_mac);
  16616. #endif
  16617. return ret;
  16618. }
  16619. }
  16620. else {
  16621. #ifdef WOLFSSL_DTLS
  16622. /* read ahead may already have */
  16623. used = ssl->buffers.inputBuffer.length -
  16624. ssl->buffers.inputBuffer.idx;
  16625. if (used < ssl->curSize)
  16626. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  16627. return ret;
  16628. #endif
  16629. }
  16630. if (IsEncryptionOn(ssl, 0)) {
  16631. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  16632. int tooLong = 0;
  16633. #endif
  16634. #ifdef WOLFSSL_TLS13
  16635. if (IsAtLeastTLSv1_3(ssl->version)) {
  16636. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  16637. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  16638. MAX_TLS13_PLAIN_SZ;
  16639. }
  16640. #endif
  16641. #ifdef WOLFSSL_EXTRA_ALERTS
  16642. if (!IsAtLeastTLSv1_3(ssl->version))
  16643. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  16644. #endif
  16645. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  16646. if (tooLong) {
  16647. WOLFSSL_MSG("Encrypted data too long");
  16648. SendAlert(ssl, alert_fatal, record_overflow);
  16649. return BUFFER_ERROR;
  16650. }
  16651. #endif
  16652. }
  16653. ssl->keys.padSz = 0;
  16654. ssl->options.processReply = verifyEncryptedMessage;
  16655. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  16656. FALL_THROUGH;
  16657. /* verify digest of encrypted message */
  16658. case verifyEncryptedMessage:
  16659. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16660. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  16661. !atomicUser && ssl->options.startedETMRead) {
  16662. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  16663. ssl->buffers.inputBuffer.idx,
  16664. ssl->curSize, ssl->curRL.type);
  16665. #ifdef WOLFSSL_ASYNC_CRYPT
  16666. if (ret == WC_PENDING_E)
  16667. return ret;
  16668. #endif
  16669. if (ret < 0) {
  16670. WOLFSSL_MSG("VerifyMacEnc failed");
  16671. WOLFSSL_ERROR(ret);
  16672. #ifdef WOLFSSL_DTLS
  16673. /* If in DTLS mode, if the decrypt fails for any
  16674. * reason, pretend the datagram never happened. */
  16675. if (ssl->options.dtls) {
  16676. ssl->options.processReply = doProcessInit;
  16677. ssl->buffers.inputBuffer.idx =
  16678. ssl->buffers.inputBuffer.length;
  16679. #ifdef WOLFSSL_DTLS_DROP_STATS
  16680. ssl->macDropCount++;
  16681. #endif /* WOLFSSL_DTLS_DROP_STATS */
  16682. }
  16683. #endif /* WOLFSSL_DTLS */
  16684. #ifdef WOLFSSL_EXTRA_ALERTS
  16685. if (!ssl->options.dtls)
  16686. SendAlert(ssl, alert_fatal, bad_record_mac);
  16687. #endif
  16688. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  16689. return DECRYPT_ERROR;
  16690. }
  16691. ssl->keys.encryptSz = ssl->curSize;
  16692. }
  16693. #endif
  16694. ssl->options.processReply = decryptMessage;
  16695. FALL_THROUGH;
  16696. /* decrypt message */
  16697. case decryptMessage:
  16698. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  16699. (!IsAtLeastTLSv1_3(ssl->version) ||
  16700. ssl->curRL.type != change_cipher_spec))
  16701. {
  16702. bufferStatic* in = &ssl->buffers.inputBuffer;
  16703. ret = SanityCheckCipherText(ssl, ssl->curSize);
  16704. if (ret < 0) {
  16705. #ifdef WOLFSSL_EXTRA_ALERTS
  16706. SendAlert(ssl, alert_fatal, bad_record_mac);
  16707. #endif
  16708. return ret;
  16709. }
  16710. if (atomicUser) {
  16711. #ifdef ATOMIC_USER
  16712. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16713. if (ssl->options.startedETMRead) {
  16714. ret = ssl->ctx->VerifyDecryptCb(ssl,
  16715. in->buffer + in->idx, in->buffer + in->idx,
  16716. ssl->curSize - MacSize(ssl),
  16717. ssl->curRL.type, 1, &ssl->keys.padSz,
  16718. ssl->DecryptVerifyCtx);
  16719. }
  16720. else
  16721. #endif
  16722. {
  16723. ret = ssl->ctx->DecryptVerifyCb(ssl,
  16724. in->buffer + in->idx,
  16725. in->buffer + in->idx,
  16726. ssl->curSize, ssl->curRL.type, 1,
  16727. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  16728. }
  16729. #endif /* ATOMIC_USER */
  16730. }
  16731. else {
  16732. if (!ssl->options.tls1_3) {
  16733. #ifndef WOLFSSL_NO_TLS12
  16734. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16735. if (ssl->options.startedETMRead) {
  16736. word32 digestSz = MacSize(ssl);
  16737. ret = DecryptTls(ssl,
  16738. in->buffer + in->idx,
  16739. in->buffer + in->idx,
  16740. ssl->curSize - (word16)digestSz);
  16741. if (ret == 0) {
  16742. byte invalid = 0;
  16743. byte padding = (byte)-1;
  16744. word32 i;
  16745. word32 off = in->idx + ssl->curSize - digestSz - 1;
  16746. /* Last of padding bytes - indicates length. */
  16747. ssl->keys.padSz = in->buffer[off];
  16748. /* Constant time checking of padding - don't leak
  16749. * the length of the data.
  16750. */
  16751. /* Compare max pad bytes or at most data + pad. */
  16752. for (i = 1; i < MAX_PAD_SIZE && off >= i; i++) {
  16753. /* Mask on indicates this is expected to be a
  16754. * padding byte.
  16755. */
  16756. padding &= ctMaskLTE(i, ssl->keys.padSz);
  16757. /* When this is a padding byte and not equal
  16758. * to length then mask is set.
  16759. */
  16760. invalid |= padding &
  16761. ctMaskNotEq(in->buffer[off - i],
  16762. ssl->keys.padSz);
  16763. }
  16764. /* If mask is set then there was an error. */
  16765. if (invalid) {
  16766. ret = DECRYPT_ERROR;
  16767. }
  16768. ssl->keys.padSz += 1;
  16769. ssl->keys.decryptedCur = 1;
  16770. }
  16771. }
  16772. else
  16773. #endif
  16774. {
  16775. ret = DecryptTls(ssl,
  16776. in->buffer + in->idx,
  16777. in->buffer + in->idx,
  16778. ssl->curSize);
  16779. }
  16780. #else
  16781. ret = DECRYPT_ERROR;
  16782. #endif
  16783. }
  16784. else
  16785. {
  16786. #ifdef WOLFSSL_TLS13
  16787. byte *aad = (byte*)&ssl->curRL;
  16788. word16 aad_size = RECORD_HEADER_SZ;
  16789. #ifdef WOLFSSL_DTLS13
  16790. if (ssl->options.dtls) {
  16791. /* aad now points to the record header */
  16792. aad = ssl->dtls13CurRL;
  16793. aad_size = ssl->dtls13CurRlLength;
  16794. }
  16795. #endif /* WOLFSSL_DTLS13 */
  16796. /* Don't send an alert for DTLS. We will just drop it
  16797. * silently later. */
  16798. ret = DecryptTls13(ssl,
  16799. in->buffer + in->idx,
  16800. in->buffer + in->idx,
  16801. ssl->curSize,
  16802. aad, aad_size);
  16803. #else
  16804. ret = DECRYPT_ERROR;
  16805. #endif /* WOLFSSL_TLS13 */
  16806. }
  16807. (void)in;
  16808. }
  16809. #ifdef WOLFSSL_ASYNC_CRYPT
  16810. if (ret == WC_PENDING_E)
  16811. return ret;
  16812. #endif
  16813. if (ret >= 0) {
  16814. #ifndef WOLFSSL_NO_TLS12
  16815. /* handle success */
  16816. #ifndef WOLFSSL_AEAD_ONLY
  16817. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  16818. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  16819. #endif
  16820. /* go past TLSv1.1 IV */
  16821. if (CipherHasExpIV(ssl))
  16822. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  16823. #endif
  16824. }
  16825. else {
  16826. WOLFSSL_MSG("Decrypt failed");
  16827. #ifdef WOLFSSL_DTLS
  16828. /* If in DTLS mode, if the decrypt fails for any
  16829. * reason, pretend the datagram never happened. */
  16830. if (ssl->options.dtls) {
  16831. WOLFSSL_MSG("DTLS: Ignoring failed decryption");
  16832. ssl->options.processReply = doProcessInit;
  16833. ssl->buffers.inputBuffer.idx =
  16834. ssl->buffers.inputBuffer.length;
  16835. #ifdef WOLFSSL_DTLS_DROP_STATS
  16836. ssl->macDropCount++;
  16837. #endif /* WOLFSSL_DTLS_DROP_STATS */
  16838. return 0;
  16839. }
  16840. #endif /* WOLFSSL_DTLS */
  16841. #ifdef WOLFSSL_EARLY_DATA
  16842. if (ssl->options.tls1_3) {
  16843. if (ssl->options.side == WOLFSSL_SERVER_END &&
  16844. ssl->earlyData != no_early_data &&
  16845. ssl->options.clientState <
  16846. CLIENT_FINISHED_COMPLETE) {
  16847. ssl->earlyDataSz += ssl->curSize;
  16848. if (ssl->earlyDataSz <=
  16849. ssl->options.maxEarlyDataSz) {
  16850. WOLFSSL_MSG("Ignoring EarlyData!");
  16851. if (ssl->keys.peer_sequence_number_lo-- == 0)
  16852. ssl->keys.peer_sequence_number_hi--;
  16853. ssl->options.processReply = doProcessInit;
  16854. ssl->buffers.inputBuffer.idx += ssl->curSize;
  16855. if (ssl->buffers.inputBuffer.idx >
  16856. ssl->buffers.inputBuffer.length) {
  16857. WOLFSSL_ERROR(BUFFER_E);
  16858. return BUFFER_E;
  16859. }
  16860. return 0;
  16861. }
  16862. WOLFSSL_MSG("Too much EarlyData!");
  16863. SendAlert(ssl, alert_fatal, unexpected_message);
  16864. WOLFSSL_ERROR(TOO_MUCH_EARLY_DATA);
  16865. return TOO_MUCH_EARLY_DATA;
  16866. }
  16867. }
  16868. #endif
  16869. SendAlert(ssl, alert_fatal, bad_record_mac);
  16870. /* Push error once we know that we will error out here */
  16871. WOLFSSL_ERROR(ret);
  16872. return ret;
  16873. }
  16874. }
  16875. ssl->options.processReply = verifyMessage;
  16876. FALL_THROUGH;
  16877. /* verify digest of message */
  16878. case verifyMessage:
  16879. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  16880. (!IsAtLeastTLSv1_3(ssl->version) ||
  16881. ssl->curRL.type != change_cipher_spec))
  16882. {
  16883. if (!atomicUser
  16884. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16885. && !ssl->options.startedETMRead
  16886. #endif
  16887. ) {
  16888. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  16889. ssl->buffers.inputBuffer.idx,
  16890. ssl->curSize, ssl->curRL.type,
  16891. &ssl->keys.padSz);
  16892. #ifdef WOLFSSL_ASYNC_CRYPT
  16893. if (ret == WC_PENDING_E)
  16894. return ret;
  16895. #endif
  16896. if (ret < 0) {
  16897. WOLFSSL_MSG("VerifyMac failed");
  16898. WOLFSSL_ERROR(ret);
  16899. #ifdef WOLFSSL_DTLS
  16900. /* If in DTLS mode, if the decrypt fails for any
  16901. * reason, pretend the datagram never happened. */
  16902. if (ssl->options.dtls) {
  16903. ssl->options.processReply = doProcessInit;
  16904. ssl->buffers.inputBuffer.idx =
  16905. ssl->buffers.inputBuffer.length;
  16906. #ifdef WOLFSSL_DTLS_DROP_STATS
  16907. ssl->macDropCount++;
  16908. #endif /* WOLFSSL_DTLS_DROP_STATS */
  16909. }
  16910. #endif /* WOLFSSL_DTLS */
  16911. #ifdef WOLFSSL_EXTRA_ALERTS
  16912. if (!ssl->options.dtls)
  16913. SendAlert(ssl, alert_fatal, bad_record_mac);
  16914. #endif
  16915. WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
  16916. return DECRYPT_ERROR;
  16917. }
  16918. }
  16919. ssl->keys.encryptSz = ssl->curSize;
  16920. ssl->keys.decryptedCur = 1;
  16921. #ifdef WOLFSSL_TLS13
  16922. if (ssl->options.tls1_3) {
  16923. /* end of plaintext */
  16924. word16 i = (word16)(ssl->buffers.inputBuffer.idx +
  16925. ssl->curSize - ssl->specs.aead_mac_size);
  16926. if (i > ssl->buffers.inputBuffer.length) {
  16927. WOLFSSL_ERROR(BUFFER_ERROR);
  16928. return BUFFER_ERROR;
  16929. }
  16930. /* Remove padding from end of plain text. */
  16931. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  16932. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  16933. break;
  16934. }
  16935. /* Get the real content type from the end of the data. */
  16936. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  16937. /* consider both contentType byte and MAC as padding */
  16938. ssl->keys.padSz = ssl->buffers.inputBuffer.idx
  16939. + ssl->curSize - i;
  16940. }
  16941. #endif
  16942. }
  16943. ssl->options.processReply = runProcessingOneRecord;
  16944. FALL_THROUGH;
  16945. /* the record layer is here */
  16946. case runProcessingOneRecord:
  16947. #ifdef WOLFSSL_DTLS13
  16948. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  16949. if(!Dtls13CheckWindow(ssl)) {
  16950. /* drop packet */
  16951. WOLFSSL_MSG(
  16952. "Dropping DTLS record outside receiving window");
  16953. ssl->options.processReply = doProcessInit;
  16954. ssl->buffers.inputBuffer.idx += ssl->curSize;
  16955. if (ssl->buffers.inputBuffer.idx >
  16956. ssl->buffers.inputBuffer.length)
  16957. return BUFFER_E;
  16958. continue;
  16959. }
  16960. ret = Dtls13UpdateWindow(ssl);
  16961. if (ret != 1) {
  16962. WOLFSSL_ERROR(ret);
  16963. return ret;
  16964. }
  16965. ret = Dtls13RecordRecvd(ssl);
  16966. if (ret != 0) {
  16967. WOLFSSL_ERROR(ret);
  16968. return ret;
  16969. }
  16970. }
  16971. #endif /* WOLFSSL_DTLS13 */
  16972. ssl->options.processReply = runProcessingOneMessage;
  16973. FALL_THROUGH;
  16974. case runProcessingOneMessage:
  16975. /* can't process a message if we have no data. */
  16976. if (ssl->buffers.inputBuffer.idx
  16977. >= ssl->buffers.inputBuffer.length) {
  16978. return BUFFER_ERROR;
  16979. }
  16980. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16981. if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
  16982. /* For TLS v1.1 the block size and explcit IV are added to idx,
  16983. * so it needs to be included in this limit check */
  16984. if ((ssl->curSize - ssl->keys.padSz -
  16985. (ssl->buffers.inputBuffer.idx - startIdx) -
  16986. MacSize(ssl) > MAX_PLAINTEXT_SZ)
  16987. #ifdef WOLFSSL_ASYNC_CRYPT
  16988. && ssl->buffers.inputBuffer.length !=
  16989. ssl->buffers.inputBuffer.idx
  16990. #endif
  16991. ) {
  16992. WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
  16993. #if defined(WOLFSSL_EXTRA_ALERTS)
  16994. SendAlert(ssl, alert_fatal, record_overflow);
  16995. #endif
  16996. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  16997. return BUFFER_ERROR;
  16998. }
  16999. }
  17000. else
  17001. #endif
  17002. /* TLS13 plaintext limit is checked earlier before decryption */
  17003. /* For TLS v1.1 the block size and explcit IV are added to idx,
  17004. * so it needs to be included in this limit check */
  17005. if (!IsAtLeastTLSv1_3(ssl->version)
  17006. && ssl->curSize - ssl->keys.padSz -
  17007. (ssl->buffers.inputBuffer.idx - startIdx)
  17008. > MAX_PLAINTEXT_SZ
  17009. #ifdef WOLFSSL_ASYNC_CRYPT
  17010. && ssl->buffers.inputBuffer.length !=
  17011. ssl->buffers.inputBuffer.idx
  17012. #endif
  17013. ) {
  17014. WOLFSSL_MSG("Plaintext too long");
  17015. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  17016. SendAlert(ssl, alert_fatal, record_overflow);
  17017. #endif
  17018. WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
  17019. return BUFFER_ERROR;
  17020. }
  17021. #ifdef WOLFSSL_DTLS
  17022. if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) {
  17023. _DtlsUpdateWindow(ssl);
  17024. }
  17025. if (ssl->options.dtls) {
  17026. /* Reset timeout as we have received a valid DTLS message */
  17027. ssl->dtls_timeout = ssl->dtls_timeout_init;
  17028. }
  17029. #endif /* WOLFSSL_DTLS */
  17030. WOLFSSL_MSG("received record layer msg");
  17031. switch (ssl->curRL.type) {
  17032. case handshake :
  17033. WOLFSSL_MSG("got HANDSHAKE");
  17034. /* debugging in DoHandShakeMsg */
  17035. if (ssl->options.dtls) {
  17036. #ifdef WOLFSSL_DTLS
  17037. if (!IsAtLeastTLSv1_3(ssl->version)) {
  17038. ret = DoDtlsHandShakeMsg(ssl,
  17039. ssl->buffers.inputBuffer.buffer,
  17040. &ssl->buffers.inputBuffer.idx,
  17041. ssl->buffers.inputBuffer.length);
  17042. }
  17043. #endif
  17044. #ifdef WOLFSSL_DTLS13
  17045. if (IsAtLeastTLSv1_3(ssl->version)) {
  17046. ret = Dtls13HandshakeRecv(ssl,
  17047. ssl->buffers.inputBuffer.buffer,
  17048. &ssl->buffers.inputBuffer.idx,
  17049. ssl->buffers.inputBuffer.length);
  17050. #ifdef WOLFSSL_EARLY_DATA
  17051. if (ret == 0 &&
  17052. ssl->options.side == WOLFSSL_SERVER_END &&
  17053. ssl->earlyData > early_data_ext &&
  17054. ssl->options.handShakeState == HANDSHAKE_DONE) {
  17055. /* return so wolfSSL_read_early_data can return
  17056. exit */
  17057. ssl->earlyData = no_early_data;
  17058. ssl->options.processReply = doProcessInit;
  17059. return ZERO_RETURN;
  17060. }
  17061. #endif /* WOLFSSL_EARLY_DATA */
  17062. }
  17063. #endif /* WOLFSSL_DTLS13 */
  17064. }
  17065. else if (!IsAtLeastTLSv1_3(ssl->version)
  17066. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  17067. || !TLSv1_3_Capable(ssl)
  17068. #endif
  17069. ) {
  17070. #ifndef WOLFSSL_NO_TLS12
  17071. ret = DoHandShakeMsg(ssl,
  17072. ssl->buffers.inputBuffer.buffer,
  17073. &ssl->buffers.inputBuffer.idx,
  17074. ssl->buffers.inputBuffer.length);
  17075. #else
  17076. ret = BUFFER_ERROR;
  17077. #endif
  17078. }
  17079. else {
  17080. #ifdef WOLFSSL_TLS13
  17081. ssl->msgsReceived.got_change_cipher = 0;
  17082. ret = DoTls13HandShakeMsg(ssl,
  17083. ssl->buffers.inputBuffer.buffer,
  17084. &ssl->buffers.inputBuffer.idx,
  17085. ssl->buffers.inputBuffer.length);
  17086. #ifdef WOLFSSL_EARLY_DATA
  17087. if (ret != 0)
  17088. return ret;
  17089. if (ssl->options.side == WOLFSSL_SERVER_END &&
  17090. ssl->earlyData > early_data_ext &&
  17091. ssl->options.handShakeState == HANDSHAKE_DONE) {
  17092. ssl->earlyData = no_early_data;
  17093. ssl->options.processReply = doProcessInit;
  17094. return ZERO_RETURN;
  17095. }
  17096. #endif
  17097. #else
  17098. ret = BUFFER_ERROR;
  17099. #endif
  17100. }
  17101. if (ret != 0
  17102. /* DoDtlsHandShakeMsg can return a WANT_WRITE when
  17103. * calling DtlsMsgPoolSend. This msg is done
  17104. * processing so let's move on. */
  17105. && (!ssl->options.dtls
  17106. || ret != WANT_WRITE)
  17107. #ifdef WOLFSSL_ASYNC_CRYPT
  17108. /* In async case, on pending, move onto next message.
  17109. * Current message should have been DtlsMsgStore'ed and
  17110. * should be processed with DtlsMsgDrain */
  17111. && (!ssl->options.dtls
  17112. || ret != WC_PENDING_E)
  17113. #endif
  17114. ) {
  17115. WOLFSSL_ERROR(ret);
  17116. return ret;
  17117. }
  17118. break;
  17119. case change_cipher_spec:
  17120. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  17121. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17122. if (ssl->hsInfoOn)
  17123. AddPacketName(ssl, "ChangeCipher");
  17124. /* add record header back on info */
  17125. if (ssl->toInfoOn) {
  17126. AddPacketInfo(ssl, "ChangeCipher",
  17127. change_cipher_spec,
  17128. ssl->buffers.inputBuffer.buffer +
  17129. ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ -
  17130. (ssl->options.dtls ? DTLS_RECORD_EXTRA : 0),
  17131. 1 + RECORD_HEADER_SZ, READ_PROTO, ssl->heap);
  17132. #ifdef WOLFSSL_CALLBACKS
  17133. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  17134. #endif
  17135. }
  17136. #endif
  17137. #ifdef WOLFSSL_TLS13
  17138. if (IsAtLeastTLSv1_3(ssl->version)) {
  17139. word32 i = ssl->buffers.inputBuffer.idx;
  17140. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  17141. SendAlert(ssl, alert_fatal, unexpected_message);
  17142. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  17143. return UNKNOWN_RECORD_TYPE;
  17144. }
  17145. if (ssl->curSize != 1 ||
  17146. ssl->buffers.inputBuffer.buffer[i] != 1) {
  17147. SendAlert(ssl, alert_fatal, illegal_parameter);
  17148. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  17149. return UNKNOWN_RECORD_TYPE;
  17150. }
  17151. ssl->buffers.inputBuffer.idx++;
  17152. if (!ssl->msgsReceived.got_change_cipher) {
  17153. ssl->msgsReceived.got_change_cipher = 1;
  17154. }
  17155. else {
  17156. SendAlert(ssl, alert_fatal, illegal_parameter);
  17157. WOLFSSL_ERROR_VERBOSE(UNKNOWN_RECORD_TYPE);
  17158. return UNKNOWN_RECORD_TYPE;
  17159. }
  17160. break;
  17161. }
  17162. #endif
  17163. #ifndef WOLFSSL_NO_TLS12
  17164. if (ssl->buffers.inputBuffer.idx >=
  17165. ssl->buffers.inputBuffer.length ||
  17166. ssl->curSize < 1) {
  17167. WOLFSSL_MSG("ChangeCipher msg too short");
  17168. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  17169. return LENGTH_ERROR;
  17170. }
  17171. if (ssl->buffers.inputBuffer.buffer[
  17172. ssl->buffers.inputBuffer.idx] != 1) {
  17173. WOLFSSL_MSG("ChangeCipher msg wrong value");
  17174. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  17175. return LENGTH_ERROR;
  17176. }
  17177. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  17178. #ifdef HAVE_AEAD
  17179. if (ssl->specs.cipher_type == aead) {
  17180. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  17181. ssl->curSize -= AESGCM_EXP_IV_SZ;
  17182. ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
  17183. ssl->curSize -= ssl->specs.aead_mac_size;
  17184. }
  17185. else
  17186. #endif
  17187. {
  17188. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  17189. ssl->curSize -= (word16)ssl->keys.padSz;
  17190. ssl->curSize -= ssl->specs.iv_size;
  17191. }
  17192. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17193. if (ssl->options.startedETMRead) {
  17194. word32 digestSz = MacSize(ssl);
  17195. ssl->buffers.inputBuffer.idx += digestSz;
  17196. ssl->curSize -= (word16)digestSz;
  17197. }
  17198. #endif
  17199. }
  17200. if (ssl->curSize != 1) {
  17201. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  17202. WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
  17203. return LENGTH_ERROR;
  17204. }
  17205. ssl->buffers.inputBuffer.idx++;
  17206. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  17207. if (ret != 0) {
  17208. if (!ssl->options.dtls) {
  17209. return ret;
  17210. }
  17211. else {
  17212. #ifdef WOLFSSL_DTLS
  17213. /* Check for duplicate CCS message in DTLS mode.
  17214. * DTLS allows for duplicate messages, and it should be
  17215. * skipped. Also skip if out of order. */
  17216. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  17217. return ret;
  17218. /* Reset error */
  17219. ret = 0;
  17220. break;
  17221. #endif /* WOLFSSL_DTLS */
  17222. }
  17223. }
  17224. ssl->keys.encryptionOn = 1;
  17225. /* setup decrypt keys for following messages */
  17226. /* XXX This might not be what we want to do when
  17227. * receiving a CCS with multicast. We update the
  17228. * key when the application updates them. */
  17229. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  17230. return ret;
  17231. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17232. ssl->options.startedETMRead = ssl->options.encThenMac;
  17233. #endif
  17234. #ifdef WOLFSSL_DTLS
  17235. if (ssl->options.dtls) {
  17236. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  17237. #ifdef WOLFSSL_MULTICAST
  17238. if (ssl->options.haveMcast) {
  17239. peerSeq += ssl->keys.curPeerId;
  17240. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  17241. ssl->ctx->mcastFirstSeq,
  17242. ssl->ctx->mcastSecondSeq,
  17243. ssl->ctx->mcastMaxSeq);
  17244. }
  17245. #endif
  17246. peerSeq->nextEpoch++;
  17247. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  17248. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  17249. peerSeq->nextSeq_lo = 0;
  17250. peerSeq->nextSeq_hi = 0;
  17251. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  17252. DTLS_SEQ_SZ);
  17253. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  17254. }
  17255. #endif
  17256. #ifdef HAVE_LIBZ
  17257. if (ssl->options.usingCompression)
  17258. if ( (ret = InitStreams(ssl)) != 0)
  17259. return ret;
  17260. #endif
  17261. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  17262. ssl->options.side == WOLFSSL_CLIENT_END ?
  17263. kTlsServerStr : kTlsClientStr);
  17264. if (ret != 0)
  17265. return ret;
  17266. #endif /* !WOLFSSL_NO_TLS12 */
  17267. break;
  17268. case application_data:
  17269. WOLFSSL_MSG("got app DATA");
  17270. #ifdef WOLFSSL_DTLS
  17271. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  17272. #ifdef HAVE_SECURE_RENEGOTIATION
  17273. /*
  17274. * Only free HS resources when not in the process of a
  17275. * secure renegotiation and we have received APP DATA
  17276. * from the current epoch
  17277. */
  17278. if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
  17279. || !DtlsSCRKeysSet(ssl))) {
  17280. FreeHandshakeResources(ssl);
  17281. ssl->options.dtlsHsRetain = 0;
  17282. }
  17283. #else
  17284. FreeHandshakeResources(ssl);
  17285. ssl->options.dtlsHsRetain = 0;
  17286. #endif
  17287. }
  17288. #endif
  17289. #ifdef WOLFSSL_TLS13
  17290. if (ssl->keys.keyUpdateRespond) {
  17291. WOLFSSL_MSG("No KeyUpdate from peer seen");
  17292. WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
  17293. return SANITY_MSG_E;
  17294. }
  17295. #endif
  17296. if ((ret = DoApplicationData(ssl,
  17297. ssl->buffers.inputBuffer.buffer,
  17298. &ssl->buffers.inputBuffer.idx,
  17299. NO_SNIFF)) != 0) {
  17300. WOLFSSL_ERROR(ret);
  17301. return ret;
  17302. }
  17303. break;
  17304. case alert:
  17305. WOLFSSL_MSG("got ALERT!");
  17306. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  17307. &ssl->buffers.inputBuffer.idx, &type);
  17308. if (ret == alert_fatal)
  17309. return FATAL_ERROR;
  17310. else if (ret < 0)
  17311. return ret;
  17312. /* catch warnings that are handled as errors */
  17313. if (type == close_notify) {
  17314. ssl->buffers.inputBuffer.idx =
  17315. ssl->buffers.inputBuffer.length;
  17316. ssl->options.processReply = doProcessInit;
  17317. return ssl->error = ZERO_RETURN;
  17318. }
  17319. if (type == decrypt_error)
  17320. return FATAL_ERROR;
  17321. /* Reset error if we got an alert level in ret */
  17322. if (ret > 0)
  17323. ret = 0;
  17324. break;
  17325. #ifdef WOLFSSL_DTLS13
  17326. case ack:
  17327. WOLFSSL_MSG("got ACK");
  17328. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  17329. word32 processedSize = 0;
  17330. ret = DoDtls13Ack(ssl, ssl->buffers.inputBuffer.buffer +
  17331. ssl->buffers.inputBuffer.idx,
  17332. ssl->buffers.inputBuffer.length -
  17333. ssl->buffers.inputBuffer.idx -
  17334. ssl->keys.padSz, &processedSize);
  17335. ssl->buffers.inputBuffer.idx += processedSize;
  17336. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  17337. break;
  17338. }
  17339. FALL_THROUGH;
  17340. #endif /* WOLFSSL_DTLS13 */
  17341. default:
  17342. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  17343. return UNKNOWN_RECORD_TYPE;
  17344. }
  17345. ssl->options.processReply = doProcessInit;
  17346. /* input exhausted */
  17347. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
  17348. #ifdef WOLFSSL_DTLS
  17349. /* If app data was processed then return now to avoid
  17350. * dropping any app data. */
  17351. || (ssl->options.dtls && ssl->curRL.type == application_data)
  17352. #endif
  17353. ) {
  17354. /* Shrink input buffer when we successfully finish record
  17355. * processing */
  17356. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag)
  17357. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  17358. return ret;
  17359. }
  17360. /* more messages per record */
  17361. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  17362. WOLFSSL_MSG("More messages in record");
  17363. ssl->options.processReply = runProcessingOneMessage;
  17364. if (IsEncryptionOn(ssl, 0)) {
  17365. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  17366. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17367. if (ssl->options.startedETMRead) {
  17368. word32 digestSz = MacSize(ssl);
  17369. if (ssl->buffers.inputBuffer.idx >=
  17370. ssl->keys.padSz + digestSz) {
  17371. ssl->buffers.inputBuffer.idx -=
  17372. ssl->keys.padSz + digestSz;
  17373. }
  17374. else {
  17375. WOLFSSL_MSG("\tmiddle padding error");
  17376. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  17377. return FATAL_ERROR;
  17378. }
  17379. }
  17380. else
  17381. #endif
  17382. {
  17383. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  17384. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  17385. }
  17386. else {
  17387. WOLFSSL_MSG("\tmiddle padding error");
  17388. WOLFSSL_ERROR_VERBOSE(FATAL_ERROR);
  17389. return FATAL_ERROR;
  17390. }
  17391. }
  17392. }
  17393. }
  17394. /* more records */
  17395. else {
  17396. WOLFSSL_MSG("More records in input");
  17397. }
  17398. #ifdef WOLFSSL_ASYNC_CRYPT
  17399. /* We are setup to read next message/record but we had an error
  17400. * (probably WC_PENDING_E) so return that so it can be handled
  17401. * by higher layers. */
  17402. if (ret != 0)
  17403. return ret;
  17404. #endif
  17405. /* It is safe to shrink the input buffer here now. local vars will
  17406. * be reset to the new starting value. */
  17407. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag)
  17408. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  17409. continue;
  17410. default:
  17411. WOLFSSL_MSG("Bad process input state, programming error");
  17412. WOLFSSL_ERROR_VERBOSE(INPUT_CASE_ERROR);
  17413. return INPUT_CASE_ERROR;
  17414. }
  17415. }
  17416. }
  17417. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  17418. (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
  17419. int SendChangeCipher(WOLFSSL* ssl)
  17420. {
  17421. byte *output;
  17422. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  17423. int idx = RECORD_HEADER_SZ;
  17424. int ret;
  17425. #ifdef OPENSSL_EXTRA
  17426. ssl->cbmode = SSL_CB_MODE_WRITE;
  17427. if (ssl->options.side == WOLFSSL_SERVER_END){
  17428. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  17429. if (ssl->CBIS != NULL)
  17430. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  17431. }
  17432. else{
  17433. ssl->options.clientState =
  17434. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  17435. if (ssl->CBIS != NULL)
  17436. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  17437. }
  17438. #endif
  17439. #ifdef WOLFSSL_DTLS
  17440. if (ssl->options.dtls) {
  17441. sendSz += DTLS_RECORD_EXTRA;
  17442. idx += DTLS_RECORD_EXTRA;
  17443. }
  17444. #endif
  17445. /* are we in scr */
  17446. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  17447. sendSz += MAX_MSG_EXTRA;
  17448. }
  17449. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  17450. * is not advanced yet */
  17451. ssl->options.buildingMsg = 1;
  17452. /* check for available size */
  17453. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  17454. return ret;
  17455. /* get output buffer */
  17456. output = ssl->buffers.outputBuffer.buffer +
  17457. ssl->buffers.outputBuffer.length;
  17458. AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
  17459. output[idx] = 1; /* turn it on */
  17460. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  17461. byte input[ENUM_LEN];
  17462. int inputSz = ENUM_LEN;
  17463. input[0] = 1; /* turn it on */
  17464. #ifdef WOLFSSL_DTLS
  17465. if (IsDtlsNotSctpMode(ssl) &&
  17466. (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
  17467. return ret;
  17468. }
  17469. #endif
  17470. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  17471. change_cipher_spec, 0, 0, 0, CUR_ORDER);
  17472. if (sendSz < 0) {
  17473. return sendSz;
  17474. }
  17475. }
  17476. #ifdef WOLFSSL_DTLS
  17477. else {
  17478. if (IsDtlsNotSctpMode(ssl)) {
  17479. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
  17480. return ret;
  17481. DtlsSEQIncrement(ssl, CUR_ORDER);
  17482. }
  17483. }
  17484. #endif
  17485. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17486. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  17487. if (ssl->toInfoOn)
  17488. AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  17489. sendSz, WRITE_PROTO, ssl->heap);
  17490. #endif
  17491. ssl->buffers.outputBuffer.length += sendSz;
  17492. #ifdef WOLFSSL_TLS13
  17493. if (!ssl->options.tls1_3)
  17494. #endif
  17495. {
  17496. /* setup encrypt keys */
  17497. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  17498. return ret;
  17499. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17500. ssl->options.startedETMWrite = ssl->options.encThenMac;
  17501. #endif
  17502. }
  17503. ssl->options.buildingMsg = 0;
  17504. if (ssl->options.groupMessages)
  17505. return 0;
  17506. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  17507. else if (ssl->options.dtls) {
  17508. /* If using DTLS, force the ChangeCipherSpec message to be in the
  17509. * same datagram as the finished message. */
  17510. return 0;
  17511. }
  17512. #endif
  17513. else
  17514. return SendBuffered(ssl);
  17515. }
  17516. #endif
  17517. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  17518. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  17519. int padLen, int content, int verify, int epochOrder)
  17520. {
  17521. byte result[WC_MAX_DIGEST_SIZE];
  17522. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  17523. word32 padSz = ssl->specs.pad_size;
  17524. int ret = 0;
  17525. wc_Md5 md5;
  17526. wc_Sha sha;
  17527. /* data */
  17528. byte seq[SEQ_SZ];
  17529. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  17530. const byte* macSecret = NULL;
  17531. (void)padLen;
  17532. #ifdef HAVE_FUZZER
  17533. if (ssl->fuzzerCb)
  17534. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  17535. #endif
  17536. #ifdef WOLFSSL_DTLS
  17537. if (ssl->options.dtls)
  17538. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  17539. else
  17540. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  17541. #else
  17542. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  17543. #endif
  17544. XMEMSET(seq, 0, SEQ_SZ);
  17545. conLen[0] = (byte)content;
  17546. c16toa((word16)sz, &conLen[ENUM_LEN]);
  17547. WriteSEQ(ssl, epochOrder, seq);
  17548. if (ssl->specs.mac_algorithm == md5_mac) {
  17549. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  17550. if (ret != 0)
  17551. return ret;
  17552. /* inner */
  17553. ret = wc_Md5Update(&md5, macSecret, digestSz);
  17554. ret |= wc_Md5Update(&md5, PAD1, padSz);
  17555. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  17556. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  17557. /* in buffer */
  17558. ret |= wc_Md5Update(&md5, in, sz);
  17559. if (ret != 0) {
  17560. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17561. return VERIFY_MAC_ERROR;
  17562. }
  17563. ret = wc_Md5Final(&md5, result);
  17564. #ifdef WOLFSSL_ASYNC_CRYPT
  17565. /* TODO: Make non-blocking */
  17566. if (ret == WC_PENDING_E) {
  17567. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  17568. }
  17569. #endif
  17570. if (ret != 0) {
  17571. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17572. return VERIFY_MAC_ERROR;
  17573. }
  17574. /* outer */
  17575. ret = wc_Md5Update(&md5, macSecret, digestSz);
  17576. ret |= wc_Md5Update(&md5, PAD2, padSz);
  17577. ret |= wc_Md5Update(&md5, result, digestSz);
  17578. if (ret != 0) {
  17579. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17580. return VERIFY_MAC_ERROR;
  17581. }
  17582. ret = wc_Md5Final(&md5, digest);
  17583. #ifdef WOLFSSL_ASYNC_CRYPT
  17584. /* TODO: Make non-blocking */
  17585. if (ret == WC_PENDING_E) {
  17586. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  17587. }
  17588. #endif
  17589. if (ret != 0) {
  17590. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17591. return VERIFY_MAC_ERROR;
  17592. }
  17593. wc_Md5Free(&md5);
  17594. }
  17595. else {
  17596. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  17597. if (ret != 0)
  17598. return ret;
  17599. /* inner */
  17600. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  17601. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  17602. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  17603. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  17604. /* in buffer */
  17605. ret |= wc_ShaUpdate(&sha, in, sz);
  17606. if (ret != 0) {
  17607. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17608. return VERIFY_MAC_ERROR;
  17609. }
  17610. ret = wc_ShaFinal(&sha, result);
  17611. #ifdef WOLFSSL_ASYNC_CRYPT
  17612. /* TODO: Make non-blocking */
  17613. if (ret == WC_PENDING_E) {
  17614. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  17615. }
  17616. #endif
  17617. if (ret != 0) {
  17618. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17619. return VERIFY_MAC_ERROR;
  17620. }
  17621. /* outer */
  17622. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  17623. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  17624. ret |= wc_ShaUpdate(&sha, result, digestSz);
  17625. if (ret != 0) {
  17626. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17627. return VERIFY_MAC_ERROR;
  17628. }
  17629. ret = wc_ShaFinal(&sha, digest);
  17630. #ifdef WOLFSSL_ASYNC_CRYPT
  17631. /* TODO: Make non-blocking */
  17632. if (ret == WC_PENDING_E) {
  17633. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  17634. }
  17635. #endif
  17636. if (ret != 0) {
  17637. WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR);
  17638. return VERIFY_MAC_ERROR;
  17639. }
  17640. wc_ShaFree(&sha);
  17641. }
  17642. return 0;
  17643. }
  17644. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  17645. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  17646. static int BuildMD5_CertVerify(WOLFSSL* ssl, byte* digest)
  17647. {
  17648. int ret;
  17649. byte md5_result[WC_MD5_DIGEST_SIZE];
  17650. #ifdef WOLFSSL_SMALL_STACK
  17651. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  17652. #else
  17653. wc_Md5 md5[1];
  17654. #endif
  17655. /* make md5 inner */
  17656. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  17657. if (ret == 0)
  17658. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  17659. if (ret == 0)
  17660. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  17661. if (ret == 0)
  17662. ret = wc_Md5Final(md5, md5_result);
  17663. /* make md5 outer */
  17664. if (ret == 0) {
  17665. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  17666. if (ret == 0) {
  17667. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  17668. if (ret == 0)
  17669. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  17670. if (ret == 0)
  17671. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  17672. if (ret == 0)
  17673. ret = wc_Md5Final(md5, digest);
  17674. wc_Md5Free(md5);
  17675. }
  17676. }
  17677. #ifdef WOLFSSL_SMALL_STACK
  17678. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  17679. #endif
  17680. return ret;
  17681. }
  17682. #endif /* !NO_MD5 && !NO_OLD_TLS */
  17683. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  17684. defined(WOLFSSL_ALLOW_TLS_SHA1))
  17685. static int BuildSHA_CertVerify(WOLFSSL* ssl, byte* digest)
  17686. {
  17687. int ret;
  17688. byte sha_result[WC_SHA_DIGEST_SIZE];
  17689. #ifdef WOLFSSL_SMALL_STACK
  17690. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  17691. #else
  17692. wc_Sha sha[1];
  17693. #endif
  17694. /* make sha inner */
  17695. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  17696. if (ret == 0)
  17697. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  17698. if (ret == 0)
  17699. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  17700. if (ret == 0)
  17701. ret = wc_ShaFinal(sha, sha_result);
  17702. /* make sha outer */
  17703. if (ret == 0) {
  17704. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  17705. if (ret == 0) {
  17706. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  17707. if (ret == 0)
  17708. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  17709. if (ret == 0)
  17710. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  17711. if (ret == 0)
  17712. ret = wc_ShaFinal(sha, digest);
  17713. wc_ShaFree(sha);
  17714. }
  17715. }
  17716. #ifdef WOLFSSL_SMALL_STACK
  17717. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  17718. #endif
  17719. return ret;
  17720. }
  17721. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  17722. int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes)
  17723. {
  17724. int ret = 0;
  17725. (void)hashes;
  17726. if (ssl->options.tls) {
  17727. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  17728. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  17729. if (ret != 0)
  17730. return ret;
  17731. #endif
  17732. #if !defined(NO_SHA)
  17733. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  17734. if (ret != 0)
  17735. return ret;
  17736. #endif
  17737. if (IsAtLeastTLSv1_2(ssl)) {
  17738. #ifndef NO_SHA256
  17739. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  17740. hashes->sha256);
  17741. if (ret != 0)
  17742. return ret;
  17743. #endif
  17744. #ifdef WOLFSSL_SHA384
  17745. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  17746. hashes->sha384);
  17747. if (ret != 0)
  17748. return ret;
  17749. #endif
  17750. #ifdef WOLFSSL_SHA512
  17751. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  17752. hashes->sha512);
  17753. if (ret != 0)
  17754. return ret;
  17755. #endif
  17756. }
  17757. }
  17758. else {
  17759. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  17760. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  17761. if (ret != 0)
  17762. return ret;
  17763. #endif
  17764. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  17765. defined(WOLFSSL_ALLOW_TLS_SHA1))
  17766. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  17767. if (ret != 0)
  17768. return ret;
  17769. #endif
  17770. }
  17771. return ret;
  17772. }
  17773. #ifndef WOLFSSL_NO_TLS12
  17774. void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
  17775. {
  17776. (void)ssl;
  17777. if (args
  17778. #ifdef WOLFSSL_ASYNC_CRYPT
  17779. && ssl->options.buildArgsSet
  17780. #endif
  17781. ) {
  17782. /* only free the IV if it was dynamically allocated */
  17783. if (args->iv && (args->iv != args->staticIvBuffer)) {
  17784. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  17785. }
  17786. }
  17787. #ifdef WOLFSSL_ASYNC_CRYPT
  17788. ssl->options.buildArgsSet = 0;
  17789. #endif
  17790. }
  17791. #endif
  17792. /* Build SSL Message, encrypted */
  17793. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  17794. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
  17795. int epochOrder)
  17796. {
  17797. #ifndef WOLFSSL_NO_TLS12
  17798. int ret;
  17799. BuildMsgArgs* args;
  17800. BuildMsgArgs lcl_args;
  17801. #endif
  17802. WOLFSSL_ENTER("BuildMessage");
  17803. if (ssl == NULL) {
  17804. return BAD_FUNC_ARG;
  17805. }
  17806. /* catch mistaken sizeOnly parameter */
  17807. if (!sizeOnly && (output == NULL || input == NULL) ) {
  17808. return BAD_FUNC_ARG;
  17809. }
  17810. if (sizeOnly && (output || input) ) {
  17811. return BAD_FUNC_ARG;
  17812. }
  17813. (void)epochOrder;
  17814. #ifndef NO_TLS
  17815. #if defined(WOLFSSL_NO_TLS12) && defined(WOLFSSL_TLS13)
  17816. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  17817. hashOutput, sizeOnly, asyncOkay);
  17818. #else
  17819. #ifdef WOLFSSL_TLS13
  17820. if (ssl->options.tls1_3) {
  17821. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  17822. hashOutput, sizeOnly, asyncOkay);
  17823. }
  17824. #endif
  17825. #ifdef WOLFSSL_ASYNC_CRYPT
  17826. ret = WC_NOT_PENDING_E;
  17827. if (asyncOkay) {
  17828. if (ssl->async == NULL) {
  17829. return BAD_FUNC_ARG;
  17830. }
  17831. args = &ssl->async->buildArgs;
  17832. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  17833. if (ret != WC_NOT_PENDING_E) {
  17834. /* Check for error */
  17835. if (ret < 0)
  17836. goto exit_buildmsg;
  17837. }
  17838. }
  17839. else
  17840. #endif
  17841. {
  17842. args = &lcl_args;
  17843. }
  17844. /* Reset state */
  17845. #ifdef WOLFSSL_ASYNC_CRYPT
  17846. if (ret == WC_NOT_PENDING_E)
  17847. #endif
  17848. {
  17849. ret = 0;
  17850. #ifdef WOLFSSL_ASYNC_CRYPT
  17851. ssl->options.buildArgsSet = 1;
  17852. #endif
  17853. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  17854. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  17855. args->sz = RECORD_HEADER_SZ + inSz;
  17856. args->idx = RECORD_HEADER_SZ;
  17857. args->headerSz = RECORD_HEADER_SZ;
  17858. }
  17859. switch (ssl->options.buildMsgState) {
  17860. case BUILD_MSG_BEGIN:
  17861. {
  17862. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  17863. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  17864. /* For epochs >1 the current cipher parameters are located in
  17865. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  17866. * parameters and for epoch 1 use ssl->keys */
  17867. switch (epochOrder) {
  17868. case PREV_ORDER:
  17869. if (ssl->encrypt.src != KEYS) {
  17870. ssl->secure_renegotiation->cache_status =
  17871. SCR_CACHE_NULL;
  17872. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  17873. ERROR_OUT(ret, exit_buildmsg);
  17874. }
  17875. break;
  17876. case CUR_ORDER:
  17877. if (ssl->keys.dtls_epoch ==
  17878. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  17879. if (ssl->encrypt.src != SCR) {
  17880. ssl->secure_renegotiation->cache_status =
  17881. SCR_CACHE_NEEDED;
  17882. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  17883. != 0)
  17884. ERROR_OUT(ret, exit_buildmsg);
  17885. }
  17886. }
  17887. else {
  17888. if (ssl->encrypt.src != KEYS) {
  17889. ssl->secure_renegotiation->cache_status =
  17890. SCR_CACHE_NULL;
  17891. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  17892. != 0)
  17893. ERROR_OUT(ret, exit_buildmsg);
  17894. }
  17895. }
  17896. break;
  17897. default:
  17898. WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
  17899. "CUR_ORDER");
  17900. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  17901. }
  17902. }
  17903. #endif
  17904. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  17905. }
  17906. FALL_THROUGH;
  17907. case BUILD_MSG_SIZE:
  17908. {
  17909. args->digestSz = ssl->specs.hash_size;
  17910. #ifdef HAVE_TRUNCATED_HMAC
  17911. if (ssl->truncated_hmac)
  17912. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  17913. #endif
  17914. args->sz += args->digestSz;
  17915. #ifdef WOLFSSL_DTLS
  17916. if (ssl->options.dtls) {
  17917. args->sz += DTLS_RECORD_EXTRA;
  17918. args->idx += DTLS_RECORD_EXTRA;
  17919. args->headerSz += DTLS_RECORD_EXTRA;
  17920. }
  17921. #endif
  17922. #ifndef WOLFSSL_AEAD_ONLY
  17923. if (ssl->specs.cipher_type == block) {
  17924. word32 blockSz = ssl->specs.block_size;
  17925. if (blockSz == 0) {
  17926. WOLFSSL_MSG("Invalid block size with block cipher type");
  17927. ERROR_OUT(BAD_STATE_E, exit_buildmsg);
  17928. }
  17929. if (ssl->options.tls1_1) {
  17930. args->ivSz = blockSz;
  17931. args->sz += args->ivSz;
  17932. if (args->ivSz > MAX_IV_SZ)
  17933. ERROR_OUT(BUFFER_E, exit_buildmsg);
  17934. }
  17935. args->sz += 1; /* pad byte */
  17936. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  17937. if (ssl->options.startedETMWrite) {
  17938. args->pad = (args->sz - args->headerSz -
  17939. args->digestSz) % blockSz;
  17940. }
  17941. else
  17942. #endif
  17943. {
  17944. args->pad = (args->sz - args->headerSz) % blockSz;
  17945. }
  17946. if (args->pad != 0)
  17947. args->pad = blockSz - args->pad;
  17948. args->sz += args->pad;
  17949. }
  17950. #endif /* WOLFSSL_AEAD_ONLY */
  17951. #ifdef HAVE_AEAD
  17952. if (ssl->specs.cipher_type == aead) {
  17953. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  17954. args->ivSz = AESGCM_EXP_IV_SZ;
  17955. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  17956. }
  17957. #endif
  17958. /* done with size calculations */
  17959. if (sizeOnly)
  17960. goto exit_buildmsg;
  17961. if (args->sz > (word32)outSz) {
  17962. WOLFSSL_MSG("Oops, want to write past output buffer size");
  17963. ERROR_OUT(BUFFER_E, exit_buildmsg);
  17964. }
  17965. if (args->ivSz > 0) {
  17966. if (args->ivSz > sizeof(args->staticIvBuffer)) {
  17967. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap,
  17968. DYNAMIC_TYPE_SALT);
  17969. if (args->iv == NULL) {
  17970. ERROR_OUT(MEMORY_E, exit_buildmsg);
  17971. }
  17972. }
  17973. else {
  17974. args->iv = args->staticIvBuffer;
  17975. }
  17976. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  17977. if (ret != 0)
  17978. goto exit_buildmsg;
  17979. }
  17980. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  17981. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  17982. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  17983. defined(HAVE_AEAD))
  17984. if (ssl->specs.cipher_type == aead) {
  17985. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  17986. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  17987. }
  17988. #endif
  17989. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  17990. AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
  17991. /* write to output */
  17992. if (args->ivSz > 0) {
  17993. XMEMCPY(output + args->idx, args->iv,
  17994. min(args->ivSz, MAX_IV_SZ));
  17995. args->idx += args->ivSz;
  17996. }
  17997. XMEMCPY(output + args->idx, input, inSz);
  17998. args->idx += inSz;
  17999. ssl->options.buildMsgState = BUILD_MSG_HASH;
  18000. }
  18001. FALL_THROUGH;
  18002. case BUILD_MSG_HASH:
  18003. {
  18004. /* done with size calculations */
  18005. if (sizeOnly)
  18006. goto exit_buildmsg;
  18007. if (type == handshake && hashOutput) {
  18008. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  18009. if (ret != 0)
  18010. goto exit_buildmsg;
  18011. }
  18012. #ifndef WOLFSSL_AEAD_ONLY
  18013. if (ssl->specs.cipher_type == block) {
  18014. word32 tmpIdx;
  18015. word32 i;
  18016. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18017. if (ssl->options.startedETMWrite)
  18018. tmpIdx = args->idx;
  18019. else
  18020. #endif
  18021. tmpIdx = args->idx + args->digestSz;
  18022. for (i = 0; i <= args->pad; i++)
  18023. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  18024. }
  18025. #endif
  18026. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  18027. }
  18028. FALL_THROUGH;
  18029. case BUILD_MSG_VERIFY_MAC:
  18030. {
  18031. /* done with size calculations */
  18032. if (sizeOnly)
  18033. goto exit_buildmsg;
  18034. /* User Record Layer Callback handling */
  18035. #ifdef ATOMIC_USER
  18036. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18037. if (ssl->options.startedETMWrite) {
  18038. if (ssl->ctx->EncryptMacCb) {
  18039. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  18040. args->pad + 1, type, 0,
  18041. output + args->headerSz,
  18042. output + args->headerSz,
  18043. args->size - args->digestSz,
  18044. ssl->MacEncryptCtx);
  18045. goto exit_buildmsg;
  18046. }
  18047. }
  18048. else
  18049. #endif
  18050. {
  18051. if (ssl->ctx->MacEncryptCb) {
  18052. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  18053. output + args->headerSz + args->ivSz, inSz,
  18054. type, 0, output + args->headerSz,
  18055. output + args->headerSz, args->size,
  18056. ssl->MacEncryptCtx);
  18057. goto exit_buildmsg;
  18058. }
  18059. }
  18060. #endif
  18061. #ifndef WOLFSSL_AEAD_ONLY
  18062. if (ssl->specs.cipher_type != aead
  18063. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18064. && !ssl->options.startedETMWrite
  18065. #endif
  18066. ) {
  18067. #ifdef HAVE_TRUNCATED_HMAC
  18068. if (ssl->truncated_hmac &&
  18069. ssl->specs.hash_size > args->digestSz) {
  18070. #ifdef WOLFSSL_SMALL_STACK
  18071. byte* hmac;
  18072. #else
  18073. byte hmac[WC_MAX_DIGEST_SIZE];
  18074. #endif
  18075. #ifdef WOLFSSL_SMALL_STACK
  18076. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  18077. DYNAMIC_TYPE_DIGEST);
  18078. if (hmac == NULL)
  18079. ERROR_OUT(MEMORY_E, exit_buildmsg);
  18080. #endif
  18081. ret = ssl->hmac(ssl, hmac,
  18082. output + args->headerSz + args->ivSz, inSz,
  18083. -1, type, 0, epochOrder);
  18084. XMEMCPY(output + args->idx, hmac, args->digestSz);
  18085. #ifdef WOLFSSL_SMALL_STACK
  18086. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  18087. #endif
  18088. }
  18089. else
  18090. #endif
  18091. {
  18092. ret = ssl->hmac(ssl, output + args->idx, output +
  18093. args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
  18094. }
  18095. }
  18096. #endif /* WOLFSSL_AEAD_ONLY */
  18097. if (ret != 0)
  18098. goto exit_buildmsg;
  18099. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  18100. }
  18101. FALL_THROUGH;
  18102. case BUILD_MSG_ENCRYPT:
  18103. {
  18104. /* done with size calculations */
  18105. if (sizeOnly)
  18106. goto exit_buildmsg;
  18107. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  18108. /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
  18109. * for all encryption algos that use it for encryption parameters */
  18110. word16 dtls_epoch = 0;
  18111. word16 dtls_sequence_number_hi = 0;
  18112. word32 dtls_sequence_number_lo = 0;
  18113. int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
  18114. DtlsUseSCRKeys(ssl);
  18115. if (swap_seq) {
  18116. dtls_epoch = ssl->keys.dtls_epoch;
  18117. dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
  18118. dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
  18119. ssl->keys.dtls_epoch--;
  18120. ssl->keys.dtls_sequence_number_hi =
  18121. ssl->keys.dtls_prev_sequence_number_hi;
  18122. ssl->keys.dtls_sequence_number_lo =
  18123. ssl->keys.dtls_prev_sequence_number_lo;
  18124. }
  18125. #endif
  18126. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18127. if (ssl->options.startedETMWrite) {
  18128. ret = Encrypt(ssl, output + args->headerSz,
  18129. output + args->headerSz,
  18130. (word16)(args->size - args->digestSz),
  18131. asyncOkay);
  18132. }
  18133. else
  18134. #endif
  18135. {
  18136. ret = Encrypt(ssl, output + args->headerSz,
  18137. output + args->headerSz, args->size, asyncOkay);
  18138. }
  18139. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  18140. /* Restore sequence numbers */
  18141. if (swap_seq) {
  18142. ssl->keys.dtls_epoch = dtls_epoch;
  18143. ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
  18144. ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
  18145. }
  18146. #endif
  18147. if (ret != 0)
  18148. goto exit_buildmsg;
  18149. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  18150. }
  18151. FALL_THROUGH;
  18152. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  18153. {
  18154. /* done with size calculations */
  18155. if (sizeOnly)
  18156. goto exit_buildmsg;
  18157. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  18158. if (ssl->options.startedETMWrite) {
  18159. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  18160. #ifdef HAVE_TRUNCATED_HMAC
  18161. if (ssl->truncated_hmac &&
  18162. ssl->specs.hash_size > args->digestSz) {
  18163. #ifdef WOLFSSL_SMALL_STACK
  18164. byte* hmac = NULL;
  18165. #else
  18166. byte hmac[WC_MAX_DIGEST_SIZE];
  18167. #endif
  18168. #ifdef WOLFSSL_SMALL_STACK
  18169. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  18170. DYNAMIC_TYPE_DIGEST);
  18171. if (hmac == NULL)
  18172. ERROR_OUT(MEMORY_E, exit_buildmsg);
  18173. #endif
  18174. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  18175. args->ivSz + inSz + args->pad + 1, -1, type,
  18176. 0, epochOrder);
  18177. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  18178. args->digestSz);
  18179. #ifdef WOLFSSL_SMALL_STACK
  18180. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  18181. #endif
  18182. }
  18183. else
  18184. #endif
  18185. {
  18186. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  18187. output + args->headerSz,
  18188. args->ivSz + inSz + args->pad + 1, -1, type,
  18189. 0, epochOrder);
  18190. }
  18191. }
  18192. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  18193. }
  18194. FALL_THROUGH;
  18195. default:
  18196. break;
  18197. }
  18198. exit_buildmsg:
  18199. WOLFSSL_LEAVE("BuildMessage", ret);
  18200. #ifdef WOLFSSL_ASYNC_CRYPT
  18201. if (ret == WC_PENDING_E) {
  18202. return ret;
  18203. }
  18204. #endif
  18205. /* make sure build message state is reset */
  18206. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  18207. #ifdef WOLFSSL_DTLS
  18208. if (ret == 0 && ssl->options.dtls && !sizeOnly)
  18209. DtlsSEQIncrement(ssl, epochOrder);
  18210. #endif
  18211. /* return sz on success */
  18212. if (ret == 0) {
  18213. ret = args->sz;
  18214. }
  18215. else {
  18216. WOLFSSL_ERROR_VERBOSE(ret);
  18217. }
  18218. /* Final cleanup */
  18219. FreeBuildMsgArgs(ssl, args);
  18220. return ret;
  18221. #endif /* !WOLFSSL_NO_TLS12 */
  18222. #else
  18223. (void)outSz;
  18224. (void)inSz;
  18225. (void)type;
  18226. (void)hashOutput;
  18227. (void)asyncOkay;
  18228. return NOT_COMPILED_IN;
  18229. #endif /* NO_TLS */
  18230. }
  18231. #ifndef WOLFSSL_NO_TLS12
  18232. int SendFinished(WOLFSSL* ssl)
  18233. {
  18234. int sendSz,
  18235. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  18236. FINISHED_SZ;
  18237. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  18238. byte *output;
  18239. Hashes* hashes;
  18240. int ret;
  18241. int headerSz = HANDSHAKE_HEADER_SZ;
  18242. int outputSz;
  18243. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  18244. WOLFSSL_ENTER("SendFinished");
  18245. /* check for available size */
  18246. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  18247. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  18248. * is not advanced yet */
  18249. ssl->options.buildingMsg = 1;
  18250. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  18251. return ret;
  18252. #ifdef WOLFSSL_DTLS
  18253. if (ssl->options.dtls) {
  18254. headerSz += DTLS_HANDSHAKE_EXTRA;
  18255. ssl->keys.dtls_epoch++;
  18256. ssl->keys.dtls_prev_sequence_number_hi =
  18257. ssl->keys.dtls_sequence_number_hi;
  18258. ssl->keys.dtls_prev_sequence_number_lo =
  18259. ssl->keys.dtls_sequence_number_lo;
  18260. ssl->keys.dtls_sequence_number_hi = 0;
  18261. ssl->keys.dtls_sequence_number_lo = 0;
  18262. }
  18263. #endif
  18264. /* get output buffer */
  18265. output = ssl->buffers.outputBuffer.buffer +
  18266. ssl->buffers.outputBuffer.length;
  18267. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  18268. /* make finished hashes */
  18269. hashes = (Hashes*)&input[headerSz];
  18270. ret = BuildFinished(ssl, hashes, ssl->options.side == WOLFSSL_CLIENT_END ?
  18271. kTlsClientStr : kTlsServerStr);
  18272. if (ret != 0) return ret;
  18273. #ifdef HAVE_SECURE_RENEGOTIATION
  18274. if (ssl->secure_renegotiation) {
  18275. if (ssl->options.side == WOLFSSL_CLIENT_END)
  18276. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  18277. TLS_FINISHED_SZ);
  18278. else
  18279. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  18280. TLS_FINISHED_SZ);
  18281. }
  18282. #endif
  18283. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  18284. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  18285. XMEMCPY(ssl->clientFinished,
  18286. hashes, TLS_FINISHED_SZ);
  18287. ssl->clientFinished_len = TLS_FINISHED_SZ;
  18288. }
  18289. else {
  18290. XMEMCPY(ssl->serverFinished,
  18291. hashes, TLS_FINISHED_SZ);
  18292. ssl->serverFinished_len = TLS_FINISHED_SZ;
  18293. }
  18294. #endif
  18295. #ifdef WOLFSSL_DTLS
  18296. if (IsDtlsNotSctpMode(ssl)) {
  18297. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz,
  18298. finished)) != 0) {
  18299. return ret;
  18300. }
  18301. }
  18302. #endif
  18303. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  18304. handshake, 1, 0, 0, CUR_ORDER);
  18305. if (sendSz < 0)
  18306. return BUILD_MSG_ERROR;
  18307. if (!ssl->options.resuming) {
  18308. #ifndef NO_SESSION_CACHE
  18309. AddSession(ssl); /* just try */
  18310. #endif
  18311. if (ssl->options.side == WOLFSSL_SERVER_END) {
  18312. #ifdef OPENSSL_EXTRA
  18313. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  18314. ssl->cbmode = SSL_CB_MODE_WRITE;
  18315. if (ssl->CBIS != NULL)
  18316. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  18317. #endif
  18318. ssl->options.handShakeState = HANDSHAKE_DONE;
  18319. ssl->options.handShakeDone = 1;
  18320. }
  18321. }
  18322. else {
  18323. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  18324. #ifdef OPENSSL_EXTRA
  18325. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  18326. ssl->cbmode = SSL_CB_MODE_WRITE;
  18327. if (ssl->CBIS != NULL)
  18328. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  18329. #endif
  18330. ssl->options.handShakeState = HANDSHAKE_DONE;
  18331. ssl->options.handShakeDone = 1;
  18332. }
  18333. }
  18334. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18335. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  18336. if (ssl->toInfoOn)
  18337. AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  18338. WRITE_PROTO, ssl->heap);
  18339. #endif
  18340. ssl->buffers.outputBuffer.length += sendSz;
  18341. ret = SendBuffered(ssl);
  18342. ssl->options.buildingMsg = 0;
  18343. #ifdef WOLFSSL_DTLS
  18344. if ((!ssl->options.resuming &&
  18345. ssl->options.side == WOLFSSL_SERVER_END) ||
  18346. (ssl->options.resuming &&
  18347. ssl->options.side == WOLFSSL_CLIENT_END)) {
  18348. ssl->keys.dtls_handshake_number = 0;
  18349. ssl->keys.dtls_expected_peer_handshake_number = 0;
  18350. }
  18351. #endif
  18352. WOLFSSL_LEAVE("SendFinished", ret);
  18353. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  18354. return ret;
  18355. }
  18356. #endif /* WOLFSSL_NO_TLS12 */
  18357. #ifndef NO_WOLFSSL_SERVER
  18358. #if (!defined(WOLFSSL_NO_TLS12) && \
  18359. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  18360. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  18361. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  18362. /* Parses and decodes the certificate then initializes "request". In the case
  18363. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  18364. *
  18365. * Returns 0 on success
  18366. */
  18367. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  18368. DecodedCert* cert, byte* certData, word32 length)
  18369. {
  18370. int ret;
  18371. if (request != NULL)
  18372. XMEMSET(request, 0, sizeof(OcspRequest));
  18373. InitDecodedCert(cert, certData, length, ssl->heap);
  18374. /* TODO: Setup async support here */
  18375. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl));
  18376. if (ret != 0) {
  18377. WOLFSSL_MSG("ParseCert failed");
  18378. }
  18379. if (ret == 0)
  18380. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  18381. if (ret == 0) {
  18382. /* make sure ctx OCSP request is updated */
  18383. if (!ssl->buffers.weOwnCert) {
  18384. wolfSSL_Mutex* ocspLock = &SSL_CM(ssl)->ocsp_stapling->ocspLock;
  18385. if (wc_LockMutex(ocspLock) == 0) {
  18386. if (ssl->ctx->certOcspRequest == NULL)
  18387. ssl->ctx->certOcspRequest = request;
  18388. wc_UnLockMutex(ocspLock);
  18389. }
  18390. }
  18391. }
  18392. FreeDecodedCert(cert);
  18393. return ret;
  18394. }
  18395. /* Creates OCSP response and places it in variable "response". Memory
  18396. * management for "buffer* response" is up to the caller.
  18397. *
  18398. * Also creates an OcspRequest in the case that ocspRequest is null or that
  18399. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  18400. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  18401. * be set to point to "ocspRequest" and it then should not be free'd since
  18402. * wolfSSL_CTX_free will take care of it.
  18403. *
  18404. * Returns 0 on success
  18405. */
  18406. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  18407. buffer* response)
  18408. {
  18409. int ret = 0;
  18410. OcspRequest* request = NULL;
  18411. byte createdRequest = 0;
  18412. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  18413. return BAD_FUNC_ARG;
  18414. XMEMSET(response, 0, sizeof(*response));
  18415. request = *ocspRequest;
  18416. /* unable to fetch status. skip. */
  18417. if (SSL_CM(ssl) == NULL || SSL_CM(ssl)->ocspStaplingEnabled == 0)
  18418. return 0;
  18419. if (request == NULL || ssl->buffers.weOwnCert) {
  18420. DerBuffer* der = ssl->buffers.certificate;
  18421. #ifdef WOLFSSL_SMALL_STACK
  18422. DecodedCert* cert = NULL;
  18423. #else
  18424. DecodedCert cert[1];
  18425. #endif
  18426. /* unable to fetch status. skip. */
  18427. if (der->buffer == NULL || der->length == 0)
  18428. return 0;
  18429. #ifdef WOLFSSL_SMALL_STACK
  18430. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  18431. DYNAMIC_TYPE_DCERT);
  18432. if (cert == NULL)
  18433. return MEMORY_E;
  18434. #endif
  18435. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  18436. DYNAMIC_TYPE_OCSP_REQUEST);
  18437. if (request == NULL)
  18438. ret = MEMORY_E;
  18439. createdRequest = 1;
  18440. if (ret == 0) {
  18441. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  18442. der->length);
  18443. }
  18444. if (ret != 0) {
  18445. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  18446. request = NULL;
  18447. }
  18448. #ifdef WOLFSSL_SMALL_STACK
  18449. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  18450. #endif
  18451. }
  18452. if (ret == 0) {
  18453. request->ssl = ssl;
  18454. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, request, response);
  18455. /* Suppressing, not critical */
  18456. if (ret == OCSP_CERT_REVOKED ||
  18457. ret == OCSP_CERT_UNKNOWN ||
  18458. ret == OCSP_LOOKUP_FAIL) {
  18459. ret = 0;
  18460. }
  18461. }
  18462. /* free request up if error case found otherwise return it */
  18463. if (ret != 0 && createdRequest) {
  18464. FreeOcspRequest(request);
  18465. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  18466. }
  18467. if (ret == 0)
  18468. *ocspRequest = request;
  18469. return ret;
  18470. }
  18471. #endif
  18472. #endif /* !NO_WOLFSSL_SERVER */
  18473. int cipherExtraData(WOLFSSL* ssl)
  18474. {
  18475. int cipherExtra;
  18476. /* Cipher data that may be added by BuildMessage */
  18477. /* There is always an IV (expect for chacha). For AEAD ciphers,
  18478. * there is the authentication tag (aead_mac_size). For block
  18479. * ciphers we have the hash_size MAC on the message, and one
  18480. * block size for possible padding. */
  18481. if (ssl->specs.cipher_type == aead) {
  18482. cipherExtra = ssl->specs.aead_mac_size;
  18483. /* CHACHA does not have an explicit IV. */
  18484. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) {
  18485. cipherExtra += AESGCM_EXP_IV_SZ;
  18486. }
  18487. }
  18488. else {
  18489. cipherExtra = ssl->specs.iv_size + ssl->specs.block_size +
  18490. ssl->specs.hash_size;
  18491. }
  18492. /* Sanity check so we don't ever return negative. */
  18493. return cipherExtra > 0 ? cipherExtra : 0;
  18494. }
  18495. #ifndef WOLFSSL_NO_TLS12
  18496. #ifndef NO_CERTS
  18497. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  18498. /* handle generation of certificate (11) */
  18499. int SendCertificate(WOLFSSL* ssl)
  18500. {
  18501. int ret = 0;
  18502. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  18503. word32 length, maxFragment;
  18504. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  18505. WOLFSSL_ENTER("SendCertificate");
  18506. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher) {
  18507. WOLFSSL_MSG("Not sending certificate msg. Using PSK or ANON cipher.");
  18508. return 0; /* not needed */
  18509. }
  18510. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  18511. #ifdef OPENSSL_EXTRA
  18512. if (ssl->version.major == SSLv3_MAJOR
  18513. && ssl->version.minor == SSLv3_MINOR){
  18514. SendAlert(ssl, alert_warning, no_certificate);
  18515. return 0;
  18516. } else {
  18517. #endif
  18518. certSz = 0;
  18519. certChainSz = 0;
  18520. headerSz = CERT_HEADER_SZ;
  18521. length = CERT_HEADER_SZ;
  18522. listSz = 0;
  18523. #ifdef OPENSSL_EXTRA
  18524. }
  18525. #endif
  18526. }
  18527. else {
  18528. if (!ssl->buffers.certificate) {
  18529. WOLFSSL_MSG("Send Cert missing certificate buffer");
  18530. return BUFFER_ERROR;
  18531. }
  18532. certSz = ssl->buffers.certificate->length;
  18533. headerSz = 2 * CERT_HEADER_SZ;
  18534. /* list + cert size */
  18535. length = certSz + headerSz;
  18536. listSz = certSz + CERT_HEADER_SZ;
  18537. /* may need to send rest of chain, already has leading size(s) */
  18538. if (certSz && ssl->buffers.certChain) {
  18539. certChainSz = ssl->buffers.certChain->length;
  18540. length += certChainSz;
  18541. listSz += certChainSz;
  18542. }
  18543. else
  18544. certChainSz = 0;
  18545. }
  18546. payloadSz = length;
  18547. if (ssl->fragOffset != 0)
  18548. length -= (ssl->fragOffset + headerSz);
  18549. maxFragment = MAX_RECORD_SIZE;
  18550. maxFragment = wolfSSL_GetMaxFragSize(ssl, maxFragment);
  18551. while (length > 0 && ret == 0) {
  18552. byte* output = NULL;
  18553. word32 fragSz = 0;
  18554. word32 i = RECORD_HEADER_SZ;
  18555. int sendSz = RECORD_HEADER_SZ;
  18556. ssl->options.buildingMsg = 1;
  18557. if (!ssl->options.dtls) {
  18558. if (ssl->fragOffset == 0) {
  18559. if (headerSz + certSz + certChainSz <=
  18560. maxFragment - HANDSHAKE_HEADER_SZ) {
  18561. fragSz = headerSz + certSz + certChainSz;
  18562. }
  18563. else {
  18564. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  18565. }
  18566. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  18567. i += HANDSHAKE_HEADER_SZ;
  18568. }
  18569. else {
  18570. fragSz = min(length, maxFragment);
  18571. sendSz += fragSz;
  18572. }
  18573. if (IsEncryptionOn(ssl, 1))
  18574. sendSz += MAX_MSG_EXTRA;
  18575. }
  18576. else {
  18577. #ifdef WOLFSSL_DTLS
  18578. fragSz = min(length, maxFragment);
  18579. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  18580. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  18581. #endif
  18582. }
  18583. if (IsEncryptionOn(ssl, 1))
  18584. sendSz += cipherExtraData(ssl);
  18585. /* check for available size */
  18586. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  18587. return ret;
  18588. /* get output buffer */
  18589. output = ssl->buffers.outputBuffer.buffer +
  18590. ssl->buffers.outputBuffer.length;
  18591. /* Safe to use ssl->fragOffset since it will be incremented immediately
  18592. * after this block. This block needs to be entered only once to not
  18593. * hash the cert msg twice. */
  18594. if (ssl->fragOffset == 0) {
  18595. if (!ssl->options.dtls) {
  18596. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  18597. if (!IsEncryptionOn(ssl, 1))
  18598. HashRaw(ssl, output + RECORD_HEADER_SZ,
  18599. HANDSHAKE_HEADER_SZ);
  18600. }
  18601. else {
  18602. #ifdef WOLFSSL_DTLS
  18603. AddHeaders(output, payloadSz, certificate, ssl);
  18604. HashRaw(ssl,
  18605. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  18606. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  18607. /* Adding the headers increments these, decrement them for
  18608. * actual message header. */
  18609. ssl->keys.dtls_handshake_number--;
  18610. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  18611. ssl->keys.dtls_handshake_number--;
  18612. #endif /* WOLFSSL_DTLS */
  18613. }
  18614. /* list total */
  18615. c32to24(listSz, output + i);
  18616. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  18617. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  18618. i += CERT_HEADER_SZ;
  18619. length -= CERT_HEADER_SZ;
  18620. fragSz -= CERT_HEADER_SZ;
  18621. if (certSz) {
  18622. c32to24(certSz, output + i);
  18623. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  18624. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  18625. i += CERT_HEADER_SZ;
  18626. length -= CERT_HEADER_SZ;
  18627. fragSz -= CERT_HEADER_SZ;
  18628. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
  18629. HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  18630. if (certChainSz)
  18631. HashRaw(ssl, ssl->buffers.certChain->buffer,
  18632. certChainSz);
  18633. }
  18634. }
  18635. }
  18636. else {
  18637. if (!ssl->options.dtls) {
  18638. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  18639. }
  18640. else {
  18641. #ifdef WOLFSSL_DTLS
  18642. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  18643. payloadSz, certificate, ssl);
  18644. ssl->keys.dtls_handshake_number--;
  18645. #endif /* WOLFSSL_DTLS */
  18646. }
  18647. }
  18648. /* member */
  18649. if (certSz && ssl->fragOffset < certSz) {
  18650. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  18651. XMEMCPY(output + i,
  18652. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  18653. i += copySz;
  18654. ssl->fragOffset += copySz;
  18655. length -= copySz;
  18656. fragSz -= copySz;
  18657. }
  18658. if (certChainSz && fragSz) {
  18659. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  18660. XMEMCPY(output + i,
  18661. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  18662. copySz);
  18663. i += copySz;
  18664. ssl->fragOffset += copySz;
  18665. length -= copySz;
  18666. }
  18667. if (IsEncryptionOn(ssl, 1)) {
  18668. byte* input = NULL;
  18669. int inputSz = i; /* build msg adds rec hdr */
  18670. int recordHeaderSz = RECORD_HEADER_SZ;
  18671. if (ssl->options.dtls)
  18672. recordHeaderSz += DTLS_RECORD_EXTRA;
  18673. inputSz -= recordHeaderSz;
  18674. if (inputSz < 0) {
  18675. WOLFSSL_MSG("Send Cert bad inputSz");
  18676. return BUFFER_E;
  18677. }
  18678. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  18679. input = (byte*)XMALLOC(inputSz, ssl->heap,
  18680. DYNAMIC_TYPE_IN_BUFFER);
  18681. if (input == NULL)
  18682. return MEMORY_E;
  18683. XMEMCPY(input, output + recordHeaderSz, inputSz);
  18684. }
  18685. #ifndef WOLFSSL_DTLS
  18686. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  18687. handshake, 1, 0, 0, CUR_ORDER);
  18688. #else
  18689. if (!ssl->options.dtls)
  18690. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  18691. handshake, 1, 0, 0, CUR_ORDER);
  18692. else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
  18693. * calculate the hash ourselves above */ {
  18694. if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
  18695. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18696. return ret;
  18697. }
  18698. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  18699. handshake, 0, 0, 0, CUR_ORDER);
  18700. }
  18701. #endif
  18702. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18703. if (sendSz < 0)
  18704. return sendSz;
  18705. }
  18706. else {
  18707. sendSz = i;
  18708. #ifdef WOLFSSL_DTLS
  18709. if (IsDtlsNotSctpMode(ssl)) {
  18710. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
  18711. return ret;
  18712. }
  18713. if (ssl->options.dtls)
  18714. DtlsSEQIncrement(ssl, CUR_ORDER);
  18715. #endif
  18716. }
  18717. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18718. if (ssl->hsInfoOn)
  18719. AddPacketName(ssl, "Certificate");
  18720. if (ssl->toInfoOn)
  18721. AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  18722. WRITE_PROTO, ssl->heap);
  18723. #endif
  18724. ssl->buffers.outputBuffer.length += sendSz;
  18725. if (!ssl->options.groupMessages)
  18726. ret = SendBuffered(ssl);
  18727. }
  18728. if (ret != WANT_WRITE) {
  18729. /* Clean up the fragment offset. */
  18730. ssl->options.buildingMsg = 0;
  18731. ssl->fragOffset = 0;
  18732. #ifdef WOLFSSL_DTLS
  18733. if (ssl->options.dtls)
  18734. ssl->keys.dtls_handshake_number++;
  18735. #endif
  18736. if (ssl->options.side == WOLFSSL_SERVER_END){
  18737. ssl->options.serverState = SERVER_CERT_COMPLETE;
  18738. }
  18739. }
  18740. WOLFSSL_LEAVE("SendCertificate", ret);
  18741. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  18742. return ret;
  18743. }
  18744. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  18745. /* handle generation of certificate_request (13) */
  18746. int SendCertificateRequest(WOLFSSL* ssl)
  18747. {
  18748. byte *output;
  18749. int ret;
  18750. int sendSz;
  18751. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  18752. word32 dnLen = 0;
  18753. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  18754. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  18755. #endif
  18756. int typeTotal = 1; /* only 1 for now */
  18757. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  18758. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  18759. WOLFSSL_ENTER("SendCertificateRequest");
  18760. if (IsAtLeastTLSv1_2(ssl))
  18761. reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz;
  18762. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  18763. /* Certificate Authorities */
  18764. names = SSL_CA_NAMES(ssl);
  18765. while (names != NULL) {
  18766. byte seq[MAX_SEQ_SZ];
  18767. WOLFSSL_X509_NAME* name = names->data.name;
  18768. if (name != NULL) {
  18769. /* 16-bit length | SEQ | Len | DER of name */
  18770. dnLen += OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
  18771. name->rawLen;
  18772. }
  18773. names = names->next;
  18774. }
  18775. reqSz += dnLen;
  18776. #endif
  18777. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  18778. return 0; /* not needed */
  18779. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  18780. if (!ssl->options.dtls) {
  18781. if (IsEncryptionOn(ssl, 1))
  18782. sendSz += MAX_MSG_EXTRA;
  18783. }
  18784. else {
  18785. #ifdef WOLFSSL_DTLS
  18786. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  18787. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  18788. #endif
  18789. }
  18790. if (IsEncryptionOn(ssl, 1))
  18791. sendSz += cipherExtraData(ssl);
  18792. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  18793. * is not advanced yet */
  18794. ssl->options.buildingMsg = 1;
  18795. /* check for available size */
  18796. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  18797. return ret;
  18798. /* get output buffer */
  18799. output = ssl->buffers.outputBuffer.buffer +
  18800. ssl->buffers.outputBuffer.length;
  18801. AddHeaders(output, reqSz, certificate_request, ssl);
  18802. /* write to output */
  18803. output[i++] = (byte)typeTotal; /* # of types */
  18804. #ifdef HAVE_ECC
  18805. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  18806. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  18807. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  18808. output[i++] = ecdsa_sign;
  18809. } else
  18810. #endif /* HAVE_ECC */
  18811. {
  18812. output[i++] = rsa_sign;
  18813. }
  18814. /* supported hash/sig */
  18815. if (IsAtLeastTLSv1_2(ssl)) {
  18816. c16toa(ssl->suites->hashSigAlgoSz, &output[i]);
  18817. i += OPAQUE16_LEN;
  18818. XMEMCPY(&output[i],
  18819. ssl->suites->hashSigAlgo, ssl->suites->hashSigAlgoSz);
  18820. i += ssl->suites->hashSigAlgoSz;
  18821. }
  18822. /* Certificate Authorities */
  18823. c16toa((word16)dnLen, &output[i]); /* auth's */
  18824. i += REQ_HEADER_SZ;
  18825. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  18826. names = SSL_CA_NAMES(ssl);
  18827. while (names != NULL) {
  18828. byte seq[MAX_SEQ_SZ];
  18829. WOLFSSL_X509_NAME* name = names->data.name;
  18830. if (name != NULL) {
  18831. c16toa((word16)name->rawLen +
  18832. (word16)SetSequence(name->rawLen, seq), &output[i]);
  18833. i += OPAQUE16_LEN;
  18834. i += SetSequence(name->rawLen, output + i);
  18835. XMEMCPY(output + i, name->raw, name->rawLen);
  18836. i += name->rawLen;
  18837. }
  18838. names = names->next;
  18839. }
  18840. #endif
  18841. (void)i;
  18842. if (IsEncryptionOn(ssl, 1)) {
  18843. byte* input = NULL;
  18844. int inputSz = i; /* build msg adds rec hdr */
  18845. int recordHeaderSz = RECORD_HEADER_SZ;
  18846. if (ssl->options.dtls)
  18847. recordHeaderSz += DTLS_RECORD_EXTRA;
  18848. inputSz -= recordHeaderSz;
  18849. if (inputSz <= 0) {
  18850. WOLFSSL_MSG("Send Cert Req bad inputSz");
  18851. return BUFFER_E;
  18852. }
  18853. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18854. if (input == NULL)
  18855. return MEMORY_E;
  18856. XMEMCPY(input, output + recordHeaderSz, inputSz);
  18857. #ifdef WOLFSSL_DTLS
  18858. if (IsDtlsNotSctpMode(ssl) &&
  18859. (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
  18860. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18861. return ret;
  18862. }
  18863. #endif
  18864. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  18865. handshake, 1, 0, 0, CUR_ORDER);
  18866. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18867. if (sendSz < 0)
  18868. return sendSz;
  18869. } else {
  18870. sendSz = i;
  18871. #ifdef WOLFSSL_DTLS
  18872. if (IsDtlsNotSctpMode(ssl)) {
  18873. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
  18874. return ret;
  18875. }
  18876. if (ssl->options.dtls)
  18877. DtlsSEQIncrement(ssl, CUR_ORDER);
  18878. #endif
  18879. ret = HashOutput(ssl, output, sendSz, 0);
  18880. if (ret != 0)
  18881. return ret;
  18882. }
  18883. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18884. if (ssl->hsInfoOn)
  18885. AddPacketName(ssl, "CertificateRequest");
  18886. if (ssl->toInfoOn)
  18887. AddPacketInfo(ssl, "CertificateRequest", handshake, output, sendSz,
  18888. WRITE_PROTO, ssl->heap);
  18889. #endif
  18890. ssl->buffers.outputBuffer.length += sendSz;
  18891. if (ssl->options.groupMessages)
  18892. ret = 0;
  18893. else
  18894. ret = SendBuffered(ssl);
  18895. ssl->options.buildingMsg = 0;
  18896. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  18897. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  18898. return ret;
  18899. }
  18900. #ifndef NO_WOLFSSL_SERVER
  18901. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  18902. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  18903. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  18904. byte count)
  18905. {
  18906. byte* output = NULL;
  18907. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  18908. word32 length = ENUM_LEN;
  18909. int sendSz = 0;
  18910. int ret = 0;
  18911. int i = 0;
  18912. WOLFSSL_ENTER("BuildCertificateStatus");
  18913. switch (type) {
  18914. case WOLFSSL_CSR2_OCSP_MULTI:
  18915. length += OPAQUE24_LEN;
  18916. FALL_THROUGH; /* followed by */
  18917. case WOLFSSL_CSR2_OCSP:
  18918. for (i = 0; i < count; i++)
  18919. length += OPAQUE24_LEN + status[i].length;
  18920. break;
  18921. default:
  18922. return 0;
  18923. }
  18924. sendSz = idx + length;
  18925. if (ssl->keys.encryptionOn)
  18926. sendSz += MAX_MSG_EXTRA;
  18927. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  18928. * is not advanced yet */
  18929. ssl->options.buildingMsg = 1;
  18930. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  18931. output = ssl->buffers.outputBuffer.buffer +
  18932. ssl->buffers.outputBuffer.length;
  18933. AddHeaders(output, length, certificate_status, ssl);
  18934. output[idx++] = type;
  18935. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  18936. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  18937. idx += OPAQUE24_LEN;
  18938. }
  18939. for (i = 0; i < count; i++) {
  18940. c32to24(status[i].length, output + idx);
  18941. idx += OPAQUE24_LEN;
  18942. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  18943. idx += status[i].length;
  18944. }
  18945. if (IsEncryptionOn(ssl, 1)) {
  18946. byte* input;
  18947. int inputSz = idx; /* build msg adds rec hdr */
  18948. int recordHeaderSz = RECORD_HEADER_SZ;
  18949. if (ssl->options.dtls)
  18950. recordHeaderSz += DTLS_RECORD_EXTRA;
  18951. inputSz -= recordHeaderSz;
  18952. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18953. if (input == NULL)
  18954. return MEMORY_E;
  18955. XMEMCPY(input, output + recordHeaderSz, inputSz);
  18956. #ifdef WOLFSSL_DTLS
  18957. ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
  18958. #endif
  18959. if (ret == 0)
  18960. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  18961. handshake, 1, 0, 0, CUR_ORDER);
  18962. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  18963. if (sendSz < 0)
  18964. ret = sendSz;
  18965. }
  18966. else {
  18967. #ifdef WOLFSSL_DTLS
  18968. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  18969. ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
  18970. if (ret == 0 && ssl->options.dtls)
  18971. DtlsSEQIncrement(ssl, CUR_ORDER);
  18972. #endif
  18973. ret = HashOutput(ssl, output, sendSz, 0);
  18974. }
  18975. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18976. if (ret == 0 && ssl->hsInfoOn)
  18977. AddPacketName(ssl, "CertificateStatus");
  18978. if (ret == 0 && ssl->toInfoOn)
  18979. AddPacketInfo(ssl, "CertificateStatus", handshake, output, sendSz,
  18980. WRITE_PROTO, ssl->heap);
  18981. #endif
  18982. if (ret == 0) {
  18983. ssl->options.buildingMsg = 0;
  18984. ssl->buffers.outputBuffer.length += sendSz;
  18985. if (!ssl->options.groupMessages)
  18986. ret = SendBuffered(ssl);
  18987. }
  18988. }
  18989. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  18990. return ret;
  18991. }
  18992. #endif
  18993. #endif /* NO_WOLFSSL_SERVER */
  18994. /* handle generation of certificate_status (22) */
  18995. int SendCertificateStatus(WOLFSSL* ssl)
  18996. {
  18997. int ret = 0;
  18998. byte status_type = 0;
  18999. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  19000. WOLFSSL_ENTER("SendCertificateStatus");
  19001. (void) ssl;
  19002. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  19003. status_type = ssl->status_request;
  19004. #endif
  19005. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  19006. status_type = status_type ? status_type : ssl->status_request_v2;
  19007. #endif
  19008. switch (status_type) {
  19009. #ifndef NO_WOLFSSL_SERVER
  19010. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  19011. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  19012. /* case WOLFSSL_CSR_OCSP: */
  19013. case WOLFSSL_CSR2_OCSP:
  19014. {
  19015. OcspRequest* request = ssl->ctx->certOcspRequest;
  19016. buffer response;
  19017. ret = CreateOcspResponse(ssl, &request, &response);
  19018. /* if a request was successfully created and not stored in
  19019. * ssl->ctx then free it */
  19020. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  19021. FreeOcspRequest(request);
  19022. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19023. request = NULL;
  19024. }
  19025. if (ret == 0 && response.buffer) {
  19026. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  19027. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19028. response.buffer = NULL;
  19029. }
  19030. break;
  19031. }
  19032. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  19033. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  19034. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  19035. case WOLFSSL_CSR2_OCSP_MULTI:
  19036. {
  19037. OcspRequest* request = ssl->ctx->certOcspRequest;
  19038. buffer responses[1 + MAX_CHAIN_DEPTH];
  19039. int i = 0;
  19040. XMEMSET(responses, 0, sizeof(responses));
  19041. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  19042. /* if a request was successfully created and not stored in
  19043. * ssl->ctx then free it */
  19044. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  19045. FreeOcspRequest(request);
  19046. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19047. request = NULL;
  19048. }
  19049. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  19050. || ssl->buffers.weOwnCertChain)) {
  19051. buffer der;
  19052. word32 idx = 0;
  19053. #ifdef WOLFSSL_SMALL_STACK
  19054. DecodedCert* cert;
  19055. #else
  19056. DecodedCert cert[1];
  19057. #endif
  19058. DerBuffer* chain;
  19059. #ifdef WOLFSSL_SMALL_STACK
  19060. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  19061. DYNAMIC_TYPE_DCERT);
  19062. if (cert == NULL)
  19063. return MEMORY_E;
  19064. #endif
  19065. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  19066. DYNAMIC_TYPE_OCSP_REQUEST);
  19067. if (request == NULL) {
  19068. #ifdef WOLFSSL_SMALL_STACK
  19069. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  19070. #endif
  19071. return MEMORY_E;
  19072. }
  19073. /* use certChain if available, otherwise use peer certificate */
  19074. chain = ssl->buffers.certChain;
  19075. if (chain == NULL) {
  19076. chain = ssl->buffers.certificate;
  19077. }
  19078. if (chain && chain->buffer) {
  19079. while (idx + OPAQUE24_LEN < chain->length) {
  19080. c24to32(chain->buffer + idx, &der.length);
  19081. idx += OPAQUE24_LEN;
  19082. der.buffer = chain->buffer + idx;
  19083. idx += der.length;
  19084. if (idx > chain->length)
  19085. break;
  19086. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  19087. der.length);
  19088. if (ret == 0) {
  19089. request->ssl = ssl;
  19090. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  19091. request, &responses[i + 1]);
  19092. /* Suppressing, not critical */
  19093. if (ret == OCSP_CERT_REVOKED ||
  19094. ret == OCSP_CERT_UNKNOWN ||
  19095. ret == OCSP_LOOKUP_FAIL) {
  19096. ret = 0;
  19097. }
  19098. i++;
  19099. FreeOcspRequest(request);
  19100. }
  19101. }
  19102. }
  19103. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  19104. #ifdef WOLFSSL_SMALL_STACK
  19105. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  19106. #endif
  19107. }
  19108. else {
  19109. while (ret == 0 &&
  19110. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  19111. request->ssl = ssl;
  19112. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  19113. request, &responses[++i]);
  19114. /* Suppressing, not critical */
  19115. if (ret == OCSP_CERT_REVOKED ||
  19116. ret == OCSP_CERT_UNKNOWN ||
  19117. ret == OCSP_LOOKUP_FAIL) {
  19118. ret = 0;
  19119. }
  19120. }
  19121. }
  19122. if (responses[0].buffer) {
  19123. if (ret == 0) {
  19124. ret = BuildCertificateStatus(ssl, status_type, responses,
  19125. (byte)i + 1);
  19126. }
  19127. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  19128. if (responses[i].buffer) {
  19129. XFREE(responses[i].buffer, ssl->heap,
  19130. DYNAMIC_TYPE_OCSP_REQUEST);
  19131. }
  19132. }
  19133. }
  19134. break;
  19135. }
  19136. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  19137. #endif /* NO_WOLFSSL_SERVER */
  19138. default:
  19139. break;
  19140. }
  19141. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  19142. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  19143. return ret;
  19144. }
  19145. #endif /* !NO_CERTS */
  19146. #endif /* WOLFSSL_NO_TLS12 */
  19147. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  19148. /**
  19149. * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
  19150. */
  19151. int DtlsSCRKeysSet(WOLFSSL* ssl)
  19152. {
  19153. return ssl->secure_renegotiation &&
  19154. ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
  19155. }
  19156. /**
  19157. * ssl->keys contains the current cipher parameters only for epoch 1. For
  19158. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  19159. * cipher parameters. This function checks if the message currently being
  19160. * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  19161. */
  19162. int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
  19163. {
  19164. return DtlsSCRKeysSet(ssl) &&
  19165. ssl->keys.curEpoch ==
  19166. ssl->secure_renegotiation->tmp_keys.dtls_epoch;
  19167. }
  19168. /**
  19169. * ssl->keys contains the current cipher parameters only for epoch 1. For
  19170. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  19171. * cipher parameters. This function checks if the message currently being
  19172. * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  19173. */
  19174. int DtlsUseSCRKeys(WOLFSSL* ssl)
  19175. {
  19176. return DtlsSCRKeysSet(ssl) &&
  19177. ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
  19178. ssl->keys.dtls_epoch;
  19179. }
  19180. /**
  19181. * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
  19182. * then PREV_ORDER refers to the current epoch.
  19183. * */
  19184. int DtlsCheckOrder(WOLFSSL* ssl, int order)
  19185. {
  19186. if (order == PREV_ORDER && ssl->secure_renegotiation &&
  19187. ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
  19188. return CUR_ORDER;
  19189. }
  19190. else {
  19191. return order;
  19192. }
  19193. }
  19194. #endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
  19195. /* If secure renegotiation is disabled, this will always return false.
  19196. * Otherwise it checks to see if we are currently renegotiating. */
  19197. int IsSCR(WOLFSSL* ssl)
  19198. {
  19199. #ifndef HAVE_SECURE_RENEGOTIATION
  19200. (void)ssl;
  19201. #else /* HAVE_SECURE_RENEGOTIATION */
  19202. if (ssl->secure_renegotiation &&
  19203. ssl->secure_renegotiation->enabled && /* Is SCR enabled? */
  19204. ssl->options.handShakeDone && /* At least one handshake done? */
  19205. ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
  19206. return 1;
  19207. #endif /* HAVE_SECURE_RENEGOTIATION */
  19208. return 0;
  19209. }
  19210. #ifdef WOLFSSL_DTLS
  19211. static int ModifyForMTU(WOLFSSL* ssl, int buffSz, int outputSz, int mtuSz)
  19212. {
  19213. int recordExtra = outputSz - buffSz;
  19214. (void)ssl;
  19215. if (recordExtra > 0 && outputSz > mtuSz) {
  19216. buffSz = mtuSz - recordExtra;
  19217. #ifndef WOLFSSL_AEAD_ONLY
  19218. /* Subtract a block size to be certain that returned fragment
  19219. * size won't get more padding. */
  19220. if (ssl->specs.cipher_type == block)
  19221. buffSz -= ssl->specs.block_size;
  19222. #endif
  19223. }
  19224. return buffSz;
  19225. }
  19226. #endif /* WOLFSSL_DTLS */
  19227. int SendData(WOLFSSL* ssl, const void* data, int sz)
  19228. {
  19229. int sent = 0, /* plainText size */
  19230. sendSz,
  19231. ret;
  19232. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  19233. int groupMsgs = 0;
  19234. #endif
  19235. if (ssl->error == WANT_WRITE
  19236. #ifdef WOLFSSL_ASYNC_CRYPT
  19237. || ssl->error == WC_PENDING_E
  19238. #endif
  19239. ) {
  19240. ssl->error = 0;
  19241. }
  19242. /* don't allow write after decrypt or mac error */
  19243. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  19244. /* For DTLS allow these possible errors and allow the session
  19245. to continue despite them */
  19246. if (ssl->options.dtls) {
  19247. ssl->error = 0;
  19248. }
  19249. else {
  19250. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  19251. return WOLFSSL_FATAL_ERROR;
  19252. }
  19253. }
  19254. #ifdef WOLFSSL_EARLY_DATA
  19255. if (ssl->earlyData != no_early_data) {
  19256. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  19257. WOLFSSL_MSG("handshake complete, trying to send early data");
  19258. ssl->error = BUILD_MSG_ERROR;
  19259. return WOLFSSL_FATAL_ERROR;
  19260. }
  19261. #ifdef WOLFSSL_EARLY_DATA_GROUP
  19262. groupMsgs = 1;
  19263. #endif
  19264. }
  19265. else
  19266. #endif
  19267. if (ssl->options.handShakeState != HANDSHAKE_DONE && !IsSCR(ssl)) {
  19268. int err;
  19269. WOLFSSL_MSG("handshake not complete, trying to finish");
  19270. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  19271. #ifdef WOLFSSL_ASYNC_CRYPT
  19272. /* if async would block return WANT_WRITE */
  19273. if (ssl->error == WC_PENDING_E) {
  19274. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  19275. }
  19276. #endif
  19277. return err;
  19278. }
  19279. }
  19280. /* last time system socket output buffer was full, try again to send */
  19281. if (ssl->buffers.outputBuffer.length > 0
  19282. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  19283. && !groupMsgs
  19284. #endif
  19285. ) {
  19286. WOLFSSL_MSG("output buffer was full, trying to send again");
  19287. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  19288. WOLFSSL_ERROR(ssl->error);
  19289. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  19290. ssl->options.isClosed)) {
  19291. ssl->error = SOCKET_PEER_CLOSED_E;
  19292. WOLFSSL_ERROR(ssl->error);
  19293. return 0; /* peer reset or closed */
  19294. }
  19295. return ssl->error;
  19296. }
  19297. else {
  19298. /* advance sent to previous sent + plain size just sent */
  19299. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  19300. WOLFSSL_MSG("sent write buffered data");
  19301. if (sent > sz) {
  19302. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  19303. return ssl->error = BAD_FUNC_ARG;
  19304. }
  19305. }
  19306. }
  19307. ret = RetrySendAlert(ssl);
  19308. if (ret != 0) {
  19309. ssl->error = ret;
  19310. return WOLFSSL_FATAL_ERROR;
  19311. }
  19312. for (;;) {
  19313. byte* out;
  19314. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  19315. int buffSz; /* may switch on comp */
  19316. int outputSz;
  19317. #ifdef HAVE_LIBZ
  19318. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  19319. #endif
  19320. #ifdef WOLFSSL_DTLS13
  19321. if (ssl->options.dtls && ssl->options.tls1_3) {
  19322. byte isEarlyData = 0;
  19323. if (ssl->dtls13EncryptEpoch == NULL)
  19324. return ssl->error = BAD_STATE_E;
  19325. #ifdef WOLFSSL_EARLY_DATA
  19326. isEarlyData = ssl->earlyData != no_early_data;
  19327. #endif
  19328. if (isEarlyData) {
  19329. #ifdef WOLFSSL_EARLY_DATA
  19330. ret = Dtls13SetEpochKeys(ssl,
  19331. w64From32(0x0, DTLS13_EPOCH_EARLYDATA), ENCRYPT_SIDE_ONLY);
  19332. if (ret != 0) {
  19333. WOLFSSL_MSG(
  19334. "trying to send early data without epoch 1");
  19335. ssl->error = BUILD_MSG_ERROR;
  19336. return WOLFSSL_FATAL_ERROR;
  19337. }
  19338. #endif /* WOLFSSL_EARLY_DATA */
  19339. }
  19340. else if (!w64Equal(
  19341. ssl->dtls13EncryptEpoch->epochNumber,
  19342. ssl->dtls13Epoch)) {
  19343. ret = Dtls13SetEpochKeys(
  19344. ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
  19345. if (ret != 0) {
  19346. ssl->error = BUILD_MSG_ERROR;
  19347. return WOLFSSL_FATAL_ERROR;
  19348. }
  19349. }
  19350. }
  19351. #endif /* WOLFSSL_DTLS13 */
  19352. #ifdef WOLFSSL_DTLS
  19353. if (ssl->options.dtls) {
  19354. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  19355. }
  19356. else
  19357. #endif
  19358. {
  19359. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  19360. }
  19361. if (sent == sz) break;
  19362. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
  19363. if (ssl->options.dtls && (buffSz < sz - sent)) {
  19364. ssl->error = DTLS_SIZE_ERROR;
  19365. WOLFSSL_ERROR(ssl->error);
  19366. return ssl->error;
  19367. }
  19368. #endif
  19369. outputSz = buffSz + COMP_EXTRA + DTLS_RECORD_HEADER_SZ;
  19370. if (IsEncryptionOn(ssl, 1) || ssl->options.tls1_3)
  19371. outputSz += cipherExtraData(ssl);
  19372. /* check for available size */
  19373. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  19374. return ssl->error = ret;
  19375. /* get output buffer */
  19376. out = ssl->buffers.outputBuffer.buffer +
  19377. ssl->buffers.outputBuffer.length;
  19378. #ifdef HAVE_LIBZ
  19379. if (ssl->options.usingCompression) {
  19380. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  19381. if (buffSz < 0) {
  19382. return buffSz;
  19383. }
  19384. sendBuffer = comp;
  19385. }
  19386. #endif
  19387. if (!ssl->options.tls1_3) {
  19388. #ifdef WOLFSSL_ASYNC_CRYPT
  19389. if (ssl->async == NULL) {
  19390. ssl->async = (struct WOLFSSL_ASYNC*)
  19391. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  19392. DYNAMIC_TYPE_ASYNC);
  19393. if (ssl->async == NULL)
  19394. return MEMORY_E;
  19395. ssl->async->freeArgs = NULL;
  19396. }
  19397. #endif
  19398. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  19399. application_data, 0, 0, 1, CUR_ORDER);
  19400. }
  19401. else {
  19402. #ifdef WOLFSSL_TLS13
  19403. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  19404. application_data, 0, 0, 1);
  19405. #else
  19406. sendSz = BUFFER_ERROR;
  19407. #endif
  19408. }
  19409. if (sendSz < 0) {
  19410. #ifdef WOLFSSL_ASYNC_CRYPT
  19411. if (sendSz == WC_PENDING_E)
  19412. ssl->error = sendSz;
  19413. #endif
  19414. return BUILD_MSG_ERROR;
  19415. }
  19416. #ifdef WOLFSSL_ASYNC_CRYPT
  19417. FreeAsyncCtx(ssl, 0);
  19418. #endif
  19419. ssl->buffers.outputBuffer.length += sendSz;
  19420. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  19421. WOLFSSL_ERROR(ssl->error);
  19422. /* store for next call if WANT_WRITE or user embedSend() that
  19423. doesn't present like WANT_WRITE */
  19424. ssl->buffers.plainSz = buffSz;
  19425. ssl->buffers.prevSent = sent;
  19426. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  19427. ssl->options.isClosed)) {
  19428. ssl->error = SOCKET_PEER_CLOSED_E;
  19429. WOLFSSL_ERROR(ssl->error);
  19430. return 0; /* peer reset or closed */
  19431. }
  19432. return ssl->error;
  19433. }
  19434. sent += buffSz;
  19435. /* only one message per attempt */
  19436. if (ssl->options.partialWrite == 1) {
  19437. WOLFSSL_MSG("Partial Write on, only sending one record");
  19438. break;
  19439. }
  19440. }
  19441. return sent;
  19442. }
  19443. /* process input data */
  19444. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  19445. {
  19446. int size;
  19447. WOLFSSL_ENTER("ReceiveData()");
  19448. /* reset error state */
  19449. if (ssl->error == WANT_READ || ssl->error == WOLFSSL_ERROR_WANT_READ) {
  19450. ssl->error = 0;
  19451. }
  19452. #ifdef WOLFSSL_DTLS
  19453. if (ssl->options.dtls) {
  19454. /* In DTLS mode, we forgive some errors and allow the session
  19455. * to continue despite them. */
  19456. if (ssl->error == VERIFY_MAC_ERROR ||
  19457. ssl->error == DECRYPT_ERROR ||
  19458. ssl->error == DTLS_SIZE_ERROR) {
  19459. ssl->error = 0;
  19460. }
  19461. }
  19462. #endif /* WOLFSSL_DTLS */
  19463. if (ssl->error != 0 && ssl->error != WANT_WRITE
  19464. #ifdef WOLFSSL_ASYNC_CRYPT
  19465. && ssl->error != WC_PENDING_E
  19466. #endif
  19467. #ifdef HAVE_SECURE_RENEGOTIATION
  19468. && ssl->error != APP_DATA_READY
  19469. #endif
  19470. ) {
  19471. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  19472. return ssl->error;
  19473. }
  19474. #ifdef WOLFSSL_EARLY_DATA
  19475. if (ssl->earlyData != no_early_data) {
  19476. }
  19477. else
  19478. #endif
  19479. {
  19480. int negotiate = 0;
  19481. #ifdef HAVE_SECURE_RENEGOTIATION
  19482. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  19483. if (ssl->options.handShakeState != HANDSHAKE_DONE
  19484. && ssl->buffers.clearOutputBuffer.length == 0)
  19485. negotiate = 1;
  19486. }
  19487. else
  19488. #endif
  19489. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  19490. negotiate = 1;
  19491. if (negotiate) {
  19492. int err;
  19493. WOLFSSL_MSG("Handshake not complete, trying to finish");
  19494. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  19495. #ifdef WOLFSSL_ASYNC_CRYPT
  19496. /* if async would block return WANT_WRITE */
  19497. if (ssl->error == WC_PENDING_E) {
  19498. return WOLFSSL_CBIO_ERR_WANT_READ;
  19499. }
  19500. #endif
  19501. return err;
  19502. }
  19503. }
  19504. }
  19505. #ifdef HAVE_SECURE_RENEGOTIATION
  19506. startScr:
  19507. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  19508. int ret;
  19509. WOLFSSL_MSG("Need to start scr, server requested");
  19510. ret = wolfSSL_Rehandshake(ssl);
  19511. ssl->secure_renegotiation->startScr = 0; /* only start once */
  19512. if (ret != WOLFSSL_SUCCESS)
  19513. return ret;
  19514. }
  19515. #endif
  19516. while (ssl->buffers.clearOutputBuffer.length == 0) {
  19517. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  19518. if (ssl->error == ZERO_RETURN) {
  19519. WOLFSSL_MSG("Zero return, no more data coming");
  19520. return 0; /* no more data coming */
  19521. }
  19522. if (ssl->error == SOCKET_ERROR_E) {
  19523. if (ssl->options.connReset || ssl->options.isClosed) {
  19524. WOLFSSL_MSG("Peer reset or closed, connection done");
  19525. ssl->error = SOCKET_PEER_CLOSED_E;
  19526. WOLFSSL_ERROR(ssl->error);
  19527. return 0; /* peer reset or closed */
  19528. }
  19529. }
  19530. WOLFSSL_ERROR(ssl->error);
  19531. return ssl->error;
  19532. }
  19533. #ifdef WOLFSSL_DTLS13
  19534. if (ssl->options.dtls) {
  19535. /* Dtls13DoScheduledWork(ssl) may return WANT_WRITE */
  19536. if ((ssl->error = Dtls13DoScheduledWork(ssl)) < 0) {
  19537. WOLFSSL_ERROR(ssl->error);
  19538. return ssl->error;
  19539. }
  19540. }
  19541. #endif /* WOLFSSL_DTLS13 */
  19542. #ifdef HAVE_SECURE_RENEGOTIATION
  19543. if (ssl->secure_renegotiation &&
  19544. ssl->secure_renegotiation->startScr) {
  19545. goto startScr;
  19546. }
  19547. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  19548. ssl->options.handShakeState != HANDSHAKE_DONE
  19549. && ssl->buffers.clearOutputBuffer.length == 0) {
  19550. /* ProcessReply processed a handshake packet and not any APP DATA
  19551. * so let's move the handshake along */
  19552. int err;
  19553. WOLFSSL_MSG("Handshake not complete, trying to finish");
  19554. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  19555. #ifdef WOLFSSL_ASYNC_CRYPT
  19556. /* if async would block return WANT_WRITE */
  19557. if (ssl->error == WC_PENDING_E) {
  19558. return WOLFSSL_CBIO_ERR_WANT_READ;
  19559. }
  19560. #endif
  19561. return err;
  19562. }
  19563. }
  19564. #endif
  19565. #ifdef WOLFSSL_DTLS13
  19566. /* if wolfSSL_Peek() is invoked with sz == 0 it will not block (but
  19567. * it processes pending non-application records) */
  19568. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version) && peek &&
  19569. sz == 0 && ssl->buffers.inputBuffer.idx
  19570. - ssl->buffers.inputBuffer.length == 0) {
  19571. return 0;
  19572. }
  19573. #endif /* WOLFSSL_DTLS13 */
  19574. #ifndef WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
  19575. #ifdef WOLFSSL_TLS13
  19576. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
  19577. ssl->curRL.type == handshake && peek) {
  19578. WOLFSSL_MSG("Got Handshake Messge in APP data");
  19579. if (ssl->buffers.inputBuffer.length == 0) {
  19580. ssl->error = WOLFSSL_ERROR_WANT_READ;
  19581. return 0;
  19582. }
  19583. }
  19584. #endif
  19585. #endif
  19586. }
  19587. size = min(sz, (int)ssl->buffers.clearOutputBuffer.length);
  19588. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  19589. if (peek == 0) {
  19590. ssl->buffers.clearOutputBuffer.length -= size;
  19591. ssl->buffers.clearOutputBuffer.buffer += size;
  19592. }
  19593. if (ssl->buffers.inputBuffer.dynamicFlag)
  19594. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  19595. WOLFSSL_LEAVE("ReceiveData()", size);
  19596. return size;
  19597. }
  19598. static int SendAlert_ex(WOLFSSL* ssl, int severity, int type)
  19599. {
  19600. byte input[ALERT_SIZE];
  19601. byte *output;
  19602. int sendSz;
  19603. int ret;
  19604. int outputSz;
  19605. int dtlsExtra = 0;
  19606. WOLFSSL_ENTER("SendAlert");
  19607. #ifdef WOLFSSL_QUIC
  19608. if (WOLFSSL_IS_QUIC(ssl)) {
  19609. ret = !ssl->quic.method->send_alert(ssl, ssl->quic.enc_level_write, (uint8_t)type);
  19610. if (ret) {
  19611. WOLFSSL_MSG("QUIC send_alert callback error");
  19612. }
  19613. return ret;
  19614. }
  19615. #endif
  19616. #ifdef HAVE_WRITE_DUP
  19617. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  19618. int notifyErr = 0;
  19619. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  19620. if (type == close_notify) {
  19621. notifyErr = ZERO_RETURN;
  19622. } else if (severity == alert_fatal) {
  19623. notifyErr = FATAL_ERROR;
  19624. }
  19625. if (notifyErr != 0) {
  19626. return NotifyWriteSide(ssl, notifyErr);
  19627. }
  19628. return 0;
  19629. }
  19630. #endif
  19631. ssl->pendingAlert.code = type;
  19632. ssl->pendingAlert.level = severity;
  19633. #ifdef OPENSSL_EXTRA
  19634. if (ssl->CBIS != NULL) {
  19635. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  19636. }
  19637. #endif
  19638. #ifdef WOLFSSL_DTLS
  19639. if (ssl->options.dtls)
  19640. dtlsExtra = DTLS_RECORD_EXTRA;
  19641. #endif
  19642. /* check for available size */
  19643. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  19644. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  19645. #ifdef WOLFSSL_DTLS
  19646. /* If CheckAvailableSize returned WANT_WRITE due to a blocking write
  19647. * then discard pending output and just send the alert. */
  19648. if (ssl->options.dtls) {
  19649. if (ret != WANT_WRITE || severity != alert_fatal)
  19650. return ret;
  19651. ShrinkOutputBuffer(ssl);
  19652. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  19653. return ret;
  19654. }
  19655. }
  19656. else {
  19657. return ret;
  19658. }
  19659. #else
  19660. return ret;
  19661. #endif
  19662. }
  19663. /* Check output buffer */
  19664. if (ssl->buffers.outputBuffer.buffer == NULL)
  19665. return BUFFER_E;
  19666. /* get output buffer */
  19667. output = ssl->buffers.outputBuffer.buffer +
  19668. ssl->buffers.outputBuffer.length;
  19669. input[0] = (byte)severity;
  19670. input[1] = (byte)type;
  19671. ssl->alert_history.last_tx.code = type;
  19672. ssl->alert_history.last_tx.level = severity;
  19673. if (severity == alert_fatal) {
  19674. ssl->options.isClosed = 1; /* Don't send close_notify */
  19675. }
  19676. /* send encrypted alert if encryption is on - can be a rehandshake over
  19677. * an existing encrypted channel.
  19678. * TLS 1.3 encrypts handshake packets after the ServerHello
  19679. */
  19680. if (IsEncryptionOn(ssl, 1)) {
  19681. #ifdef WOLFSSL_DTLS13
  19682. if (ssl->options.dtls
  19683. && IsAtLeastTLSv1_3(ssl->version)
  19684. && !w64Equal(ssl->dtls13EncryptEpoch->epochNumber, ssl->dtls13Epoch)) {
  19685. ret = Dtls13SetEpochKeys(ssl, ssl->dtls13Epoch, ENCRYPT_SIDE_ONLY);
  19686. if (ret != 0)
  19687. return ret;
  19688. }
  19689. #endif /* WOLFSSL_DTLS13 */
  19690. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  19691. 0, 0, 0, CUR_ORDER);
  19692. }
  19693. else {
  19694. #ifdef WOLFSSL_DTLS13
  19695. if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) {
  19696. ret = Dtls13RlAddPlaintextHeader(ssl, output, alert, ALERT_SIZE);
  19697. if (ret != 0)
  19698. return ret;
  19699. }
  19700. else
  19701. #endif /* WOLFSSL_DTLS13 */
  19702. {
  19703. AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
  19704. }
  19705. output += RECORD_HEADER_SZ;
  19706. #ifdef WOLFSSL_DTLS
  19707. if (ssl->options.dtls)
  19708. output += DTLS_RECORD_EXTRA;
  19709. #endif
  19710. XMEMCPY(output, input, ALERT_SIZE);
  19711. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  19712. #ifdef WOLFSSL_DTLS
  19713. if (ssl->options.dtls)
  19714. sendSz += DTLS_RECORD_EXTRA;
  19715. #endif
  19716. }
  19717. if (sendSz < 0)
  19718. return BUILD_MSG_ERROR;
  19719. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19720. if (ssl->hsInfoOn)
  19721. AddPacketName(ssl, "Alert");
  19722. if (ssl->toInfoOn)
  19723. AddPacketInfo(ssl, "Alert", alert, output, sendSz, WRITE_PROTO,
  19724. ssl->heap);
  19725. #endif
  19726. ssl->buffers.outputBuffer.length += sendSz;
  19727. ret = SendBuffered(ssl);
  19728. ssl->pendingAlert.code = 0;
  19729. ssl->pendingAlert.level = alert_none;
  19730. WOLFSSL_LEAVE("SendAlert", ret);
  19731. return ret;
  19732. }
  19733. int RetrySendAlert(WOLFSSL* ssl)
  19734. {
  19735. int type = ssl->pendingAlert.code;
  19736. int severity = ssl->pendingAlert.level;
  19737. if (severity == alert_none)
  19738. return 0;
  19739. ssl->pendingAlert.code = 0;
  19740. ssl->pendingAlert.level = alert_none;
  19741. return SendAlert_ex(ssl, severity, type);
  19742. }
  19743. /* send alert message */
  19744. int SendAlert(WOLFSSL* ssl, int severity, int type)
  19745. {
  19746. int ret;
  19747. if (ssl->pendingAlert.level != alert_none) {
  19748. ret = RetrySendAlert(ssl);
  19749. if (ret != 0) {
  19750. if (ssl->pendingAlert.level == alert_none ||
  19751. (ssl->pendingAlert.level != alert_fatal &&
  19752. severity == alert_fatal)) {
  19753. /* Store current alert if pendingAlert is empty or if current
  19754. * is fatal and previous was not */
  19755. ssl->pendingAlert.code = type;
  19756. ssl->pendingAlert.level = severity;
  19757. }
  19758. return ret;
  19759. }
  19760. }
  19761. return SendAlert_ex(ssl, severity, type);
  19762. }
  19763. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  19764. {
  19765. #ifdef NO_ERROR_STRINGS
  19766. (void)e;
  19767. return "no support for error strings built in";
  19768. #else
  19769. int error = (int)e;
  19770. #ifdef OPENSSL_EXTRA
  19771. /* OpenSSL uses positive error codes */
  19772. if (error > 0) {
  19773. error = -error;
  19774. }
  19775. #endif
  19776. /* pass to wolfCrypt */
  19777. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  19778. return wc_GetErrorString(error);
  19779. }
  19780. switch (error) {
  19781. #ifdef OPENSSL_EXTRA
  19782. case 0 :
  19783. return "ok";
  19784. #endif
  19785. case UNSUPPORTED_SUITE :
  19786. return "unsupported cipher suite";
  19787. case INPUT_CASE_ERROR :
  19788. return "input state error";
  19789. case PREFIX_ERROR :
  19790. return "bad index to key rounds";
  19791. case MEMORY_ERROR :
  19792. return "out of memory";
  19793. case VERIFY_FINISHED_ERROR :
  19794. return "verify problem on finished";
  19795. case VERIFY_MAC_ERROR :
  19796. return "verify mac problem";
  19797. case PARSE_ERROR :
  19798. return "parse error on header";
  19799. case SIDE_ERROR :
  19800. return "wrong client/server type";
  19801. case NO_PEER_CERT : /* OpenSSL compatibility expects this exact text */
  19802. return "peer did not return a certificate";
  19803. case UNKNOWN_HANDSHAKE_TYPE :
  19804. return "weird handshake type";
  19805. case SOCKET_ERROR_E :
  19806. return "error state on socket";
  19807. case SOCKET_NODATA :
  19808. return "expected data, not there";
  19809. case INCOMPLETE_DATA :
  19810. return "don't have enough data to complete task";
  19811. case UNKNOWN_RECORD_TYPE :
  19812. return "unknown type in record hdr";
  19813. case DECRYPT_ERROR :
  19814. return "error during decryption";
  19815. case FATAL_ERROR :
  19816. return "received alert fatal error";
  19817. case ENCRYPT_ERROR :
  19818. return "error during encryption";
  19819. case FREAD_ERROR :
  19820. return "fread problem";
  19821. case NO_PEER_KEY :
  19822. return "need peer's key";
  19823. case NO_PRIVATE_KEY :
  19824. return "need the private key";
  19825. case NO_DH_PARAMS :
  19826. return "server missing DH params";
  19827. case RSA_PRIVATE_ERROR :
  19828. return "error during rsa priv op";
  19829. case MATCH_SUITE_ERROR :
  19830. return "can't match cipher suite";
  19831. case COMPRESSION_ERROR :
  19832. return "compression mismatch error";
  19833. case BUILD_MSG_ERROR :
  19834. return "build message failure";
  19835. case BAD_HELLO :
  19836. return "client hello malformed";
  19837. case DOMAIN_NAME_MISMATCH :
  19838. return "peer subject name mismatch";
  19839. case IPADDR_MISMATCH :
  19840. return "peer ip address mismatch";
  19841. case WANT_READ :
  19842. case WOLFSSL_ERROR_WANT_READ :
  19843. return "non-blocking socket wants data to be read";
  19844. case NOT_READY_ERROR :
  19845. return "handshake layer not ready yet, complete first";
  19846. case VERSION_ERROR :
  19847. return "record layer version error";
  19848. case WANT_WRITE :
  19849. case WOLFSSL_ERROR_WANT_WRITE :
  19850. return "non-blocking socket write buffer full";
  19851. case BUFFER_ERROR :
  19852. return "malformed buffer input error";
  19853. case VERIFY_CERT_ERROR :
  19854. return "verify problem on certificate";
  19855. case VERIFY_SIGN_ERROR :
  19856. return "verify problem based on signature";
  19857. case CLIENT_ID_ERROR :
  19858. return "psk client identity error";
  19859. case SERVER_HINT_ERROR:
  19860. return "psk server hint error";
  19861. case PSK_KEY_ERROR:
  19862. return "psk key callback error";
  19863. case GETTIME_ERROR:
  19864. return "gettimeofday() error";
  19865. case GETITIMER_ERROR:
  19866. return "getitimer() error";
  19867. case SIGACT_ERROR:
  19868. return "sigaction() error";
  19869. case SETITIMER_ERROR:
  19870. return "setitimer() error";
  19871. case LENGTH_ERROR:
  19872. return "record layer length error";
  19873. case PEER_KEY_ERROR:
  19874. return "cant decode peer key";
  19875. case ZERO_RETURN:
  19876. case WOLFSSL_ERROR_ZERO_RETURN:
  19877. return "peer sent close notify alert";
  19878. case ECC_CURVETYPE_ERROR:
  19879. return "Bad ECC Curve Type or unsupported";
  19880. case ECC_CURVE_ERROR:
  19881. return "Bad ECC Curve or unsupported";
  19882. case ECC_PEERKEY_ERROR:
  19883. return "Bad ECC Peer Key";
  19884. case ECC_MAKEKEY_ERROR:
  19885. return "ECC Make Key failure";
  19886. case ECC_EXPORT_ERROR:
  19887. return "ECC Export Key failure";
  19888. case ECC_SHARED_ERROR:
  19889. return "ECC DHE shared failure";
  19890. case NOT_CA_ERROR:
  19891. return "Not a CA by basic constraint error";
  19892. case BAD_CERT_MANAGER_ERROR:
  19893. return "Bad Cert Manager error";
  19894. case OCSP_CERT_REVOKED:
  19895. return "OCSP Cert revoked";
  19896. case CRL_CERT_REVOKED:
  19897. return "CRL Cert revoked";
  19898. case CRL_MISSING:
  19899. return "CRL missing, not loaded";
  19900. case MONITOR_SETUP_E:
  19901. return "CRL monitor setup error";
  19902. case THREAD_CREATE_E:
  19903. return "Thread creation problem";
  19904. case OCSP_NEED_URL:
  19905. return "OCSP need URL";
  19906. case OCSP_CERT_UNKNOWN:
  19907. return "OCSP Cert unknown";
  19908. case OCSP_LOOKUP_FAIL:
  19909. return "OCSP Responder lookup fail";
  19910. case MAX_CHAIN_ERROR:
  19911. return "Maximum Chain Depth Exceeded";
  19912. case COOKIE_ERROR:
  19913. return "DTLS Cookie Error";
  19914. case SEQUENCE_ERROR:
  19915. return "DTLS Sequence Error";
  19916. case SUITES_ERROR:
  19917. return "Suites Pointer Error";
  19918. case OUT_OF_ORDER_E:
  19919. return "Out of order message, fatal";
  19920. case BAD_KEA_TYPE_E:
  19921. return "Bad KEA type found";
  19922. case SANITY_CIPHER_E:
  19923. return "Sanity check on ciphertext failed";
  19924. case RECV_OVERFLOW_E:
  19925. return "Receive callback returned more than requested";
  19926. case GEN_COOKIE_E:
  19927. return "Generate Cookie Error";
  19928. case NO_PEER_VERIFY:
  19929. return "Need peer certificate verify Error";
  19930. case FWRITE_ERROR:
  19931. return "fwrite Error";
  19932. case CACHE_MATCH_ERROR:
  19933. return "Cache restore header match Error";
  19934. case UNKNOWN_SNI_HOST_NAME_E:
  19935. return "Unrecognized host name Error";
  19936. case UNKNOWN_MAX_FRAG_LEN_E:
  19937. return "Unrecognized max frag len Error";
  19938. case KEYUSE_SIGNATURE_E:
  19939. return "Key Use digitalSignature not set Error";
  19940. case KEYUSE_ENCIPHER_E:
  19941. return "Key Use keyEncipherment not set Error";
  19942. case EXTKEYUSE_AUTH_E:
  19943. return "Ext Key Use server/client auth not set Error";
  19944. case SEND_OOB_READ_E:
  19945. return "Send Callback Out of Bounds Read Error";
  19946. case SECURE_RENEGOTIATION_E:
  19947. return "Invalid Renegotiation Error";
  19948. case SESSION_TICKET_LEN_E:
  19949. return "Session Ticket Too Long Error";
  19950. case SESSION_TICKET_EXPECT_E:
  19951. return "Session Ticket Error";
  19952. case SESSION_SECRET_CB_E:
  19953. return "Session Secret Callback Error";
  19954. case NO_CHANGE_CIPHER_E:
  19955. return "Finished received from peer before Change Cipher Error";
  19956. case SANITY_MSG_E:
  19957. return "Sanity Check on message order Error";
  19958. case DUPLICATE_MSG_E:
  19959. return "Duplicate HandShake message Error";
  19960. case SNI_UNSUPPORTED:
  19961. return "Protocol version does not support SNI Error";
  19962. case SOCKET_PEER_CLOSED_E:
  19963. return "Peer closed underlying transport Error";
  19964. case BAD_TICKET_KEY_CB_SZ:
  19965. return "Bad user session ticket key callback Size Error";
  19966. case BAD_TICKET_MSG_SZ:
  19967. return "Bad session ticket message Size Error";
  19968. case BAD_TICKET_ENCRYPT:
  19969. return "Bad user ticket callback encrypt Error";
  19970. case DH_KEY_SIZE_E:
  19971. return "DH key too small Error";
  19972. case SNI_ABSENT_ERROR:
  19973. return "No Server Name Indication extension Error";
  19974. case RSA_SIGN_FAULT:
  19975. return "RSA Signature Fault Error";
  19976. case HANDSHAKE_SIZE_ERROR:
  19977. return "Handshake message too large Error";
  19978. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  19979. return "Unrecognized protocol name Error";
  19980. case BAD_CERTIFICATE_STATUS_ERROR:
  19981. return "Bad Certificate Status Message Error";
  19982. case OCSP_INVALID_STATUS:
  19983. return "Invalid OCSP Status Error";
  19984. case OCSP_WANT_READ:
  19985. return "OCSP nonblock wants read";
  19986. case RSA_KEY_SIZE_E:
  19987. return "RSA key too small";
  19988. case ECC_KEY_SIZE_E:
  19989. return "ECC key too small";
  19990. case DTLS_EXPORT_VER_E:
  19991. return "Version needs updated after code change or version mismatch";
  19992. case INPUT_SIZE_E:
  19993. return "Input size too large Error";
  19994. case CTX_INIT_MUTEX_E:
  19995. return "Initialize ctx mutex error";
  19996. case EXT_MASTER_SECRET_NEEDED_E:
  19997. return "Extended Master Secret must be enabled to resume EMS session";
  19998. case DTLS_POOL_SZ_E:
  19999. return "Maximum DTLS pool size exceeded";
  20000. case DECODE_E:
  20001. return "Decode handshake message error";
  20002. case WRITE_DUP_READ_E:
  20003. return "Write dup write side can't read error";
  20004. case WRITE_DUP_WRITE_E:
  20005. return "Write dup read side can't write error";
  20006. case INVALID_CERT_CTX_E:
  20007. return "Certificate context does not match request or not empty";
  20008. case BAD_KEY_SHARE_DATA:
  20009. return "The Key Share data contains group that wasn't in Client Hello";
  20010. case MISSING_HANDSHAKE_DATA:
  20011. return "The handshake message is missing required data";
  20012. case BAD_BINDER: /* OpenSSL compatibility expects this exact text */
  20013. return "binder does not verify";
  20014. case EXT_NOT_ALLOWED:
  20015. return "Extension type not allowed in handshake message type";
  20016. case INVALID_PARAMETER:
  20017. return "The security parameter is invalid";
  20018. case UNSUPPORTED_EXTENSION:
  20019. return "TLS Extension not requested by the client";
  20020. case PRF_MISSING:
  20021. return "Pseudo-random function is not enabled";
  20022. case KEY_SHARE_ERROR:
  20023. return "Key share extension did not contain a valid named group";
  20024. case POST_HAND_AUTH_ERROR:
  20025. return "Client will not do post handshake authentication";
  20026. case HRR_COOKIE_ERROR:
  20027. return "Cookie does not match one sent in HelloRetryRequest";
  20028. case MCAST_HIGHWATER_CB_E:
  20029. return "Multicast highwater callback returned error";
  20030. case ALERT_COUNT_E:
  20031. return "Alert Count exceeded error";
  20032. case EXT_MISSING:
  20033. return "Required TLS extension missing";
  20034. case DTLS_RETX_OVER_TX:
  20035. return "DTLS interrupting flight transmit with retransmit";
  20036. case DH_PARAMS_NOT_FFDHE_E:
  20037. return "Server DH parameters were not from the FFDHE set as required";
  20038. case TCA_INVALID_ID_TYPE:
  20039. return "TLS Extension Trusted CA ID type invalid";
  20040. case TCA_ABSENT_ERROR:
  20041. return "TLS Extension Trusted CA ID response absent";
  20042. case TSIP_MAC_DIGSZ_E:
  20043. return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
  20044. case CLIENT_CERT_CB_ERROR:
  20045. return "Error importing client cert or key from callback";
  20046. case SSL_SHUTDOWN_ALREADY_DONE_E:
  20047. return "Shutdown has already occurred";
  20048. case TLS13_SECRET_CB_E:
  20049. return "TLS1.3 Secret Callback Error";
  20050. case DTLS_SIZE_ERROR:
  20051. return "DTLS trying to send too much in single datagram error";
  20052. case NO_CERT_ERROR:
  20053. return "TLS1.3 No Certificate Set Error";
  20054. case APP_DATA_READY:
  20055. return "Application data is available for reading";
  20056. case TOO_MUCH_EARLY_DATA:
  20057. return "Too much early data";
  20058. case SOCKET_FILTERED_E:
  20059. return "Session stopped by network filter";
  20060. #ifdef HAVE_HTTP_CLIENT
  20061. case HTTP_TIMEOUT:
  20062. return "HTTP timeout for OCSP or CRL req";
  20063. case HTTP_RECV_ERR:
  20064. return "HTTP Receive error";
  20065. case HTTP_HEADER_ERR:
  20066. return "HTTP Header error";
  20067. case HTTP_PROTO_ERR:
  20068. return "HTTP Protocol error";
  20069. case HTTP_STATUS_ERR:
  20070. return "HTTP Status error";
  20071. case HTTP_VERSION_ERR:
  20072. return "HTTP Version error";
  20073. case HTTP_APPSTR_ERR:
  20074. return "HTTP Application string error";
  20075. #endif
  20076. #ifdef OPENSSL_EXTRA
  20077. case -X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
  20078. return "unable to get local issuer certificate";
  20079. #endif
  20080. case UNSUPPORTED_PROTO_VERSION:
  20081. #ifdef OPENSSL_ALL
  20082. return "WRONG_SSL_VERSION";
  20083. #else
  20084. return "bad/unsupported protocol version";
  20085. #endif
  20086. case FALCON_KEY_SIZE_E:
  20087. return "Wrong key size for Falcon.";
  20088. case DILITHIUM_KEY_SIZE_E:
  20089. return "Wrong key size for Dilithium.";
  20090. #ifdef WOLFSSL_QUIC
  20091. case QUIC_TP_MISSING_E:
  20092. return "QUIC transport parameter not set";
  20093. #endif
  20094. case DTLS_CID_ERROR:
  20095. return "DTLS ConnectionID mismatch or missing";
  20096. default :
  20097. return "unknown error number";
  20098. }
  20099. #endif /* NO_ERROR_STRINGS */
  20100. }
  20101. const char* wolfSSL_ERR_func_error_string(unsigned long e)
  20102. {
  20103. (void)e;
  20104. WOLFSSL_MSG("wolfSSL_ERR_func_error_string does not return the name of "
  20105. "the function that failed. Please inspect the wolfSSL debug "
  20106. "logs to determine where the error occurred.");
  20107. return "";
  20108. }
  20109. /* return library name
  20110. * @param e error code
  20111. * @return text library name,
  20112. * if there is no suitable library found, returns empty string
  20113. */
  20114. const char* wolfSSL_ERR_lib_error_string(unsigned long e)
  20115. {
  20116. int libe = 0;
  20117. (void)libe;
  20118. (void)e;
  20119. #if defined(OPENSSL_EXTRA)
  20120. libe = wolfSSL_ERR_GET_LIB(e);
  20121. switch (libe) {
  20122. case ERR_LIB_PEM:
  20123. return "wolfSSL PEM routines";
  20124. case ERR_LIB_EVP:
  20125. return "wolfSSL digital envelope routines";
  20126. default:
  20127. return "";
  20128. }
  20129. #else
  20130. return "";
  20131. #endif
  20132. }
  20133. void SetErrorString(int error, char* str)
  20134. {
  20135. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  20136. str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
  20137. }
  20138. #ifdef NO_CIPHER_SUITE_ALIASES
  20139. #ifndef NO_ERROR_STRINGS
  20140. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  20141. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20142. #define SUITE_ALIAS(x,z,w,v,u)
  20143. #else
  20144. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20145. #define SUITE_ALIAS(x,z,w,v,u)
  20146. #endif
  20147. #else
  20148. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  20149. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20150. #define SUITE_ALIAS(x,z,w,v,u)
  20151. #else
  20152. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20153. #define SUITE_ALIAS(x,z,w,v,u)
  20154. #endif
  20155. #endif
  20156. #else /* !NO_CIPHER_SUITE_ALIASES */
  20157. /* note that the comma is included at the end of the SUITE_ALIAS() macro
  20158. * definitions, to allow aliases to be gated out by the above null macros
  20159. * in the NO_CIPHER_SUITE_ALIASES section.
  20160. */
  20161. #ifndef NO_ERROR_STRINGS
  20162. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  20163. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  20164. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20165. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20166. #else
  20167. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20168. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20169. #endif
  20170. #else
  20171. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  20172. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  20173. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20174. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20175. #else
  20176. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  20177. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  20178. #endif
  20179. #endif
  20180. #endif /* NO_CIPHER_SUITE_ALIASES */
  20181. static const CipherSuiteInfo cipher_names[] =
  20182. {
  20183. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  20184. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  20185. #endif
  20186. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  20187. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
  20188. #endif
  20189. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  20190. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  20191. #endif
  20192. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  20193. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  20194. #endif
  20195. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  20196. 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),
  20197. SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
  20198. #endif
  20199. #ifdef BUILD_TLS_SHA256_SHA256
  20200. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  20201. #endif
  20202. #ifdef BUILD_TLS_SHA384_SHA384
  20203. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
  20204. #endif
  20205. #ifndef WOLFSSL_NO_TLS12
  20206. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  20207. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20208. #endif
  20209. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  20210. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  20211. #endif
  20212. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  20213. 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),
  20214. #endif
  20215. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  20216. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20217. #endif
  20218. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  20219. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20220. #endif
  20221. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  20222. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  20223. #endif
  20224. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  20225. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  20226. #endif
  20227. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  20228. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  20229. #endif
  20230. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  20231. 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),
  20232. #endif
  20233. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  20234. 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),
  20235. #endif
  20236. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  20237. 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),
  20238. #endif
  20239. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  20240. 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),
  20241. #endif
  20242. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  20243. 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),
  20244. #endif
  20245. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  20246. 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),
  20247. #endif
  20248. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  20249. 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),
  20250. #endif
  20251. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  20252. 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),
  20253. #endif
  20254. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  20255. 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),
  20256. #endif
  20257. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  20258. 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),
  20259. #endif
  20260. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  20261. 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),
  20262. #endif
  20263. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  20264. 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),
  20265. #endif
  20266. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  20267. 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),
  20268. #endif
  20269. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  20270. 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),
  20271. #endif
  20272. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  20273. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  20274. #endif
  20275. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  20276. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  20277. #endif
  20278. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  20279. 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),
  20280. SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  20281. #endif
  20282. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  20283. 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),
  20284. SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  20285. #endif
  20286. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  20287. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  20288. #endif
  20289. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  20290. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20291. #endif
  20292. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  20293. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  20294. #endif
  20295. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  20296. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20297. #endif
  20298. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  20299. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  20300. #endif
  20301. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  20302. 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),
  20303. SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20304. #endif
  20305. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  20306. 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),
  20307. SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20308. #endif
  20309. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  20310. 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),
  20311. #endif
  20312. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  20313. 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),
  20314. SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20315. #endif
  20316. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  20317. 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),
  20318. SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  20319. #endif
  20320. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  20321. 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),
  20322. #endif
  20323. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  20324. 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),
  20325. #endif
  20326. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  20327. 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),
  20328. #endif
  20329. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  20330. 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),
  20331. #endif
  20332. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  20333. 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),
  20334. #endif
  20335. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  20336. 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),
  20337. #endif
  20338. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  20339. 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),
  20340. #endif
  20341. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  20342. 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),
  20343. #endif
  20344. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  20345. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
  20346. #endif
  20347. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  20348. 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),
  20349. #endif
  20350. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  20351. 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),
  20352. #endif
  20353. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  20354. 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),
  20355. #endif
  20356. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  20357. 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),
  20358. #endif
  20359. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  20360. 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),
  20361. #endif
  20362. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  20363. 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),
  20364. #endif
  20365. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  20366. 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),
  20367. #endif
  20368. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  20369. 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),
  20370. #endif
  20371. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  20372. 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),
  20373. #endif
  20374. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  20375. 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),
  20376. #endif
  20377. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  20378. 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),
  20379. #endif
  20380. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  20381. 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),
  20382. #endif
  20383. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  20384. 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),
  20385. #endif
  20386. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  20387. 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),
  20388. #endif
  20389. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  20390. 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),
  20391. #endif
  20392. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  20393. 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),
  20394. #endif
  20395. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  20396. 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),
  20397. #endif
  20398. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  20399. 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),
  20400. #endif
  20401. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  20402. 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),
  20403. #endif
  20404. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  20405. 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),
  20406. #endif
  20407. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  20408. 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),
  20409. #endif
  20410. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  20411. 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),
  20412. #endif
  20413. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  20414. 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),
  20415. #endif
  20416. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  20417. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  20418. #endif
  20419. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  20420. 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),
  20421. #endif
  20422. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  20423. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  20424. #endif
  20425. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  20426. 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),
  20427. #endif
  20428. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  20429. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20430. #endif
  20431. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  20432. 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),
  20433. #endif
  20434. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  20435. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20436. #endif
  20437. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  20438. 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),
  20439. #endif
  20440. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  20441. 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),
  20442. #endif
  20443. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  20444. 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),
  20445. #endif
  20446. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  20447. 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),
  20448. #endif
  20449. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  20450. 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),
  20451. #endif
  20452. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  20453. 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),
  20454. #endif
  20455. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  20456. 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),
  20457. #endif
  20458. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  20459. 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),
  20460. #endif
  20461. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  20462. 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),
  20463. #endif
  20464. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  20465. 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),
  20466. #endif
  20467. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  20468. 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),
  20469. #endif
  20470. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  20471. 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),
  20472. #endif
  20473. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  20474. 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),
  20475. #endif
  20476. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  20477. 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),
  20478. #endif
  20479. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  20480. 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),
  20481. #endif
  20482. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  20483. 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),
  20484. #endif
  20485. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  20486. 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),
  20487. #endif
  20488. #ifdef HAVE_RENEGOTIATION_INDICATION
  20489. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
  20490. #endif
  20491. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  20492. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  20493. #endif
  20494. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  20495. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  20496. #endif
  20497. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  20498. 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),
  20499. #endif
  20500. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
  20501. 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),
  20502. #endif
  20503. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  20504. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  20505. #endif
  20506. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  20507. 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),
  20508. #endif
  20509. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  20510. 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),
  20511. #endif
  20512. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  20513. 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),
  20514. #endif
  20515. #ifdef BUILD_WDM_WITH_NULL_SHA256
  20516. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
  20517. #endif
  20518. #endif /* WOLFSSL_NO_TLS12 */
  20519. };
  20520. /* returns the cipher_names array */
  20521. const CipherSuiteInfo* GetCipherNames(void)
  20522. {
  20523. return cipher_names;
  20524. }
  20525. /* returns the number of elements in the cipher_names array */
  20526. int GetCipherNamesSize(void)
  20527. {
  20528. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  20529. }
  20530. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  20531. {
  20532. int i;
  20533. const char* nameInternal = "None";
  20534. for (i = 0; i < GetCipherNamesSize(); i++) {
  20535. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  20536. (cipher_names[i].cipherSuite == cipherSuite)
  20537. #ifndef NO_CIPHER_SUITE_ALIASES
  20538. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  20539. #endif
  20540. ) {
  20541. nameInternal = cipher_names[i].name;
  20542. break;
  20543. }
  20544. }
  20545. return nameInternal;
  20546. }
  20547. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  20548. /* Segment cipher name into n[n0,n1,n2,n4]
  20549. * @param cipher a pointer to WOLFSSL_CIPHER
  20550. * @param n return segment cipher name
  20551. * return cipher name if cipher is in the list,
  20552. * otherwise NULL
  20553. */
  20554. const char* GetCipherSegment(const WOLFSSL_CIPHER* cipher, char n[][MAX_SEGMENT_SZ])
  20555. {
  20556. int i,j,k;
  20557. int strLen;
  20558. unsigned long offset;
  20559. const char* name;
  20560. /* sanity check */
  20561. if (cipher == NULL || n == NULL)
  20562. return NULL;
  20563. offset = cipher->offset;
  20564. if (offset >= (unsigned long)GetCipherNamesSize())
  20565. return NULL;
  20566. name = cipher_names[offset].name;
  20567. if (name == NULL)
  20568. return NULL;
  20569. /* Segment cipher name into n[n0,n1,n2,n4]
  20570. * These are used later for comparisons to create:
  20571. * keaStr, authStr, encStr, macStr
  20572. *
  20573. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  20574. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  20575. * and n = [n0,n1,n2,n3,0]
  20576. */
  20577. strLen = (int)XSTRLEN(name);
  20578. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  20579. if (k >= MAX_SEGMENTS || j >= MAX_SEGMENT_SZ)
  20580. break;
  20581. if (name[i] != '-' && name[i] != '\0') {
  20582. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  20583. j++;
  20584. }
  20585. else {
  20586. n[k][j] = '\0';
  20587. j = 0;
  20588. k++;
  20589. }
  20590. }
  20591. return name;
  20592. }
  20593. /* gcc-12 and later, building with ASAN at -O2 and higher, generate spurious
  20594. * stringop-overread warnings on some (but not all...) reads of n[1] in
  20595. * GetCipherKeaStr().
  20596. */
  20597. #if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
  20598. PRAGMA_GCC_DIAG_PUSH
  20599. PRAGMA_GCC("GCC diagnostic ignored \"-Wstringop-overread\"")
  20600. #endif
  20601. const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
  20602. const char* keaStr = NULL;
  20603. if (XSTRCMP(n[0],"ECDHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  20604. keaStr = "ECDHEPSK";
  20605. else if ((XSTRCMP(n[0],"ECDH") == 0) || (XSTRCMP(n[0],"ECDHE") == 0))
  20606. keaStr = "ECDH";
  20607. else if (XSTRCMP(n[0],"DHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  20608. keaStr = "DHEPSK";
  20609. else if (XSTRCMP(n[0],"DHE") == 0)
  20610. keaStr = "DH";
  20611. else if (XSTRCMP(n[0],"RSA") == 0 && XSTRCMP(n[1],"PSK") == 0)
  20612. keaStr = "RSAPSK";
  20613. else if (XSTRCMP(n[0],"SRP") == 0)
  20614. keaStr = "SRP";
  20615. else if (XSTRCMP(n[0],"PSK") == 0)
  20616. keaStr = "PSK";
  20617. else if (XSTRCMP(n[0],"EDH") == 0)
  20618. keaStr = "EDH";
  20619. else if ((XSTRCMP(n[1],"SHA") == 0) || (XSTRCMP(n[2],"SHA") == 0) ||
  20620. (XSTRCMP(n[3],"SHA") == 0) || (XSTRCMP(n[4],"SHA") == 0) ||
  20621. (XSTRCMP(n[2],"RSA") == 0) || (XSTRCMP(n[0],"AES128") == 0) ||
  20622. (XSTRCMP(n[0],"AES256") == 0) || (XSTRCMP(n[1],"MD5") == 0))
  20623. keaStr = "RSA";
  20624. else
  20625. keaStr = "unknown";
  20626. return keaStr;
  20627. }
  20628. #if defined(__GNUC__) && __GNUC__ > 11 && defined(__SANITIZE_ADDRESS__)
  20629. PRAGMA_GCC_DIAG_POP
  20630. #endif
  20631. const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
  20632. const char* authStr = NULL;
  20633. if ((XSTRCMP(n[0],"AES128") == 0) || (XSTRCMP(n[0],"AES256") == 0) ||
  20634. ((XSTRCMP(n[0],"TLS13") == 0) && ((XSTRCMP(n[1],"AES128") == 0) ||
  20635. (XSTRCMP(n[1],"AES256") == 0) || (XSTRCMP(n[1],"CHACHA20") == 0))) ||
  20636. (XSTRCMP(n[0],"RSA") == 0) || (XSTRCMP(n[1],"RSA") == 0) ||
  20637. (XSTRCMP(n[1],"SHA") == 0) || (XSTRCMP(n[2],"SHA") == 0) ||
  20638. (XSTRCMP(n[1],"MD5") == 0))
  20639. authStr = "RSA";
  20640. else if (XSTRCMP(n[0],"PSK") == 0 || XSTRCMP(n[1],"PSK") == 0)
  20641. authStr = "PSK";
  20642. else if (XSTRCMP(n[0],"SRP") == 0 && XSTRCMP(n[1],"AES") == 0)
  20643. authStr = "SRP";
  20644. else if (XSTRCMP(n[1],"ECDSA") == 0)
  20645. authStr = "ECDSA";
  20646. else if (XSTRCMP(n[0],"ADH") == 0)
  20647. authStr = "None";
  20648. else
  20649. authStr = "unknown";
  20650. return authStr;
  20651. }
  20652. const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
  20653. const char* encStr = NULL;
  20654. if ((XSTRCMP(n[0],"AES256") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  20655. (XSTRCMP(n[1],"AES256") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  20656. (XSTRCMP(n[2],"AES256") == 0 && XSTRCMP(n[3],"GCM") == 0))
  20657. encStr = "AESGCM(256)";
  20658. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  20659. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  20660. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"GCM") == 0))
  20661. encStr = "AESGCM(128)";
  20662. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"CCM") == 0) ||
  20663. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"CCM") == 0) ||
  20664. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"CCM") == 0))
  20665. encStr = "AESCCM(128)";
  20666. else if ((XSTRCMP(n[0],"AES128") == 0) ||
  20667. (XSTRCMP(n[1],"AES128") == 0) ||
  20668. (XSTRCMP(n[2],"AES128") == 0) ||
  20669. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"128") == 0) ||
  20670. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"128") == 0))
  20671. encStr = "AES(128)";
  20672. else if ((XSTRCMP(n[0],"AES256") == 0) ||
  20673. (XSTRCMP(n[1],"AES256") == 0) ||
  20674. (XSTRCMP(n[2],"AES256") == 0) ||
  20675. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"256") == 0) ||
  20676. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"256") == 0))
  20677. encStr = "AES(256)";
  20678. else if ((XSTRCMP(n[0],"CAMELLIA256") == 0) ||
  20679. (XSTRCMP(n[2],"CAMELLIA256") == 0))
  20680. encStr = "CAMELLIA(256)";
  20681. else if ((XSTRCMP(n[0],"CAMELLIA128") == 0) ||
  20682. (XSTRCMP(n[2],"CAMELLIA128") == 0))
  20683. encStr = "CAMELLIA(128)";
  20684. else if ((XSTRCMP(n[0],"RC4") == 0) || (XSTRCMP(n[1],"RC4") == 0) ||
  20685. (XSTRCMP(n[2],"RC4") == 0))
  20686. encStr = "RC4";
  20687. else if (((XSTRCMP(n[0],"DES") == 0) || (XSTRCMP(n[1],"DES") == 0) ||
  20688. (XSTRCMP(n[2],"DES") == 0)) &&
  20689. ((XSTRCMP(n[1],"CBC3") == 0) || (XSTRCMP(n[2],"CBC3") == 0) ||
  20690. (XSTRCMP(n[3],"CBC3") == 0)))
  20691. encStr = "3DES";
  20692. else if ((XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  20693. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  20694. encStr = "CHACHA20/POLY1305(256)";
  20695. else if ((XSTRCMP(n[0],"NULL") == 0) || (XSTRCMP(n[1],"NULL") == 0) ||
  20696. (XSTRCMP(n[2],"NULL") == 0) ||
  20697. ((XSTRCMP(n[0],"TLS13") == 0) && (XSTRCMP(n[3],"") == 0)))
  20698. encStr = "None";
  20699. else
  20700. encStr = "unknown";
  20701. return encStr;
  20702. }
  20703. /* Check if a cipher is AEAD
  20704. * @param n return segment cipher name
  20705. * return 1 if the cipher is AEAD, otherwise 0
  20706. */
  20707. int IsCipherAEAD(char n[][MAX_SEGMENT_SZ])
  20708. {
  20709. WOLFSSL_ENTER("IsCipherAEAD");
  20710. if (n == NULL) {
  20711. WOLFSSL_MSG("bad function argumet. n is NULL.");
  20712. return 0;
  20713. }
  20714. if ((XSTRCMP(n[2],"GCM") == 0) || (XSTRCMP(n[3],"GCM") == 0) ||
  20715. (XSTRCMP(n[1],"CCM") == 0) ||
  20716. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  20717. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  20718. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  20719. return 1;
  20720. return 0;
  20721. }
  20722. /* Returns the MAC string of a cipher or "unknown" on failure */
  20723. const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
  20724. const char* macStr = NULL;
  20725. if ((XSTRCMP(n[4],"SHA256") == 0) || (XSTRCMP(n[3],"SHA256") == 0) ||
  20726. (XSTRCMP(n[2],"SHA256") == 0) || (XSTRCMP(n[1],"SHA256") == 0))
  20727. macStr = "SHA256";
  20728. else if ((XSTRCMP(n[4],"SHA384") == 0) ||
  20729. (XSTRCMP(n[3],"SHA384") == 0) ||
  20730. (XSTRCMP(n[2],"SHA384") == 0) ||
  20731. (XSTRCMP(n[1],"SHA384") == 0))
  20732. macStr = "SHA384";
  20733. else if ((XSTRCMP(n[4],"SHA") == 0) || (XSTRCMP(n[3],"SHA") == 0) ||
  20734. (XSTRCMP(n[2],"SHA") == 0) || (XSTRCMP(n[1],"SHA") == 0) ||
  20735. (XSTRCMP(n[1],"MD5") == 0))
  20736. macStr = "SHA1";
  20737. else if ((XSTRCMP(n[3],"GCM") == 0) ||
  20738. (XSTRCMP(n[1],"CCM") == 0) ||
  20739. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  20740. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  20741. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  20742. macStr = "AEAD";
  20743. else
  20744. macStr = "unknown";
  20745. return macStr;
  20746. }
  20747. /* Returns the number of bits based on the cipher enc string, or 0 on failure */
  20748. int SetCipherBits(const char* enc) {
  20749. int ret = WOLFSSL_FAILURE;
  20750. if ((XSTRCMP(enc,"AESGCM(256)") == 0) ||
  20751. (XSTRCMP(enc,"AES(256)") == 0) ||
  20752. (XSTRCMP(enc,"CAMELLIA(256)") == 0) ||
  20753. (XSTRCMP(enc,"CHACHA20/POLY1305(256)") == 0))
  20754. ret = 256;
  20755. else if
  20756. ((XSTRCMP(enc,"3DES") == 0))
  20757. ret = 168;
  20758. else if
  20759. ((XSTRCMP(enc,"AESGCM(128)") == 0) ||
  20760. (XSTRCMP(enc,"AES(128)") == 0) ||
  20761. (XSTRCMP(enc,"CAMELLIA(128)") == 0) ||
  20762. (XSTRCMP(enc,"RC4") == 0))
  20763. ret = 128;
  20764. else if
  20765. ((XSTRCMP(enc,"DES") == 0))
  20766. ret = 56;
  20767. return ret;
  20768. }
  20769. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  20770. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  20771. {
  20772. #ifndef NO_ERROR_STRINGS
  20773. int i;
  20774. const char* nameIana = "NONE";
  20775. for (i = 0; i < GetCipherNamesSize(); i++) {
  20776. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  20777. (cipher_names[i].cipherSuite == cipherSuite)
  20778. #ifndef NO_CIPHER_SUITE_ALIASES
  20779. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  20780. #endif
  20781. ) {
  20782. nameIana = cipher_names[i].name_iana;
  20783. break;
  20784. }
  20785. }
  20786. return nameIana;
  20787. #else
  20788. (void)cipherSuite0;
  20789. (void)cipherSuite;
  20790. return NULL;
  20791. #endif
  20792. }
  20793. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  20794. {
  20795. if (ssl == NULL) {
  20796. return NULL;
  20797. }
  20798. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  20799. }
  20800. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  20801. {
  20802. if (ssl == NULL) {
  20803. return NULL;
  20804. }
  20805. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  20806. }
  20807. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  20808. byte* cipherSuite, int* flags)
  20809. {
  20810. int ret = BAD_FUNC_ARG;
  20811. int i;
  20812. unsigned long len;
  20813. const char* nameDelim;
  20814. /* Support trailing : */
  20815. nameDelim = XSTRSTR(name, ":");
  20816. if (nameDelim)
  20817. len = (unsigned long)(nameDelim - name);
  20818. else
  20819. len = (unsigned long)XSTRLEN(name);
  20820. for (i = 0; i < GetCipherNamesSize(); i++) {
  20821. if ((XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
  20822. (cipher_names[i].name[len] == 0)) {
  20823. *cipherSuite0 = cipher_names[i].cipherSuite0;
  20824. *cipherSuite = cipher_names[i].cipherSuite;
  20825. *flags = cipher_names[i].flags;
  20826. ret = 0;
  20827. break;
  20828. }
  20829. }
  20830. return ret;
  20831. }
  20832. /**
  20833. Set the enabled cipher suites.
  20834. With OPENSSL_EXTRA we attempt to understand some of the available "bulk"
  20835. ciphersuites. We can not perfectly filter ciphersuites based on the "bulk"
  20836. names but we do what we can. Ciphersuites named explicitly take precedence to
  20837. ciphersuites introduced through the "bulk" ciphersuites.
  20838. @param [out] suites Suites structure.
  20839. @param [in] list List of cipher suites, only supports full name from
  20840. cipher_names[] delimited by ':'.
  20841. @return true on success, else false.
  20842. */
  20843. int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list)
  20844. {
  20845. int ret = 0;
  20846. int idx = 0;
  20847. int haveRSAsig = 0;
  20848. int haveECDSAsig = 0;
  20849. int haveFalconSig = 0;
  20850. int haveDilithiumSig = 0;
  20851. int haveAnon = 0;
  20852. #ifdef OPENSSL_EXTRA
  20853. int haveRSA = 0;
  20854. int haveDH = 0;
  20855. int haveECC = 0;
  20856. int haveStaticRSA = 1; /* allowed by default if compiled in */
  20857. int haveStaticECC = 0;
  20858. int haveNull = 1; /* allowed by default if compiled in */
  20859. int callInitSuites = 0;
  20860. int havePSK = 0;
  20861. #endif
  20862. const int suiteSz = GetCipherNamesSize();
  20863. const char* next = list;
  20864. if (suites == NULL || list == NULL) {
  20865. WOLFSSL_MSG("SetCipherList parameter error");
  20866. return 0;
  20867. }
  20868. if (next[0] == 0 || XSTRCMP(next, "ALL") == 0 ||
  20869. XSTRCMP(next, "DEFAULT") == 0 || XSTRCMP(next, "HIGH") == 0)
  20870. return 1; /* wolfSSL default */
  20871. do {
  20872. const char* current = next;
  20873. char name[MAX_SUITE_NAME + 1];
  20874. int i;
  20875. word32 length;
  20876. #ifdef OPENSSL_EXTRA
  20877. int allowing = 1;
  20878. #endif
  20879. next = XSTRSTR(next, ":");
  20880. length = MAX_SUITE_NAME;
  20881. if (next != NULL) {
  20882. word32 currLen = (word32)(next - current);
  20883. if (length > currLen) {
  20884. length = currLen;
  20885. }
  20886. }
  20887. #ifdef OPENSSL_EXTRA
  20888. if (length > 1) {
  20889. if (*current == '!') {
  20890. allowing = 0;
  20891. current++;
  20892. length--;
  20893. }
  20894. }
  20895. #endif
  20896. XSTRNCPY(name, current, length);
  20897. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  20898. #ifdef OPENSSL_EXTRA
  20899. if (XSTRCMP(name, "DEFAULT") == 0 || XSTRCMP(name, "ALL") == 0) {
  20900. if (XSTRCMP(name, "ALL") == 0)
  20901. haveAnon = 1;
  20902. else
  20903. haveAnon = 0;
  20904. #ifdef HAVE_ANON
  20905. ctx->haveAnon = haveAnon;
  20906. #endif
  20907. haveRSA = 1;
  20908. haveDH = 1;
  20909. haveECC = 1;
  20910. haveStaticECC = 1;
  20911. haveStaticRSA = 1;
  20912. haveRSAsig = 1;
  20913. havePSK = 1;
  20914. haveNull = 0;
  20915. callInitSuites = 1;
  20916. ret = 1;
  20917. continue;
  20918. }
  20919. /* We don't have a way to disallow high bit sizes. Only disable unsafe
  20920. * ciphersuites. */
  20921. if (XSTRCMP(name, "HIGH") == 0 && allowing) {
  20922. /* Disable static, anonymous, and null ciphers */
  20923. haveAnon = 0;
  20924. #ifdef HAVE_ANON
  20925. ctx->haveAnon = 0;
  20926. #endif
  20927. haveRSA = 1;
  20928. haveDH = 1;
  20929. haveECC = 1;
  20930. haveStaticECC = 0;
  20931. haveStaticRSA = 0;
  20932. haveRSAsig = 1;
  20933. havePSK = 1;
  20934. haveNull = 0;
  20935. callInitSuites = 1;
  20936. ret = 1;
  20937. continue;
  20938. }
  20939. if (XSTRCMP(name, "aNULL") == 0) {
  20940. haveAnon = allowing;
  20941. #ifdef HAVE_ANON
  20942. ctx->haveAnon = allowing;
  20943. #endif
  20944. if (allowing) {
  20945. /* Allow RSA by default. */
  20946. if (!haveECC)
  20947. haveRSA = 1;
  20948. if (!haveECDSAsig)
  20949. haveRSAsig = 1;
  20950. callInitSuites = 1;
  20951. ret = 1;
  20952. }
  20953. continue;
  20954. }
  20955. if (XSTRCMP(name, "eNULL") == 0 || XSTRCMP(name, "NULL") == 0) {
  20956. haveNull = allowing;
  20957. if (allowing) {
  20958. /* Allow RSA by default. */
  20959. if (!haveECC)
  20960. haveRSA = 1;
  20961. if (!haveECDSAsig)
  20962. haveRSAsig = 1;
  20963. callInitSuites = 1;
  20964. ret = 1;
  20965. }
  20966. continue;
  20967. }
  20968. if (XSTRCMP(name, "kDH") == 0) {
  20969. haveStaticECC = allowing;
  20970. if (allowing) {
  20971. haveECC = 1;
  20972. haveECDSAsig = 1;
  20973. callInitSuites = 1;
  20974. ret = 1;
  20975. }
  20976. continue;
  20977. }
  20978. if (XSTRCMP(name, "kRSA") == 0 || XSTRCMP(name, "RSA") == 0) {
  20979. haveStaticRSA = allowing;
  20980. if (allowing) {
  20981. haveRSA = 1;
  20982. haveRSAsig = 1;
  20983. callInitSuites = 1;
  20984. ret = 1;
  20985. }
  20986. continue;
  20987. }
  20988. if (XSTRCMP(name, "PSK") == 0) {
  20989. havePSK = allowing;
  20990. haveRSAsig = 1;
  20991. if (allowing) {
  20992. /* Allow RSA by default. */
  20993. if (!haveECC)
  20994. haveRSA = 1;
  20995. if (!haveECDSAsig)
  20996. haveRSAsig = 1;
  20997. callInitSuites = 1;
  20998. ret = 1;
  20999. }
  21000. continue;
  21001. }
  21002. if (XSTRCMP(name, "LOW") == 0 || XSTRCMP(name, "MEDIUM") == 0) {
  21003. /* No way to limit or allow low bit sizes */
  21004. if (allowing) {
  21005. /* Allow RSA by default */
  21006. haveRSA = 1;
  21007. haveRSAsig = 1;
  21008. callInitSuites = 1;
  21009. ret = 1;
  21010. }
  21011. continue;
  21012. }
  21013. if (XSTRCMP(name, "DSS") == 0) {
  21014. /* No support for DSA ciphersuites */
  21015. continue;
  21016. }
  21017. if (XSTRCMP(name, "EXP") == 0 || XSTRCMP(name, "EXPORT") == 0) {
  21018. /* wolfSSL doesn't support "export" ciphers. We can skip this */
  21019. continue;
  21020. }
  21021. #endif /* OPENSSL_EXTRA */
  21022. for (i = 0; i < suiteSz; i++) {
  21023. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  21024. #ifndef NO_ERROR_STRINGS
  21025. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  21026. #endif
  21027. ) {
  21028. #ifdef WOLFSSL_DTLS
  21029. /* don't allow stream ciphers with DTLS */
  21030. if (ctx->method->version.major == DTLS_MAJOR) {
  21031. if (XSTRSTR(name, "RC4"))
  21032. {
  21033. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  21034. continue;
  21035. }
  21036. }
  21037. #endif /* WOLFSSL_DTLS */
  21038. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  21039. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  21040. return 0; /* suites buffer not large enough, error out */
  21041. }
  21042. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  21043. suites->suites[idx++] = cipher_names[i].cipherSuite;
  21044. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  21045. * suites don't necessarily have RSA in the name. */
  21046. #ifdef WOLFSSL_TLS13
  21047. if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
  21048. (cipher_names[i].cipherSuite0 == ECC_BYTE &&
  21049. (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
  21050. cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
  21051. #ifndef NO_RSA
  21052. haveRSAsig = 1;
  21053. #endif
  21054. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  21055. defined(HAVE_ED448)
  21056. haveECDSAsig = 1;
  21057. #endif
  21058. #if defined(HAVE_PQC)
  21059. #ifdef HAVE_FALCON
  21060. haveFalconSig = 1;
  21061. #endif /* HAVE_FALCON */
  21062. #ifdef HAVE_DILITHIUM
  21063. haveDilithiumSig = 1;
  21064. #endif /* HAVE_DILITHIUM */
  21065. #endif /* HAVE_PQC */
  21066. }
  21067. else
  21068. #endif
  21069. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  21070. defined(HAVE_ED448)
  21071. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  21072. haveECDSAsig = 1;
  21073. else
  21074. #endif
  21075. #ifdef HAVE_ANON
  21076. if (XSTRSTR(name, "ADH"))
  21077. haveAnon = 1;
  21078. else
  21079. #endif
  21080. if (haveRSAsig == 0
  21081. #ifndef NO_PSK
  21082. && (XSTRSTR(name, "PSK") == NULL)
  21083. #endif
  21084. ) {
  21085. haveRSAsig = 1;
  21086. }
  21087. ret = 1; /* found at least one */
  21088. break;
  21089. }
  21090. }
  21091. }
  21092. while (next++); /* ++ needed to skip ':' */
  21093. if (ret) {
  21094. int keySz = 0;
  21095. #ifndef NO_CERTS
  21096. keySz = ctx->privateKeySz;
  21097. #endif
  21098. #ifdef OPENSSL_EXTRA
  21099. if (callInitSuites) {
  21100. byte tmp[WOLFSSL_MAX_SUITE_SZ];
  21101. XMEMCPY(tmp, suites->suites, idx); /* Store copy */
  21102. suites->setSuites = 0; /* Force InitSuites */
  21103. suites->hashSigAlgoSz = 0; /* Force InitSuitesHashSigAlgo call
  21104. * inside InitSuites */
  21105. InitSuites(suites, ctx->method->version, keySz, (word16)haveRSA,
  21106. (word16)havePSK, (word16)haveDH, (word16)haveECDSAsig,
  21107. (word16)haveECC, (word16)haveStaticRSA,
  21108. (word16)haveStaticECC, (word16)haveFalconSig,
  21109. (word16)haveDilithiumSig, (word16)haveAnon,
  21110. (word16)haveNull, ctx->method->side);
  21111. /* Restore user ciphers ahead of defaults */
  21112. XMEMMOVE(suites->suites + idx, suites->suites,
  21113. min(suites->suiteSz, WOLFSSL_MAX_SUITE_SZ-idx));
  21114. suites->suiteSz += (word16)idx;
  21115. }
  21116. else
  21117. #endif
  21118. {
  21119. suites->suiteSz = (word16)idx;
  21120. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig,
  21121. haveFalconSig, haveDilithiumSig, haveAnon,
  21122. 1, keySz);
  21123. }
  21124. suites->setSuites = 1;
  21125. }
  21126. (void)ctx;
  21127. return ret;
  21128. }
  21129. #ifdef OPENSSL_EXTRA
  21130. struct mac_algs {
  21131. byte alg;
  21132. const char* name;
  21133. } mac_names[] = {
  21134. #ifndef NO_SHA256
  21135. { sha256_mac, "SHA256" },
  21136. #endif
  21137. #ifdef WOLFSSL_SHA384
  21138. { sha384_mac, "SHA384" },
  21139. #endif
  21140. #ifdef WOLFSSL_SHA512
  21141. { sha512_mac, "SHA512" },
  21142. #endif
  21143. #ifdef WOLFSSL_SHA224
  21144. { sha224_mac, "SHA224" },
  21145. #endif
  21146. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  21147. defined(WOLFSSL_ALLOW_TLS_SHA1))
  21148. { sha_mac, "SHA1" },
  21149. #endif
  21150. };
  21151. #define MAC_NAMES_SZ (int)(sizeof(mac_names)/sizeof(*mac_names))
  21152. /* Convert the hash algorithm string to a TLS MAC algorithm num. */
  21153. static byte GetMacAlgFromName(const char* name, int len)
  21154. {
  21155. byte alg = no_mac;
  21156. int i;
  21157. for (i = 0; i < MAC_NAMES_SZ; i++) {
  21158. if (((int)XSTRLEN(mac_names[i].name) == len) &&
  21159. (XMEMCMP(mac_names[i].name, name, len) == 0)) {
  21160. alg = mac_names[i].alg;
  21161. break;
  21162. }
  21163. }
  21164. return alg;
  21165. }
  21166. struct sig_algs {
  21167. byte alg;
  21168. const char* name;
  21169. } sig_names[] = {
  21170. #ifndef NO_RSA
  21171. { rsa_sa_algo, "RSA" },
  21172. #ifdef WC_RSA_PSS
  21173. { rsa_pss_sa_algo, "RSA-PSS" },
  21174. { rsa_pss_sa_algo, "PSS" },
  21175. #endif
  21176. #endif
  21177. #ifdef HAVE_ECC
  21178. { ecc_dsa_sa_algo, "ECDSA" },
  21179. #endif
  21180. #ifdef HAVE_ED25519
  21181. { ed25519_sa_algo, "ED25519" },
  21182. #endif
  21183. #ifdef HAVE_ED448
  21184. { ed448_sa_algo, "ED448" },
  21185. #endif
  21186. #ifndef NO_DSA
  21187. { dsa_sa_algo, "DSA" },
  21188. #endif
  21189. };
  21190. #define SIG_NAMES_SZ (int)(sizeof(sig_names)/sizeof(*sig_names))
  21191. /* Convert the signature algorithm string to a TLS signature algorithm num. */
  21192. static byte GetSigAlgFromName(const char* name, int len)
  21193. {
  21194. byte alg = anonymous_sa_algo;
  21195. int i;
  21196. for (i = 0; i < SIG_NAMES_SZ; i++) {
  21197. if (((int)XSTRLEN(sig_names[i].name) == len) &&
  21198. (XMEMCMP(sig_names[i].name, name, len) == 0)) {
  21199. alg = sig_names[i].alg;
  21200. break;
  21201. }
  21202. }
  21203. return alg;
  21204. }
  21205. /* Set the hash/signature algorithms that are supported for certificate signing.
  21206. *
  21207. * suites [in,out] Cipher suites and signature algorithms.
  21208. * list [in] String representing hash/signature algorithms to set.
  21209. * returns 0 on failure.
  21210. * 1 on success.
  21211. */
  21212. int SetSuitesHashSigAlgo(Suites* suites, const char* list)
  21213. {
  21214. int ret = 1;
  21215. word16 idx = 0;
  21216. const char* s = list;
  21217. byte sig_alg = 0;
  21218. byte mac_alg = no_mac;
  21219. /* Setting is destructive on error. */
  21220. suites->hashSigAlgoSz = 0;
  21221. do {
  21222. if (*list == '+') {
  21223. if (mac_alg != 0) {
  21224. ret = 0;
  21225. break;
  21226. }
  21227. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  21228. if (sig_alg == 0) {
  21229. ret = 0;
  21230. break;
  21231. }
  21232. s = list + 1;
  21233. }
  21234. else if (*list == ':' || *list == '\0') {
  21235. if (sig_alg == 0) {
  21236. /* No signature algorithm set yet.
  21237. * Ed25519 and Ed448 have implied MAC algorithm.
  21238. */
  21239. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  21240. if (sig_alg != ed25519_sa_algo && sig_alg != ed448_sa_algo) {
  21241. ret = 0;
  21242. break;
  21243. }
  21244. }
  21245. else {
  21246. mac_alg = GetMacAlgFromName(s, (int)(list - s));
  21247. if (mac_alg == 0) {
  21248. ret = 0;
  21249. break;
  21250. }
  21251. }
  21252. AddSuiteHashSigAlgo(suites, mac_alg, sig_alg, 0, &idx);
  21253. sig_alg = 0;
  21254. mac_alg = no_mac;
  21255. s = list + 1;
  21256. }
  21257. list++;
  21258. }
  21259. while (*(list-1) != '\0');
  21260. if (s != list && (sig_alg != 0 || mac_alg != 0)) {
  21261. ret = 0;
  21262. }
  21263. else {
  21264. suites->hashSigAlgoSz = idx;
  21265. }
  21266. return ret;
  21267. }
  21268. #endif /* OPENSSL_EXTRA */
  21269. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  21270. static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
  21271. {
  21272. #ifdef HAVE_ED25519
  21273. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  21274. /* Certificate has Ed25519 key, only match with Ed25519 sig alg */
  21275. return sigAlgo == ed25519_sa_algo;
  21276. }
  21277. #endif
  21278. #ifdef HAVE_ED448
  21279. if (ssl->pkCurveOID == ECC_ED448_OID) {
  21280. /* Certificate has Ed448 key, only match with Ed448 sig alg */
  21281. return sigAlgo == ed448_sa_algo;
  21282. }
  21283. #endif
  21284. #ifdef HAVE_PQC
  21285. #ifdef HAVE_FALCON
  21286. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1) {
  21287. /* Certificate has Falcon level 1 key, only match with Falcon level 1
  21288. * sig alg */
  21289. return sigAlgo == falcon_level1_sa_algo;
  21290. }
  21291. if (ssl->pkCurveOID == CTC_FALCON_LEVEL5) {
  21292. /* Certificate has Falcon level 5 key, only match with Falcon level 5
  21293. * sig alg */
  21294. return sigAlgo == falcon_level5_sa_algo;
  21295. }
  21296. #endif /* HAVE_FALCON */
  21297. #ifdef HAVE_DILITHIUM
  21298. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2) {
  21299. /* Certificate has Dilithium level 2 key, only match with it. */
  21300. return sigAlgo == dilithium_level2_sa_algo;
  21301. }
  21302. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3) {
  21303. /* Certificate has Dilithium level 3 key, only match with it. */
  21304. return sigAlgo == dilithium_level3_sa_algo;
  21305. }
  21306. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5) {
  21307. /* Certificate has Dilithium level 5 key, only match with it. */
  21308. return sigAlgo == dilithium_level5_sa_algo;
  21309. }
  21310. if (ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL2) {
  21311. /* Certificate has Dilithium AES level 2 key, only match with it. */
  21312. return sigAlgo == dilithium_aes_level2_sa_algo;
  21313. }
  21314. if (ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL3) {
  21315. /* Certificate has Dilithium AES level 3 key, only match with it. */
  21316. return sigAlgo == dilithium_aes_level3_sa_algo;
  21317. }
  21318. if (ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL5) {
  21319. /* Certificate has Dilithium AES level 5 key, only match with it. */
  21320. return sigAlgo == dilithium_aes_level5_sa_algo;
  21321. }
  21322. #endif /* HAVE_DILITHIUM */
  21323. #endif /* HAVE_PQC */
  21324. #ifdef WC_RSA_PSS
  21325. /* RSA certificate and PSS sig alg. */
  21326. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  21327. #if defined(WOLFSSL_TLS13)
  21328. /* TLS 1.3 only supports RSA-PSS. */
  21329. if (IsAtLeastTLSv1_3(ssl->version))
  21330. return sigAlgo == rsa_pss_sa_algo;
  21331. #endif
  21332. /* TLS 1.2 and below - RSA-PSS allowed. */
  21333. if (sigAlgo == rsa_pss_sa_algo)
  21334. return 1;
  21335. }
  21336. #endif
  21337. /* Signature algorithm matches certificate. */
  21338. return sigAlgo == ssl->suites->sigAlgo;
  21339. }
  21340. #if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
  21341. defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  21342. static int CmpEccStrength(int hashAlgo, int curveSz)
  21343. {
  21344. int dgstSz = GetMacDigestSize((byte)hashAlgo);
  21345. if (dgstSz <= 0)
  21346. return -1;
  21347. return dgstSz - (curveSz & (~0x3));
  21348. }
  21349. #endif
  21350. static byte MinHashAlgo(WOLFSSL* ssl)
  21351. {
  21352. #ifdef WOLFSSL_TLS13
  21353. if (IsAtLeastTLSv1_3(ssl->version)) {
  21354. return sha256_mac;
  21355. }
  21356. #endif
  21357. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
  21358. if (IsAtLeastTLSv1_2(ssl)) {
  21359. return sha256_mac;
  21360. }
  21361. #endif /* WOLFSSL_NO_TLS12 */
  21362. (void)ssl;
  21363. return sha_mac;
  21364. }
  21365. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  21366. {
  21367. word32 i;
  21368. int ret = MATCH_SUITE_ERROR;
  21369. byte minHash;
  21370. /* set defaults */
  21371. if (IsAtLeastTLSv1_3(ssl->version)) {
  21372. #ifndef NO_CERTS
  21373. /* TLS 1.3 cipher suites don't have public key algorithms in them.
  21374. * Using the one in the certificate - if any.
  21375. */
  21376. ssl->suites->sigAlgo = ssl->buffers.keyType;
  21377. #endif
  21378. }
  21379. else {
  21380. ssl->suites->sigAlgo = ssl->specs.sig_algo;
  21381. }
  21382. if (ssl->suites->sigAlgo == anonymous_sa_algo) {
  21383. /* PSK ciphersuite - get digest to use from cipher suite */
  21384. ssl->suites->hashAlgo = ssl->specs.mac_algorithm;
  21385. return 0;
  21386. }
  21387. ssl->suites->hashAlgo = minHash = MinHashAlgo(ssl);
  21388. /* No list means go with the defaults. */
  21389. if (hashSigAlgoSz == 0)
  21390. return 0;
  21391. /* i+1 since two bytes used to describe hash and signature algorithm */
  21392. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  21393. byte hashAlgo = 0, sigAlgo = 0;
  21394. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  21395. /* Keep looking if hash algorithm not strong enough. */
  21396. if (hashAlgo < minHash)
  21397. continue;
  21398. /* Keep looking if signature algorithm isn't supported by cert. */
  21399. if (!MatchSigAlgo(ssl, sigAlgo))
  21400. continue;
  21401. #ifdef HAVE_ED25519
  21402. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  21403. /* Matched Ed25519 - set chosen and finished. */
  21404. ssl->suites->sigAlgo = sigAlgo;
  21405. ssl->suites->hashAlgo = hashAlgo;
  21406. ret = 0;
  21407. break;
  21408. }
  21409. #endif
  21410. #ifdef HAVE_ED448
  21411. if (ssl->pkCurveOID == ECC_ED448_OID) {
  21412. /* Matched Ed448 - set chosen and finished. */
  21413. ssl->suites->sigAlgo = sigAlgo;
  21414. ssl->suites->hashAlgo = hashAlgo;
  21415. ret = 0;
  21416. break;
  21417. }
  21418. #endif
  21419. #if defined(HAVE_PQC)
  21420. #if defined(HAVE_FALCON)
  21421. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1 ||
  21422. ssl->pkCurveOID == CTC_FALCON_LEVEL5 ) {
  21423. /* Matched Falcon - set chosen and finished. */
  21424. ssl->suites->sigAlgo = sigAlgo;
  21425. ssl->suites->hashAlgo = hashAlgo;
  21426. ret = 0;
  21427. break;
  21428. }
  21429. #endif /* HAVE_FALCON */
  21430. #if defined(HAVE_DILITHIUM)
  21431. if (ssl->pkCurveOID == CTC_DILITHIUM_LEVEL2 ||
  21432. ssl->pkCurveOID == CTC_DILITHIUM_LEVEL3 ||
  21433. ssl->pkCurveOID == CTC_DILITHIUM_LEVEL5 ||
  21434. ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL2 ||
  21435. ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL3 ||
  21436. ssl->pkCurveOID == CTC_DILITHIUM_AES_LEVEL5 ) {
  21437. /* Matched Dilithium - set chosen and finished. */
  21438. ssl->suites->sigAlgo = sigAlgo;
  21439. ssl->suites->hashAlgo = hashAlgo;
  21440. ret = 0;
  21441. break;
  21442. }
  21443. #endif /* HAVE_DILITHIUM */
  21444. #endif /* HAVE_PQC */
  21445. #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  21446. #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
  21447. "be used together"
  21448. #endif
  21449. #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
  21450. defined(WOLFSSL_ECDSA_MATCH_HASH))
  21451. if (sigAlgo == ecc_dsa_sa_algo
  21452. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  21453. && IsAtLeastTLSv1_3(ssl->version)
  21454. #endif
  21455. ) {
  21456. /* Must be exact match. */
  21457. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  21458. continue;
  21459. /* Matched ECDSA exaclty - set chosen and finished. */
  21460. ssl->suites->hashAlgo = hashAlgo;
  21461. ssl->suites->sigAlgo = sigAlgo;
  21462. ret = 0;
  21463. break;
  21464. }
  21465. #endif
  21466. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  21467. * algorithm that matches the ephemeral ECDHE key size or the next highest
  21468. * available. This workaround resolves issue with some peer's that do not
  21469. * properly support scenarios such as a P-256 key hashed with SHA512.
  21470. */
  21471. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  21472. if (sigAlgo == ecc_dsa_sa_algo) {
  21473. int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
  21474. /* Keep looking if digest not strong enough. */
  21475. if (cmp < 0)
  21476. continue;
  21477. /* Looking for exact match or next highest. */
  21478. if (ret != 0 || hashAlgo <= ssl->suites->hashAlgo) {
  21479. ssl->suites->hashAlgo = hashAlgo;
  21480. ssl->suites->sigAlgo = sigAlgo;
  21481. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  21482. ssl->namedGroup = 0;
  21483. #endif
  21484. ret = 0;
  21485. }
  21486. /* Continue looking if not the same strength. */
  21487. if (cmp > 0)
  21488. continue;
  21489. /* Exact match - finished. */
  21490. break;
  21491. }
  21492. #endif
  21493. switch (hashAlgo) {
  21494. #ifndef NO_SHA
  21495. case sha_mac:
  21496. #endif
  21497. #ifdef WOLFSSL_SHA224
  21498. case sha224_mac:
  21499. #endif
  21500. #ifndef NO_SHA256
  21501. case sha256_mac:
  21502. #endif
  21503. #ifdef WOLFSSL_SHA384
  21504. case sha384_mac:
  21505. #endif
  21506. #ifdef WOLFSSL_SHA512
  21507. case sha512_mac:
  21508. #endif
  21509. #ifdef WOLFSSL_STRONGEST_HASH_SIG
  21510. /* Is hash algorithm weaker than chosen/min? */
  21511. if (hashAlgo < ssl->suites->hashAlgo)
  21512. break;
  21513. #else
  21514. /* Is hash algorithm stonger than last chosen? */
  21515. if (ret == 0 && hashAlgo > ssl->suites->hashAlgo)
  21516. break;
  21517. #endif
  21518. /* The chosen one - but keep looking. */
  21519. ssl->suites->hashAlgo = hashAlgo;
  21520. ssl->suites->sigAlgo = sigAlgo;
  21521. ret = 0;
  21522. break;
  21523. default:
  21524. /* Support for hash algorithm not compiled in. */
  21525. break;
  21526. }
  21527. }
  21528. return ret;
  21529. }
  21530. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  21531. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  21532. /* Initialize HandShakeInfo */
  21533. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  21534. {
  21535. int i;
  21536. info->ssl = ssl;
  21537. info->cipherName[0] = 0;
  21538. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  21539. info->packetNames[i][0] = 0;
  21540. info->numberPackets = 0;
  21541. info->negotiationError = 0;
  21542. }
  21543. /* Set Final HandShakeInfo parameters */
  21544. void FinishHandShakeInfo(HandShakeInfo* info)
  21545. {
  21546. int i;
  21547. int sz = GetCipherNamesSize();
  21548. for (i = 0; i < sz; i++) {
  21549. #ifndef NO_CIPHER_SUITE_ALIASES
  21550. if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  21551. continue;
  21552. #endif
  21553. if (info->ssl->options.cipherSuite ==
  21554. (byte)cipher_names[i].cipherSuite) {
  21555. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  21556. continue; /* ECC suites at end */
  21557. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  21558. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  21559. break;
  21560. }
  21561. }
  21562. /* error max and min are negative numbers */
  21563. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  21564. info->negotiationError = info->ssl->error;
  21565. }
  21566. /* Add name to info packet names, increase packet name count */
  21567. void AddPacketName(WOLFSSL* ssl, const char* name)
  21568. {
  21569. #ifdef WOLFSSL_CALLBACKS
  21570. HandShakeInfo* info = &ssl->handShakeInfo;
  21571. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  21572. char* packetName = info->packetNames[info->numberPackets];
  21573. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  21574. packetName[MAX_PACKETNAME_SZ] = '\0';
  21575. info->numberPackets++;
  21576. }
  21577. #endif
  21578. (void)ssl;
  21579. (void)name;
  21580. }
  21581. #ifdef WOLFSSL_CALLBACKS
  21582. /* Initialize TimeoutInfo */
  21583. void InitTimeoutInfo(TimeoutInfo* info)
  21584. {
  21585. XMEMSET(info, 0, sizeof(TimeoutInfo));
  21586. }
  21587. /* Free TimeoutInfo */
  21588. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  21589. {
  21590. int i;
  21591. (void)heap;
  21592. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  21593. if (info->packets[i].bufferValue) {
  21594. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  21595. info->packets[i].bufferValue = NULL;
  21596. }
  21597. }
  21598. }
  21599. /* Add packet name to previously added packet info */
  21600. void AddLateName(const char* name, TimeoutInfo* info)
  21601. {
  21602. /* make sure we have a valid previous one */
  21603. if (info->numberPackets > 0 && info->numberPackets <
  21604. MAX_PACKETS_HANDSHAKE) {
  21605. char* packetName = info->packets[info->numberPackets-1].packetName;
  21606. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  21607. packetName[MAX_PACKETNAME_SZ] = '\0';
  21608. }
  21609. }
  21610. /* Add record header to previously added packet info */
  21611. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  21612. {
  21613. /* make sure we have a valid previous one */
  21614. if (info->numberPackets > 0 && info->numberPackets <
  21615. MAX_PACKETS_HANDSHAKE) {
  21616. if (info->packets[info->numberPackets - 1].bufferValue)
  21617. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  21618. RECORD_HEADER_SZ);
  21619. else
  21620. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  21621. RECORD_HEADER_SZ);
  21622. }
  21623. }
  21624. #endif /* WOLFSSL_CALLBACKS */
  21625. /* Add PacketInfo to TimeoutInfo
  21626. *
  21627. * ssl WOLFSSL structure sending or receiving packet
  21628. * name name of packet being sent
  21629. * type type of packet being sent
  21630. * data data bing sent with packet
  21631. * sz size of data buffer
  21632. * written 1 if this packet is being written to wire, 0 if being read
  21633. * heap custom heap to use for mallocs/frees
  21634. */
  21635. void AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  21636. const byte* data, int sz, int written, void* heap)
  21637. {
  21638. #ifdef WOLFSSL_CALLBACKS
  21639. TimeoutInfo* info = &ssl->timeoutInfo;
  21640. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  21641. WOLFSSL_TIMEVAL currTime;
  21642. /* may add name after */
  21643. if (name) {
  21644. char* packetName = info->packets[info->numberPackets].packetName;
  21645. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  21646. packetName[MAX_PACKETNAME_SZ] = '\0';
  21647. }
  21648. /* add data, put in buffer if bigger than static buffer */
  21649. info->packets[info->numberPackets].valueSz = sz;
  21650. if (sz < MAX_VALUE_SZ)
  21651. XMEMCPY(info->packets[info->numberPackets].value, data, sz);
  21652. else {
  21653. info->packets[info->numberPackets].bufferValue =
  21654. (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_INFO);
  21655. if (!info->packets[info->numberPackets].bufferValue)
  21656. /* let next alloc catch, just don't fill, not fatal here */
  21657. info->packets[info->numberPackets].valueSz = 0;
  21658. else
  21659. XMEMCPY(info->packets[info->numberPackets].bufferValue,
  21660. data, sz);
  21661. }
  21662. gettimeofday(&currTime, 0);
  21663. info->packets[info->numberPackets].timestamp.tv_sec =
  21664. currTime.tv_sec;
  21665. info->packets[info->numberPackets].timestamp.tv_usec =
  21666. currTime.tv_usec;
  21667. info->numberPackets++;
  21668. }
  21669. #endif /* WOLFSSL_CALLBACKS */
  21670. #ifdef OPENSSL_EXTRA
  21671. if ((ssl->protoMsgCb != NULL) && (sz > RECORD_HEADER_SZ) &&
  21672. (ssl->keys.encryptionOn != 1)) {
  21673. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  21674. 4096 from 16^3 */
  21675. int version = (ssl->version.minor & 0x0F) +
  21676. ((ssl->version.minor & 0xF0) << 4) +
  21677. ((ssl->version.major & 0x0F) << 8) +
  21678. ((ssl->version.major & 0xF0) << 12);
  21679. ssl->protoMsgCb(written, version, type,
  21680. (const void *)(data + RECORD_HEADER_SZ),
  21681. (size_t)(sz - RECORD_HEADER_SZ),
  21682. ssl, ssl->protoMsgCtx);
  21683. }
  21684. #endif /* OPENSSL_EXTRA */
  21685. (void)written;
  21686. (void)name;
  21687. (void)heap;
  21688. (void)type;
  21689. (void)ssl;
  21690. }
  21691. #endif /* WOLFSSL_CALLBACKS */
  21692. #if !defined(NO_CERTS)
  21693. #if defined(WOLF_PRIVATE_KEY_ID) && !defined(NO_CHECK_PRIVATE_KEY)
  21694. /* Create a private key for a device.
  21695. *
  21696. * pkey Key object.
  21697. * data Data to identify key.
  21698. * length Length of data.
  21699. * hsType Type of the key to create.
  21700. * heap Custom heap to use for mallocs/frees
  21701. * devId Id for device.
  21702. * return 0 on success.
  21703. * return NOT_COMPILED_IN if algorithm type not supported.
  21704. * return MEMORY_E on memory allocation failure.
  21705. * return other internal error
  21706. */
  21707. int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
  21708. int label, int id, void* heap, int devId)
  21709. {
  21710. int ret = NOT_COMPILED_IN;
  21711. if (hsType == DYNAMIC_TYPE_RSA) {
  21712. #ifndef NO_RSA
  21713. RsaKey* rsaKey;
  21714. rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  21715. if (rsaKey == NULL) {
  21716. return MEMORY_E;
  21717. }
  21718. if (label) {
  21719. ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
  21720. }
  21721. else if (id) {
  21722. ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId);
  21723. }
  21724. if (ret == 0) {
  21725. *pkey = (void*)rsaKey;
  21726. }
  21727. else {
  21728. XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
  21729. }
  21730. #endif
  21731. }
  21732. else if (hsType == DYNAMIC_TYPE_ECC) {
  21733. #ifdef HAVE_ECC
  21734. ecc_key* ecKey;
  21735. ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  21736. if (ecKey == NULL) {
  21737. return MEMORY_E;
  21738. }
  21739. if (label) {
  21740. ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
  21741. }
  21742. else if (id) {
  21743. ret = wc_ecc_init_id(ecKey, data, length, heap, devId);
  21744. }
  21745. if (ret == 0) {
  21746. *pkey = (void*)ecKey;
  21747. }
  21748. else {
  21749. XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
  21750. }
  21751. #endif
  21752. }
  21753. return ret;
  21754. }
  21755. #endif /* WOLF_PRIVATE_KEY_ID && !NO_CHECK_PRIVATE_KEY */
  21756. /* Decode the private key - RSA/ECC/Ed25519/Ed448/Falcon/Dilithium - and
  21757. * creates a key object.
  21758. *
  21759. * The signature type is set as well.
  21760. * The maximum length of a signature is returned.
  21761. *
  21762. * ssl The SSL/TLS object.
  21763. * length The length of a signature.
  21764. * returns 0 on success, otherwise failure.
  21765. */
  21766. int DecodePrivateKey(WOLFSSL *ssl, word16* length)
  21767. {
  21768. int ret = BAD_FUNC_ARG;
  21769. int keySz;
  21770. word32 idx;
  21771. /* make sure private key exists */
  21772. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  21773. /* allow no private key if using external */
  21774. #ifdef WOLF_PRIVATE_KEY_ID
  21775. if (ssl->devId != INVALID_DEVID
  21776. #ifdef HAVE_PK_CALLBACKS
  21777. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  21778. #endif
  21779. ) {
  21780. *length = GetPrivateKeySigSize(ssl);
  21781. return 0;
  21782. }
  21783. else
  21784. #endif
  21785. {
  21786. WOLFSSL_MSG("Private key missing!");
  21787. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  21788. }
  21789. }
  21790. #ifdef WOLF_PRIVATE_KEY_ID
  21791. if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
  21792. ssl->buffers.keyLabel)) {
  21793. if (ssl->buffers.keyType == rsa_sa_algo)
  21794. ssl->hsType = DYNAMIC_TYPE_RSA;
  21795. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  21796. ssl->hsType = DYNAMIC_TYPE_ECC;
  21797. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21798. if (ret != 0) {
  21799. goto exit_dpk;
  21800. }
  21801. if (ssl->buffers.keyType == rsa_sa_algo) {
  21802. #ifndef NO_RSA
  21803. if (ssl->buffers.keyLabel) {
  21804. ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
  21805. (char*)ssl->buffers.key->buffer,
  21806. ssl->heap, ssl->buffers.keyDevId);
  21807. }
  21808. else if (ssl->buffers.keyId) {
  21809. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  21810. ssl->buffers.key->buffer,
  21811. ssl->buffers.key->length, ssl->heap,
  21812. ssl->buffers.keyDevId);
  21813. }
  21814. if (ret == 0) {
  21815. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  21816. WOLFSSL_MSG("RSA key size too small");
  21817. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  21818. }
  21819. /* Return the maximum signature length. */
  21820. *length = (word16)ssl->buffers.keySz;
  21821. }
  21822. #else
  21823. ret = NOT_COMPILED_IN;
  21824. #endif
  21825. }
  21826. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  21827. #ifdef HAVE_ECC
  21828. if (ssl->buffers.keyLabel) {
  21829. ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
  21830. (char*)ssl->buffers.key->buffer,
  21831. ssl->heap, ssl->buffers.keyDevId);
  21832. }
  21833. else if (ssl->buffers.keyId) {
  21834. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
  21835. ssl->buffers.key->buffer,
  21836. ssl->buffers.key->length, ssl->heap,
  21837. ssl->buffers.keyDevId);
  21838. }
  21839. if (ret == 0) {
  21840. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  21841. WOLFSSL_MSG("ECC key size too small");
  21842. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  21843. }
  21844. /* Return the maximum signature length. */
  21845. *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz);
  21846. }
  21847. #else
  21848. ret = NOT_COMPILED_IN;
  21849. #endif
  21850. }
  21851. goto exit_dpk;
  21852. }
  21853. #endif /* WOLF_PRIVATE_KEY_ID */
  21854. #ifndef NO_RSA
  21855. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  21856. ssl->hsType = DYNAMIC_TYPE_RSA;
  21857. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21858. if (ret != 0) {
  21859. goto exit_dpk;
  21860. }
  21861. WOLFSSL_MSG("Trying RSA private key");
  21862. /* Set start of data to beginning of buffer. */
  21863. idx = 0;
  21864. /* Decode the key assuming it is an RSA private key. */
  21865. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  21866. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  21867. #ifdef WOLF_PRIVATE_KEY_ID
  21868. /* if using external key then allow using a public key */
  21869. if (ret != 0 && (ssl->devId != INVALID_DEVID
  21870. #ifdef HAVE_PK_CALLBACKS
  21871. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  21872. #endif
  21873. )) {
  21874. WOLFSSL_MSG("Trying RSA public key with crypto callbacks");
  21875. idx = 0;
  21876. ret = wc_RsaPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  21877. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  21878. }
  21879. #endif
  21880. if (ret == 0) {
  21881. WOLFSSL_MSG("Using RSA private key");
  21882. /* It worked so check it meets minimum key size requirements. */
  21883. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  21884. if (keySz < 0) { /* check if keySz has error case */
  21885. ERROR_OUT(keySz, exit_dpk);
  21886. }
  21887. if (keySz < ssl->options.minRsaKeySz) {
  21888. WOLFSSL_MSG("RSA key size too small");
  21889. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  21890. }
  21891. /* Return the maximum signature length. */
  21892. *length = (word16)keySz;
  21893. goto exit_dpk;
  21894. }
  21895. }
  21896. #endif /* !NO_RSA */
  21897. #ifdef HAVE_ECC
  21898. #ifndef NO_RSA
  21899. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  21900. #endif /* !NO_RSA */
  21901. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0) {
  21902. ssl->hsType = DYNAMIC_TYPE_ECC;
  21903. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21904. if (ret != 0) {
  21905. goto exit_dpk;
  21906. }
  21907. #ifndef NO_RSA
  21908. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  21909. #else
  21910. WOLFSSL_MSG("Trying ECC private key");
  21911. #endif
  21912. /* Set start of data to beginning of buffer. */
  21913. idx = 0;
  21914. /* Decode the key assuming it is an ECC private key. */
  21915. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  21916. (ecc_key*)ssl->hsKey,
  21917. ssl->buffers.key->length);
  21918. #ifdef WOLF_PRIVATE_KEY_ID
  21919. /* if using external key then allow using a public key */
  21920. if (ret != 0 && (ssl->devId != INVALID_DEVID
  21921. #ifdef HAVE_PK_CALLBACKS
  21922. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  21923. #endif
  21924. )) {
  21925. WOLFSSL_MSG("Trying ECC public key with crypto callbacks");
  21926. idx = 0;
  21927. ret = wc_EccPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  21928. (ecc_key*)ssl->hsKey,
  21929. ssl->buffers.key->length);
  21930. }
  21931. #endif
  21932. if (ret == 0) {
  21933. WOLFSSL_MSG("Using ECC private key");
  21934. /* Check it meets the minimum ECC key size requirements. */
  21935. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  21936. if (keySz < ssl->options.minEccKeySz) {
  21937. WOLFSSL_MSG("ECC key size too small");
  21938. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  21939. }
  21940. /* Return the maximum signature length. */
  21941. *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  21942. goto exit_dpk;
  21943. }
  21944. }
  21945. #endif
  21946. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  21947. #if !defined(NO_RSA) || defined(HAVE_ECC)
  21948. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  21949. #endif
  21950. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  21951. ssl->hsType = DYNAMIC_TYPE_ED25519;
  21952. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  21953. if (ret != 0) {
  21954. goto exit_dpk;
  21955. }
  21956. #ifdef HAVE_ECC
  21957. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  21958. #elif !defined(NO_RSA)
  21959. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  21960. #else
  21961. WOLFSSL_MSG("Trying ED25519 private key");
  21962. #endif
  21963. /* Set start of data to beginning of buffer. */
  21964. idx = 0;
  21965. /* Decode the key assuming it is an ED25519 private key. */
  21966. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  21967. (ed25519_key*)ssl->hsKey,
  21968. ssl->buffers.key->length);
  21969. #ifdef WOLF_PRIVATE_KEY_ID
  21970. /* if using external key then allow using a public key */
  21971. if (ret != 0 && (ssl->devId != INVALID_DEVID
  21972. #ifdef HAVE_PK_CALLBACKS
  21973. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  21974. #endif
  21975. )) {
  21976. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  21977. idx = 0;
  21978. ret = wc_Ed25519PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  21979. (ed25519_key*)ssl->hsKey,
  21980. ssl->buffers.key->length);
  21981. }
  21982. #endif
  21983. if (ret == 0) {
  21984. WOLFSSL_MSG("Using ED25519 private key");
  21985. /* Check it meets the minimum ECC key size requirements. */
  21986. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  21987. WOLFSSL_MSG("ED25519 key size too small");
  21988. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  21989. }
  21990. /* Return the maximum signature length. */
  21991. *length = ED25519_SIG_SIZE;
  21992. goto exit_dpk;
  21993. }
  21994. }
  21995. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  21996. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  21997. #if !defined(NO_RSA) || defined(HAVE_ECC)
  21998. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  21999. #endif
  22000. if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
  22001. ssl->hsType = DYNAMIC_TYPE_ED448;
  22002. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22003. if (ret != 0) {
  22004. goto exit_dpk;
  22005. }
  22006. #ifdef HAVE_ED25519
  22007. WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
  22008. #elif defined(HAVE_ECC)
  22009. WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
  22010. #elif !defined(NO_RSA)
  22011. WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
  22012. #else
  22013. WOLFSSL_MSG("Trying ED448 private key");
  22014. #endif
  22015. /* Set start of data to beginning of buffer. */
  22016. idx = 0;
  22017. /* Decode the key assuming it is an ED448 private key. */
  22018. ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  22019. (ed448_key*)ssl->hsKey,
  22020. ssl->buffers.key->length);
  22021. #ifdef WOLF_PRIVATE_KEY_ID
  22022. /* if using external key then allow using a public key */
  22023. if (ret != 0 && (ssl->devId != INVALID_DEVID
  22024. #ifdef HAVE_PK_CALLBACKS
  22025. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  22026. #endif
  22027. )) {
  22028. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  22029. idx = 0;
  22030. ret = wc_Ed448PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  22031. (ed448_key*)ssl->hsKey,
  22032. ssl->buffers.key->length);
  22033. }
  22034. #endif
  22035. if (ret == 0) {
  22036. WOLFSSL_MSG("Using ED448 private key");
  22037. /* Check it meets the minimum ECC key size requirements. */
  22038. if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  22039. WOLFSSL_MSG("ED448 key size too small");
  22040. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  22041. }
  22042. /* Return the maximum signature length. */
  22043. *length = ED448_SIG_SIZE;
  22044. goto exit_dpk;
  22045. }
  22046. }
  22047. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  22048. #if defined(HAVE_PQC)
  22049. #if defined(HAVE_FALCON)
  22050. if (ssl->buffers.keyType == falcon_level1_sa_algo ||
  22051. ssl->buffers.keyType == falcon_level5_sa_algo ||
  22052. ssl->buffers.keyType == 0) {
  22053. ssl->hsType = DYNAMIC_TYPE_FALCON;
  22054. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22055. if (ret != 0) {
  22056. goto exit_dpk;
  22057. }
  22058. if (ssl->buffers.keyType == falcon_level1_sa_algo) {
  22059. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 1);
  22060. }
  22061. else if (ssl->buffers.keyType == falcon_level5_sa_algo) {
  22062. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 5);
  22063. }
  22064. else {
  22065. /* What if ssl->buffers.keyType is 0? We might want to do something
  22066. * more graceful here. */
  22067. ret = ALGO_ID_E;
  22068. }
  22069. if (ret != 0) {
  22070. goto exit_dpk;
  22071. }
  22072. #if defined(HAVE_ED448)
  22073. WOLFSSL_MSG("Trying Falcon private key, ED448 didn't work");
  22074. #elif defined(HAVE_ED25519)
  22075. WOLFSSL_MSG("Trying Falcon private key, ED25519 didn't work");
  22076. #elif defined(HAVE_ECC)
  22077. WOLFSSL_MSG("Trying Falcon private key, ECC didn't work");
  22078. #elif !defined(NO_RSA)
  22079. WOLFSSL_MSG("Trying Falcon private key, RSA didn't work");
  22080. #else
  22081. WOLFSSL_MSG("Trying Falcon private key");
  22082. #endif
  22083. /* Set start of data to beginning of buffer. */
  22084. idx = 0;
  22085. /* Decode the key assuming it is a Falcon private key. */
  22086. ret = wc_falcon_import_private_only(ssl->buffers.key->buffer,
  22087. ssl->buffers.key->length,
  22088. (falcon_key*)ssl->hsKey);
  22089. if (ret == 0) {
  22090. WOLFSSL_MSG("Using Falcon private key");
  22091. /* Check it meets the minimum Falcon key size requirements. */
  22092. if (FALCON_MAX_KEY_SIZE < ssl->options.minFalconKeySz) {
  22093. WOLFSSL_MSG("Falcon key size too small");
  22094. ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk);
  22095. }
  22096. /* Return the maximum signature length. */
  22097. *length = FALCON_MAX_SIG_SIZE;
  22098. goto exit_dpk;
  22099. }
  22100. }
  22101. #endif /* HAVE_FALCON */
  22102. #if defined(HAVE_DILITHIUM)
  22103. if (ssl->buffers.keyType == dilithium_level2_sa_algo ||
  22104. ssl->buffers.keyType == dilithium_level3_sa_algo ||
  22105. ssl->buffers.keyType == dilithium_level5_sa_algo ||
  22106. ssl->buffers.keyType == dilithium_aes_level2_sa_algo ||
  22107. ssl->buffers.keyType == dilithium_aes_level3_sa_algo ||
  22108. ssl->buffers.keyType == dilithium_aes_level5_sa_algo ||
  22109. ssl->buffers.keyType == 0) {
  22110. ssl->hsType = DYNAMIC_TYPE_DILITHIUM;
  22111. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22112. if (ret != 0) {
  22113. goto exit_dpk;
  22114. }
  22115. if (ssl->buffers.keyType == dilithium_level2_sa_algo) {
  22116. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22117. 2, SHAKE_VARIANT);
  22118. }
  22119. else if (ssl->buffers.keyType == dilithium_level3_sa_algo) {
  22120. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22121. 3, SHAKE_VARIANT);
  22122. }
  22123. else if (ssl->buffers.keyType == dilithium_level5_sa_algo) {
  22124. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22125. 5, SHAKE_VARIANT);
  22126. }
  22127. else if (ssl->buffers.keyType == dilithium_aes_level2_sa_algo) {
  22128. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22129. 2, AES_VARIANT);
  22130. }
  22131. else if (ssl->buffers.keyType == dilithium_aes_level3_sa_algo) {
  22132. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22133. 3, AES_VARIANT);
  22134. }
  22135. else if (ssl->buffers.keyType == dilithium_aes_level5_sa_algo) {
  22136. ret = wc_dilithium_set_level_and_sym((dilithium_key*)ssl->hsKey,
  22137. 5, AES_VARIANT);
  22138. }
  22139. else {
  22140. /* What if ssl->buffers.keyType is 0? We might want to do something
  22141. * more graceful here. */
  22142. ret = ALGO_ID_E;
  22143. }
  22144. if (ret != 0) {
  22145. goto exit_dpk;
  22146. }
  22147. #if defined(HAVE_ED448)
  22148. WOLFSSL_MSG("Trying Dilithium private key, ED448 didn't work");
  22149. #elif defined(HAVE_ED25519)
  22150. WOLFSSL_MSG("Trying Dilithium private key, ED25519 didn't work");
  22151. #elif defined(HAVE_ECC)
  22152. WOLFSSL_MSG("Trying Dilithium private key, ECC didn't work");
  22153. #elif !defined(NO_RSA)
  22154. WOLFSSL_MSG("Trying Dilithium private key, RSA didn't work");
  22155. #elif defined(HAVE_FALCON)
  22156. WOLFSSL_MSG("Trying Dilithium private key, Falcon didn't work");
  22157. #else
  22158. WOLFSSL_MSG("Trying Dilithium private key");
  22159. #endif
  22160. /* Set start of data to beginning of buffer. */
  22161. idx = 0;
  22162. /* Decode the key assuming it is a Dilithium private key. */
  22163. ret = wc_dilithium_import_private_only(ssl->buffers.key->buffer,
  22164. ssl->buffers.key->length,
  22165. (dilithium_key*)ssl->hsKey);
  22166. if (ret == 0) {
  22167. WOLFSSL_MSG("Using Dilithium private key");
  22168. /* Check it meets the minimum Dilithium key size requirements. */
  22169. if (DILITHIUM_MAX_KEY_SIZE < ssl->options.minDilithiumKeySz) {
  22170. WOLFSSL_MSG("Dilithium key size too small");
  22171. ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk);
  22172. }
  22173. /* Return the maximum signature length. */
  22174. *length = DILITHIUM_MAX_SIG_SIZE;
  22175. goto exit_dpk;
  22176. }
  22177. }
  22178. #endif /* HAVE_DILITHIUM */
  22179. #endif /* HAVE_PQC */
  22180. (void)idx;
  22181. (void)keySz;
  22182. (void)length;
  22183. exit_dpk:
  22184. if (ret != 0) {
  22185. WOLFSSL_ERROR_VERBOSE(ret);
  22186. }
  22187. return ret;
  22188. }
  22189. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  22190. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  22191. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  22192. int TLSv1_3_Capable(WOLFSSL* ssl)
  22193. {
  22194. #ifndef WOLFSSL_TLS13
  22195. return 0;
  22196. #else
  22197. int ret = 0;
  22198. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  22199. ret = 1;
  22200. }
  22201. if ((wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_3)) {
  22202. /* option set at run time to disable TLS 1.3 */
  22203. ret = 0;
  22204. }
  22205. return ret;
  22206. #endif
  22207. }
  22208. #endif /* WOLFSSL_TLS13 */
  22209. #ifndef WOLFSSL_NO_TLS12
  22210. #if (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC) || \
  22211. defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))) || \
  22212. (!defined(NO_WOLFSSL_SERVER) && (defined(HAVE_ECC) || \
  22213. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  22214. (defined(HAVE_ED25519) || defined(HAVE_ED448) || !defined(NO_RSA)))) || \
  22215. (!defined(NO_DH) && (!defined(NO_RSA) || defined(HAVE_ANON))))
  22216. static int HashSkeData(WOLFSSL* ssl, enum wc_HashType hashType,
  22217. const byte* data, int sz, byte sigAlgo)
  22218. {
  22219. int ret = 0;
  22220. int digest_sz = wc_HashGetDigestSize(hashType);
  22221. if (digest_sz <= 0) {
  22222. ret = BUFFER_ERROR;
  22223. }
  22224. if (ret == 0) {
  22225. /* buffer for signature */
  22226. ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + sz, ssl->heap,
  22227. DYNAMIC_TYPE_SIGNATURE);
  22228. if (ssl->buffers.sig.buffer == NULL) {
  22229. ret = MEMORY_E;
  22230. }
  22231. }
  22232. if (ret == 0) {
  22233. ssl->buffers.sig.length = SEED_LEN + sz;
  22234. /* build message to hash */
  22235. XMEMCPY(ssl->buffers.sig.buffer, ssl->arrays->clientRandom, RAN_LEN);
  22236. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN], ssl->arrays->serverRandom,
  22237. RAN_LEN);
  22238. /* message */
  22239. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2], data, sz);
  22240. }
  22241. if (ret == 0 && sigAlgo != ed25519_sa_algo && sigAlgo != ed448_sa_algo) {
  22242. ssl->buffers.digest.length = (unsigned int)digest_sz;
  22243. /* buffer for hash */
  22244. ssl->buffers.digest.buffer = (byte*)XMALLOC(ssl->buffers.digest.length,
  22245. ssl->heap, DYNAMIC_TYPE_DIGEST);
  22246. if (ssl->buffers.digest.buffer == NULL) {
  22247. ret = MEMORY_E;
  22248. }
  22249. }
  22250. if (ret == 0 && sigAlgo != ed25519_sa_algo && sigAlgo != ed448_sa_algo) {
  22251. /* Perform hash. Only wc_Hash supports MD5_SHA1. */
  22252. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  22253. ssl->buffers.sig.length,
  22254. ssl->buffers.digest.buffer,
  22255. ssl->buffers.digest.length);
  22256. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22257. ssl->buffers.sig.buffer = NULL;
  22258. }
  22259. return ret;
  22260. }
  22261. #endif
  22262. #endif /* !WOLFSSL_NO_TLS12 */
  22263. /* client only parts */
  22264. #ifndef NO_WOLFSSL_CLIENT
  22265. #ifndef WOLFSSL_NO_TLS12
  22266. /* handle generation of client_hello (1) */
  22267. int SendClientHello(WOLFSSL* ssl)
  22268. {
  22269. byte *output;
  22270. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  22271. int sendSz;
  22272. int idSz;
  22273. int ret;
  22274. word16 extSz = 0;
  22275. if (ssl == NULL) {
  22276. return BAD_FUNC_ARG;
  22277. }
  22278. idSz = ssl->options.resuming ? ssl->session->sessionIDSz : 0;
  22279. #ifdef WOLFSSL_TLS13
  22280. if (IsAtLeastTLSv1_3(ssl->version))
  22281. return SendTls13ClientHello(ssl);
  22282. #endif
  22283. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  22284. WOLFSSL_ENTER("SendClientHello");
  22285. if (ssl->suites == NULL) {
  22286. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  22287. return SUITES_ERROR;
  22288. }
  22289. #ifdef HAVE_SESSION_TICKET
  22290. if (ssl->options.resuming && ssl->session->ticketLen > 0) {
  22291. SessionTicket* ticket;
  22292. ticket = TLSX_SessionTicket_Create(0, ssl->session->ticket,
  22293. ssl->session->ticketLen, ssl->heap);
  22294. if (ticket == NULL) return MEMORY_E;
  22295. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  22296. if (ret != WOLFSSL_SUCCESS) {
  22297. TLSX_SessionTicket_Free(ticket, ssl->heap);
  22298. return ret;
  22299. }
  22300. idSz = 0;
  22301. }
  22302. #endif
  22303. length = VERSION_SZ + RAN_LEN
  22304. + idSz + ENUM_LEN
  22305. + ssl->suites->suiteSz + SUITE_LEN
  22306. + COMP_LEN + ENUM_LEN;
  22307. #ifdef HAVE_TLS_EXTENSIONS
  22308. /* auto populate extensions supported unless user defined */
  22309. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  22310. return ret;
  22311. extSz = 0;
  22312. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  22313. if (ret != 0)
  22314. return ret;
  22315. length += extSz;
  22316. #else
  22317. if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
  22318. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  22319. + ssl->suites->hashSigAlgoSz;
  22320. #ifdef HAVE_EXTENDED_MASTER
  22321. if (ssl->options.haveEMS)
  22322. extSz += HELLO_EXT_SZ;
  22323. #endif
  22324. if (extSz != 0)
  22325. length += extSz + HELLO_EXT_SZ_SZ;
  22326. #endif
  22327. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  22328. if (ssl->arrays == NULL) {
  22329. return BAD_FUNC_ARG;
  22330. }
  22331. #ifdef WOLFSSL_DTLS
  22332. if (ssl->options.dtls) {
  22333. length += ENUM_LEN; /* cookie */
  22334. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  22335. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  22336. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  22337. }
  22338. #endif
  22339. if (IsEncryptionOn(ssl, 1))
  22340. sendSz += MAX_MSG_EXTRA;
  22341. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  22342. * is not advanced yet */
  22343. ssl->options.buildingMsg = 1;
  22344. /* check for available size */
  22345. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  22346. return ret;
  22347. /* get output buffer */
  22348. output = ssl->buffers.outputBuffer.buffer +
  22349. ssl->buffers.outputBuffer.length;
  22350. AddHeaders(output, length, client_hello, ssl);
  22351. /* client hello, first version */
  22352. output[idx++] = ssl->version.major;
  22353. output[idx++] = ssl->version.minor;
  22354. ssl->chVersion = ssl->version; /* store in case changed */
  22355. /* then random */
  22356. if (ssl->options.connectState == CONNECT_BEGIN) {
  22357. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  22358. if (ret != 0)
  22359. return ret;
  22360. /* store random */
  22361. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  22362. } else {
  22363. #ifdef WOLFSSL_DTLS
  22364. /* send same random on hello again */
  22365. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  22366. #endif
  22367. }
  22368. idx += RAN_LEN;
  22369. /* then session id */
  22370. output[idx++] = (byte)idSz;
  22371. if (idSz) {
  22372. XMEMCPY(output + idx, ssl->session->sessionID,
  22373. ssl->session->sessionIDSz);
  22374. idx += ssl->session->sessionIDSz;
  22375. }
  22376. /* then DTLS cookie */
  22377. #ifdef WOLFSSL_DTLS
  22378. if (ssl->options.dtls) {
  22379. byte cookieSz = ssl->arrays->cookieSz;
  22380. output[idx++] = cookieSz;
  22381. if (cookieSz) {
  22382. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  22383. idx += cookieSz;
  22384. }
  22385. }
  22386. #endif
  22387. /* then cipher suites */
  22388. c16toa(ssl->suites->suiteSz, output + idx);
  22389. idx += OPAQUE16_LEN;
  22390. XMEMCPY(output + idx, &ssl->suites->suites, ssl->suites->suiteSz);
  22391. idx += ssl->suites->suiteSz;
  22392. /* last, compression */
  22393. output[idx++] = COMP_LEN;
  22394. if (ssl->options.usingCompression)
  22395. output[idx++] = ZLIB_COMPRESSION;
  22396. else
  22397. output[idx++] = NO_COMPRESSION;
  22398. #ifdef HAVE_TLS_EXTENSIONS
  22399. extSz = 0;
  22400. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  22401. if (ret != 0)
  22402. return ret;
  22403. idx += extSz;
  22404. (void)idx; /* suppress analyzer warning, keep idx current */
  22405. #else
  22406. if (extSz != 0) {
  22407. c16toa(extSz, output + idx);
  22408. idx += HELLO_EXT_SZ_SZ;
  22409. if (IsAtLeastTLSv1_2(ssl)) {
  22410. if (ssl->suites->hashSigAlgoSz) {
  22411. word16 i;
  22412. /* extension type */
  22413. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  22414. idx += HELLO_EXT_TYPE_SZ;
  22415. /* extension data length */
  22416. c16toa(HELLO_EXT_SIGALGO_SZ + ssl->suites->hashSigAlgoSz,
  22417. output + idx);
  22418. idx += HELLO_EXT_SZ_SZ;
  22419. /* sig algos length */
  22420. c16toa(ssl->suites->hashSigAlgoSz, output + idx);
  22421. idx += HELLO_EXT_SIGALGO_SZ;
  22422. for (i=0; i < ssl->suites->hashSigAlgoSz; i++, idx++) {
  22423. output[idx] = ssl->suites->hashSigAlgo[i];
  22424. }
  22425. }
  22426. }
  22427. #ifdef HAVE_EXTENDED_MASTER
  22428. if (ssl->options.haveEMS) {
  22429. c16toa(HELLO_EXT_EXTMS, output + idx);
  22430. idx += HELLO_EXT_TYPE_SZ;
  22431. c16toa(0, output + idx);
  22432. idx += HELLO_EXT_SZ_SZ;
  22433. }
  22434. #endif
  22435. }
  22436. #endif
  22437. if (IsEncryptionOn(ssl, 1)) {
  22438. byte* input;
  22439. int inputSz = idx; /* build msg adds rec hdr */
  22440. int recordHeaderSz = RECORD_HEADER_SZ;
  22441. if (ssl->options.dtls)
  22442. recordHeaderSz += DTLS_RECORD_EXTRA;
  22443. inputSz -= recordHeaderSz;
  22444. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22445. if (input == NULL)
  22446. return MEMORY_E;
  22447. XMEMCPY(input, output + recordHeaderSz, inputSz);
  22448. #ifdef WOLFSSL_DTLS
  22449. if (IsDtlsNotSctpMode(ssl) &&
  22450. (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
  22451. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22452. return ret;
  22453. }
  22454. #endif
  22455. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  22456. handshake, 1, 0, 0, CUR_ORDER);
  22457. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22458. if (sendSz < 0)
  22459. return sendSz;
  22460. } else {
  22461. #ifdef WOLFSSL_DTLS
  22462. if (IsDtlsNotSctpMode(ssl)) {
  22463. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
  22464. return ret;
  22465. }
  22466. if (ssl->options.dtls)
  22467. DtlsSEQIncrement(ssl, CUR_ORDER);
  22468. #endif
  22469. ret = HashOutput(ssl, output, sendSz, 0);
  22470. if (ret != 0)
  22471. return ret;
  22472. }
  22473. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  22474. #ifdef OPENSSL_EXTRA
  22475. ssl->cbmode = SSL_CB_MODE_WRITE;
  22476. if (ssl->CBIS != NULL)
  22477. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  22478. #endif
  22479. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  22480. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  22481. if (ssl->toInfoOn)
  22482. AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  22483. WRITE_PROTO, ssl->heap);
  22484. #endif
  22485. ssl->options.buildingMsg = 0;
  22486. ssl->buffers.outputBuffer.length += sendSz;
  22487. ret = SendBuffered(ssl);
  22488. WOLFSSL_LEAVE("SendClientHello", ret);
  22489. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  22490. return ret;
  22491. }
  22492. /* handle processing of DTLS hello_verify_request (3) */
  22493. int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  22494. word32 size)
  22495. {
  22496. ProtocolVersion pv;
  22497. byte cookieSz;
  22498. word32 begin = *inOutIdx;
  22499. #ifdef WOLFSSL_CALLBACKS
  22500. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  22501. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  22502. #endif
  22503. #ifdef WOLFSSL_DTLS
  22504. if (ssl->options.dtls) {
  22505. DtlsMsgPoolReset(ssl);
  22506. }
  22507. #endif
  22508. if (OPAQUE16_LEN + OPAQUE8_LEN > size)
  22509. return BUFFER_ERROR;
  22510. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  22511. *inOutIdx += OPAQUE16_LEN;
  22512. if (pv.major != DTLS_MAJOR ||
  22513. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  22514. return VERSION_ERROR;
  22515. cookieSz = input[(*inOutIdx)++];
  22516. if (cookieSz) {
  22517. if ((*inOutIdx - begin) + cookieSz > size)
  22518. return BUFFER_ERROR;
  22519. #ifdef WOLFSSL_DTLS
  22520. if (cookieSz <= MAX_COOKIE_LEN) {
  22521. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  22522. ssl->arrays->cookieSz = cookieSz;
  22523. }
  22524. #endif
  22525. *inOutIdx += cookieSz;
  22526. }
  22527. #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13)
  22528. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.dtls) {
  22529. /* we sent a TLSv1.3 ClientHello but received a
  22530. * HELLO_VERIFY_REQUEST */
  22531. if (!ssl->options.downgrade ||
  22532. ssl->options.minDowngrade < pv.minor)
  22533. return VERSION_ERROR;
  22534. }
  22535. #endif /* defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13) */
  22536. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  22537. return 0;
  22538. }
  22539. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  22540. {
  22541. int ret = 0;
  22542. #ifdef HAVE_SECRET_CALLBACK
  22543. /* If a session secret callback exists, we are using that
  22544. * key instead of the saved session key. Requires a ticket. */
  22545. ret = ret || (ssl->sessionSecretCb != NULL
  22546. #ifdef HAVE_SESSION_TICKET
  22547. && ssl->session->ticketLen > 0
  22548. #endif
  22549. );
  22550. #endif
  22551. #ifdef HAVE_SESSION_TICKET
  22552. /* server may send blank ticket which may not be expected to indicate
  22553. * existing one ok but will also be sending a new one */
  22554. ret = ret || (ssl->session->ticketLen > 0);
  22555. #endif
  22556. ret = ret ||
  22557. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  22558. ssl->session->sessionID, ID_LEN) == 0);
  22559. return ret;
  22560. }
  22561. /* Check the version in the received message is valid and set protocol
  22562. * version to use.
  22563. *
  22564. * ssl The SSL/TLS object.
  22565. * pv The protocol version from the packet.
  22566. * returns 0 on success, otherwise failure.
  22567. */
  22568. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  22569. {
  22570. byte lowerVersion, higherVersion;
  22571. #ifdef WOLFSSL_TLS13_DRAFT
  22572. if (pv.major == TLS_DRAFT_MAJOR) {
  22573. pv.major = SSLv3_MAJOR;
  22574. pv.minor = TLSv1_3_MINOR;
  22575. }
  22576. #endif
  22577. #ifdef OPENSSL_EXTRA
  22578. if (ssl->CBIS != NULL) {
  22579. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, SSL_SUCCESS);
  22580. }
  22581. #endif
  22582. if (ssl->options.dtls) {
  22583. if (pv.major != DTLS_MAJOR || pv.minor == DTLS_BOGUS_MINOR) {
  22584. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22585. return VERSION_ERROR;
  22586. }
  22587. lowerVersion = pv.minor > ssl->version.minor;
  22588. higherVersion = pv.minor < ssl->version.minor;
  22589. }
  22590. else {
  22591. if (pv.major != SSLv3_MAJOR) {
  22592. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22593. return VERSION_ERROR;
  22594. }
  22595. lowerVersion = pv.minor < ssl->version.minor;
  22596. higherVersion = pv.minor > ssl->version.minor;
  22597. }
  22598. if (higherVersion) {
  22599. WOLFSSL_MSG("Server using higher version, fatal error");
  22600. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22601. return VERSION_ERROR;
  22602. }
  22603. if (lowerVersion) {
  22604. WOLFSSL_MSG("server using lower version");
  22605. /* Check for downgrade attack. */
  22606. if (!ssl->options.downgrade) {
  22607. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  22608. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22609. return VERSION_ERROR;
  22610. }
  22611. if ((!ssl->options.dtls && pv.minor < ssl->options.minDowngrade) ||
  22612. (ssl->options.dtls && pv.minor > ssl->options.minDowngrade)) {
  22613. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  22614. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22615. return VERSION_ERROR;
  22616. }
  22617. #ifdef HAVE_SECURE_RENEGOTIATION
  22618. if (ssl->secure_renegotiation &&
  22619. ssl->secure_renegotiation->enabled &&
  22620. ssl->options.handShakeDone) {
  22621. WOLFSSL_MSG("Server changed version during scr");
  22622. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22623. return VERSION_ERROR;
  22624. }
  22625. #endif
  22626. /* Checks made - OK to downgrade. */
  22627. ssl->version.minor = pv.minor;
  22628. switch(pv.minor) {
  22629. case SSLv3_MINOR:
  22630. /* turn off tls */
  22631. WOLFSSL_MSG("\tdowngrading to SSLv3");
  22632. ssl->options.tls = 0;
  22633. ssl->options.tls1_1 = 0;
  22634. break;
  22635. case TLSv1_MINOR:
  22636. /* turn off tls 1.1+ */
  22637. WOLFSSL_MSG("\tdowngrading to TLSv1");
  22638. ssl->options.tls1_1 = 0;
  22639. break;
  22640. case TLSv1_1_MINOR:
  22641. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  22642. break;
  22643. case DTLS_MINOR:
  22644. WOLFSSL_MSG("\tdowngrading to DTLSv1.1");
  22645. break;
  22646. case TLSv1_2_MINOR:
  22647. WOLFSSL_MSG("\tdowngrading to TLSv1.2");
  22648. break;
  22649. case DTLSv1_2_MINOR:
  22650. WOLFSSL_MSG("\tdowngrading to DTLSv1.2");
  22651. break;
  22652. default:
  22653. WOLFSSL_MSG("\tbad minor version");
  22654. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22655. return VERSION_ERROR;
  22656. }
  22657. }
  22658. /* check if option is set to not allow the current version
  22659. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  22660. if (!ssl->options.dtls && ssl->options.downgrade &&
  22661. ssl->options.mask > 0) {
  22662. if (ssl->version.minor == TLSv1_2_MINOR &&
  22663. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
  22664. WOLFSSL_OP_NO_TLSv1_2) {
  22665. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  22666. ssl->version.minor = TLSv1_1_MINOR;
  22667. }
  22668. if (ssl->version.minor == TLSv1_1_MINOR &&
  22669. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
  22670. WOLFSSL_OP_NO_TLSv1_1) {
  22671. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  22672. ssl->options.tls1_1 = 0;
  22673. ssl->version.minor = TLSv1_MINOR;
  22674. }
  22675. if (ssl->version.minor == TLSv1_MINOR &&
  22676. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
  22677. WOLFSSL_OP_NO_TLSv1) {
  22678. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  22679. ssl->options.tls = 0;
  22680. ssl->options.tls1_1 = 0;
  22681. ssl->version.minor = SSLv3_MINOR;
  22682. }
  22683. if (ssl->version.minor == SSLv3_MINOR &&
  22684. (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
  22685. WOLFSSL_OP_NO_SSLv3) {
  22686. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  22687. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22688. return VERSION_ERROR;
  22689. }
  22690. if (ssl->version.minor < ssl->options.minDowngrade) {
  22691. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  22692. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22693. return VERSION_ERROR;
  22694. }
  22695. }
  22696. return 0;
  22697. }
  22698. /* handle processing of server_hello (2) */
  22699. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  22700. word32 helloSz)
  22701. {
  22702. byte cs0; /* cipher suite bytes 0, 1 */
  22703. byte cs1;
  22704. ProtocolVersion pv;
  22705. byte compression;
  22706. word32 i = *inOutIdx;
  22707. word32 begin = i;
  22708. int ret;
  22709. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  22710. WOLFSSL_ENTER("DoServerHello");
  22711. #ifdef WOLFSSL_CALLBACKS
  22712. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  22713. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  22714. #endif
  22715. /* protocol version, random and session id length check */
  22716. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  22717. return BUFFER_ERROR;
  22718. /* protocol version */
  22719. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  22720. i += OPAQUE16_LEN;
  22721. ret = CheckVersion(ssl, pv);
  22722. if (ret != 0)
  22723. return ret;
  22724. #ifdef WOLFSSL_TLS13
  22725. if (IsAtLeastTLSv1_3(pv)) {
  22726. byte type = server_hello;
  22727. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  22728. }
  22729. #endif
  22730. /* random */
  22731. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  22732. i += RAN_LEN;
  22733. /* session id */
  22734. ssl->arrays->sessionIDSz = input[i++];
  22735. if (ssl->arrays->sessionIDSz > ID_LEN) {
  22736. WOLFSSL_MSG("Invalid session ID size");
  22737. ssl->arrays->sessionIDSz = 0;
  22738. return BUFFER_ERROR;
  22739. }
  22740. else if (ssl->arrays->sessionIDSz) {
  22741. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  22742. return BUFFER_ERROR;
  22743. XMEMCPY(ssl->arrays->sessionID, input + i,
  22744. ssl->arrays->sessionIDSz);
  22745. i += ssl->arrays->sessionIDSz;
  22746. ssl->options.haveSessionId = 1;
  22747. }
  22748. /* suite and compression */
  22749. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  22750. return BUFFER_ERROR;
  22751. cs0 = input[i++];
  22752. cs1 = input[i++];
  22753. #ifdef HAVE_SECURE_RENEGOTIATION
  22754. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  22755. ssl->options.handShakeDone) {
  22756. if (ssl->options.cipherSuite0 != cs0 ||
  22757. ssl->options.cipherSuite != cs1) {
  22758. WOLFSSL_MSG("Server changed cipher suite during scr");
  22759. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  22760. return MATCH_SUITE_ERROR;
  22761. }
  22762. }
  22763. #endif
  22764. ssl->options.cipherSuite0 = cs0;
  22765. ssl->options.cipherSuite = cs1;
  22766. #ifdef WOLFSSL_DEBUG_TLS
  22767. WOLFSSL_MSG("Chosen cipher suite:");
  22768. WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
  22769. ssl->options.cipherSuite));
  22770. #endif
  22771. compression = input[i++];
  22772. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  22773. {
  22774. word32 idx, found = 0;
  22775. /* confirm server_hello cipher suite is one sent in client_hello */
  22776. for (idx = 0; idx < ssl->suites->suiteSz; idx += 2) {
  22777. if (ssl->suites->suites[idx] == cs0 &&
  22778. ssl->suites->suites[idx+1] == cs1) {
  22779. found = 1;
  22780. break;
  22781. }
  22782. }
  22783. if (!found) {
  22784. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  22785. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  22786. return MATCH_SUITE_ERROR;
  22787. }
  22788. }
  22789. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  22790. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  22791. WOLFSSL_MSG("Server forcing compression w/o support");
  22792. WOLFSSL_ERROR_VERBOSE(COMPRESSION_ERROR);
  22793. return COMPRESSION_ERROR;
  22794. }
  22795. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  22796. WOLFSSL_MSG("Server refused compression, turning off");
  22797. ssl->options.usingCompression = 0; /* turn off if server refused */
  22798. }
  22799. *inOutIdx = i;
  22800. #ifdef HAVE_TLS_EXTENSIONS
  22801. if ( (i - begin) < helloSz) {
  22802. if (TLSX_SupportExtensions(ssl)) {
  22803. word16 totalExtSz;
  22804. if ((i - begin) + OPAQUE16_LEN > helloSz)
  22805. return BUFFER_ERROR;
  22806. ato16(&input[i], &totalExtSz);
  22807. i += OPAQUE16_LEN;
  22808. if ((i - begin) + totalExtSz > helloSz)
  22809. return BUFFER_ERROR;
  22810. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  22811. server_hello, NULL)))
  22812. return ret;
  22813. i += totalExtSz;
  22814. *inOutIdx = i;
  22815. }
  22816. else
  22817. *inOutIdx = begin + helloSz; /* skip extensions */
  22818. }
  22819. else
  22820. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  22821. #else
  22822. {
  22823. int allowExt = 0;
  22824. byte pendingEMS = 0;
  22825. if ( (i - begin) < helloSz) {
  22826. if (ssl->version.major == SSLv3_MAJOR &&
  22827. ssl->version.minor >= TLSv1_MINOR) {
  22828. allowExt = 1;
  22829. }
  22830. #ifdef WOLFSSL_DTLS
  22831. if (ssl->version.major == DTLS_MAJOR)
  22832. allowExt = 1;
  22833. #endif
  22834. if (allowExt) {
  22835. word16 totalExtSz;
  22836. if ((i - begin) + OPAQUE16_LEN > helloSz)
  22837. return BUFFER_ERROR;
  22838. ato16(&input[i], &totalExtSz);
  22839. i += OPAQUE16_LEN;
  22840. if ((i - begin) + totalExtSz > helloSz)
  22841. return BUFFER_ERROR;
  22842. while (totalExtSz) {
  22843. word16 extId, extSz;
  22844. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  22845. return BUFFER_ERROR;
  22846. ato16(&input[i], &extId);
  22847. i += OPAQUE16_LEN;
  22848. ato16(&input[i], &extSz);
  22849. i += OPAQUE16_LEN;
  22850. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  22851. return BUFFER_ERROR;
  22852. if (extId == HELLO_EXT_EXTMS)
  22853. pendingEMS = 1;
  22854. else
  22855. i += extSz;
  22856. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  22857. }
  22858. *inOutIdx = i;
  22859. }
  22860. else
  22861. *inOutIdx = begin + helloSz; /* skip extensions */
  22862. }
  22863. if (!pendingEMS && ssl->options.haveEMS)
  22864. ssl->options.haveEMS = 0;
  22865. }
  22866. #endif
  22867. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  22868. if (IsEncryptionOn(ssl, 0)) {
  22869. *inOutIdx += ssl->keys.padSz;
  22870. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  22871. if (ssl->options.startedETMWrite &&
  22872. ssl->specs.cipher_type == block) {
  22873. *inOutIdx += MacSize(ssl);
  22874. }
  22875. #endif
  22876. }
  22877. #ifdef HAVE_SECRET_CALLBACK
  22878. if (ssl->sessionSecretCb != NULL
  22879. #ifdef HAVE_SESSION_TICKET
  22880. && ssl->session->ticketLen > 0
  22881. #endif
  22882. ) {
  22883. int secretSz = SECRET_LEN;
  22884. ret = ssl->sessionSecretCb(ssl, ssl->session->masterSecret,
  22885. &secretSz, ssl->sessionSecretCtx);
  22886. if (ret != 0 || secretSz != SECRET_LEN) {
  22887. WOLFSSL_ERROR_VERBOSE(SESSION_SECRET_CB_E);
  22888. return SESSION_SECRET_CB_E;
  22889. }
  22890. }
  22891. #endif /* HAVE_SECRET_CALLBACK */
  22892. ret = CompleteServerHello(ssl);
  22893. WOLFSSL_LEAVE("DoServerHello", ret);
  22894. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  22895. return ret;
  22896. }
  22897. int CompleteServerHello(WOLFSSL* ssl)
  22898. {
  22899. int ret;
  22900. if (!ssl->options.resuming) {
  22901. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  22902. TLS13_DOWNGRADE_SZ - 1;
  22903. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  22904. #ifdef WOLFSSL_TLS13
  22905. if (TLSv1_3_Capable(ssl)) {
  22906. /* TLS v1.3 capable client not allowed to downgrade when
  22907. * connecting to TLS v1.3 capable server unless cipher suite
  22908. * demands it.
  22909. */
  22910. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  22911. (vers == 0 || vers == 1)) {
  22912. SendAlert(ssl, alert_fatal, illegal_parameter);
  22913. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22914. return VERSION_ERROR;
  22915. }
  22916. }
  22917. else
  22918. #endif
  22919. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  22920. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  22921. (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0) {
  22922. /* TLS v1.2 capable client not allowed to downgrade when
  22923. * connecting to TLS v1.2 capable server.
  22924. */
  22925. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  22926. vers == 0) {
  22927. SendAlert(ssl, alert_fatal, illegal_parameter);
  22928. WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
  22929. return VERSION_ERROR;
  22930. }
  22931. }
  22932. }
  22933. else {
  22934. if (DSH_CheckSessionId(ssl)) {
  22935. if (SetCipherSpecs(ssl) == 0) {
  22936. XMEMCPY(ssl->arrays->masterSecret,
  22937. ssl->session->masterSecret, SECRET_LEN);
  22938. #ifdef NO_OLD_TLS
  22939. ret = DeriveTlsKeys(ssl);
  22940. #else
  22941. ret = -1; /* default value */
  22942. #ifndef NO_TLS
  22943. if (ssl->options.tls)
  22944. ret = DeriveTlsKeys(ssl);
  22945. #endif
  22946. if (!ssl->options.tls)
  22947. ret = DeriveKeys(ssl);
  22948. #endif /* NO_OLD_TLS */
  22949. /* SERVER: peer auth based on session secret. */
  22950. ssl->options.peerAuthGood = (ret == 0);
  22951. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  22952. return ret;
  22953. }
  22954. else {
  22955. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  22956. WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_SUITE);
  22957. return UNSUPPORTED_SUITE;
  22958. }
  22959. }
  22960. else {
  22961. WOLFSSL_MSG("Server denied resumption attempt");
  22962. ssl->options.resuming = 0; /* server denied resumption try */
  22963. }
  22964. }
  22965. return SetCipherSpecs(ssl);
  22966. }
  22967. #endif /* !WOLFSSL_NO_TLS12 */
  22968. /* Make sure client setup is valid for this suite, true on success */
  22969. int VerifyClientSuite(WOLFSSL* ssl)
  22970. {
  22971. #ifndef NO_PSK
  22972. int havePSK = ssl->options.havePSK;
  22973. #endif
  22974. byte first = ssl->options.cipherSuite0;
  22975. byte second = ssl->options.cipherSuite;
  22976. WOLFSSL_ENTER("VerifyClientSuite");
  22977. if (CipherRequires(first, second, REQUIRES_PSK)) {
  22978. WOLFSSL_MSG("Requires PSK");
  22979. #ifndef NO_PSK
  22980. if (havePSK == 0)
  22981. #endif
  22982. {
  22983. WOLFSSL_MSG("Don't have PSK");
  22984. return 0;
  22985. }
  22986. }
  22987. return 1; /* success */
  22988. }
  22989. #ifndef WOLFSSL_NO_TLS12
  22990. #ifndef NO_CERTS
  22991. /* handle processing of certificate_request (13) */
  22992. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  22993. inOutIdx, word32 size)
  22994. {
  22995. word16 len;
  22996. word32 begin = *inOutIdx;
  22997. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
  22998. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  22999. int ret;
  23000. #endif
  23001. #ifdef OPENSSL_EXTRA
  23002. WOLFSSL_X509* x509 = NULL;
  23003. WOLFSSL_EVP_PKEY* pkey = NULL;
  23004. #endif
  23005. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  23006. WOLFSSL_ENTER("DoCertificateRequest");
  23007. #ifdef WOLFSSL_CALLBACKS
  23008. if (ssl->hsInfoOn)
  23009. AddPacketName(ssl, "CertificateRequest");
  23010. if (ssl->toInfoOn)
  23011. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  23012. #endif
  23013. if (OPAQUE8_LEN > size)
  23014. return BUFFER_ERROR;
  23015. len = input[(*inOutIdx)++];
  23016. if ((*inOutIdx - begin) + len > size)
  23017. return BUFFER_ERROR;
  23018. /* types, read in here */
  23019. *inOutIdx += len;
  23020. /* signature and hash signature algorithm */
  23021. if (IsAtLeastTLSv1_2(ssl)) {
  23022. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  23023. return BUFFER_ERROR;
  23024. ato16(input + *inOutIdx, &len);
  23025. *inOutIdx += OPAQUE16_LEN;
  23026. if ((len > size) || ((*inOutIdx - begin) + len > size))
  23027. return BUFFER_ERROR;
  23028. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  23029. ssl->buffers.certificate &&
  23030. ssl->buffers.certificate->buffer) {
  23031. #ifdef HAVE_PK_CALLBACKS
  23032. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  23033. WOLFSSL_MSG("Using PK for client private key");
  23034. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  23035. return INVALID_PARAMETER;
  23036. }
  23037. #endif
  23038. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  23039. WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
  23040. return INVALID_PARAMETER;
  23041. }
  23042. }
  23043. *inOutIdx += len;
  23044. #ifdef WC_RSA_PSS
  23045. ssl->pssAlgo = 0;
  23046. if (ssl->suites->sigAlgo == rsa_pss_sa_algo)
  23047. ssl->pssAlgo |= 1 << ssl->suites->hashAlgo;
  23048. #endif
  23049. }
  23050. /* authorities */
  23051. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  23052. return BUFFER_ERROR;
  23053. /* DN seq length */
  23054. ato16(input + *inOutIdx, &len);
  23055. *inOutIdx += OPAQUE16_LEN;
  23056. if ((*inOutIdx - begin) + len > size)
  23057. return BUFFER_ERROR;
  23058. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  23059. if (ssl->ca_names != ssl->ctx->ca_names)
  23060. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  23061. ssl->ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  23062. if (ssl->ca_names == NULL) {
  23063. return MEMORY_ERROR;
  23064. }
  23065. #endif
  23066. while (len) {
  23067. word16 dnSz;
  23068. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  23069. return BUFFER_ERROR;
  23070. ato16(input + *inOutIdx, &dnSz);
  23071. *inOutIdx += OPAQUE16_LEN;
  23072. if ((*inOutIdx - begin) + dnSz > size)
  23073. return BUFFER_ERROR;
  23074. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  23075. {
  23076. WOLFSSL_X509_NAME* name = NULL;
  23077. /* Use a DecodedCert struct to get access to GetName to
  23078. * parse DN name */
  23079. #ifdef WOLFSSL_SMALL_STACK
  23080. DecodedCert *cert = (DecodedCert *)XMALLOC(
  23081. sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
  23082. if (cert == NULL)
  23083. return MEMORY_ERROR;
  23084. #else
  23085. DecodedCert cert[1];
  23086. #endif
  23087. InitDecodedCert(cert, input + *inOutIdx, dnSz, ssl->heap);
  23088. ret = GetName(cert, SUBJECT, dnSz);
  23089. if (ret == 0) {
  23090. if ((name = wolfSSL_X509_NAME_new()) == NULL)
  23091. ret = MEMORY_ERROR;
  23092. }
  23093. if (ret == 0) {
  23094. CopyDecodedName(name, cert, SUBJECT);
  23095. }
  23096. if (ret == 0) {
  23097. if (wolfSSL_sk_X509_NAME_push(ssl->ca_names, name)
  23098. == WOLFSSL_FAILURE)
  23099. {
  23100. ret = MEMORY_ERROR;
  23101. }
  23102. }
  23103. FreeDecodedCert(cert);
  23104. #ifdef WOLFSSL_SMALL_STACK
  23105. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  23106. #endif
  23107. if (ret != 0) {
  23108. if (name != NULL)
  23109. wolfSSL_X509_NAME_free(name);
  23110. return ret;
  23111. }
  23112. }
  23113. #endif
  23114. *inOutIdx += dnSz;
  23115. len -= OPAQUE16_LEN + dnSz;
  23116. }
  23117. #ifdef OPENSSL_EXTRA
  23118. /* call client cert callback if no cert has been loaded */
  23119. if ((ssl->ctx->CBClientCert != NULL) &&
  23120. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  23121. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  23122. if (ret == 1) {
  23123. if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
  23124. (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
  23125. WOLFSSL_ERROR_VERBOSE(CLIENT_CERT_CB_ERROR);
  23126. return CLIENT_CERT_CB_ERROR;
  23127. }
  23128. wolfSSL_X509_free(x509);
  23129. wolfSSL_EVP_PKEY_free(pkey);
  23130. }
  23131. else if (ret < 0) {
  23132. return WOLFSSL_ERROR_WANT_X509_LOOKUP;
  23133. }
  23134. }
  23135. if ((ret = CertSetupCbWrapper(ssl)) != 0)
  23136. return ret;
  23137. #endif
  23138. /* don't send client cert or cert verify if user hasn't provided
  23139. cert and private key */
  23140. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  23141. #ifdef HAVE_PK_CALLBACKS
  23142. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  23143. WOLFSSL_MSG("Using PK for client private key");
  23144. ssl->options.sendVerify = SEND_CERT;
  23145. }
  23146. #endif
  23147. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  23148. ssl->options.sendVerify = SEND_CERT;
  23149. }
  23150. }
  23151. #ifdef OPENSSL_EXTRA
  23152. else
  23153. #else
  23154. else if (IsTLS(ssl))
  23155. #endif
  23156. {
  23157. ssl->options.sendVerify = SEND_BLANK_CERT;
  23158. }
  23159. if (IsEncryptionOn(ssl, 0)) {
  23160. *inOutIdx += ssl->keys.padSz;
  23161. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  23162. if (ssl->options.startedETMRead)
  23163. *inOutIdx += MacSize(ssl);
  23164. #endif
  23165. }
  23166. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  23167. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  23168. return 0;
  23169. }
  23170. #endif /* !NO_CERTS */
  23171. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  23172. static int CheckCurveId(int tlsCurveId)
  23173. {
  23174. int ret = ECC_CURVE_ERROR;
  23175. switch (tlsCurveId) {
  23176. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  23177. #ifndef NO_ECC_SECP
  23178. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  23179. #endif /* !NO_ECC_SECP */
  23180. #ifdef HAVE_ECC_SECPR2
  23181. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  23182. #endif /* HAVE_ECC_SECPR2 */
  23183. #ifdef HAVE_ECC_KOBLITZ
  23184. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  23185. #endif /* HAVE_ECC_KOBLITZ */
  23186. #endif
  23187. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  23188. #ifndef NO_ECC_SECP
  23189. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  23190. #endif /* !NO_ECC_SECP */
  23191. #ifdef HAVE_ECC_KOBLITZ
  23192. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  23193. #endif /* HAVE_ECC_KOBLITZ */
  23194. #endif
  23195. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  23196. #ifndef NO_ECC_SECP
  23197. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  23198. #endif /* !NO_ECC_SECP */
  23199. #ifdef HAVE_ECC_KOBLITZ
  23200. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  23201. #endif /* HAVE_ECC_KOBLITZ */
  23202. #endif
  23203. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  23204. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  23205. #endif
  23206. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  23207. #ifndef NO_ECC_SECP
  23208. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  23209. #endif /* !NO_ECC_SECP */
  23210. #ifdef HAVE_ECC_KOBLITZ
  23211. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  23212. #endif /* HAVE_ECC_KOBLITZ */
  23213. #ifdef HAVE_ECC_BRAINPOOL
  23214. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  23215. #endif /* HAVE_ECC_BRAINPOOL */
  23216. #endif
  23217. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  23218. case WOLFSSL_ECC_X448: return ECC_X448_OID;
  23219. #endif
  23220. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  23221. #ifndef NO_ECC_SECP
  23222. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  23223. #endif /* !NO_ECC_SECP */
  23224. #ifdef HAVE_ECC_BRAINPOOL
  23225. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  23226. #endif /* HAVE_ECC_BRAINPOOL */
  23227. #endif
  23228. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  23229. #ifdef HAVE_ECC_BRAINPOOL
  23230. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  23231. #endif /* HAVE_ECC_BRAINPOOL */
  23232. #endif
  23233. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  23234. #ifndef NO_ECC_SECP
  23235. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  23236. #endif /* !NO_ECC_SECP */
  23237. #endif
  23238. default: break;
  23239. }
  23240. return ret;
  23241. }
  23242. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23243. /* Persistable DoServerKeyExchange arguments */
  23244. typedef struct DskeArgs {
  23245. byte* output; /* not allocated */
  23246. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23247. defined(HAVE_CURVE448)
  23248. byte* verifySig;
  23249. #endif
  23250. word32 idx;
  23251. word32 begin;
  23252. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23253. defined(HAVE_CURVE448)
  23254. word16 verifySigSz;
  23255. #endif
  23256. word16 sigSz;
  23257. byte sigAlgo;
  23258. byte hashAlgo;
  23259. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  23260. int bits;
  23261. #endif
  23262. } DskeArgs;
  23263. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  23264. {
  23265. DskeArgs* args = (DskeArgs*)pArgs;
  23266. (void)ssl;
  23267. (void)args;
  23268. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23269. defined(HAVE_CURVE448)
  23270. if (args->verifySig) {
  23271. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23272. args->verifySig = NULL;
  23273. }
  23274. #endif
  23275. }
  23276. #ifndef NO_DH
  23277. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  23278. DskeArgs* args)
  23279. {
  23280. int ret = 0;
  23281. word16 length;
  23282. #ifdef HAVE_FFDHE
  23283. #ifdef HAVE_PUBLIC_FFDHE
  23284. const DhParams* params = NULL;
  23285. #endif
  23286. word16 group = 0;
  23287. #endif
  23288. if (ssl->buffers.weOwnDH) {
  23289. if (ssl->buffers.serverDH_P.buffer) {
  23290. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23291. DYNAMIC_TYPE_PUBLIC_KEY);
  23292. ssl->buffers.serverDH_P.buffer = NULL;
  23293. }
  23294. if (ssl->buffers.serverDH_G.buffer) {
  23295. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  23296. DYNAMIC_TYPE_PUBLIC_KEY);
  23297. ssl->buffers.serverDH_G.buffer = NULL;
  23298. }
  23299. }
  23300. if (ssl->buffers.serverDH_Pub.buffer) {
  23301. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
  23302. DYNAMIC_TYPE_PUBLIC_KEY);
  23303. ssl->buffers.serverDH_Pub.buffer = NULL;
  23304. }
  23305. /* p */
  23306. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  23307. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23308. }
  23309. ato16(input + args->idx, &length);
  23310. args->idx += OPAQUE16_LEN;
  23311. if ((args->idx - args->begin) + length > size) {
  23312. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23313. }
  23314. if (length < ssl->options.minDhKeySz) {
  23315. WOLFSSL_MSG("Server using a DH key that is too small");
  23316. SendAlert(ssl, alert_fatal, handshake_failure);
  23317. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  23318. }
  23319. if (length > ssl->options.maxDhKeySz) {
  23320. WOLFSSL_MSG("Server using a DH key that is too big");
  23321. SendAlert(ssl, alert_fatal, handshake_failure);
  23322. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  23323. }
  23324. ssl->buffers.serverDH_P.buffer =
  23325. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23326. if (ssl->buffers.serverDH_P.buffer) {
  23327. ssl->buffers.serverDH_P.length = length;
  23328. }
  23329. else {
  23330. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  23331. }
  23332. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  23333. length);
  23334. args->idx += length;
  23335. ssl->options.dhKeySz = length;
  23336. /* g */
  23337. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  23338. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23339. DYNAMIC_TYPE_PUBLIC_KEY);
  23340. ssl->buffers.serverDH_P.buffer = NULL;
  23341. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23342. }
  23343. ato16(input + args->idx, &length);
  23344. args->idx += OPAQUE16_LEN;
  23345. if ((args->idx - args->begin) + length > size) {
  23346. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23347. DYNAMIC_TYPE_PUBLIC_KEY);
  23348. ssl->buffers.serverDH_P.buffer = NULL;
  23349. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23350. }
  23351. if (length > ssl->options.maxDhKeySz) {
  23352. WOLFSSL_MSG("Server using a DH key generator that is too big");
  23353. SendAlert(ssl, alert_fatal, handshake_failure);
  23354. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23355. DYNAMIC_TYPE_PUBLIC_KEY);
  23356. ssl->buffers.serverDH_P.buffer = NULL;
  23357. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  23358. }
  23359. ssl->buffers.serverDH_G.buffer =
  23360. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23361. if (ssl->buffers.serverDH_G.buffer) {
  23362. ssl->buffers.serverDH_G.length = length;
  23363. }
  23364. else {
  23365. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23366. DYNAMIC_TYPE_PUBLIC_KEY);
  23367. ssl->buffers.serverDH_P.buffer = NULL;
  23368. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  23369. }
  23370. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  23371. length);
  23372. args->idx += length;
  23373. /* pub */
  23374. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  23375. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23376. DYNAMIC_TYPE_PUBLIC_KEY);
  23377. ssl->buffers.serverDH_P.buffer = NULL;
  23378. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  23379. DYNAMIC_TYPE_PUBLIC_KEY);
  23380. ssl->buffers.serverDH_G.buffer = NULL;
  23381. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23382. }
  23383. ato16(input + args->idx, &length);
  23384. args->idx += OPAQUE16_LEN;
  23385. if ((args->idx - args->begin) + length > size) {
  23386. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23387. DYNAMIC_TYPE_PUBLIC_KEY);
  23388. ssl->buffers.serverDH_P.buffer = NULL;
  23389. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  23390. DYNAMIC_TYPE_PUBLIC_KEY);
  23391. ssl->buffers.serverDH_G.buffer = NULL;
  23392. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  23393. }
  23394. if (length > ssl->options.maxDhKeySz) {
  23395. WOLFSSL_MSG("Server using a public DH key that is too big");
  23396. SendAlert(ssl, alert_fatal, handshake_failure);
  23397. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23398. DYNAMIC_TYPE_PUBLIC_KEY);
  23399. ssl->buffers.serverDH_P.buffer = NULL;
  23400. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  23401. DYNAMIC_TYPE_PUBLIC_KEY);
  23402. ssl->buffers.serverDH_G.buffer = NULL;
  23403. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  23404. }
  23405. ssl->buffers.serverDH_Pub.buffer =
  23406. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  23407. if (ssl->buffers.serverDH_Pub.buffer) {
  23408. ssl->buffers.serverDH_Pub.length = length;
  23409. }
  23410. else {
  23411. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  23412. DYNAMIC_TYPE_PUBLIC_KEY);
  23413. ssl->buffers.serverDH_P.buffer = NULL;
  23414. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  23415. DYNAMIC_TYPE_PUBLIC_KEY);
  23416. ssl->buffers.serverDH_G.buffer = NULL;
  23417. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  23418. }
  23419. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  23420. length);
  23421. ssl->buffers.weOwnDH = 1;
  23422. args->idx += length;
  23423. #ifdef HAVE_FFDHE
  23424. switch (ssl->options.dhKeySz) {
  23425. #ifdef HAVE_FFDHE_2048
  23426. case 2048/8:
  23427. #ifdef HAVE_PUBLIC_FFDHE
  23428. params = wc_Dh_ffdhe2048_Get();
  23429. #endif
  23430. group = WOLFSSL_FFDHE_2048;
  23431. break;
  23432. #endif
  23433. #ifdef HAVE_FFDHE_3072
  23434. case 3072/8:
  23435. #ifdef HAVE_PUBLIC_FFDHE
  23436. params = wc_Dh_ffdhe3072_Get();
  23437. #endif
  23438. group = WOLFSSL_FFDHE_3072;
  23439. break;
  23440. #endif
  23441. #ifdef HAVE_FFDHE_4096
  23442. case 4096/8:
  23443. #ifdef HAVE_PUBLIC_FFDHE
  23444. params = wc_Dh_ffdhe4096_Get();
  23445. #endif
  23446. group = WOLFSSL_FFDHE_4096;
  23447. break;
  23448. #endif
  23449. #ifdef HAVE_FFDHE_6144
  23450. case 6144/8:
  23451. #ifdef HAVE_PUBLIC_FFDHE
  23452. params = wc_Dh_ffdhe6144_Get();
  23453. #endif
  23454. group = WOLFSSL_FFDHE_6144;
  23455. break;
  23456. #endif
  23457. #ifdef HAVE_FFDHE_8192
  23458. case 8192/8:
  23459. #ifdef HAVE_PUBLIC_FFDHE
  23460. params = wc_Dh_ffdhe8192_Get();
  23461. #endif
  23462. group = WOLFSSL_FFDHE_8192;
  23463. break;
  23464. #endif
  23465. default:
  23466. break;
  23467. }
  23468. #ifdef HAVE_PUBLIC_FFDHE
  23469. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  23470. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  23471. params->g_len) != 0) ||
  23472. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  23473. params->p_len) != 0))
  23474. #else
  23475. if (!wc_DhCmpNamedKey(group, 1,
  23476. ssl->buffers.serverDH_P.buffer, ssl->buffers.serverDH_P.length,
  23477. ssl->buffers.serverDH_G.buffer, ssl->buffers.serverDH_G.length,
  23478. NULL, 0))
  23479. #endif
  23480. {
  23481. WOLFSSL_MSG("Server not using FFDHE parameters");
  23482. #ifdef WOLFSSL_REQUIRE_FFDHE
  23483. SendAlert(ssl, alert_fatal, handshake_failure);
  23484. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  23485. #endif
  23486. }
  23487. else {
  23488. ssl->namedGroup = group;
  23489. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  23490. !defined(HAVE_SELFTEST)
  23491. ssl->options.dhDoKeyTest = 0;
  23492. #endif
  23493. }
  23494. #endif /* HAVE_FFDHE */
  23495. exit_gdpk:
  23496. if (ret != 0) {
  23497. WOLFSSL_ERROR_VERBOSE(ret);
  23498. }
  23499. return ret;
  23500. }
  23501. #endif
  23502. /* handle processing of server_key_exchange (12) */
  23503. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  23504. word32* inOutIdx, word32 size)
  23505. {
  23506. int ret = 0;
  23507. #ifdef WOLFSSL_ASYNC_CRYPT
  23508. DskeArgs* args = NULL;
  23509. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  23510. #else
  23511. DskeArgs args[1];
  23512. #endif
  23513. (void)input;
  23514. (void)size;
  23515. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  23516. WOLFSSL_ENTER("DoServerKeyExchange");
  23517. #ifdef WOLFSSL_ASYNC_CRYPT
  23518. if (ssl->async == NULL) {
  23519. ssl->async = (struct WOLFSSL_ASYNC*)
  23520. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  23521. DYNAMIC_TYPE_ASYNC);
  23522. if (ssl->async == NULL)
  23523. ERROR_OUT(MEMORY_E, exit_dske);
  23524. }
  23525. args = (DskeArgs*)ssl->async->args;
  23526. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  23527. if (ret != WC_NOT_PENDING_E) {
  23528. /* Check for error */
  23529. if (ret < 0)
  23530. goto exit_dske;
  23531. }
  23532. else
  23533. #endif
  23534. {
  23535. /* Reset state */
  23536. ret = 0;
  23537. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  23538. XMEMSET(args, 0, sizeof(DskeArgs));
  23539. args->idx = *inOutIdx;
  23540. args->begin = *inOutIdx;
  23541. args->sigAlgo = ssl->specs.sig_algo;
  23542. args->hashAlgo = sha_mac;
  23543. #ifdef WOLFSSL_ASYNC_CRYPT
  23544. ssl->async->freeArgs = FreeDskeArgs;
  23545. #endif
  23546. }
  23547. switch(ssl->options.asyncState)
  23548. {
  23549. case TLS_ASYNC_BEGIN:
  23550. {
  23551. #ifdef WOLFSSL_CALLBACKS
  23552. if (ssl->hsInfoOn)
  23553. AddPacketName(ssl, "ServerKeyExchange");
  23554. if (ssl->toInfoOn)
  23555. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  23556. #endif
  23557. switch(ssl->specs.kea)
  23558. {
  23559. #ifndef NO_PSK
  23560. case psk_kea:
  23561. {
  23562. int srvHintLen;
  23563. word16 length;
  23564. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  23565. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23566. }
  23567. ato16(input + args->idx, &length);
  23568. args->idx += OPAQUE16_LEN;
  23569. if ((args->idx - args->begin) + length > size) {
  23570. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23571. }
  23572. /* get PSK server hint from the wire */
  23573. srvHintLen = min(length, MAX_PSK_ID_LEN);
  23574. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  23575. srvHintLen);
  23576. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  23577. args->idx += length;
  23578. break;
  23579. }
  23580. #endif /* !NO_PSK */
  23581. #ifndef NO_DH
  23582. case diffie_hellman_kea:
  23583. {
  23584. ret = GetDhPublicKey(ssl, input, size, args);
  23585. if (ret != 0)
  23586. goto exit_dske;
  23587. break;
  23588. }
  23589. #endif /* !NO_DH */
  23590. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23591. defined(HAVE_CURVE448)
  23592. case ecc_diffie_hellman_kea:
  23593. {
  23594. byte b;
  23595. #ifdef HAVE_ECC
  23596. int curveId;
  23597. #endif
  23598. int curveOid;
  23599. word16 length;
  23600. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  23601. OPAQUE8_LEN > size) {
  23602. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23603. }
  23604. b = input[args->idx++];
  23605. if (b != named_curve) {
  23606. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  23607. }
  23608. args->idx += 1; /* curve type, eat leading 0 */
  23609. b = input[args->idx++];
  23610. if ((curveOid = CheckCurveId(b)) < 0) {
  23611. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  23612. }
  23613. ssl->ecdhCurveOID = curveOid;
  23614. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  23615. ssl->namedGroup = 0;
  23616. #endif
  23617. length = input[args->idx++];
  23618. if ((args->idx - args->begin) + length > size) {
  23619. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23620. }
  23621. #ifdef HAVE_CURVE25519
  23622. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  23623. if (ssl->peerX25519Key == NULL) {
  23624. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  23625. (void**)&ssl->peerX25519Key);
  23626. if (ret != 0) {
  23627. goto exit_dske;
  23628. }
  23629. } else if (ssl->peerX25519KeyPresent) {
  23630. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  23631. ssl->peerX25519Key);
  23632. ssl->peerX25519KeyPresent = 0;
  23633. if (ret != 0) {
  23634. goto exit_dske;
  23635. }
  23636. }
  23637. if ((ret = wc_curve25519_check_public(
  23638. input + args->idx, length,
  23639. EC25519_LITTLE_ENDIAN)) != 0) {
  23640. #ifdef WOLFSSL_EXTRA_ALERTS
  23641. if (ret == BUFFER_E)
  23642. SendAlert(ssl, alert_fatal, decode_error);
  23643. else if (ret == ECC_OUT_OF_RANGE_E)
  23644. SendAlert(ssl, alert_fatal, bad_record_mac);
  23645. else {
  23646. SendAlert(ssl, alert_fatal, illegal_parameter);
  23647. }
  23648. #endif
  23649. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  23650. }
  23651. if (wc_curve25519_import_public_ex(input + args->idx,
  23652. length, ssl->peerX25519Key,
  23653. EC25519_LITTLE_ENDIAN) != 0) {
  23654. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  23655. }
  23656. args->idx += length;
  23657. ssl->peerX25519KeyPresent = 1;
  23658. break;
  23659. }
  23660. #endif
  23661. #ifdef HAVE_CURVE448
  23662. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  23663. if (ssl->peerX448Key == NULL) {
  23664. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  23665. (void**)&ssl->peerX448Key);
  23666. if (ret != 0) {
  23667. goto exit_dske;
  23668. }
  23669. } else if (ssl->peerX448KeyPresent) {
  23670. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  23671. ssl->peerX448Key);
  23672. ssl->peerX448KeyPresent = 0;
  23673. if (ret != 0) {
  23674. goto exit_dske;
  23675. }
  23676. }
  23677. if ((ret = wc_curve448_check_public(
  23678. input + args->idx, length,
  23679. EC448_LITTLE_ENDIAN)) != 0) {
  23680. #ifdef WOLFSSL_EXTRA_ALERTS
  23681. if (ret == BUFFER_E)
  23682. SendAlert(ssl, alert_fatal, decode_error);
  23683. else if (ret == ECC_OUT_OF_RANGE_E)
  23684. SendAlert(ssl, alert_fatal, bad_record_mac);
  23685. else {
  23686. SendAlert(ssl, alert_fatal, illegal_parameter);
  23687. }
  23688. #endif
  23689. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  23690. }
  23691. if (wc_curve448_import_public_ex(input + args->idx,
  23692. length, ssl->peerX448Key,
  23693. EC448_LITTLE_ENDIAN) != 0) {
  23694. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  23695. }
  23696. args->idx += length;
  23697. ssl->peerX448KeyPresent = 1;
  23698. break;
  23699. }
  23700. #endif
  23701. #ifdef HAVE_ECC
  23702. if (ssl->peerEccKey == NULL) {
  23703. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  23704. (void**)&ssl->peerEccKey);
  23705. if (ret != 0) {
  23706. goto exit_dske;
  23707. }
  23708. } else if (ssl->peerEccKeyPresent) {
  23709. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  23710. ssl->peerEccKeyPresent = 0;
  23711. if (ret != 0) {
  23712. goto exit_dske;
  23713. }
  23714. }
  23715. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  23716. if (wc_ecc_import_x963_ex(input + args->idx, length,
  23717. ssl->peerEccKey, curveId) != 0) {
  23718. #ifdef WOLFSSL_EXTRA_ALERTS
  23719. SendAlert(ssl, alert_fatal, illegal_parameter);
  23720. #endif
  23721. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  23722. }
  23723. args->idx += length;
  23724. ssl->peerEccKeyPresent = 1;
  23725. #endif
  23726. break;
  23727. }
  23728. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23729. #if !defined(NO_DH) && !defined(NO_PSK)
  23730. case dhe_psk_kea:
  23731. {
  23732. int srvHintLen;
  23733. word16 length;
  23734. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  23735. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23736. }
  23737. ato16(input + args->idx, &length);
  23738. args->idx += OPAQUE16_LEN;
  23739. if ((args->idx - args->begin) + length > size) {
  23740. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23741. }
  23742. /* get PSK server hint from the wire */
  23743. srvHintLen = min(length, MAX_PSK_ID_LEN);
  23744. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  23745. srvHintLen);
  23746. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  23747. args->idx += length;
  23748. ret = GetDhPublicKey(ssl, input, size, args);
  23749. if (ret != 0)
  23750. goto exit_dske;
  23751. break;
  23752. }
  23753. #endif /* !NO_DH && !NO_PSK */
  23754. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23755. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23756. case ecdhe_psk_kea:
  23757. {
  23758. byte b;
  23759. int curveOid, curveId;
  23760. int srvHintLen;
  23761. word16 length;
  23762. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  23763. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23764. }
  23765. ato16(input + args->idx, &length);
  23766. args->idx += OPAQUE16_LEN;
  23767. if ((args->idx - args->begin) + length > size) {
  23768. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23769. }
  23770. /* get PSK server hint from the wire */
  23771. srvHintLen = min(length, MAX_PSK_ID_LEN);
  23772. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  23773. srvHintLen);
  23774. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  23775. args->idx += length;
  23776. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  23777. OPAQUE8_LEN > size) {
  23778. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23779. }
  23780. /* Check curve name and ID */
  23781. b = input[args->idx++];
  23782. if (b != named_curve) {
  23783. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  23784. }
  23785. args->idx += 1; /* curve type, eat leading 0 */
  23786. b = input[args->idx++];
  23787. if ((curveOid = CheckCurveId(b)) < 0) {
  23788. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  23789. }
  23790. length = input[args->idx++];
  23791. if ((args->idx - args->begin) + length > size) {
  23792. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23793. }
  23794. #ifdef HAVE_CURVE25519
  23795. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  23796. if (ssl->peerX25519Key == NULL) {
  23797. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  23798. (void**)&ssl->peerX25519Key);
  23799. if (ret != 0) {
  23800. goto exit_dske;
  23801. }
  23802. } else if (ssl->peerEccKeyPresent) {
  23803. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  23804. ssl->peerX25519Key);
  23805. ssl->peerX25519KeyPresent = 0;
  23806. if (ret != 0) {
  23807. goto exit_dske;
  23808. }
  23809. }
  23810. if ((ret = wc_curve25519_check_public(
  23811. input + args->idx, length,
  23812. EC25519_LITTLE_ENDIAN)) != 0) {
  23813. #ifdef WOLFSSL_EXTRA_ALERTS
  23814. if (ret == BUFFER_E)
  23815. SendAlert(ssl, alert_fatal, decode_error);
  23816. else if (ret == ECC_OUT_OF_RANGE_E)
  23817. SendAlert(ssl, alert_fatal, bad_record_mac);
  23818. else {
  23819. SendAlert(ssl, alert_fatal, illegal_parameter);
  23820. }
  23821. #endif
  23822. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  23823. }
  23824. if (wc_curve25519_import_public_ex(input + args->idx,
  23825. length, ssl->peerX25519Key,
  23826. EC25519_LITTLE_ENDIAN) != 0) {
  23827. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  23828. }
  23829. args->idx += length;
  23830. ssl->peerX25519KeyPresent = 1;
  23831. break;
  23832. }
  23833. #endif
  23834. #ifdef HAVE_CURVE448
  23835. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  23836. if (ssl->peerX448Key == NULL) {
  23837. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  23838. (void**)&ssl->peerX448Key);
  23839. if (ret != 0) {
  23840. goto exit_dske;
  23841. }
  23842. } else if (ssl->peerEccKeyPresent) {
  23843. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  23844. ssl->peerX448Key);
  23845. ssl->peerX448KeyPresent = 0;
  23846. if (ret != 0) {
  23847. goto exit_dske;
  23848. }
  23849. }
  23850. if ((ret = wc_curve448_check_public(
  23851. input + args->idx, length,
  23852. EC448_LITTLE_ENDIAN)) != 0) {
  23853. #ifdef WOLFSSL_EXTRA_ALERTS
  23854. if (ret == BUFFER_E)
  23855. SendAlert(ssl, alert_fatal, decode_error);
  23856. else if (ret == ECC_OUT_OF_RANGE_E)
  23857. SendAlert(ssl, alert_fatal, bad_record_mac);
  23858. else {
  23859. SendAlert(ssl, alert_fatal, illegal_parameter);
  23860. }
  23861. #endif
  23862. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  23863. }
  23864. if (wc_curve448_import_public_ex(input + args->idx,
  23865. length, ssl->peerX448Key,
  23866. EC448_LITTLE_ENDIAN) != 0) {
  23867. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  23868. }
  23869. args->idx += length;
  23870. ssl->peerX448KeyPresent = 1;
  23871. break;
  23872. }
  23873. #endif
  23874. if (ssl->peerEccKey == NULL) {
  23875. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  23876. (void**)&ssl->peerEccKey);
  23877. if (ret != 0) {
  23878. goto exit_dske;
  23879. }
  23880. } else if (ssl->peerEccKeyPresent) {
  23881. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  23882. ssl->peerEccKeyPresent = 0;
  23883. if (ret != 0) {
  23884. goto exit_dske;
  23885. }
  23886. }
  23887. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  23888. if (wc_ecc_import_x963_ex(input + args->idx, length,
  23889. ssl->peerEccKey, curveId) != 0) {
  23890. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  23891. }
  23892. args->idx += length;
  23893. ssl->peerEccKeyPresent = 1;
  23894. break;
  23895. }
  23896. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  23897. default:
  23898. ret = BAD_KEA_TYPE_E;
  23899. } /* switch(ssl->specs.kea) */
  23900. /* Check for error */
  23901. if (ret != 0) {
  23902. goto exit_dske;
  23903. }
  23904. /* Advance state and proceed */
  23905. ssl->options.asyncState = TLS_ASYNC_BUILD;
  23906. } /* case TLS_ASYNC_BEGIN */
  23907. FALL_THROUGH;
  23908. case TLS_ASYNC_BUILD:
  23909. {
  23910. switch(ssl->specs.kea)
  23911. {
  23912. case psk_kea:
  23913. case dhe_psk_kea:
  23914. case ecdhe_psk_kea:
  23915. {
  23916. /* Nothing to do in this sub-state */
  23917. break;
  23918. }
  23919. case diffie_hellman_kea:
  23920. case ecc_diffie_hellman_kea:
  23921. {
  23922. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  23923. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  23924. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  23925. #else
  23926. enum wc_HashType hashType;
  23927. word16 verifySz;
  23928. byte sigAlgo;
  23929. if (ssl->options.usingAnon_cipher) {
  23930. break;
  23931. }
  23932. verifySz = (word16)(args->idx - args->begin);
  23933. if (verifySz > MAX_DH_SZ) {
  23934. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23935. }
  23936. if (IsAtLeastTLSv1_2(ssl)) {
  23937. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  23938. size) {
  23939. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23940. }
  23941. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  23942. &sigAlgo);
  23943. #ifndef NO_RSA
  23944. if (sigAlgo == rsa_pss_sa_algo &&
  23945. args->sigAlgo == rsa_sa_algo) {
  23946. args->sigAlgo = sigAlgo;
  23947. }
  23948. else
  23949. #endif
  23950. #ifdef HAVE_ED25519
  23951. if (sigAlgo == ed25519_sa_algo &&
  23952. args->sigAlgo == ecc_dsa_sa_algo) {
  23953. args->sigAlgo = sigAlgo;
  23954. }
  23955. else
  23956. #endif
  23957. #ifdef HAVE_ED448
  23958. if (sigAlgo == ed448_sa_algo &&
  23959. args->sigAlgo == ecc_dsa_sa_algo) {
  23960. args->sigAlgo = sigAlgo;
  23961. }
  23962. else
  23963. #endif
  23964. /* Signature algorithm from message must match signature
  23965. * algorithm in cipher suite. */
  23966. if (sigAlgo != args->sigAlgo) {
  23967. ERROR_OUT(ALGO_ID_E, exit_dske);
  23968. }
  23969. args->idx += 2;
  23970. hashType = HashAlgoToType(args->hashAlgo);
  23971. if (hashType == WC_HASH_TYPE_NONE) {
  23972. ERROR_OUT(ALGO_ID_E, exit_dske);
  23973. }
  23974. } else {
  23975. /* only using sha and md5 for rsa */
  23976. #ifndef NO_OLD_TLS
  23977. hashType = WC_HASH_TYPE_SHA;
  23978. if (args->sigAlgo == rsa_sa_algo) {
  23979. hashType = WC_HASH_TYPE_MD5_SHA;
  23980. }
  23981. #else
  23982. ERROR_OUT(ALGO_ID_E, exit_dske);
  23983. #endif
  23984. }
  23985. /* signature */
  23986. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  23987. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23988. }
  23989. ato16(input + args->idx, &args->verifySigSz);
  23990. args->idx += OPAQUE16_LEN;
  23991. if ((args->idx - args->begin) + args->verifySigSz > size) {
  23992. ERROR_OUT(BUFFER_ERROR, exit_dske);
  23993. }
  23994. ret = HashSkeData(ssl, hashType, input + args->begin,
  23995. verifySz, args->sigAlgo);
  23996. if (ret != 0) {
  23997. goto exit_dske;
  23998. }
  23999. switch (args->sigAlgo)
  24000. {
  24001. #ifndef NO_RSA
  24002. #ifdef WC_RSA_PSS
  24003. case rsa_pss_sa_algo:
  24004. #endif
  24005. case rsa_sa_algo:
  24006. {
  24007. if (ssl->peerRsaKey == NULL ||
  24008. !ssl->peerRsaKeyPresent) {
  24009. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24010. }
  24011. break;
  24012. }
  24013. #endif /* !NO_RSA */
  24014. #ifdef HAVE_ECC
  24015. case ecc_dsa_sa_algo:
  24016. {
  24017. if (!ssl->peerEccDsaKeyPresent) {
  24018. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24019. }
  24020. break;
  24021. }
  24022. #endif /* HAVE_ECC */
  24023. #if defined(HAVE_ED25519)
  24024. case ed25519_sa_algo:
  24025. {
  24026. if (!ssl->peerEd25519KeyPresent) {
  24027. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24028. }
  24029. break;
  24030. }
  24031. #endif /* HAVE_ED25519 */
  24032. #if defined(HAVE_ED448)
  24033. case ed448_sa_algo:
  24034. {
  24035. if (!ssl->peerEd448KeyPresent) {
  24036. ERROR_OUT(NO_PEER_KEY, exit_dske);
  24037. }
  24038. break;
  24039. }
  24040. #endif /* HAVE_ED448 */
  24041. default:
  24042. ret = ALGO_ID_E;
  24043. } /* switch (args->sigAlgo) */
  24044. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  24045. break;
  24046. }
  24047. default:
  24048. ret = BAD_KEA_TYPE_E;
  24049. } /* switch(ssl->specs.kea) */
  24050. /* Check for error */
  24051. if (ret != 0) {
  24052. goto exit_dske;
  24053. }
  24054. /* Advance state and proceed */
  24055. ssl->options.asyncState = TLS_ASYNC_DO;
  24056. } /* case TLS_ASYNC_BUILD */
  24057. FALL_THROUGH;
  24058. case TLS_ASYNC_DO:
  24059. {
  24060. switch(ssl->specs.kea)
  24061. {
  24062. case psk_kea:
  24063. case dhe_psk_kea:
  24064. case ecdhe_psk_kea:
  24065. {
  24066. /* Nothing to do in this sub-state */
  24067. break;
  24068. }
  24069. case diffie_hellman_kea:
  24070. case ecc_diffie_hellman_kea:
  24071. {
  24072. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  24073. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  24074. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  24075. #else
  24076. if (ssl->options.usingAnon_cipher) {
  24077. break;
  24078. }
  24079. if (args->verifySig == NULL) {
  24080. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  24081. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24082. if (args->verifySig == NULL) {
  24083. ERROR_OUT(MEMORY_E, exit_dske);
  24084. }
  24085. XMEMCPY(args->verifySig, input + args->idx,
  24086. args->verifySigSz);
  24087. }
  24088. switch (args->sigAlgo)
  24089. {
  24090. #ifndef NO_RSA
  24091. #ifdef WC_RSA_PSS
  24092. case rsa_pss_sa_algo:
  24093. #endif
  24094. case rsa_sa_algo:
  24095. {
  24096. ret = RsaVerify(ssl,
  24097. args->verifySig, args->verifySigSz,
  24098. &args->output,
  24099. args->sigAlgo, args->hashAlgo,
  24100. ssl->peerRsaKey,
  24101. #ifdef HAVE_PK_CALLBACKS
  24102. &ssl->buffers.peerRsaKey
  24103. #else
  24104. NULL
  24105. #endif
  24106. );
  24107. if (ret >= 0) {
  24108. args->sigSz = (word16)ret;
  24109. #ifdef WC_RSA_PSS
  24110. args->bits = mp_count_bits(&ssl->peerRsaKey->n);
  24111. #endif
  24112. ret = 0;
  24113. }
  24114. #ifdef WOLFSSL_ASYNC_CRYPT
  24115. if (ret != WC_PENDING_E)
  24116. #endif
  24117. {
  24118. /* peerRsaKey */
  24119. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  24120. (void**)&ssl->peerRsaKey);
  24121. ssl->peerRsaKeyPresent = 0;
  24122. }
  24123. break;
  24124. }
  24125. #endif /* !NO_RSA */
  24126. #ifdef HAVE_ECC
  24127. case ecc_dsa_sa_algo:
  24128. {
  24129. ret = EccVerify(ssl,
  24130. args->verifySig, args->verifySigSz,
  24131. ssl->buffers.digest.buffer,
  24132. ssl->buffers.digest.length,
  24133. ssl->peerEccDsaKey,
  24134. #ifdef HAVE_PK_CALLBACKS
  24135. &ssl->buffers.peerEccDsaKey
  24136. #else
  24137. NULL
  24138. #endif
  24139. );
  24140. #ifdef WOLFSSL_ASYNC_CRYPT
  24141. if (ret != WC_PENDING_E)
  24142. #endif
  24143. {
  24144. /* peerEccDsaKey */
  24145. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  24146. (void**)&ssl->peerEccDsaKey);
  24147. ssl->peerEccDsaKeyPresent = 0;
  24148. }
  24149. /* CLIENT: Data verified with cert's public key. */
  24150. ssl->options.peerAuthGood =
  24151. ssl->options.havePeerCert && (ret == 0);
  24152. break;
  24153. }
  24154. #endif /* HAVE_ECC */
  24155. #if defined(HAVE_ED25519)
  24156. case ed25519_sa_algo:
  24157. {
  24158. ret = Ed25519Verify(ssl,
  24159. args->verifySig, args->verifySigSz,
  24160. ssl->buffers.sig.buffer,
  24161. ssl->buffers.sig.length,
  24162. ssl->peerEd25519Key,
  24163. #ifdef HAVE_PK_CALLBACKS
  24164. &ssl->buffers.peerEd25519Key
  24165. #else
  24166. NULL
  24167. #endif
  24168. );
  24169. #ifdef WOLFSSL_ASYNC_CRYPT
  24170. if (ret != WC_PENDING_E)
  24171. #endif
  24172. {
  24173. /* peerEccDsaKey */
  24174. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  24175. (void**)&ssl->peerEd25519Key);
  24176. ssl->peerEd25519KeyPresent = 0;
  24177. }
  24178. /* CLIENT: Data verified with cert's public key. */
  24179. ssl->options.peerAuthGood =
  24180. ssl->options.havePeerCert && (ret == 0);
  24181. break;
  24182. }
  24183. #endif /* HAVE_ED25519 */
  24184. #if defined(HAVE_ED448)
  24185. case ed448_sa_algo:
  24186. {
  24187. ret = Ed448Verify(ssl,
  24188. args->verifySig, args->verifySigSz,
  24189. ssl->buffers.sig.buffer,
  24190. ssl->buffers.sig.length,
  24191. ssl->peerEd448Key,
  24192. #ifdef HAVE_PK_CALLBACKS
  24193. &ssl->buffers.peerEd448Key
  24194. #else
  24195. NULL
  24196. #endif
  24197. );
  24198. #ifdef WOLFSSL_ASYNC_CRYPT
  24199. if (ret != WC_PENDING_E)
  24200. #endif
  24201. {
  24202. /* peerEccDsaKey */
  24203. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  24204. (void**)&ssl->peerEd448Key);
  24205. ssl->peerEd448KeyPresent = 0;
  24206. }
  24207. /* CLIENT: Data verified with cert's public key. */
  24208. ssl->options.peerAuthGood =
  24209. ssl->options.havePeerCert && (ret == 0);
  24210. break;
  24211. }
  24212. #endif /* HAVE_ED448 */
  24213. default:
  24214. ret = ALGO_ID_E;
  24215. } /* switch (sigAlgo) */
  24216. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  24217. break;
  24218. }
  24219. default:
  24220. ret = BAD_KEA_TYPE_E;
  24221. } /* switch(ssl->specs.kea) */
  24222. /* Check for error */
  24223. if (ret != 0) {
  24224. goto exit_dske;
  24225. }
  24226. /* Advance state and proceed */
  24227. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  24228. } /* case TLS_ASYNC_DO */
  24229. FALL_THROUGH;
  24230. case TLS_ASYNC_VERIFY:
  24231. {
  24232. switch(ssl->specs.kea)
  24233. {
  24234. case psk_kea:
  24235. case dhe_psk_kea:
  24236. case ecdhe_psk_kea:
  24237. {
  24238. /* Nothing to do in this sub-state */
  24239. break;
  24240. }
  24241. case diffie_hellman_kea:
  24242. case ecc_diffie_hellman_kea:
  24243. {
  24244. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  24245. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  24246. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  24247. #else
  24248. if (ssl->options.usingAnon_cipher) {
  24249. break;
  24250. }
  24251. /* increment index after verify is done */
  24252. args->idx += args->verifySigSz;
  24253. switch(args->sigAlgo)
  24254. {
  24255. #ifndef NO_RSA
  24256. #ifdef WC_RSA_PSS
  24257. case rsa_pss_sa_algo:
  24258. #ifdef HAVE_SELFTEST
  24259. ret = wc_RsaPSS_CheckPadding(
  24260. ssl->buffers.digest.buffer,
  24261. ssl->buffers.digest.length,
  24262. args->output, args->sigSz,
  24263. HashAlgoToType(args->hashAlgo));
  24264. #else
  24265. ret = wc_RsaPSS_CheckPadding_ex(
  24266. ssl->buffers.digest.buffer,
  24267. ssl->buffers.digest.length,
  24268. args->output, args->sigSz,
  24269. HashAlgoToType(args->hashAlgo),
  24270. -1, args->bits);
  24271. #endif
  24272. if (ret != 0)
  24273. return ret;
  24274. /* CLIENT: Data verified with cert's public key. */
  24275. ssl->options.peerAuthGood =
  24276. ssl->options.havePeerCert;
  24277. break;
  24278. #endif
  24279. case rsa_sa_algo:
  24280. {
  24281. #if (defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  24282. defined(WOLFSSL_RENESAS_SCEPROTECT_ECC)) || \
  24283. defined(WOLFSSL_RENESAS_TSIP_TLS)
  24284. /* already checked signature result by SCE */
  24285. /* skip the sign checks below */
  24286. if (Renesas_cmn_usable(ssl, 0)) {
  24287. break;
  24288. }
  24289. #endif
  24290. if (IsAtLeastTLSv1_2(ssl)) {
  24291. #ifdef WOLFSSL_SMALL_STACK
  24292. byte* encodedSig;
  24293. #else
  24294. byte encodedSig[MAX_ENCODED_SIG_SZ];
  24295. #endif
  24296. word32 encSigSz;
  24297. #ifdef WOLFSSL_SMALL_STACK
  24298. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  24299. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24300. if (encodedSig == NULL) {
  24301. ERROR_OUT(MEMORY_E, exit_dske);
  24302. }
  24303. #endif
  24304. encSigSz = wc_EncodeSignature(encodedSig,
  24305. ssl->buffers.digest.buffer,
  24306. ssl->buffers.digest.length,
  24307. TypeHash(args->hashAlgo));
  24308. if (encSigSz != args->sigSz || !args->output ||
  24309. XMEMCMP(args->output, encodedSig,
  24310. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  24311. ret = VERIFY_SIGN_ERROR;
  24312. }
  24313. #ifdef WOLFSSL_SMALL_STACK
  24314. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24315. #endif
  24316. if (ret != 0) {
  24317. goto exit_dske;
  24318. }
  24319. }
  24320. else if (args->sigSz != FINISHED_SZ ||
  24321. !args->output ||
  24322. XMEMCMP(args->output,
  24323. ssl->buffers.digest.buffer,
  24324. FINISHED_SZ) != 0) {
  24325. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  24326. }
  24327. /* CLIENT: Data verified with cert's public key. */
  24328. ssl->options.peerAuthGood =
  24329. ssl->options.havePeerCert;
  24330. break;
  24331. }
  24332. #endif /* !NO_RSA */
  24333. #ifdef HAVE_ECC
  24334. case ecc_dsa_sa_algo:
  24335. /* Nothing to do in this algo */
  24336. break;
  24337. #endif /* HAVE_ECC */
  24338. #if defined(HAVE_ED25519)
  24339. case ed25519_sa_algo:
  24340. /* Nothing to do in this algo */
  24341. break;
  24342. #endif /* HAVE_ED25519 */
  24343. #if defined(HAVE_ED448)
  24344. case ed448_sa_algo:
  24345. /* Nothing to do in this algo */
  24346. break;
  24347. #endif /* HAVE_ED448 */
  24348. default:
  24349. ret = ALGO_ID_E;
  24350. } /* switch (sigAlgo) */
  24351. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  24352. break;
  24353. }
  24354. default:
  24355. ret = BAD_KEA_TYPE_E;
  24356. } /* switch(ssl->specs.kea) */
  24357. /* Check for error */
  24358. if (ret != 0) {
  24359. goto exit_dske;
  24360. }
  24361. /* Advance state and proceed */
  24362. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  24363. } /* case TLS_ASYNC_VERIFY */
  24364. FALL_THROUGH;
  24365. case TLS_ASYNC_FINALIZE:
  24366. {
  24367. if (IsEncryptionOn(ssl, 0)) {
  24368. args->idx += ssl->keys.padSz;
  24369. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  24370. if (ssl->options.startedETMRead)
  24371. args->idx += MacSize(ssl);
  24372. #endif
  24373. }
  24374. /* Advance state and proceed */
  24375. ssl->options.asyncState = TLS_ASYNC_END;
  24376. } /* case TLS_ASYNC_FINALIZE */
  24377. FALL_THROUGH;
  24378. case TLS_ASYNC_END:
  24379. {
  24380. /* return index */
  24381. *inOutIdx = args->idx;
  24382. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  24383. break;
  24384. }
  24385. default:
  24386. ret = INPUT_CASE_ERROR;
  24387. } /* switch(ssl->options.asyncState) */
  24388. exit_dske:
  24389. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  24390. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  24391. #ifdef WOLFSSL_ASYNC_CRYPT
  24392. /* Handle async operation */
  24393. if (ret == WC_PENDING_E) {
  24394. /* Mark message as not received so it can process again */
  24395. ssl->msgsReceived.got_server_key_exchange = 0;
  24396. return ret;
  24397. }
  24398. /* Cleanup async */
  24399. FreeAsyncCtx(ssl, 0);
  24400. #else
  24401. FreeDskeArgs(ssl, args);
  24402. #endif /* WOLFSSL_ASYNC_CRYPT */
  24403. /* Final cleanup */
  24404. FreeKeyExchange(ssl);
  24405. if (ret != 0) {
  24406. WOLFSSL_ERROR_VERBOSE(ret);
  24407. }
  24408. return ret;
  24409. }
  24410. typedef struct SckeArgs {
  24411. byte* output; /* not allocated */
  24412. byte* encSecret;
  24413. byte* input;
  24414. word32 encSz;
  24415. word32 length;
  24416. int sendSz;
  24417. int inputSz;
  24418. } SckeArgs;
  24419. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  24420. {
  24421. SckeArgs* args = (SckeArgs*)pArgs;
  24422. (void)ssl;
  24423. if (args->encSecret) {
  24424. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  24425. args->encSecret = NULL;
  24426. }
  24427. if (args->input) {
  24428. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24429. args->input = NULL;
  24430. }
  24431. }
  24432. /* handle generation client_key_exchange (16) */
  24433. int SendClientKeyExchange(WOLFSSL* ssl)
  24434. {
  24435. int ret = 0;
  24436. #ifdef WOLFSSL_ASYNC_IO
  24437. SckeArgs* args = NULL;
  24438. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  24439. #else
  24440. SckeArgs args[1];
  24441. #endif
  24442. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  24443. WOLFSSL_ENTER("SendClientKeyExchange");
  24444. #ifdef OPENSSL_EXTRA
  24445. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  24446. ssl->cbmode = SSL_CB_MODE_WRITE;
  24447. if (ssl->CBIS != NULL)
  24448. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  24449. #endif
  24450. #ifdef WOLFSSL_ASYNC_IO
  24451. if (ssl->async == NULL) {
  24452. ssl->async = (struct WOLFSSL_ASYNC*)
  24453. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  24454. DYNAMIC_TYPE_ASYNC);
  24455. if (ssl->async == NULL)
  24456. ERROR_OUT(MEMORY_E, exit_scke);
  24457. }
  24458. args = (SckeArgs*)ssl->async->args;
  24459. #ifdef WOLFSSL_ASYNC_CRYPT
  24460. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  24461. if (ret != WC_NOT_PENDING_E) {
  24462. /* Check for error */
  24463. if (ret < 0)
  24464. goto exit_scke;
  24465. }
  24466. else
  24467. #endif
  24468. if (ssl->options.buildingMsg) {
  24469. /* Continue building the message */
  24470. }
  24471. else
  24472. #endif
  24473. {
  24474. /* Reset state */
  24475. ret = 0;
  24476. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  24477. XMEMSET(args, 0, sizeof(SckeArgs));
  24478. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  24479. * is not advanced yet */
  24480. ssl->options.buildingMsg = 1;
  24481. #ifdef WOLFSSL_ASYNC_IO
  24482. ssl->async->freeArgs = FreeSckeArgs;
  24483. #endif
  24484. }
  24485. switch(ssl->options.asyncState)
  24486. {
  24487. case TLS_ASYNC_BEGIN:
  24488. {
  24489. switch (ssl->specs.kea) {
  24490. #ifndef NO_RSA
  24491. case rsa_kea:
  24492. if (ssl->peerRsaKey == NULL ||
  24493. ssl->peerRsaKeyPresent == 0) {
  24494. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24495. }
  24496. break;
  24497. #endif
  24498. #ifndef NO_DH
  24499. case diffie_hellman_kea:
  24500. if (ssl->buffers.serverDH_P.buffer == NULL ||
  24501. ssl->buffers.serverDH_G.buffer == NULL ||
  24502. ssl->buffers.serverDH_Pub.buffer == NULL) {
  24503. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24504. }
  24505. break;
  24506. #endif /* NO_DH */
  24507. #ifndef NO_PSK
  24508. case psk_kea:
  24509. /* sanity check that PSK client callback has been set */
  24510. if (ssl->options.client_psk_cb == NULL) {
  24511. WOLFSSL_MSG("No client PSK callback set");
  24512. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  24513. }
  24514. break;
  24515. #endif /* NO_PSK */
  24516. #if !defined(NO_DH) && !defined(NO_PSK)
  24517. case dhe_psk_kea:
  24518. if (ssl->buffers.serverDH_P.buffer == NULL ||
  24519. ssl->buffers.serverDH_G.buffer == NULL ||
  24520. ssl->buffers.serverDH_Pub.buffer == NULL) {
  24521. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24522. }
  24523. /* sanity check that PSK client callback has been set */
  24524. if (ssl->options.client_psk_cb == NULL) {
  24525. WOLFSSL_MSG("No client PSK callback set");
  24526. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  24527. }
  24528. break;
  24529. #endif /* !NO_DH && !NO_PSK */
  24530. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24531. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  24532. case ecdhe_psk_kea:
  24533. /* sanity check that PSK client callback has been set */
  24534. if (ssl->options.client_psk_cb == NULL) {
  24535. WOLFSSL_MSG("No client PSK callback set");
  24536. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  24537. }
  24538. #ifdef HAVE_CURVE25519
  24539. if (ssl->peerX25519KeyPresent) {
  24540. /* Check client ECC public key */
  24541. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  24542. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24543. }
  24544. #ifdef HAVE_PK_CALLBACKS
  24545. /* if callback then use it for shared secret */
  24546. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  24547. break;
  24548. }
  24549. #endif
  24550. /* create private key */
  24551. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  24552. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24553. if (ret != 0) {
  24554. goto exit_scke;
  24555. }
  24556. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  24557. ssl->peerX25519Key);
  24558. break;
  24559. }
  24560. #endif
  24561. #ifdef HAVE_CURVE448
  24562. if (ssl->peerX448KeyPresent) {
  24563. /* Check client ECC public key */
  24564. if (!ssl->peerX448Key) {
  24565. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24566. }
  24567. #ifdef HAVE_PK_CALLBACKS
  24568. /* if callback then use it for shared secret */
  24569. if (ssl->ctx->X448SharedSecretCb != NULL) {
  24570. break;
  24571. }
  24572. #endif
  24573. /* create private key */
  24574. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  24575. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24576. if (ret != 0) {
  24577. goto exit_scke;
  24578. }
  24579. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  24580. ssl->peerX448Key);
  24581. break;
  24582. }
  24583. #endif
  24584. /* Check client ECC public key */
  24585. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  24586. !ssl->peerEccKey->dp) {
  24587. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24588. }
  24589. #ifdef HAVE_PK_CALLBACKS
  24590. /* if callback then use it for shared secret */
  24591. if (ssl->ctx->EccSharedSecretCb != NULL) {
  24592. break;
  24593. }
  24594. #endif
  24595. /* create ephemeral private key */
  24596. ssl->hsType = DYNAMIC_TYPE_ECC;
  24597. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24598. if (ret != 0) {
  24599. goto exit_scke;
  24600. }
  24601. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  24602. break;
  24603. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  24604. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24605. defined(HAVE_CURVE448)
  24606. case ecc_diffie_hellman_kea:
  24607. {
  24608. #ifdef HAVE_ECC
  24609. ecc_key* peerKey;
  24610. #endif
  24611. #ifdef HAVE_PK_CALLBACKS
  24612. /* if callback then use it for shared secret */
  24613. #ifdef HAVE_CURVE25519
  24614. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  24615. if (ssl->ctx->X25519SharedSecretCb != NULL)
  24616. break;
  24617. }
  24618. else
  24619. #endif
  24620. #ifdef HAVE_CURVE448
  24621. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  24622. if (ssl->ctx->X448SharedSecretCb != NULL)
  24623. break;
  24624. }
  24625. else
  24626. #endif
  24627. #ifdef HAVE_ECC
  24628. if (ssl->ctx->EccSharedSecretCb != NULL) {
  24629. break;
  24630. }
  24631. else
  24632. #endif
  24633. {
  24634. }
  24635. #endif /* HAVE_PK_CALLBACKS */
  24636. #ifdef HAVE_CURVE25519
  24637. if (ssl->peerX25519KeyPresent) {
  24638. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  24639. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24640. }
  24641. /* create private key */
  24642. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  24643. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24644. if (ret != 0) {
  24645. goto exit_scke;
  24646. }
  24647. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  24648. ssl->peerX25519Key);
  24649. break;
  24650. }
  24651. #endif
  24652. #ifdef HAVE_CURVE448
  24653. if (ssl->peerX448KeyPresent) {
  24654. if (!ssl->peerX448Key) {
  24655. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24656. }
  24657. /* create private key */
  24658. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  24659. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24660. if (ret != 0) {
  24661. goto exit_scke;
  24662. }
  24663. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  24664. ssl->peerX448Key);
  24665. break;
  24666. }
  24667. #endif
  24668. #ifdef HAVE_ECC
  24669. if (ssl->specs.static_ecdh) {
  24670. /* Note: EccDsa is really fixed Ecc key here */
  24671. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
  24672. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24673. }
  24674. peerKey = ssl->peerEccDsaKey;
  24675. }
  24676. else {
  24677. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
  24678. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24679. }
  24680. peerKey = ssl->peerEccKey;
  24681. }
  24682. if (peerKey == NULL) {
  24683. ERROR_OUT(NO_PEER_KEY, exit_scke);
  24684. }
  24685. /* create ephemeral private key */
  24686. ssl->hsType = DYNAMIC_TYPE_ECC;
  24687. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  24688. if (ret != 0) {
  24689. goto exit_scke;
  24690. }
  24691. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  24692. #endif
  24693. break;
  24694. }
  24695. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24696. default:
  24697. ret = BAD_KEA_TYPE_E;
  24698. } /* switch(ssl->specs.kea) */
  24699. /* Check for error */
  24700. if (ret != 0) {
  24701. goto exit_scke;
  24702. }
  24703. /* Advance state and proceed */
  24704. ssl->options.asyncState = TLS_ASYNC_BUILD;
  24705. } /* case TLS_ASYNC_BEGIN */
  24706. FALL_THROUGH;
  24707. case TLS_ASYNC_BUILD:
  24708. {
  24709. args->encSz = MAX_ENCRYPT_SZ;
  24710. args->encSecret = (byte*)XMALLOC(MAX_ENCRYPT_SZ, ssl->heap,
  24711. DYNAMIC_TYPE_SECRET);
  24712. if (args->encSecret == NULL) {
  24713. ERROR_OUT(MEMORY_E, exit_scke);
  24714. }
  24715. if (ssl->arrays->preMasterSecret == NULL) {
  24716. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  24717. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  24718. ssl->heap, DYNAMIC_TYPE_SECRET);
  24719. if (ssl->arrays->preMasterSecret == NULL) {
  24720. ERROR_OUT(MEMORY_E, exit_scke);
  24721. }
  24722. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  24723. }
  24724. switch(ssl->specs.kea)
  24725. {
  24726. #ifndef NO_RSA
  24727. case rsa_kea:
  24728. {
  24729. #ifdef HAVE_PK_CALLBACKS
  24730. if (ssl->ctx->GenPreMasterCb) {
  24731. void* ctx = wolfSSL_GetGenPreMasterCtx(ssl);
  24732. ret = ssl->ctx->GenPreMasterCb(ssl,
  24733. ssl->arrays->preMasterSecret, ENCRYPT_LEN, ctx);
  24734. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  24735. goto exit_scke;
  24736. }
  24737. }
  24738. if (!ssl->ctx->GenPreMasterCb || ret == PROTOCOLCB_UNAVAILABLE)
  24739. #endif
  24740. {
  24741. /* build PreMasterSecret with RNG data */
  24742. ret = wc_RNG_GenerateBlock(ssl->rng,
  24743. &ssl->arrays->preMasterSecret[VERSION_SZ],
  24744. SECRET_LEN - VERSION_SZ);
  24745. if (ret != 0) {
  24746. goto exit_scke;
  24747. }
  24748. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  24749. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  24750. ssl->arrays->preMasterSz = SECRET_LEN;
  24751. }
  24752. break;
  24753. }
  24754. #endif /* !NO_RSA */
  24755. #ifndef NO_DH
  24756. case diffie_hellman_kea:
  24757. {
  24758. ssl->buffers.sig.length = ENCRYPT_LEN;
  24759. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  24760. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24761. if (ssl->buffers.sig.buffer == NULL) {
  24762. ERROR_OUT(MEMORY_E, exit_scke);
  24763. }
  24764. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  24765. (void**)&ssl->buffers.serverDH_Key);
  24766. if (ret != 0) {
  24767. goto exit_scke;
  24768. }
  24769. #if defined(HAVE_FFDHE) && !defined(HAVE_PUBLIC_FFDHE)
  24770. if (ssl->namedGroup) {
  24771. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  24772. ssl->namedGroup);
  24773. if (ret != 0) {
  24774. goto exit_scke;
  24775. }
  24776. ssl->buffers.sig.length =
  24777. wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  24778. }
  24779. else
  24780. #endif
  24781. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  24782. !defined(WOLFSSL_OLD_PRIME_CHECK)
  24783. if (ssl->options.dhDoKeyTest &&
  24784. !ssl->options.dhKeyTested)
  24785. {
  24786. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  24787. ssl->buffers.serverDH_P.buffer,
  24788. ssl->buffers.serverDH_P.length,
  24789. ssl->buffers.serverDH_G.buffer,
  24790. ssl->buffers.serverDH_G.length,
  24791. NULL, 0, 0, ssl->rng);
  24792. if (ret != 0) {
  24793. goto exit_scke;
  24794. }
  24795. ssl->options.dhKeyTested = 1;
  24796. }
  24797. else
  24798. #endif
  24799. {
  24800. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  24801. ssl->buffers.serverDH_P.buffer,
  24802. ssl->buffers.serverDH_P.length,
  24803. ssl->buffers.serverDH_G.buffer,
  24804. ssl->buffers.serverDH_G.length);
  24805. if (ret != 0) {
  24806. goto exit_scke;
  24807. }
  24808. }
  24809. /* for DH, encSecret is Yc, agree is pre-master */
  24810. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  24811. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  24812. args->encSecret, &args->encSz);
  24813. /* set the max agree result size */
  24814. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  24815. break;
  24816. }
  24817. #endif /* !NO_DH */
  24818. #ifndef NO_PSK
  24819. case psk_kea:
  24820. {
  24821. byte* pms = ssl->arrays->preMasterSecret;
  24822. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  24823. ssl->arrays->server_hint, ssl->arrays->client_identity,
  24824. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  24825. if (ssl->arrays->psk_keySz == 0 ||
  24826. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  24827. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  24828. }
  24829. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  24830. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  24831. if (args->encSz > MAX_PSK_ID_LEN) {
  24832. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  24833. }
  24834. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  24835. args->encSz);
  24836. /* CLIENT: Pre-shared Key for peer authentication. */
  24837. ssl->options.peerAuthGood = 1;
  24838. /* make psk pre master secret */
  24839. /* length of key + length 0s + length of key + key */
  24840. c16toa((word16)ssl->arrays->psk_keySz, pms);
  24841. pms += OPAQUE16_LEN;
  24842. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  24843. pms += ssl->arrays->psk_keySz;
  24844. c16toa((word16)ssl->arrays->psk_keySz, pms);
  24845. pms += OPAQUE16_LEN;
  24846. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  24847. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
  24848. (2 * OPAQUE16_LEN);
  24849. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  24850. ssl->arrays->psk_keySz = 0; /* No further need */
  24851. break;
  24852. }
  24853. #endif /* !NO_PSK */
  24854. #if !defined(NO_DH) && !defined(NO_PSK)
  24855. case dhe_psk_kea:
  24856. {
  24857. word32 esSz = 0;
  24858. args->output = args->encSecret;
  24859. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  24860. ssl->arrays->server_hint, ssl->arrays->client_identity,
  24861. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  24862. if (ssl->arrays->psk_keySz == 0 ||
  24863. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  24864. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  24865. }
  24866. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  24867. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  24868. if (esSz > MAX_PSK_ID_LEN) {
  24869. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  24870. }
  24871. /* CLIENT: Pre-shared Key for peer authentication. */
  24872. ssl->options.peerAuthGood = 1;
  24873. ssl->buffers.sig.length = ENCRYPT_LEN;
  24874. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  24875. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24876. if (ssl->buffers.sig.buffer == NULL) {
  24877. ERROR_OUT(MEMORY_E, exit_scke);
  24878. }
  24879. c16toa((word16)esSz, args->output);
  24880. args->output += OPAQUE16_LEN;
  24881. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  24882. args->output += esSz;
  24883. args->length = args->encSz - esSz - OPAQUE16_LEN;
  24884. args->encSz = esSz + OPAQUE16_LEN;
  24885. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  24886. (void**)&ssl->buffers.serverDH_Key);
  24887. if (ret != 0) {
  24888. goto exit_scke;
  24889. }
  24890. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  24891. !defined(WOLFSSL_OLD_PRIME_CHECK)
  24892. if (ssl->options.dhDoKeyTest &&
  24893. !ssl->options.dhKeyTested)
  24894. {
  24895. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  24896. ssl->buffers.serverDH_P.buffer,
  24897. ssl->buffers.serverDH_P.length,
  24898. ssl->buffers.serverDH_G.buffer,
  24899. ssl->buffers.serverDH_G.length,
  24900. NULL, 0, 0, ssl->rng);
  24901. if (ret != 0) {
  24902. goto exit_scke;
  24903. }
  24904. ssl->options.dhKeyTested = 1;
  24905. }
  24906. else
  24907. #endif
  24908. {
  24909. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  24910. ssl->buffers.serverDH_P.buffer,
  24911. ssl->buffers.serverDH_P.length,
  24912. ssl->buffers.serverDH_G.buffer,
  24913. ssl->buffers.serverDH_G.length);
  24914. if (ret != 0) {
  24915. goto exit_scke;
  24916. }
  24917. }
  24918. /* for DH, encSecret is Yc, agree is pre-master */
  24919. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  24920. ssl->buffers.sig.buffer,
  24921. (word32*)&ssl->buffers.sig.length,
  24922. args->output + OPAQUE16_LEN, &args->length);
  24923. break;
  24924. }
  24925. #endif /* !NO_DH && !NO_PSK */
  24926. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24927. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  24928. case ecdhe_psk_kea:
  24929. {
  24930. word32 esSz = 0;
  24931. args->output = args->encSecret;
  24932. /* Send PSK client identity */
  24933. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  24934. ssl->arrays->server_hint, ssl->arrays->client_identity,
  24935. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  24936. if (ssl->arrays->psk_keySz == 0 ||
  24937. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  24938. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  24939. }
  24940. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  24941. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  24942. if (esSz > MAX_PSK_ID_LEN) {
  24943. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  24944. }
  24945. /* CLIENT: Pre-shared Key for peer authentication. */
  24946. ssl->options.peerAuthGood = 1;
  24947. /* place size and identity in output buffer sz:identity */
  24948. c16toa((word16)esSz, args->output);
  24949. args->output += OPAQUE16_LEN;
  24950. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  24951. args->output += esSz;
  24952. args->encSz = esSz + OPAQUE16_LEN;
  24953. /* length is used for public key size */
  24954. args->length = MAX_ENCRYPT_SZ;
  24955. /* Create shared ECC key leaving room at the beginning
  24956. of buffer for size of shared key. */
  24957. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  24958. #ifdef HAVE_CURVE25519
  24959. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  24960. #ifdef HAVE_PK_CALLBACKS
  24961. /* if callback then use it for shared secret */
  24962. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  24963. break;
  24964. }
  24965. #endif
  24966. ret = wc_curve25519_export_public_ex(
  24967. (curve25519_key*)ssl->hsKey,
  24968. args->output + OPAQUE8_LEN, &args->length,
  24969. EC25519_LITTLE_ENDIAN);
  24970. if (ret != 0) {
  24971. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  24972. }
  24973. break;
  24974. }
  24975. #endif
  24976. #ifdef HAVE_CURVE448
  24977. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  24978. #ifdef HAVE_PK_CALLBACKS
  24979. /* if callback then use it for shared secret */
  24980. if (ssl->ctx->X448SharedSecretCb != NULL) {
  24981. break;
  24982. }
  24983. #endif
  24984. ret = wc_curve448_export_public_ex(
  24985. (curve448_key*)ssl->hsKey,
  24986. args->output + OPAQUE8_LEN, &args->length,
  24987. EC448_LITTLE_ENDIAN);
  24988. if (ret != 0) {
  24989. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  24990. }
  24991. break;
  24992. }
  24993. #endif
  24994. #ifdef HAVE_PK_CALLBACKS
  24995. /* if callback then use it for shared secret */
  24996. if (ssl->ctx->EccSharedSecretCb != NULL) {
  24997. break;
  24998. }
  24999. #endif
  25000. /* Place ECC key in output buffer, leaving room for size */
  25001. PRIVATE_KEY_UNLOCK();
  25002. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  25003. args->output + OPAQUE8_LEN, &args->length);
  25004. PRIVATE_KEY_LOCK();
  25005. if (ret != 0) {
  25006. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25007. }
  25008. break;
  25009. }
  25010. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  25011. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25012. defined(HAVE_CURVE448)
  25013. case ecc_diffie_hellman_kea:
  25014. {
  25015. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  25016. #ifdef HAVE_CURVE25519
  25017. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  25018. #ifdef HAVE_PK_CALLBACKS
  25019. /* if callback then use it for shared secret */
  25020. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  25021. break;
  25022. }
  25023. #endif
  25024. ret = wc_curve25519_export_public_ex(
  25025. (curve25519_key*)ssl->hsKey,
  25026. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25027. EC25519_LITTLE_ENDIAN);
  25028. if (ret != 0) {
  25029. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25030. }
  25031. break;
  25032. }
  25033. #endif
  25034. #ifdef HAVE_CURVE448
  25035. if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
  25036. #ifdef HAVE_PK_CALLBACKS
  25037. /* if callback then use it for shared secret */
  25038. if (ssl->ctx->X448SharedSecretCb != NULL) {
  25039. break;
  25040. }
  25041. #endif
  25042. ret = wc_curve448_export_public_ex(
  25043. (curve448_key*)ssl->hsKey,
  25044. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25045. EC448_LITTLE_ENDIAN);
  25046. if (ret != 0) {
  25047. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25048. }
  25049. break;
  25050. }
  25051. #endif
  25052. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  25053. #ifdef HAVE_PK_CALLBACKS
  25054. /* if callback then use it for shared secret */
  25055. if (ssl->ctx->EccSharedSecretCb != NULL) {
  25056. break;
  25057. }
  25058. #endif
  25059. /* Place ECC key in buffer, leaving room for size */
  25060. PRIVATE_KEY_UNLOCK();
  25061. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  25062. args->encSecret + OPAQUE8_LEN, &args->encSz);
  25063. PRIVATE_KEY_LOCK();
  25064. if (ret != 0) {
  25065. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  25066. }
  25067. #endif /* HAVE_ECC */
  25068. break;
  25069. }
  25070. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25071. default:
  25072. ret = BAD_KEA_TYPE_E;
  25073. } /* switch(ssl->specs.kea) */
  25074. /* Check for error */
  25075. if (ret != 0) {
  25076. goto exit_scke;
  25077. }
  25078. /* Advance state and proceed */
  25079. ssl->options.asyncState = TLS_ASYNC_DO;
  25080. } /* case TLS_ASYNC_BUILD */
  25081. FALL_THROUGH;
  25082. case TLS_ASYNC_DO:
  25083. {
  25084. switch(ssl->specs.kea)
  25085. {
  25086. #ifndef NO_RSA
  25087. case rsa_kea:
  25088. {
  25089. ret = RsaEnc(ssl,
  25090. ssl->arrays->preMasterSecret, SECRET_LEN,
  25091. args->encSecret, &args->encSz,
  25092. ssl->peerRsaKey,
  25093. #if defined(HAVE_PK_CALLBACKS)
  25094. &ssl->buffers.peerRsaKey
  25095. #else
  25096. NULL
  25097. #endif
  25098. );
  25099. break;
  25100. }
  25101. #endif /* !NO_RSA */
  25102. #ifndef NO_DH
  25103. case diffie_hellman_kea:
  25104. {
  25105. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  25106. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  25107. ssl->buffers.serverDH_Pub.buffer,
  25108. ssl->buffers.serverDH_Pub.length,
  25109. ssl->arrays->preMasterSecret,
  25110. &ssl->arrays->preMasterSz,
  25111. ssl->buffers.serverDH_P.buffer,
  25112. ssl->buffers.serverDH_P.length);
  25113. break;
  25114. }
  25115. #endif /* !NO_DH */
  25116. #ifndef NO_PSK
  25117. case psk_kea:
  25118. {
  25119. break;
  25120. }
  25121. #endif /* !NO_PSK */
  25122. #if !defined(NO_DH) && !defined(NO_PSK)
  25123. case dhe_psk_kea:
  25124. {
  25125. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  25126. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  25127. ssl->buffers.serverDH_Pub.buffer,
  25128. ssl->buffers.serverDH_Pub.length,
  25129. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25130. &ssl->arrays->preMasterSz,
  25131. ssl->buffers.serverDH_P.buffer,
  25132. ssl->buffers.serverDH_P.length);
  25133. break;
  25134. }
  25135. #endif /* !NO_DH && !NO_PSK */
  25136. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25137. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25138. case ecdhe_psk_kea:
  25139. {
  25140. #ifdef HAVE_CURVE25519
  25141. if (ssl->peerX25519KeyPresent) {
  25142. ret = X25519SharedSecret(ssl,
  25143. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  25144. args->output + OPAQUE8_LEN, &args->length,
  25145. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25146. &ssl->arrays->preMasterSz,
  25147. WOLFSSL_CLIENT_END
  25148. );
  25149. if (!ssl->specs.static_ecdh
  25150. #ifdef WOLFSSL_ASYNC_CRYPT
  25151. && ret != WC_PENDING_E
  25152. #endif
  25153. ) {
  25154. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25155. (void**)&ssl->peerX25519Key);
  25156. ssl->peerX25519KeyPresent = 0;
  25157. }
  25158. break;
  25159. }
  25160. #endif
  25161. #ifdef HAVE_CURVE448
  25162. if (ssl->peerX448KeyPresent) {
  25163. ret = X448SharedSecret(ssl,
  25164. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  25165. args->output + OPAQUE8_LEN, &args->length,
  25166. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25167. &ssl->arrays->preMasterSz,
  25168. WOLFSSL_CLIENT_END
  25169. );
  25170. if (!ssl->specs.static_ecdh
  25171. #ifdef WOLFSSL_ASYNC_CRYPT
  25172. && ret != WC_PENDING_E
  25173. #endif
  25174. ) {
  25175. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  25176. (void**)&ssl->peerX448Key);
  25177. ssl->peerX448KeyPresent = 0;
  25178. }
  25179. break;
  25180. }
  25181. #endif
  25182. ret = EccSharedSecret(ssl,
  25183. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  25184. args->output + OPAQUE8_LEN, &args->length,
  25185. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  25186. &ssl->arrays->preMasterSz,
  25187. WOLFSSL_CLIENT_END
  25188. );
  25189. #ifdef WOLFSSL_ASYNC_CRYPT
  25190. if (ret != WC_PENDING_E)
  25191. #endif
  25192. {
  25193. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  25194. (void**)&ssl->peerEccKey);
  25195. ssl->peerEccKeyPresent = 0;
  25196. }
  25197. break;
  25198. }
  25199. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  25200. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25201. defined(HAVE_CURVE448)
  25202. case ecc_diffie_hellman_kea:
  25203. {
  25204. #ifdef HAVE_ECC
  25205. ecc_key* peerKey;
  25206. #endif
  25207. #ifdef HAVE_CURVE25519
  25208. if (ssl->peerX25519KeyPresent) {
  25209. ret = X25519SharedSecret(ssl,
  25210. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  25211. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25212. ssl->arrays->preMasterSecret,
  25213. &ssl->arrays->preMasterSz,
  25214. WOLFSSL_CLIENT_END
  25215. );
  25216. if (!ssl->specs.static_ecdh
  25217. #ifdef WOLFSSL_ASYNC_CRYPT
  25218. && ret != WC_PENDING_E
  25219. #endif
  25220. ) {
  25221. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  25222. (void**)&ssl->peerX25519Key);
  25223. ssl->peerX25519KeyPresent = 0;
  25224. }
  25225. break;
  25226. }
  25227. #endif
  25228. #ifdef HAVE_CURVE448
  25229. if (ssl->peerX448KeyPresent) {
  25230. ret = X448SharedSecret(ssl,
  25231. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  25232. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25233. ssl->arrays->preMasterSecret,
  25234. &ssl->arrays->preMasterSz,
  25235. WOLFSSL_CLIENT_END
  25236. );
  25237. if (!ssl->specs.static_ecdh
  25238. #ifdef WOLFSSL_ASYNC_CRYPT
  25239. && ret != WC_PENDING_E
  25240. #endif
  25241. ) {
  25242. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  25243. (void**)&ssl->peerX448Key);
  25244. ssl->peerX448KeyPresent = 0;
  25245. }
  25246. break;
  25247. }
  25248. #endif
  25249. #ifdef HAVE_ECC
  25250. peerKey = (ssl->specs.static_ecdh) ?
  25251. ssl->peerEccDsaKey : ssl->peerEccKey;
  25252. ret = EccSharedSecret(ssl,
  25253. (ecc_key*)ssl->hsKey, peerKey,
  25254. args->encSecret + OPAQUE8_LEN, &args->encSz,
  25255. ssl->arrays->preMasterSecret,
  25256. &ssl->arrays->preMasterSz,
  25257. WOLFSSL_CLIENT_END
  25258. );
  25259. if (!ssl->specs.static_ecdh
  25260. #ifdef WOLFSSL_ASYNC_CRYPT
  25261. && ret != WC_PENDING_E
  25262. #endif
  25263. && !ssl->options.keepResources) {
  25264. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  25265. (void**)&ssl->peerEccKey);
  25266. ssl->peerEccKeyPresent = 0;
  25267. }
  25268. #endif
  25269. break;
  25270. }
  25271. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25272. default:
  25273. ret = BAD_KEA_TYPE_E;
  25274. } /* switch(ssl->specs.kea) */
  25275. /* Check for error */
  25276. if (ret != 0) {
  25277. goto exit_scke;
  25278. }
  25279. /* Advance state and proceed */
  25280. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  25281. } /* case TLS_ASYNC_DO */
  25282. FALL_THROUGH;
  25283. case TLS_ASYNC_VERIFY:
  25284. {
  25285. switch(ssl->specs.kea)
  25286. {
  25287. #ifndef NO_RSA
  25288. case rsa_kea:
  25289. {
  25290. break;
  25291. }
  25292. #endif /* !NO_RSA */
  25293. #ifndef NO_DH
  25294. case diffie_hellman_kea:
  25295. {
  25296. break;
  25297. }
  25298. #endif /* !NO_DH */
  25299. #ifndef NO_PSK
  25300. case psk_kea:
  25301. {
  25302. break;
  25303. }
  25304. #endif /* !NO_PSK */
  25305. #if !defined(NO_DH) && !defined(NO_PSK)
  25306. case dhe_psk_kea:
  25307. {
  25308. byte* pms = ssl->arrays->preMasterSecret;
  25309. /* validate args */
  25310. if (args->output == NULL || args->length == 0) {
  25311. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  25312. }
  25313. c16toa((word16)args->length, args->output);
  25314. args->encSz += args->length + OPAQUE16_LEN;
  25315. c16toa((word16)ssl->arrays->preMasterSz, pms);
  25316. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  25317. pms += ssl->arrays->preMasterSz;
  25318. /* make psk pre master secret */
  25319. /* length of key + length 0s + length of key + key */
  25320. c16toa((word16)ssl->arrays->psk_keySz, pms);
  25321. pms += OPAQUE16_LEN;
  25322. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25323. ssl->arrays->preMasterSz +=
  25324. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  25325. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25326. ssl->arrays->psk_keySz = 0; /* No further need */
  25327. break;
  25328. }
  25329. #endif /* !NO_DH && !NO_PSK */
  25330. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25331. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25332. case ecdhe_psk_kea:
  25333. {
  25334. byte* pms = ssl->arrays->preMasterSecret;
  25335. /* validate args */
  25336. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  25337. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  25338. }
  25339. /* place size of public key in output buffer */
  25340. *args->output = (byte)args->length;
  25341. args->encSz += args->length + OPAQUE8_LEN;
  25342. /* Create pre master secret is the concatenation of
  25343. eccSize + eccSharedKey + pskSize + pskKey */
  25344. c16toa((word16)ssl->arrays->preMasterSz, pms);
  25345. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  25346. pms += ssl->arrays->preMasterSz;
  25347. c16toa((word16)ssl->arrays->psk_keySz, pms);
  25348. pms += OPAQUE16_LEN;
  25349. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25350. ssl->arrays->preMasterSz +=
  25351. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  25352. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  25353. ssl->arrays->psk_keySz = 0; /* No further need */
  25354. break;
  25355. }
  25356. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  25357. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25358. defined(HAVE_CURVE448)
  25359. case ecc_diffie_hellman_kea:
  25360. {
  25361. /* place size of public key in buffer */
  25362. *args->encSecret = (byte)args->encSz;
  25363. args->encSz += OPAQUE8_LEN;
  25364. break;
  25365. }
  25366. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25367. default:
  25368. ret = BAD_KEA_TYPE_E;
  25369. } /* switch(ssl->specs.kea) */
  25370. /* Check for error */
  25371. if (ret != 0) {
  25372. goto exit_scke;
  25373. }
  25374. /* Advance state and proceed */
  25375. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  25376. } /* case TLS_ASYNC_VERIFY */
  25377. FALL_THROUGH;
  25378. case TLS_ASYNC_FINALIZE:
  25379. {
  25380. word32 tlsSz = 0;
  25381. word32 idx = 0;
  25382. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  25383. tlsSz = 2;
  25384. }
  25385. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  25386. ssl->specs.kea == dhe_psk_kea ||
  25387. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  25388. tlsSz = 0;
  25389. }
  25390. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  25391. args->sendSz = args->encSz + tlsSz + idx;
  25392. #ifdef WOLFSSL_DTLS
  25393. if (ssl->options.dtls) {
  25394. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  25395. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  25396. }
  25397. #endif
  25398. if (IsEncryptionOn(ssl, 1)) {
  25399. args->sendSz += MAX_MSG_EXTRA;
  25400. }
  25401. /* check for available size */
  25402. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0)
  25403. goto exit_scke;
  25404. /* get output buffer */
  25405. args->output = ssl->buffers.outputBuffer.buffer +
  25406. ssl->buffers.outputBuffer.length;
  25407. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  25408. if (tlsSz) {
  25409. c16toa((word16)args->encSz, &args->output[idx]);
  25410. idx += OPAQUE16_LEN;
  25411. }
  25412. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  25413. idx += args->encSz;
  25414. if (IsEncryptionOn(ssl, 1)) {
  25415. int recordHeaderSz = RECORD_HEADER_SZ;
  25416. if (ssl->options.dtls)
  25417. recordHeaderSz += DTLS_RECORD_EXTRA;
  25418. args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
  25419. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  25420. DYNAMIC_TYPE_IN_BUFFER);
  25421. if (args->input == NULL) {
  25422. ERROR_OUT(MEMORY_E, exit_scke);
  25423. }
  25424. XMEMCPY(args->input, args->output + recordHeaderSz,
  25425. args->inputSz);
  25426. }
  25427. /* Advance state and proceed */
  25428. ssl->options.asyncState = TLS_ASYNC_END;
  25429. } /* case TLS_ASYNC_FINALIZE */
  25430. FALL_THROUGH;
  25431. case TLS_ASYNC_END:
  25432. {
  25433. if (IsEncryptionOn(ssl, 1)) {
  25434. #ifdef WOLFSSL_DTLS
  25435. if (IsDtlsNotSctpMode(ssl) &&
  25436. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
  25437. goto exit_scke;
  25438. }
  25439. #endif
  25440. ret = BuildMessage(ssl, args->output, args->sendSz,
  25441. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  25442. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25443. args->input = NULL; /* make sure its not double free'd on cleanup */
  25444. if (ret >= 0) {
  25445. args->sendSz = ret;
  25446. ret = 0;
  25447. }
  25448. }
  25449. else {
  25450. #ifdef WOLFSSL_DTLS
  25451. if (IsDtlsNotSctpMode(ssl)) {
  25452. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
  25453. goto exit_scke;
  25454. }
  25455. }
  25456. if (ssl->options.dtls)
  25457. DtlsSEQIncrement(ssl, CUR_ORDER);
  25458. #endif
  25459. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  25460. }
  25461. if (ret != 0) {
  25462. goto exit_scke;
  25463. }
  25464. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  25465. if (ssl->hsInfoOn)
  25466. AddPacketName(ssl, "ClientKeyExchange");
  25467. if (ssl->toInfoOn)
  25468. AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  25469. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  25470. #endif
  25471. ssl->buffers.outputBuffer.length += args->sendSz;
  25472. if (!ssl->options.groupMessages) {
  25473. ret = SendBuffered(ssl);
  25474. }
  25475. if (ret == 0 || ret == WANT_WRITE) {
  25476. int tmpRet = MakeMasterSecret(ssl);
  25477. if (tmpRet != 0) {
  25478. ret = tmpRet; /* save WANT_WRITE unless more serious */
  25479. }
  25480. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  25481. ssl->options.buildingMsg = 0;
  25482. }
  25483. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  25484. if (ssl->keyLogCb != NULL) {
  25485. int secretSz = SECRET_LEN;
  25486. ret = ssl->keyLogCb(ssl, ssl->arrays->masterSecret, &secretSz,
  25487. NULL);
  25488. if (ret != 0 || secretSz != SECRET_LEN)
  25489. return SESSION_SECRET_CB_E;
  25490. }
  25491. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  25492. break;
  25493. }
  25494. default:
  25495. ret = INPUT_CASE_ERROR;
  25496. } /* switch(ssl->options.asyncState) */
  25497. exit_scke:
  25498. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  25499. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  25500. #ifdef WOLFSSL_ASYNC_IO
  25501. /* Handle async operation */
  25502. if (ret == WC_PENDING_E || ret == WANT_WRITE) {
  25503. if (ssl->options.buildingMsg)
  25504. return ret;
  25505. /* If we have completed all states then we will not enter this function
  25506. * again. We need to do clean up now. */
  25507. }
  25508. #endif
  25509. /* No further need for PMS */
  25510. if (ssl->arrays->preMasterSecret != NULL) {
  25511. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  25512. }
  25513. ssl->arrays->preMasterSz = 0;
  25514. /* Final cleanup */
  25515. #ifdef WOLFSSL_ASYNC_IO
  25516. /* Cleanup async */
  25517. FreeAsyncCtx(ssl, 0);
  25518. #else
  25519. FreeSckeArgs(ssl, args);
  25520. #endif
  25521. FreeKeyExchange(ssl);
  25522. if (ret != 0) {
  25523. WOLFSSL_ERROR_VERBOSE(ret);
  25524. }
  25525. return ret;
  25526. }
  25527. #endif /* !WOLFSSL_NO_TLS12 */
  25528. #ifndef NO_CERTS
  25529. #ifndef WOLFSSL_NO_TLS12
  25530. #ifndef WOLFSSL_NO_CLIENT_AUTH
  25531. typedef struct ScvArgs {
  25532. byte* output; /* not allocated */
  25533. #ifndef NO_RSA
  25534. byte* verifySig;
  25535. #endif
  25536. byte* verify; /* not allocated */
  25537. byte* input;
  25538. word32 idx;
  25539. word32 extraSz;
  25540. word32 sigSz;
  25541. int sendSz;
  25542. int inputSz;
  25543. word16 length;
  25544. byte sigAlgo;
  25545. } ScvArgs;
  25546. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  25547. {
  25548. ScvArgs* args = (ScvArgs*)pArgs;
  25549. (void)ssl;
  25550. #ifndef NO_RSA
  25551. if (args->verifySig) {
  25552. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25553. args->verifySig = NULL;
  25554. }
  25555. #endif
  25556. if (args->input) {
  25557. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25558. args->input = NULL;
  25559. }
  25560. }
  25561. /* handle generation of certificate_verify (15) */
  25562. int SendCertificateVerify(WOLFSSL* ssl)
  25563. {
  25564. int ret = 0;
  25565. #ifdef WOLFSSL_ASYNC_IO
  25566. ScvArgs* args = NULL;
  25567. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  25568. #else
  25569. ScvArgs args[1];
  25570. #endif
  25571. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  25572. WOLFSSL_ENTER("SendCertificateVerify");
  25573. #ifdef WOLFSSL_ASYNC_IO
  25574. if (ssl->async == NULL) {
  25575. ssl->async = (struct WOLFSSL_ASYNC*)
  25576. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  25577. DYNAMIC_TYPE_ASYNC);
  25578. if (ssl->async == NULL)
  25579. ERROR_OUT(MEMORY_E, exit_scv);
  25580. }
  25581. args = (ScvArgs*)ssl->async->args;
  25582. #ifdef WOLFSSL_ASYNC_CRYPT
  25583. /* BuildMessage does its own Pop */
  25584. if (ssl->error != WC_PENDING_E ||
  25585. ssl->options.asyncState != TLS_ASYNC_END)
  25586. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  25587. if (ret != WC_NOT_PENDING_E) {
  25588. /* Check for error */
  25589. if (ret < 0)
  25590. goto exit_scv;
  25591. }
  25592. else
  25593. #endif
  25594. if (ssl->options.buildingMsg) {
  25595. /* We should be in the sending state. */
  25596. if (ssl->options.asyncState != TLS_ASYNC_END) {
  25597. ret = BAD_STATE_E;
  25598. goto exit_scv;
  25599. }
  25600. }
  25601. else
  25602. #endif
  25603. {
  25604. /* Reset state */
  25605. ret = 0;
  25606. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  25607. XMEMSET(args, 0, sizeof(ScvArgs));
  25608. #ifdef WOLFSSL_ASYNC_IO
  25609. ssl->async->freeArgs = FreeScvArgs;
  25610. #endif
  25611. }
  25612. switch(ssl->options.asyncState)
  25613. {
  25614. case TLS_ASYNC_BEGIN:
  25615. {
  25616. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  25617. return 0; /* sent blank cert, can't verify */
  25618. }
  25619. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  25620. if (IsEncryptionOn(ssl, 1)) {
  25621. args->sendSz += MAX_MSG_EXTRA;
  25622. }
  25623. /* Use tmp buffer */
  25624. args->input = (byte*)XMALLOC(args->sendSz,
  25625. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25626. if (args->input == NULL)
  25627. ERROR_OUT(MEMORY_E, exit_scv);
  25628. args->output = args->input;
  25629. /* Advance state and proceed */
  25630. ssl->options.asyncState = TLS_ASYNC_BUILD;
  25631. } /* case TLS_ASYNC_BEGIN */
  25632. FALL_THROUGH;
  25633. case TLS_ASYNC_BUILD:
  25634. {
  25635. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  25636. if (ret != 0) {
  25637. goto exit_scv;
  25638. }
  25639. if (ssl->buffers.key == NULL) {
  25640. #ifdef HAVE_PK_CALLBACKS
  25641. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  25642. args->length = GetPrivateKeySigSize(ssl);
  25643. else
  25644. #endif
  25645. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  25646. }
  25647. else {
  25648. /* Decode private key. */
  25649. ret = DecodePrivateKey(ssl, &args->length);
  25650. if (ret != 0) {
  25651. goto exit_scv;
  25652. }
  25653. }
  25654. if (args->length == 0) {
  25655. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  25656. }
  25657. /* idx is used to track verify pointer offset to output */
  25658. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  25659. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  25660. args->extraSz = 0; /* tls 1.2 hash/sig */
  25661. /* build encoded signature buffer */
  25662. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  25663. ssl->buffers.sig.buffer = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  25664. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25665. if (ssl->buffers.sig.buffer == NULL) {
  25666. ERROR_OUT(MEMORY_E, exit_scv);
  25667. }
  25668. #ifdef WOLFSSL_DTLS
  25669. if (ssl->options.dtls) {
  25670. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25671. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25672. }
  25673. #endif
  25674. #ifndef NO_OLD_TLS
  25675. #ifndef NO_SHA
  25676. /* old tls default */
  25677. SetDigest(ssl, sha_mac);
  25678. #endif
  25679. #else
  25680. #ifndef NO_SHA256
  25681. /* new tls default */
  25682. SetDigest(ssl, sha256_mac);
  25683. #endif
  25684. #endif /* !NO_OLD_TLS */
  25685. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  25686. #ifdef WC_RSA_PSS
  25687. if (IsAtLeastTLSv1_2(ssl) &&
  25688. (ssl->pssAlgo & (1 << ssl->suites->hashAlgo))) {
  25689. args->sigAlgo = rsa_pss_sa_algo;
  25690. }
  25691. else
  25692. #endif
  25693. args->sigAlgo = rsa_sa_algo;
  25694. }
  25695. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  25696. args->sigAlgo = ecc_dsa_sa_algo;
  25697. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  25698. args->sigAlgo = ed25519_sa_algo;
  25699. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  25700. args->sigAlgo = ed448_sa_algo;
  25701. if (IsAtLeastTLSv1_2(ssl)) {
  25702. EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo,
  25703. args->verify);
  25704. args->extraSz = HASH_SIG_SIZE;
  25705. SetDigest(ssl, ssl->suites->hashAlgo);
  25706. }
  25707. #ifndef NO_OLD_TLS
  25708. else {
  25709. /* if old TLS load MD5 and SHA hash as value to sign
  25710. * MD5 and SHA must be first two buffers in stucture */
  25711. XMEMCPY(ssl->buffers.sig.buffer,
  25712. (byte*)&ssl->hsHashes->certHashes, FINISHED_SZ);
  25713. }
  25714. #endif
  25715. #ifndef NO_RSA
  25716. if (args->sigAlgo == rsa_sa_algo) {
  25717. ssl->buffers.sig.length = FINISHED_SZ;
  25718. args->sigSz = ENCRYPT_LEN;
  25719. if (IsAtLeastTLSv1_2(ssl)) {
  25720. ssl->buffers.sig.length = wc_EncodeSignature(
  25721. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  25722. ssl->buffers.digest.length,
  25723. TypeHash(ssl->suites->hashAlgo));
  25724. }
  25725. /* prepend hdr */
  25726. c16toa(args->length, args->verify + args->extraSz);
  25727. }
  25728. #ifdef WC_RSA_PSS
  25729. else if (args->sigAlgo == rsa_pss_sa_algo) {
  25730. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  25731. ssl->buffers.digest.length);
  25732. ssl->buffers.sig.length = ssl->buffers.digest.length;
  25733. args->sigSz = ENCRYPT_LEN;
  25734. /* prepend hdr */
  25735. c16toa(args->length, args->verify + args->extraSz);
  25736. }
  25737. #endif
  25738. #endif /* !NO_RSA */
  25739. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  25740. if (args->sigAlgo == ed25519_sa_algo) {
  25741. ret = Ed25519CheckPubKey(ssl);
  25742. if (ret != 0)
  25743. goto exit_scv;
  25744. }
  25745. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  25746. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  25747. if (args->sigAlgo == ed448_sa_algo) {
  25748. ret = Ed448CheckPubKey(ssl);
  25749. if (ret != 0)
  25750. goto exit_scv;
  25751. }
  25752. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  25753. /* Advance state and proceed */
  25754. ssl->options.asyncState = TLS_ASYNC_DO;
  25755. } /* case TLS_ASYNC_BUILD */
  25756. FALL_THROUGH;
  25757. case TLS_ASYNC_DO:
  25758. {
  25759. #ifdef HAVE_ECC
  25760. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  25761. ecc_key* key = (ecc_key*)ssl->hsKey;
  25762. ret = EccSign(ssl,
  25763. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  25764. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  25765. key,
  25766. #ifdef HAVE_PK_CALLBACKS
  25767. ssl->buffers.key
  25768. #else
  25769. NULL
  25770. #endif
  25771. );
  25772. }
  25773. #endif /* HAVE_ECC */
  25774. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  25775. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  25776. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  25777. ret = Ed25519Sign(ssl,
  25778. ssl->hsHashes->messages, ssl->hsHashes->length,
  25779. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  25780. key,
  25781. #ifdef HAVE_PK_CALLBACKS
  25782. ssl->buffers.key
  25783. #else
  25784. NULL
  25785. #endif
  25786. );
  25787. }
  25788. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  25789. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  25790. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  25791. ed448_key* key = (ed448_key*)ssl->hsKey;
  25792. ret = Ed448Sign(ssl,
  25793. ssl->hsHashes->messages, ssl->hsHashes->length,
  25794. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  25795. key,
  25796. #ifdef HAVE_PK_CALLBACKS
  25797. ssl->buffers.key
  25798. #else
  25799. NULL
  25800. #endif
  25801. );
  25802. }
  25803. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  25804. #ifndef NO_RSA
  25805. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  25806. RsaKey* key = (RsaKey*)ssl->hsKey;
  25807. /* restore verify pointer */
  25808. args->verify = &args->output[args->idx];
  25809. ret = RsaSign(ssl,
  25810. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  25811. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  25812. args->sigAlgo, ssl->suites->hashAlgo, key,
  25813. ssl->buffers.key
  25814. );
  25815. }
  25816. #endif /* !NO_RSA */
  25817. /* Check for error */
  25818. if (ret != 0) {
  25819. goto exit_scv;
  25820. }
  25821. /* Advance state and proceed */
  25822. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  25823. } /* case TLS_ASYNC_DO */
  25824. FALL_THROUGH;
  25825. case TLS_ASYNC_VERIFY:
  25826. {
  25827. /* restore verify pointer */
  25828. args->verify = &args->output[args->idx];
  25829. switch (ssl->hsType) {
  25830. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  25831. #ifdef HAVE_ECC
  25832. case DYNAMIC_TYPE_ECC:
  25833. #endif
  25834. #ifdef HAVE_ED25519
  25835. case DYNAMIC_TYPE_ED25519:
  25836. #endif
  25837. #ifdef HAVE_ED448
  25838. case DYNAMIC_TYPE_ED448:
  25839. #endif
  25840. args->length = (word16)ssl->buffers.sig.length;
  25841. /* prepend hdr */
  25842. c16toa(args->length, args->verify + args->extraSz);
  25843. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  25844. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  25845. break;
  25846. #endif
  25847. #ifndef NO_RSA
  25848. case DYNAMIC_TYPE_RSA:
  25849. {
  25850. RsaKey* key = (RsaKey*)ssl->hsKey;
  25851. if (args->verifySig == NULL) {
  25852. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  25853. DYNAMIC_TYPE_SIGNATURE);
  25854. if (args->verifySig == NULL) {
  25855. ERROR_OUT(MEMORY_E, exit_scv);
  25856. }
  25857. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  25858. VERIFY_HEADER, args->sigSz);
  25859. }
  25860. /* check for signature faults */
  25861. ret = VerifyRsaSign(ssl,
  25862. args->verifySig, args->sigSz,
  25863. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  25864. args->sigAlgo, ssl->suites->hashAlgo, key,
  25865. ssl->buffers.key
  25866. );
  25867. /* free temporary buffer now */
  25868. if (ret != WC_PENDING_E) {
  25869. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25870. args->verifySig = NULL;
  25871. }
  25872. break;
  25873. }
  25874. #endif /* !NO_RSA */
  25875. default:
  25876. break;
  25877. }
  25878. /* Check for error */
  25879. if (ret != 0) {
  25880. goto exit_scv;
  25881. }
  25882. /* Advance state and proceed */
  25883. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  25884. } /* case TLS_ASYNC_VERIFY */
  25885. FALL_THROUGH;
  25886. case TLS_ASYNC_FINALIZE:
  25887. {
  25888. if (args->output == NULL) {
  25889. ERROR_OUT(BUFFER_ERROR, exit_scv);
  25890. }
  25891. AddHeaders(args->output, (word32)args->length + args->extraSz +
  25892. VERIFY_HEADER, certificate_verify, ssl);
  25893. /* Advance state and proceed */
  25894. ssl->options.asyncState = TLS_ASYNC_END;
  25895. } /* case TLS_ASYNC_FINALIZE */
  25896. FALL_THROUGH;
  25897. case TLS_ASYNC_END:
  25898. {
  25899. ret = SendHandshakeMsg(ssl, args->output,
  25900. (word32)args->length + args->extraSz + VERIFY_HEADER,
  25901. certificate_verify, "CertificateVerify");
  25902. if (ret != 0)
  25903. goto exit_scv;
  25904. break;
  25905. }
  25906. default:
  25907. ret = INPUT_CASE_ERROR;
  25908. } /* switch(ssl->options.asyncState) */
  25909. exit_scv:
  25910. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  25911. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  25912. #ifdef WOLFSSL_ASYNC_IO
  25913. /* Handle async operation */
  25914. if (ret == WANT_WRITE
  25915. #ifdef WOLFSSL_ASYNC_CRYPT
  25916. || ret == WC_PENDING_E
  25917. #endif
  25918. )
  25919. return ret;
  25920. #endif /* WOLFSSL_ASYNC_IO */
  25921. /* Digest is not allocated, so do this to prevent free */
  25922. ssl->buffers.digest.buffer = NULL;
  25923. ssl->buffers.digest.length = 0;
  25924. /* Final cleanup */
  25925. #ifdef WOLFSSL_ASYNC_IO
  25926. /* Cleanup async */
  25927. FreeAsyncCtx(ssl, 0);
  25928. #else
  25929. FreeScvArgs(ssl, args);
  25930. #endif
  25931. FreeKeyExchange(ssl);
  25932. if (ret != 0) {
  25933. WOLFSSL_ERROR_VERBOSE(ret);
  25934. }
  25935. return ret;
  25936. }
  25937. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  25938. #endif /* WOLFSSL_NO_TLS12 */
  25939. #endif /* NO_CERTS */
  25940. #ifdef HAVE_SESSION_TICKET
  25941. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  25942. {
  25943. /* Free old dynamic ticket if we already had one */
  25944. if (ssl->session->ticketLenAlloc > 0) {
  25945. XFREE(ssl->session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  25946. ssl->session->ticket = ssl->session->staticTicket;
  25947. ssl->session->ticketLenAlloc = 0;
  25948. }
  25949. if (length > sizeof(ssl->session->staticTicket)) {
  25950. byte* sessionTicket =
  25951. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  25952. if (sessionTicket == NULL)
  25953. return MEMORY_E;
  25954. ssl->session->ticket = sessionTicket;
  25955. ssl->session->ticketLenAlloc = (word16)length;
  25956. }
  25957. ssl->session->ticketLen = (word16)length;
  25958. if (length > 0) {
  25959. XMEMCPY(ssl->session->ticket, ticket, length);
  25960. if (ssl->session_ticket_cb != NULL) {
  25961. ssl->session_ticket_cb(ssl,
  25962. ssl->session->ticket, ssl->session->ticketLen,
  25963. ssl->session_ticket_ctx);
  25964. }
  25965. /* Create a fake sessionID based on the ticket, this will
  25966. * supersede the existing session cache info. */
  25967. ssl->options.haveSessionId = 1;
  25968. #ifdef WOLFSSL_TLS13
  25969. if (ssl->options.tls1_3) {
  25970. XMEMCPY(ssl->session->sessionID,
  25971. ssl->session->ticket + length - ID_LEN, ID_LEN);
  25972. ssl->session->sessionIDSz = ID_LEN;
  25973. }
  25974. else
  25975. #endif
  25976. {
  25977. XMEMCPY(ssl->arrays->sessionID,
  25978. ssl->session->ticket + length - ID_LEN, ID_LEN);
  25979. ssl->arrays->sessionIDSz = ID_LEN;
  25980. }
  25981. }
  25982. return 0;
  25983. }
  25984. #ifndef WOLFSSL_NO_TLS12
  25985. /* handle processing of session_ticket (4) */
  25986. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  25987. word32 size)
  25988. {
  25989. word32 begin = *inOutIdx;
  25990. word32 lifetime;
  25991. word16 length;
  25992. int ret;
  25993. if (ssl->expect_session_ticket == 0) {
  25994. WOLFSSL_MSG("Unexpected session ticket");
  25995. WOLFSSL_ERROR_VERBOSE(SESSION_TICKET_EXPECT_E);
  25996. return SESSION_TICKET_EXPECT_E;
  25997. }
  25998. if (OPAQUE32_LEN > size)
  25999. return BUFFER_ERROR;
  26000. ato32(input + *inOutIdx, &lifetime);
  26001. *inOutIdx += OPAQUE32_LEN;
  26002. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  26003. return BUFFER_ERROR;
  26004. ato16(input + *inOutIdx, &length);
  26005. *inOutIdx += OPAQUE16_LEN;
  26006. if ((*inOutIdx - begin) + length > size)
  26007. return BUFFER_ERROR;
  26008. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  26009. return ret;
  26010. *inOutIdx += length;
  26011. if (length > 0) {
  26012. ssl->timeout = lifetime;
  26013. #ifndef NO_SESSION_CACHE
  26014. AddSession(ssl);
  26015. #endif
  26016. }
  26017. if (IsEncryptionOn(ssl, 0)) {
  26018. *inOutIdx += ssl->keys.padSz;
  26019. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  26020. if (ssl->options.startedETMRead)
  26021. *inOutIdx += MacSize(ssl);
  26022. #endif
  26023. }
  26024. ssl->expect_session_ticket = 0;
  26025. return 0;
  26026. }
  26027. #endif /* !WOLFSSL_NO_TLS12 */
  26028. #endif /* HAVE_SESSION_TICKET */
  26029. #endif /* NO_WOLFSSL_CLIENT */
  26030. #ifndef NO_CERTS
  26031. #ifdef WOLF_PRIVATE_KEY_ID
  26032. int GetPrivateKeySigSize(WOLFSSL* ssl)
  26033. {
  26034. int sigSz = 0;
  26035. if (ssl == NULL)
  26036. return 0;
  26037. switch (ssl->buffers.keyType) {
  26038. #ifndef NO_RSA
  26039. #ifdef WC_RSA_PSS
  26040. case rsa_pss_sa_algo:
  26041. #endif
  26042. case rsa_sa_algo:
  26043. sigSz = ssl->buffers.keySz;
  26044. ssl->hsType = DYNAMIC_TYPE_RSA;
  26045. break;
  26046. #endif
  26047. #ifdef HAVE_ECC
  26048. case ecc_dsa_sa_algo:
  26049. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  26050. ssl->hsType = DYNAMIC_TYPE_ECC;
  26051. break;
  26052. #endif
  26053. #ifdef HAVE_ED25519
  26054. case ed25519_sa_algo:
  26055. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  26056. ssl->hsType = DYNAMIC_TYPE_ED25519;
  26057. break;
  26058. #endif
  26059. #ifdef HAVE_ED448
  26060. case ed448_sa_algo:
  26061. sigSz = ED448_SIG_SIZE; /* fixed known value */
  26062. ssl->hsType = DYNAMIC_TYPE_ED448;
  26063. break;
  26064. #endif
  26065. default:
  26066. break;
  26067. }
  26068. return sigSz;
  26069. }
  26070. #endif /* HAVE_PK_CALLBACKS */
  26071. #endif /* NO_CERTS */
  26072. #ifdef HAVE_ECC
  26073. /* returns the WOLFSSL_* version of the curve from the OID sum */
  26074. word16 GetCurveByOID(int oidSum) {
  26075. switch(oidSum) {
  26076. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  26077. #ifndef NO_ECC_SECP
  26078. case ECC_SECP160R1_OID:
  26079. return WOLFSSL_ECC_SECP160R1;
  26080. #endif /* !NO_ECC_SECP */
  26081. #ifdef HAVE_ECC_SECPR2
  26082. case ECC_SECP160R2_OID:
  26083. return WOLFSSL_ECC_SECP160R2;
  26084. #endif /* HAVE_ECC_SECPR2 */
  26085. #ifdef HAVE_ECC_KOBLITZ
  26086. case ECC_SECP160K1_OID:
  26087. return WOLFSSL_ECC_SECP160K1;
  26088. #endif /* HAVE_ECC_KOBLITZ */
  26089. #endif
  26090. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  26091. #ifndef NO_ECC_SECP
  26092. case ECC_SECP192R1_OID:
  26093. return WOLFSSL_ECC_SECP192R1;
  26094. #endif /* !NO_ECC_SECP */
  26095. #ifdef HAVE_ECC_KOBLITZ
  26096. case ECC_SECP192K1_OID:
  26097. return WOLFSSL_ECC_SECP192K1;
  26098. #endif /* HAVE_ECC_KOBLITZ */
  26099. #endif
  26100. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  26101. #ifndef NO_ECC_SECP
  26102. case ECC_SECP224R1_OID:
  26103. return WOLFSSL_ECC_SECP224R1;
  26104. #endif /* !NO_ECC_SECP */
  26105. #ifdef HAVE_ECC_KOBLITZ
  26106. case ECC_SECP224K1_OID:
  26107. return WOLFSSL_ECC_SECP224K1;
  26108. #endif /* HAVE_ECC_KOBLITZ */
  26109. #endif
  26110. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  26111. #ifndef NO_ECC_SECP
  26112. case ECC_SECP256R1_OID:
  26113. return WOLFSSL_ECC_SECP256R1;
  26114. #endif /* !NO_ECC_SECP */
  26115. #ifdef HAVE_ECC_KOBLITZ
  26116. case ECC_SECP256K1_OID:
  26117. return WOLFSSL_ECC_SECP256K1;
  26118. #endif /* HAVE_ECC_KOBLITZ */
  26119. #ifdef HAVE_ECC_BRAINPOOL
  26120. case ECC_BRAINPOOLP256R1_OID:
  26121. return WOLFSSL_ECC_BRAINPOOLP256R1;
  26122. #endif /* HAVE_ECC_BRAINPOOL */
  26123. #endif
  26124. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  26125. #ifndef NO_ECC_SECP
  26126. case ECC_SECP384R1_OID:
  26127. return WOLFSSL_ECC_SECP384R1;
  26128. #endif /* !NO_ECC_SECP */
  26129. #ifdef HAVE_ECC_BRAINPOOL
  26130. case ECC_BRAINPOOLP384R1_OID:
  26131. return WOLFSSL_ECC_BRAINPOOLP384R1;
  26132. #endif /* HAVE_ECC_BRAINPOOL */
  26133. #endif
  26134. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  26135. #ifdef HAVE_ECC_BRAINPOOL
  26136. case ECC_BRAINPOOLP512R1_OID:
  26137. return WOLFSSL_ECC_BRAINPOOLP512R1;
  26138. #endif /* HAVE_ECC_BRAINPOOL */
  26139. #endif
  26140. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  26141. #ifndef NO_ECC_SECP
  26142. case ECC_SECP521R1_OID:
  26143. return WOLFSSL_ECC_SECP521R1;
  26144. #endif /* !NO_ECC_SECP */
  26145. #endif
  26146. default:
  26147. WOLFSSL_MSG("Curve OID not compiled in or implemented");
  26148. return 0;
  26149. }
  26150. }
  26151. #endif /* HAVE_ECC */
  26152. #ifndef NO_WOLFSSL_SERVER
  26153. #ifndef WOLFSSL_NO_TLS12
  26154. /* handle generation of server_hello (2) */
  26155. int SendServerHello(WOLFSSL* ssl)
  26156. {
  26157. int ret;
  26158. byte *output;
  26159. word16 length;
  26160. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  26161. int sendSz;
  26162. byte sessIdSz = ID_LEN;
  26163. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  26164. byte echoId = 0; /* ticket echo id flag */
  26165. #endif
  26166. byte cacheOff = 0; /* session cache off flag */
  26167. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  26168. WOLFSSL_ENTER("SendServerHello");
  26169. length = VERSION_SZ + RAN_LEN
  26170. + ID_LEN + ENUM_LEN
  26171. + SUITE_LEN
  26172. + ENUM_LEN;
  26173. #ifdef HAVE_TLS_EXTENSIONS
  26174. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  26175. if (ret != 0)
  26176. return ret;
  26177. #ifdef HAVE_SESSION_TICKET
  26178. if (ssl->options.useTicket) {
  26179. /* echo session id sz can be 0,32 or bogus len in between */
  26180. sessIdSz = ssl->arrays->sessionIDSz;
  26181. if (sessIdSz > ID_LEN) {
  26182. WOLFSSL_MSG("Bad bogus session id len");
  26183. return BUFFER_ERROR;
  26184. }
  26185. if (!IsAtLeastTLSv1_3(ssl->version))
  26186. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  26187. echoId = 1;
  26188. }
  26189. #endif /* HAVE_SESSION_TICKET */
  26190. #else
  26191. if (ssl->options.haveEMS) {
  26192. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  26193. }
  26194. #endif
  26195. /* is the session cache off at build or runtime */
  26196. #ifdef NO_SESSION_CACHE
  26197. cacheOff = 1;
  26198. #else
  26199. if (ssl->options.sessionCacheOff == 1) {
  26200. cacheOff = 1;
  26201. }
  26202. #endif
  26203. /* if no session cache don't send a session ID unless we're echoing
  26204. * an ID as part of session tickets */
  26205. if (cacheOff == 1
  26206. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  26207. && echoId == 0
  26208. #endif
  26209. ) {
  26210. length -= ID_LEN; /* adjust ID_LEN assumption */
  26211. sessIdSz = 0;
  26212. }
  26213. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  26214. #ifdef WOLFSSL_DTLS
  26215. if (ssl->options.dtls) {
  26216. if (((ssl->keys.dtls_sequence_number_hi == ssl->keys.curSeq_hi &&
  26217. ssl->keys.dtls_sequence_number_lo < ssl->keys.curSeq_lo) ||
  26218. (ssl->keys.dtls_sequence_number_hi < ssl->keys.curSeq_hi))) {
  26219. /* Server Hello should use the same sequence number as the
  26220. * Client Hello if available. */
  26221. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  26222. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  26223. }
  26224. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26225. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26226. }
  26227. #endif /* WOLFSSL_DTLS */
  26228. if (IsEncryptionOn(ssl, 1))
  26229. sendSz += MAX_MSG_EXTRA;
  26230. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  26231. * is not advanced yet */
  26232. ssl->options.buildingMsg = 1;
  26233. /* check for available size */
  26234. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  26235. return ret;
  26236. /* get output buffer */
  26237. output = ssl->buffers.outputBuffer.buffer +
  26238. ssl->buffers.outputBuffer.length;
  26239. AddHeaders(output, length, server_hello, ssl);
  26240. /* now write to output */
  26241. /* first version */
  26242. output[idx++] = (byte)ssl->version.major;
  26243. output[idx++] = (byte)ssl->version.minor;
  26244. /* then random and session id */
  26245. if (!ssl->options.resuming) {
  26246. /* generate random part and session id */
  26247. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  26248. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  26249. if (ret != 0)
  26250. return ret;
  26251. #ifdef WOLFSSL_TLS13
  26252. if (TLSv1_3_Capable(ssl)) {
  26253. /* TLS v1.3 capable server downgraded. */
  26254. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  26255. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  26256. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  26257. }
  26258. else
  26259. #endif
  26260. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  26261. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  26262. (wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_2) == 0 &&
  26263. !IsAtLeastTLSv1_2(ssl)) {
  26264. /* TLS v1.2 capable server downgraded. */
  26265. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  26266. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  26267. output[idx + RAN_LEN - 1] = 0;
  26268. }
  26269. /* store info in SSL for later */
  26270. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  26271. idx += RAN_LEN;
  26272. output[idx++] = sessIdSz;
  26273. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  26274. ssl->arrays->sessionIDSz = sessIdSz;
  26275. }
  26276. else {
  26277. /* If resuming, use info from SSL */
  26278. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  26279. idx += RAN_LEN;
  26280. output[idx++] = sessIdSz;
  26281. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  26282. }
  26283. idx += sessIdSz;
  26284. #ifdef SHOW_SECRETS
  26285. {
  26286. int j;
  26287. printf("server random: ");
  26288. for (j = 0; j < RAN_LEN; j++)
  26289. printf("%02x", ssl->arrays->serverRandom[j]);
  26290. printf("\n");
  26291. }
  26292. #endif
  26293. /* then cipher suite */
  26294. output[idx++] = ssl->options.cipherSuite0;
  26295. output[idx++] = ssl->options.cipherSuite;
  26296. /* then compression */
  26297. if (ssl->options.usingCompression)
  26298. output[idx++] = ZLIB_COMPRESSION;
  26299. else
  26300. output[idx++] = NO_COMPRESSION;
  26301. /* last, extensions */
  26302. #ifdef HAVE_TLS_EXTENSIONS
  26303. {
  26304. word16 offset = 0;
  26305. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  26306. if (ret != 0)
  26307. return ret;
  26308. idx += offset;
  26309. }
  26310. #else
  26311. #ifdef HAVE_EXTENDED_MASTER
  26312. if (ssl->options.haveEMS) {
  26313. c16toa(HELLO_EXT_SZ, output + idx);
  26314. idx += HELLO_EXT_SZ_SZ;
  26315. c16toa(HELLO_EXT_EXTMS, output + idx);
  26316. idx += HELLO_EXT_TYPE_SZ;
  26317. c16toa(0, output + idx);
  26318. /*idx += HELLO_EXT_SZ_SZ;*/
  26319. /* idx is not used after this point. uncomment the line above
  26320. * if adding any more extensions in the future. */
  26321. }
  26322. #endif
  26323. #endif
  26324. if (IsEncryptionOn(ssl, 1)) {
  26325. byte* input;
  26326. int inputSz = idx; /* build msg adds rec hdr */
  26327. int recordHeaderSz = RECORD_HEADER_SZ;
  26328. if (ssl->options.dtls)
  26329. recordHeaderSz += DTLS_RECORD_EXTRA;
  26330. inputSz -= recordHeaderSz;
  26331. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26332. if (input == NULL)
  26333. return MEMORY_E;
  26334. XMEMCPY(input, output + recordHeaderSz, inputSz);
  26335. #ifdef WOLFSSL_DTLS
  26336. if (IsDtlsNotSctpMode(ssl) &&
  26337. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
  26338. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26339. return ret;
  26340. }
  26341. #endif
  26342. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  26343. handshake, 1, 0, 0, CUR_ORDER);
  26344. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26345. if (sendSz < 0)
  26346. return sendSz;
  26347. } else {
  26348. #ifdef WOLFSSL_DTLS
  26349. if (IsDtlsNotSctpMode(ssl)) {
  26350. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
  26351. return ret;
  26352. }
  26353. if (ssl->options.dtls)
  26354. DtlsSEQIncrement(ssl, CUR_ORDER);
  26355. #endif
  26356. ret = HashOutput(ssl, output, sendSz, 0);
  26357. if (ret != 0)
  26358. return ret;
  26359. }
  26360. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  26361. if (ssl->hsInfoOn)
  26362. AddPacketName(ssl, "ServerHello");
  26363. if (ssl->toInfoOn)
  26364. AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  26365. WRITE_PROTO, ssl->heap);
  26366. #endif
  26367. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  26368. ssl->options.buildingMsg = 0;
  26369. ssl->buffers.outputBuffer.length += sendSz;
  26370. if (ssl->options.groupMessages)
  26371. ret = 0;
  26372. else
  26373. ret = SendBuffered(ssl);
  26374. WOLFSSL_LEAVE("SendServerHello", ret);
  26375. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  26376. return ret;
  26377. }
  26378. #if defined(HAVE_ECC)
  26379. static byte SetCurveId(ecc_key* key)
  26380. {
  26381. if (key == NULL || key->dp == NULL) {
  26382. WOLFSSL_MSG("SetCurveId: Invalid key!");
  26383. return 0;
  26384. }
  26385. return (byte)GetCurveByOID(key->dp->oidSum);
  26386. }
  26387. #endif /* HAVE_ECC */
  26388. typedef struct SskeArgs {
  26389. byte* output; /* not allocated */
  26390. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  26391. byte* exportBuf;
  26392. #endif
  26393. #ifndef NO_RSA
  26394. byte* verifySig;
  26395. #endif
  26396. byte* input;
  26397. word32 idx;
  26398. word32 tmpSigSz;
  26399. word32 length;
  26400. word32 sigSz;
  26401. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  26402. !defined(NO_RSA)
  26403. word32 sigDataSz;
  26404. #endif
  26405. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  26406. word32 exportSz;
  26407. #endif
  26408. int sendSz;
  26409. int inputSz;
  26410. } SskeArgs;
  26411. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  26412. {
  26413. SskeArgs* args = (SskeArgs*)pArgs;
  26414. (void)ssl;
  26415. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  26416. if (args->exportBuf) {
  26417. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  26418. args->exportBuf = NULL;
  26419. }
  26420. #endif
  26421. #ifndef NO_RSA
  26422. if (args->verifySig) {
  26423. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  26424. args->verifySig = NULL;
  26425. }
  26426. #endif
  26427. (void)args;
  26428. }
  26429. /* handle generation of server_key_exchange (12) */
  26430. int SendServerKeyExchange(WOLFSSL* ssl)
  26431. {
  26432. int ret = 0;
  26433. #ifdef WOLFSSL_ASYNC_IO
  26434. SskeArgs* args = NULL;
  26435. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  26436. #else
  26437. SskeArgs args[1];
  26438. #endif
  26439. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  26440. WOLFSSL_ENTER("SendServerKeyExchange");
  26441. #ifdef WOLFSSL_ASYNC_IO
  26442. if (ssl->async == NULL) {
  26443. ssl->async = (struct WOLFSSL_ASYNC*)
  26444. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  26445. DYNAMIC_TYPE_ASYNC);
  26446. if (ssl->async == NULL)
  26447. ERROR_OUT(MEMORY_E, exit_sske);
  26448. }
  26449. args = (SskeArgs*)ssl->async->args;
  26450. #ifdef WOLFSSL_ASYNC_CRYPT
  26451. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  26452. if (ret != WC_NOT_PENDING_E) {
  26453. /* Check for error */
  26454. if (ret < 0)
  26455. goto exit_sske;
  26456. }
  26457. else
  26458. #endif
  26459. if (ssl->options.buildingMsg) {
  26460. /* We should be in the sending state. */
  26461. if (ssl->options.asyncState != TLS_ASYNC_END) {
  26462. ret = BAD_STATE_E;
  26463. goto exit_sske;
  26464. }
  26465. }
  26466. else
  26467. #endif
  26468. {
  26469. /* Reset state */
  26470. ret = 0;
  26471. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  26472. XMEMSET(args, 0, sizeof(SskeArgs));
  26473. #ifdef WOLFSSL_ASYNC_IO
  26474. ssl->async->freeArgs = FreeSskeArgs;
  26475. #endif
  26476. }
  26477. switch(ssl->options.asyncState)
  26478. {
  26479. case TLS_ASYNC_BEGIN:
  26480. {
  26481. /* Do some checks / debug msgs */
  26482. switch(ssl->specs.kea)
  26483. {
  26484. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26485. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26486. case ecdhe_psk_kea:
  26487. {
  26488. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  26489. break;
  26490. }
  26491. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  26492. #if defined(HAVE_ECC)
  26493. case ecc_diffie_hellman_kea:
  26494. {
  26495. if (ssl->specs.static_ecdh) {
  26496. WOLFSSL_MSG("Using Static ECDH, not sending "
  26497. "ServerKeyExchange");
  26498. ERROR_OUT(0, exit_sske);
  26499. }
  26500. WOLFSSL_MSG("Using ephemeral ECDH");
  26501. break;
  26502. }
  26503. #endif /* HAVE_ECC */
  26504. }
  26505. /* Preparing keys */
  26506. switch(ssl->specs.kea)
  26507. {
  26508. #ifndef NO_PSK
  26509. case psk_kea:
  26510. {
  26511. /* Nothing to do in this sub-state */
  26512. break;
  26513. }
  26514. #endif /* !NO_PSK */
  26515. #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA) \
  26516. || (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  26517. #if !defined(NO_PSK)
  26518. case dhe_psk_kea:
  26519. #endif
  26520. #if !defined(NO_RSA) || (defined(HAVE_ANON) && \
  26521. !defined(WOLFSSL_NO_TLS12))
  26522. case diffie_hellman_kea:
  26523. #endif
  26524. #if (defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)) && !defined(HAVE_PUBLIC_FFDHE)
  26525. if (ssl->namedGroup) {
  26526. word32 pSz = 0;
  26527. ret = wc_DhGetNamedKeyParamSize(ssl->namedGroup, &pSz,
  26528. NULL, NULL);
  26529. if (ret != 0)
  26530. goto exit_sske;
  26531. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  26532. /* Free'd in SSL_ResourceFree and
  26533. * FreeHandshakeResources */
  26534. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  26535. pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26536. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  26537. ERROR_OUT(MEMORY_E, exit_sske);
  26538. }
  26539. ssl->buffers.serverDH_Pub.length = pSz;
  26540. }
  26541. ssl->options.dhKeySz =(word16)pSz;
  26542. pSz = wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  26543. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  26544. /* Free'd in SSL_ResourceFree and
  26545. * FreeHandshakeResources */
  26546. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  26547. pSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  26548. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  26549. ERROR_OUT(MEMORY_E, exit_sske);
  26550. }
  26551. ssl->buffers.serverDH_Priv.length = pSz;
  26552. }
  26553. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  26554. (void**)&ssl->buffers.serverDH_Key);
  26555. if (ret != 0) {
  26556. goto exit_sske;
  26557. }
  26558. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  26559. ssl->namedGroup);
  26560. if (ret != 0) {
  26561. goto exit_sske;
  26562. }
  26563. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  26564. !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  26565. ssl->options.dhKeyTested = 1;
  26566. #endif
  26567. #ifdef HAVE_SECURE_RENEGOTIATION
  26568. /* Check that the DH public key buffer is large
  26569. * enough to hold the key. This may occur on a
  26570. * renegotiation when the key generated in the
  26571. * initial handshake is shorter than the key
  26572. * generated in the renegotiation. */
  26573. if (ssl->buffers.serverDH_Pub.length <
  26574. ssl->buffers.serverDH_P.length) {
  26575. byte* tmp = (byte*)XREALLOC(
  26576. ssl->buffers.serverDH_Pub.buffer,
  26577. ssl->buffers.serverDH_P.length +
  26578. OPAQUE16_LEN,
  26579. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26580. if (tmp == NULL)
  26581. ERROR_OUT(MEMORY_E, exit_sske);
  26582. ssl->buffers.serverDH_Pub.buffer = tmp;
  26583. ssl->buffers.serverDH_Pub.length =
  26584. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  26585. }
  26586. #endif
  26587. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  26588. ssl->buffers.serverDH_Priv.buffer,
  26589. (word32*)&ssl->buffers.serverDH_Priv.length,
  26590. ssl->buffers.serverDH_Pub.buffer,
  26591. (word32*)&ssl->buffers.serverDH_Pub.length);
  26592. #ifdef WOLFSSL_CHECK_MEM_ZERO
  26593. wc_MemZero_Add("DH private key buffer",
  26594. ssl->buffers.serverDH_Priv.buffer,
  26595. ssl->buffers.serverDH_Priv.length);
  26596. #endif
  26597. break;
  26598. }
  26599. else
  26600. #endif
  26601. {
  26602. /* Allocate DH key buffers and generate key */
  26603. if (ssl->buffers.serverDH_P.buffer == NULL ||
  26604. ssl->buffers.serverDH_G.buffer == NULL) {
  26605. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  26606. }
  26607. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  26608. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  26609. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  26610. ssl->buffers.serverDH_P.length,
  26611. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26612. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  26613. ERROR_OUT(MEMORY_E, exit_sske);
  26614. }
  26615. ssl->buffers.serverDH_Pub.length =
  26616. ssl->buffers.serverDH_P.length;
  26617. }
  26618. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  26619. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  26620. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  26621. ssl->buffers.serverDH_P.length,
  26622. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  26623. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  26624. ERROR_OUT(MEMORY_E, exit_sske);
  26625. }
  26626. ssl->buffers.serverDH_Priv.length =
  26627. ssl->buffers.serverDH_P.length;
  26628. }
  26629. ssl->options.dhKeySz =
  26630. (word16)ssl->buffers.serverDH_P.length;
  26631. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  26632. (void**)&ssl->buffers.serverDH_Key);
  26633. if (ret != 0) {
  26634. goto exit_sske;
  26635. }
  26636. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  26637. !defined(HAVE_FIPS) && \
  26638. !defined(HAVE_SELFTEST)
  26639. if (ssl->options.dhDoKeyTest &&
  26640. !ssl->options.dhKeyTested)
  26641. {
  26642. ret = wc_DhSetCheckKey(
  26643. ssl->buffers.serverDH_Key,
  26644. ssl->buffers.serverDH_P.buffer,
  26645. ssl->buffers.serverDH_P.length,
  26646. ssl->buffers.serverDH_G.buffer,
  26647. ssl->buffers.serverDH_G.length,
  26648. NULL, 0, 0, ssl->rng);
  26649. if (ret != 0) {
  26650. goto exit_sske;
  26651. }
  26652. ssl->options.dhKeyTested = 1;
  26653. }
  26654. else
  26655. #endif
  26656. {
  26657. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  26658. ssl->buffers.serverDH_P.buffer,
  26659. ssl->buffers.serverDH_P.length,
  26660. ssl->buffers.serverDH_G.buffer,
  26661. ssl->buffers.serverDH_G.length);
  26662. if (ret != 0) {
  26663. goto exit_sske;
  26664. }
  26665. }
  26666. #ifdef HAVE_SECURE_RENEGOTIATION
  26667. /* Check that the DH public key buffer is large
  26668. * enough to hold the key. This may occur on a
  26669. * renegotiation when the key generated in the
  26670. * initial handshake is shorter than the key
  26671. * generated in the renegotiation. */
  26672. if (ssl->buffers.serverDH_Pub.length <
  26673. ssl->buffers.serverDH_P.length) {
  26674. byte* tmp = (byte*)XREALLOC(
  26675. ssl->buffers.serverDH_Pub.buffer,
  26676. ssl->buffers.serverDH_P.length +
  26677. OPAQUE16_LEN,
  26678. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  26679. if (tmp == NULL)
  26680. ERROR_OUT(MEMORY_E, exit_sske);
  26681. ssl->buffers.serverDH_Pub.buffer = tmp;
  26682. ssl->buffers.serverDH_Pub.length =
  26683. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  26684. }
  26685. #endif
  26686. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  26687. ssl->buffers.serverDH_Priv.buffer,
  26688. (word32*)&ssl->buffers.serverDH_Priv.length,
  26689. ssl->buffers.serverDH_Pub.buffer,
  26690. (word32*)&ssl->buffers.serverDH_Pub.length);
  26691. #ifdef WOLFSSL_CHECK_MEM_ZERO
  26692. wc_MemZero_Add("DH private key buffer",
  26693. ssl->buffers.serverDH_Priv.buffer,
  26694. ssl->buffers.serverDH_Priv.length);
  26695. #endif
  26696. break;
  26697. }
  26698. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  26699. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26700. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26701. case ecdhe_psk_kea:
  26702. /* Fall through to create temp ECC key */
  26703. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  26704. #if defined(HAVE_ECC) || \
  26705. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  26706. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  26707. !defined(NO_RSA)))
  26708. case ecc_diffie_hellman_kea:
  26709. {
  26710. #ifdef HAVE_CURVE25519
  26711. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26712. /* need ephemeral key now, create it if missing */
  26713. if (ssl->eccTempKey == NULL) {
  26714. /* alloc/init on demand */
  26715. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  26716. (void**)&ssl->eccTempKey);
  26717. if (ret != 0) {
  26718. goto exit_sske;
  26719. }
  26720. }
  26721. if (ssl->eccTempKeyPresent == 0) {
  26722. ret = X25519MakeKey(ssl,
  26723. (curve25519_key*)ssl->eccTempKey, NULL);
  26724. if (ret == 0 || ret == WC_PENDING_E) {
  26725. ssl->eccTempKeyPresent =
  26726. DYNAMIC_TYPE_CURVE25519;
  26727. }
  26728. }
  26729. break;
  26730. }
  26731. #endif
  26732. #ifdef HAVE_CURVE448
  26733. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  26734. /* need ephemeral key now, create it if missing */
  26735. if (ssl->eccTempKey == NULL) {
  26736. /* alloc/init on demand */
  26737. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  26738. (void**)&ssl->eccTempKey);
  26739. if (ret != 0) {
  26740. goto exit_sske;
  26741. }
  26742. }
  26743. if (ssl->eccTempKeyPresent == 0) {
  26744. ret = X448MakeKey(ssl,
  26745. (curve448_key*)ssl->eccTempKey, NULL);
  26746. if (ret == 0 || ret == WC_PENDING_E) {
  26747. ssl->eccTempKeyPresent =
  26748. DYNAMIC_TYPE_CURVE448;
  26749. }
  26750. }
  26751. break;
  26752. }
  26753. #endif
  26754. #ifdef HAVE_ECC
  26755. /* need ephemeral key now, create it if missing */
  26756. if (ssl->eccTempKey == NULL) {
  26757. /* alloc/init on demand */
  26758. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  26759. (void**)&ssl->eccTempKey);
  26760. if (ret != 0) {
  26761. goto exit_sske;
  26762. }
  26763. }
  26764. if (ssl->eccTempKeyPresent == 0) {
  26765. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  26766. if (ret == 0 || ret == WC_PENDING_E) {
  26767. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  26768. }
  26769. }
  26770. #endif
  26771. break;
  26772. }
  26773. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  26774. default:
  26775. /* Skip ServerKeyExchange */
  26776. goto exit_sske;
  26777. } /* switch(ssl->specs.kea) */
  26778. /* Check for error */
  26779. if (ret != 0) {
  26780. goto exit_sske;
  26781. }
  26782. /* Advance state and proceed */
  26783. ssl->options.asyncState = TLS_ASYNC_BUILD;
  26784. } /* case TLS_ASYNC_BEGIN */
  26785. FALL_THROUGH;
  26786. case TLS_ASYNC_BUILD:
  26787. {
  26788. switch(ssl->specs.kea)
  26789. {
  26790. #ifndef NO_PSK
  26791. case psk_kea:
  26792. {
  26793. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  26794. if (ssl->arrays->server_hint[0] == 0) {
  26795. ERROR_OUT(0, exit_sske); /* don't send */
  26796. }
  26797. /* include size part */
  26798. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  26799. if (args->length > MAX_PSK_ID_LEN) {
  26800. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  26801. }
  26802. args->length += HINT_LEN_SZ;
  26803. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  26804. RECORD_HEADER_SZ;
  26805. #ifdef WOLFSSL_DTLS
  26806. if (ssl->options.dtls) {
  26807. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26808. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26809. }
  26810. #endif
  26811. if (IsEncryptionOn(ssl, 1)) {
  26812. args->sendSz += MAX_MSG_EXTRA;
  26813. }
  26814. /* Use tmp buffer */
  26815. args->input = (byte*)XMALLOC(args->sendSz,
  26816. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26817. if (args->input == NULL)
  26818. ERROR_OUT(MEMORY_E, exit_sske);
  26819. args->output = args->input;
  26820. AddHeaders(args->output, args->length,
  26821. server_key_exchange, ssl);
  26822. /* key data */
  26823. c16toa((word16)(args->length - HINT_LEN_SZ),
  26824. args->output + args->idx);
  26825. args->idx += HINT_LEN_SZ;
  26826. XMEMCPY(args->output + args->idx,
  26827. ssl->arrays->server_hint,
  26828. args->length - HINT_LEN_SZ);
  26829. break;
  26830. }
  26831. #endif /* !NO_PSK */
  26832. #if !defined(NO_DH) && !defined(NO_PSK)
  26833. case dhe_psk_kea:
  26834. {
  26835. word32 hintLen;
  26836. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  26837. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  26838. ssl->buffers.serverDH_P.length +
  26839. ssl->buffers.serverDH_G.length +
  26840. ssl->buffers.serverDH_Pub.length;
  26841. /* include size part */
  26842. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  26843. if (hintLen > MAX_PSK_ID_LEN) {
  26844. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  26845. }
  26846. args->length += hintLen + HINT_LEN_SZ;
  26847. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  26848. RECORD_HEADER_SZ;
  26849. #ifdef WOLFSSL_DTLS
  26850. if (ssl->options.dtls) {
  26851. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26852. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26853. }
  26854. #endif
  26855. if (IsEncryptionOn(ssl, 1)) {
  26856. args->sendSz += MAX_MSG_EXTRA;
  26857. }
  26858. /* Use tmp buffer */
  26859. args->input = (byte*)XMALLOC(args->sendSz,
  26860. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26861. if (args->input == NULL)
  26862. ERROR_OUT(MEMORY_E, exit_sske);
  26863. args->output = args->input;
  26864. AddHeaders(args->output, args->length,
  26865. server_key_exchange, ssl);
  26866. /* key data */
  26867. c16toa((word16)hintLen, args->output + args->idx);
  26868. args->idx += HINT_LEN_SZ;
  26869. XMEMCPY(args->output + args->idx,
  26870. ssl->arrays->server_hint, hintLen);
  26871. args->idx += hintLen;
  26872. /* add p, g, pub */
  26873. c16toa((word16)ssl->buffers.serverDH_P.length,
  26874. args->output + args->idx);
  26875. args->idx += LENGTH_SZ;
  26876. XMEMCPY(args->output + args->idx,
  26877. ssl->buffers.serverDH_P.buffer,
  26878. ssl->buffers.serverDH_P.length);
  26879. args->idx += ssl->buffers.serverDH_P.length;
  26880. /* g */
  26881. c16toa((word16)ssl->buffers.serverDH_G.length,
  26882. args->output + args->idx);
  26883. args->idx += LENGTH_SZ;
  26884. XMEMCPY(args->output + args->idx,
  26885. ssl->buffers.serverDH_G.buffer,
  26886. ssl->buffers.serverDH_G.length);
  26887. args->idx += ssl->buffers.serverDH_G.length;
  26888. /* pub */
  26889. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  26890. args->output + args->idx);
  26891. args->idx += LENGTH_SZ;
  26892. XMEMCPY(args->output + args->idx,
  26893. ssl->buffers.serverDH_Pub.buffer,
  26894. ssl->buffers.serverDH_Pub.length);
  26895. /* No need to update idx, since sizes are already set */
  26896. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  26897. break;
  26898. }
  26899. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  26900. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  26901. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  26902. case ecdhe_psk_kea:
  26903. {
  26904. word32 hintLen;
  26905. /* curve type, named curve, length(1) */
  26906. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  26907. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  26908. args->exportSz = MAX_EXPORT_ECC_SZ;
  26909. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  26910. ssl->heap, DYNAMIC_TYPE_DER);
  26911. if (args->exportBuf == NULL) {
  26912. ERROR_OUT(MEMORY_E, exit_sske);
  26913. }
  26914. #ifdef HAVE_CURVE25519
  26915. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  26916. if (wc_curve25519_export_public_ex(
  26917. (curve25519_key*)ssl->eccTempKey,
  26918. args->exportBuf, &args->exportSz,
  26919. EC25519_LITTLE_ENDIAN) != 0) {
  26920. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  26921. }
  26922. }
  26923. else
  26924. #endif
  26925. #ifdef HAVE_CURVE448
  26926. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  26927. if (wc_curve448_export_public_ex(
  26928. (curve448_key*)ssl->eccTempKey,
  26929. args->exportBuf, &args->exportSz,
  26930. EC448_LITTLE_ENDIAN) != 0) {
  26931. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  26932. }
  26933. }
  26934. else
  26935. #endif
  26936. {
  26937. PRIVATE_KEY_UNLOCK();
  26938. ret = wc_ecc_export_x963(ssl->eccTempKey,
  26939. args->exportBuf, &args->exportSz);
  26940. PRIVATE_KEY_LOCK();
  26941. if (ret != 0) {
  26942. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  26943. }
  26944. }
  26945. args->length += args->exportSz;
  26946. /* include size part */
  26947. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  26948. if (hintLen > MAX_PSK_ID_LEN) {
  26949. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  26950. }
  26951. args->length += hintLen + HINT_LEN_SZ;
  26952. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  26953. #ifdef WOLFSSL_DTLS
  26954. if (ssl->options.dtls) {
  26955. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26956. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  26957. }
  26958. #endif
  26959. if (IsEncryptionOn(ssl, 1)) {
  26960. args->sendSz += MAX_MSG_EXTRA;
  26961. }
  26962. /* Use tmp buffer */
  26963. args->input = (byte*)XMALLOC(args->sendSz,
  26964. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  26965. if (args->input == NULL)
  26966. ERROR_OUT(MEMORY_E, exit_sske);
  26967. args->output = args->input;
  26968. /* key data */
  26969. c16toa((word16)hintLen, args->output + args->idx);
  26970. args->idx += HINT_LEN_SZ;
  26971. XMEMCPY(args->output + args->idx,
  26972. ssl->arrays->server_hint, hintLen);
  26973. args->idx += hintLen;
  26974. /* ECC key exchange data */
  26975. args->output[args->idx++] = named_curve;
  26976. args->output[args->idx++] = 0x00; /* leading zero */
  26977. #ifdef HAVE_CURVE25519
  26978. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  26979. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  26980. else
  26981. #endif
  26982. #ifdef HAVE_CURVE448
  26983. if (ssl->ecdhCurveOID == ECC_X448_OID)
  26984. args->output[args->idx++] = WOLFSSL_ECC_X448;
  26985. else
  26986. #endif
  26987. {
  26988. #ifdef HAVE_ECC
  26989. args->output[args->idx++] =
  26990. SetCurveId(ssl->eccTempKey);
  26991. #endif
  26992. }
  26993. args->output[args->idx++] = (byte)args->exportSz;
  26994. XMEMCPY(args->output + args->idx, args->exportBuf,
  26995. args->exportSz);
  26996. break;
  26997. }
  26998. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  26999. #if defined(HAVE_ECC) || \
  27000. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  27001. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  27002. !defined(NO_RSA)))
  27003. case ecc_diffie_hellman_kea:
  27004. {
  27005. enum wc_HashType hashType;
  27006. word32 preSigSz, preSigIdx;
  27007. /* curve type, named curve, length(1) */
  27008. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27009. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  27010. /* Export temp ECC key and add to length */
  27011. args->exportSz = MAX_EXPORT_ECC_SZ;
  27012. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  27013. ssl->heap, DYNAMIC_TYPE_DER);
  27014. if (args->exportBuf == NULL) {
  27015. ERROR_OUT(MEMORY_E, exit_sske);
  27016. }
  27017. #ifdef HAVE_CURVE25519
  27018. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  27019. if (wc_curve25519_export_public_ex(
  27020. (curve25519_key*)ssl->eccTempKey,
  27021. args->exportBuf, &args->exportSz,
  27022. EC25519_LITTLE_ENDIAN) != 0) {
  27023. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27024. }
  27025. }
  27026. else
  27027. #endif
  27028. #ifdef HAVE_CURVE448
  27029. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  27030. if (wc_curve448_export_public_ex(
  27031. (curve448_key*)ssl->eccTempKey,
  27032. args->exportBuf, &args->exportSz,
  27033. EC448_LITTLE_ENDIAN) != 0) {
  27034. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27035. }
  27036. }
  27037. else
  27038. #endif
  27039. {
  27040. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  27041. PRIVATE_KEY_UNLOCK();
  27042. ret = wc_ecc_export_x963(ssl->eccTempKey,
  27043. args->exportBuf, &args->exportSz);
  27044. PRIVATE_KEY_LOCK();
  27045. if (ret != 0) {
  27046. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  27047. }
  27048. #endif
  27049. }
  27050. args->length += args->exportSz;
  27051. preSigSz = args->length;
  27052. preSigIdx = args->idx;
  27053. if (ssl->buffers.key == NULL) {
  27054. #ifdef HAVE_PK_CALLBACKS
  27055. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  27056. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  27057. if (args->tmpSigSz == 0) {
  27058. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  27059. }
  27060. }
  27061. else
  27062. #endif
  27063. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  27064. }
  27065. else {
  27066. switch(ssl->suites->sigAlgo) {
  27067. #ifndef NO_RSA
  27068. #ifdef WC_RSA_PSS
  27069. case rsa_pss_sa_algo:
  27070. #endif
  27071. case rsa_sa_algo:
  27072. {
  27073. word16 keySz;
  27074. ssl->buffers.keyType = rsa_sa_algo;
  27075. ret = DecodePrivateKey(ssl, &keySz);
  27076. if (ret != 0) {
  27077. goto exit_sske;
  27078. }
  27079. args->tmpSigSz = (word32)keySz;
  27080. break;
  27081. }
  27082. #endif /* !NO_RSA */
  27083. #ifdef HAVE_ECC
  27084. case ecc_dsa_sa_algo:
  27085. {
  27086. word16 keySz;
  27087. ssl->buffers.keyType = ecc_dsa_sa_algo;
  27088. ret = DecodePrivateKey(ssl, &keySz);
  27089. if (ret != 0) {
  27090. goto exit_sske;
  27091. }
  27092. /* worst case estimate */
  27093. args->tmpSigSz = keySz;
  27094. break;
  27095. }
  27096. #endif
  27097. #ifdef HAVE_ED25519
  27098. case ed25519_sa_algo:
  27099. {
  27100. word16 keySz;
  27101. ssl->buffers.keyType = ed25519_sa_algo;
  27102. ret = DecodePrivateKey(ssl, &keySz);
  27103. if (ret != 0) {
  27104. goto exit_sske;
  27105. }
  27106. /* worst case estimate */
  27107. args->tmpSigSz = ED25519_SIG_SIZE;
  27108. break;
  27109. }
  27110. #endif /* HAVE_ED25519 */
  27111. #ifdef HAVE_ED448
  27112. case ed448_sa_algo:
  27113. {
  27114. word16 keySz;
  27115. ssl->buffers.keyType = ed448_sa_algo;
  27116. ret = DecodePrivateKey(ssl, &keySz);
  27117. if (ret != 0) {
  27118. goto exit_sske;
  27119. }
  27120. /* worst case estimate */
  27121. args->tmpSigSz = ED448_SIG_SIZE;
  27122. break;
  27123. }
  27124. #endif /* HAVE_ED448 */
  27125. default:
  27126. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  27127. } /* switch(ssl->specs.sig_algo) */
  27128. }
  27129. /* sig length */
  27130. args->length += LENGTH_SZ;
  27131. args->length += args->tmpSigSz;
  27132. if (IsAtLeastTLSv1_2(ssl)) {
  27133. args->length += HASH_SIG_SIZE;
  27134. }
  27135. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  27136. #ifdef WOLFSSL_DTLS
  27137. if (ssl->options.dtls) {
  27138. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27139. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27140. preSigIdx = args->idx;
  27141. }
  27142. #endif
  27143. if (IsEncryptionOn(ssl, 1)) {
  27144. args->sendSz += MAX_MSG_EXTRA;
  27145. }
  27146. /* Use tmp buffer */
  27147. args->input = (byte*)XMALLOC(args->sendSz,
  27148. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27149. if (args->input == NULL)
  27150. ERROR_OUT(MEMORY_E, exit_sske);
  27151. args->output = args->input;
  27152. /* record and message headers will be added below, when we're sure
  27153. of the sig length */
  27154. /* key exchange data */
  27155. args->output[args->idx++] = named_curve;
  27156. args->output[args->idx++] = 0x00; /* leading zero */
  27157. #ifdef HAVE_CURVE25519
  27158. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  27159. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  27160. else
  27161. #endif
  27162. #ifdef HAVE_CURVE448
  27163. if (ssl->ecdhCurveOID == ECC_X448_OID)
  27164. args->output[args->idx++] = WOLFSSL_ECC_X448;
  27165. else
  27166. #endif
  27167. {
  27168. #ifdef HAVE_ECC
  27169. args->output[args->idx++] =
  27170. SetCurveId(ssl->eccTempKey);
  27171. #endif
  27172. }
  27173. args->output[args->idx++] = (byte)args->exportSz;
  27174. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  27175. args->idx += args->exportSz;
  27176. /* Determine hash type */
  27177. if (IsAtLeastTLSv1_2(ssl)) {
  27178. EncodeSigAlg(ssl->suites->hashAlgo,
  27179. ssl->suites->sigAlgo,
  27180. &args->output[args->idx]);
  27181. args->idx += 2;
  27182. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  27183. if (hashType == WC_HASH_TYPE_NONE) {
  27184. ERROR_OUT(ALGO_ID_E, exit_sske);
  27185. }
  27186. } else {
  27187. /* only using sha and md5 for rsa */
  27188. #ifndef NO_OLD_TLS
  27189. hashType = WC_HASH_TYPE_SHA;
  27190. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  27191. hashType = WC_HASH_TYPE_MD5_SHA;
  27192. }
  27193. #else
  27194. ERROR_OUT(ALGO_ID_E, exit_sske);
  27195. #endif
  27196. }
  27197. /* Signature length will be written later, when we're sure what it is */
  27198. #ifdef HAVE_FUZZER
  27199. if (ssl->fuzzerCb) {
  27200. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  27201. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  27202. }
  27203. #endif
  27204. ret = HashSkeData(ssl, hashType,
  27205. args->output + preSigIdx, preSigSz,
  27206. ssl->suites->sigAlgo);
  27207. if (ret != 0) {
  27208. goto exit_sske;
  27209. }
  27210. args->sigSz = args->tmpSigSz;
  27211. /* Sign hash to create signature */
  27212. switch (ssl->suites->sigAlgo)
  27213. {
  27214. #ifndef NO_RSA
  27215. case rsa_sa_algo:
  27216. {
  27217. /* For TLS 1.2 re-encode signature */
  27218. if (IsAtLeastTLSv1_2(ssl)) {
  27219. byte* encodedSig = (byte*)XMALLOC(
  27220. MAX_ENCODED_SIG_SZ, ssl->heap,
  27221. DYNAMIC_TYPE_DIGEST);
  27222. if (encodedSig == NULL) {
  27223. ERROR_OUT(MEMORY_E, exit_sske);
  27224. }
  27225. ssl->buffers.digest.length =
  27226. wc_EncodeSignature(encodedSig,
  27227. ssl->buffers.digest.buffer,
  27228. ssl->buffers.digest.length,
  27229. TypeHash(ssl->suites->hashAlgo));
  27230. /* Replace sig buffer with new one */
  27231. XFREE(ssl->buffers.digest.buffer, ssl->heap,
  27232. DYNAMIC_TYPE_DIGEST);
  27233. ssl->buffers.digest.buffer = encodedSig;
  27234. }
  27235. /* write sig size here */
  27236. c16toa((word16)args->sigSz,
  27237. args->output + args->idx);
  27238. args->idx += LENGTH_SZ;
  27239. break;
  27240. }
  27241. #ifdef WC_RSA_PSS
  27242. case rsa_pss_sa_algo:
  27243. /* write sig size here */
  27244. c16toa((word16)args->sigSz,
  27245. args->output + args->idx);
  27246. args->idx += LENGTH_SZ;
  27247. break;
  27248. #endif
  27249. #endif /* !NO_RSA */
  27250. case ecc_dsa_sa_algo:
  27251. {
  27252. break;
  27253. }
  27254. #ifdef HAVE_ED25519
  27255. case ed25519_sa_algo:
  27256. ret = Ed25519CheckPubKey(ssl);
  27257. if (ret != 0)
  27258. goto exit_sske;
  27259. break;
  27260. #endif /* HAVE_ED25519 */
  27261. #ifdef HAVE_ED448
  27262. case ed448_sa_algo:
  27263. ret = Ed448CheckPubKey(ssl);
  27264. if (ret != 0)
  27265. goto exit_sske;
  27266. break;
  27267. #endif /* HAVE_ED448 */
  27268. default:
  27269. break;
  27270. } /* switch(ssl->specs.sig_algo) */
  27271. break;
  27272. }
  27273. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27274. #if !defined(NO_DH) && (!defined(NO_RSA) || \
  27275. (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  27276. case diffie_hellman_kea:
  27277. {
  27278. enum wc_HashType hashType;
  27279. word32 preSigSz, preSigIdx;
  27280. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27281. args->length = LENGTH_SZ * 3; /* p, g, pub */
  27282. args->length += ssl->buffers.serverDH_P.length +
  27283. ssl->buffers.serverDH_G.length +
  27284. ssl->buffers.serverDH_Pub.length;
  27285. preSigIdx = args->idx;
  27286. preSigSz = args->length;
  27287. if (!ssl->options.usingAnon_cipher) {
  27288. word16 keySz = 0;
  27289. /* sig length */
  27290. args->length += LENGTH_SZ;
  27291. if (ssl->buffers.key == NULL) {
  27292. #ifdef HAVE_PK_CALLBACKS
  27293. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  27294. keySz = (word32)GetPrivateKeySigSize(ssl);
  27295. else
  27296. #endif
  27297. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  27298. }
  27299. else
  27300. {
  27301. if (ssl->buffers.keyType == 0)
  27302. ssl->buffers.keyType = rsa_sa_algo;
  27303. ret = DecodePrivateKey(ssl, &keySz);
  27304. if (ret != 0) {
  27305. goto exit_sske;
  27306. }
  27307. }
  27308. /* test if keySz has error */
  27309. if (keySz == 0) {
  27310. ERROR_OUT(keySz, exit_sske);
  27311. }
  27312. args->tmpSigSz = (word32)keySz;
  27313. args->length += args->tmpSigSz;
  27314. if (IsAtLeastTLSv1_2(ssl)) {
  27315. args->length += HASH_SIG_SIZE;
  27316. }
  27317. }
  27318. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  27319. RECORD_HEADER_SZ;
  27320. #ifdef WOLFSSL_DTLS
  27321. if (ssl->options.dtls) {
  27322. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27323. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27324. preSigIdx = args->idx;
  27325. }
  27326. #endif
  27327. if (IsEncryptionOn(ssl, 1)) {
  27328. args->sendSz += MAX_MSG_EXTRA;
  27329. }
  27330. /* Use tmp buffer */
  27331. args->input = (byte*)XMALLOC(args->sendSz,
  27332. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27333. if (args->input == NULL)
  27334. ERROR_OUT(MEMORY_E, exit_sske);
  27335. args->output = args->input;
  27336. AddHeaders(args->output, args->length,
  27337. server_key_exchange, ssl);
  27338. /* add p, g, pub */
  27339. c16toa((word16)ssl->buffers.serverDH_P.length,
  27340. args->output + args->idx);
  27341. args->idx += LENGTH_SZ;
  27342. XMEMCPY(args->output + args->idx,
  27343. ssl->buffers.serverDH_P.buffer,
  27344. ssl->buffers.serverDH_P.length);
  27345. args->idx += ssl->buffers.serverDH_P.length;
  27346. /* g */
  27347. c16toa((word16)ssl->buffers.serverDH_G.length,
  27348. args->output + args->idx);
  27349. args->idx += LENGTH_SZ;
  27350. XMEMCPY(args->output + args->idx,
  27351. ssl->buffers.serverDH_G.buffer,
  27352. ssl->buffers.serverDH_G.length);
  27353. args->idx += ssl->buffers.serverDH_G.length;
  27354. /* pub */
  27355. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  27356. args->output + args->idx);
  27357. args->idx += LENGTH_SZ;
  27358. XMEMCPY(args->output + args->idx,
  27359. ssl->buffers.serverDH_Pub.buffer,
  27360. ssl->buffers.serverDH_Pub.length);
  27361. args->idx += ssl->buffers.serverDH_Pub.length;
  27362. #ifdef HAVE_FUZZER
  27363. if (ssl->fuzzerCb) {
  27364. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  27365. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  27366. }
  27367. #endif
  27368. if (ssl->options.usingAnon_cipher) {
  27369. break;
  27370. }
  27371. /* Determine hash type */
  27372. if (IsAtLeastTLSv1_2(ssl)) {
  27373. EncodeSigAlg(ssl->suites->hashAlgo,
  27374. ssl->suites->sigAlgo,
  27375. &args->output[args->idx]);
  27376. args->idx += 2;
  27377. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  27378. if (hashType == WC_HASH_TYPE_NONE) {
  27379. ERROR_OUT(ALGO_ID_E, exit_sske);
  27380. }
  27381. } else {
  27382. /* only using sha and md5 for rsa */
  27383. #ifndef NO_OLD_TLS
  27384. hashType = WC_HASH_TYPE_SHA;
  27385. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  27386. hashType = WC_HASH_TYPE_MD5_SHA;
  27387. }
  27388. #else
  27389. ERROR_OUT(ALGO_ID_E, exit_sske);
  27390. #endif
  27391. }
  27392. /* signature size */
  27393. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  27394. args->idx += LENGTH_SZ;
  27395. ret = HashSkeData(ssl, hashType,
  27396. args->output + preSigIdx, preSigSz,
  27397. ssl->suites->sigAlgo);
  27398. if (ret != 0) {
  27399. goto exit_sske;
  27400. }
  27401. args->sigSz = args->tmpSigSz;
  27402. /* Sign hash to create signature */
  27403. switch (ssl->suites->sigAlgo)
  27404. {
  27405. #ifndef NO_RSA
  27406. case rsa_sa_algo:
  27407. {
  27408. /* For TLS 1.2 re-encode signature */
  27409. if (IsAtLeastTLSv1_2(ssl)) {
  27410. byte* encodedSig = (byte*)XMALLOC(
  27411. MAX_ENCODED_SIG_SZ, ssl->heap,
  27412. DYNAMIC_TYPE_DIGEST);
  27413. if (encodedSig == NULL) {
  27414. ERROR_OUT(MEMORY_E, exit_sske);
  27415. }
  27416. ssl->buffers.digest.length =
  27417. wc_EncodeSignature(encodedSig,
  27418. ssl->buffers.digest.buffer,
  27419. ssl->buffers.digest.length,
  27420. TypeHash(ssl->suites->hashAlgo));
  27421. /* Replace sig buffer with new one */
  27422. XFREE(ssl->buffers.digest.buffer, ssl->heap,
  27423. DYNAMIC_TYPE_DIGEST);
  27424. ssl->buffers.digest.buffer = encodedSig;
  27425. }
  27426. break;
  27427. }
  27428. #endif /* NO_RSA */
  27429. default:
  27430. break;
  27431. } /* switch (ssl->suites->sigAlgo) */
  27432. break;
  27433. }
  27434. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  27435. default:
  27436. break;
  27437. } /* switch(ssl->specs.kea) */
  27438. /* Check for error */
  27439. if (ret != 0) {
  27440. goto exit_sske;
  27441. }
  27442. /* Advance state and proceed */
  27443. ssl->options.asyncState = TLS_ASYNC_DO;
  27444. } /* case TLS_ASYNC_BUILD */
  27445. FALL_THROUGH;
  27446. case TLS_ASYNC_DO:
  27447. {
  27448. switch(ssl->specs.kea)
  27449. {
  27450. #ifndef NO_PSK
  27451. case psk_kea:
  27452. {
  27453. break;
  27454. }
  27455. #endif /* !NO_PSK */
  27456. #if !defined(NO_DH) && !defined(NO_PSK)
  27457. case dhe_psk_kea:
  27458. {
  27459. break;
  27460. }
  27461. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  27462. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27463. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27464. case ecdhe_psk_kea:
  27465. {
  27466. break;
  27467. }
  27468. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27469. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27470. defined(HAVE_CURVE448)
  27471. case ecc_diffie_hellman_kea:
  27472. {
  27473. /* Sign hash to create signature */
  27474. switch (ssl->suites->sigAlgo)
  27475. {
  27476. #ifndef NO_RSA
  27477. #ifdef WC_RSA_PSS
  27478. case rsa_pss_sa_algo:
  27479. #endif
  27480. case rsa_sa_algo:
  27481. {
  27482. RsaKey* key = (RsaKey*)ssl->hsKey;
  27483. ret = RsaSign(ssl,
  27484. ssl->buffers.digest.buffer,
  27485. ssl->buffers.digest.length,
  27486. args->output + args->idx,
  27487. &args->sigSz,
  27488. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  27489. key,
  27490. ssl->buffers.key
  27491. );
  27492. break;
  27493. }
  27494. #endif /* !NO_RSA */
  27495. #ifdef HAVE_ECC
  27496. case ecc_dsa_sa_algo:
  27497. {
  27498. ecc_key* key = (ecc_key*)ssl->hsKey;
  27499. ret = EccSign(ssl,
  27500. ssl->buffers.digest.buffer,
  27501. ssl->buffers.digest.length,
  27502. args->output + LENGTH_SZ + args->idx,
  27503. &args->sigSz,
  27504. key,
  27505. #ifdef HAVE_PK_CALLBACKS
  27506. ssl->buffers.key
  27507. #else
  27508. NULL
  27509. #endif
  27510. );
  27511. break;
  27512. }
  27513. #endif /* HAVE_ECC */
  27514. #ifdef HAVE_ED25519
  27515. case ed25519_sa_algo:
  27516. {
  27517. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  27518. ret = Ed25519Sign(ssl,
  27519. ssl->buffers.sig.buffer,
  27520. ssl->buffers.sig.length,
  27521. args->output + LENGTH_SZ + args->idx,
  27522. &args->sigSz,
  27523. key,
  27524. #ifdef HAVE_PK_CALLBACKS
  27525. ssl->buffers.key
  27526. #else
  27527. NULL
  27528. #endif
  27529. );
  27530. break;
  27531. }
  27532. #endif
  27533. #ifdef HAVE_ED448
  27534. case ed448_sa_algo:
  27535. {
  27536. ed448_key* key = (ed448_key*)ssl->hsKey;
  27537. ret = Ed448Sign(ssl,
  27538. ssl->buffers.sig.buffer,
  27539. ssl->buffers.sig.length,
  27540. args->output + LENGTH_SZ + args->idx,
  27541. &args->sigSz,
  27542. key,
  27543. #ifdef HAVE_PK_CALLBACKS
  27544. ssl->buffers.key
  27545. #else
  27546. NULL
  27547. #endif
  27548. );
  27549. break;
  27550. }
  27551. #endif
  27552. default:
  27553. ERROR_OUT(ALGO_ID_E, exit_sske);
  27554. } /* switch(ssl->specs.sig_algo) */
  27555. break;
  27556. }
  27557. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27558. #if !defined(NO_DH) && !defined(NO_RSA)
  27559. case diffie_hellman_kea:
  27560. {
  27561. /* Sign hash to create signature */
  27562. switch (ssl->suites->sigAlgo)
  27563. {
  27564. #ifndef NO_RSA
  27565. #ifdef WC_RSA_PSS
  27566. case rsa_pss_sa_algo:
  27567. #endif
  27568. case rsa_sa_algo:
  27569. {
  27570. RsaKey* key = (RsaKey*)ssl->hsKey;
  27571. if (ssl->options.usingAnon_cipher) {
  27572. break;
  27573. }
  27574. ret = RsaSign(ssl,
  27575. ssl->buffers.digest.buffer,
  27576. ssl->buffers.digest.length,
  27577. args->output + args->idx,
  27578. &args->sigSz,
  27579. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  27580. key,
  27581. ssl->buffers.key
  27582. );
  27583. break;
  27584. }
  27585. #endif /* NO_RSA */
  27586. default:
  27587. break;
  27588. } /* switch (ssl->suites->sigAlgo) */
  27589. break;
  27590. }
  27591. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  27592. default:
  27593. break;
  27594. } /* switch(ssl->specs.kea) */
  27595. /* Check for error */
  27596. if (ret != 0) {
  27597. goto exit_sske;
  27598. }
  27599. /* Advance state and proceed */
  27600. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  27601. } /* case TLS_ASYNC_DO */
  27602. FALL_THROUGH;
  27603. case TLS_ASYNC_VERIFY:
  27604. {
  27605. switch(ssl->specs.kea)
  27606. {
  27607. #ifndef NO_PSK
  27608. case psk_kea:
  27609. {
  27610. /* Nothing to do in this sub-state */
  27611. break;
  27612. }
  27613. #endif /* !NO_PSK */
  27614. #if !defined(NO_DH) && !defined(NO_PSK)
  27615. case dhe_psk_kea:
  27616. {
  27617. /* Nothing to do in this sub-state */
  27618. break;
  27619. }
  27620. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  27621. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27622. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  27623. case ecdhe_psk_kea:
  27624. {
  27625. /* Nothing to do in this sub-state */
  27626. break;
  27627. }
  27628. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  27629. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27630. defined(HAVE_CURVE448)
  27631. case ecc_diffie_hellman_kea:
  27632. {
  27633. switch(ssl->suites->sigAlgo)
  27634. {
  27635. #ifndef NO_RSA
  27636. #ifdef WC_RSA_PSS
  27637. case rsa_pss_sa_algo:
  27638. #endif
  27639. case rsa_sa_algo:
  27640. {
  27641. RsaKey* key = (RsaKey*)ssl->hsKey;
  27642. if (args->verifySig == NULL) {
  27643. if (args->sigSz == 0) {
  27644. ERROR_OUT(BAD_COND_E, exit_sske);
  27645. }
  27646. args->verifySig = (byte*)XMALLOC(
  27647. args->sigSz, ssl->heap,
  27648. DYNAMIC_TYPE_SIGNATURE);
  27649. if (!args->verifySig) {
  27650. ERROR_OUT(MEMORY_E, exit_sske);
  27651. }
  27652. XMEMCPY(args->verifySig,
  27653. args->output + args->idx, args->sigSz);
  27654. }
  27655. /* check for signature faults */
  27656. ret = VerifyRsaSign(ssl,
  27657. args->verifySig, args->sigSz,
  27658. ssl->buffers.digest.buffer,
  27659. ssl->buffers.digest.length,
  27660. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  27661. key, ssl->buffers.key
  27662. );
  27663. break;
  27664. }
  27665. #endif
  27666. case ecc_dsa_sa_algo:
  27667. #ifdef HAVE_ED25519
  27668. case ed25519_sa_algo:
  27669. #endif
  27670. #ifdef HAVE_ED448
  27671. case ed448_sa_algo:
  27672. #endif
  27673. {
  27674. /* Now that we know the real sig size, write it. */
  27675. c16toa((word16)args->sigSz,
  27676. args->output + args->idx);
  27677. /* And adjust length and sendSz from estimates */
  27678. args->length += args->sigSz - args->tmpSigSz;
  27679. args->sendSz += args->sigSz - args->tmpSigSz;
  27680. break;
  27681. }
  27682. default:
  27683. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  27684. } /* switch(ssl->specs.sig_algo) */
  27685. break;
  27686. }
  27687. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27688. #if !defined(NO_DH) && !defined(NO_RSA)
  27689. case diffie_hellman_kea:
  27690. {
  27691. switch (ssl->suites->sigAlgo)
  27692. {
  27693. #ifndef NO_RSA
  27694. #ifndef WC_RSA_PSS
  27695. case rsa_pss_sa_algo:
  27696. #endif
  27697. case rsa_sa_algo:
  27698. {
  27699. RsaKey* key = (RsaKey*)ssl->hsKey;
  27700. if (ssl->options.usingAnon_cipher) {
  27701. break;
  27702. }
  27703. if (args->verifySig == NULL) {
  27704. if (args->sigSz == 0) {
  27705. ERROR_OUT(BAD_COND_E, exit_sske);
  27706. }
  27707. args->verifySig = (byte*)XMALLOC(
  27708. args->sigSz, ssl->heap,
  27709. DYNAMIC_TYPE_SIGNATURE);
  27710. if (!args->verifySig) {
  27711. ERROR_OUT(MEMORY_E, exit_sske);
  27712. }
  27713. XMEMCPY(args->verifySig,
  27714. args->output + args->idx, args->sigSz);
  27715. }
  27716. /* check for signature faults */
  27717. ret = VerifyRsaSign(ssl,
  27718. args->verifySig, args->sigSz,
  27719. ssl->buffers.digest.buffer,
  27720. ssl->buffers.digest.length,
  27721. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  27722. key, ssl->buffers.key
  27723. );
  27724. break;
  27725. }
  27726. #endif
  27727. } /* switch (ssl->suites->sigAlgo) */
  27728. break;
  27729. }
  27730. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  27731. default:
  27732. break;
  27733. } /* switch(ssl->specs.kea) */
  27734. /* Check for error */
  27735. if (ret != 0) {
  27736. goto exit_sske;
  27737. }
  27738. /* Advance state and proceed */
  27739. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  27740. } /* case TLS_ASYNC_VERIFY */
  27741. FALL_THROUGH;
  27742. case TLS_ASYNC_FINALIZE:
  27743. {
  27744. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27745. defined(HAVE_CURVE448)
  27746. if (ssl->specs.kea == ecdhe_psk_kea ||
  27747. ssl->specs.kea == ecc_diffie_hellman_kea) {
  27748. /* Check output to make sure it was set */
  27749. if (args->output) {
  27750. AddHeaders(args->output, args->length,
  27751. server_key_exchange, ssl);
  27752. }
  27753. else {
  27754. ERROR_OUT(BUFFER_ERROR, exit_sske);
  27755. }
  27756. }
  27757. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  27758. /* Advance state and proceed */
  27759. ssl->options.asyncState = TLS_ASYNC_END;
  27760. } /* case TLS_ASYNC_FINALIZE */
  27761. FALL_THROUGH;
  27762. case TLS_ASYNC_END:
  27763. {
  27764. ret = SendHandshakeMsg(ssl, args->output, args->length,
  27765. server_key_exchange, "ServerKeyExchange");
  27766. if (ret != 0)
  27767. goto exit_sske;
  27768. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  27769. break;
  27770. }
  27771. default:
  27772. ret = INPUT_CASE_ERROR;
  27773. } /* switch(ssl->options.asyncState) */
  27774. exit_sske:
  27775. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  27776. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  27777. #ifdef WOLFSSL_ASYNC_IO
  27778. /* Handle async operation */
  27779. if (ret == WANT_WRITE
  27780. #ifdef WOLFSSL_ASYNC_CRYPT
  27781. || ret == WC_PENDING_E
  27782. #endif
  27783. )
  27784. return ret;
  27785. #endif /* WOLFSSL_ASYNC_IO */
  27786. /* Final cleanup */
  27787. if (args != NULL && args->input != NULL) {
  27788. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27789. args->input = NULL;
  27790. }
  27791. #ifdef WOLFSSL_ASYNC_IO
  27792. /* Cleanup async */
  27793. FreeAsyncCtx(ssl, 0);
  27794. #else
  27795. FreeSskeArgs(ssl, args);
  27796. #endif
  27797. FreeKeyExchange(ssl);
  27798. if (ret != 0) {
  27799. WOLFSSL_ERROR_VERBOSE(ret);
  27800. }
  27801. return ret;
  27802. }
  27803. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  27804. defined(OPENSSL_ALL)
  27805. /* search suites for specific one, idx on success, negative on error */
  27806. static int FindSuite(Suites* suites, byte first, byte second)
  27807. {
  27808. int i;
  27809. if (suites == NULL || suites->suiteSz == 0) {
  27810. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  27811. return SUITES_ERROR;
  27812. }
  27813. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  27814. if (suites->suites[i] == first &&
  27815. suites->suites[i+1] == second )
  27816. return i;
  27817. }
  27818. return MATCH_SUITE_ERROR;
  27819. }
  27820. #endif
  27821. #endif /* !WOLFSSL_NO_TLS12 */
  27822. /* Make sure server cert/key are valid for this suite, true on success
  27823. * Returns 1 for valid server suite or 0 if not found
  27824. * For asynchronous this can return WC_PENDING_E
  27825. */
  27826. static int VerifyServerSuite(WOLFSSL* ssl, word16 idx)
  27827. {
  27828. #ifndef NO_PSK
  27829. int havePSK = ssl->options.havePSK;
  27830. #endif
  27831. byte first;
  27832. byte second;
  27833. WOLFSSL_ENTER("VerifyServerSuite");
  27834. if (ssl->suites == NULL) {
  27835. WOLFSSL_MSG("Suites pointer error");
  27836. return 0;
  27837. }
  27838. first = ssl->suites->suites[idx];
  27839. second = ssl->suites->suites[idx+1];
  27840. if (CipherRequires(first, second, REQUIRES_RSA)) {
  27841. WOLFSSL_MSG("Requires RSA");
  27842. if (ssl->options.haveRSA == 0) {
  27843. WOLFSSL_MSG("Don't have RSA");
  27844. return 0;
  27845. }
  27846. }
  27847. if (CipherRequires(first, second, REQUIRES_DHE)) {
  27848. WOLFSSL_MSG("Requires DHE");
  27849. if (ssl->options.haveDH == 0) {
  27850. WOLFSSL_MSG("Don't have DHE");
  27851. return 0;
  27852. }
  27853. }
  27854. if (CipherRequires(first, second, REQUIRES_ECC)) {
  27855. WOLFSSL_MSG("Requires ECC");
  27856. if (ssl->options.haveECC == 0) {
  27857. WOLFSSL_MSG("Don't have ECC");
  27858. return 0;
  27859. }
  27860. }
  27861. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  27862. WOLFSSL_MSG("Requires static ECC");
  27863. if (ssl->options.haveStaticECC == 0) {
  27864. WOLFSSL_MSG("Don't have static ECC");
  27865. return 0;
  27866. }
  27867. }
  27868. if (CipherRequires(first, second, REQUIRES_PSK)) {
  27869. WOLFSSL_MSG("Requires PSK");
  27870. #ifndef NO_PSK
  27871. if (havePSK == 0)
  27872. #endif
  27873. {
  27874. WOLFSSL_MSG("Don't have PSK");
  27875. return 0;
  27876. }
  27877. }
  27878. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  27879. WOLFSSL_MSG("Requires RSA Signature");
  27880. if (ssl->options.side == WOLFSSL_SERVER_END &&
  27881. ssl->options.haveECDSAsig == 1) {
  27882. WOLFSSL_MSG("Don't have RSA Signature");
  27883. return 0;
  27884. }
  27885. }
  27886. #if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
  27887. if (CipherRequires(first, second, REQUIRES_AEAD)) {
  27888. WOLFSSL_MSG("Requires AEAD");
  27889. if (ssl->version.major == SSLv3_MAJOR &&
  27890. ssl->version.minor < TLSv1_2_MINOR) {
  27891. WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
  27892. return 0;
  27893. }
  27894. }
  27895. #endif
  27896. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  27897. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  27898. if (!TLSX_ValidateSupportedCurves(ssl, first, second)) {
  27899. WOLFSSL_MSG("Don't have matching curves");
  27900. return 0;
  27901. }
  27902. #endif
  27903. #ifdef WOLFSSL_TLS13
  27904. if (IsAtLeastTLSv1_3(ssl->version) &&
  27905. ssl->options.side == WOLFSSL_SERVER_END) {
  27906. #ifdef HAVE_SUPPORTED_CURVES
  27907. int doHelloRetry = 0;
  27908. /* Try to establish a key share. */
  27909. int ret = TLSX_KeyShare_Establish(ssl, &doHelloRetry);
  27910. if (doHelloRetry) {
  27911. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  27912. }
  27913. #ifdef WOLFSSL_ASYNC_CRYPT
  27914. if (ret == WC_PENDING_E)
  27915. return ret;
  27916. #endif
  27917. if (!doHelloRetry && ret != 0) {
  27918. return 0; /* not found */
  27919. }
  27920. #endif /* HAVE_SUPPORTED_CURVES */
  27921. }
  27922. else if (first == TLS13_BYTE || (first == ECC_BYTE &&
  27923. (second == TLS_SHA256_SHA256 || second == TLS_SHA384_SHA384))) {
  27924. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  27925. * version. */
  27926. return 0;
  27927. }
  27928. #endif /* WOLFSSL_TLS13 */
  27929. return 1;
  27930. }
  27931. static int CompareSuites(WOLFSSL* ssl, Suites* peerSuites, word16 i,
  27932. word16 j)
  27933. {
  27934. if (ssl->suites->suites[i] == peerSuites->suites[j] &&
  27935. ssl->suites->suites[i+1] == peerSuites->suites[j+1] ) {
  27936. int ret = VerifyServerSuite(ssl, i);
  27937. #ifdef WOLFSSL_ASYNC_CRYPT
  27938. if (ret == WC_PENDING_E)
  27939. return ret;
  27940. #endif
  27941. if (ret) {
  27942. WOLFSSL_MSG("Verified suite validity");
  27943. ssl->options.cipherSuite0 = ssl->suites->suites[i];
  27944. ssl->options.cipherSuite = ssl->suites->suites[i+1];
  27945. ret = SetCipherSpecs(ssl);
  27946. if (ret == 0) {
  27947. ret = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  27948. peerSuites->hashSigAlgoSz);
  27949. }
  27950. return ret;
  27951. }
  27952. else {
  27953. WOLFSSL_MSG("Could not verify suite validity, continue");
  27954. }
  27955. }
  27956. return MATCH_SUITE_ERROR;
  27957. }
  27958. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  27959. {
  27960. int ret;
  27961. word16 i, j;
  27962. WOLFSSL_ENTER("MatchSuite");
  27963. /* & 0x1 equivalent % 2 */
  27964. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  27965. return BUFFER_ERROR;
  27966. if (ssl->suites == NULL)
  27967. return SUITES_ERROR;
  27968. if (!ssl->options.useClientOrder) {
  27969. /* Server order */
  27970. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  27971. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  27972. ret = CompareSuites(ssl, peerSuites, i, j);
  27973. if (ret != MATCH_SUITE_ERROR)
  27974. return ret;
  27975. }
  27976. }
  27977. }
  27978. else {
  27979. /* Client order */
  27980. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  27981. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  27982. ret = CompareSuites(ssl, peerSuites, i, j);
  27983. if (ret != MATCH_SUITE_ERROR)
  27984. return ret;
  27985. }
  27986. }
  27987. }
  27988. WOLFSSL_ERROR_VERBOSE(MATCH_SUITE_ERROR);
  27989. return MATCH_SUITE_ERROR;
  27990. }
  27991. #ifdef OLD_HELLO_ALLOWED
  27992. /* process old style client hello, deprecate? */
  27993. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  27994. word32 inSz, word16 sz)
  27995. {
  27996. word32 idx = *inOutIdx;
  27997. word16 sessionSz;
  27998. word16 randomSz;
  27999. word16 i, j;
  28000. ProtocolVersion pv;
  28001. Suites clSuites;
  28002. int ret = -1;
  28003. (void)inSz;
  28004. WOLFSSL_MSG("Got old format client hello");
  28005. #ifdef WOLFSSL_CALLBACKS
  28006. if (ssl->hsInfoOn)
  28007. AddPacketName(ssl, "ClientHello");
  28008. if (ssl->toInfoOn)
  28009. AddLateName("ClientHello", &ssl->timeoutInfo);
  28010. #endif
  28011. /* manually hash input since different format */
  28012. #ifndef NO_OLD_TLS
  28013. #ifndef NO_MD5
  28014. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  28015. #endif
  28016. #ifndef NO_SHA
  28017. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  28018. #endif
  28019. #endif
  28020. #ifndef NO_SHA256
  28021. if (IsAtLeastTLSv1_2(ssl)) {
  28022. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  28023. input + idx, sz);
  28024. if (shaRet != 0)
  28025. return shaRet;
  28026. }
  28027. #endif
  28028. /* does this value mean client_hello? */
  28029. idx++;
  28030. /* version */
  28031. pv.major = input[idx++];
  28032. pv.minor = input[idx++];
  28033. ssl->chVersion = pv; /* store */
  28034. if (ssl->version.minor > pv.minor) {
  28035. byte haveRSA = 0;
  28036. byte havePSK = 0;
  28037. int keySz = 0;
  28038. if (!ssl->options.downgrade) {
  28039. WOLFSSL_MSG("Client trying to connect with lesser version");
  28040. return VERSION_ERROR;
  28041. }
  28042. if (pv.minor < ssl->options.minDowngrade) {
  28043. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  28044. return VERSION_ERROR;
  28045. }
  28046. if (pv.minor == SSLv3_MINOR) {
  28047. /* turn off tls */
  28048. WOLFSSL_MSG("\tdowngrading to SSLv3");
  28049. ssl->options.tls = 0;
  28050. ssl->options.tls1_1 = 0;
  28051. ssl->version.minor = SSLv3_MINOR;
  28052. }
  28053. else if (pv.minor == TLSv1_MINOR) {
  28054. WOLFSSL_MSG("\tdowngrading to TLSv1");
  28055. /* turn off tls 1.1+ */
  28056. ssl->options.tls1_1 = 0;
  28057. ssl->version.minor = TLSv1_MINOR;
  28058. }
  28059. else if (pv.minor == TLSv1_1_MINOR) {
  28060. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  28061. ssl->version.minor = TLSv1_1_MINOR;
  28062. }
  28063. else if (pv.minor == TLSv1_2_MINOR) {
  28064. WOLFSSL_MSG(" downgrading to TLSv1.2");
  28065. ssl->version.minor = TLSv1_2_MINOR;
  28066. }
  28067. #ifndef NO_RSA
  28068. haveRSA = 1;
  28069. #endif
  28070. #ifndef NO_PSK
  28071. havePSK = ssl->options.havePSK;
  28072. #endif
  28073. #ifndef NO_CERTS
  28074. keySz = ssl->buffers.keySz;
  28075. #endif
  28076. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  28077. ssl->options.haveDH, ssl->options.haveECDSAsig,
  28078. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  28079. ssl->options.haveFalconSig,
  28080. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  28081. TRUE, ssl->options.side);
  28082. }
  28083. /* suite size */
  28084. ato16(&input[idx], &clSuites.suiteSz);
  28085. idx += OPAQUE16_LEN;
  28086. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  28087. return BUFFER_ERROR;
  28088. /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
  28089. if (clSuites.suiteSz % 3 != 0)
  28090. return BUFFER_ERROR;
  28091. clSuites.hashSigAlgoSz = 0;
  28092. /* session size */
  28093. ato16(&input[idx], &sessionSz);
  28094. idx += OPAQUE16_LEN;
  28095. if (sessionSz > ID_LEN)
  28096. return BUFFER_ERROR;
  28097. /* random size */
  28098. ato16(&input[idx], &randomSz);
  28099. idx += OPAQUE16_LEN;
  28100. if (randomSz > RAN_LEN)
  28101. return BUFFER_ERROR;
  28102. /* suites */
  28103. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  28104. byte first = input[idx++];
  28105. if (!first) { /* implicit: skip sslv2 type */
  28106. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  28107. j += SUITE_LEN;
  28108. }
  28109. idx += SUITE_LEN;
  28110. }
  28111. clSuites.suiteSz = j;
  28112. /* session id */
  28113. if (sessionSz) {
  28114. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  28115. ssl->arrays->sessionIDSz = (byte)sessionSz;
  28116. idx += sessionSz;
  28117. ssl->options.resuming = 1;
  28118. }
  28119. /* random */
  28120. if (randomSz < RAN_LEN)
  28121. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  28122. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  28123. randomSz);
  28124. idx += randomSz;
  28125. if (ssl->options.usingCompression)
  28126. ssl->options.usingCompression = 0; /* turn off */
  28127. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  28128. ssl->cbmode = SSL_CB_MODE_WRITE;
  28129. *inOutIdx = idx;
  28130. ssl->options.haveSessionId = 1;
  28131. /* DoClientHello uses same resume code */
  28132. if (ssl->options.resuming) { /* let's try */
  28133. WOLFSSL_SESSION* session;
  28134. #ifdef HAVE_SESSION_TICKET
  28135. if (ssl->options.useTicket == 1) {
  28136. session = ssl->session;
  28137. }
  28138. else
  28139. #endif
  28140. {
  28141. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  28142. }
  28143. if (!session) {
  28144. WOLFSSL_MSG("Session lookup for resume failed");
  28145. ssl->options.resuming = 0;
  28146. } else {
  28147. if (MatchSuite(ssl, &clSuites) < 0) {
  28148. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  28149. return UNSUPPORTED_SUITE;
  28150. }
  28151. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  28152. RAN_LEN);
  28153. if (ret != 0)
  28154. return ret;
  28155. #ifdef NO_OLD_TLS
  28156. ret = DeriveTlsKeys(ssl);
  28157. #else
  28158. #ifndef NO_TLS
  28159. if (ssl->options.tls)
  28160. ret = DeriveTlsKeys(ssl);
  28161. #endif
  28162. if (!ssl->options.tls)
  28163. ret = DeriveKeys(ssl);
  28164. #endif
  28165. /* SERVER: peer auth based on session secret. */
  28166. ssl->options.peerAuthGood = (ret == 0);
  28167. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  28168. return ret;
  28169. }
  28170. }
  28171. ret = MatchSuite(ssl, &clSuites);
  28172. if (ret != 0)return ret;
  28173. return SanityCheckMsgReceived(ssl, client_hello);
  28174. }
  28175. #endif /* OLD_HELLO_ALLOWED */
  28176. #ifndef WOLFSSL_NO_TLS12
  28177. /**
  28178. * Handles session resumption.
  28179. * Session tickets are checked for validity based on the time each ticket
  28180. * was created, timeout value and the current time. If the tickets are
  28181. * judged expired, falls back to full-handshake. If you want disable this
  28182. * session ticket validation check in TLS1.2 and below, define
  28183. * WOLFSSL_NO_TICKET_EXPRE.
  28184. */
  28185. int HandleTlsResumption(WOLFSSL* ssl, int bogusID, Suites* clSuites)
  28186. {
  28187. int ret = 0;
  28188. WOLFSSL_SESSION* session;
  28189. (void)bogusID;
  28190. #ifdef HAVE_SESSION_TICKET
  28191. if (ssl->options.useTicket == 1) {
  28192. session = ssl->session;
  28193. }
  28194. else if (bogusID == 1 && ssl->options.rejectTicket == 0) {
  28195. WOLFSSL_MSG("Bogus session ID without session ticket");
  28196. return BUFFER_ERROR;
  28197. }
  28198. else
  28199. #endif
  28200. {
  28201. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  28202. }
  28203. if (!session) {
  28204. WOLFSSL_MSG("Session lookup for resume failed");
  28205. ssl->options.resuming = 0;
  28206. return ret;
  28207. }
  28208. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_TICKET_EXPIRE) && \
  28209. !defined(NO_ASN_TIME)
  28210. /* check if the ticket is valid */
  28211. if (LowResTimer() > session->bornOn + ssl->timeout) {
  28212. WOLFSSL_MSG("Expired session ticket, fall back to full handshake.");
  28213. ssl->options.resuming = 0;
  28214. }
  28215. #endif /* HAVE_SESSION_TICKET && !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
  28216. else if (session->haveEMS != ssl->options.haveEMS) {
  28217. /* RFC 7627, 5.3, server-side */
  28218. /* if old sess didn't have EMS, but new does, full handshake */
  28219. if (!session->haveEMS && ssl->options.haveEMS) {
  28220. WOLFSSL_MSG("Attempting to resume a session that didn't "
  28221. "use EMS with a new session with EMS. Do full "
  28222. "handshake.");
  28223. ssl->options.resuming = 0;
  28224. }
  28225. /* if old sess used EMS, but new doesn't, MUST abort */
  28226. else if (session->haveEMS && !ssl->options.haveEMS) {
  28227. WOLFSSL_MSG("Trying to resume a session with EMS without "
  28228. "using EMS");
  28229. #ifdef WOLFSSL_EXTRA_ALERTS
  28230. SendAlert(ssl, alert_fatal, handshake_failure);
  28231. #endif
  28232. ret = EXT_MASTER_SECRET_NEEDED_E;
  28233. WOLFSSL_ERROR_VERBOSE(ret);
  28234. }
  28235. }
  28236. else {
  28237. #ifndef NO_RESUME_SUITE_CHECK
  28238. int j;
  28239. /* Check client suites include the one in session */
  28240. for (j = 0; j < clSuites->suiteSz; j += 2) {
  28241. if (clSuites->suites[j] == session->cipherSuite0 &&
  28242. clSuites->suites[j+1] == session->cipherSuite) {
  28243. break;
  28244. }
  28245. }
  28246. if (j == clSuites->suiteSz) {
  28247. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  28248. #ifdef WOLFSSL_EXTRA_ALERTS
  28249. SendAlert(ssl, alert_fatal, illegal_parameter);
  28250. #endif
  28251. ret = UNSUPPORTED_SUITE;
  28252. WOLFSSL_ERROR_VERBOSE(ret);
  28253. }
  28254. #endif
  28255. if (ret == 0 && ssl->options.resuming) {
  28256. /* for resumption use the cipher suite from session */
  28257. ssl->options.cipherSuite0 = session->cipherSuite0;
  28258. ssl->options.cipherSuite = session->cipherSuite;
  28259. ret = SetCipherSpecs(ssl);
  28260. if (ret == 0) {
  28261. ret = PickHashSigAlgo(ssl, clSuites->hashSigAlgo,
  28262. clSuites->hashSigAlgoSz);
  28263. }
  28264. }
  28265. else if (ret == 0) {
  28266. if (MatchSuite(ssl, clSuites) < 0) {
  28267. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  28268. ret = UNSUPPORTED_SUITE;
  28269. WOLFSSL_ERROR_VERBOSE(ret);
  28270. }
  28271. }
  28272. if (ret == 0) {
  28273. ret = wc_RNG_GenerateBlock(ssl->rng,
  28274. ssl->arrays->serverRandom, RAN_LEN);
  28275. }
  28276. if (ret == 0) {
  28277. #ifdef NO_OLD_TLS
  28278. ret = DeriveTlsKeys(ssl);
  28279. #else
  28280. #ifndef NO_TLS
  28281. if (ssl->options.tls)
  28282. ret = DeriveTlsKeys(ssl);
  28283. #endif
  28284. if (!ssl->options.tls)
  28285. ret = DeriveKeys(ssl);
  28286. #endif
  28287. /* SERVER: peer auth based on session secret. */
  28288. ssl->options.peerAuthGood = (ret == 0);
  28289. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  28290. }
  28291. }
  28292. return ret;
  28293. }
  28294. /* handle processing of client_hello (1) */
  28295. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  28296. word32 helloSz)
  28297. {
  28298. byte b;
  28299. byte bogusID = 0; /* flag for a bogus session id */
  28300. ProtocolVersion pv;
  28301. Suites clSuites;
  28302. word32 i = *inOutIdx;
  28303. word32 begin = i;
  28304. int ret = 0;
  28305. byte lesserVersion;
  28306. #ifdef WOLFSSL_DTLS
  28307. Hmac cookieHmac;
  28308. byte newCookie[MAX_COOKIE_LEN];
  28309. byte peerCookie[MAX_COOKIE_LEN];
  28310. byte peerCookieSz = 0;
  28311. byte cookieType;
  28312. byte cookieSz = 0;
  28313. XMEMSET(&cookieHmac, 0, sizeof(Hmac));
  28314. #endif /* WOLFSSL_DTLS */
  28315. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  28316. WOLFSSL_ENTER("DoClientHello");
  28317. #ifdef WOLFSSL_CALLBACKS
  28318. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  28319. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  28320. #endif
  28321. /* protocol version, random and session id length check */
  28322. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  28323. return BUFFER_ERROR;
  28324. /* protocol version */
  28325. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  28326. ssl->chVersion = pv; /* store */
  28327. #ifdef WOLFSSL_DTLS
  28328. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  28329. #if defined(NO_SHA) && defined(NO_SHA256)
  28330. #error "DTLS needs either SHA or SHA-256"
  28331. #endif /* NO_SHA && NO_SHA256 */
  28332. #if !defined(NO_SHA) && defined(NO_SHA256)
  28333. cookieType = WC_SHA;
  28334. cookieSz = WC_SHA_DIGEST_SIZE;
  28335. #endif /* NO_SHA */
  28336. #ifndef NO_SHA256
  28337. cookieType = WC_SHA256;
  28338. cookieSz = WC_SHA256_DIGEST_SIZE;
  28339. #endif /* NO_SHA256 */
  28340. ret = wc_HmacSetKey(&cookieHmac, cookieType,
  28341. ssl->buffers.dtlsCookieSecret.buffer,
  28342. ssl->buffers.dtlsCookieSecret.length);
  28343. if (ret != 0) goto out;
  28344. ret = wc_HmacUpdate(&cookieHmac,
  28345. (const byte*)ssl->buffers.dtlsCtx.peer.sa,
  28346. ssl->buffers.dtlsCtx.peer.sz);
  28347. if (ret != 0) goto out;
  28348. ret = wc_HmacUpdate(&cookieHmac, input + i, OPAQUE16_LEN);
  28349. if (ret != 0) goto out;
  28350. }
  28351. #endif /* WOLFSSL_DTLS */
  28352. i += OPAQUE16_LEN;
  28353. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  28354. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  28355. pv.minor = TLSv1_2_MINOR;
  28356. lesserVersion = !ssl->options.dtls && ssl->version.minor > pv.minor;
  28357. lesserVersion |= ssl->options.dtls && ssl->version.minor < pv.minor;
  28358. if (lesserVersion) {
  28359. byte belowMinDowngrade;
  28360. word16 haveRSA = 0;
  28361. word16 havePSK = 0;
  28362. int keySz = 0;
  28363. if (!ssl->options.downgrade) {
  28364. WOLFSSL_MSG("Client trying to connect with lesser version");
  28365. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA)
  28366. SendAlert(ssl, alert_fatal, handshake_failure);
  28367. #endif
  28368. ret = VERSION_ERROR;
  28369. goto out;
  28370. }
  28371. belowMinDowngrade = pv.minor < ssl->options.minDowngrade;
  28372. /* DTLS versions increase backwards (-1,-2,-3) ecc */
  28373. if (ssl->options.dtls)
  28374. belowMinDowngrade = ssl->options.dtls
  28375. && pv.minor > ssl->options.minDowngrade;
  28376. if (belowMinDowngrade) {
  28377. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  28378. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA)
  28379. SendAlert(ssl, alert_fatal, handshake_failure);
  28380. #endif
  28381. ret = VERSION_ERROR;
  28382. goto out;
  28383. }
  28384. if (!ssl->options.dtls) {
  28385. if (pv.minor == SSLv3_MINOR) {
  28386. /* turn off tls */
  28387. WOLFSSL_MSG("\tdowngrading to SSLv3");
  28388. ssl->options.tls = 0;
  28389. ssl->options.tls1_1 = 0;
  28390. ssl->version.minor = SSLv3_MINOR;
  28391. }
  28392. else if (pv.minor == TLSv1_MINOR) {
  28393. /* turn off tls 1.1+ */
  28394. WOLFSSL_MSG("\tdowngrading to TLSv1");
  28395. ssl->options.tls1_1 = 0;
  28396. ssl->version.minor = TLSv1_MINOR;
  28397. }
  28398. else if (pv.minor == TLSv1_1_MINOR) {
  28399. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  28400. ssl->version.minor = TLSv1_1_MINOR;
  28401. }
  28402. else if (pv.minor == TLSv1_2_MINOR) {
  28403. WOLFSSL_MSG(" downgrading to TLSv1.2");
  28404. ssl->version.minor = TLSv1_2_MINOR;
  28405. }
  28406. }
  28407. else {
  28408. if (pv.minor == DTLSv1_2_MINOR) {
  28409. WOLFSSL_MSG("\tDowngrading to DTLSv1.2");
  28410. ssl->options.tls1_3 = 0;
  28411. ssl->version.minor = DTLSv1_2_MINOR;
  28412. /* reset hashes, DTLSv1.2 will take care of the hashing
  28413. later */
  28414. ret = InitHandshakeHashes(ssl);
  28415. if (ret != 0)
  28416. return ret;
  28417. }
  28418. else if (pv.minor == DTLS_MINOR) {
  28419. WOLFSSL_MSG("\tDowngrading to DTLSv1.2");
  28420. ssl->options.tls1_3 = 0;
  28421. ssl->version.minor = DTLS_MINOR;
  28422. }
  28423. }
  28424. #ifndef NO_RSA
  28425. haveRSA = 1;
  28426. #endif
  28427. #ifndef NO_PSK
  28428. havePSK = ssl->options.havePSK;
  28429. #endif
  28430. #ifndef NO_CERTS
  28431. keySz = ssl->buffers.keySz;
  28432. #endif
  28433. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  28434. ssl->options.haveDH, ssl->options.haveECDSAsig,
  28435. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  28436. ssl->options.haveFalconSig,
  28437. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  28438. TRUE, ssl->options.side);
  28439. }
  28440. /* check if option is set to not allow the current version
  28441. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  28442. if (!ssl->options.dtls && ssl->options.downgrade &&
  28443. ssl->options.mask > 0) {
  28444. int reset = 0;
  28445. if (ssl->version.minor == TLSv1_2_MINOR &&
  28446. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) ==
  28447. WOLFSSL_OP_NO_TLSv1_2) {
  28448. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  28449. ssl->version.minor = TLSv1_1_MINOR;
  28450. reset = 1;
  28451. }
  28452. if (ssl->version.minor == TLSv1_1_MINOR &&
  28453. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) ==
  28454. WOLFSSL_OP_NO_TLSv1_1) {
  28455. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  28456. ssl->options.tls1_1 = 0;
  28457. ssl->version.minor = TLSv1_MINOR;
  28458. reset = 1;
  28459. }
  28460. if (ssl->version.minor == TLSv1_MINOR &&
  28461. (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) ==
  28462. WOLFSSL_OP_NO_TLSv1) {
  28463. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  28464. ssl->options.tls = 0;
  28465. ssl->options.tls1_1 = 0;
  28466. ssl->version.minor = SSLv3_MINOR;
  28467. reset = 1;
  28468. }
  28469. if (ssl->version.minor == SSLv3_MINOR &&
  28470. (ssl->options.mask & WOLFSSL_OP_NO_SSLv3) ==
  28471. WOLFSSL_OP_NO_SSLv3) {
  28472. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  28473. ret = VERSION_ERROR;
  28474. goto out;
  28475. }
  28476. if (ssl->version.minor < ssl->options.minDowngrade) {
  28477. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  28478. ret = VERSION_ERROR;
  28479. goto out;
  28480. }
  28481. if (reset) {
  28482. word16 haveRSA = 0;
  28483. word16 havePSK = 0;
  28484. int keySz = 0;
  28485. #ifndef NO_RSA
  28486. haveRSA = 1;
  28487. #endif
  28488. #ifndef NO_PSK
  28489. havePSK = ssl->options.havePSK;
  28490. #endif
  28491. #ifndef NO_CERTS
  28492. keySz = ssl->buffers.keySz;
  28493. #endif
  28494. /* reset cipher suites to account for TLS version change */
  28495. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  28496. ssl->options.haveDH, ssl->options.haveECDSAsig,
  28497. ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
  28498. ssl->options.haveFalconSig,
  28499. ssl->options.haveDilithiumSig, ssl->options.haveAnon,
  28500. TRUE, ssl->options.side);
  28501. }
  28502. }
  28503. /* random */
  28504. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  28505. #ifdef WOLFSSL_DTLS
  28506. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  28507. ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN);
  28508. if (ret != 0) goto out;
  28509. }
  28510. #endif /* WOLFSSL_DTLS */
  28511. i += RAN_LEN;
  28512. #ifdef SHOW_SECRETS
  28513. {
  28514. int j;
  28515. printf("client random: ");
  28516. for (j = 0; j < RAN_LEN; j++)
  28517. printf("%02x", ssl->arrays->clientRandom[j]);
  28518. printf("\n");
  28519. }
  28520. #endif
  28521. /* session id */
  28522. b = input[i++];
  28523. #ifdef HAVE_SESSION_TICKET
  28524. if (b > 0 && b < ID_LEN) {
  28525. bogusID = 1;
  28526. WOLFSSL_MSG("Client sent bogus session id, let's allow for echo");
  28527. }
  28528. #endif
  28529. if (b == ID_LEN || bogusID) {
  28530. if ((i - begin) + b > helloSz) {
  28531. ret = BUFFER_ERROR;
  28532. goto out;
  28533. }
  28534. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  28535. #ifdef WOLFSSL_DTLS
  28536. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) &&
  28537. !IsSCR(ssl)) {
  28538. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  28539. if (ret != 0) goto out;
  28540. }
  28541. #endif /* WOLFSSL_DTLS */
  28542. ssl->arrays->sessionIDSz = b;
  28543. i += b;
  28544. ssl->options.resuming = 1; /* client wants to resume */
  28545. WOLFSSL_MSG("Client wants to resume session");
  28546. }
  28547. else if (b) {
  28548. WOLFSSL_MSG("Invalid session ID size");
  28549. ret = BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
  28550. goto out;
  28551. }
  28552. #ifdef WOLFSSL_DTLS
  28553. /* cookie */
  28554. if (ssl->options.dtls) {
  28555. if ((i - begin) + OPAQUE8_LEN > helloSz) {
  28556. ret = BUFFER_ERROR;
  28557. goto out;
  28558. }
  28559. peerCookieSz = input[i++];
  28560. if (peerCookieSz) {
  28561. if (peerCookieSz > MAX_COOKIE_LEN) {
  28562. ret = BUFFER_ERROR;
  28563. goto out;
  28564. }
  28565. if ((i - begin) + peerCookieSz > helloSz) {
  28566. ret = BUFFER_ERROR;
  28567. goto out;
  28568. }
  28569. XMEMCPY(peerCookie, input + i, peerCookieSz);
  28570. i += peerCookieSz;
  28571. }
  28572. }
  28573. #endif
  28574. /* suites */
  28575. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  28576. ret = BUFFER_ERROR;
  28577. goto out;
  28578. }
  28579. ato16(&input[i], &clSuites.suiteSz);
  28580. i += OPAQUE16_LEN;
  28581. /* Cipher suite lists are always multiples of two in length. */
  28582. if (clSuites.suiteSz % 2 != 0) {
  28583. ret = BUFFER_ERROR;
  28584. goto out;
  28585. }
  28586. /* suites and compression length check */
  28587. if ((i - begin) + clSuites.suiteSz + OPAQUE8_LEN > helloSz) {
  28588. ret = BUFFER_ERROR;
  28589. goto out;
  28590. }
  28591. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ) {
  28592. ret = BUFFER_ERROR;
  28593. goto out;
  28594. }
  28595. XMEMCPY(clSuites.suites, input + i, clSuites.suiteSz);
  28596. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  28597. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  28598. if (FindSuite(&clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  28599. TLSX* extension;
  28600. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  28601. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  28602. if (ret != WOLFSSL_SUCCESS)
  28603. goto out;
  28604. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  28605. if (extension) {
  28606. ssl->secure_renegotiation =
  28607. (SecureRenegotiation*)extension->data;
  28608. ssl->secure_renegotiation->enabled = 1;
  28609. }
  28610. }
  28611. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  28612. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  28613. /* check for TLS_FALLBACK_SCSV suite */
  28614. if (FindSuite(&clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  28615. WOLFSSL_MSG("Found Fallback SCSV");
  28616. if (ssl->ctx->method->version.minor > pv.minor) {
  28617. WOLFSSL_MSG("Client trying to connect with lesser version");
  28618. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  28619. ret = VERSION_ERROR;
  28620. goto out;
  28621. }
  28622. }
  28623. #endif
  28624. #ifdef WOLFSSL_DTLS
  28625. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  28626. ret = wc_HmacUpdate(&cookieHmac,
  28627. input + i - OPAQUE16_LEN,
  28628. clSuites.suiteSz + OPAQUE16_LEN);
  28629. if (ret != 0) goto out;
  28630. }
  28631. #endif /* WOLFSSL_DTLS */
  28632. i += clSuites.suiteSz;
  28633. clSuites.hashSigAlgoSz = 0;
  28634. /* compression length */
  28635. b = input[i++];
  28636. if ((i - begin) + b > helloSz) {
  28637. ret = BUFFER_ERROR;
  28638. goto out;
  28639. }
  28640. if (b == 0) {
  28641. WOLFSSL_MSG("No compression types in list");
  28642. #ifdef WOLFSSL_EXTRA_ALERTS
  28643. SendAlert(ssl, alert_fatal, decode_error);
  28644. #endif
  28645. ret = COMPRESSION_ERROR;
  28646. goto out;
  28647. }
  28648. #ifdef WOLFSSL_DTLS
  28649. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  28650. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  28651. if (ret != 0) goto out;
  28652. ret = wc_HmacFinal(&cookieHmac, newCookie);
  28653. if (ret != 0) goto out;
  28654. /* If a cookie callback is set, call it to overwrite the cookie.
  28655. * This should be deprecated. The code now calculates the cookie
  28656. * using an HMAC as expected. */
  28657. if (ssl->ctx->CBIOCookie != NULL &&
  28658. ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz,
  28659. ssl->IOCB_CookieCtx) != cookieSz) {
  28660. ret = COOKIE_ERROR;
  28661. goto out;
  28662. }
  28663. #ifndef WOLFSSL_DTLS_NO_HVR_ON_RESUME
  28664. if (peerCookieSz != cookieSz ||
  28665. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  28666. *inOutIdx += helloSz;
  28667. ret = SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  28668. goto out;
  28669. }
  28670. #endif /* !WOLFSSL_DTLS_NO_HVR_ON_RESUME */
  28671. }
  28672. #endif /* WOLFSSL_DTLS */
  28673. {
  28674. /* compression match types */
  28675. int matchNo = 0;
  28676. int matchZlib = 0;
  28677. while (b--) {
  28678. byte comp = input[i++];
  28679. if (comp == NO_COMPRESSION) {
  28680. matchNo = 1;
  28681. }
  28682. if (comp == ZLIB_COMPRESSION) {
  28683. matchZlib = 1;
  28684. }
  28685. }
  28686. if (ssl->options.usingCompression == 0 && matchNo) {
  28687. WOLFSSL_MSG("Matched No Compression");
  28688. } else if (ssl->options.usingCompression && matchZlib) {
  28689. WOLFSSL_MSG("Matched zlib Compression");
  28690. } else if (ssl->options.usingCompression && matchNo) {
  28691. WOLFSSL_MSG("Could only match no compression, turning off");
  28692. ssl->options.usingCompression = 0; /* turn off */
  28693. } else {
  28694. WOLFSSL_MSG("Could not match compression");
  28695. #ifdef WOLFSSL_EXTRA_ALERTS
  28696. SendAlert(ssl, alert_fatal, illegal_parameter);
  28697. #endif
  28698. ret = COMPRESSION_ERROR;
  28699. goto out;
  28700. }
  28701. }
  28702. *inOutIdx = i;
  28703. /* tls extensions */
  28704. if ((i - begin) < helloSz) {
  28705. #ifdef HAVE_TLS_EXTENSIONS
  28706. if (TLSX_SupportExtensions(ssl))
  28707. #else
  28708. if (IsAtLeastTLSv1_2(ssl))
  28709. #endif
  28710. {
  28711. /* Process the hello extension. Skip unsupported. */
  28712. word16 totalExtSz;
  28713. #ifdef HAVE_TLS_EXTENSIONS
  28714. /* auto populate extensions supported unless user defined */
  28715. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  28716. goto out;
  28717. #endif
  28718. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  28719. ret = BUFFER_ERROR;
  28720. goto out;
  28721. }
  28722. ato16(&input[i], &totalExtSz);
  28723. i += OPAQUE16_LEN;
  28724. if ((i - begin) + totalExtSz > helloSz) {
  28725. ret = BUFFER_ERROR;
  28726. goto out;
  28727. }
  28728. #ifdef HAVE_TLS_EXTENSIONS
  28729. /* tls extensions */
  28730. if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, client_hello,
  28731. &clSuites)))
  28732. goto out;
  28733. #ifdef WOLFSSL_TLS13
  28734. if (TLSX_Find(ssl->extensions,
  28735. TLSX_SUPPORTED_VERSIONS) != NULL) {
  28736. WOLFSSL_MSG(
  28737. "Client attempting to connect with higher version");
  28738. ret = VERSION_ERROR;
  28739. goto out;
  28740. }
  28741. #endif
  28742. #ifdef HAVE_SNI
  28743. if((ret=SNI_Callback(ssl)))
  28744. goto out;
  28745. #endif
  28746. i += totalExtSz;
  28747. #else
  28748. while (totalExtSz) {
  28749. word16 extId, extSz;
  28750. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
  28751. ret = BUFFER_ERROR;
  28752. goto out;
  28753. }
  28754. ato16(&input[i], &extId);
  28755. i += OPAQUE16_LEN;
  28756. ato16(&input[i], &extSz);
  28757. i += OPAQUE16_LEN;
  28758. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
  28759. ret = BUFFER_ERROR;
  28760. goto out;
  28761. }
  28762. if (extId == HELLO_EXT_SIG_ALGO) {
  28763. word16 hashSigAlgoSz;
  28764. ato16(&input[i], &hashSigAlgoSz);
  28765. i += OPAQUE16_LEN;
  28766. if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
  28767. ret = BUFFER_ERROR;
  28768. goto out;
  28769. }
  28770. if (hashSigAlgoSz % 2 != 0) {
  28771. ret = BUFFER_ERROR;
  28772. goto out;
  28773. }
  28774. clSuites.hashSigAlgoSz = hashSigAlgoSz;
  28775. if (clSuites.hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  28776. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  28777. "truncating");
  28778. clSuites.hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  28779. }
  28780. XMEMCPY(clSuites.hashSigAlgo, &input[i],
  28781. clSuites.hashSigAlgoSz);
  28782. i += hashSigAlgoSz;
  28783. }
  28784. #ifdef HAVE_EXTENDED_MASTER
  28785. else if (extId == HELLO_EXT_EXTMS)
  28786. ssl->options.haveEMS = 1;
  28787. #endif
  28788. else
  28789. i += extSz;
  28790. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  28791. }
  28792. #endif
  28793. *inOutIdx = i;
  28794. }
  28795. else
  28796. *inOutIdx = begin + helloSz; /* skip extensions */
  28797. }
  28798. #ifdef WOLFSSL_DTLS_CID
  28799. if (ssl->options.useDtlsCID)
  28800. DtlsCIDOnExtensionsParsed(ssl);
  28801. #endif /* WOLFSSL_DTLS_CID */
  28802. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  28803. ssl->options.haveSessionId = 1;
  28804. /* ProcessOld uses same resume code */
  28805. if (ssl->options.resuming) {
  28806. ret = HandleTlsResumption(ssl, bogusID, &clSuites);
  28807. if (ret != 0)
  28808. goto out;
  28809. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  28810. !defined(WOLFSSL_AEAD_ONLY)
  28811. if (ssl->options.encThenMac && ssl->specs.cipher_type == block) {
  28812. ret = TLSX_EncryptThenMac_Respond(ssl);
  28813. if (ret != 0)
  28814. goto out;
  28815. }
  28816. else
  28817. ssl->options.encThenMac = 0;
  28818. #endif
  28819. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  28820. WOLFSSL_LEAVE("DoClientHello", ret);
  28821. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  28822. goto out;
  28823. }
  28824. }
  28825. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_NO_HVR_ON_RESUME)
  28826. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  28827. if (!ssl->options.resuming) {
  28828. /* resume failed, check the cookie */
  28829. if (peerCookieSz != cookieSz ||
  28830. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  28831. *inOutIdx = begin + helloSz;
  28832. ret = SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  28833. goto out;
  28834. }
  28835. }
  28836. }
  28837. #endif /* WOLFSSL_DTLS && WOLFSSL_DTLS_NO_HVR_ON_RESUME */
  28838. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
  28839. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  28840. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  28841. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  28842. * present and no matches in the server's list. */
  28843. ret = TLSX_SupportedFFDHE_Set(ssl);
  28844. if (ret != 0)
  28845. goto out;
  28846. }
  28847. #endif
  28848. #endif
  28849. #ifdef OPENSSL_EXTRA
  28850. /* Give user last chance to provide a cert for cipher selection */
  28851. if (ret == 0 && ssl->ctx->certSetupCb != NULL)
  28852. ret = CertSetupCbWrapper(ssl);
  28853. #endif
  28854. if (ret == 0)
  28855. ret = MatchSuite(ssl, &clSuites);
  28856. #ifdef WOLFSSL_EXTRA_ALERTS
  28857. if (ret == BUFFER_ERROR)
  28858. SendAlert(ssl, alert_fatal, decode_error);
  28859. else if (ret < 0)
  28860. SendAlert(ssl, alert_fatal, handshake_failure);
  28861. #endif
  28862. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  28863. !defined(WOLFSSL_AEAD_ONLY)
  28864. if (ret == 0 && ssl->options.encThenMac &&
  28865. ssl->specs.cipher_type == block) {
  28866. ret = TLSX_EncryptThenMac_Respond(ssl);
  28867. }
  28868. else
  28869. ssl->options.encThenMac = 0;
  28870. #endif
  28871. #ifdef WOLFSSL_DTLS
  28872. if (ret == 0 && ssl->options.dtls)
  28873. DtlsMsgPoolReset(ssl);
  28874. #endif
  28875. out:
  28876. #ifdef WOLFSSL_DTLS
  28877. wc_HmacFree(&cookieHmac);
  28878. #endif
  28879. WOLFSSL_LEAVE("DoClientHello", ret);
  28880. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  28881. if (ret != 0) {
  28882. WOLFSSL_ERROR_VERBOSE(ret);
  28883. }
  28884. return ret;
  28885. }
  28886. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  28887. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  28888. typedef struct DcvArgs {
  28889. byte* output; /* not allocated */
  28890. word32 sendSz;
  28891. word16 sz;
  28892. word32 sigSz;
  28893. word32 idx;
  28894. word32 begin;
  28895. byte hashAlgo;
  28896. byte sigAlgo;
  28897. } DcvArgs;
  28898. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  28899. {
  28900. DcvArgs* args = (DcvArgs*)pArgs;
  28901. (void)ssl;
  28902. (void)args;
  28903. }
  28904. /* handle processing of certificate_verify (15) */
  28905. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  28906. word32* inOutIdx, word32 size)
  28907. {
  28908. int ret = 0;
  28909. #ifdef WOLFSSL_ASYNC_CRYPT
  28910. DcvArgs* args = NULL;
  28911. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  28912. #else
  28913. DcvArgs args[1];
  28914. #endif
  28915. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  28916. WOLFSSL_ENTER("DoCertificateVerify");
  28917. #ifdef WOLFSSL_ASYNC_CRYPT
  28918. if (ssl->async == NULL) {
  28919. ssl->async = (struct WOLFSSL_ASYNC*)
  28920. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  28921. DYNAMIC_TYPE_ASYNC);
  28922. if (ssl->async == NULL)
  28923. ERROR_OUT(MEMORY_E, exit_dcv);
  28924. }
  28925. args = (DcvArgs*)ssl->async->args;
  28926. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  28927. if (ret != WC_NOT_PENDING_E) {
  28928. /* Check for error */
  28929. if (ret < 0)
  28930. goto exit_dcv;
  28931. }
  28932. else
  28933. #endif
  28934. {
  28935. /* Reset state */
  28936. ret = 0;
  28937. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  28938. XMEMSET(args, 0, sizeof(DcvArgs));
  28939. args->hashAlgo = sha_mac;
  28940. args->sigAlgo = anonymous_sa_algo;
  28941. args->idx = *inOutIdx;
  28942. args->begin = *inOutIdx;
  28943. #ifdef WOLFSSL_ASYNC_CRYPT
  28944. ssl->async->freeArgs = FreeDcvArgs;
  28945. #endif
  28946. }
  28947. switch(ssl->options.asyncState)
  28948. {
  28949. case TLS_ASYNC_BEGIN:
  28950. {
  28951. #ifdef WOLFSSL_CALLBACKS
  28952. if (ssl->hsInfoOn)
  28953. AddPacketName(ssl, "CertificateVerify");
  28954. if (ssl->toInfoOn)
  28955. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  28956. #endif
  28957. /* Advance state and proceed */
  28958. ssl->options.asyncState = TLS_ASYNC_BUILD;
  28959. } /* case TLS_ASYNC_BEGIN */
  28960. FALL_THROUGH;
  28961. case TLS_ASYNC_BUILD:
  28962. {
  28963. if (IsAtLeastTLSv1_2(ssl)) {
  28964. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  28965. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  28966. }
  28967. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  28968. &args->sigAlgo);
  28969. args->idx += 2;
  28970. }
  28971. #ifndef NO_RSA
  28972. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  28973. args->sigAlgo = rsa_sa_algo;
  28974. #endif
  28975. #ifdef HAVE_ECC
  28976. else if (ssl->peerEccDsaKeyPresent)
  28977. args->sigAlgo = ecc_dsa_sa_algo;
  28978. #endif
  28979. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  28980. else if (ssl->peerEd25519KeyPresent)
  28981. args->sigAlgo = ed25519_sa_algo;
  28982. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  28983. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  28984. else if (ssl->peerEd448KeyPresent)
  28985. args->sigAlgo = ed448_sa_algo;
  28986. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  28987. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  28988. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  28989. }
  28990. ato16(input + args->idx, &args->sz);
  28991. args->idx += OPAQUE16_LEN;
  28992. if ((args->idx - args->begin) + args->sz > size ||
  28993. args->sz > ENCRYPT_LEN) {
  28994. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  28995. }
  28996. #ifdef HAVE_ECC
  28997. if (ssl->peerEccDsaKeyPresent) {
  28998. WOLFSSL_MSG("Doing ECC peer cert verify");
  28999. /* make sure a default is defined */
  29000. #if !defined(NO_SHA)
  29001. SetDigest(ssl, sha_mac);
  29002. #elif !defined(NO_SHA256)
  29003. SetDigest(ssl, sha256_mac);
  29004. #elif defined(WOLFSSL_SHA384)
  29005. SetDigest(ssl, sha384_mac);
  29006. #elif defined(WOLFSSL_SHA512)
  29007. SetDigest(ssl, sha512_mac);
  29008. #else
  29009. #error No digest enabled for ECC sig verify
  29010. #endif
  29011. if (IsAtLeastTLSv1_2(ssl)) {
  29012. if (args->sigAlgo != ecc_dsa_sa_algo) {
  29013. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  29014. }
  29015. SetDigest(ssl, args->hashAlgo);
  29016. }
  29017. }
  29018. #endif /* HAVE_ECC */
  29019. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  29020. if (ssl->peerEd25519KeyPresent) {
  29021. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  29022. if (IsAtLeastTLSv1_2(ssl) &&
  29023. args->sigAlgo != ed25519_sa_algo) {
  29024. WOLFSSL_MSG(
  29025. "Oops, peer sent ED25519 key but not in verify");
  29026. }
  29027. }
  29028. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  29029. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  29030. if (ssl->peerEd448KeyPresent) {
  29031. WOLFSSL_MSG("Doing ED448 peer cert verify");
  29032. if (IsAtLeastTLSv1_2(ssl) &&
  29033. args->sigAlgo != ed448_sa_algo) {
  29034. WOLFSSL_MSG(
  29035. "Oops, peer sent ED448 key but not in verify");
  29036. }
  29037. }
  29038. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  29039. /* Advance state and proceed */
  29040. ssl->options.asyncState = TLS_ASYNC_DO;
  29041. } /* case TLS_ASYNC_BUILD */
  29042. FALL_THROUGH;
  29043. case TLS_ASYNC_DO:
  29044. {
  29045. #ifndef NO_RSA
  29046. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  29047. WOLFSSL_MSG("Doing RSA peer cert verify");
  29048. ret = RsaVerify(ssl,
  29049. input + args->idx,
  29050. args->sz,
  29051. &args->output,
  29052. args->sigAlgo, args->hashAlgo,
  29053. ssl->peerRsaKey,
  29054. #ifdef HAVE_PK_CALLBACKS
  29055. &ssl->buffers.peerRsaKey
  29056. #else
  29057. NULL
  29058. #endif
  29059. );
  29060. if (ret >= 0) {
  29061. if (args->sigAlgo == rsa_sa_algo)
  29062. args->sendSz = ret;
  29063. else {
  29064. args->sigSz = ret;
  29065. args->sendSz = ssl->buffers.digest.length;
  29066. }
  29067. ret = 0;
  29068. }
  29069. }
  29070. #endif /* !NO_RSA */
  29071. #ifdef HAVE_ECC
  29072. if (ssl->peerEccDsaKeyPresent) {
  29073. WOLFSSL_MSG("Doing ECC peer cert verify");
  29074. ret = EccVerify(ssl,
  29075. input + args->idx, args->sz,
  29076. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  29077. ssl->peerEccDsaKey,
  29078. #ifdef HAVE_PK_CALLBACKS
  29079. &ssl->buffers.peerEccDsaKey
  29080. #else
  29081. NULL
  29082. #endif
  29083. );
  29084. /* SERVER: Data verified with certificate's public key. */
  29085. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  29086. (ret == 0);
  29087. }
  29088. #endif /* HAVE_ECC */
  29089. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  29090. if (ssl->peerEd25519KeyPresent) {
  29091. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  29092. ret = Ed25519Verify(ssl,
  29093. input + args->idx, args->sz,
  29094. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  29095. ssl->peerEd25519Key,
  29096. #ifdef HAVE_PK_CALLBACKS
  29097. &ssl->buffers.peerEd25519Key
  29098. #else
  29099. NULL
  29100. #endif
  29101. );
  29102. /* SERVER: Data verified with certificate's public key. */
  29103. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  29104. (ret == 0);
  29105. }
  29106. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  29107. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  29108. if (ssl->peerEd448KeyPresent) {
  29109. WOLFSSL_MSG("Doing Ed448 peer cert verify");
  29110. ret = Ed448Verify(ssl,
  29111. input + args->idx, args->sz,
  29112. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  29113. ssl->peerEd448Key,
  29114. #ifdef HAVE_PK_CALLBACKS
  29115. &ssl->buffers.peerEd448Key
  29116. #else
  29117. NULL
  29118. #endif
  29119. );
  29120. /* SERVER: Data verified with certificate's public key. */
  29121. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  29122. (ret == 0);
  29123. }
  29124. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  29125. #ifdef WOLFSSL_ASYNC_CRYPT
  29126. /* handle async pending */
  29127. if (ret == WC_PENDING_E)
  29128. goto exit_dcv;
  29129. #endif
  29130. /* Check for error */
  29131. if (ret != 0) {
  29132. ret = SIG_VERIFY_E;
  29133. goto exit_dcv;
  29134. }
  29135. /* Advance state and proceed */
  29136. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  29137. } /* case TLS_ASYNC_DO */
  29138. FALL_THROUGH;
  29139. case TLS_ASYNC_VERIFY:
  29140. {
  29141. #ifndef NO_RSA
  29142. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  29143. if (IsAtLeastTLSv1_2(ssl)) {
  29144. #ifdef WC_RSA_PSS
  29145. if (args->sigAlgo == rsa_pss_sa_algo) {
  29146. SetDigest(ssl, args->hashAlgo);
  29147. #ifdef HAVE_SELFTEST
  29148. ret = wc_RsaPSS_CheckPadding(
  29149. ssl->buffers.digest.buffer,
  29150. ssl->buffers.digest.length,
  29151. args->output, args->sigSz,
  29152. HashAlgoToType(args->hashAlgo));
  29153. #else
  29154. ret = wc_RsaPSS_CheckPadding_ex(
  29155. ssl->buffers.digest.buffer,
  29156. ssl->buffers.digest.length,
  29157. args->output, args->sigSz,
  29158. HashAlgoToType(args->hashAlgo), -1,
  29159. mp_count_bits(&ssl->peerRsaKey->n));
  29160. #endif
  29161. if (ret != 0) {
  29162. ret = SIG_VERIFY_E;
  29163. goto exit_dcv;
  29164. }
  29165. }
  29166. else
  29167. #endif
  29168. {
  29169. #ifndef WOLFSSL_SMALL_STACK
  29170. byte encodedSig[MAX_ENCODED_SIG_SZ];
  29171. #else
  29172. byte* encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  29173. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  29174. if (encodedSig == NULL) {
  29175. ERROR_OUT(MEMORY_E, exit_dcv);
  29176. }
  29177. #endif
  29178. if (args->sigAlgo != rsa_sa_algo) {
  29179. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  29180. "in verify");
  29181. }
  29182. SetDigest(ssl, args->hashAlgo);
  29183. args->sigSz = wc_EncodeSignature(encodedSig,
  29184. ssl->buffers.digest.buffer,
  29185. ssl->buffers.digest.length,
  29186. TypeHash(args->hashAlgo));
  29187. if (args->sendSz != args->sigSz || !args->output ||
  29188. XMEMCMP(args->output, encodedSig,
  29189. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  29190. ret = VERIFY_CERT_ERROR;
  29191. }
  29192. #ifdef WOLFSSL_SMALL_STACK
  29193. XFREE(encodedSig, ssl->heap,
  29194. DYNAMIC_TYPE_SIGNATURE);
  29195. #endif
  29196. }
  29197. }
  29198. else {
  29199. if (args->sendSz != FINISHED_SZ || !args->output ||
  29200. XMEMCMP(args->output,
  29201. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  29202. ret = VERIFY_CERT_ERROR;
  29203. }
  29204. }
  29205. if (ret == 0) {
  29206. /* SERVER: Data verified with cert's public key. */
  29207. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  29208. (ret == 0);
  29209. }
  29210. }
  29211. #endif /* !NO_RSA */
  29212. if (ret != 0)
  29213. break;
  29214. /* Advance state and proceed */
  29215. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  29216. } /* case TLS_ASYNC_VERIFY */
  29217. FALL_THROUGH;
  29218. case TLS_ASYNC_FINALIZE:
  29219. {
  29220. if (IsEncryptionOn(ssl, 0)) {
  29221. args->idx += ssl->keys.padSz;
  29222. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  29223. if (ssl->options.startedETMRead)
  29224. args->idx += MacSize(ssl);
  29225. #endif
  29226. }
  29227. ssl->options.havePeerVerify = 1;
  29228. /* Set final index */
  29229. args->idx += args->sz;
  29230. *inOutIdx = args->idx;
  29231. /* Advance state and proceed */
  29232. ssl->options.asyncState = TLS_ASYNC_END;
  29233. } /* case TLS_ASYNC_FINALIZE */
  29234. FALL_THROUGH;
  29235. case TLS_ASYNC_END:
  29236. {
  29237. break;
  29238. }
  29239. default:
  29240. ret = INPUT_CASE_ERROR;
  29241. } /* switch(ssl->options.asyncState) */
  29242. exit_dcv:
  29243. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  29244. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  29245. #ifdef WOLFSSL_ASYNC_CRYPT
  29246. /* Handle async operation */
  29247. if (ret == WC_PENDING_E) {
  29248. /* Mark message as not received so it can process again */
  29249. ssl->msgsReceived.got_certificate_verify = 0;
  29250. return ret;
  29251. }
  29252. #endif /* WOLFSSL_ASYNC_CRYPT */
  29253. #ifdef WOLFSSL_EXTRA_ALERTS
  29254. if (ret == BUFFER_ERROR)
  29255. SendAlert(ssl, alert_fatal, decode_error);
  29256. else if (ret == SIG_VERIFY_E)
  29257. SendAlert(ssl, alert_fatal, decrypt_error);
  29258. else if (ret != 0)
  29259. SendAlert(ssl, alert_fatal, bad_certificate);
  29260. #endif
  29261. /* Digest is not allocated, so do this to prevent free */
  29262. ssl->buffers.digest.buffer = NULL;
  29263. ssl->buffers.digest.length = 0;
  29264. #ifdef WOLFSSL_ASYNC_CRYPT
  29265. /* Cleanup async */
  29266. FreeAsyncCtx(ssl, 0);
  29267. #else
  29268. FreeDcvArgs(ssl, args);
  29269. #endif
  29270. /* Final cleanup */
  29271. FreeKeyExchange(ssl);
  29272. if (ret != 0) {
  29273. WOLFSSL_ERROR_VERBOSE(ret);
  29274. }
  29275. return ret;
  29276. }
  29277. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  29278. /* handle generation of server_hello_done (14) */
  29279. int SendServerHelloDone(WOLFSSL* ssl)
  29280. {
  29281. byte* output;
  29282. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  29283. int ret;
  29284. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  29285. WOLFSSL_ENTER("SendServerHelloDone");
  29286. #ifdef WOLFSSL_DTLS
  29287. if (ssl->options.dtls)
  29288. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29289. #endif
  29290. if (IsEncryptionOn(ssl, 1))
  29291. sendSz += MAX_MSG_EXTRA;
  29292. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  29293. * is not advanced yet */
  29294. ssl->options.buildingMsg = 1;
  29295. /* check for available size */
  29296. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  29297. return ret;
  29298. /* get output buffer */
  29299. output = ssl->buffers.outputBuffer.buffer +
  29300. ssl->buffers.outputBuffer.length;
  29301. AddHeaders(output, 0, server_hello_done, ssl);
  29302. if (IsEncryptionOn(ssl, 1)) {
  29303. byte* input;
  29304. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  29305. int recordHeaderSz = RECORD_HEADER_SZ;
  29306. if (ssl->options.dtls) {
  29307. recordHeaderSz += DTLS_RECORD_EXTRA;
  29308. inputSz += DTLS_HANDSHAKE_EXTRA;
  29309. }
  29310. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29311. if (input == NULL)
  29312. return MEMORY_E;
  29313. XMEMCPY(input, output + recordHeaderSz, inputSz);
  29314. #ifdef WOLFSSL_DTLS
  29315. if (IsDtlsNotSctpMode(ssl) &&
  29316. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
  29317. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29318. return ret;
  29319. }
  29320. #endif
  29321. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  29322. handshake, 1, 0, 0, CUR_ORDER);
  29323. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29324. if (sendSz < 0)
  29325. return sendSz;
  29326. } else {
  29327. #ifdef WOLFSSL_DTLS
  29328. if (IsDtlsNotSctpMode(ssl)) {
  29329. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
  29330. return ret;
  29331. }
  29332. if (ssl->options.dtls)
  29333. DtlsSEQIncrement(ssl, CUR_ORDER);
  29334. #endif
  29335. ret = HashOutput(ssl, output, sendSz, 0);
  29336. if (ret != 0)
  29337. return ret;
  29338. }
  29339. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  29340. if (ssl->hsInfoOn)
  29341. AddPacketName(ssl, "ServerHelloDone");
  29342. if (ssl->toInfoOn)
  29343. AddPacketInfo(ssl, "ServerHelloDone", handshake, output, sendSz,
  29344. WRITE_PROTO, ssl->heap);
  29345. #endif
  29346. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  29347. ssl->options.buildingMsg = 0;
  29348. ssl->buffers.outputBuffer.length += sendSz;
  29349. ret = SendBuffered(ssl);
  29350. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  29351. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  29352. return ret;
  29353. }
  29354. #endif /* !WOLFSSL_NO_TLS12 */
  29355. #ifdef HAVE_SESSION_TICKET
  29356. /* create a new session ticket, 0 on success */
  29357. int CreateTicket(WOLFSSL* ssl)
  29358. {
  29359. InternalTicket* it;
  29360. ExternalTicket* et;
  29361. int encLen;
  29362. int ret;
  29363. int error;
  29364. word32 itHash = 0;
  29365. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  29366. WOLFSSL_ASSERT_SIZEOF_GE(ssl->session->staticTicket, *et);
  29367. WOLFSSL_ASSERT_SIZEOF_GE(et->enc_ticket, *it);
  29368. if (ssl->session->ticket != ssl->session->staticTicket) {
  29369. /* Always use the static ticket buffer */
  29370. XFREE(ssl->session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK);
  29371. ssl->session->ticket = ssl->session->staticTicket;
  29372. ssl->session->ticketLenAlloc = 0;
  29373. }
  29374. et = (ExternalTicket*)ssl->session->ticket;
  29375. it = (InternalTicket*)et->enc_ticket;
  29376. XMEMSET(et, 0, sizeof(*et));
  29377. /* build internal */
  29378. it->pv.major = ssl->version.major;
  29379. it->pv.minor = ssl->version.minor;
  29380. it->suite[0] = ssl->options.cipherSuite0;
  29381. it->suite[1] = ssl->options.cipherSuite;
  29382. #ifdef WOLFSSL_EARLY_DATA
  29383. c32toa(ssl->options.maxEarlyDataSz, it->maxEarlyDataSz);
  29384. #endif
  29385. if (!ssl->options.tls1_3) {
  29386. XMEMCPY(it->msecret, ssl->arrays->masterSecret, SECRET_LEN);
  29387. #ifndef NO_ASN_TIME
  29388. c32toa(LowResTimer(), it->timestamp);
  29389. #endif
  29390. it->haveEMS = (byte) ssl->options.haveEMS;
  29391. }
  29392. else {
  29393. #ifdef WOLFSSL_TLS13
  29394. /* Client adds to ticket age to obfuscate. */
  29395. ret = wc_RNG_GenerateBlock(ssl->rng, it->ageAdd,
  29396. sizeof(it->ageAdd));
  29397. if (ret != 0) {
  29398. ret = BAD_TICKET_ENCRYPT;
  29399. goto error;
  29400. }
  29401. ato32(it->ageAdd, &ssl->session->ticketAdd);
  29402. c16toa(ssl->session->namedGroup, it->namedGroup);
  29403. c32toa(TimeNowInMilliseconds(), it->timestamp);
  29404. /* Resumption master secret. */
  29405. XMEMCPY(it->msecret, ssl->session->masterSecret, SECRET_LEN);
  29406. XMEMCPY(&it->ticketNonce, &ssl->session->ticketNonce,
  29407. sizeof(TicketNonce));
  29408. #endif
  29409. }
  29410. #ifdef WOLFSSL_TICKET_HAVE_ID
  29411. {
  29412. const byte* id = NULL;
  29413. byte idSz = 0;
  29414. if (ssl->session->haveAltSessionID) {
  29415. id = ssl->session->altSessionID;
  29416. idSz = ID_LEN;
  29417. }
  29418. else if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
  29419. id = ssl->arrays->sessionID;
  29420. idSz = ssl->arrays->sessionIDSz;
  29421. }
  29422. else {
  29423. id = ssl->session->sessionID;
  29424. idSz = ssl->session->sessionIDSz;
  29425. }
  29426. if (idSz == 0) {
  29427. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID,
  29428. ID_LEN);
  29429. if (ret != 0)
  29430. goto error;
  29431. ssl->session->haveAltSessionID = 1;
  29432. id = ssl->session->altSessionID;
  29433. idSz = ID_LEN;
  29434. }
  29435. /* make sure idSz is not larger than ID_LEN */
  29436. if (idSz > ID_LEN)
  29437. idSz = ID_LEN;
  29438. XMEMCPY(it->id, id, idSz);
  29439. }
  29440. #endif
  29441. /* encrypt */
  29442. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  29443. if (ssl->ctx->ticketEncCb == NULL
  29444. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  29445. ||
  29446. /* SSL_OP_NO_TICKET turns off tickets in < 1.2. Forces
  29447. * "stateful" tickets for 1.3 so just use the regular
  29448. * stateless ones. */
  29449. (!IsAtLeastTLSv1_3(ssl->version) &&
  29450. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  29451. #endif
  29452. ) {
  29453. /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
  29454. ret = BAD_TICKET_ENCRYPT;
  29455. }
  29456. else {
  29457. itHash = HashObject((byte*)it, sizeof(*it), &error);
  29458. if (error == 0) {
  29459. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac,
  29460. 1, et->enc_ticket, sizeof(InternalTicket), &encLen,
  29461. ssl->ctx->ticketEncCtx);
  29462. }
  29463. else {
  29464. ret = WOLFSSL_TICKET_RET_FATAL;
  29465. }
  29466. }
  29467. if (ret != WOLFSSL_TICKET_RET_OK) {
  29468. #ifdef WOLFSSL_ASYNC_CRYPT
  29469. if (ret == WC_PENDING_E) {
  29470. return ret;
  29471. }
  29472. #endif
  29473. goto error;
  29474. }
  29475. if (encLen < (int)sizeof(InternalTicket) ||
  29476. encLen > (int)WOLFSSL_TICKET_ENC_SZ) {
  29477. WOLFSSL_MSG("Bad user ticket encrypt size");
  29478. ret = BAD_TICKET_KEY_CB_SZ;
  29479. }
  29480. /* sanity checks on encrypt callback */
  29481. /* internal ticket can't be the same if encrypted */
  29482. if (itHash == HashObject((byte*)it, sizeof(*it), &error) || error != 0)
  29483. {
  29484. WOLFSSL_MSG("User ticket encrypt didn't encrypt or hash failed");
  29485. ret = BAD_TICKET_ENCRYPT;
  29486. goto error;
  29487. }
  29488. XMEMSET(zeros, 0, sizeof(zeros));
  29489. /* name */
  29490. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  29491. WOLFSSL_MSG("User ticket encrypt didn't set name");
  29492. ret = BAD_TICKET_ENCRYPT;
  29493. goto error;
  29494. }
  29495. /* iv */
  29496. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  29497. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  29498. ret = BAD_TICKET_ENCRYPT;
  29499. goto error;
  29500. }
  29501. /* mac */
  29502. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  29503. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  29504. ret = BAD_TICKET_ENCRYPT;
  29505. goto error;
  29506. }
  29507. /* set size */
  29508. c16toa((word16)encLen, et->enc_len);
  29509. if (encLen < (int)WOLFSSL_TICKET_ENC_SZ) {
  29510. /* move mac up since whole enc buffer not used */
  29511. XMEMMOVE(et->enc_ticket + encLen, et->mac,
  29512. WOLFSSL_TICKET_MAC_SZ);
  29513. }
  29514. ssl->session->ticketLen =
  29515. (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  29516. return ret;
  29517. error:
  29518. #ifdef WOLFSSL_CHECK_MEM_ZERO
  29519. /* Ticket has sensitive data in it now. */
  29520. wc_MemZero_Add("Create Ticket internal", it, sizeof(InternalTicket));
  29521. #endif
  29522. ForceZero(it, sizeof(*it));
  29523. #ifdef WOLFSSL_CHECK_MEM_ZERO
  29524. wc_MemZero_Check(it, sizeof(InternalTicket));
  29525. #endif
  29526. WOLFSSL_ERROR_VERBOSE(ret);
  29527. return ret;
  29528. }
  29529. /* Parse ticket sent by client, returns callback return value */
  29530. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  29531. {
  29532. ExternalTicket* et;
  29533. InternalTicket* it;
  29534. int ret;
  29535. int outLen;
  29536. word16 inLen;
  29537. WOLFSSL_START(WC_FUNC_TICKET_DO);
  29538. WOLFSSL_ENTER("DoClientTicket");
  29539. if (len > SESSION_TICKET_LEN ||
  29540. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  29541. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
  29542. return WOLFSSL_TICKET_RET_REJECT;
  29543. }
  29544. et = (ExternalTicket*)input;
  29545. /* decrypt */
  29546. ato16(et->enc_len, &inLen);
  29547. if (inLen > WOLFSSL_TICKET_ENC_SZ) {
  29548. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_MSG_SZ);
  29549. return WOLFSSL_TICKET_RET_REJECT;
  29550. }
  29551. outLen = (int)inLen; /* may be reduced by user padding */
  29552. if (ssl->ctx->ticketEncCb == NULL
  29553. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  29554. ||
  29555. /* SSL_OP_NO_TICKET turns off tickets in < 1.2. Forces
  29556. * "stateful" tickets for 1.3 so just use the regular
  29557. * stateless ones. */
  29558. (!IsAtLeastTLSv1_3(ssl->version) &&
  29559. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  29560. #endif
  29561. ) {
  29562. /* Use BAD_TICKET_ENCRYPT to signal missing ticket callback */
  29563. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_ENCRYPT);
  29564. ret = WOLFSSL_TICKET_RET_REJECT;
  29565. }
  29566. else {
  29567. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv,
  29568. et->enc_ticket + inLen, 0,
  29569. et->enc_ticket, inLen, &outLen,
  29570. ssl->ctx->ticketEncCtx);
  29571. }
  29572. if (ret != WOLFSSL_TICKET_RET_OK && ret != WOLFSSL_TICKET_RET_CREATE) {
  29573. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
  29574. return WOLFSSL_TICKET_RET_REJECT;
  29575. }
  29576. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  29577. WOLFSSL_MSG("Bad user ticket decrypt len");
  29578. WOLFSSL_ERROR_VERBOSE(BAD_TICKET_KEY_CB_SZ);
  29579. return BAD_TICKET_KEY_CB_SZ;
  29580. }
  29581. it = (InternalTicket*)et->enc_ticket;
  29582. #ifdef WOLFSSL_CHECK_MEM_ZERO
  29583. /* Internal ticket successfully decrypted. */
  29584. wc_MemZero_Add("Do Client Ticket internal", it, sizeof(InternalTicket));
  29585. #endif
  29586. /* get master secret */
  29587. if (ret == WOLFSSL_TICKET_RET_OK || ret == WOLFSSL_TICKET_RET_CREATE) {
  29588. if (ssl->version.minor < it->pv.minor) {
  29589. WOLFSSL_MSG("Ticket has greater version");
  29590. ret = VERSION_ERROR;
  29591. goto error;
  29592. }
  29593. else if (ssl->version.minor > it->pv.minor) {
  29594. if (IsAtLeastTLSv1_3(it->pv) != IsAtLeastTLSv1_3(ssl->version)) {
  29595. WOLFSSL_MSG("Tickets cannot be shared between "
  29596. "TLS 1.3 and TLS 1.2 and lower");
  29597. ret = VERSION_ERROR;
  29598. goto error;
  29599. }
  29600. if (!ssl->options.downgrade) {
  29601. WOLFSSL_MSG("Ticket has lesser version");
  29602. ret = VERSION_ERROR;
  29603. goto error;
  29604. }
  29605. WOLFSSL_MSG("Downgrading protocol due to ticket");
  29606. if (it->pv.minor < ssl->options.minDowngrade) {
  29607. WOLFSSL_MSG("Ticket has lesser version than allowed");
  29608. ret = VERSION_ERROR;
  29609. goto error;
  29610. }
  29611. ssl->version.minor = it->pv.minor;
  29612. }
  29613. #ifdef WOLFSSL_TICKET_HAVE_ID
  29614. {
  29615. ssl->session->haveAltSessionID = 1;
  29616. XMEMCPY(ssl->session->altSessionID, it->id, ID_LEN);
  29617. if (wolfSSL_GetSession(ssl, NULL, 1) != NULL) {
  29618. WOLFSSL_MSG("Found session matching the session id"
  29619. " found in the ticket");
  29620. }
  29621. else {
  29622. WOLFSSL_MSG("Can't find session matching the session id"
  29623. " found in the ticket");
  29624. }
  29625. }
  29626. #endif
  29627. if (!IsAtLeastTLSv1_3(ssl->version)) {
  29628. XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN);
  29629. /* Copy the haveExtendedMasterSecret property from the ticket to
  29630. * the saved session, so the property may be checked later. */
  29631. ssl->session->haveEMS = it->haveEMS;
  29632. ato32((const byte*)&it->timestamp, &ssl->session->bornOn);
  29633. #ifndef NO_RESUME_SUITE_CHECK
  29634. ssl->session->cipherSuite0 = it->suite[0];
  29635. ssl->session->cipherSuite = it->suite[1];
  29636. #endif
  29637. }
  29638. else {
  29639. #ifdef WOLFSSL_TLS13
  29640. /* Restore information to renegotiate. */
  29641. ato32(it->timestamp, &ssl->session->ticketSeen);
  29642. ato32(it->ageAdd, &ssl->session->ticketAdd);
  29643. ssl->session->cipherSuite0 = it->suite[0];
  29644. ssl->session->cipherSuite = it->suite[1];
  29645. #ifdef WOLFSSL_EARLY_DATA
  29646. ato32(it->maxEarlyDataSz, &ssl->session->maxEarlyDataSz);
  29647. #endif
  29648. /* Resumption master secret. */
  29649. XMEMCPY(ssl->session->masterSecret, it->msecret, SECRET_LEN);
  29650. XMEMCPY(&ssl->session->ticketNonce, &it->ticketNonce,
  29651. sizeof(TicketNonce));
  29652. ato16(it->namedGroup, &ssl->session->namedGroup);
  29653. #endif
  29654. }
  29655. }
  29656. ForceZero(it, sizeof(*it));
  29657. #ifdef WOLFSSL_CHECK_MEM_ZERO
  29658. wc_MemZero_Check(it, sizeof(InternalTicket));
  29659. #endif
  29660. WOLFSSL_LEAVE("DoClientTicket", ret);
  29661. WOLFSSL_END(WC_FUNC_TICKET_DO);
  29662. return ret;
  29663. error:
  29664. ForceZero(it, sizeof(*it));
  29665. #ifdef WOLFSSL_CHECK_MEM_ZERO
  29666. wc_MemZero_Check(it, sizeof(InternalTicket));
  29667. #endif
  29668. WOLFSSL_ERROR_VERBOSE(ret);
  29669. return WOLFSSL_TICKET_RET_REJECT;
  29670. }
  29671. /* send Session Ticket */
  29672. int SendTicket(WOLFSSL* ssl)
  29673. {
  29674. byte* output;
  29675. int ret;
  29676. int sendSz;
  29677. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  29678. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  29679. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  29680. WOLFSSL_ENTER("SendTicket");
  29681. if (ssl->options.createTicket) {
  29682. ret = CreateTicket(ssl);
  29683. if (ret != 0)
  29684. return ret;
  29685. }
  29686. length += ssl->session->ticketLen;
  29687. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  29688. if (!ssl->options.dtls) {
  29689. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  29690. sendSz += MAX_MSG_EXTRA;
  29691. }
  29692. else {
  29693. #ifdef WOLFSSL_DTLS
  29694. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29695. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  29696. #endif
  29697. }
  29698. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  29699. sendSz += cipherExtraData(ssl);
  29700. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  29701. * is not advanced yet */
  29702. ssl->options.buildingMsg = 1;
  29703. /* check for available size */
  29704. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  29705. return ret;
  29706. /* get output buffer */
  29707. output = ssl->buffers.outputBuffer.buffer +
  29708. ssl->buffers.outputBuffer.length;
  29709. AddHeaders(output, length, session_ticket, ssl);
  29710. /* hint */
  29711. c32toa(ssl->ctx->ticketHint, output + idx);
  29712. idx += SESSION_HINT_SZ;
  29713. /* length */
  29714. c16toa(ssl->session->ticketLen, output + idx);
  29715. idx += LENGTH_SZ;
  29716. /* ticket */
  29717. XMEMCPY(output + idx, ssl->session->ticket, ssl->session->ticketLen);
  29718. idx += ssl->session->ticketLen;
  29719. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  29720. byte* input;
  29721. int inputSz = idx; /* build msg adds rec hdr */
  29722. int recordHeaderSz = RECORD_HEADER_SZ;
  29723. if (ssl->options.dtls)
  29724. recordHeaderSz += DTLS_RECORD_EXTRA;
  29725. inputSz -= recordHeaderSz;
  29726. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29727. if (input == NULL)
  29728. return MEMORY_E;
  29729. XMEMCPY(input, output + recordHeaderSz, inputSz);
  29730. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  29731. handshake, 1, 0, 0, CUR_ORDER);
  29732. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  29733. if (sendSz < 0)
  29734. return sendSz;
  29735. }
  29736. else {
  29737. #ifdef WOLFSSL_DTLS
  29738. if (ssl->options.dtls) {
  29739. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
  29740. return ret;
  29741. DtlsSEQIncrement(ssl, CUR_ORDER);
  29742. }
  29743. #endif
  29744. ret = HashOutput(ssl, output, sendSz, 0);
  29745. if (ret != 0)
  29746. return ret;
  29747. }
  29748. ssl->buffers.outputBuffer.length += sendSz;
  29749. ssl->options.buildingMsg = 0;
  29750. if (!ssl->options.groupMessages)
  29751. ret = SendBuffered(ssl);
  29752. WOLFSSL_LEAVE("SendTicket", ret);
  29753. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  29754. return ret;
  29755. }
  29756. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  29757. /* Initialize the context for session ticket encryption.
  29758. *
  29759. * @param [in] ctx SSL context.
  29760. * @param [in] keyCtx Context for session ticket encryption.
  29761. * @return 0 on success.
  29762. * @return BAD_MUTEX_E when initializing mutex fails.
  29763. */
  29764. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
  29765. {
  29766. int ret = 0;
  29767. XMEMSET(keyCtx, 0, sizeof(*keyCtx));
  29768. keyCtx->ctx = ctx;
  29769. #ifdef WOLFSSL_CHECK_MEM_ZERO
  29770. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->name", keyCtx->name,
  29771. sizeof(keyCtx->name));
  29772. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[0]", keyCtx->key[0],
  29773. sizeof(keyCtx->key[0]));
  29774. wc_MemZero_Add("TicketEncCbCtx_Init keyCtx->key[1]", keyCtx->key[1],
  29775. sizeof(keyCtx->key[1]));
  29776. #endif
  29777. #ifndef SINGLE_THREADED
  29778. ret = wc_InitMutex(&keyCtx->mutex);
  29779. #endif
  29780. return ret;
  29781. }
  29782. /* Setup the session ticket encryption context for this.
  29783. *
  29784. * Initialize RNG, generate name, generate primary key and set primary key
  29785. * expirary.
  29786. *
  29787. * @param [in] keyCtx Context for session ticket encryption.
  29788. * @param [in] heap Dynamic memory allocation hint.
  29789. * @param [in] devId Device identifier.
  29790. * @return 0 on success.
  29791. * @return Other value when random number generator fails.
  29792. */
  29793. static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
  29794. {
  29795. int ret;
  29796. #ifndef SINGLE_THREADED
  29797. ret = 0;
  29798. /* Check that key wasn't set up while waiting. */
  29799. if (keyCtx->expirary[0] == 0)
  29800. #endif
  29801. {
  29802. ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
  29803. if (ret == 0) {
  29804. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
  29805. sizeof(keyCtx->name));
  29806. }
  29807. if (ret == 0) {
  29808. /* Mask of the bottom bit - used for index of key. */
  29809. keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
  29810. /* Generate initial primary key. */
  29811. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
  29812. WOLFSSL_TICKET_KEY_SZ);
  29813. }
  29814. if (ret == 0) {
  29815. keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
  29816. }
  29817. }
  29818. return ret;
  29819. }
  29820. /* Free the context for session ticket encryption.
  29821. *
  29822. * Zeroize keys and name.
  29823. *
  29824. * @param [in] keyCtx Context for session ticket encryption.
  29825. */
  29826. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
  29827. {
  29828. /* Zeroize sensitive data. */
  29829. ForceZero(keyCtx->name, sizeof(keyCtx->name));
  29830. ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
  29831. ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
  29832. #ifdef WOLFSSL_CHECK_MEM_ZERO
  29833. wc_MemZero_Check(keyCtx->name, sizeof(keyCtx->name));
  29834. wc_MemZero_Check(keyCtx->key[0], sizeof(keyCtx->key[0]));
  29835. wc_MemZero_Check(keyCtx->key[1], sizeof(keyCtx->key[1]));
  29836. #endif
  29837. #ifndef SINGLE_THREADED
  29838. wc_FreeMutex(&keyCtx->mutex);
  29839. #endif
  29840. wc_FreeRng(&keyCtx->rng);
  29841. }
  29842. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  29843. !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
  29844. !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
  29845. /* Ticket encryption/decryption implementation.
  29846. *
  29847. * @param [in] key Key for encryption/decryption.
  29848. * @param [in] keyLen Length of key in bytes.
  29849. * @param [in] iv IV/Nonce for encryption/decryption.
  29850. * @param [in] aad Additional authentication data.
  29851. * @param [in] aadSz Length of additional authentication data.
  29852. * @param [in] in Data to encrypt/decrypt.
  29853. * @param [in] inLen Length of encrypted data.
  29854. * @param [out] out Resulting data from encrypt/decrypt.
  29855. * @param [out] outLen Size of resulting data.
  29856. * @param [in] tag Authentication tag for encrypted data.
  29857. * @param [in] heap Dynamic memory allocation data hint.
  29858. * @param [in] enc 1 when encrypting, 0 when decrypting.
  29859. * @return 0 on success.
  29860. * @return Other value when encryption/decryption fails.
  29861. */
  29862. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  29863. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  29864. void* heap, int enc)
  29865. {
  29866. int ret;
  29867. (void)keyLen;
  29868. (void)heap;
  29869. if (enc) {
  29870. ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
  29871. tag);
  29872. }
  29873. else {
  29874. ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
  29875. out);
  29876. }
  29877. *outLen = inLen;
  29878. return ret;
  29879. }
  29880. #elif defined(HAVE_AESGCM)
  29881. /* Ticket encryption/decryption implementation.
  29882. *
  29883. * @param [in] key Key for encryption/decryption.
  29884. * @param [in] keyLen Length of key in bytes.
  29885. * @param [in] iv IV/Nonce for encryption/decryption.
  29886. * @param [in] aad Additional authentication data.
  29887. * @param [in] aadSz Length of additional authentication data.
  29888. * @param [in] in Data to encrypt/decrypt.
  29889. * @param [in] inLen Length of encrypted data.
  29890. * @param [out] out Resulting data from encrypt/decrypt.
  29891. * @param [out] outLen Size of resulting data.
  29892. * @param [in] tag Authentication tag for encrypted data.
  29893. * @param [in] heap Dynamic memory allocation data hint.
  29894. * @param [in] enc 1 when encrypting, 0 when decrypting.
  29895. * @return 0 on success.
  29896. * @return MEMORY_E when dynamic memory allocation fails.
  29897. * @return Other value when encryption/decryption fails.
  29898. */
  29899. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  29900. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  29901. void* heap, int enc)
  29902. {
  29903. int ret;
  29904. #ifdef WOLFSSL_SMALL_STACK
  29905. Aes* aes;
  29906. #else
  29907. Aes aes[1];
  29908. #endif
  29909. (void)heap;
  29910. #ifdef WOLFSSL_SMALL_STACK
  29911. aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
  29912. if (aes == NULL)
  29913. return MEMORY_E;
  29914. #endif
  29915. if (enc) {
  29916. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  29917. if (ret == 0) {
  29918. ret = wc_AesGcmSetKey(aes, key, keyLen);
  29919. }
  29920. if (ret == 0) {
  29921. ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  29922. tag, AES_BLOCK_SIZE, aad, aadSz);
  29923. }
  29924. wc_AesFree(aes);
  29925. }
  29926. else {
  29927. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  29928. if (ret == 0) {
  29929. ret = wc_AesGcmSetKey(aes, key, keyLen);
  29930. }
  29931. if (ret == 0) {
  29932. ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  29933. tag, AES_BLOCK_SIZE, aad, aadSz);
  29934. }
  29935. wc_AesFree(aes);
  29936. }
  29937. #ifdef WOLFSSL_SMALL_STACK
  29938. XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
  29939. #endif
  29940. *outLen = inLen;
  29941. return ret;
  29942. }
  29943. #else
  29944. #error "No encryption algorithm available for default ticket encryption."
  29945. #endif
  29946. /* Choose a key to use for encryption.
  29947. *
  29948. * Generate a new key if the current ones are expired.
  29949. * If the secondary key has not been used and the primary key has expired then
  29950. * generate a new primary key.
  29951. *
  29952. * @param [in] Ticket encryption callback context.
  29953. * @param [in] Session ticket lifetime.
  29954. * @param [out] Index of key to use for encryption.
  29955. * @return 0 on success.
  29956. * @return Other value when random number generation fails.
  29957. */
  29958. static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
  29959. int* keyIdx)
  29960. {
  29961. int ret = 0;
  29962. /* Get new current time as lock may have taken some time. */
  29963. word32 now = LowResTimer();
  29964. /* Check expirary of primary key for encrypt. */
  29965. if (keyCtx->expirary[0] >= now + ticketHint) {
  29966. *keyIdx = 0;
  29967. }
  29968. /* Check expirary of primary key for encrypt. */
  29969. else if (keyCtx->expirary[1] >= now + ticketHint) {
  29970. *keyIdx = 1;
  29971. }
  29972. /* No key available to use. */
  29973. else {
  29974. int genKey;
  29975. /* Generate which ever key is expired for decrypt - primary first. */
  29976. if (keyCtx->expirary[0] < now) {
  29977. genKey = 0;
  29978. }
  29979. else if (keyCtx->expirary[1] < now) {
  29980. genKey = 1;
  29981. }
  29982. /* Timeouts and expirary should not allow this to happen. */
  29983. else {
  29984. return BAD_STATE_E;
  29985. }
  29986. /* Generate the required key */
  29987. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
  29988. WOLFSSL_TICKET_KEY_SZ);
  29989. if (ret == 0) {
  29990. keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
  29991. *keyIdx = genKey;
  29992. }
  29993. }
  29994. return ret;
  29995. }
  29996. /* Default Session Ticket encryption/decryption callback.
  29997. *
  29998. * Use ChaCha20-Poly1305 or AES-GCM to encrypt/decrypt the ticket.
  29999. * Two keys are used:
  30000. * - When the first expires for encryption, then use the other.
  30001. * - Don't encrypt with key if the ticket lifetime will go beyond expirary.
  30002. * - Generate a new primary key when primary key expired for decrypt and
  30003. * no secondary key is activate for encryption.
  30004. * - Generate a new secondary key when expired and needed.
  30005. * - Calculate expirary starting from first encrypted ticket.
  30006. * - Key name has last bit set to indicate index of key.
  30007. * Keys expire for decryption after ticket key lifetime from the first encrypted
  30008. * ticket.
  30009. * Keys can only be use for encryption while the ticket hint does not exceed
  30010. * the key lifetime.
  30011. * Lifetime of a key must be greater than the lifetime of a ticket. This means
  30012. * that if one ticket is only valid for decryption, then the other will be
  30013. * valid for encryption.
  30014. * AAD = key_name | iv | ticket len (16-bits network order)
  30015. *
  30016. * @param [in] ssl SSL connection.
  30017. * @param [in,out] key_name Name of key from client.
  30018. * Encrypt: name of key returned.
  30019. * Decrypt: name from ticket message to check.
  30020. * @param [in] iv IV to use in encryption/decryption.
  30021. * @param [in] mac MAC for authentication of encrypted data.
  30022. * @param [in] enc 1 when encrypting ticket, 0 when decrypting.
  30023. * @param [in,out] ticket Encrypted/decrypted session ticket bytes.
  30024. * @param [in] inLen Length of incoming ticket.
  30025. * @param [out] outLen Length of outgoing ticket.
  30026. * @param [in] userCtx Context for encryption/decryption of ticket.
  30027. * @return WOLFSSL_TICKET_RET_OK when successful.
  30028. * @return WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
  30029. * be created for TLS 1.2 and below.
  30030. * @return WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
  30031. * decrypted ticket.
  30032. * @return WOLFSSL_TICKET_RET_FATAL when key name does not match.
  30033. */
  30034. static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
  30035. byte iv[WOLFSSL_TICKET_IV_SZ],
  30036. byte mac[WOLFSSL_TICKET_MAC_SZ],
  30037. int enc, byte* ticket, int inLen, int* outLen,
  30038. void* userCtx)
  30039. {
  30040. int ret;
  30041. TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
  30042. WOLFSSL_CTX* ctx = keyCtx->ctx;
  30043. word16 sLen = XHTONS((word16)inLen);
  30044. byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
  30045. int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
  30046. byte* p = aad;
  30047. int keyIdx = 0;
  30048. WOLFSSL_ENTER("DefTicketEncCb");
  30049. /* Check we have setup the RNG, name and primary key. */
  30050. if (keyCtx->expirary[0] == 0) {
  30051. #ifndef SINGLE_THREADED
  30052. /* Lock around access to expirary and key - stop initial key being
  30053. * generated twice at the same time. */
  30054. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  30055. WOLFSSL_MSG("Couldn't lock key context mutex");
  30056. return WOLFSSL_TICKET_RET_REJECT;
  30057. }
  30058. #endif
  30059. /* Sets expirary of primary key in setup. */
  30060. ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
  30061. #ifndef SINGLE_THREADED
  30062. wc_UnLockMutex(&keyCtx->mutex);
  30063. #endif
  30064. if (ret != 0)
  30065. return ret;
  30066. }
  30067. if (enc) {
  30068. /* Return the name of the key - missing key index. */
  30069. XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  30070. /* Generate a new IV into buffer to be returned.
  30071. * Don't use the RNG in keyCtx as it's for generating private data. */
  30072. ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
  30073. if (ret != 0) {
  30074. return WOLFSSL_TICKET_RET_REJECT;
  30075. }
  30076. }
  30077. else {
  30078. /* Mask of last bit that is the key index. */
  30079. byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
  30080. /* For decryption, see if we know this key - check all but last byte. */
  30081. if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
  30082. return WOLFSSL_TICKET_RET_FATAL;
  30083. }
  30084. /* Ensure last byte without index bit matches too. */
  30085. if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
  30086. return WOLFSSL_TICKET_RET_FATAL;
  30087. }
  30088. }
  30089. /* Build AAD from: key name, iv, and length of ticket. */
  30090. XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  30091. p += WOLFSSL_TICKET_NAME_SZ;
  30092. XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
  30093. p += WOLFSSL_TICKET_IV_SZ;
  30094. XMEMCPY(p, &sLen, sizeof(sLen));
  30095. /* Encrypt ticket. */
  30096. if (enc) {
  30097. word32 now;
  30098. now = LowResTimer();
  30099. /* As long as encryption expirary isn't imminent - no lock. */
  30100. if (keyCtx->expirary[0] > now + ctx->ticketHint) {
  30101. keyIdx = 0;
  30102. }
  30103. else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
  30104. keyIdx = 1;
  30105. }
  30106. else {
  30107. #ifndef SINGLE_THREADED
  30108. /* Lock around access to expirary and key - stop key being generated
  30109. * twice at the same time. */
  30110. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  30111. WOLFSSL_MSG("Couldn't lock key context mutex");
  30112. return WOLFSSL_TICKET_RET_REJECT;
  30113. }
  30114. #endif
  30115. ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
  30116. #ifndef SINGLE_THREADED
  30117. wc_UnLockMutex(&keyCtx->mutex);
  30118. #endif
  30119. if (ret != 0) {
  30120. return WOLFSSL_TICKET_RET_REJECT;
  30121. }
  30122. }
  30123. /* Set the name of the key to the index chosen. */
  30124. key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  30125. /* Update AAD too. */
  30126. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  30127. /* Encrypt ticket data. */
  30128. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  30129. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  30130. 1);
  30131. if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
  30132. }
  30133. /* Decrypt ticket. */
  30134. else {
  30135. /* Get index of key from name. */
  30136. keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
  30137. /* Update AAD with index. */
  30138. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  30139. /* Check expirary */
  30140. if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
  30141. return WOLFSSL_TICKET_RET_REJECT;
  30142. }
  30143. /* Decrypt ticket data. */
  30144. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  30145. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  30146. 0);
  30147. if (ret != 0) {
  30148. return WOLFSSL_TICKET_RET_REJECT;
  30149. }
  30150. }
  30151. #ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
  30152. if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
  30153. return WOLFSSL_TICKET_RET_CREATE;
  30154. #endif
  30155. return WOLFSSL_TICKET_RET_OK;
  30156. }
  30157. #endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
  30158. #endif /* HAVE_SESSION_TICKET */
  30159. #ifndef WOLFSSL_NO_TLS12
  30160. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  30161. !defined(NO_WOLFSSL_SERVER)
  30162. /* handle generation of server's hello_request (0) */
  30163. int SendHelloRequest(WOLFSSL* ssl)
  30164. {
  30165. byte* output;
  30166. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  30167. int ret;
  30168. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  30169. WOLFSSL_ENTER("SendHelloRequest");
  30170. if (IsEncryptionOn(ssl, 1))
  30171. sendSz += MAX_MSG_EXTRA;
  30172. if (ssl->options.dtls)
  30173. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  30174. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  30175. * is not advanced yet */
  30176. ssl->options.buildingMsg = 1;
  30177. /* check for available size */
  30178. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  30179. return ret;
  30180. /* get output buffer */
  30181. output = ssl->buffers.outputBuffer.buffer +
  30182. ssl->buffers.outputBuffer.length;
  30183. AddHeaders(output, 0, hello_request, ssl);
  30184. if (IsEncryptionOn(ssl, 1)) {
  30185. byte* input;
  30186. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  30187. int recordHeaderSz = RECORD_HEADER_SZ;
  30188. if (ssl->options.dtls) {
  30189. recordHeaderSz += DTLS_RECORD_EXTRA;
  30190. inputSz += DTLS_HANDSHAKE_EXTRA;
  30191. }
  30192. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30193. if (input == NULL)
  30194. return MEMORY_E;
  30195. XMEMCPY(input, output + recordHeaderSz, inputSz);
  30196. #ifdef WOLFSSL_DTLS
  30197. if (IsDtlsNotSctpMode(ssl) &&
  30198. (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
  30199. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30200. return ret;
  30201. }
  30202. #endif
  30203. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  30204. handshake, 0, 0, 0, CUR_ORDER);
  30205. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30206. if (sendSz < 0)
  30207. return sendSz;
  30208. }
  30209. ssl->buffers.outputBuffer.length += sendSz;
  30210. ssl->options.buildingMsg = 0;
  30211. ret = SendBuffered(ssl);
  30212. WOLFSSL_LEAVE("SendHelloRequest", ret);
  30213. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  30214. return ret;
  30215. }
  30216. #endif /* HAVE_SECURE_RENEGOTIATION && !NO_WOLFSSL_SERVER */
  30217. #ifdef WOLFSSL_DTLS
  30218. /* handle generation of DTLS hello_verify_request (3) */
  30219. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  30220. const byte* cookie, byte cookieSz)
  30221. {
  30222. byte* output;
  30223. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  30224. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  30225. int sendSz = length + idx;
  30226. int ret;
  30227. /* are we in scr */
  30228. if (IsEncryptionOn(ssl, 1)) {
  30229. sendSz += MAX_MSG_EXTRA;
  30230. }
  30231. /* reset states */
  30232. ssl->msgsReceived.got_client_hello = 0;
  30233. ssl->keys.dtls_handshake_number = 0;
  30234. ssl->keys.dtls_expected_peer_handshake_number = 0;
  30235. ssl->options.clientState = 0;
  30236. ret = InitHandshakeHashes(ssl);
  30237. if (ret != 0)
  30238. return ret;
  30239. /* check for available size */
  30240. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  30241. return ret;
  30242. /* get output buffer */
  30243. output = ssl->buffers.outputBuffer.buffer +
  30244. ssl->buffers.outputBuffer.length;
  30245. /* Hello Verify Request should use the same sequence number
  30246. * as the Client Hello unless we are in renegotiation then
  30247. * don't change numbers */
  30248. #ifdef HAVE_SECURE_RENEGOTIATION
  30249. if (!IsSCR(ssl))
  30250. #endif
  30251. {
  30252. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  30253. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  30254. }
  30255. AddHeaders(output, length, hello_verify_request, ssl);
  30256. #ifdef OPENSSL_EXTRA
  30257. output[idx++] = DTLS_MAJOR;
  30258. output[idx++] = DTLS_MINOR;
  30259. #else
  30260. output[idx++] = ssl->version.major;
  30261. output[idx++] = ssl->version.minor;
  30262. #endif
  30263. output[idx++] = cookieSz;
  30264. if (cookie == NULL || cookieSz == 0)
  30265. return COOKIE_ERROR;
  30266. XMEMCPY(output + idx, cookie, cookieSz);
  30267. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  30268. if (ssl->hsInfoOn)
  30269. AddPacketName(ssl, "HelloVerifyRequest");
  30270. if (ssl->toInfoOn)
  30271. AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  30272. sendSz, WRITE_PROTO, ssl->heap);
  30273. #endif
  30274. /* are we in scr */
  30275. if (IsEncryptionOn(ssl, 1)) {
  30276. byte* input;
  30277. int inputSz = DTLS_HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
  30278. int recordHeaderSz = DTLS_RECORD_HEADER_SZ;
  30279. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30280. if (input == NULL)
  30281. return MEMORY_E;
  30282. XMEMCPY(input, output + recordHeaderSz, inputSz);
  30283. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  30284. handshake, 0, 0, 0, CUR_ORDER);
  30285. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  30286. if (sendSz < 0)
  30287. return sendSz;
  30288. }
  30289. ssl->buffers.outputBuffer.length += sendSz;
  30290. DtlsSEQIncrement(ssl, CUR_ORDER);
  30291. return SendBuffered(ssl);
  30292. }
  30293. #endif /* WOLFSSL_DTLS */
  30294. typedef struct DckeArgs {
  30295. byte* output; /* not allocated */
  30296. word32 length;
  30297. word32 idx;
  30298. word32 begin;
  30299. word32 sigSz;
  30300. #ifndef NO_RSA
  30301. int lastErr;
  30302. #endif
  30303. } DckeArgs;
  30304. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  30305. {
  30306. DckeArgs* args = (DckeArgs*)pArgs;
  30307. (void)ssl;
  30308. (void)args;
  30309. }
  30310. /* handle processing client_key_exchange (16) */
  30311. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  30312. word32 size)
  30313. {
  30314. int ret;
  30315. #ifdef WOLFSSL_ASYNC_CRYPT
  30316. DckeArgs* args = NULL;
  30317. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  30318. #else
  30319. DckeArgs args[1];
  30320. #endif
  30321. (void)size;
  30322. (void)input;
  30323. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  30324. WOLFSSL_ENTER("DoClientKeyExchange");
  30325. #ifdef WOLFSSL_ASYNC_CRYPT
  30326. if (ssl->async == NULL) {
  30327. ssl->async = (struct WOLFSSL_ASYNC*)
  30328. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  30329. DYNAMIC_TYPE_ASYNC);
  30330. if (ssl->async == NULL)
  30331. ERROR_OUT(MEMORY_E, exit_dcke);
  30332. }
  30333. args = (DckeArgs*)ssl->async->args;
  30334. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  30335. if (ret != WC_NOT_PENDING_E) {
  30336. /* Check for error */
  30337. if (ret < 0)
  30338. goto exit_dcke;
  30339. }
  30340. else
  30341. #endif /* WOLFSSL_ASYNC_CRYPT */
  30342. {
  30343. /* Reset state */
  30344. ret = 0;
  30345. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  30346. XMEMSET(args, 0, sizeof(DckeArgs));
  30347. args->idx = *inOutIdx;
  30348. args->begin = *inOutIdx;
  30349. #ifdef WOLFSSL_ASYNC_CRYPT
  30350. ssl->async->freeArgs = FreeDckeArgs;
  30351. #endif
  30352. }
  30353. /* Do Client Key Exchange State Machine */
  30354. switch(ssl->options.asyncState)
  30355. {
  30356. case TLS_ASYNC_BEGIN:
  30357. {
  30358. /* Sanity checks */
  30359. /* server side checked in SanityCheckMsgReceived */
  30360. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  30361. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  30362. SendAlert(ssl, alert_fatal, unexpected_message);
  30363. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  30364. }
  30365. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  30366. if (ssl->options.verifyPeer &&
  30367. (ssl->options.mutualAuth || ssl->options.failNoCert)) {
  30368. if (!ssl->options.havePeerCert) {
  30369. WOLFSSL_MSG("client didn't present peer cert");
  30370. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  30371. }
  30372. }
  30373. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  30374. if (!ssl->options.havePeerCert &&
  30375. !ssl->options.usingPSK_cipher) {
  30376. WOLFSSL_MSG("client didn't present peer cert");
  30377. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  30378. }
  30379. }
  30380. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  30381. #if defined(WOLFSSL_CALLBACKS)
  30382. if (ssl->hsInfoOn) {
  30383. AddPacketName(ssl, "ClientKeyExchange");
  30384. }
  30385. if (ssl->toInfoOn) {
  30386. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  30387. }
  30388. #endif
  30389. if (ssl->arrays->preMasterSecret == NULL) {
  30390. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  30391. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  30392. ssl->heap, DYNAMIC_TYPE_SECRET);
  30393. if (ssl->arrays->preMasterSecret == NULL) {
  30394. ERROR_OUT(MEMORY_E, exit_dcke);
  30395. }
  30396. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  30397. }
  30398. switch (ssl->specs.kea) {
  30399. #ifndef NO_RSA
  30400. case rsa_kea:
  30401. {
  30402. break;
  30403. } /* rsa_kea */
  30404. #endif /* !NO_RSA */
  30405. #ifndef NO_PSK
  30406. case psk_kea:
  30407. {
  30408. /* sanity check that PSK server callback has been set */
  30409. if (ssl->options.server_psk_cb == NULL) {
  30410. WOLFSSL_MSG("No server PSK callback set");
  30411. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  30412. }
  30413. break;
  30414. }
  30415. #endif /* !NO_PSK */
  30416. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  30417. defined(HAVE_CURVE448)
  30418. case ecc_diffie_hellman_kea:
  30419. {
  30420. break;
  30421. }
  30422. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  30423. #ifndef NO_DH
  30424. case diffie_hellman_kea:
  30425. {
  30426. break;
  30427. }
  30428. #endif /* !NO_DH */
  30429. #if !defined(NO_DH) && !defined(NO_PSK)
  30430. case dhe_psk_kea:
  30431. {
  30432. /* sanity check that PSK server callback has been set */
  30433. if (ssl->options.server_psk_cb == NULL) {
  30434. WOLFSSL_MSG("No server PSK callback set");
  30435. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  30436. }
  30437. break;
  30438. }
  30439. #endif /* !NO_DH && !NO_PSK */
  30440. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  30441. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  30442. case ecdhe_psk_kea:
  30443. {
  30444. /* sanity check that PSK server callback has been set */
  30445. if (ssl->options.server_psk_cb == NULL) {
  30446. WOLFSSL_MSG("No server PSK callback set");
  30447. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  30448. }
  30449. break;
  30450. }
  30451. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  30452. default:
  30453. WOLFSSL_MSG("Bad kea type");
  30454. ret = BAD_KEA_TYPE_E;
  30455. } /* switch (ssl->specs.kea) */
  30456. /* Check for error */
  30457. if (ret != 0) {
  30458. goto exit_dcke;
  30459. }
  30460. /* Advance state and proceed */
  30461. ssl->options.asyncState = TLS_ASYNC_BUILD;
  30462. } /* TLS_ASYNC_BEGIN */
  30463. FALL_THROUGH;
  30464. case TLS_ASYNC_BUILD:
  30465. {
  30466. switch (ssl->specs.kea) {
  30467. #ifndef NO_RSA
  30468. case rsa_kea:
  30469. {
  30470. word16 keySz;
  30471. ssl->buffers.keyType = rsa_sa_algo;
  30472. ret = DecodePrivateKey(ssl, &keySz);
  30473. if (ret != 0) {
  30474. goto exit_dcke;
  30475. }
  30476. args->length = (word32)keySz;
  30477. ssl->arrays->preMasterSz = SECRET_LEN;
  30478. if (ssl->options.tls) {
  30479. word16 check;
  30480. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  30481. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30482. }
  30483. ato16(input + args->idx, &check);
  30484. args->idx += OPAQUE16_LEN;
  30485. if ((word32)check != args->length) {
  30486. WOLFSSL_MSG("RSA explicit size doesn't match");
  30487. #ifdef WOLFSSL_EXTRA_ALERTS
  30488. SendAlert(ssl, alert_fatal, bad_record_mac);
  30489. #endif
  30490. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  30491. }
  30492. }
  30493. if ((args->idx - args->begin) + args->length > size) {
  30494. WOLFSSL_MSG("RSA message too big");
  30495. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30496. }
  30497. /* pre-load PreMasterSecret with RNG data */
  30498. ret = wc_RNG_GenerateBlock(ssl->rng,
  30499. &ssl->arrays->preMasterSecret[VERSION_SZ],
  30500. SECRET_LEN - VERSION_SZ);
  30501. if (ret != 0) {
  30502. goto exit_dcke;
  30503. }
  30504. args->output = NULL;
  30505. break;
  30506. } /* rsa_kea */
  30507. #endif /* !NO_RSA */
  30508. #ifndef NO_PSK
  30509. case psk_kea:
  30510. {
  30511. byte* pms = ssl->arrays->preMasterSecret;
  30512. word16 ci_sz;
  30513. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  30514. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30515. }
  30516. ato16(input + args->idx, &ci_sz);
  30517. args->idx += OPAQUE16_LEN;
  30518. if (ci_sz > MAX_PSK_ID_LEN) {
  30519. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  30520. }
  30521. if ((args->idx - args->begin) + ci_sz > size) {
  30522. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30523. }
  30524. XMEMCPY(ssl->arrays->client_identity,
  30525. input + args->idx, ci_sz);
  30526. args->idx += ci_sz;
  30527. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  30528. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  30529. ssl->arrays->client_identity, ssl->arrays->psk_key,
  30530. MAX_PSK_KEY_LEN);
  30531. if (ssl->arrays->psk_keySz == 0 ||
  30532. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  30533. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  30534. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  30535. SendAlert(ssl, alert_fatal,
  30536. unknown_psk_identity);
  30537. #endif
  30538. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  30539. }
  30540. /* SERVER: Pre-shared Key for peer authentication. */
  30541. ssl->options.peerAuthGood = 1;
  30542. /* make psk pre master secret */
  30543. /* length of key + length 0s + length of key + key */
  30544. c16toa((word16) ssl->arrays->psk_keySz, pms);
  30545. pms += OPAQUE16_LEN;
  30546. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  30547. pms += ssl->arrays->psk_keySz;
  30548. c16toa((word16) ssl->arrays->psk_keySz, pms);
  30549. pms += OPAQUE16_LEN;
  30550. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  30551. ssl->arrays->preMasterSz =
  30552. (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
  30553. break;
  30554. }
  30555. #endif /* !NO_PSK */
  30556. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  30557. defined(HAVE_CURVE448)
  30558. case ecc_diffie_hellman_kea:
  30559. {
  30560. #ifdef HAVE_ECC
  30561. ecc_key* private_key = ssl->eccTempKey;
  30562. /* handle static private key */
  30563. if (ssl->specs.static_ecdh &&
  30564. ssl->ecdhCurveOID != ECC_X25519_OID &&
  30565. ssl->ecdhCurveOID != ECC_X448_OID) {
  30566. word16 keySz;
  30567. ssl->buffers.keyType = ecc_dsa_sa_algo;
  30568. ret = DecodePrivateKey(ssl, &keySz);
  30569. if (ret != 0) {
  30570. goto exit_dcke;
  30571. }
  30572. private_key = (ecc_key*)ssl->hsKey;
  30573. }
  30574. #endif
  30575. /* import peer ECC key */
  30576. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  30577. #ifdef WOLFSSL_EXTRA_ALERTS
  30578. SendAlert(ssl, alert_fatal, decode_error);
  30579. #endif
  30580. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30581. }
  30582. args->length = input[args->idx++];
  30583. if ((args->idx - args->begin) + args->length > size) {
  30584. #ifdef WOLFSSL_EXTRA_ALERTS
  30585. SendAlert(ssl, alert_fatal, decode_error);
  30586. #endif
  30587. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30588. }
  30589. #ifdef HAVE_CURVE25519
  30590. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  30591. #ifdef HAVE_PK_CALLBACKS
  30592. /* if callback then use it for shared secret */
  30593. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  30594. break;
  30595. }
  30596. #endif
  30597. if (ssl->peerX25519Key == NULL) {
  30598. /* alloc/init on demand */
  30599. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  30600. (void**)&ssl->peerX25519Key);
  30601. if (ret != 0) {
  30602. goto exit_dcke;
  30603. }
  30604. } else if (ssl->peerX25519KeyPresent) {
  30605. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  30606. ssl->peerX25519Key);
  30607. ssl->peerX25519KeyPresent = 0;
  30608. if (ret != 0) {
  30609. goto exit_dcke;
  30610. }
  30611. }
  30612. if ((ret = wc_curve25519_check_public(
  30613. input + args->idx, args->length,
  30614. EC25519_LITTLE_ENDIAN)) != 0) {
  30615. #ifdef WOLFSSL_EXTRA_ALERTS
  30616. if (ret == BUFFER_E)
  30617. SendAlert(ssl, alert_fatal, decode_error);
  30618. else if (ret == ECC_OUT_OF_RANGE_E)
  30619. SendAlert(ssl, alert_fatal, bad_record_mac);
  30620. else {
  30621. SendAlert(ssl, alert_fatal,
  30622. illegal_parameter);
  30623. }
  30624. #endif
  30625. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  30626. }
  30627. if (wc_curve25519_import_public_ex(
  30628. input + args->idx, args->length,
  30629. ssl->peerX25519Key,
  30630. EC25519_LITTLE_ENDIAN)) {
  30631. #ifdef WOLFSSL_EXTRA_ALERTS
  30632. SendAlert(ssl, alert_fatal, illegal_parameter);
  30633. #endif
  30634. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  30635. }
  30636. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  30637. ssl->peerX25519KeyPresent = 1;
  30638. break;
  30639. }
  30640. #endif
  30641. #ifdef HAVE_CURVE448
  30642. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  30643. #ifdef HAVE_PK_CALLBACKS
  30644. /* if callback then use it for shared secret */
  30645. if (ssl->ctx->X448SharedSecretCb != NULL) {
  30646. break;
  30647. }
  30648. #endif
  30649. if (ssl->peerX448Key == NULL) {
  30650. /* alloc/init on demand */
  30651. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  30652. (void**)&ssl->peerX448Key);
  30653. if (ret != 0) {
  30654. goto exit_dcke;
  30655. }
  30656. } else if (ssl->peerX448KeyPresent) {
  30657. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  30658. ssl->peerX448Key);
  30659. ssl->peerX448KeyPresent = 0;
  30660. if (ret != 0) {
  30661. goto exit_dcke;
  30662. }
  30663. }
  30664. if ((ret = wc_curve448_check_public(
  30665. input + args->idx, args->length,
  30666. EC448_LITTLE_ENDIAN)) != 0) {
  30667. #ifdef WOLFSSL_EXTRA_ALERTS
  30668. if (ret == BUFFER_E)
  30669. SendAlert(ssl, alert_fatal, decode_error);
  30670. else if (ret == ECC_OUT_OF_RANGE_E)
  30671. SendAlert(ssl, alert_fatal, bad_record_mac);
  30672. else {
  30673. SendAlert(ssl, alert_fatal,
  30674. illegal_parameter);
  30675. }
  30676. #endif
  30677. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  30678. }
  30679. if (wc_curve448_import_public_ex(
  30680. input + args->idx, args->length,
  30681. ssl->peerX448Key,
  30682. EC448_LITTLE_ENDIAN)) {
  30683. #ifdef WOLFSSL_EXTRA_ALERTS
  30684. SendAlert(ssl, alert_fatal, illegal_parameter);
  30685. #endif
  30686. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  30687. }
  30688. ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
  30689. ssl->peerX448KeyPresent = 1;
  30690. break;
  30691. }
  30692. #endif
  30693. #ifdef HAVE_ECC
  30694. #ifdef HAVE_PK_CALLBACKS
  30695. /* if callback then use it for shared secret */
  30696. if (ssl->ctx->EccSharedSecretCb != NULL) {
  30697. break;
  30698. }
  30699. #endif
  30700. if (!ssl->specs.static_ecdh &&
  30701. ssl->eccTempKeyPresent == 0) {
  30702. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  30703. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  30704. }
  30705. if (ssl->peerEccKey == NULL) {
  30706. /* alloc/init on demand */
  30707. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  30708. (void**)&ssl->peerEccKey);
  30709. if (ret != 0) {
  30710. goto exit_dcke;
  30711. }
  30712. } else if (ssl->peerEccKeyPresent) {
  30713. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  30714. ssl->peerEccKey);
  30715. ssl->peerEccKeyPresent = 0;
  30716. if (ret != 0) {
  30717. goto exit_dcke;
  30718. }
  30719. }
  30720. if (wc_ecc_import_x963_ex(input + args->idx,
  30721. args->length, ssl->peerEccKey,
  30722. private_key->dp->id)) {
  30723. #ifdef WOLFSSL_EXTRA_ALERTS
  30724. SendAlert(ssl, alert_fatal, illegal_parameter);
  30725. #endif
  30726. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  30727. }
  30728. ssl->arrays->preMasterSz = private_key->dp->size;
  30729. ssl->peerEccKeyPresent = 1;
  30730. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  30731. /* client_hello may have sent FFEDH2048, which sets namedGroup,
  30732. but that is not being used, so clear it */
  30733. /* resolves issue with server side wolfSSL_get_curve_name */
  30734. ssl->namedGroup = 0;
  30735. #endif
  30736. #endif /* HAVE_ECC */
  30737. break;
  30738. }
  30739. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  30740. #ifndef NO_DH
  30741. case diffie_hellman_kea:
  30742. {
  30743. word16 clientPubSz;
  30744. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  30745. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30746. }
  30747. ato16(input + args->idx, &clientPubSz);
  30748. args->idx += OPAQUE16_LEN;
  30749. if ((args->idx - args->begin) + clientPubSz > size) {
  30750. #ifdef WOLFSSL_EXTRA_ALERTS
  30751. SendAlert(ssl, alert_fatal, decode_error);
  30752. #endif
  30753. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30754. }
  30755. args->sigSz = clientPubSz;
  30756. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  30757. (void**)&ssl->buffers.serverDH_Key);
  30758. if (ret != 0) {
  30759. goto exit_dcke;
  30760. }
  30761. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  30762. ssl->buffers.serverDH_P.buffer,
  30763. ssl->buffers.serverDH_P.length,
  30764. ssl->buffers.serverDH_G.buffer,
  30765. ssl->buffers.serverDH_G.length);
  30766. /* set the max agree result size */
  30767. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  30768. break;
  30769. }
  30770. #endif /* !NO_DH */
  30771. #if !defined(NO_DH) && !defined(NO_PSK)
  30772. case dhe_psk_kea:
  30773. {
  30774. word16 clientSz;
  30775. /* Read in the PSK hint */
  30776. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  30777. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30778. }
  30779. ato16(input + args->idx, &clientSz);
  30780. args->idx += OPAQUE16_LEN;
  30781. if (clientSz > MAX_PSK_ID_LEN) {
  30782. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  30783. }
  30784. if ((args->idx - args->begin) + clientSz > size) {
  30785. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30786. }
  30787. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  30788. clientSz);
  30789. args->idx += clientSz;
  30790. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  30791. /* Read in the DHE business */
  30792. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  30793. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30794. }
  30795. ato16(input + args->idx, &clientSz);
  30796. args->idx += OPAQUE16_LEN;
  30797. if ((args->idx - args->begin) + clientSz > size) {
  30798. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30799. }
  30800. args->sigSz = clientSz;
  30801. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  30802. (void**)&ssl->buffers.serverDH_Key);
  30803. if (ret != 0) {
  30804. goto exit_dcke;
  30805. }
  30806. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  30807. ssl->buffers.serverDH_P.buffer,
  30808. ssl->buffers.serverDH_P.length,
  30809. ssl->buffers.serverDH_G.buffer,
  30810. ssl->buffers.serverDH_G.length);
  30811. break;
  30812. }
  30813. #endif /* !NO_DH && !NO_PSK */
  30814. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  30815. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  30816. case ecdhe_psk_kea:
  30817. {
  30818. word16 clientSz;
  30819. /* Read in the PSK hint */
  30820. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  30821. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30822. }
  30823. ato16(input + args->idx, &clientSz);
  30824. args->idx += OPAQUE16_LEN;
  30825. if (clientSz > MAX_PSK_ID_LEN) {
  30826. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  30827. }
  30828. if ((args->idx - args->begin) + clientSz > size) {
  30829. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30830. }
  30831. XMEMCPY(ssl->arrays->client_identity,
  30832. input + args->idx, clientSz);
  30833. args->idx += clientSz;
  30834. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  30835. /* import peer ECC key */
  30836. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  30837. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30838. }
  30839. args->length = input[args->idx++];
  30840. if ((args->idx - args->begin) + args->length > size) {
  30841. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  30842. }
  30843. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  30844. #ifdef HAVE_CURVE25519
  30845. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  30846. #ifdef HAVE_PK_CALLBACKS
  30847. /* if callback then use it for shared secret */
  30848. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  30849. break;
  30850. }
  30851. #endif
  30852. if (ssl->eccTempKeyPresent == 0) {
  30853. WOLFSSL_MSG(
  30854. "X25519 ephemeral key not made correctly");
  30855. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  30856. }
  30857. if (ssl->peerX25519Key == NULL) {
  30858. /* alloc/init on demand */
  30859. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  30860. (void**)&ssl->peerX25519Key);
  30861. if (ret != 0) {
  30862. goto exit_dcke;
  30863. }
  30864. } else if (ssl->peerX25519KeyPresent) {
  30865. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  30866. ssl->peerX25519Key);
  30867. ssl->peerX25519KeyPresent = 0;
  30868. if (ret != 0) {
  30869. goto exit_dcke;
  30870. }
  30871. }
  30872. if ((ret = wc_curve25519_check_public(
  30873. input + args->idx, args->length,
  30874. EC25519_LITTLE_ENDIAN)) != 0) {
  30875. #ifdef WOLFSSL_EXTRA_ALERTS
  30876. if (ret == BUFFER_E)
  30877. SendAlert(ssl, alert_fatal, decode_error);
  30878. else if (ret == ECC_OUT_OF_RANGE_E)
  30879. SendAlert(ssl, alert_fatal, bad_record_mac);
  30880. else {
  30881. SendAlert(ssl, alert_fatal,
  30882. illegal_parameter);
  30883. }
  30884. #endif
  30885. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  30886. }
  30887. if (wc_curve25519_import_public_ex(
  30888. input + args->idx, args->length,
  30889. ssl->peerX25519Key,
  30890. EC25519_LITTLE_ENDIAN)) {
  30891. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  30892. }
  30893. ssl->peerX25519KeyPresent = 1;
  30894. break;
  30895. }
  30896. #endif
  30897. #ifdef HAVE_CURVE448
  30898. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  30899. #ifdef HAVE_PK_CALLBACKS
  30900. /* if callback then use it for shared secret */
  30901. if (ssl->ctx->X448SharedSecretCb != NULL) {
  30902. break;
  30903. }
  30904. #endif
  30905. if (ssl->eccTempKeyPresent == 0) {
  30906. WOLFSSL_MSG(
  30907. "X448 ephemeral key not made correctly");
  30908. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  30909. }
  30910. if (ssl->peerX448Key == NULL) {
  30911. /* alloc/init on demand */
  30912. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  30913. (void**)&ssl->peerX448Key);
  30914. if (ret != 0) {
  30915. goto exit_dcke;
  30916. }
  30917. } else if (ssl->peerX448KeyPresent) {
  30918. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  30919. ssl->peerX448Key);
  30920. ssl->peerX448KeyPresent = 0;
  30921. if (ret != 0) {
  30922. goto exit_dcke;
  30923. }
  30924. }
  30925. if ((ret = wc_curve448_check_public(
  30926. input + args->idx, args->length,
  30927. EC448_LITTLE_ENDIAN)) != 0) {
  30928. #ifdef WOLFSSL_EXTRA_ALERTS
  30929. if (ret == BUFFER_E)
  30930. SendAlert(ssl, alert_fatal, decode_error);
  30931. else if (ret == ECC_OUT_OF_RANGE_E)
  30932. SendAlert(ssl, alert_fatal, bad_record_mac);
  30933. else {
  30934. SendAlert(ssl, alert_fatal,
  30935. illegal_parameter);
  30936. }
  30937. #endif
  30938. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  30939. }
  30940. if (wc_curve448_import_public_ex(
  30941. input + args->idx, args->length,
  30942. ssl->peerX448Key,
  30943. EC448_LITTLE_ENDIAN)) {
  30944. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  30945. }
  30946. ssl->peerX448KeyPresent = 1;
  30947. break;
  30948. }
  30949. #endif
  30950. #ifdef HAVE_PK_CALLBACKS
  30951. /* if callback then use it for shared secret */
  30952. if (ssl->ctx->EccSharedSecretCb != NULL) {
  30953. break;
  30954. }
  30955. #endif
  30956. if (ssl->eccTempKeyPresent == 0) {
  30957. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  30958. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  30959. }
  30960. if (ssl->peerEccKey == NULL) {
  30961. /* alloc/init on demand */
  30962. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  30963. (void**)&ssl->peerEccKey);
  30964. if (ret != 0) {
  30965. goto exit_dcke;
  30966. }
  30967. }
  30968. else if (ssl->peerEccKeyPresent) {
  30969. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  30970. ssl->peerEccKey);
  30971. ssl->peerEccKeyPresent = 0;
  30972. if (ret != 0) {
  30973. goto exit_dcke;
  30974. }
  30975. }
  30976. if (wc_ecc_import_x963_ex(input + args->idx,
  30977. args->length, ssl->peerEccKey,
  30978. ssl->eccTempKey->dp->id)) {
  30979. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  30980. }
  30981. ssl->peerEccKeyPresent = 1;
  30982. break;
  30983. }
  30984. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  30985. default:
  30986. ret = BAD_KEA_TYPE_E;
  30987. } /* switch (ssl->specs.kea) */
  30988. /* Check for error */
  30989. if (ret != 0) {
  30990. goto exit_dcke;
  30991. }
  30992. /* Advance state and proceed */
  30993. ssl->options.asyncState = TLS_ASYNC_DO;
  30994. } /* TLS_ASYNC_BUILD */
  30995. FALL_THROUGH;
  30996. case TLS_ASYNC_DO:
  30997. {
  30998. switch (ssl->specs.kea) {
  30999. #ifndef NO_RSA
  31000. case rsa_kea:
  31001. {
  31002. RsaKey* key = (RsaKey*)ssl->hsKey;
  31003. ret = RsaDec(ssl,
  31004. input + args->idx,
  31005. args->length,
  31006. &args->output,
  31007. &args->sigSz,
  31008. key,
  31009. #ifdef HAVE_PK_CALLBACKS
  31010. ssl->buffers.key
  31011. #else
  31012. NULL
  31013. #endif
  31014. );
  31015. /* Errors that can occur here that should be
  31016. * indistinguishable:
  31017. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  31018. */
  31019. #ifdef WOLFSSL_ASYNC_CRYPT
  31020. if (ret == WC_PENDING_E)
  31021. goto exit_dcke;
  31022. #endif
  31023. if (ret == BAD_FUNC_ARG)
  31024. goto exit_dcke;
  31025. args->lastErr = ret - (SECRET_LEN - args->sigSz);
  31026. ret = 0;
  31027. break;
  31028. } /* rsa_kea */
  31029. #endif /* !NO_RSA */
  31030. #ifndef NO_PSK
  31031. case psk_kea:
  31032. {
  31033. break;
  31034. }
  31035. #endif /* !NO_PSK */
  31036. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31037. defined(HAVE_CURVE448)
  31038. case ecc_diffie_hellman_kea:
  31039. {
  31040. void* private_key = ssl->eccTempKey;
  31041. (void)private_key;
  31042. #ifdef HAVE_CURVE25519
  31043. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  31044. ret = X25519SharedSecret(ssl,
  31045. (curve25519_key*)private_key,
  31046. ssl->peerX25519Key,
  31047. input + args->idx, &args->length,
  31048. ssl->arrays->preMasterSecret,
  31049. &ssl->arrays->preMasterSz,
  31050. WOLFSSL_SERVER_END
  31051. );
  31052. break;
  31053. }
  31054. #endif
  31055. #ifdef HAVE_CURVE448
  31056. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  31057. ret = X448SharedSecret(ssl,
  31058. (curve448_key*)private_key,
  31059. ssl->peerX448Key,
  31060. input + args->idx, &args->length,
  31061. ssl->arrays->preMasterSecret,
  31062. &ssl->arrays->preMasterSz,
  31063. WOLFSSL_SERVER_END
  31064. );
  31065. break;
  31066. }
  31067. #endif
  31068. #ifdef HAVE_ECC
  31069. if (ssl->specs.static_ecdh) {
  31070. private_key = ssl->hsKey;
  31071. }
  31072. /* Generate shared secret */
  31073. ret = EccSharedSecret(ssl,
  31074. (ecc_key*)private_key, ssl->peerEccKey,
  31075. input + args->idx, &args->length,
  31076. ssl->arrays->preMasterSecret,
  31077. &ssl->arrays->preMasterSz,
  31078. WOLFSSL_SERVER_END
  31079. );
  31080. #ifdef WOLFSSL_ASYNC_CRYPT
  31081. if (ret != WC_PENDING_E)
  31082. #endif
  31083. {
  31084. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  31085. (void**)&ssl->peerEccKey);
  31086. ssl->peerEccKeyPresent = 0;
  31087. }
  31088. #endif
  31089. break;
  31090. }
  31091. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  31092. #ifndef NO_DH
  31093. case diffie_hellman_kea:
  31094. {
  31095. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  31096. ssl->buffers.serverDH_Priv.buffer,
  31097. ssl->buffers.serverDH_Priv.length,
  31098. input + args->idx,
  31099. (word16)args->sigSz,
  31100. ssl->arrays->preMasterSecret,
  31101. &ssl->arrays->preMasterSz,
  31102. ssl->buffers.serverDH_P.buffer,
  31103. ssl->buffers.serverDH_P.length);
  31104. break;
  31105. }
  31106. #endif /* !NO_DH */
  31107. #if !defined(NO_DH) && !defined(NO_PSK)
  31108. case dhe_psk_kea:
  31109. {
  31110. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  31111. ssl->buffers.serverDH_Priv.buffer,
  31112. ssl->buffers.serverDH_Priv.length,
  31113. input + args->idx,
  31114. (word16)args->sigSz,
  31115. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  31116. &ssl->arrays->preMasterSz,
  31117. ssl->buffers.serverDH_P.buffer,
  31118. ssl->buffers.serverDH_P.length);
  31119. break;
  31120. }
  31121. #endif /* !NO_DH && !NO_PSK */
  31122. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31123. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  31124. case ecdhe_psk_kea:
  31125. {
  31126. #ifdef HAVE_CURVE25519
  31127. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  31128. ret = X25519SharedSecret(ssl,
  31129. (curve25519_key*)ssl->eccTempKey,
  31130. ssl->peerX25519Key,
  31131. input + args->idx, &args->length,
  31132. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  31133. &args->sigSz,
  31134. WOLFSSL_SERVER_END
  31135. );
  31136. #ifdef WOLFSSL_ASYNC_CRYPT
  31137. if (ret != WC_PENDING_E)
  31138. #endif
  31139. {
  31140. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  31141. (void**)&ssl->peerX25519Key);
  31142. ssl->peerX25519KeyPresent = 0;
  31143. }
  31144. break;
  31145. }
  31146. #endif
  31147. #ifdef HAVE_CURVE448
  31148. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  31149. ret = X448SharedSecret(ssl,
  31150. (curve448_key*)ssl->eccTempKey,
  31151. ssl->peerX448Key,
  31152. input + args->idx, &args->length,
  31153. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  31154. &args->sigSz,
  31155. WOLFSSL_SERVER_END
  31156. );
  31157. #ifdef WOLFSSL_ASYNC_CRYPT
  31158. if (ret != WC_PENDING_E)
  31159. #endif
  31160. {
  31161. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  31162. (void**)&ssl->peerX448Key);
  31163. ssl->peerX448KeyPresent = 0;
  31164. }
  31165. break;
  31166. }
  31167. #endif
  31168. /* Generate shared secret */
  31169. ret = EccSharedSecret(ssl,
  31170. ssl->eccTempKey, ssl->peerEccKey,
  31171. input + args->idx, &args->length,
  31172. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  31173. &args->sigSz,
  31174. WOLFSSL_SERVER_END
  31175. );
  31176. if (!ssl->specs.static_ecdh
  31177. #ifdef WOLFSSL_ASYNC_CRYPT
  31178. && ret != WC_PENDING_E
  31179. #endif
  31180. ) {
  31181. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  31182. (void**)&ssl->peerEccKey);
  31183. ssl->peerEccKeyPresent = 0;
  31184. }
  31185. break;
  31186. }
  31187. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  31188. default:
  31189. ret = BAD_KEA_TYPE_E;
  31190. } /* switch (ssl->specs.kea) */
  31191. /* Check for error */
  31192. if (ret != 0) {
  31193. goto exit_dcke;
  31194. }
  31195. /* Advance state and proceed */
  31196. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  31197. } /* TLS_ASYNC_DO */
  31198. FALL_THROUGH;
  31199. case TLS_ASYNC_VERIFY:
  31200. {
  31201. switch (ssl->specs.kea) {
  31202. #ifndef NO_RSA
  31203. case rsa_kea:
  31204. {
  31205. byte *tmpRsa;
  31206. byte mask;
  31207. int i;
  31208. /* Add the signature length to idx */
  31209. args->idx += args->length;
  31210. #ifdef DEBUG_WOLFSSL
  31211. /* check version (debug warning message only) */
  31212. if (args->output != NULL) {
  31213. if (args->output[0] != ssl->chVersion.major ||
  31214. args->output[1] != ssl->chVersion.minor) {
  31215. WOLFSSL_MSG("preMasterSecret version mismatch");
  31216. }
  31217. }
  31218. #endif
  31219. /* RFC5246 7.4.7.1:
  31220. * Treat incorrectly formatted message blocks and/or
  31221. * mismatched version numbers in a manner
  31222. * indistinguishable from correctly formatted RSA blocks
  31223. */
  31224. ret = args->lastErr;
  31225. args->lastErr = 0; /* reset */
  31226. /* On error 'ret' will be negative */
  31227. mask = ((unsigned int)ret >>
  31228. ((sizeof(ret) * 8) - 1)) - 1;
  31229. /* build PreMasterSecret */
  31230. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  31231. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  31232. tmpRsa = input + args->idx - VERSION_SZ - SECRET_LEN;
  31233. ctMaskCopy(~mask, (byte*)&args->output, (byte*)&tmpRsa,
  31234. sizeof(args->output));
  31235. if (args->output != NULL) {
  31236. /* Use random secret on error */
  31237. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  31238. ssl->arrays->preMasterSecret[i] =
  31239. ctMaskSel(mask, args->output[i],
  31240. ssl->arrays->preMasterSecret[i]);
  31241. }
  31242. }
  31243. /* preMasterSecret has RNG and version set
  31244. * return proper length and ignore error
  31245. * error will be caught as decryption error
  31246. */
  31247. args->sigSz = SECRET_LEN;
  31248. ret = 0;
  31249. break;
  31250. } /* rsa_kea */
  31251. #endif /* !NO_RSA */
  31252. #ifndef NO_PSK
  31253. case psk_kea:
  31254. {
  31255. break;
  31256. }
  31257. #endif /* !NO_PSK */
  31258. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31259. defined(HAVE_CURVE448)
  31260. case ecc_diffie_hellman_kea:
  31261. {
  31262. /* skip past the imported peer key */
  31263. args->idx += args->length;
  31264. break;
  31265. }
  31266. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  31267. #ifndef NO_DH
  31268. case diffie_hellman_kea:
  31269. {
  31270. args->idx += (word16)args->sigSz;
  31271. break;
  31272. }
  31273. #endif /* !NO_DH */
  31274. #if !defined(NO_DH) && !defined(NO_PSK)
  31275. case dhe_psk_kea:
  31276. {
  31277. byte* pms = ssl->arrays->preMasterSecret;
  31278. word16 clientSz = (word16)args->sigSz;
  31279. args->idx += clientSz;
  31280. c16toa((word16)ssl->arrays->preMasterSz, pms);
  31281. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  31282. pms += ssl->arrays->preMasterSz;
  31283. /* Use the PSK hint to look up the PSK and add it to the
  31284. * preMasterSecret here. */
  31285. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  31286. ssl->arrays->client_identity, ssl->arrays->psk_key,
  31287. MAX_PSK_KEY_LEN);
  31288. if (ssl->arrays->psk_keySz == 0 ||
  31289. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  31290. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  31291. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  31292. SendAlert(ssl, alert_fatal,
  31293. unknown_psk_identity);
  31294. #endif
  31295. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31296. }
  31297. /* SERVER: Pre-shared Key for peer authentication. */
  31298. ssl->options.peerAuthGood = 1;
  31299. c16toa((word16) ssl->arrays->psk_keySz, pms);
  31300. pms += OPAQUE16_LEN;
  31301. XMEMCPY(pms, ssl->arrays->psk_key,
  31302. ssl->arrays->psk_keySz);
  31303. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
  31304. OPAQUE16_LEN;
  31305. break;
  31306. }
  31307. #endif /* !NO_DH && !NO_PSK */
  31308. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  31309. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  31310. case ecdhe_psk_kea:
  31311. {
  31312. byte* pms = ssl->arrays->preMasterSecret;
  31313. word16 clientSz = (word16)args->sigSz;
  31314. /* skip past the imported peer key */
  31315. args->idx += args->length;
  31316. /* Add preMasterSecret */
  31317. c16toa(clientSz, pms);
  31318. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  31319. pms += ssl->arrays->preMasterSz;
  31320. /* Use the PSK hint to look up the PSK and add it to the
  31321. * preMasterSecret here. */
  31322. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  31323. ssl->arrays->client_identity, ssl->arrays->psk_key,
  31324. MAX_PSK_KEY_LEN);
  31325. if (ssl->arrays->psk_keySz == 0 ||
  31326. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  31327. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  31328. }
  31329. /* SERVER: Pre-shared Key for peer authentication. */
  31330. ssl->options.peerAuthGood = 1;
  31331. c16toa((word16) ssl->arrays->psk_keySz, pms);
  31332. pms += OPAQUE16_LEN;
  31333. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  31334. ssl->arrays->preMasterSz +=
  31335. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  31336. break;
  31337. }
  31338. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  31339. default:
  31340. ret = BAD_KEA_TYPE_E;
  31341. } /* switch (ssl->specs.kea) */
  31342. /* Check for error */
  31343. if (ret != 0) {
  31344. goto exit_dcke;
  31345. }
  31346. /* Advance state and proceed */
  31347. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  31348. } /* TLS_ASYNC_VERIFY */
  31349. FALL_THROUGH;
  31350. case TLS_ASYNC_FINALIZE:
  31351. {
  31352. if (IsEncryptionOn(ssl, 0)) {
  31353. args->idx += ssl->keys.padSz;
  31354. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  31355. if (ssl->options.startedETMRead)
  31356. args->idx += MacSize(ssl);
  31357. #endif
  31358. }
  31359. ret = MakeMasterSecret(ssl);
  31360. /* Check for error */
  31361. if (ret != 0) {
  31362. goto exit_dcke;
  31363. }
  31364. /* Advance state and proceed */
  31365. ssl->options.asyncState = TLS_ASYNC_END;
  31366. } /* TLS_ASYNC_FINALIZE */
  31367. FALL_THROUGH;
  31368. case TLS_ASYNC_END:
  31369. {
  31370. /* Set final index */
  31371. *inOutIdx = args->idx;
  31372. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  31373. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  31374. if (ssl->options.verifyPeer) {
  31375. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  31376. }
  31377. #endif
  31378. break;
  31379. } /* TLS_ASYNC_END */
  31380. default:
  31381. ret = INPUT_CASE_ERROR;
  31382. } /* switch(ssl->options.asyncState) */
  31383. exit_dcke:
  31384. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  31385. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  31386. #ifdef WOLFSSL_ASYNC_CRYPT
  31387. /* Handle async operation */
  31388. if (ret == WC_PENDING_E) {
  31389. /* Mark message as not received so it can process again */
  31390. ssl->msgsReceived.got_client_key_exchange = 0;
  31391. return ret;
  31392. }
  31393. /* Cleanup async */
  31394. FreeAsyncCtx(ssl, 0);
  31395. #else
  31396. FreeDckeArgs(ssl, args);
  31397. #endif /* WOLFSSL_ASYNC_CRYPT */
  31398. #ifdef OPENSSL_ALL
  31399. /* add error ret value to error queue */
  31400. if (ret != 0) {
  31401. WOLFSSL_ERROR(ret);
  31402. }
  31403. #endif
  31404. /* Cleanup PMS */
  31405. if (ssl->arrays->preMasterSecret != NULL) {
  31406. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  31407. }
  31408. ssl->arrays->preMasterSz = 0;
  31409. /* Final cleanup */
  31410. FreeKeyExchange(ssl);
  31411. return ret;
  31412. }
  31413. #endif /* !WOLFSSL_NO_TLS12 */
  31414. #ifdef HAVE_SNI
  31415. int SNI_Callback(WOLFSSL* ssl)
  31416. {
  31417. int ad = 0;
  31418. int sniRet = 0;
  31419. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  31420. * when SNI is received. Call it now if exists */
  31421. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  31422. WOLFSSL_MSG("Calling custom sni callback");
  31423. sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg);
  31424. switch (sniRet) {
  31425. case warning_return:
  31426. WOLFSSL_MSG("Error in custom sni callback. Warning alert");
  31427. SendAlert(ssl, alert_warning, ad);
  31428. break;
  31429. case fatal_return:
  31430. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  31431. SendAlert(ssl, alert_fatal, ad);
  31432. return FATAL_ERROR;
  31433. case noack_return:
  31434. WOLFSSL_MSG("Server quietly not acking servername.");
  31435. break;
  31436. default:
  31437. break;
  31438. }
  31439. }
  31440. return 0;
  31441. }
  31442. #endif /* HAVE_SNI */
  31443. #endif /* NO_WOLFSSL_SERVER */
  31444. #ifdef WOLFSSL_ASYNC_CRYPT
  31445. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  31446. {
  31447. int ret = 0;
  31448. WC_ASYNC_DEV* asyncDev;
  31449. WOLF_EVENT* event;
  31450. if (ssl == NULL) {
  31451. return BAD_FUNC_ARG;
  31452. }
  31453. /* check for pending async */
  31454. asyncDev = ssl->asyncDev;
  31455. if (asyncDev) {
  31456. /* grab event pointer */
  31457. event = &asyncDev->event;
  31458. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  31459. if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) {
  31460. /* advance key share state if doesn't need called again */
  31461. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  31462. (*state)++;
  31463. }
  31464. /* clear event */
  31465. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  31466. /* clear async dev */
  31467. ssl->asyncDev = NULL;
  31468. }
  31469. }
  31470. else {
  31471. ret = WC_NOT_PENDING_E;
  31472. }
  31473. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  31474. return ret;
  31475. }
  31476. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  31477. {
  31478. int ret;
  31479. WOLF_EVENT* event;
  31480. if (ssl == NULL || asyncDev == NULL) {
  31481. return BAD_FUNC_ARG;
  31482. }
  31483. /* grab event pointer */
  31484. event = &asyncDev->event;
  31485. /* init event */
  31486. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  31487. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  31488. return ret;
  31489. }
  31490. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  31491. {
  31492. int ret;
  31493. WOLF_EVENT* event;
  31494. if (ssl == NULL || asyncDev == NULL) {
  31495. return BAD_FUNC_ARG;
  31496. }
  31497. /* grab event pointer */
  31498. event = &asyncDev->event;
  31499. /* store reference to active async operation */
  31500. ssl->asyncDev = asyncDev;
  31501. /* place event into queue */
  31502. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  31503. /* success means return WC_PENDING_E */
  31504. if (ret == 0) {
  31505. ret = WC_PENDING_E;
  31506. }
  31507. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  31508. return ret;
  31509. }
  31510. #endif /* WOLFSSL_ASYNC_CRYPT */
  31511. /**
  31512. * Return the max fragment size. This is essentially the maximum
  31513. * fragment_length available.
  31514. * @param ssl WOLFSSL object containing ciphersuite information.
  31515. * @param maxFragment The amount of space we want to check is available. This
  31516. * is only the fragment length WITHOUT the (D)TLS headers.
  31517. * @return Max fragment size
  31518. */
  31519. int wolfSSL_GetMaxFragSize(WOLFSSL* ssl, int maxFragment)
  31520. {
  31521. (void) ssl; /* Avoid compiler warnings */
  31522. if (maxFragment > MAX_RECORD_SIZE) {
  31523. maxFragment = MAX_RECORD_SIZE;
  31524. }
  31525. #ifdef HAVE_MAX_FRAGMENT
  31526. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  31527. maxFragment = ssl->max_fragment;
  31528. }
  31529. #endif /* HAVE_MAX_FRAGMENT */
  31530. #ifdef WOLFSSL_DTLS
  31531. if (IsDtlsNotSctpMode(ssl)) {
  31532. int outputSz, mtuSz;
  31533. /* Given a input buffer size of maxFragment, how big will the
  31534. * encrypted output be? */
  31535. if (IsEncryptionOn(ssl, 1)) {
  31536. outputSz = BuildMessage(ssl, NULL, 0, NULL,
  31537. maxFragment + DTLS_HANDSHAKE_HEADER_SZ,
  31538. application_data, 0, 1, 0, CUR_ORDER);
  31539. }
  31540. else {
  31541. outputSz = maxFragment + DTLS_RECORD_HEADER_SZ +
  31542. DTLS_HANDSHAKE_HEADER_SZ;
  31543. }
  31544. /* Readjust maxFragment for MTU size. */
  31545. #if defined(WOLFSSL_DTLS_MTU)
  31546. mtuSz = ssl->dtlsMtuSz;
  31547. #else
  31548. mtuSz = MAX_MTU;
  31549. #endif
  31550. maxFragment = ModifyForMTU(ssl, maxFragment, outputSz, mtuSz);
  31551. }
  31552. #endif
  31553. return maxFragment;
  31554. }
  31555. #if defined(WOLFSSL_IOTSAFE) && defined(HAVE_PK_CALLBACKS)
  31556. IOTSAFE *wolfSSL_get_iotsafe_ctx(WOLFSSL *ssl)
  31557. {
  31558. if (ssl == NULL)
  31559. return NULL;
  31560. return &ssl->iotsafe;
  31561. }
  31562. int wolfSSL_set_iotsafe_ctx(WOLFSSL *ssl, IOTSAFE *iotsafe)
  31563. {
  31564. if ((ssl == NULL) || (iotsafe == NULL))
  31565. return BAD_FUNC_ARG;
  31566. XMEMCPY(&ssl->iotsafe, iotsafe, sizeof(IOTSAFE));
  31567. return 0;
  31568. }
  31569. #endif
  31570. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  31571. /* create an instance of WOLFSSL_BY_DIR_HASH structure */
  31572. WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void)
  31573. {
  31574. WOLFSSL_BY_DIR_HASH* dir_hash;
  31575. WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new");
  31576. dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL,
  31577. DYNAMIC_TYPE_OPENSSL);
  31578. if (dir_hash) {
  31579. XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH));
  31580. }
  31581. return dir_hash;
  31582. }
  31583. /* release a WOLFSSL_BY_DIR_HASH resource */
  31584. void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash)
  31585. {
  31586. if (dir_hash == NULL)
  31587. return;
  31588. XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL);
  31589. }
  31590. /* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */
  31591. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void)
  31592. {
  31593. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  31594. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null");
  31595. if (sk) {
  31596. sk->type = STACK_TYPE_BY_DIR_hash;
  31597. }
  31598. return sk;
  31599. }
  31600. /* returns value less than 0 on fail to match
  31601. * On a successful match the priority level found is returned
  31602. */
  31603. int wolfSSL_sk_BY_DIR_HASH_find(
  31604. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind)
  31605. {
  31606. WOLFSSL_STACK* next;
  31607. int i, sz;
  31608. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find");
  31609. if (sk == NULL || toFind == NULL) {
  31610. return WOLFSSL_FAILURE;
  31611. }
  31612. sz = wolfSSL_sk_BY_DIR_HASH_num(sk);
  31613. next = sk;
  31614. for (i = 0; i < sz && next != NULL; i++) {
  31615. if (next->data.dir_hash->hash_value == toFind->hash_value) {
  31616. return sz - i; /* reverse because stack pushed highest on first */
  31617. }
  31618. next = next->next;
  31619. }
  31620. return -1;
  31621. }
  31622. /* return a number of WOLFSSL_BY_DIR_HASH in stack */
  31623. int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  31624. {
  31625. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num");
  31626. if (sk == NULL)
  31627. return -1;
  31628. return (int)sk->num;
  31629. }
  31630. /* return WOLFSSL_BY_DIR_HASH instance at i */
  31631. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value(
  31632. const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i)
  31633. {
  31634. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value");
  31635. for (; sk != NULL && i > 0; i--)
  31636. sk = sk->next;
  31637. if (i != 0 || sk == NULL)
  31638. return NULL;
  31639. return sk->data.dir_hash;
  31640. }
  31641. /* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */
  31642. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop(
  31643. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk)
  31644. {
  31645. WOLFSSL_STACK* node;
  31646. WOLFSSL_BY_DIR_HASH* hash;
  31647. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop");
  31648. if (sk == NULL) {
  31649. return NULL;
  31650. }
  31651. node = sk->next;
  31652. hash = sk->data.dir_hash;
  31653. if (node != NULL) { /* update sk and remove node from stack */
  31654. sk->data.dir_hash = node->data.dir_hash;
  31655. sk->next = node->next;
  31656. wolfSSL_sk_free_node(node);
  31657. }
  31658. else { /* last x509 in stack */
  31659. sk->data.dir_hash = NULL;
  31660. }
  31661. if (sk->num > 0) {
  31662. sk->num -= 1;
  31663. }
  31664. return hash;
  31665. }
  31666. /* release all contents in stack, and then release stack itself. */
  31667. /* Second argument is a function pointer to release resouces. */
  31668. /* It calls the function to release resouces when t is passed */
  31669. /* instead of wolfSSL_BY_DIR_HASH_free(). */
  31670. void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk,
  31671. void (*f) (WOLFSSL_BY_DIR_HASH*))
  31672. {
  31673. WOLFSSL_STACK* node;
  31674. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free");
  31675. if (sk == NULL) {
  31676. return;
  31677. }
  31678. /* parse through stack freeing each node */
  31679. node = sk->next;
  31680. while (node && sk->num > 1) {
  31681. WOLFSSL_STACK* tmp = node;
  31682. node = node->next;
  31683. if (f)
  31684. f(tmp->data.dir_hash);
  31685. else
  31686. wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash);
  31687. tmp->data.dir_hash = NULL;
  31688. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  31689. sk->num -= 1;
  31690. }
  31691. /* free head of stack */
  31692. if (sk->num == 1) {
  31693. if (f)
  31694. f(sk->data.dir_hash);
  31695. else
  31696. wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash);
  31697. sk->data.dir_hash = NULL;
  31698. }
  31699. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  31700. }
  31701. /* release all contents in stack, and then release stack itself */
  31702. void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  31703. {
  31704. wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL);
  31705. }
  31706. /* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and
  31707. * tries to free it when the stack is free'd.
  31708. *
  31709. * return 1 on success 0 on fail
  31710. */
  31711. int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk,
  31712. WOLFSSL_BY_DIR_HASH* in)
  31713. {
  31714. WOLFSSL_STACK* node;
  31715. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push");
  31716. if (sk == NULL || in == NULL) {
  31717. return WOLFSSL_FAILURE;
  31718. }
  31719. /* no previous values in stack */
  31720. if (sk->data.dir_hash == NULL) {
  31721. sk->data.dir_hash = in;
  31722. sk->num += 1;
  31723. return WOLFSSL_SUCCESS;
  31724. }
  31725. /* stack already has value(s) create a new node and add more */
  31726. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  31727. DYNAMIC_TYPE_OPENSSL);
  31728. if (node == NULL) {
  31729. WOLFSSL_MSG("Memory error");
  31730. return WOLFSSL_FAILURE;
  31731. }
  31732. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  31733. /* push new obj onto head of stack */
  31734. node->data.dir_hash = sk->data.dir_hash;
  31735. node->next = sk->next;
  31736. node->type = sk->type;
  31737. sk->next = node;
  31738. sk->data.dir_hash = in;
  31739. sk->num += 1;
  31740. return WOLFSSL_SUCCESS;
  31741. }
  31742. /* create an instance of WOLFSSL_BY_DIR_entry structure */
  31743. WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void)
  31744. {
  31745. WOLFSSL_BY_DIR_entry* entry;
  31746. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new");
  31747. entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL,
  31748. DYNAMIC_TYPE_OPENSSL);
  31749. if (entry) {
  31750. XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry));
  31751. }
  31752. return entry;
  31753. }
  31754. /* release a WOLFSSL_BY_DIR_entry resource */
  31755. void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry)
  31756. {
  31757. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free");
  31758. if (entry == NULL)
  31759. return;
  31760. if (entry->hashes) {
  31761. wolfSSL_sk_BY_DIR_HASH_free(entry->hashes);
  31762. }
  31763. if (entry->dir_name != NULL) {
  31764. XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL);
  31765. }
  31766. XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL);
  31767. }
  31768. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void)
  31769. {
  31770. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  31771. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null");
  31772. if (sk) {
  31773. sk->type = STACK_TYPE_BY_DIR_entry;
  31774. }
  31775. return sk;
  31776. }
  31777. /* return a number of WOLFSSL_BY_DIR_entry in stack */
  31778. int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk)
  31779. {
  31780. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num");
  31781. if (sk == NULL)
  31782. return -1;
  31783. return (int)sk->num;
  31784. }
  31785. /* return WOLFSSL_BY_DIR_entry instance at i */
  31786. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value(
  31787. const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i)
  31788. {
  31789. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value");
  31790. for (; sk != NULL && i > 0; i--)
  31791. sk = sk->next;
  31792. if (i != 0 || sk == NULL)
  31793. return NULL;
  31794. return sk->data.dir_entry;
  31795. }
  31796. /* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */
  31797. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop(
  31798. WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk)
  31799. {
  31800. WOLFSSL_STACK* node;
  31801. WOLFSSL_BY_DIR_entry* entry;
  31802. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop");
  31803. if (sk == NULL) {
  31804. return NULL;
  31805. }
  31806. node = sk->next;
  31807. entry = sk->data.dir_entry;
  31808. if (node != NULL) { /* update sk and remove node from stack */
  31809. sk->data.dir_entry = node->data.dir_entry;
  31810. sk->next = node->next;
  31811. wolfSSL_sk_free_node(node);
  31812. }
  31813. else { /* last x509 in stack */
  31814. sk->data.dir_entry = NULL;
  31815. }
  31816. if (sk->num > 0) {
  31817. sk->num -= 1;
  31818. }
  31819. return entry;
  31820. }
  31821. /* release all contents in stack, and then release stack itself. */
  31822. /* Second argument is a function pointer to release resouces. */
  31823. /* It calls the function to release resouces when t is passed */
  31824. /* instead of wolfSSL_BY_DIR_entry_free(). */
  31825. void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  31826. void (*f) (WOLFSSL_BY_DIR_entry*))
  31827. {
  31828. WOLFSSL_STACK* node;
  31829. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free");
  31830. if (sk == NULL) {
  31831. return;
  31832. }
  31833. /* parse through stack freeing each node */
  31834. node = sk->next;
  31835. while (node && sk->num > 1) {
  31836. WOLFSSL_STACK* tmp = node;
  31837. node = node->next;
  31838. if (f)
  31839. f(tmp->data.dir_entry);
  31840. else
  31841. wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry);
  31842. tmp->data.dir_entry = NULL;
  31843. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  31844. sk->num -= 1;
  31845. }
  31846. /* free head of stack */
  31847. if (sk->num == 1) {
  31848. if (f)
  31849. f(sk->data.dir_entry);
  31850. else
  31851. wolfSSL_BY_DIR_entry_free(sk->data.dir_entry);
  31852. sk->data.dir_entry = NULL;
  31853. }
  31854. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  31855. }
  31856. /* release all contents in stack, and then release stack itself */
  31857. void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk)
  31858. {
  31859. wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL);
  31860. }
  31861. /* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and
  31862. * tries to free it when the stack is free'd.
  31863. *
  31864. * return 1 on success 0 on fail
  31865. */
  31866. int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  31867. WOLFSSL_BY_DIR_entry* in)
  31868. {
  31869. WOLFSSL_STACK* node;
  31870. if (sk == NULL || in == NULL) {
  31871. return WOLFSSL_FAILURE;
  31872. }
  31873. /* no previous values in stack */
  31874. if (sk->data.dir_entry == NULL) {
  31875. sk->data.dir_entry = in;
  31876. sk->num += 1;
  31877. return WOLFSSL_SUCCESS;
  31878. }
  31879. /* stack already has value(s) create a new node and add more */
  31880. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  31881. DYNAMIC_TYPE_OPENSSL);
  31882. if (node == NULL) {
  31883. WOLFSSL_MSG("Memory error");
  31884. return WOLFSSL_FAILURE;
  31885. }
  31886. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  31887. /* push new obj onto head of stack */
  31888. node->data.dir_entry = sk->data.dir_entry;
  31889. node->next = sk->next;
  31890. node->type = sk->type;
  31891. sk->next = node;
  31892. sk->data.dir_entry = in;
  31893. sk->num += 1;
  31894. return WOLFSSL_SUCCESS;
  31895. }
  31896. #endif /* OPENSSL_ALL */
  31897. #undef ERROR_OUT
  31898. #endif /* WOLFCRYPT_ONLY */