internal.c 1.1 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128
  1. /* internal.c
  2. *
  3. * Copyright (C) 2006-2021 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. */
  71. #ifdef EXTERNAL_OPTS_OPENVPN
  72. #error EXTERNAL_OPTS_OPENVPN should not be defined\
  73. when building wolfSSL
  74. #endif
  75. #ifndef WOLFCRYPT_ONLY
  76. #include <wolfssl/internal.h>
  77. #include <wolfssl/error-ssl.h>
  78. #include <wolfssl/wolfcrypt/asn.h>
  79. #include <wolfssl/wolfcrypt/dh.h>
  80. #ifdef NO_INLINE
  81. #include <wolfssl/wolfcrypt/misc.h>
  82. #else
  83. #define WOLFSSL_MISC_INCLUDED
  84. #include <wolfcrypt/src/misc.c>
  85. #endif
  86. #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA)
  87. #include <wolfssl/wolfcrypt/srp.h>
  88. #endif
  89. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  90. #include <wolfssl/wolfcrypt/coding.h>
  91. #endif
  92. #ifdef HAVE_LIBZ
  93. #include "zlib.h"
  94. #endif
  95. #ifdef WOLFSSL_QNX_CAAM
  96. /* included to get CAAM devId value */
  97. #include <wolfssl/wolfcrypt/port/caam/wolfcaam.h>
  98. #endif
  99. #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \
  100. defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
  101. #ifndef NO_STDIO_FILESYSTEM
  102. #ifdef FUSION_RTOS
  103. #include <fclstdio.h>
  104. #else
  105. #include <stdio.h>
  106. #endif
  107. #endif
  108. #endif
  109. #ifdef __sun
  110. #include <sys/filio.h>
  111. #endif
  112. #define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; }
  113. #ifdef _MSC_VER
  114. /* disable for while(0) cases at the .c level for now */
  115. #pragma warning(disable:4127)
  116. #endif
  117. #if defined(WOLFSSL_CALLBACKS) && !defined(LARGE_STATIC_BUFFERS)
  118. #error \
  119. WOLFSSL_CALLBACKS needs LARGE_STATIC_BUFFERS, please add LARGE_STATIC_BUFFERS
  120. #endif
  121. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION)
  122. #error Cannot use both secure-renegotiation and renegotiation-indication
  123. #endif
  124. #ifndef WOLFSSL_NO_TLS12
  125. #ifndef NO_WOLFSSL_CLIENT
  126. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input,
  127. word32* inOutIdx, word32 size);
  128. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  129. word32* inOutIdx, word32 size);
  130. #ifndef NO_CERTS
  131. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input,
  132. word32* inOutIdx, word32 size);
  133. #endif
  134. #ifdef HAVE_SESSION_TICKET
  135. static int DoSessionTicket(WOLFSSL* ssl, const byte* input,
  136. word32* inOutIdx, word32 size);
  137. #endif
  138. #endif
  139. #ifndef NO_WOLFSSL_SERVER
  140. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input,
  141. word32* inOutIdx, word32 size);
  142. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  143. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  144. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  145. word32* inOutIdx, word32 size);
  146. #endif
  147. #ifdef WOLFSSL_DTLS
  148. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  149. const byte* cookie, byte cookieSz);
  150. #endif /* WOLFSSL_DTLS */
  151. #endif /* !NO_WOLFSSL_SERVER */
  152. #endif /* !WOLFSSL_NO_TLS12 */
  153. #ifndef NO_WOLFSSL_SERVER
  154. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  155. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx,
  156. TicketEncCbCtx* keyCtx);
  157. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx);
  158. static int DefTicketEncCb(WOLFSSL* ssl,
  159. byte key_name[WOLFSSL_TICKET_NAME_SZ],
  160. byte iv[WOLFSSL_TICKET_IV_SZ],
  161. byte mac[WOLFSSL_TICKET_MAC_SZ],
  162. int enc, byte* ticket, int inLen, int* outLen,
  163. void* userCtx);
  164. #endif
  165. #endif
  166. static int cipherExtraData(WOLFSSL* ssl);
  167. #ifdef WOLFSSL_DTLS
  168. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl);
  169. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl);
  170. #endif
  171. enum processReply {
  172. doProcessInit = 0,
  173. #ifndef NO_WOLFSSL_SERVER
  174. runProcessOldClientHello,
  175. #endif
  176. getRecordLayerHeader,
  177. getData,
  178. verifyEncryptedMessage,
  179. decryptMessage,
  180. verifyMessage,
  181. runProcessingOneMessage
  182. };
  183. #ifndef WOLFSSL_NO_TLS12
  184. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  185. /* Server random bytes for TLS v1.3 described downgrade protection mechanism. */
  186. static const byte tls13Downgrade[7] = {
  187. 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44
  188. };
  189. #define TLS13_DOWNGRADE_SZ sizeof(tls13Downgrade)
  190. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  191. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  192. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  193. int padLen, int content, int verify, int epochOrder);
  194. #endif
  195. #endif /* !WOLFSSL_NO_TLS12 */
  196. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  197. #include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
  198. #endif
  199. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  200. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  201. int* secretSz, void* ctx);
  202. #ifdef WOLFSSL_TLS13
  203. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  204. const unsigned char* secret, int secretSz, void* ctx);
  205. #endif
  206. /*
  207. * This function builds up string for key-logging then call user's
  208. * key-log-callback to pass the string for TLS1.2 and older.
  209. * The user's key-logging callback has been set via
  210. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  211. * "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  212. * parameter
  213. * - ssl: WOLFSSL object
  214. * - secret: pointer to the buffer holding master-secret
  215. * - secretSz: size of secret
  216. * - ctx: not used
  217. * returns 0 on success, negative value on failure.
  218. */
  219. static int SessionSecret_callback(WOLFSSL* ssl, void* secret,
  220. int* secretSz, void* ctx)
  221. {
  222. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  223. int msSz;
  224. int hasVal;
  225. int i;
  226. const char* label = "CLIENT_RANDOM";
  227. int labelSz = sizeof("CLIENT_RANDOM");
  228. int buffSz;
  229. byte* log = NULL;
  230. word32 outSz;
  231. int idx;
  232. int ret;
  233. (void)ctx;
  234. if (ssl == NULL || secret == NULL || *secretSz == 0)
  235. return BAD_FUNC_ARG;
  236. if (ssl->arrays == NULL)
  237. return BAD_FUNC_ARG;
  238. /* get the user-callback func from CTX*/
  239. logCb = ssl->ctx->keyLogCb;
  240. if (logCb == NULL)
  241. return 0;
  242. /* need to make sure the given master-secret has a meaningful value */
  243. msSz = *secretSz;
  244. hasVal = 0;
  245. for (i = 0; i < msSz; i++) {
  246. if (*((byte*)secret) != 0) {
  247. hasVal = 1;
  248. break;
  249. }
  250. }
  251. if (hasVal == 0)
  252. return 0; /* master-secret looks invalid */
  253. /* build up a hex-decoded keylog string
  254. "CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>"
  255. note that each keylog string does not have LF.
  256. */
  257. buffSz = labelSz + (RAN_LEN * 2) + 1 + ((*secretSz) * 2) + 1;
  258. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  259. if (log == NULL)
  260. return MEMORY_E;
  261. XMEMSET(log, 0, buffSz);
  262. XMEMCPY(log, label, labelSz -1); /* put label w/o terminator */
  263. XMEMSET(log + labelSz - 1, ' ', 1); /* '\0' -> ' ' */
  264. idx = labelSz;
  265. outSz = buffSz - idx;
  266. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  267. log + idx, &outSz)) == 0) {
  268. idx += (outSz - 1); /* reduce terminator byte */
  269. outSz = buffSz - idx;
  270. if (outSz > 1) {
  271. XMEMSET(log + idx, ' ', 1); /* add space*/
  272. idx++;
  273. outSz = buffSz - idx;
  274. if ((ret = Base16_Encode((byte*)secret, *secretSz,
  275. log + idx, &outSz)) == 0) {
  276. /* pass the log to the client callback*/
  277. logCb(ssl, (char*)log);
  278. ret = 0;
  279. }
  280. }
  281. else
  282. ret = MEMORY_E;
  283. }
  284. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  285. return ret;
  286. }
  287. #if defined(WOLFSSL_TLS13)
  288. /*
  289. * This function builds up string for key-logging then call user's
  290. * key-log-callback to pass the string for TLS1.3.
  291. * The user's key-logging callback has been set via
  292. * wolfSSL_CTX_set_keylog_callback function. The logging string format is:
  293. * "<Label> <hex-encoded client random> <hex-encoded secret>"
  294. *
  295. * parameter
  296. * - ssl: WOLFSSL object
  297. * - id: type of secret for logging
  298. * - secret: pointer to the buffer holding secret
  299. * - secretSz: size of secret
  300. * - ctx: not used
  301. * returns 0 on success, negative value on failure.
  302. */
  303. static int SessionSecret_callback_Tls13(WOLFSSL* ssl, int id,
  304. const unsigned char* secret, int secretSz, void* ctx)
  305. {
  306. wolfSSL_CTX_keylog_cb_func logCb = NULL;
  307. char label[50];
  308. int labelSz = 0;
  309. int buffSz = 0;
  310. byte* log = NULL;
  311. word32 outSz;
  312. int idx;
  313. int ret;
  314. (void)ctx;
  315. if (ssl == NULL || secret == NULL || secretSz == 0)
  316. return BAD_FUNC_ARG;
  317. if (ssl->arrays == NULL)
  318. return BAD_FUNC_ARG;
  319. /* get the user-callback func from CTX*/
  320. logCb = ssl->ctx->keyLogCb;
  321. if (logCb == NULL)
  322. return 0;
  323. switch (id) {
  324. case CLIENT_EARLY_TRAFFIC_SECRET:
  325. labelSz = sizeof("CLIENT_EARLY_TRAFFIC_SECRET");
  326. XSTRNCPY(label,"CLIENT_EARLY_TRAFFIC_SECRET", labelSz);
  327. break;
  328. case CLIENT_HANDSHAKE_TRAFFIC_SECRET:
  329. labelSz = sizeof("CLIENT_HANDSHAKE_TRAFFIC_SECRET");
  330. XSTRNCPY(label, "CLIENT_HANDSHAKE_TRAFFIC_SECRET", labelSz);
  331. break;
  332. case SERVER_HANDSHAKE_TRAFFIC_SECRET:
  333. labelSz = sizeof("SERVER_HANDSHAKE_TRAFFIC_SECRET");
  334. XSTRNCPY(label, "SERVER_HANDSHAKE_TRAFFIC_SECRET", labelSz);
  335. break;
  336. case CLIENT_TRAFFIC_SECRET:
  337. labelSz = sizeof("CLIENT_TRAFFIC_SECRET_0");
  338. XSTRNCPY(label, "CLIENT_TRAFFIC_SECRET_0", labelSz);
  339. break;
  340. case SERVER_TRAFFIC_SECRET:
  341. labelSz = sizeof("SERVER_TRAFFIC_SECRET_0");
  342. XSTRNCPY(label, "SERVER_TRAFFIC_SECRET_0", labelSz);
  343. break;
  344. case EARLY_EXPORTER_SECRET:
  345. labelSz = sizeof("EARLY_EXPORTER_SECRET");
  346. XSTRNCPY(label, "EARLY_EXPORTER_SECRET", labelSz);
  347. break;
  348. case EXPORTER_SECRET:
  349. labelSz = sizeof("EXPORTER_SECRET");
  350. XSTRNCPY(label, "EXPORTER_SECRET", labelSz);
  351. break;
  352. default:
  353. return BAD_FUNC_ARG;
  354. }
  355. /* prepare a log string for passing user callback */
  356. buffSz = labelSz + (RAN_LEN * 2) + 1 + secretSz * 2 + 1;
  357. log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
  358. if (log == NULL)
  359. return MEMORY_E;
  360. XMEMSET(log, 0, buffSz);
  361. XMEMCPY(log, label, labelSz - 1); /* put label w/o terminator */
  362. XMEMSET(log + labelSz - 1, ' ', 1); /* '\0' -> ' ' */
  363. idx = labelSz;
  364. outSz = buffSz - idx;
  365. if ((ret = Base16_Encode(ssl->arrays->clientRandom, RAN_LEN,
  366. log + idx, &outSz)) == 0) {
  367. idx += (outSz -1); /* reduce terminator byte */
  368. outSz = buffSz - idx;
  369. if (outSz >1) {
  370. XMEMSET(log + idx, ' ', 1); /* add space*/
  371. idx++;
  372. outSz = buffSz - idx;
  373. if ((ret = Base16_Encode((byte*)secret, secretSz,
  374. log + idx, &outSz)) == 0) {
  375. logCb(ssl, (char*)log);
  376. ret = 0;
  377. }
  378. }
  379. else
  380. ret = MEMORY_E;
  381. }
  382. XFREE(log, ssl->heap, DYNAMIC_TYPE_SECRET);
  383. return ret;
  384. }
  385. #endif /* WOLFSSL_TLS13*/
  386. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK*/
  387. int IsTLS(const WOLFSSL* ssl)
  388. {
  389. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR)
  390. return 1;
  391. return 0;
  392. }
  393. int IsAtLeastTLSv1_2(const WOLFSSL* ssl)
  394. {
  395. if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_2_MINOR)
  396. return 1;
  397. #ifdef WOLFSSL_DTLS
  398. if (ssl->version.major == DTLS_MAJOR && ssl->version.minor <= DTLSv1_2_MINOR)
  399. return 1;
  400. #endif
  401. return 0;
  402. }
  403. int IsAtLeastTLSv1_3(const ProtocolVersion pv)
  404. {
  405. return (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR);
  406. }
  407. static WC_INLINE int IsEncryptionOn(WOLFSSL* ssl, int isSend)
  408. {
  409. #ifdef WOLFSSL_DTLS
  410. /* For DTLS, epoch 0 is always not encrypted. */
  411. if (ssl->options.dtls && !isSend && ssl->keys.curEpoch == 0)
  412. return 0;
  413. #endif /* WOLFSSL_DTLS */
  414. return ssl->keys.encryptionOn &&
  415. (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
  416. }
  417. #ifdef WOLFSSL_DTLS
  418. /* Stream Control Transmission Protocol */
  419. /* If SCTP is not enabled returns the state of the dtls option.
  420. * If SCTP is enabled returns dtls && !sctp. */
  421. int IsDtlsNotSctpMode(WOLFSSL* ssl)
  422. {
  423. #ifdef WOLFSSL_SCTP
  424. return ssl->options.dtls && !ssl->options.dtlsSctp;
  425. #else
  426. return ssl->options.dtls;
  427. #endif
  428. }
  429. /* Secure Real-time Transport Protocol */
  430. /* If SRTP is not enabled returns the state of the dtls option.
  431. * If SRTP is enabled returns dtls && !dtlsSrtpProfiles. */
  432. static WC_INLINE int IsDtlsNotSrtpMode(WOLFSSL* ssl)
  433. {
  434. #ifdef WOLFSSL_SRTP
  435. return ssl->options.dtls && !ssl->dtlsSrtpProfiles;
  436. #else
  437. return ssl->options.dtls;
  438. #endif
  439. }
  440. #endif /* WOLFSSL_DTLS */
  441. #ifdef HAVE_LIBZ
  442. /* alloc user allocs to work with zlib */
  443. static void* myAlloc(void* opaque, unsigned int item, unsigned int size)
  444. {
  445. (void)opaque;
  446. return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
  447. }
  448. static void myFree(void* opaque, void* memory)
  449. {
  450. (void)opaque;
  451. XFREE(memory, opaque, DYNAMIC_TYPE_LIBZ);
  452. }
  453. /* init zlib comp/decomp streams, 0 on success */
  454. static int InitStreams(WOLFSSL* ssl)
  455. {
  456. ssl->c_stream.zalloc = (alloc_func)myAlloc;
  457. ssl->c_stream.zfree = (free_func)myFree;
  458. ssl->c_stream.opaque = (voidpf)ssl->heap;
  459. if (deflateInit(&ssl->c_stream, Z_DEFAULT_COMPRESSION) != Z_OK)
  460. return ZLIB_INIT_ERROR;
  461. ssl->didStreamInit = 1;
  462. ssl->d_stream.zalloc = (alloc_func)myAlloc;
  463. ssl->d_stream.zfree = (free_func)myFree;
  464. ssl->d_stream.opaque = (voidpf)ssl->heap;
  465. if (inflateInit(&ssl->d_stream) != Z_OK) return ZLIB_INIT_ERROR;
  466. return 0;
  467. }
  468. static void FreeStreams(WOLFSSL* ssl)
  469. {
  470. if (ssl->didStreamInit) {
  471. deflateEnd(&ssl->c_stream);
  472. inflateEnd(&ssl->d_stream);
  473. }
  474. }
  475. /* compress in to out, return out size or error */
  476. static int myCompress(WOLFSSL* ssl, byte* in, int inSz, byte* out, int outSz)
  477. {
  478. int err;
  479. int currTotal = (int)ssl->c_stream.total_out;
  480. ssl->c_stream.next_in = in;
  481. ssl->c_stream.avail_in = inSz;
  482. ssl->c_stream.next_out = out;
  483. ssl->c_stream.avail_out = outSz;
  484. err = deflate(&ssl->c_stream, Z_SYNC_FLUSH);
  485. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_COMPRESS_ERROR;
  486. return (int)ssl->c_stream.total_out - currTotal;
  487. }
  488. /* decompress in to out, return out size or error */
  489. static int myDeCompress(WOLFSSL* ssl, byte* in,int inSz, byte* out,int outSz)
  490. {
  491. int err;
  492. int currTotal = (int)ssl->d_stream.total_out;
  493. ssl->d_stream.next_in = in;
  494. ssl->d_stream.avail_in = inSz;
  495. ssl->d_stream.next_out = out;
  496. ssl->d_stream.avail_out = outSz;
  497. err = inflate(&ssl->d_stream, Z_SYNC_FLUSH);
  498. if (err != Z_OK && err != Z_STREAM_END) return ZLIB_DECOMPRESS_ERROR;
  499. return (int)ssl->d_stream.total_out - currTotal;
  500. }
  501. #endif /* HAVE_LIBZ */
  502. #ifdef WOLFSSL_SESSION_EXPORT
  503. /**
  504. * serializes the cipher specs struct for exporting
  505. * @return the amount written to 'exp' buffer
  506. */
  507. static int ExportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  508. int type)
  509. {
  510. word32 idx = 0;
  511. CipherSpecs* specs;
  512. WOLFSSL_ENTER("ExportCipherSpecState");
  513. if (exp == NULL || ssl == NULL) {
  514. return BAD_FUNC_ARG;
  515. }
  516. specs = &ssl->specs;
  517. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  518. return BUFFER_E;
  519. }
  520. XMEMSET(exp, 0, WOLFSSL_EXPORT_SPC_SZ);
  521. c16toa(specs->key_size, exp + idx); idx += OPAQUE16_LEN;
  522. c16toa(specs->iv_size, exp + idx); idx += OPAQUE16_LEN;
  523. c16toa(specs->block_size, exp + idx); idx += OPAQUE16_LEN;
  524. c16toa(specs->aead_mac_size, exp + idx); idx += OPAQUE16_LEN;
  525. exp[idx++] = specs->bulk_cipher_algorithm;
  526. exp[idx++] = specs->cipher_type;
  527. exp[idx++] = specs->mac_algorithm;
  528. exp[idx++] = specs->kea;
  529. exp[idx++] = specs->sig_algo;
  530. exp[idx++] = specs->hash_size;
  531. exp[idx++] = specs->pad_size;
  532. exp[idx++] = specs->static_ecdh;
  533. if (idx != WOLFSSL_EXPORT_SPC_SZ) {
  534. WOLFSSL_MSG("WOLFSSL_EXPORT_SPC_SZ needs updated and export version");
  535. return DTLS_EXPORT_VER_E;
  536. }
  537. /* send over state of AES too */
  538. if (type == WOLFSSL_EXPORT_TLS &&
  539. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  540. byte *pt = (byte*)ssl->encrypt.aes->reg;
  541. if ((idx + 2*AES_BLOCK_SIZE) > len) {
  542. WOLFSSL_MSG("Can not fit AES state into buffer");
  543. return BUFFER_E;
  544. }
  545. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  546. idx += AES_BLOCK_SIZE;
  547. pt = (byte*)ssl->decrypt.aes->reg;
  548. XMEMCPY(exp + idx, pt, AES_BLOCK_SIZE);
  549. idx += AES_BLOCK_SIZE;
  550. }
  551. WOLFSSL_LEAVE("ExportCipherSpecState", idx);
  552. (void)ver;
  553. return idx;
  554. }
  555. /* serializes the key struct for exporting */
  556. static int ExportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  557. byte small, int type)
  558. {
  559. word32 idx = 0;
  560. byte sz;
  561. Keys* keys;
  562. WOLFSSL_ENTER("ExportKeyState");
  563. if (exp == NULL || ssl == NULL) {
  564. return BAD_FUNC_ARG;
  565. }
  566. keys = &(ssl->keys);
  567. if (DTLS_EXPORT_MIN_KEY_SZ > len) {
  568. WOLFSSL_MSG("Buffer not large enough for minimum key struct size");
  569. return BUFFER_E;
  570. }
  571. XMEMSET(exp, 0, DTLS_EXPORT_MIN_KEY_SZ);
  572. c32toa(keys->peer_sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  573. c32toa(keys->peer_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  574. c32toa(keys->sequence_number_hi, exp + idx); idx += OPAQUE32_LEN;
  575. c32toa(keys->sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  576. #if defined(WOLFSSL_DTLS)
  577. if (type == WOLFSSL_EXPORT_DTLS) {
  578. c16toa(keys->peerSeq[0].nextEpoch, exp + idx); idx += OPAQUE16_LEN;
  579. c16toa(keys->peerSeq[0].nextSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  580. c32toa(keys->peerSeq[0].nextSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  581. c16toa(keys->curEpoch, exp + idx); idx += OPAQUE16_LEN;
  582. c16toa(keys->curSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  583. c32toa(keys->curSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  584. c16toa(keys->peerSeq[0].prevSeq_hi, exp + idx); idx += OPAQUE16_LEN;
  585. c32toa(keys->peerSeq[0].prevSeq_lo, exp + idx); idx += OPAQUE32_LEN;
  586. c16toa(keys->dtls_peer_handshake_number, exp + idx);
  587. idx += OPAQUE16_LEN;
  588. c16toa(keys->dtls_expected_peer_handshake_number, exp + idx);
  589. idx += OPAQUE16_LEN;
  590. c16toa(keys->dtls_sequence_number_hi, exp + idx); idx += OPAQUE16_LEN;
  591. c32toa(keys->dtls_sequence_number_lo, exp + idx); idx += OPAQUE32_LEN;
  592. c16toa(keys->dtls_prev_sequence_number_hi, exp + idx);
  593. idx += OPAQUE16_LEN;
  594. c32toa(keys->dtls_prev_sequence_number_lo, exp + idx);
  595. idx += OPAQUE32_LEN;
  596. c16toa(keys->dtls_epoch, exp + idx); idx += OPAQUE16_LEN;
  597. c16toa(keys->dtls_handshake_number, exp + idx); idx += OPAQUE16_LEN;
  598. }
  599. #endif
  600. c32toa(keys->encryptSz, exp + idx); idx += OPAQUE32_LEN;
  601. c32toa(keys->padSz, exp + idx); idx += OPAQUE32_LEN;
  602. exp[idx++] = keys->encryptionOn;
  603. exp[idx++] = keys->decryptedCur;
  604. /* from here on the buffer needs checked because is variable length that
  605. * can be larger than DTLS_EXPORT_MIN_KEY_SZ */
  606. #ifdef WOLFSSL_DTLS
  607. if (type == WOLFSSL_EXPORT_DTLS) {
  608. word32 i;
  609. if ((OPAQUE16_LEN * 2) + idx +
  610. (2 * (WOLFSSL_DTLS_WINDOW_WORDS * OPAQUE32_LEN)) > len) {
  611. WOLFSSL_MSG("Buffer not large enough for WOLFSSL_DTLS_WINDOW_WORDS");
  612. return BUFFER_E;
  613. }
  614. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  615. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  616. c32toa(keys->peerSeq[0].window[i], exp + idx);
  617. idx += OPAQUE32_LEN;
  618. }
  619. c16toa(WOLFSSL_DTLS_WINDOW_WORDS, exp + idx); idx += OPAQUE16_LEN;
  620. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  621. c32toa(keys->peerSeq[0].prevWindow[i], exp + idx);
  622. idx += OPAQUE32_LEN;
  623. }
  624. }
  625. #endif
  626. if (idx >= len) {
  627. WOLFSSL_MSG("Buffer not large enough for truncated hmac flag");
  628. return BUFFER_E;
  629. }
  630. #ifdef HAVE_TRUNCATED_HMAC
  631. sz = ssl->truncated_hmac ? TRUNCATED_HMAC_SZ: ssl->specs.hash_size;
  632. exp[idx++] = ssl->truncated_hmac;
  633. #else
  634. sz = ssl->specs.hash_size;
  635. exp[idx++] = 0; /* no truncated hmac */
  636. #endif
  637. sz = (small)? 0: sz;
  638. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  639. WOLFSSL_MSG("Buffer not large enough for MAC secret");
  640. return BUFFER_E;
  641. }
  642. exp[idx++] = sz;
  643. if (sz > 0) {
  644. #ifndef WOLFSSL_AEAD_ONLY
  645. XMEMCPY(exp + idx, keys->client_write_MAC_secret, sz); idx += sz;
  646. XMEMCPY(exp + idx, keys->server_write_MAC_secret, sz); idx += sz;
  647. #else
  648. XMEMSET(exp + idx, 0, sz); idx += sz;
  649. XMEMSET(exp + idx, 0, sz); idx += sz;
  650. #endif
  651. }
  652. sz = (small)? 0: ssl->specs.key_size;
  653. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  654. WOLFSSL_MSG("Buffer not large enough for write key");
  655. return BUFFER_E;
  656. }
  657. exp[idx++] = sz;
  658. if (sz > 0) {
  659. XMEMCPY(exp + idx, keys->client_write_key, sz); idx += sz;
  660. XMEMCPY(exp + idx, keys->server_write_key, sz); idx += sz;
  661. }
  662. sz = (small)? 0: ssl->specs.iv_size;
  663. if (idx + (sz * 2) + OPAQUE8_LEN + AEAD_MAX_EXP_SZ > len) {
  664. WOLFSSL_MSG("Buffer not large enough for IVs");
  665. return BUFFER_E;
  666. }
  667. exp[idx++] = sz;
  668. if (sz > 0) {
  669. XMEMCPY(exp + idx, keys->client_write_IV, sz); idx += sz;
  670. XMEMCPY(exp + idx, keys->server_write_IV, sz); idx += sz;
  671. }
  672. XMEMCPY(exp + idx, keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
  673. idx += AEAD_MAX_EXP_SZ;
  674. sz = (small)? 0: AEAD_MAX_IMP_SZ;
  675. if (idx + (sz * 2) + OPAQUE8_LEN > len) {
  676. WOLFSSL_MSG("Buffer not large enough for imp IVs");
  677. return BUFFER_E;
  678. }
  679. exp[idx++] = sz;
  680. if (sz > 0) {
  681. XMEMCPY(exp + idx, keys->aead_enc_imp_IV, sz); idx += sz;
  682. XMEMCPY(exp + idx, keys->aead_dec_imp_IV, sz); idx += sz;
  683. }
  684. /* DTLS_EXPORT_KEY_SZ is max value. idx size can vary */
  685. if (idx > DTLS_EXPORT_KEY_SZ) {
  686. WOLFSSL_MSG("DTLS_EXPORT_KEY_SZ needs updated and export version");
  687. return DTLS_EXPORT_VER_E;
  688. }
  689. WOLFSSL_LEAVE("ExportKeyState", idx);
  690. (void)ver;
  691. (void)type;
  692. return idx;
  693. }
  694. /**
  695. * Imports the buffer 'exp' into the 'ssl' CipherSpec structure.
  696. * @param ssl WOLFSSL structure to import into
  697. * @param exp input buffer to read from
  698. * @param len length of exp buffer
  699. * @param ver version of import buffer found
  700. * @param type flag for importing a TLS session or DTLS
  701. *
  702. * @return size of exp buffer consumed on success and negative value on fail
  703. */
  704. static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len,
  705. byte ver, int type)
  706. {
  707. word32 idx = 0;
  708. CipherSpecs* specs;
  709. word32 tmp_seq_peer_lo;
  710. word32 tmp_seq_peer_hi;
  711. word32 tmp_seq_lo;
  712. word32 tmp_seq_hi;
  713. WOLFSSL_ENTER("ImportCipherSpecState");
  714. if (exp == NULL || ssl == NULL) {
  715. return BAD_FUNC_ARG;
  716. }
  717. specs= &(ssl->specs);
  718. if (WOLFSSL_EXPORT_SPC_SZ > len) {
  719. WOLFSSL_MSG("Buffer not large enough for max spec struct size");
  720. return BUFFER_E;
  721. }
  722. ato16(exp + idx, &specs->key_size); idx += OPAQUE16_LEN;
  723. ato16(exp + idx, &specs->iv_size); idx += OPAQUE16_LEN;
  724. ato16(exp + idx, &specs->block_size); idx += OPAQUE16_LEN;
  725. ato16(exp + idx, &specs->aead_mac_size); idx += OPAQUE16_LEN;
  726. specs->bulk_cipher_algorithm = exp[idx++];
  727. specs->cipher_type = exp[idx++];
  728. specs->mac_algorithm = exp[idx++];
  729. specs->kea = exp[idx++];
  730. specs->sig_algo = exp[idx++];
  731. specs->hash_size = exp[idx++];
  732. specs->pad_size = exp[idx++];
  733. specs->static_ecdh = exp[idx++];
  734. if (specs->pad_size != PAD_MD5 && specs->pad_size != PAD_SHA) {
  735. WOLFSSL_MSG("Importing bad or unknown pad size");
  736. return BAD_STATE_E;
  737. }
  738. /* temporarily save the sequence numbers */
  739. tmp_seq_peer_lo = ssl->keys.peer_sequence_number_lo;
  740. tmp_seq_peer_hi = ssl->keys.peer_sequence_number_hi;
  741. tmp_seq_lo = ssl->keys.sequence_number_lo;
  742. tmp_seq_hi = ssl->keys.sequence_number_hi;
  743. SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
  744. /* reset sequence numbers after setting keys */
  745. ssl->keys.peer_sequence_number_lo = tmp_seq_peer_lo;
  746. ssl->keys.peer_sequence_number_hi = tmp_seq_peer_hi;
  747. ssl->keys.sequence_number_lo = tmp_seq_lo;
  748. ssl->keys.sequence_number_hi = tmp_seq_hi;
  749. if (type == WOLFSSL_EXPORT_TLS &&
  750. ssl->specs.bulk_cipher_algorithm == wolfssl_aes) {
  751. byte *pt = (byte*)ssl->encrypt.aes->reg;
  752. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  753. idx += AES_BLOCK_SIZE;
  754. pt = (byte*)ssl->decrypt.aes->reg;
  755. XMEMCPY(pt, exp + idx, AES_BLOCK_SIZE);
  756. idx += AES_BLOCK_SIZE;
  757. }
  758. WOLFSSL_LEAVE("ImportCipherSpecState", idx);
  759. (void)ver;
  760. return idx;
  761. }
  762. /**
  763. * Import the Key structure
  764. *
  765. * @param ssl WOLFSSL structure to import into
  766. * @param exp buffer to read Key values from
  767. * @param len max length of buffer 'exp'
  768. * @param ver version of import buffer found
  769. * @param type flag for TLS vs DTLS
  770. *
  771. * @return amount of data read from exp on success or negative on fail
  772. */
  773. static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  774. int type)
  775. {
  776. word32 idx = 0;
  777. byte sz;
  778. Keys *keys;
  779. WOLFSSL_ENTER("ImportKeyState");
  780. if (exp == NULL || ssl == NULL) {
  781. return BAD_FUNC_ARG;
  782. }
  783. keys = &(ssl->keys);
  784. /* check minimum length -- includes byte used for size indicators */
  785. if (len < DTLS_EXPORT_MIN_KEY_SZ) {
  786. WOLFSSL_MSG("Buffer not large enough for minimum expected size");
  787. return BUFFER_E;
  788. }
  789. ato32(exp + idx, &keys->peer_sequence_number_hi); idx += OPAQUE32_LEN;
  790. ato32(exp + idx, &keys->peer_sequence_number_lo); idx += OPAQUE32_LEN;
  791. ato32(exp + idx, &keys->sequence_number_hi); idx += OPAQUE32_LEN;
  792. ato32(exp + idx, &keys->sequence_number_lo); idx += OPAQUE32_LEN;
  793. #if defined(WOLFSSL_DTLS)
  794. if (type == WOLFSSL_EXPORT_DTLS) {
  795. ato16(exp + idx, &keys->peerSeq[0].nextEpoch); idx += OPAQUE16_LEN;
  796. ato16(exp + idx, &keys->peerSeq[0].nextSeq_hi); idx += OPAQUE16_LEN;
  797. ato32(exp + idx, &keys->peerSeq[0].nextSeq_lo); idx += OPAQUE32_LEN;
  798. ato16(exp + idx, &keys->curEpoch); idx += OPAQUE16_LEN;
  799. ato16(exp + idx, &keys->curSeq_hi); idx += OPAQUE16_LEN;
  800. ato32(exp + idx, &keys->curSeq_lo); idx += OPAQUE32_LEN;
  801. ato16(exp + idx, &keys->peerSeq[0].prevSeq_hi); idx += OPAQUE16_LEN;
  802. ato32(exp + idx, &keys->peerSeq[0].prevSeq_lo); idx += OPAQUE32_LEN;
  803. ato16(exp + idx, &keys->dtls_peer_handshake_number);
  804. idx += OPAQUE16_LEN;
  805. ato16(exp + idx, &keys->dtls_expected_peer_handshake_number);
  806. idx += OPAQUE16_LEN;
  807. ato16(exp + idx, &keys->dtls_sequence_number_hi); idx += OPAQUE16_LEN;
  808. ato32(exp + idx, &keys->dtls_sequence_number_lo); idx += OPAQUE32_LEN;
  809. ato16(exp + idx, &keys->dtls_prev_sequence_number_hi);
  810. idx += OPAQUE16_LEN;
  811. ato32(exp + idx, &keys->dtls_prev_sequence_number_lo);
  812. idx += OPAQUE32_LEN;
  813. ato16(exp + idx, &keys->dtls_epoch); idx += OPAQUE16_LEN;
  814. ato16(exp + idx, &keys->dtls_handshake_number); idx += OPAQUE16_LEN;
  815. }
  816. #endif
  817. ato32(exp + idx, &keys->encryptSz); idx += OPAQUE32_LEN;
  818. ato32(exp + idx, &keys->padSz); idx += OPAQUE32_LEN;
  819. keys->encryptionOn = exp[idx++];
  820. keys->decryptedCur = exp[idx++];
  821. #if defined(WOLFSSL_DTLS)
  822. if (type == WOLFSSL_EXPORT_DTLS) {
  823. word16 i, wordCount, wordAdj = 0;
  824. /* do window */
  825. ato16(exp + idx, &wordCount);
  826. idx += OPAQUE16_LEN;
  827. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  828. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  829. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  830. }
  831. XMEMSET(keys->peerSeq[0].window, 0xFF, DTLS_SEQ_SZ);
  832. for (i = 0; i < wordCount; i++) {
  833. ato32(exp + idx, &keys->peerSeq[0].window[i]);
  834. idx += OPAQUE32_LEN;
  835. }
  836. idx += wordAdj;
  837. /* do prevWindow */
  838. ato16(exp + idx, &wordCount);
  839. idx += OPAQUE16_LEN;
  840. if (wordCount > WOLFSSL_DTLS_WINDOW_WORDS) {
  841. wordCount = WOLFSSL_DTLS_WINDOW_WORDS;
  842. wordAdj = (WOLFSSL_DTLS_WINDOW_WORDS - wordCount) * sizeof(word32);
  843. }
  844. XMEMSET(keys->peerSeq[0].prevWindow, 0xFF, DTLS_SEQ_SZ);
  845. for (i = 0; i < wordCount; i++) {
  846. ato32(exp + idx, &keys->peerSeq[0].prevWindow[i]);
  847. idx += OPAQUE32_LEN;
  848. }
  849. idx += wordAdj;
  850. }
  851. #endif
  852. #ifdef HAVE_TRUNCATED_HMAC
  853. ssl->truncated_hmac = exp[idx++];
  854. #else
  855. idx++; /* no truncated hmac */
  856. #endif
  857. sz = exp[idx++];
  858. #ifndef WOLFSSL_AEAD_ONLY
  859. if (sz > sizeof(keys->client_write_MAC_secret) || (sz * 2) + idx > len) {
  860. WOLFSSL_MSG("Buffer not large enough for MAC import");
  861. return BUFFER_E;
  862. }
  863. if (sz > 0) {
  864. XMEMCPY(keys->client_write_MAC_secret, exp + idx, sz); idx += sz;
  865. XMEMCPY(keys->server_write_MAC_secret, exp + idx, sz); idx += sz;
  866. }
  867. #else
  868. if (sz + idx > len) {
  869. return BUFFER_E;
  870. }
  871. idx += sz; idx += sz;
  872. #endif
  873. sz = exp[idx++];
  874. if (sz > sizeof(keys->client_write_key) || (sz * 2) + idx > len) {
  875. WOLFSSL_MSG("Buffer not large enough for key import");
  876. return BUFFER_E;
  877. }
  878. if (sz > 0) {
  879. XMEMCPY(keys->client_write_key, exp + idx, sz); idx += sz;
  880. XMEMCPY(keys->server_write_key, exp + idx, sz); idx += sz;
  881. }
  882. sz = exp[idx++];
  883. if (sz > sizeof(keys->client_write_IV) || (sz * 2) + idx > len) {
  884. WOLFSSL_MSG("Buffer not large enough for write IV import");
  885. return BUFFER_E;
  886. }
  887. if (sz > 0) {
  888. XMEMCPY(keys->client_write_IV, exp + idx, sz); idx += sz;
  889. XMEMCPY(keys->server_write_IV, exp + idx, sz); idx += sz;
  890. }
  891. XMEMCPY(keys->aead_exp_IV, exp + idx, AEAD_MAX_EXP_SZ);
  892. idx += AEAD_MAX_EXP_SZ;
  893. sz = exp[idx++];
  894. if (sz > sizeof(keys->aead_enc_imp_IV) || (sz * 2) + idx > len) {
  895. WOLFSSL_MSG("Buffer not large enough for imp IV import");
  896. return BUFFER_E;
  897. }
  898. if (sz > 0) {
  899. XMEMCPY(keys->aead_enc_imp_IV, exp + idx, sz); idx += sz;
  900. XMEMCPY(keys->aead_dec_imp_IV, exp + idx, sz); idx += sz;
  901. }
  902. WOLFSSL_LEAVE("ImportKeyState", idx);
  903. (void)ver;
  904. (void)type;
  905. return idx;
  906. }
  907. /* copy over necessary information from Options struct to buffer
  908. * On success returns size of buffer used on failure returns a negative value */
  909. static int ExportOptions(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
  910. int type)
  911. {
  912. int idx = 0;
  913. word16 zero = 0;
  914. Options *options;
  915. WOLFSSL_ENTER("ExportOptions");
  916. if (ssl == NULL || exp == NULL || len < DTLS_EXPORT_OPT_SZ) {
  917. return BAD_FUNC_ARG;
  918. }
  919. options = &ssl->options;
  920. if (options == NULL) {
  921. return BAD_FUNC_ARG;
  922. }
  923. XMEMSET(exp, 0, DTLS_EXPORT_OPT_SZ);
  924. /* these options are kept and sent to indicate verify status and strength
  925. * of handshake */
  926. exp[idx++] = options->sendVerify;
  927. exp[idx++] = options->verifyPeer;
  928. exp[idx++] = options->verifyNone;
  929. exp[idx++] = options->downgrade;
  930. #ifndef NO_DH
  931. c16toa(options->minDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  932. c16toa(options->maxDhKeySz, exp + idx); idx += OPAQUE16_LEN;
  933. c16toa(options->dhKeySz, exp + idx); idx += OPAQUE16_LEN;
  934. #else
  935. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  936. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  937. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  938. #endif
  939. #ifndef NO_RSA
  940. c16toa((word16)(options->minRsaKeySz), exp + idx); idx += OPAQUE16_LEN;
  941. #else
  942. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  943. #endif
  944. #ifdef HAVE_ECC
  945. c16toa((word16)(options->minEccKeySz), exp + idx); idx += OPAQUE16_LEN;
  946. #else
  947. c16toa(zero, exp + idx); idx += OPAQUE16_LEN;
  948. #endif
  949. /* these options are kept to indicate state and behavior */
  950. #ifndef NO_PSK
  951. exp[idx++] = options->havePSK;
  952. #else
  953. exp[idx++] = 0;
  954. #endif
  955. exp[idx++] = options->sessionCacheOff;
  956. exp[idx++] = options->sessionCacheFlushOff;
  957. exp[idx++] = options->side;
  958. exp[idx++] = options->resuming;
  959. exp[idx++] = options->haveSessionId;
  960. exp[idx++] = options->tls;
  961. exp[idx++] = options->tls1_1;
  962. exp[idx++] = options->dtls;
  963. exp[idx++] = options->connReset;
  964. exp[idx++] = options->isClosed;
  965. exp[idx++] = options->closeNotify;
  966. exp[idx++] = options->sentNotify;
  967. exp[idx++] = options->usingCompression;
  968. exp[idx++] = options->haveRSA;
  969. exp[idx++] = options->haveECC;
  970. exp[idx++] = options->haveDH;
  971. exp[idx++] = 0; /* Historical: haveNTRU */
  972. exp[idx++] = 0; /* Historical: haveQSH */
  973. exp[idx++] = options->haveECDSAsig;
  974. exp[idx++] = options->haveStaticECC;
  975. exp[idx++] = options->havePeerVerify;
  976. exp[idx++] = options->usingPSK_cipher;
  977. exp[idx++] = options->usingAnon_cipher;
  978. exp[idx++] = options->sendAlertState;
  979. exp[idx++] = options->partialWrite;
  980. exp[idx++] = options->quietShutdown;
  981. exp[idx++] = options->groupMessages;
  982. #ifdef HAVE_POLY1305
  983. exp[idx++] = options->oldPoly;
  984. #else
  985. exp[idx++] = 0;
  986. #endif
  987. #ifdef HAVE_ANON
  988. exp[idx++] = options->haveAnon;
  989. #else
  990. exp[idx++] = 0;
  991. #endif
  992. #ifdef HAVE_SESSION_TICKET
  993. exp[idx++] = options->createTicket;
  994. exp[idx++] = options->useTicket;
  995. exp[idx++] = options->noTicketTls12;
  996. #ifdef WOLFSSL_TLS13
  997. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  998. exp[idx++] = options->noTicketTls13;
  999. }
  1000. #else
  1001. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1002. exp[idx++] = 0;
  1003. }
  1004. #endif
  1005. #else
  1006. exp[idx++] = 0;
  1007. exp[idx++] = 0;
  1008. exp[idx++] = 0;
  1009. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1010. exp[idx++] = 0;
  1011. }
  1012. #endif
  1013. exp[idx++] = options->processReply;
  1014. exp[idx++] = options->cipherSuite0;
  1015. exp[idx++] = options->cipherSuite;
  1016. exp[idx++] = options->serverState;
  1017. exp[idx++] = options->clientState;
  1018. exp[idx++] = options->handShakeState;
  1019. exp[idx++] = options->handShakeDone;
  1020. exp[idx++] = options->minDowngrade;
  1021. exp[idx++] = options->connectState;
  1022. exp[idx++] = options->acceptState;
  1023. exp[idx++] = options->asyncState;
  1024. if (type == WOLFSSL_EXPORT_TLS) {
  1025. #ifdef HAVE_ENCRYPT_THEN_MAC
  1026. exp[idx++] = options->disallowEncThenMac;
  1027. exp[idx++] = options->encThenMac;
  1028. exp[idx++] = options->startedETMRead;
  1029. exp[idx++] = options->startedETMWrite;
  1030. #else
  1031. exp[idx++] = 0;
  1032. exp[idx++] = 0;
  1033. exp[idx++] = 0;
  1034. exp[idx++] = 0;
  1035. #endif
  1036. }
  1037. /* version of connection */
  1038. exp[idx++] = ssl->version.major;
  1039. exp[idx++] = ssl->version.minor;
  1040. (void)zero;
  1041. /* check if changes were made and notify of need to update export version */
  1042. switch (ver) {
  1043. case WOLFSSL_EXPORT_VERSION_3:
  1044. if (idx != DTLS_EXPORT_OPT_SZ_3) {
  1045. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1046. return DTLS_EXPORT_VER_E;
  1047. }
  1048. break;
  1049. case WOLFSSL_EXPORT_VERSION:
  1050. if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) {
  1051. WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
  1052. return DTLS_EXPORT_VER_E;
  1053. }
  1054. break;
  1055. default:
  1056. WOLFSSL_MSG("New version case needs added to wolfSSL export");
  1057. return DTLS_EXPORT_VER_E;
  1058. }
  1059. WOLFSSL_LEAVE("ExportOptions", idx);
  1060. (void)type;
  1061. return idx;
  1062. }
  1063. /* copy items from Export struct to Options struct
  1064. * On success returns size of buffer used on failure returns a negative value */
  1065. static int ImportOptions(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
  1066. int type)
  1067. {
  1068. int idx = 0;
  1069. Options* options = &ssl->options;
  1070. switch (ver) {
  1071. case WOLFSSL_EXPORT_VERSION:
  1072. if (len < DTLS_EXPORT_OPT_SZ) {
  1073. WOLFSSL_MSG("Sanity check on buffer size failed");
  1074. return BAD_FUNC_ARG;
  1075. }
  1076. break;
  1077. case WOLFSSL_EXPORT_VERSION_3:
  1078. if (len < DTLS_EXPORT_OPT_SZ_3) {
  1079. WOLFSSL_MSG("Sanity check on buffer size failed");
  1080. return BAD_FUNC_ARG;
  1081. }
  1082. break;
  1083. default:
  1084. WOLFSSL_MSG("Export version not supported");
  1085. return BAD_FUNC_ARG;
  1086. }
  1087. if (exp == NULL || options == NULL) {
  1088. return BAD_FUNC_ARG;
  1089. }
  1090. /* these options are kept and sent to indicate verify status and strength
  1091. * of handshake */
  1092. options->sendVerify = exp[idx++];
  1093. options->verifyPeer = exp[idx++];
  1094. options->verifyNone = exp[idx++];
  1095. options->downgrade = exp[idx++];
  1096. #ifndef NO_DH
  1097. ato16(exp + idx, &(options->minDhKeySz)); idx += OPAQUE16_LEN;
  1098. ato16(exp + idx, &(options->maxDhKeySz)); idx += OPAQUE16_LEN;
  1099. ato16(exp + idx, &(options->dhKeySz)); idx += OPAQUE16_LEN;
  1100. #else
  1101. idx += OPAQUE16_LEN;
  1102. idx += OPAQUE16_LEN;
  1103. idx += OPAQUE16_LEN;
  1104. #endif
  1105. #ifndef NO_RSA
  1106. ato16(exp + idx, (word16*)&(options->minRsaKeySz)); idx += OPAQUE16_LEN;
  1107. #else
  1108. idx += OPAQUE16_LEN;
  1109. #endif
  1110. #ifdef HAVE_ECC
  1111. ato16(exp + idx, (word16*)&(options->minEccKeySz)); idx += OPAQUE16_LEN;
  1112. #else
  1113. idx += OPAQUE16_LEN;
  1114. #endif
  1115. /* these options are kept to indicate state and behavior */
  1116. #ifndef NO_PSK
  1117. options->havePSK = exp[idx++];
  1118. #else
  1119. idx++;
  1120. #endif
  1121. options->sessionCacheOff = exp[idx++];
  1122. options->sessionCacheFlushOff = exp[idx++];
  1123. options->side = exp[idx++];
  1124. options->resuming = exp[idx++];
  1125. options->haveSessionId = exp[idx++];
  1126. options->tls = exp[idx++];
  1127. options->tls1_1 = exp[idx++];
  1128. options->dtls = exp[idx++];
  1129. options->connReset = exp[idx++];
  1130. options->isClosed = exp[idx++];
  1131. options->closeNotify = exp[idx++];
  1132. options->sentNotify = exp[idx++];
  1133. options->usingCompression = exp[idx++];
  1134. options->haveRSA = exp[idx++];
  1135. options->haveECC = exp[idx++];
  1136. options->haveDH = exp[idx++];
  1137. idx++; /* Historical: haveNTRU */
  1138. idx++; /* Historical: haveQSH */
  1139. options->haveECDSAsig = exp[idx++];
  1140. options->haveStaticECC = exp[idx++];
  1141. options->havePeerVerify = exp[idx++];
  1142. options->usingPSK_cipher = exp[idx++];
  1143. options->usingAnon_cipher = exp[idx++];
  1144. options->sendAlertState = exp[idx++];
  1145. options->partialWrite = exp[idx++];
  1146. options->quietShutdown = exp[idx++];
  1147. options->groupMessages = exp[idx++];
  1148. #ifdef HAVE_POLY1305
  1149. options->oldPoly = exp[idx++]; /* set when to use old rfc way of poly*/
  1150. #else
  1151. idx++;
  1152. #endif
  1153. #ifdef HAVE_ANON
  1154. options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */
  1155. #else
  1156. idx++;
  1157. #endif
  1158. #ifdef HAVE_SESSION_TICKET
  1159. options->createTicket = exp[idx++]; /* Server to create new Ticket */
  1160. options->useTicket = exp[idx++]; /* Use Ticket not session cache */
  1161. options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
  1162. #ifdef WOLFSSL_TLS13
  1163. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1164. options->noTicketTls13 = exp[idx++];/* Server won't create new Ticket */
  1165. }
  1166. #else
  1167. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1168. idx++;
  1169. }
  1170. #endif
  1171. #else
  1172. idx++;
  1173. idx++;
  1174. idx++;
  1175. if (ver > WOLFSSL_EXPORT_VERSION_3) {
  1176. idx++;
  1177. }
  1178. #endif
  1179. options->processReply = exp[idx++];
  1180. options->cipherSuite0 = exp[idx++];
  1181. options->cipherSuite = exp[idx++];
  1182. options->serverState = exp[idx++];
  1183. options->clientState = exp[idx++];
  1184. options->handShakeState = exp[idx++];
  1185. options->handShakeDone = exp[idx++];
  1186. options->minDowngrade = exp[idx++];
  1187. options->connectState = exp[idx++];
  1188. options->acceptState = exp[idx++];
  1189. options->asyncState = exp[idx++];
  1190. if (type == WOLFSSL_EXPORT_TLS) {
  1191. #ifdef HAVE_ENCRYPT_THEN_MAC
  1192. options->disallowEncThenMac = exp[idx++];
  1193. options->encThenMac = exp[idx++];
  1194. options->startedETMRead = exp[idx++];
  1195. options->startedETMWrite = exp[idx++];
  1196. #else
  1197. idx++;
  1198. idx++;
  1199. idx++;
  1200. idx++;
  1201. #endif
  1202. }
  1203. /* version of connection */
  1204. if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
  1205. WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
  1206. return VERSION_ERROR;
  1207. }
  1208. /* set TLS 1.3 flag in options if this was a TLS 1.3 connection */
  1209. if (ssl->version.major == SSLv3_MAJOR &&
  1210. ssl->version.minor == TLSv1_3_MINOR) {
  1211. options->tls1_3 = 1;
  1212. }
  1213. return idx;
  1214. }
  1215. #ifndef WOLFSSL_SESSION_EXPORT_NOPEER
  1216. static int ExportPeerInfo(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
  1217. {
  1218. int idx = 0;
  1219. int ipSz = MAX_EXPORT_IP; /* start as max size */
  1220. int fam = 0;
  1221. word16 port = 0;
  1222. char ip[MAX_EXPORT_IP];
  1223. if (ver != WOLFSSL_EXPORT_VERSION) {
  1224. WOLFSSL_MSG("Export version not supported");
  1225. return BAD_FUNC_ARG;
  1226. }
  1227. if (ssl == NULL || exp == NULL ||
  1228. len < (sizeof(ip) + 3 * WOLFSSL_EXPORT_LEN)) {
  1229. return BAD_FUNC_ARG;
  1230. }
  1231. if (ssl->ctx->CBGetPeer == NULL) {
  1232. WOLFSSL_MSG("No get peer call back set");
  1233. return BAD_FUNC_ARG;
  1234. }
  1235. if (ssl->ctx->CBGetPeer(ssl, ip, &ipSz, &port, &fam) != WOLFSSL_SUCCESS) {
  1236. WOLFSSL_MSG("Get peer callback error");
  1237. return SOCKET_ERROR_E;
  1238. }
  1239. /* check that ipSz/fam is not negative or too large since user can set cb */
  1240. if (ipSz < 0 || ipSz > MAX_EXPORT_IP || fam < 0) {
  1241. WOLFSSL_MSG("Bad ipSz or fam returned from get peer callback");
  1242. return SOCKET_ERROR_E;
  1243. }
  1244. c16toa((word16)fam, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1245. c16toa((word16)ipSz, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1246. XMEMCPY(exp + idx, ip, ipSz); idx += ipSz;
  1247. c16toa(port, exp + idx); idx += WOLFSSL_EXPORT_LEN;
  1248. return idx;
  1249. }
  1250. #endif /* !WOLFSSL_SESSION_EXPORT_NOPEER */
  1251. static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
  1252. {
  1253. word16 idx = 0;
  1254. word16 ipSz;
  1255. word16 fam;
  1256. word16 port;
  1257. char ip[MAX_EXPORT_IP];
  1258. if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_3) {
  1259. WOLFSSL_MSG("Export version not supported");
  1260. return BAD_FUNC_ARG;
  1261. }
  1262. if (len == 0) {
  1263. WOLFSSL_MSG("No peer info sent");
  1264. return 0;
  1265. }
  1266. if (ssl == NULL || buf == NULL || len < 3 * WOLFSSL_EXPORT_LEN) {
  1267. return BAD_FUNC_ARG;
  1268. }
  1269. /* import sin family */
  1270. ato16(buf + idx, &fam); idx += WOLFSSL_EXPORT_LEN;
  1271. /* import ip address idx, and ipSz are unsigned but cast for enum */
  1272. ato16(buf + idx, &ipSz); idx += WOLFSSL_EXPORT_LEN;
  1273. if (ipSz >= sizeof(ip) || (word16)(idx + ipSz + WOLFSSL_EXPORT_LEN) > len) {
  1274. return BUFFER_E;
  1275. }
  1276. XMEMSET(ip, 0, sizeof(ip));
  1277. XMEMCPY(ip, buf + idx, ipSz); idx += ipSz;
  1278. ip[ipSz] = '\0'; /* with check that ipSz less than ip this is valid */
  1279. ato16(buf + idx, &port); idx += WOLFSSL_EXPORT_LEN;
  1280. /* sanity check for a function to call, then use it to import peer info */
  1281. if (ssl->ctx->CBSetPeer == NULL) {
  1282. WOLFSSL_MSG("No set peer function");
  1283. return BAD_FUNC_ARG;
  1284. }
  1285. if (ssl->ctx->CBSetPeer(ssl, ip, ipSz, port, fam) != WOLFSSL_SUCCESS) {
  1286. WOLFSSL_MSG("Error setting peer info");
  1287. return SOCKET_ERROR_E;
  1288. }
  1289. return idx;
  1290. }
  1291. #ifdef WOLFSSL_DTLS
  1292. /* WOLFSSL_LOCAL function that serializes the current WOLFSSL session state only
  1293. * buf is used to hold the serialized WOLFSSL struct and sz is the size of buf
  1294. * passed in.
  1295. * On success returns the size of serialized session state.*/
  1296. int wolfSSL_dtls_export_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
  1297. {
  1298. int ret;
  1299. word32 idx = 0;
  1300. word32 totalLen = 0;
  1301. WOLFSSL_ENTER("wolfSSL_dtls_export_state_internal");
  1302. if (buf == NULL || ssl == NULL) {
  1303. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BAD_FUNC_ARG);
  1304. return BAD_FUNC_ARG;
  1305. }
  1306. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1307. /* each of the following have a 2 byte length before data */
  1308. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_MIN_KEY_SZ;
  1309. if (totalLen > sz) {
  1310. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", BUFFER_E);
  1311. return BUFFER_E;
  1312. }
  1313. buf[idx++] = (byte)DTLS_EXPORT_STATE_PRO;
  1314. buf[idx++] = ((byte)DTLS_EXPORT_STATE_PRO & 0xF0) |
  1315. ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1316. idx += WOLFSSL_EXPORT_LEN; /* leave room for total length */
  1317. /* export keys struct and dtls state -- variable length stored in ret */
  1318. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1319. if ((ret = ExportKeyState(ssl, buf + idx, sz - idx,
  1320. WOLFSSL_EXPORT_VERSION, 1, WOLFSSL_EXPORT_DTLS)) < 0) {
  1321. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", ret);
  1322. return ret;
  1323. }
  1324. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1325. /* place total length of exported buffer minus 2 bytes protocol/version */
  1326. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1327. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1328. /* if compiled with debug options then print the version, protocol, size */
  1329. {
  1330. char debug[256];
  1331. XSNPRINTF(debug, sizeof(debug), "Exporting DTLS session state\n"
  1332. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1333. , (int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1334. WOLFSSL_MSG(debug);
  1335. }
  1336. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1337. WOLFSSL_LEAVE("wolfSSL_dtls_export_state_internal", idx);
  1338. return idx;
  1339. }
  1340. /* On success return amount of buffer consumed */
  1341. int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
  1342. {
  1343. word32 idx = 0;
  1344. word16 length = 0;
  1345. int version;
  1346. int ret;
  1347. WOLFSSL_ENTER("wolfSSL_dtls_import_state_internal");
  1348. /* check at least enough room for protocol and length */
  1349. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1350. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", BAD_FUNC_ARG);
  1351. return BAD_FUNC_ARG;
  1352. }
  1353. if (buf[idx++] != (byte)DTLS_EXPORT_STATE_PRO ||
  1354. (buf[idx] & 0xF0) != ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1355. WOLFSSL_MSG("Incorrect protocol");
  1356. return BAD_FUNC_ARG;
  1357. }
  1358. version = buf[idx++] & 0x0F;
  1359. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1360. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1361. WOLFSSL_MSG("Buffer size sanity check failed");
  1362. return BUFFER_E;
  1363. }
  1364. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1365. /* if compiled with debug options then print the version, protocol, size */
  1366. {
  1367. char debug[256];
  1368. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session state\n"
  1369. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1370. , (int)version, buf[0], (buf[1] >> 4), length);
  1371. WOLFSSL_MSG(debug);
  1372. }
  1373. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1374. /* perform sanity checks and extract Options information used */
  1375. switch (version) {
  1376. case WOLFSSL_EXPORT_VERSION:
  1377. break;
  1378. default:
  1379. WOLFSSL_MSG("Bad export state version");
  1380. return BAD_FUNC_ARG;
  1381. }
  1382. /* perform sanity checks and extract Keys struct */
  1383. if (WOLFSSL_EXPORT_LEN + idx > sz) {
  1384. WOLFSSL_MSG("Import Key struct error");
  1385. return BUFFER_E;
  1386. }
  1387. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1388. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1389. WOLFSSL_MSG("Import Key struct error");
  1390. return BUFFER_E;
  1391. }
  1392. if ((ret = ImportKeyState(ssl, buf + idx, length, version,
  1393. WOLFSSL_EXPORT_DTLS)) < 0) {
  1394. WOLFSSL_MSG("Import Key struct error");
  1395. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1396. return ret;
  1397. }
  1398. idx += ret;
  1399. WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
  1400. return idx;
  1401. }
  1402. #endif /* WOLFSSL_DTLS */
  1403. /**
  1404. * Imports a serialized buffer (both TLS and DTLS)
  1405. *
  1406. * @param ssl WOLFSSL structure to import into
  1407. * @param buf buffer containing serialized session
  1408. * @param sz size of buffer 'buf'
  1409. * @param type flag for TLS or DTLS
  1410. *
  1411. * @return the size of serialized buffer on success
  1412. */
  1413. int wolfSSL_session_import_internal(WOLFSSL* ssl, const unsigned char* buf,
  1414. unsigned int sz, int type)
  1415. {
  1416. word32 idx = 0;
  1417. word16 length = 0;
  1418. int version = 0;
  1419. int ret = 0;
  1420. int optSz = 0;
  1421. int rc;
  1422. byte validProto = 0; /* did we find a valid protocol */
  1423. WOLFSSL_ENTER("wolfSSL_session_import_internal");
  1424. /* check at least enough room for protocol and length */
  1425. if (sz < WOLFSSL_EXPORT_LEN * 2 || ssl == NULL) {
  1426. ret = BAD_FUNC_ARG;
  1427. }
  1428. /* Check if is TLS export protocol */
  1429. if (ret == 0) {
  1430. if (buf[idx] == (byte)TLS_EXPORT_PRO &&
  1431. (buf[idx + 1] & 0xF0) == ((byte)TLS_EXPORT_PRO & 0xF0)) {
  1432. validProto = 1;
  1433. }
  1434. /* Check if is DTLS export protocol */
  1435. if (buf[idx] == (byte)DTLS_EXPORT_PRO &&
  1436. (buf[idx + 1] & 0xF0) == ((byte)DTLS_EXPORT_PRO & 0xF0)) {
  1437. validProto = 1;
  1438. }
  1439. if (validProto == 0) {
  1440. #ifdef WOLFSSL_DTLS
  1441. /* check if importing state only */
  1442. return wolfSSL_dtls_import_state_internal(ssl, buf, sz);
  1443. #else
  1444. WOLFSSL_MSG("Invalid serialized session protocol value");
  1445. ret = BAD_FUNC_ARG;
  1446. #endif
  1447. }
  1448. idx += 1;
  1449. }
  1450. if (ret == 0) {
  1451. version = buf[idx++] & 0x0F;
  1452. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1453. if (length > sz - WOLFSSL_EXPORT_LEN) { /* subtract 2 for protocol */
  1454. ret = BUFFER_E;
  1455. }
  1456. }
  1457. /* if compiled with debug options then print the version, protocol, size */
  1458. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1459. {
  1460. char debug[256];
  1461. XSNPRINTF(debug, sizeof(debug), "Importing DTLS session\n"
  1462. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1463. , (int)version, buf[0], (buf[1] >> 4), length);
  1464. WOLFSSL_MSG(debug);
  1465. }
  1466. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1467. /* perform sanity checks and extract Options information used */
  1468. if (ret == 0) {
  1469. switch (version) {
  1470. case WOLFSSL_EXPORT_VERSION:
  1471. if (type == WOLFSSL_EXPORT_DTLS) {
  1472. optSz = DTLS_EXPORT_OPT_SZ;
  1473. }
  1474. else {
  1475. optSz = TLS_EXPORT_OPT_SZ;
  1476. }
  1477. break;
  1478. case WOLFSSL_EXPORT_VERSION_3:
  1479. WOLFSSL_MSG("Importing older version 3");
  1480. optSz = DTLS_EXPORT_OPT_SZ_3;
  1481. break;
  1482. default:
  1483. WOLFSSL_MSG("Bad export version");
  1484. ret = BAD_FUNC_ARG;
  1485. }
  1486. }
  1487. if (ret == 0 && (WOLFSSL_EXPORT_LEN + optSz + idx > sz)) {
  1488. WOLFSSL_MSG("Import Options struct error");
  1489. ret = BUFFER_E;
  1490. }
  1491. if (ret == 0) {
  1492. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1493. if (length != optSz) {
  1494. WOLFSSL_MSG("Import Options struct error");
  1495. ret = BUFFER_E;
  1496. }
  1497. }
  1498. if (ret == 0) {
  1499. rc = ImportOptions(ssl, buf + idx, length, version, type);
  1500. if (rc < 0) {
  1501. WOLFSSL_MSG("Import Options struct error");
  1502. ret = rc;
  1503. }
  1504. else {
  1505. idx += length;
  1506. }
  1507. }
  1508. /* perform sanity checks and extract Keys struct */
  1509. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1510. WOLFSSL_MSG("Import Key struct error");
  1511. ret = BUFFER_E;
  1512. }
  1513. if (ret == 0) {
  1514. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1515. if (length > DTLS_EXPORT_KEY_SZ || length + idx > sz) {
  1516. WOLFSSL_MSG("Import Key struct error");
  1517. ret = BUFFER_E;
  1518. }
  1519. }
  1520. if (ret == 0) {
  1521. rc = ImportKeyState(ssl, buf + idx, length, version, type);
  1522. if (rc < 0) {
  1523. WOLFSSL_MSG("Import Key struct error");
  1524. ret = rc;
  1525. }
  1526. else {
  1527. idx += rc;
  1528. }
  1529. }
  1530. /* perform sanity checks and extract CipherSpecs struct */
  1531. if (ret == 0 && (WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ + idx > sz)) {
  1532. WOLFSSL_MSG("Import CipherSpecs struct error");
  1533. ret = BUFFER_E;
  1534. }
  1535. if (ret == 0) {
  1536. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1537. if (length != WOLFSSL_EXPORT_SPC_SZ) {
  1538. WOLFSSL_MSG("Import CipherSpecs struct error");
  1539. ret = BUFFER_E;
  1540. }
  1541. }
  1542. if (ret == 0) {
  1543. rc = ImportCipherSpecState(ssl, buf + idx, length, version, type);
  1544. if (rc < 0) {
  1545. WOLFSSL_MSG("Import CipherSpecs struct error");
  1546. ret = rc;
  1547. }
  1548. else {
  1549. idx += rc;
  1550. }
  1551. }
  1552. /* perform sanity checks and extract DTLS peer info */
  1553. if (ret == 0 && (WOLFSSL_EXPORT_LEN + idx > sz)) {
  1554. WOLFSSL_MSG("Import DTLS peer info error");
  1555. ret = BUFFER_E;
  1556. }
  1557. if (ret == 0) {
  1558. ato16(buf + idx, &length); idx += WOLFSSL_EXPORT_LEN;
  1559. if (idx + length > sz) {
  1560. WOLFSSL_MSG("Import DTLS peer info error");
  1561. ret = BUFFER_E;
  1562. }
  1563. }
  1564. if (ret == 0) {
  1565. rc = ImportPeerInfo(ssl, buf + idx, length, version);
  1566. if (rc < 0) {
  1567. WOLFSSL_MSG("Import Peer Addr error");
  1568. ret = rc;
  1569. }
  1570. else {
  1571. idx += rc;
  1572. }
  1573. }
  1574. /* make sure is a valid suite used */
  1575. if (ret == 0 && wolfSSL_get_cipher(ssl) == NULL) {
  1576. WOLFSSL_MSG("Can not match cipher suite imported");
  1577. ret = MATCH_SUITE_ERROR;
  1578. }
  1579. #ifndef WOLFSSL_AEAD_ONLY
  1580. /* set hmac function to use when verifying */
  1581. if (ret == 0 && (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
  1582. ssl->options.dtls == 1)) {
  1583. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  1584. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  1585. ssl->hmac = TLS_hmac;
  1586. #else
  1587. ssl->hmac = Renesas_cmn_TLS_hmac;
  1588. #endif
  1589. }
  1590. /* do not allow stream ciphers with DTLS, except for NULL cipher */
  1591. if (ret == 0 && ssl->specs.cipher_type == stream &&
  1592. ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) {
  1593. WOLFSSL_MSG("Can not import stream ciphers for DTLS");
  1594. ret = SANITY_CIPHER_E;
  1595. }
  1596. #endif /* !WOLFSSL_AEAD_ONLY */
  1597. if (ret != 0) {
  1598. idx = ret;
  1599. }
  1600. WOLFSSL_LEAVE("wolfSSL_session_import_internal", idx);
  1601. return idx;
  1602. }
  1603. /**
  1604. * Handles serializing the session information.
  1605. *
  1606. * @param ssl WOLFSSL structure to serialize session from
  1607. * @param buf output buffer to hold serialized session
  1608. * @param sz the size of buffer 'buf', if too small then gets updated
  1609. * @param type if the input WOLFSSL structure is expected to be TLS or DTLS
  1610. * 1 for yes is TLS and 0 for no is DTLS
  1611. *
  1612. * @return the size of serialized buffer on success and negative values on fail
  1613. */
  1614. int wolfSSL_session_export_internal(WOLFSSL* ssl, byte* buf, word32* sz,
  1615. int type)
  1616. {
  1617. int ret = 0;
  1618. word32 idx = 0;
  1619. word32 totalLen = 0;
  1620. WOLFSSL_ENTER("wolfSSL_session_export_internal");
  1621. if (ssl == NULL) {
  1622. WOLFSSL_MSG("unexpected null argument");
  1623. ret = BAD_FUNC_ARG;
  1624. }
  1625. if (ret == 0) {
  1626. totalLen += WOLFSSL_EXPORT_LEN * 2; /* 2 protocol bytes and 2 length bytes */
  1627. /* each of the following have a 2 byte length before data */
  1628. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_OPT_SZ;
  1629. totalLen += WOLFSSL_EXPORT_LEN + DTLS_EXPORT_KEY_SZ;
  1630. totalLen += WOLFSSL_EXPORT_LEN + WOLFSSL_EXPORT_SPC_SZ;
  1631. #ifdef WOLFSSL_DTLS
  1632. if (type == WOLFSSL_EXPORT_DTLS) {
  1633. totalLen += WOLFSSL_EXPORT_LEN + ssl->buffers.dtlsCtx.peer.sz;
  1634. }
  1635. #endif
  1636. }
  1637. /* check is at least the minimum size needed, TLS cipher states add more */
  1638. if (ret == 0 && (totalLen > *sz || buf == NULL)) {
  1639. WOLFSSL_MSG("export buffer was too small or null");
  1640. *sz = totalLen;
  1641. /* possible AES state needed */
  1642. if (type == WOLFSSL_EXPORT_TLS) {
  1643. *sz += AES_BLOCK_SIZE*2;
  1644. }
  1645. ret = LENGTH_ONLY_E;
  1646. }
  1647. if (ret == 0) {
  1648. buf[idx++] = (byte)(type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1649. DTLS_EXPORT_PRO;
  1650. buf[idx++] = ((byte)((type == WOLFSSL_EXPORT_TLS)? TLS_EXPORT_PRO :
  1651. DTLS_EXPORT_PRO) & 0xF0)
  1652. | ((byte)WOLFSSL_EXPORT_VERSION & 0X0F);
  1653. idx += WOLFSSL_EXPORT_LEN; /* leave spot for length of total buffer */
  1654. idx += WOLFSSL_EXPORT_LEN;
  1655. ret = ExportOptions(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1656. type);
  1657. if (ret >= 0) {
  1658. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1659. idx += ret;
  1660. ret = 0;
  1661. }
  1662. }
  1663. /* export keys struct and dtls state -- variable length stored in ret */
  1664. if (ret == 0) {
  1665. idx += WOLFSSL_EXPORT_LEN; /* leave room for length */
  1666. ret = ExportKeyState(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION,
  1667. 0, type);
  1668. if (ret >= 0) {
  1669. c16toa((word16)ret, buf + idx - WOLFSSL_EXPORT_LEN); idx += ret;
  1670. ret = 0;
  1671. }
  1672. }
  1673. /* export of cipher specs struct */
  1674. if (ret == 0) {
  1675. c16toa((word16)WOLFSSL_EXPORT_SPC_SZ, buf + idx);
  1676. idx += WOLFSSL_EXPORT_LEN;
  1677. ret = ExportCipherSpecState(ssl, buf + idx, *sz - idx,
  1678. WOLFSSL_EXPORT_VERSION, type);
  1679. if (ret >= 0) {
  1680. idx += ret;
  1681. ret = 0;
  1682. }
  1683. }
  1684. /* export of peer information */
  1685. if (ret == 0) {
  1686. idx += WOLFSSL_EXPORT_LEN;
  1687. #ifdef WOLFSSL_SESSION_EXPORT_NOPEER
  1688. ret = 0; /* not saving peer port/ip information */
  1689. #else
  1690. ret = ExportPeerInfo(ssl, buf + idx, *sz - idx, WOLFSSL_EXPORT_VERSION);
  1691. #endif
  1692. if (ret >= 0) {
  1693. c16toa(ret, buf + idx - WOLFSSL_EXPORT_LEN);
  1694. idx += ret;
  1695. ret = 0;
  1696. }
  1697. }
  1698. if (ret != 0 && buf != NULL) {
  1699. /*in a fail case clear the buffer which could contain partial key info*/
  1700. XMEMSET(buf, 0, *sz);
  1701. }
  1702. /* place total length of exported buffer minus 2 bytes protocol/version */
  1703. if (ret == 0) {
  1704. c16toa((word16)(idx - WOLFSSL_EXPORT_LEN), buf + WOLFSSL_EXPORT_LEN);
  1705. ret = idx;
  1706. #ifdef WOLFSSL_SESSION_EXPORT_DEBUG
  1707. {
  1708. char debug[256];
  1709. XSNPRINTF(debug, sizeof(debug), "Exporting TLS session\n"
  1710. "\tVersion : %d\n\tProtocol : %02X%01X\n\tLength of: %d\n\n"
  1711. ,(int)WOLFSSL_EXPORT_VERSION, buf[0], (buf[1] >> 4), idx - 2);
  1712. WOLFSSL_MSG(debug);
  1713. }
  1714. #endif /* WOLFSSL_SESSION_EXPORT_DEBUG */
  1715. }
  1716. if (ret >= 0) {
  1717. *sz = ret;
  1718. }
  1719. WOLFSSL_LEAVE("wolfSSL_session_export_internal", ret);
  1720. return ret;
  1721. }
  1722. #endif /* WOLFSSL_SESSION_EXPORT */
  1723. void InitSSL_Method(WOLFSSL_METHOD* method, ProtocolVersion pv)
  1724. {
  1725. method->version = pv;
  1726. method->side = WOLFSSL_CLIENT_END;
  1727. method->downgrade = 0;
  1728. }
  1729. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) || \
  1730. defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  1731. int InitSSL_Side(WOLFSSL* ssl, word16 side)
  1732. {
  1733. if (ssl == NULL)
  1734. return BAD_FUNC_ARG;
  1735. /* set side */
  1736. ssl->options.side = side;
  1737. /* reset options that are side specific */
  1738. #ifdef HAVE_ECC
  1739. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1740. ssl->options.haveECDSAsig = 1; /* always on client side */
  1741. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1742. ssl->options.haveStaticECC = 1; /* server can turn on by loading key */
  1743. }
  1744. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1745. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1746. ssl->options.haveECDSAsig = 1; /* always on client side */
  1747. ssl->options.haveECC = 1; /* server turns on with ECC key cert */
  1748. }
  1749. #endif
  1750. #ifdef HAVE_PQC
  1751. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1752. ssl->options.haveFalconSig = 1; /* always on client side */
  1753. }
  1754. #endif
  1755. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1756. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  1757. if ((ssl->ctx->method->version.major == SSLv3_MAJOR) &&
  1758. (ssl->ctx->method->version.minor >= TLSv1_MINOR)) {
  1759. ssl->options.haveEMS = 1;
  1760. }
  1761. #ifdef WOLFSSL_DTLS
  1762. if (ssl->ctx->method->version.major == DTLS_MAJOR)
  1763. ssl->options.haveEMS = 1;
  1764. #endif /* WOLFSSL_DTLS */
  1765. }
  1766. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1767. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  1768. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  1769. int ret;
  1770. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  1771. if (ret != 0) {
  1772. WOLFSSL_MSG("DTLS Cookie Secret error");
  1773. return ret;
  1774. }
  1775. }
  1776. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  1777. return InitSSL_Suites(ssl);
  1778. }
  1779. #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
  1780. /* Initialize SSL context, return 0 on success */
  1781. int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
  1782. {
  1783. int ret = 0;
  1784. XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX));
  1785. ctx->method = method;
  1786. ctx->refCount = 1; /* so either CTX_free or SSL_free can release */
  1787. ctx->heap = ctx; /* defaults to self */
  1788. ctx->timeout = WOLFSSL_SESSION_TIMEOUT;
  1789. ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE; /* current default: TLSv1_MINOR */
  1790. if (wc_InitMutex(&ctx->countMutex) < 0) {
  1791. WOLFSSL_MSG("Mutex error on CTX init");
  1792. ctx->err = CTX_INIT_MUTEX_E;
  1793. return BAD_MUTEX_E;
  1794. }
  1795. #ifndef NO_CERTS
  1796. ctx->privateKeyDevId = INVALID_DEVID;
  1797. #endif
  1798. #ifndef NO_DH
  1799. ctx->minDhKeySz = MIN_DHKEY_SZ;
  1800. ctx->maxDhKeySz = MAX_DHKEY_SZ;
  1801. #endif
  1802. #ifndef NO_RSA
  1803. ctx->minRsaKeySz = MIN_RSAKEY_SZ;
  1804. #endif
  1805. #ifdef HAVE_ECC
  1806. ctx->minEccKeySz = MIN_ECCKEY_SZ;
  1807. ctx->eccTempKeySz = ECDHE_SIZE;
  1808. #endif
  1809. #ifdef HAVE_PQC
  1810. ctx->minFalconKeySz = MIN_FALCONKEY_SZ;
  1811. #endif
  1812. ctx->verifyDepth = MAX_CHAIN_DEPTH;
  1813. #ifdef OPENSSL_EXTRA
  1814. ctx->cbioFlag = WOLFSSL_CBIO_NONE;
  1815. #endif
  1816. #ifdef HAVE_NETX
  1817. ctx->CBIORecv = NetX_Receive;
  1818. ctx->CBIOSend = NetX_Send;
  1819. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  1820. ctx->CBIORecv = Mynewt_Receive;
  1821. ctx->CBIOSend = Mynewt_Send;
  1822. #elif defined WOLFSSL_LWIP_NATIVE
  1823. ctx->CBIORecv = LwIPNativeReceive;
  1824. ctx->CBIOSend = LwIPNativeSend;
  1825. #elif defined(WOLFSSL_GNRC)
  1826. ctx->CBIORecv = GNRC_ReceiveFrom;
  1827. ctx->CBIOSend = GNRC_SendTo;
  1828. #elif defined WOLFSSL_ISOTP
  1829. ctx->CBIORecv = ISOTP_Receive;
  1830. ctx->CBIOSend = ISOTP_Send;
  1831. #elif !defined(WOLFSSL_USER_IO)
  1832. #ifdef MICRIUM
  1833. ctx->CBIORecv = MicriumReceive;
  1834. ctx->CBIOSend = MicriumSend;
  1835. #ifdef WOLFSSL_DTLS
  1836. if (method->version.major == DTLS_MAJOR) {
  1837. ctx->CBIORecv = MicriumReceiveFrom;
  1838. ctx->CBIOSend = MicriumSendTo;
  1839. }
  1840. #ifdef WOLFSSL_SESSION_EXPORT
  1841. #error Micrium port does not support DTLS session export yet
  1842. #endif
  1843. #endif
  1844. #elif defined WOLFSSL_UIP
  1845. ctx->CBIORecv = uIPReceive;
  1846. ctx->CBIOSend = uIPSend;
  1847. #ifdef WOLFSSL_DTLS
  1848. if (method->version.major == DTLS_MAJOR) {
  1849. ctx->CBIOSendTo = uIPSendTo;
  1850. ctx->CBIORecvFrom = uIPRecvFrom;
  1851. }
  1852. #endif
  1853. #else
  1854. ctx->CBIORecv = EmbedReceive;
  1855. ctx->CBIOSend = EmbedSend;
  1856. #ifdef WOLFSSL_SESSION_EXPORT
  1857. ctx->CBGetPeer = EmbedGetPeer;
  1858. ctx->CBSetPeer = EmbedSetPeer;
  1859. #endif
  1860. #ifdef WOLFSSL_DTLS
  1861. if (method->version.major == DTLS_MAJOR) {
  1862. ctx->CBIORecv = EmbedReceiveFrom;
  1863. ctx->CBIOSend = EmbedSendTo;
  1864. }
  1865. #endif
  1866. #endif /* MICRIUM */
  1867. #endif /* WOLFSSL_USER_IO */
  1868. #ifdef HAVE_PQC
  1869. if (method->side == WOLFSSL_CLIENT_END)
  1870. ctx->haveFalconSig = 1; /* always on client side */
  1871. /* server can turn on by loading key */
  1872. #endif
  1873. #ifdef HAVE_ECC
  1874. if (method->side == WOLFSSL_CLIENT_END) {
  1875. ctx->haveECDSAsig = 1; /* always on client side */
  1876. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1877. ctx->haveStaticECC = 1; /* server can turn on by loading key */
  1878. }
  1879. #elif defined(HAVE_ED25519) || defined(HAVE_ED448)
  1880. if (method->side == WOLFSSL_CLIENT_END) {
  1881. ctx->haveECDSAsig = 1; /* always on client side */
  1882. ctx->haveECC = 1; /* server turns on with ECC key cert */
  1883. }
  1884. #endif
  1885. #ifdef WOLFSSL_QNX_CAAM
  1886. /* default to try using CAAM when built */
  1887. ctx->devId = WOLFSSL_CAAM_DEVID;
  1888. #else
  1889. ctx->devId = INVALID_DEVID;
  1890. #endif
  1891. #if defined(WOLFSSL_DTLS)
  1892. #ifdef WOLFSSL_SCTP
  1893. ctx->dtlsMtuSz = MAX_RECORD_SIZE;
  1894. #elif defined(WOLFSSL_DTLS_MTU)
  1895. ctx->dtlsMtuSz = MAX_MTU;
  1896. #endif
  1897. #endif
  1898. #ifndef NO_CERTS
  1899. ctx->cm = wolfSSL_CertManagerNew_ex(heap);
  1900. if (ctx->cm == NULL) {
  1901. WOLFSSL_MSG("Bad Cert Manager New");
  1902. return BAD_CERT_MANAGER_ERROR;
  1903. }
  1904. #ifdef OPENSSL_EXTRA
  1905. /* setup WOLFSSL_X509_STORE */
  1906. ctx->x509_store.cm = ctx->cm;
  1907. /* set pointer back to x509 store */
  1908. ctx->cm->x509_store_p = &ctx->x509_store;
  1909. /* WOLFSSL_X509_VERIFY_PARAM */
  1910. if ((ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  1911. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  1912. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  1913. WOLFSSL_MSG("ctx->param memory error");
  1914. return MEMORY_E;
  1915. }
  1916. XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  1917. /* WOLFSSL_X509_LOOKUP */
  1918. if ((ctx->x509_store.lookup.dirs =
  1919. (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR),
  1920. heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  1921. WOLFSSL_MSG("ctx-x509_store.lookup.dir memory allocation error");
  1922. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  1923. ctx->param = NULL;
  1924. return MEMORY_E;
  1925. }
  1926. XMEMSET(ctx->x509_store.lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR));
  1927. if (wc_InitMutex(&ctx->x509_store.lookup.dirs->lock) != 0) {
  1928. WOLFSSL_MSG("Bad mutex init");
  1929. XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL);
  1930. ctx->param = NULL;
  1931. XFREE(ctx->x509_store.lookup.dirs, heap, DYNAMIC_TYPE_OPENSSL);
  1932. ctx->x509_store.lookup.dirs = NULL;
  1933. return BAD_MUTEX_E;
  1934. }
  1935. #endif
  1936. #endif
  1937. #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT)
  1938. if (method->side == WOLFSSL_CLIENT_END) {
  1939. if ((method->version.major == SSLv3_MAJOR) &&
  1940. (method->version.minor >= TLSv1_MINOR)) {
  1941. ctx->haveEMS = 1;
  1942. }
  1943. #ifdef WOLFSSL_DTLS
  1944. if (method->version.major == DTLS_MAJOR)
  1945. ctx->haveEMS = 1;
  1946. #endif /* WOLFSSL_DTLS */
  1947. }
  1948. #endif /* HAVE_EXTENDED_MASTER && !NO_WOLFSSL_CLIENT */
  1949. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  1950. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  1951. ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
  1952. if (ret != 0) return ret;
  1953. ctx->ticketEncCb = DefTicketEncCb;
  1954. ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
  1955. #endif
  1956. ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
  1957. #if defined(WOLFSSL_TLS13)
  1958. ctx->maxTicketTls13 = 1; /* default to sending a session ticket if compiled
  1959. in */
  1960. #endif
  1961. #endif
  1962. #ifdef WOLFSSL_EARLY_DATA
  1963. ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
  1964. #endif
  1965. #if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
  1966. ctx->noPskDheKe = 1;
  1967. #endif
  1968. #if defined(WOLFSSL_QT) && !defined(NO_PSK)
  1969. /* Qt retrieves supported cipher list at initialization
  1970. * from get_cipher_compat().
  1971. * Qt doesn't allow to use a cipher if it is not in the supported list.
  1972. * Therefore, we need to enable PSK cipher at the beginning.
  1973. */
  1974. ctx->havePSK = 1;
  1975. #endif
  1976. ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */
  1977. #ifdef HAVE_WOLF_EVENT
  1978. ret = wolfEventQueue_Init(&ctx->event_queue);
  1979. #endif /* HAVE_WOLF_EVENT */
  1980. return ret;
  1981. }
  1982. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  1983. void wolfSSL_CRYPTO_cleanup_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data)
  1984. {
  1985. int n_ex_data = (int)(sizeof ex_data->ex_data / sizeof ex_data->ex_data[0]);
  1986. for (--n_ex_data; n_ex_data >= 0; --n_ex_data) {
  1987. if (ex_data->ex_data[n_ex_data] != NULL)
  1988. (void)wolfSSL_CRYPTO_set_ex_data_with_cleanup(ex_data, n_ex_data,
  1989. NULL, NULL);
  1990. }
  1991. }
  1992. #endif /* HAVE_EX_DATA_CLEANUP_HOOKS */
  1993. /* In case contexts are held in array and don't want to free actual ctx. */
  1994. /* The allocations done in InitSSL_Ctx must be free'd with ctx->onHeapHint
  1995. * logic. A WOLFSSL_CTX can be assigned a static memory heap hint using
  1996. * wolfSSL_CTX_load_static_memory after CTX creation, which means variables
  1997. * allocated in InitSSL_Ctx were allocated from heap and should be free'd with
  1998. * a NULL heap hint. */
  1999. void SSL_CtxResourceFree(WOLFSSL_CTX* ctx)
  2000. {
  2001. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && \
  2002. defined(HAVE_TLS_EXTENSIONS) && !defined(NO_WOLFSSL_SERVER)
  2003. int i;
  2004. #endif
  2005. void* heapAtCTXInit = ctx->heap;
  2006. #ifdef WOLFSSL_STATIC_MEMORY
  2007. if (ctx->onHeapHint == 0) {
  2008. heapAtCTXInit = NULL;
  2009. }
  2010. #endif
  2011. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  2012. wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data);
  2013. #endif
  2014. #ifdef HAVE_WOLF_EVENT
  2015. wolfEventQueue_Free(&ctx->event_queue);
  2016. #endif /* HAVE_WOLF_EVENT */
  2017. XFREE(ctx->method, heapAtCTXInit, DYNAMIC_TYPE_METHOD);
  2018. ctx->method = NULL;
  2019. if (ctx->suites) {
  2020. XFREE(ctx->suites, ctx->heap, DYNAMIC_TYPE_SUITES);
  2021. ctx->suites = NULL;
  2022. }
  2023. #ifndef NO_DH
  2024. XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2025. ctx->serverDH_G.buffer = NULL;
  2026. XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  2027. ctx->serverDH_P.buffer = NULL;
  2028. #endif /* !NO_DH */
  2029. #ifdef SINGLE_THREADED
  2030. if (ctx->rng) {
  2031. wc_FreeRng(ctx->rng);
  2032. XFREE(ctx->rng, ctx->heap, DYNAMIC_TYPE_RNG);
  2033. ctx->rng = NULL;
  2034. }
  2035. #endif /* SINGLE_THREADED */
  2036. #ifndef NO_CERTS
  2037. FreeDer(&ctx->privateKey);
  2038. #ifdef OPENSSL_ALL
  2039. wolfSSL_EVP_PKEY_free(ctx->privateKeyPKey);
  2040. #endif
  2041. FreeDer(&ctx->certificate);
  2042. #ifdef KEEP_OUR_CERT
  2043. if (ctx->ourCert && ctx->ownOurCert) {
  2044. wolfSSL_X509_free(ctx->ourCert);
  2045. ctx->ourCert = NULL;
  2046. }
  2047. #endif /* KEEP_OUR_CERT */
  2048. FreeDer(&ctx->certChain);
  2049. wolfSSL_CertManagerFree(ctx->cm);
  2050. ctx->cm = NULL;
  2051. #ifdef OPENSSL_ALL
  2052. if (ctx->x509_store.objs != NULL) {
  2053. wolfSSL_sk_X509_OBJECT_pop_free(ctx->x509_store.objs, NULL);
  2054. ctx->x509_store.objs = NULL;
  2055. }
  2056. #endif
  2057. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
  2058. defined(WOLFSSL_WPAS_SMALL)
  2059. wolfSSL_X509_STORE_free(ctx->x509_store_pt);
  2060. #endif
  2061. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  2062. wolfSSL_sk_X509_NAME_pop_free(ctx->ca_names, NULL);
  2063. ctx->ca_names = NULL;
  2064. #endif
  2065. #ifdef OPENSSL_EXTRA
  2066. if (ctx->x509Chain) {
  2067. wolfSSL_sk_X509_pop_free(ctx->x509Chain, NULL);
  2068. ctx->x509Chain = NULL;
  2069. }
  2070. #endif
  2071. #endif /* !NO_CERTS */
  2072. #ifdef HAVE_TLS_EXTENSIONS
  2073. TLSX_FreeAll(ctx->extensions, ctx->heap);
  2074. #ifndef NO_WOLFSSL_SERVER
  2075. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  2076. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  2077. if (ctx->certOcspRequest) {
  2078. FreeOcspRequest(ctx->certOcspRequest);
  2079. XFREE(ctx->certOcspRequest, ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2080. }
  2081. #endif
  2082. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  2083. for (i = 0; i < MAX_CHAIN_DEPTH; i++) {
  2084. if (ctx->chainOcspRequest[i]) {
  2085. FreeOcspRequest(ctx->chainOcspRequest[i]);
  2086. XFREE(ctx->chainOcspRequest[i], ctx->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  2087. ctx->chainOcspRequest[i] = NULL;
  2088. }
  2089. }
  2090. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  2091. #endif /* !NO_WOLFSSL_SERVER */
  2092. #endif /* HAVE_TLS_EXTENSIONS */
  2093. #ifdef OPENSSL_EXTRA
  2094. if (ctx->alpn_cli_protos) {
  2095. XFREE((void*)ctx->alpn_cli_protos, ctx->heap, DYNAMIC_TYPE_OPENSSL);
  2096. ctx->alpn_cli_protos = NULL;
  2097. }
  2098. if (ctx->param) {
  2099. XFREE(ctx->param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2100. ctx->param = NULL;
  2101. }
  2102. if (ctx->x509_store.lookup.dirs) {
  2103. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  2104. if (ctx->x509_store.lookup.dirs->dir_entry) {
  2105. wolfSSL_sk_BY_DIR_entry_free(ctx->x509_store.lookup.dirs->dir_entry);
  2106. }
  2107. #endif
  2108. wc_FreeMutex(&ctx->x509_store.lookup.dirs->lock);
  2109. XFREE(ctx->x509_store.lookup.dirs, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL);
  2110. }
  2111. #endif
  2112. #ifdef WOLFSSL_STATIC_EPHEMERAL
  2113. #ifndef NO_DH
  2114. FreeDer(&ctx->staticKE.dhKey);
  2115. #endif
  2116. #ifdef HAVE_ECC
  2117. FreeDer(&ctx->staticKE.ecKey);
  2118. #endif
  2119. #ifdef HAVE_CURVE25519
  2120. FreeDer(&ctx->staticKE.x25519Key);
  2121. #endif
  2122. #ifdef HAVE_CURVE448
  2123. FreeDer(&ctx->staticKE.x448Key);
  2124. #endif
  2125. #ifndef SINGLE_THREADED
  2126. if (ctx->staticKELockInit) {
  2127. wc_FreeMutex(&ctx->staticKELock);
  2128. ctx->staticKELockInit = 0;
  2129. }
  2130. #endif
  2131. #endif
  2132. (void)heapAtCTXInit;
  2133. }
  2134. #ifdef WOLFSSL_STATIC_MEMORY
  2135. static void SSL_CtxResourceFreeStaticMem(void* heap)
  2136. {
  2137. if (heap != NULL
  2138. #ifdef WOLFSSL_HEAP_TEST
  2139. /* avoid dereferencing a test value */
  2140. && heap != (void*)WOLFSSL_HEAP_TEST
  2141. #endif
  2142. ) {
  2143. WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)heap;
  2144. WOLFSSL_HEAP* mem = hint->memory;
  2145. wc_FreeMutex(&mem->memory_mutex);
  2146. }
  2147. }
  2148. #endif /* WOLFSSL_STATIC_MEMORY */
  2149. void FreeSSL_Ctx(WOLFSSL_CTX* ctx)
  2150. {
  2151. int refCount;
  2152. void* heap = ctx->heap;
  2153. #ifdef WOLFSSL_STATIC_MEMORY
  2154. if (ctx->onHeapHint == 0) {
  2155. heap = NULL;
  2156. }
  2157. #endif
  2158. /* decrement CTX reference count */
  2159. if ((refCount = SSL_CTX_RefCount(ctx, -1)) < 0) {
  2160. /* check error state, if mutex error code then mutex init failed but
  2161. * CTX was still malloc'd */
  2162. if (ctx->err == CTX_INIT_MUTEX_E) {
  2163. SSL_CtxResourceFree(ctx);
  2164. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2165. #ifdef WOLFSSL_STATIC_MEMORY
  2166. SSL_CtxResourceFreeStaticMem(heap);
  2167. #endif
  2168. }
  2169. return;
  2170. }
  2171. if (refCount == 0) {
  2172. WOLFSSL_MSG("CTX ref count down to 0, doing full free");
  2173. SSL_CtxResourceFree(ctx);
  2174. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
  2175. !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
  2176. TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
  2177. #endif
  2178. wc_FreeMutex(&ctx->countMutex);
  2179. XFREE(ctx, heap, DYNAMIC_TYPE_CTX);
  2180. #ifdef WOLFSSL_STATIC_MEMORY
  2181. SSL_CtxResourceFreeStaticMem(heap);
  2182. #endif
  2183. }
  2184. else {
  2185. WOLFSSL_MSG("CTX ref count not 0 yet, no free");
  2186. }
  2187. (void)heap; /* not used in some builds */
  2188. }
  2189. /* Set cipher pointers to null */
  2190. void InitCiphers(WOLFSSL* ssl)
  2191. {
  2192. #ifdef BUILD_ARC4
  2193. ssl->encrypt.arc4 = NULL;
  2194. ssl->decrypt.arc4 = NULL;
  2195. #endif
  2196. #ifdef BUILD_DES3
  2197. ssl->encrypt.des3 = NULL;
  2198. ssl->decrypt.des3 = NULL;
  2199. #endif
  2200. #ifdef BUILD_AES
  2201. ssl->encrypt.aes = NULL;
  2202. ssl->decrypt.aes = NULL;
  2203. #endif
  2204. #ifdef HAVE_CAMELLIA
  2205. ssl->encrypt.cam = NULL;
  2206. ssl->decrypt.cam = NULL;
  2207. #endif
  2208. #ifdef HAVE_CHACHA
  2209. ssl->encrypt.chacha = NULL;
  2210. ssl->decrypt.chacha = NULL;
  2211. #endif
  2212. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2213. ssl->auth.poly1305 = NULL;
  2214. #endif
  2215. ssl->encrypt.setup = 0;
  2216. ssl->decrypt.setup = 0;
  2217. #ifdef HAVE_ONE_TIME_AUTH
  2218. ssl->auth.setup = 0;
  2219. #endif
  2220. }
  2221. /* Free ciphers */
  2222. void FreeCiphers(WOLFSSL* ssl)
  2223. {
  2224. (void)ssl;
  2225. #ifdef BUILD_ARC4
  2226. wc_Arc4Free(ssl->encrypt.arc4);
  2227. wc_Arc4Free(ssl->decrypt.arc4);
  2228. XFREE(ssl->encrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2229. XFREE(ssl->decrypt.arc4, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2230. #endif
  2231. #ifdef BUILD_DES3
  2232. wc_Des3Free(ssl->encrypt.des3);
  2233. wc_Des3Free(ssl->decrypt.des3);
  2234. XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2235. XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2236. #endif
  2237. #if defined(BUILD_AES) || defined(BUILD_AESGCM) /* See: InitKeys() in keys.c
  2238. * on addition of BUILD_AESGCM
  2239. * check (enc->aes, dec->aes) */
  2240. wc_AesFree(ssl->encrypt.aes);
  2241. wc_AesFree(ssl->decrypt.aes);
  2242. #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \
  2243. !defined(WOLFSSL_NO_TLS12)
  2244. XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2245. XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2246. #endif
  2247. XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2248. XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2249. #endif
  2250. #ifdef CIPHER_NONCE
  2251. XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2252. XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  2253. #endif
  2254. #ifdef HAVE_CAMELLIA
  2255. XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2256. XFREE(ssl->decrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2257. #endif
  2258. #ifdef HAVE_CHACHA
  2259. XFREE(ssl->encrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2260. XFREE(ssl->decrypt.chacha, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2261. #endif
  2262. #if defined(HAVE_POLY1305) && defined(HAVE_ONE_TIME_AUTH)
  2263. XFREE(ssl->auth.poly1305, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2264. #endif
  2265. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  2266. wc_HmacFree(ssl->encrypt.hmac);
  2267. wc_HmacFree(ssl->decrypt.hmac);
  2268. XFREE(ssl->encrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2269. XFREE(ssl->decrypt.hmac, ssl->heap, DYNAMIC_TYPE_CIPHER);
  2270. #endif
  2271. }
  2272. void InitCipherSpecs(CipherSpecs* cs)
  2273. {
  2274. XMEMSET(cs, 0, sizeof(CipherSpecs));
  2275. cs->bulk_cipher_algorithm = INVALID_BYTE;
  2276. cs->cipher_type = INVALID_BYTE;
  2277. cs->mac_algorithm = INVALID_BYTE;
  2278. cs->kea = INVALID_BYTE;
  2279. cs->sig_algo = INVALID_BYTE;
  2280. }
  2281. #if defined(USE_ECDSA_KEYSZ_HASH_ALGO) || (defined(WOLFSSL_TLS13) && \
  2282. defined(HAVE_ECC))
  2283. static int GetMacDigestSize(byte macAlgo)
  2284. {
  2285. switch (macAlgo) {
  2286. #ifndef NO_SHA
  2287. case sha_mac:
  2288. return WC_SHA_DIGEST_SIZE;
  2289. #endif
  2290. #ifndef NO_SHA256
  2291. case sha256_mac:
  2292. return WC_SHA256_DIGEST_SIZE;
  2293. #endif
  2294. #ifdef WOLFSSL_SHA384
  2295. case sha384_mac:
  2296. return WC_SHA384_DIGEST_SIZE;
  2297. #endif
  2298. #ifdef WOLFSSL_SHA512
  2299. case sha512_mac:
  2300. return WC_SHA512_DIGEST_SIZE;
  2301. #endif
  2302. default:
  2303. break;
  2304. }
  2305. return NOT_COMPILED_IN;
  2306. }
  2307. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2308. static WC_INLINE void AddSuiteHashSigAlgo(Suites* suites, byte macAlgo,
  2309. byte sigAlgo, int keySz, word16* inOutIdx)
  2310. {
  2311. int addSigAlgo = 1;
  2312. #ifdef USE_ECDSA_KEYSZ_HASH_ALGO
  2313. if (sigAlgo == ecc_dsa_sa_algo) {
  2314. int digestSz = GetMacDigestSize(macAlgo);
  2315. /* do not add sig/algos with digest size larger than key size */
  2316. if (digestSz <= 0 || (keySz > 0 && digestSz > keySz)) {
  2317. addSigAlgo = 0;
  2318. }
  2319. }
  2320. #else
  2321. (void)keySz;
  2322. #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */
  2323. if (addSigAlgo) {
  2324. #ifdef HAVE_ED25519
  2325. if (sigAlgo == ed25519_sa_algo) {
  2326. suites->hashSigAlgo[*inOutIdx] = ED25519_SA_MAJOR;
  2327. *inOutIdx += 1;
  2328. suites->hashSigAlgo[*inOutIdx] = ED25519_SA_MINOR;
  2329. *inOutIdx += 1;
  2330. }
  2331. else
  2332. #endif
  2333. #ifdef HAVE_ED448
  2334. if (sigAlgo == ed448_sa_algo) {
  2335. suites->hashSigAlgo[*inOutIdx] = ED448_SA_MAJOR;
  2336. *inOutIdx += 1;
  2337. suites->hashSigAlgo[*inOutIdx] = ED448_SA_MINOR;
  2338. *inOutIdx += 1;
  2339. }
  2340. else
  2341. #endif
  2342. #ifdef HAVE_PQC
  2343. if (sigAlgo == falcon_level1_sa_algo) {
  2344. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL1_SA_MAJOR;
  2345. *inOutIdx += 1;
  2346. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL1_SA_MINOR;
  2347. *inOutIdx += 1;
  2348. }
  2349. else
  2350. if (sigAlgo == falcon_level5_sa_algo) {
  2351. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL5_SA_MAJOR;
  2352. *inOutIdx += 1;
  2353. suites->hashSigAlgo[*inOutIdx] = FALCON_LEVEL5_SA_MINOR;
  2354. *inOutIdx += 1;
  2355. }
  2356. else
  2357. #endif
  2358. #ifdef WC_RSA_PSS
  2359. if (sigAlgo == rsa_pss_sa_algo) {
  2360. /* RSA PSS is sig then mac */
  2361. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2362. *inOutIdx += 1;
  2363. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  2364. *inOutIdx += 1;
  2365. #ifdef WOLFSSL_TLS13
  2366. /* Add the certificate algorithm as well */
  2367. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2368. *inOutIdx += 1;
  2369. suites->hashSigAlgo[*inOutIdx] = PSS_RSAE_TO_PSS_PSS(macAlgo);
  2370. *inOutIdx += 1;
  2371. #endif
  2372. }
  2373. else
  2374. #endif
  2375. {
  2376. suites->hashSigAlgo[*inOutIdx] = macAlgo;
  2377. *inOutIdx += 1;
  2378. suites->hashSigAlgo[*inOutIdx] = sigAlgo;
  2379. *inOutIdx += 1;
  2380. }
  2381. }
  2382. }
  2383. void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig,
  2384. int haveFalconSig, int haveAnon, int tls1_2,
  2385. int keySz)
  2386. {
  2387. word16 idx = 0;
  2388. (void)tls1_2;
  2389. (void)keySz;
  2390. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  2391. if (haveECDSAsig) {
  2392. #ifdef HAVE_ECC
  2393. #ifdef WOLFSSL_SHA512
  2394. AddSuiteHashSigAlgo(suites, sha512_mac, ecc_dsa_sa_algo, keySz, &idx);
  2395. #endif
  2396. #ifdef WOLFSSL_SHA384
  2397. AddSuiteHashSigAlgo(suites, sha384_mac, ecc_dsa_sa_algo, keySz, &idx);
  2398. #endif
  2399. #ifndef NO_SHA256
  2400. AddSuiteHashSigAlgo(suites, sha256_mac, ecc_dsa_sa_algo, keySz, &idx);
  2401. #endif
  2402. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2403. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2404. AddSuiteHashSigAlgo(suites, sha_mac, ecc_dsa_sa_algo, keySz, &idx);
  2405. #endif
  2406. #endif
  2407. #ifdef HAVE_ED25519
  2408. AddSuiteHashSigAlgo(suites, no_mac, ed25519_sa_algo, keySz, &idx);
  2409. #endif
  2410. #ifdef HAVE_ED448
  2411. AddSuiteHashSigAlgo(suites, no_mac, ed448_sa_algo, keySz, &idx);
  2412. #endif
  2413. }
  2414. #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
  2415. if (haveFalconSig) {
  2416. #if defined(HAVE_PQC)
  2417. AddSuiteHashSigAlgo(suites, no_mac, falcon_level1_sa_algo, keySz, &idx);
  2418. AddSuiteHashSigAlgo(suites, no_mac, falcon_level5_sa_algo, keySz, &idx);
  2419. #endif /* HAVE_PQC */
  2420. }
  2421. if (haveRSAsig) {
  2422. #ifdef WC_RSA_PSS
  2423. if (tls1_2) {
  2424. #ifdef WOLFSSL_SHA512
  2425. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_pss_sa_algo, keySz,
  2426. &idx);
  2427. #endif
  2428. #ifdef WOLFSSL_SHA384
  2429. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_pss_sa_algo, keySz,
  2430. &idx);
  2431. #endif
  2432. #ifndef NO_SHA256
  2433. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_pss_sa_algo, keySz,
  2434. &idx);
  2435. #endif
  2436. }
  2437. #endif
  2438. #ifdef WOLFSSL_SHA512
  2439. AddSuiteHashSigAlgo(suites, sha512_mac, rsa_sa_algo, keySz, &idx);
  2440. #endif
  2441. #ifdef WOLFSSL_SHA384
  2442. AddSuiteHashSigAlgo(suites, sha384_mac, rsa_sa_algo, keySz, &idx);
  2443. #endif
  2444. #ifndef NO_SHA256
  2445. AddSuiteHashSigAlgo(suites, sha256_mac, rsa_sa_algo, keySz, &idx);
  2446. #endif
  2447. #ifdef WOLFSSL_SHA224
  2448. AddSuiteHashSigAlgo(suites, sha224_mac, rsa_sa_algo, keySz, &idx);
  2449. #endif
  2450. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  2451. defined(WOLFSSL_ALLOW_TLS_SHA1))
  2452. AddSuiteHashSigAlgo(suites, sha_mac, rsa_sa_algo, keySz, &idx);
  2453. #endif
  2454. }
  2455. #ifdef HAVE_ANON
  2456. if (haveAnon) {
  2457. AddSuiteHashSigAlgo(suites, sha_mac, anonymous_sa_algo, keySz, &idx);
  2458. }
  2459. #endif
  2460. (void)haveAnon;
  2461. (void)haveECDSAsig;
  2462. suites->hashSigAlgoSz = idx;
  2463. }
  2464. void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
  2465. word16 havePSK, word16 haveDH, word16 haveECDSAsig,
  2466. word16 haveECC, word16 haveStaticECC, word16 haveFalconSig,
  2467. word16 haveAnon, int side)
  2468. {
  2469. word16 idx = 0;
  2470. int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
  2471. int tls1_2 = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_2_MINOR;
  2472. #ifdef WOLFSSL_TLS13
  2473. int tls1_3 = IsAtLeastTLSv1_3(pv);
  2474. #endif
  2475. int dtls = 0;
  2476. int haveRSAsig = 1;
  2477. (void)tls; /* shut up compiler */
  2478. (void)tls1_2;
  2479. (void)dtls;
  2480. (void)haveDH;
  2481. (void)havePSK;
  2482. (void)haveStaticECC;
  2483. (void)haveECC;
  2484. (void)side;
  2485. (void)haveRSA; /* some builds won't read */
  2486. (void)haveRSAsig; /* non ecc builds won't read */
  2487. (void)haveAnon; /* anon ciphers optional */
  2488. (void)haveFalconSig;
  2489. if (suites == NULL) {
  2490. WOLFSSL_MSG("InitSuites pointer error");
  2491. return;
  2492. }
  2493. if (suites->setSuites)
  2494. return; /* trust user settings, don't override */
  2495. #ifdef WOLFSSL_TLS13
  2496. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  2497. if (tls1_3) {
  2498. suites->suites[idx++] = TLS13_BYTE;
  2499. suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
  2500. }
  2501. #endif
  2502. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  2503. if (tls1_3) {
  2504. suites->suites[idx++] = TLS13_BYTE;
  2505. suites->suites[idx++] = TLS_AES_256_GCM_SHA384;
  2506. }
  2507. #endif
  2508. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  2509. if (tls1_3) {
  2510. suites->suites[idx++] = TLS13_BYTE;
  2511. suites->suites[idx++] = TLS_CHACHA20_POLY1305_SHA256;
  2512. }
  2513. #endif
  2514. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  2515. if (tls1_3) {
  2516. suites->suites[idx++] = TLS13_BYTE;
  2517. suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
  2518. }
  2519. #endif
  2520. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  2521. if (tls1_3) {
  2522. suites->suites[idx++] = TLS13_BYTE;
  2523. suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
  2524. }
  2525. #endif
  2526. #ifdef HAVE_NULL_CIPHER
  2527. #ifdef BUILD_TLS_SHA256_SHA256
  2528. if (tls1_3) {
  2529. suites->suites[idx++] = ECC_BYTE;
  2530. suites->suites[idx++] = TLS_SHA256_SHA256;
  2531. }
  2532. #endif
  2533. #ifdef BUILD_TLS_SHA384_SHA384
  2534. if (tls1_3) {
  2535. suites->suites[idx++] = ECC_BYTE;
  2536. suites->suites[idx++] = TLS_SHA384_SHA384;
  2537. }
  2538. #endif
  2539. #endif
  2540. #endif /* WOLFSSL_TLS13 */
  2541. #ifndef WOLFSSL_NO_TLS12
  2542. #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_RSA)
  2543. if (side == WOLFSSL_SERVER_END && haveStaticECC) {
  2544. haveRSA = 0; /* can't do RSA with ECDSA key */
  2545. }
  2546. if (side == WOLFSSL_SERVER_END && haveECDSAsig) {
  2547. haveRSAsig = 0; /* can't have RSA sig if signed by ECDSA */
  2548. }
  2549. #endif /* !NO_WOLFSSL_SERVER */
  2550. #ifdef WOLFSSL_DTLS
  2551. if (pv.major == DTLS_MAJOR) {
  2552. dtls = 1;
  2553. tls = 1;
  2554. /* May be dead assignments dependent upon configuration */
  2555. (void) dtls;
  2556. (void) tls;
  2557. tls1_2 = pv.minor <= DTLSv1_2_MINOR;
  2558. }
  2559. #endif
  2560. #ifdef HAVE_RENEGOTIATION_INDICATION
  2561. if (side == WOLFSSL_CLIENT_END) {
  2562. suites->suites[idx++] = CIPHER_BYTE;
  2563. suites->suites[idx++] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV;
  2564. }
  2565. #endif
  2566. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  2567. if (tls1_2 && haveECC) {
  2568. suites->suites[idx++] = ECC_BYTE;
  2569. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384;
  2570. }
  2571. #endif
  2572. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2573. if (tls1_2 && haveECC) {
  2574. suites->suites[idx++] = ECC_BYTE;
  2575. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
  2576. }
  2577. #endif
  2578. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  2579. if (tls1_2 && haveRSA) {
  2580. suites->suites[idx++] = ECC_BYTE;
  2581. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
  2582. }
  2583. #endif
  2584. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  2585. if (tls1_2 && haveRSA) {
  2586. suites->suites[idx++] = ECC_BYTE;
  2587. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
  2588. }
  2589. #endif
  2590. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  2591. if (tls1_2 && haveDH && haveRSA) {
  2592. suites->suites[idx++] = CIPHER_BYTE;
  2593. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_GCM_SHA384;
  2594. }
  2595. #endif
  2596. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  2597. if (tls1_2 && haveDH && haveRSA) {
  2598. suites->suites[idx++] = CIPHER_BYTE;
  2599. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
  2600. }
  2601. #endif
  2602. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  2603. if (tls1_2 && haveRSA) {
  2604. suites->suites[idx++] = CIPHER_BYTE;
  2605. suites->suites[idx++] = TLS_RSA_WITH_AES_256_GCM_SHA384;
  2606. }
  2607. #endif
  2608. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  2609. if (tls1_2 && haveRSA) {
  2610. suites->suites[idx++] = CIPHER_BYTE;
  2611. suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
  2612. }
  2613. #endif
  2614. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  2615. if (tls1_2 && haveECC && haveStaticECC) {
  2616. suites->suites[idx++] = ECC_BYTE;
  2617. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384;
  2618. }
  2619. #endif
  2620. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  2621. if (tls1_2 && haveECC && haveStaticECC) {
  2622. suites->suites[idx++] = ECC_BYTE;
  2623. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
  2624. }
  2625. #endif
  2626. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  2627. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2628. suites->suites[idx++] = ECC_BYTE;
  2629. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384;
  2630. }
  2631. #endif
  2632. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  2633. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2634. suites->suites[idx++] = ECC_BYTE;
  2635. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
  2636. }
  2637. #endif
  2638. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  2639. if (tls1_2 && haveDH && havePSK) {
  2640. suites->suites[idx++] = CIPHER_BYTE;
  2641. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_GCM_SHA384;
  2642. }
  2643. #endif
  2644. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  2645. if (tls1_2 && haveDH && haveAnon) {
  2646. suites->suites[idx++] = CIPHER_BYTE;
  2647. suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
  2648. }
  2649. #endif
  2650. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  2651. if (tls1_2 && haveDH && haveAnon) {
  2652. suites->suites[idx++] = CIPHER_BYTE;
  2653. suites->suites[idx++] = TLS_DH_anon_WITH_AES_256_GCM_SHA384;
  2654. }
  2655. #endif
  2656. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  2657. if (tls1_2 && haveDH && havePSK) {
  2658. suites->suites[idx++] = CIPHER_BYTE;
  2659. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
  2660. }
  2661. #endif
  2662. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  2663. if (tls1_2 && havePSK) {
  2664. suites->suites[idx++] = CIPHER_BYTE;
  2665. suites->suites[idx++] = TLS_PSK_WITH_AES_256_GCM_SHA384;
  2666. }
  2667. #endif
  2668. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  2669. if (tls1_2 && havePSK) {
  2670. suites->suites[idx++] = CIPHER_BYTE;
  2671. suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
  2672. }
  2673. #endif
  2674. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  2675. if (tls1_2 && haveECC) {
  2676. suites->suites[idx++] = CHACHA_BYTE;
  2677. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256;
  2678. }
  2679. #endif
  2680. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2681. if (tls1_2 && haveRSA) {
  2682. suites->suites[idx++] = CHACHA_BYTE;
  2683. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2684. }
  2685. #endif
  2686. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  2687. if (tls1_2 && haveRSA) {
  2688. suites->suites[idx++] = CHACHA_BYTE;
  2689. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256;
  2690. }
  2691. #endif
  2692. /* Place as higher priority for MYSQL */
  2693. #if defined(WOLFSSL_MYSQL_COMPATIBLE)
  2694. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2695. if (tls && haveDH && haveRSA) {
  2696. suites->suites[idx++] = CIPHER_BYTE;
  2697. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2698. }
  2699. #endif
  2700. #endif
  2701. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  2702. if (tls1_2 && haveRSA) {
  2703. suites->suites[idx++] = ECC_BYTE;
  2704. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
  2705. }
  2706. #endif
  2707. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  2708. if (tls1_2 && haveECC) {
  2709. suites->suites[idx++] = ECC_BYTE;
  2710. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
  2711. }
  2712. #endif
  2713. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  2714. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2715. suites->suites[idx++] = ECC_BYTE;
  2716. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
  2717. }
  2718. #endif
  2719. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  2720. if (tls1_2 && haveECC && haveStaticECC) {
  2721. suites->suites[idx++] = ECC_BYTE;
  2722. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
  2723. }
  2724. #endif
  2725. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  2726. if (tls1_2 && haveRSA) {
  2727. suites->suites[idx++] = ECC_BYTE;
  2728. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384;
  2729. }
  2730. #endif
  2731. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2732. if (tls1_2 && haveECC) {
  2733. suites->suites[idx++] = ECC_BYTE;
  2734. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384;
  2735. }
  2736. #endif
  2737. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  2738. if (tls1_2 && haveRSAsig && haveStaticECC) {
  2739. suites->suites[idx++] = ECC_BYTE;
  2740. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384;
  2741. }
  2742. #endif
  2743. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  2744. if (tls1_2 && haveECC && haveStaticECC) {
  2745. suites->suites[idx++] = ECC_BYTE;
  2746. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384;
  2747. }
  2748. #endif
  2749. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  2750. if (tls && haveECC) {
  2751. suites->suites[idx++] = ECC_BYTE;
  2752. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
  2753. }
  2754. #endif
  2755. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  2756. if (tls && haveECC && haveStaticECC) {
  2757. suites->suites[idx++] = ECC_BYTE;
  2758. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
  2759. }
  2760. #endif
  2761. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  2762. if (tls && haveECC) {
  2763. suites->suites[idx++] = ECC_BYTE;
  2764. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
  2765. }
  2766. #endif
  2767. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  2768. if (tls && haveECC && haveStaticECC) {
  2769. suites->suites[idx++] = ECC_BYTE;
  2770. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
  2771. }
  2772. #endif
  2773. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  2774. if (!dtls && tls && haveECC) {
  2775. suites->suites[idx++] = ECC_BYTE;
  2776. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
  2777. }
  2778. #endif
  2779. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  2780. if (!dtls && tls && haveECC && haveStaticECC) {
  2781. suites->suites[idx++] = ECC_BYTE;
  2782. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
  2783. }
  2784. #endif
  2785. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  2786. if (tls && haveECC) {
  2787. suites->suites[idx++] = ECC_BYTE;
  2788. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2789. }
  2790. #endif
  2791. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  2792. if (tls && haveECC && haveStaticECC) {
  2793. suites->suites[idx++] = ECC_BYTE;
  2794. suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
  2795. }
  2796. #endif
  2797. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  2798. if (tls && haveRSA) {
  2799. suites->suites[idx++] = ECC_BYTE;
  2800. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
  2801. }
  2802. #endif
  2803. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  2804. if (tls && haveRSAsig && haveStaticECC) {
  2805. suites->suites[idx++] = ECC_BYTE;
  2806. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
  2807. }
  2808. #endif
  2809. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  2810. if (tls && haveRSA) {
  2811. suites->suites[idx++] = ECC_BYTE;
  2812. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
  2813. }
  2814. #endif
  2815. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  2816. if (tls && haveRSAsig && haveStaticECC) {
  2817. suites->suites[idx++] = ECC_BYTE;
  2818. suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
  2819. }
  2820. #endif
  2821. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  2822. if (!dtls && tls && haveRSA) {
  2823. suites->suites[idx++] = ECC_BYTE;
  2824. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
  2825. }
  2826. #endif
  2827. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  2828. if (!dtls && tls && haveRSAsig && haveStaticECC) {
  2829. suites->suites[idx++] = ECC_BYTE;
  2830. suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
  2831. }
  2832. #endif
  2833. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  2834. if (tls && haveRSA) {
  2835. suites->suites[idx++] = ECC_BYTE;
  2836. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2837. }
  2838. #endif
  2839. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  2840. if (tls && haveRSAsig && haveStaticECC) {
  2841. suites->suites[idx++] = ECC_BYTE;
  2842. suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
  2843. }
  2844. #endif
  2845. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  2846. if (tls1_2 && haveECC) {
  2847. suites->suites[idx++] = ECC_BYTE;
  2848. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
  2849. }
  2850. #endif
  2851. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  2852. if (tls1_2 && haveECC) {
  2853. suites->suites[idx++] = ECC_BYTE;
  2854. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
  2855. }
  2856. #endif
  2857. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  2858. if (tls1_2 && haveECC) {
  2859. suites->suites[idx++] = ECC_BYTE;
  2860. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8;
  2861. }
  2862. #endif
  2863. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  2864. if (tls1_2 && haveRSA) {
  2865. suites->suites[idx++] = ECC_BYTE;
  2866. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
  2867. }
  2868. #endif
  2869. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  2870. if (tls1_2 && haveRSA) {
  2871. suites->suites[idx++] = ECC_BYTE;
  2872. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CCM_8;
  2873. }
  2874. #endif
  2875. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  2876. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2877. if (tls1_2 && haveDH && haveRSA)
  2878. #else
  2879. if (tls && haveDH && haveRSA)
  2880. #endif
  2881. {
  2882. suites->suites[idx++] = CIPHER_BYTE;
  2883. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA256;
  2884. }
  2885. #endif
  2886. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  2887. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2888. if (tls1_2 && haveDH && haveRSA)
  2889. #else
  2890. if (tls && haveDH && haveRSA)
  2891. #endif
  2892. {
  2893. suites->suites[idx++] = CIPHER_BYTE;
  2894. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA256;
  2895. }
  2896. #endif
  2897. /* Place as higher priority for MYSQL testing */
  2898. #if !defined(WOLFSSL_MYSQL_COMPATIBLE)
  2899. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  2900. if (tls && haveDH && haveRSA) {
  2901. suites->suites[idx++] = CIPHER_BYTE;
  2902. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
  2903. }
  2904. #endif
  2905. #endif
  2906. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  2907. if (tls && haveDH && haveRSA) {
  2908. suites->suites[idx++] = CIPHER_BYTE;
  2909. suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
  2910. }
  2911. #endif
  2912. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  2913. if (tls && haveDH && haveRSA) {
  2914. suites->suites[idx++] = CIPHER_BYTE;
  2915. suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
  2916. }
  2917. #endif
  2918. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  2919. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2920. if (tls1_2 && haveRSA)
  2921. #else
  2922. if (tls && haveRSA)
  2923. #endif
  2924. {
  2925. suites->suites[idx++] = CIPHER_BYTE;
  2926. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
  2927. }
  2928. #endif
  2929. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  2930. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2931. if (tls1_2 && haveRSA)
  2932. #else
  2933. if (tls && haveRSA)
  2934. #endif
  2935. {
  2936. suites->suites[idx++] = CIPHER_BYTE;
  2937. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
  2938. }
  2939. #endif
  2940. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  2941. if (tls && haveRSA) {
  2942. suites->suites[idx++] = CIPHER_BYTE;
  2943. suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
  2944. }
  2945. #endif
  2946. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  2947. if (tls && haveRSA) {
  2948. suites->suites[idx++] = CIPHER_BYTE;
  2949. suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
  2950. }
  2951. #endif
  2952. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2953. if (tls1_2 && haveECC) {
  2954. suites->suites[idx++] = CHACHA_BYTE;
  2955. suites->suites[idx++] =
  2956. TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2957. }
  2958. #endif
  2959. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2960. if (tls1_2 && haveRSA) {
  2961. suites->suites[idx++] = CHACHA_BYTE;
  2962. suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2963. }
  2964. #endif
  2965. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  2966. if (tls1_2 && haveRSA) {
  2967. suites->suites[idx++] = CHACHA_BYTE;
  2968. suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256;
  2969. }
  2970. #endif
  2971. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  2972. if (tls && haveECC) {
  2973. suites->suites[idx++] = ECC_BYTE;
  2974. suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
  2975. }
  2976. #endif
  2977. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  2978. if (tls && haveRSA) {
  2979. suites->suites[idx++] = CIPHER_BYTE;
  2980. suites->suites[idx++] = TLS_RSA_WITH_NULL_MD5;
  2981. }
  2982. #endif
  2983. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  2984. if (tls && haveRSA) {
  2985. suites->suites[idx++] = CIPHER_BYTE;
  2986. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
  2987. }
  2988. #endif
  2989. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  2990. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  2991. if (tls1_2 && haveRSA)
  2992. #else
  2993. if (tls && haveRSA)
  2994. #endif
  2995. {
  2996. suites->suites[idx++] = CIPHER_BYTE;
  2997. suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA256;
  2998. }
  2999. #endif
  3000. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  3001. if (tls && havePSK) {
  3002. suites->suites[idx++] = CIPHER_BYTE;
  3003. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
  3004. }
  3005. #endif
  3006. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  3007. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3008. if (tls1_2 && haveDH && havePSK)
  3009. #else
  3010. if (tls && haveDH && havePSK)
  3011. #endif
  3012. {
  3013. suites->suites[idx++] = CIPHER_BYTE;
  3014. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CBC_SHA384;
  3015. }
  3016. #endif
  3017. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  3018. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3019. if (tls1_2 && havePSK)
  3020. #else
  3021. if (tls && havePSK)
  3022. #endif
  3023. {
  3024. suites->suites[idx++] = CIPHER_BYTE;
  3025. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA384;
  3026. }
  3027. #endif
  3028. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  3029. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3030. if (tls1_2 && haveDH && havePSK)
  3031. #else
  3032. if (tls && haveDH && havePSK)
  3033. #endif
  3034. {
  3035. suites->suites[idx++] = CIPHER_BYTE;
  3036. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CBC_SHA256;
  3037. }
  3038. #endif
  3039. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  3040. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3041. if (tls1_2 && havePSK)
  3042. #else
  3043. if (tls1 && havePSK)
  3044. #endif
  3045. {
  3046. suites->suites[idx++] = CIPHER_BYTE;
  3047. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA256;
  3048. }
  3049. #endif
  3050. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  3051. if (tls && havePSK) {
  3052. suites->suites[idx++] = CIPHER_BYTE;
  3053. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
  3054. }
  3055. #endif
  3056. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  3057. if (tls && haveDH && havePSK) {
  3058. suites->suites[idx++] = ECC_BYTE;
  3059. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
  3060. }
  3061. #endif
  3062. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  3063. if (tls && haveDH && havePSK) {
  3064. suites->suites[idx++] = ECC_BYTE;
  3065. suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_256_CCM;
  3066. }
  3067. #endif
  3068. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  3069. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3070. if (tls1_2 && havePSK)
  3071. #else
  3072. if (tls && havePSK)
  3073. #endif
  3074. {
  3075. suites->suites[idx++] = CHACHA_BYTE;
  3076. suites->suites[idx++] = TLS_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3077. }
  3078. #endif
  3079. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3080. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3081. if (tls1_2 && havePSK)
  3082. #else
  3083. if (tls && havePSK)
  3084. #endif
  3085. {
  3086. suites->suites[idx++] = CHACHA_BYTE;
  3087. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3088. }
  3089. #endif
  3090. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  3091. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3092. if (tls1_2 && havePSK)
  3093. #else
  3094. if (tls && havePSK)
  3095. #endif
  3096. {
  3097. suites->suites[idx++] = CHACHA_BYTE;
  3098. suites->suites[idx++] = TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256;
  3099. }
  3100. #endif
  3101. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  3102. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3103. if (tls1_2 && havePSK)
  3104. #else
  3105. if (tls && havePSK)
  3106. #endif
  3107. {
  3108. suites->suites[idx++] = ECC_BYTE;
  3109. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256;
  3110. }
  3111. #endif
  3112. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  3113. if (tls && havePSK) {
  3114. suites->suites[idx++] = ECC_BYTE;
  3115. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
  3116. }
  3117. #endif
  3118. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  3119. if (tls && havePSK) {
  3120. suites->suites[idx++] = ECC_BYTE;
  3121. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM;
  3122. }
  3123. #endif
  3124. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  3125. if (tls && havePSK) {
  3126. suites->suites[idx++] = ECC_BYTE;
  3127. suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
  3128. }
  3129. #endif
  3130. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  3131. if (tls && havePSK) {
  3132. suites->suites[idx++] = ECC_BYTE;
  3133. suites->suites[idx++] = TLS_PSK_WITH_AES_256_CCM_8;
  3134. }
  3135. #endif
  3136. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  3137. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3138. if (tls1_2 && haveDH && havePSK)
  3139. #else
  3140. if (tls && haveDH && havePSK)
  3141. #endif
  3142. {
  3143. suites->suites[idx++] = CIPHER_BYTE;
  3144. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA384;
  3145. }
  3146. #endif
  3147. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  3148. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3149. if (tls1_2 && havePSK)
  3150. #else
  3151. if (tls && havePSK)
  3152. #endif
  3153. {
  3154. suites->suites[idx++] = CIPHER_BYTE;
  3155. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA384;
  3156. }
  3157. #endif
  3158. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  3159. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3160. if (tls1_2 && havePSK)
  3161. #else
  3162. if (tls && havePSK)
  3163. #endif
  3164. {
  3165. suites->suites[idx++] = ECC_BYTE;
  3166. suites->suites[idx++] = TLS_ECDHE_PSK_WITH_NULL_SHA256;
  3167. }
  3168. #endif
  3169. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  3170. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3171. if (tls1_2 && haveDH && havePSK)
  3172. #else
  3173. if (tls && haveDH && havePSK)
  3174. #endif
  3175. {
  3176. suites->suites[idx++] = CIPHER_BYTE;
  3177. suites->suites[idx++] = TLS_DHE_PSK_WITH_NULL_SHA256;
  3178. }
  3179. #endif
  3180. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  3181. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3182. if (tls1_2 && havePSK)
  3183. #else
  3184. if (tls && havePSK)
  3185. #endif
  3186. {
  3187. suites->suites[idx++] = CIPHER_BYTE;
  3188. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA256;
  3189. }
  3190. #endif
  3191. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  3192. if (tls && havePSK) {
  3193. suites->suites[idx++] = CIPHER_BYTE;
  3194. suites->suites[idx++] = TLS_PSK_WITH_NULL_SHA;
  3195. }
  3196. #endif
  3197. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  3198. if (!dtls && haveRSA) {
  3199. suites->suites[idx++] = CIPHER_BYTE;
  3200. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
  3201. }
  3202. #endif
  3203. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  3204. if (!dtls && haveRSA) {
  3205. suites->suites[idx++] = CIPHER_BYTE;
  3206. suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
  3207. }
  3208. #endif
  3209. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  3210. if (haveRSA ) {
  3211. suites->suites[idx++] = CIPHER_BYTE;
  3212. suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
  3213. }
  3214. #endif
  3215. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  3216. if (tls && haveRSA) {
  3217. suites->suites[idx++] = CIPHER_BYTE;
  3218. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3219. }
  3220. #endif
  3221. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  3222. if (tls && haveDH && haveRSA) {
  3223. suites->suites[idx++] = CIPHER_BYTE;
  3224. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
  3225. }
  3226. #endif
  3227. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  3228. if (tls && haveRSA) {
  3229. suites->suites[idx++] = CIPHER_BYTE;
  3230. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3231. }
  3232. #endif
  3233. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  3234. if (tls && haveDH && haveRSA) {
  3235. suites->suites[idx++] = CIPHER_BYTE;
  3236. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
  3237. }
  3238. #endif
  3239. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3240. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3241. if (tls1_2 && haveRSA)
  3242. #else
  3243. if (tls && haveRSA)
  3244. #endif
  3245. {
  3246. suites->suites[idx++] = CIPHER_BYTE;
  3247. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3248. }
  3249. #endif
  3250. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  3251. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3252. if (tls1_2 && haveDH && haveRSA)
  3253. #else
  3254. if (tls && haveDH && haveRSA)
  3255. #endif
  3256. {
  3257. suites->suites[idx++] = CIPHER_BYTE;
  3258. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256;
  3259. }
  3260. #endif
  3261. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3262. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3263. if (tls1_2 && haveRSA)
  3264. #else
  3265. if (tls && haveRSA)
  3266. #endif
  3267. {
  3268. suites->suites[idx++] = CIPHER_BYTE;
  3269. suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3270. }
  3271. #endif
  3272. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  3273. #ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
  3274. if (tls1_2 && haveDH && haveRSA)
  3275. #else
  3276. if (tls && haveDH && haveRSA)
  3277. #endif
  3278. {
  3279. suites->suites[idx++] = CIPHER_BYTE;
  3280. suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256;
  3281. }
  3282. #endif
  3283. #endif /* !WOLFSSL_NO_TLS12 */
  3284. suites->suiteSz = idx;
  3285. if (suites->hashSigAlgoSz == 0) {
  3286. InitSuitesHashSigAlgo(suites, haveECDSAsig | haveECC,
  3287. haveRSAsig | haveRSA, haveFalconSig,
  3288. 0, tls1_2, keySz);
  3289. }
  3290. }
  3291. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
  3292. (!defined(NO_WOLFSSL_CLIENT) && (!defined(NO_DH) || defined(HAVE_ECC)))
  3293. /* Decode the signature algorithm.
  3294. *
  3295. * input The encoded signature algorithm.
  3296. * hashalgo The hash algorithm.
  3297. * hsType The signature type.
  3298. */
  3299. static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
  3300. {
  3301. *hsType = invalid_sa_algo;
  3302. switch (input[0]) {
  3303. case NEW_SA_MAJOR:
  3304. #ifdef HAVE_ED25519
  3305. /* ED25519: 0x0807 */
  3306. if (input[1] == ED25519_SA_MINOR) {
  3307. *hsType = ed25519_sa_algo;
  3308. /* Hash performed as part of sign/verify operation. */
  3309. *hashAlgo = sha512_mac;
  3310. }
  3311. else
  3312. #endif
  3313. #ifdef HAVE_ED448
  3314. /* ED448: 0x0808 */
  3315. if (input[1] == ED448_SA_MINOR) {
  3316. *hsType = ed448_sa_algo;
  3317. /* Hash performed as part of sign/verify operation. */
  3318. *hashAlgo = sha512_mac;
  3319. }
  3320. else
  3321. #endif
  3322. #ifdef WC_RSA_PSS
  3323. /* PSS PSS signatures: 0x080[9-b] */
  3324. if (input[1] >= pss_sha256 && input[1] <= pss_sha512) {
  3325. *hsType = rsa_pss_pss_algo;
  3326. *hashAlgo = PSS_PSS_HASH_TO_MAC(input[1]);
  3327. }
  3328. else
  3329. #endif
  3330. {
  3331. *hsType = input[0];
  3332. *hashAlgo = input[1];
  3333. }
  3334. break;
  3335. #ifdef HAVE_PQC
  3336. case PQC_SA_MAJOR:
  3337. if (input[1] == FALCON_LEVEL1_SA_MINOR) {
  3338. *hsType = falcon_level1_sa_algo;
  3339. /* Hash performed as part of sign/verify operation. */
  3340. *hashAlgo = sha512_mac;
  3341. }
  3342. else if (input[1] == FALCON_LEVEL5_SA_MINOR) {
  3343. *hsType = falcon_level5_sa_algo;
  3344. /* Hash performed as part of sign/verify operation. */
  3345. *hashAlgo = sha512_mac;
  3346. }
  3347. break;
  3348. #endif
  3349. default:
  3350. *hashAlgo = input[0];
  3351. *hsType = input[1];
  3352. break;
  3353. }
  3354. }
  3355. #endif /* !NO_WOLFSSL_SERVER || !NO_CERTS */
  3356. #ifndef WOLFSSL_NO_TLS12
  3357. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3358. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  3359. defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
  3360. static enum wc_HashType HashAlgoToType(int hashAlgo)
  3361. {
  3362. switch (hashAlgo) {
  3363. #ifdef WOLFSSL_SHA512
  3364. case sha512_mac:
  3365. return WC_HASH_TYPE_SHA512;
  3366. #endif
  3367. #ifdef WOLFSSL_SHA384
  3368. case sha384_mac:
  3369. return WC_HASH_TYPE_SHA384;
  3370. #endif
  3371. #ifndef NO_SHA256
  3372. case sha256_mac:
  3373. return WC_HASH_TYPE_SHA256;
  3374. #endif
  3375. #ifdef WOLFSSL_SHA224
  3376. case sha224_mac:
  3377. return WC_HASH_TYPE_SHA224;
  3378. #endif
  3379. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  3380. defined(WOLFSSL_ALLOW_TLS_SHA1))
  3381. case sha_mac:
  3382. return WC_HASH_TYPE_SHA;
  3383. #endif
  3384. default:
  3385. WOLFSSL_MSG("Bad hash sig algo");
  3386. break;
  3387. }
  3388. return WC_HASH_TYPE_NONE;
  3389. }
  3390. #endif /* !NO_DH || HAVE_ECC || (!NO_RSA && WC_RSA_PSS) */
  3391. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3392. #endif /* !WOLFSSL_NO_TLS12 */
  3393. #ifndef NO_CERTS
  3394. void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
  3395. {
  3396. (void)dynamicFlag;
  3397. if (name != NULL) {
  3398. XMEMSET(name, 0, sizeof(WOLFSSL_X509_NAME));
  3399. name->name = name->staticName;
  3400. name->heap = heap;
  3401. name->dynamicName = 0;
  3402. }
  3403. }
  3404. void FreeX509Name(WOLFSSL_X509_NAME* name)
  3405. {
  3406. if (name != NULL) {
  3407. if (name->dynamicName) {
  3408. XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
  3409. name->name = NULL;
  3410. }
  3411. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3412. {
  3413. int i;
  3414. for (i = 0; i < MAX_NAME_ENTRIES; i++) {
  3415. if (name->entry[i].object != NULL)
  3416. wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
  3417. if (name->entry[i].value != NULL)
  3418. wolfSSL_ASN1_STRING_free(name->entry[i].value);
  3419. XMEMSET(&name->entry[i], 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
  3420. }
  3421. }
  3422. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3423. #ifdef OPENSSL_ALL
  3424. if (name->entries) {
  3425. wolfSSL_sk_X509_NAME_ENTRY_free(name->entries);
  3426. name->entries = NULL;
  3427. }
  3428. #endif
  3429. }
  3430. }
  3431. /* Initialize wolfSSL X509 type */
  3432. void InitX509(WOLFSSL_X509* x509, int dynamicFlag, void* heap)
  3433. {
  3434. if (x509 == NULL) {
  3435. WOLFSSL_MSG("Null parameter passed in!");
  3436. return;
  3437. }
  3438. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  3439. x509->heap = heap;
  3440. InitX509Name(&x509->issuer, 0, heap);
  3441. InitX509Name(&x509->subject, 0, heap);
  3442. x509->dynamicMemory = (byte)dynamicFlag;
  3443. #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA)
  3444. x509->refCount = 1;
  3445. #ifndef SINGLE_THREADED
  3446. (void)wc_InitMutex(&x509->refMutex);
  3447. #endif
  3448. #endif
  3449. }
  3450. /* Free wolfSSL X509 type */
  3451. void FreeX509(WOLFSSL_X509* x509)
  3452. {
  3453. if (x509 == NULL)
  3454. return;
  3455. FreeX509Name(&x509->issuer);
  3456. FreeX509Name(&x509->subject);
  3457. if (x509->pubKey.buffer) {
  3458. XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  3459. x509->pubKey.buffer = NULL;
  3460. }
  3461. FreeDer(&x509->derCert);
  3462. XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  3463. x509->sig.buffer = NULL;
  3464. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  3465. if (x509->authKeyIdSrc != NULL) {
  3466. XFREE(x509->authKeyIdSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3467. }
  3468. else {
  3469. XFREE(x509->authKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3470. }
  3471. x509->authKeyIdSrc = NULL;
  3472. x509->authKeyId = NULL;
  3473. XFREE(x509->subjKeyId, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3474. x509->subjKeyId = NULL;
  3475. if (x509->authInfo != NULL) {
  3476. XFREE(x509->authInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3477. x509->authInfo = NULL;
  3478. }
  3479. if (x509->rawCRLInfo != NULL) {
  3480. XFREE(x509->rawCRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3481. x509->rawCRLInfo = NULL;
  3482. }
  3483. if (x509->CRLInfo != NULL) {
  3484. XFREE(x509->CRLInfo, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3485. x509->CRLInfo = NULL;
  3486. }
  3487. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  3488. if (x509->authInfoCaIssuer != NULL) {
  3489. XFREE(x509->authInfoCaIssuer, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3490. }
  3491. if (x509->ext_sk != NULL) {
  3492. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk, NULL);
  3493. }
  3494. if (x509->ext_sk_full != NULL) {
  3495. wolfSSL_sk_X509_EXTENSION_pop_free(x509->ext_sk_full, NULL);
  3496. }
  3497. #endif /* OPENSSL_ALL || WOLFSSL_QT */
  3498. #ifdef OPENSSL_EXTRA
  3499. /* Free serialNumber that was set by wolfSSL_X509_get_serialNumber */
  3500. if (x509->serialNumber != NULL) {
  3501. wolfSSL_ASN1_INTEGER_free(x509->serialNumber);
  3502. }
  3503. #endif
  3504. if (x509->extKeyUsageSrc != NULL) {
  3505. XFREE(x509->extKeyUsageSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3506. x509->extKeyUsageSrc= NULL;
  3507. }
  3508. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  3509. #if defined(OPENSSL_ALL)
  3510. if (x509->algor.algorithm) {
  3511. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  3512. x509->algor.algorithm = NULL;
  3513. }
  3514. if (x509->key.algor) {
  3515. wolfSSL_X509_ALGOR_free(x509->key.algor);
  3516. x509->key.algor = NULL;
  3517. }
  3518. if (x509->key.pkey) {
  3519. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  3520. x509->key.pkey = NULL;
  3521. }
  3522. if (x509->subjAltNameSrc != NULL) {
  3523. XFREE(x509->subjAltNameSrc, x509->heap, DYNAMIC_TYPE_X509_EXT);
  3524. x509->subjAltNameSrc= NULL;
  3525. }
  3526. #endif /* OPENSSL_ALL */
  3527. #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
  3528. if (x509->reqAttributes) {
  3529. wolfSSL_sk_pop_free(x509->reqAttributes, NULL);
  3530. }
  3531. #endif /* WOLFSSL_CERT_REQ */
  3532. if (x509->altNames) {
  3533. FreeAltNames(x509->altNames, x509->heap);
  3534. x509->altNames = NULL;
  3535. }
  3536. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
  3537. #ifndef SINGLE_THREADED
  3538. wc_FreeMutex(&x509->refMutex);
  3539. #endif
  3540. #endif
  3541. }
  3542. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3543. #if !defined(WOLFSSL_NO_TLS12)
  3544. /* Encode the signature algorithm into buffer.
  3545. *
  3546. * hashalgo The hash algorithm.
  3547. * hsType The signature type.
  3548. * output The buffer to encode into.
  3549. */
  3550. static WC_INLINE void EncodeSigAlg(byte hashAlgo, byte hsType, byte* output)
  3551. {
  3552. switch (hsType) {
  3553. #ifdef HAVE_ECC
  3554. case ecc_dsa_sa_algo:
  3555. output[0] = hashAlgo;
  3556. output[1] = ecc_dsa_sa_algo;
  3557. break;
  3558. #endif
  3559. #ifdef HAVE_ED25519
  3560. case ed25519_sa_algo:
  3561. output[0] = ED25519_SA_MAJOR;
  3562. output[1] = ED25519_SA_MINOR;
  3563. (void)hashAlgo;
  3564. break;
  3565. #endif
  3566. #ifdef HAVE_ED448
  3567. case ed448_sa_algo:
  3568. output[0] = ED448_SA_MAJOR;
  3569. output[1] = ED448_SA_MINOR;
  3570. (void)hashAlgo;
  3571. break;
  3572. #endif
  3573. #ifndef NO_RSA
  3574. case rsa_sa_algo:
  3575. output[0] = hashAlgo;
  3576. output[1] = rsa_sa_algo;
  3577. break;
  3578. #ifdef WC_RSA_PSS
  3579. /* PSS signatures: 0x080[4-6] */
  3580. case rsa_pss_sa_algo:
  3581. output[0] = rsa_pss_sa_algo;
  3582. output[1] = hashAlgo;
  3583. break;
  3584. #endif
  3585. #endif
  3586. default:
  3587. break;
  3588. }
  3589. (void)hashAlgo;
  3590. (void)output;
  3591. }
  3592. #endif
  3593. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  3594. static void SetDigest(WOLFSSL* ssl, int hashAlgo)
  3595. {
  3596. switch (hashAlgo) {
  3597. #ifndef NO_SHA
  3598. case sha_mac:
  3599. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha;
  3600. ssl->buffers.digest.length = WC_SHA_DIGEST_SIZE;
  3601. break;
  3602. #endif /* !NO_SHA */
  3603. #ifndef NO_SHA256
  3604. case sha256_mac:
  3605. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha256;
  3606. ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE;
  3607. break;
  3608. #endif /* !NO_SHA256 */
  3609. #ifdef WOLFSSL_SHA384
  3610. case sha384_mac:
  3611. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha384;
  3612. ssl->buffers.digest.length = WC_SHA384_DIGEST_SIZE;
  3613. break;
  3614. #endif /* WOLFSSL_SHA384 */
  3615. #ifdef WOLFSSL_SHA512
  3616. case sha512_mac:
  3617. ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha512;
  3618. ssl->buffers.digest.length = WC_SHA512_DIGEST_SIZE;
  3619. break;
  3620. #endif /* WOLFSSL_SHA512 */
  3621. default:
  3622. break;
  3623. } /* switch */
  3624. }
  3625. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_NO_CLIENT_AUTH */
  3626. #endif /* !NO_WOLFSSL_SERVER || !NO_WOLFSSL_CLIENT */
  3627. #endif /* !NO_CERTS */
  3628. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  3629. static word32 MacSize(WOLFSSL* ssl)
  3630. {
  3631. #ifdef HAVE_TRUNCATED_HMAC
  3632. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  3633. : ssl->specs.hash_size;
  3634. #else
  3635. word32 digestSz = ssl->specs.hash_size;
  3636. #endif
  3637. return digestSz;
  3638. }
  3639. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  3640. #ifndef NO_RSA
  3641. #if !defined(WOLFSSL_NO_TLS12) || \
  3642. (defined(WC_RSA_PSS) && defined(HAVE_PK_CALLBACKS))
  3643. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  3644. static int TypeHash(int hashAlgo)
  3645. {
  3646. switch (hashAlgo) {
  3647. #ifdef WOLFSSL_SHA512
  3648. case sha512_mac:
  3649. return SHA512h;
  3650. #endif
  3651. #ifdef WOLFSSL_SHA384
  3652. case sha384_mac:
  3653. return SHA384h;
  3654. #endif
  3655. #ifndef NO_SHA256
  3656. case sha256_mac:
  3657. return SHA256h;
  3658. #endif
  3659. #ifdef WOLFSSL_SHA224
  3660. case sha224_mac:
  3661. return SHA224h;
  3662. #endif
  3663. #ifndef NO_SHA
  3664. case sha_mac:
  3665. return SHAh;
  3666. #endif
  3667. default:
  3668. break;
  3669. }
  3670. return 0;
  3671. }
  3672. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  3673. #endif /* !WOLFSSL_NO_TLS12 */
  3674. #if defined(WC_RSA_PSS)
  3675. int ConvertHashPss(int hashAlgo, enum wc_HashType* hashType, int* mgf)
  3676. {
  3677. switch (hashAlgo) {
  3678. #ifdef WOLFSSL_SHA512
  3679. case sha512_mac:
  3680. *hashType = WC_HASH_TYPE_SHA512;
  3681. if (mgf != NULL)
  3682. *mgf = WC_MGF1SHA512;
  3683. break;
  3684. #endif
  3685. #ifdef WOLFSSL_SHA384
  3686. case sha384_mac:
  3687. *hashType = WC_HASH_TYPE_SHA384;
  3688. if (mgf != NULL)
  3689. *mgf = WC_MGF1SHA384;
  3690. break;
  3691. #endif
  3692. #ifndef NO_SHA256
  3693. case sha256_mac:
  3694. *hashType = WC_HASH_TYPE_SHA256;
  3695. if (mgf != NULL)
  3696. *mgf = WC_MGF1SHA256;
  3697. break;
  3698. #endif
  3699. default:
  3700. return BAD_FUNC_ARG;
  3701. }
  3702. return 0;
  3703. }
  3704. #endif
  3705. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3706. int RsaSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  3707. word32* outSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3708. DerBuffer* keyBufInfo)
  3709. {
  3710. int ret;
  3711. #ifdef HAVE_PK_CALLBACKS
  3712. const byte* keyBuf = NULL;
  3713. word32 keySz = 0;
  3714. if (keyBufInfo) {
  3715. keyBuf = keyBufInfo->buffer;
  3716. keySz = keyBufInfo->length;
  3717. }
  3718. #endif
  3719. (void)ssl;
  3720. (void)keyBufInfo;
  3721. (void)sigAlgo;
  3722. (void)hashAlgo;
  3723. WOLFSSL_ENTER("RsaSign");
  3724. #ifdef WOLFSSL_ASYNC_CRYPT
  3725. /* initialize event */
  3726. if (key) {
  3727. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3728. if (ret != 0)
  3729. return ret;
  3730. }
  3731. #endif
  3732. #if defined(WC_RSA_PSS)
  3733. if (sigAlgo == rsa_pss_sa_algo) {
  3734. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3735. int mgf = 0;
  3736. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3737. if (ret != 0)
  3738. return ret;
  3739. #if defined(HAVE_PK_CALLBACKS)
  3740. if (ssl->ctx->RsaPssSignCb) {
  3741. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3742. ret = ssl->ctx->RsaPssSignCb(ssl, in, inSz, out, outSz,
  3743. TypeHash(hashAlgo), mgf,
  3744. keyBuf, keySz, ctx);
  3745. }
  3746. else
  3747. #endif
  3748. {
  3749. ret = wc_RsaPSS_Sign(in, inSz, out, *outSz, hashType, mgf, key,
  3750. ssl->rng);
  3751. }
  3752. }
  3753. else
  3754. #endif
  3755. #if defined(HAVE_PK_CALLBACKS)
  3756. if (ssl->ctx->RsaSignCb) {
  3757. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3758. ret = ssl->ctx->RsaSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  3759. ctx);
  3760. }
  3761. else
  3762. #endif /*HAVE_PK_CALLBACKS */
  3763. ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, key, ssl->rng);
  3764. /* Handle async pending response */
  3765. #ifdef WOLFSSL_ASYNC_CRYPT
  3766. if (key && ret == WC_PENDING_E) {
  3767. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3768. }
  3769. #endif /* WOLFSSL_ASYNC_CRYPT */
  3770. /* For positive response return in outSz */
  3771. if (ret > 0) {
  3772. *outSz = ret;
  3773. ret = 0;
  3774. }
  3775. WOLFSSL_LEAVE("RsaSign", ret);
  3776. return ret;
  3777. }
  3778. #endif
  3779. int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo,
  3780. int hashAlgo, RsaKey* key, buffer* keyBufInfo)
  3781. {
  3782. int ret = SIG_VERIFY_E;
  3783. #ifdef HAVE_PK_CALLBACKS
  3784. const byte* keyBuf = NULL;
  3785. word32 keySz = 0;
  3786. if (keyBufInfo) {
  3787. keyBuf = keyBufInfo->buffer;
  3788. keySz = keyBufInfo->length;
  3789. }
  3790. #endif
  3791. (void)ssl;
  3792. (void)keyBufInfo;
  3793. (void)sigAlgo;
  3794. (void)hashAlgo;
  3795. WOLFSSL_ENTER("RsaVerify");
  3796. #ifdef WOLFSSL_ASYNC_CRYPT
  3797. /* initialize event */
  3798. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3799. if (ret != 0)
  3800. return ret;
  3801. #endif
  3802. #if defined(WC_RSA_PSS)
  3803. if (sigAlgo == rsa_pss_sa_algo) {
  3804. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3805. int mgf = 0;
  3806. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3807. if (ret != 0)
  3808. return ret;
  3809. #ifdef HAVE_PK_CALLBACKS
  3810. if (ssl->ctx->RsaPssVerifyCb) {
  3811. void* ctx = wolfSSL_GetRsaPssVerifyCtx(ssl);
  3812. ret = ssl->ctx->RsaPssVerifyCb(ssl, in, inSz, out,
  3813. TypeHash(hashAlgo), mgf,
  3814. keyBuf, keySz, ctx);
  3815. }
  3816. else
  3817. #endif /*HAVE_PK_CALLBACKS */
  3818. ret = wc_RsaPSS_VerifyInline(in, inSz, out, hashType, mgf, key);
  3819. }
  3820. else
  3821. #endif
  3822. #ifdef HAVE_PK_CALLBACKS
  3823. if (ssl->ctx->RsaVerifyCb) {
  3824. void* ctx = wolfSSL_GetRsaVerifyCtx(ssl);
  3825. ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3826. }
  3827. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  3828. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  3829. else
  3830. #else
  3831. if (!ssl->ctx->RsaVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  3832. #endif
  3833. #endif /*HAVE_PK_CALLBACKS */
  3834. {
  3835. ret = wc_RsaSSL_VerifyInline(in, inSz, out, key);
  3836. }
  3837. /* Handle async pending response */
  3838. #ifdef WOLFSSL_ASYNC_CRYPT
  3839. if (ret == WC_PENDING_E) {
  3840. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3841. }
  3842. #endif /* WOLFSSL_ASYNC_CRYPT */
  3843. WOLFSSL_LEAVE("RsaVerify", ret);
  3844. return ret;
  3845. }
  3846. /* Verify RSA signature, 0 on success */
  3847. /* This function is used to check the sign result */
  3848. int VerifyRsaSign(WOLFSSL* ssl, byte* verifySig, word32 sigSz,
  3849. const byte* plain, word32 plainSz, int sigAlgo, int hashAlgo, RsaKey* key,
  3850. DerBuffer* keyBufInfo)
  3851. {
  3852. byte* out = NULL; /* inline result */
  3853. int ret;
  3854. #ifdef HAVE_PK_CALLBACKS
  3855. const byte* keyBuf = NULL;
  3856. word32 keySz = 0;
  3857. if (keyBufInfo) {
  3858. keyBuf = keyBufInfo->buffer;
  3859. keySz = keyBufInfo->length;
  3860. }
  3861. #endif
  3862. (void)ssl;
  3863. (void)keyBufInfo;
  3864. (void)sigAlgo;
  3865. (void)hashAlgo;
  3866. WOLFSSL_ENTER("VerifyRsaSign");
  3867. if (verifySig == NULL || plain == NULL) {
  3868. return BAD_FUNC_ARG;
  3869. }
  3870. if (sigSz > ENCRYPT_LEN) {
  3871. WOLFSSL_MSG("Signature buffer too big");
  3872. return BUFFER_E;
  3873. }
  3874. #ifdef WOLFSSL_ASYNC_CRYPT
  3875. /* initialize event */
  3876. if (key) {
  3877. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3878. if (ret != 0)
  3879. return ret;
  3880. }
  3881. #endif
  3882. #if defined(WC_RSA_PSS)
  3883. if (sigAlgo == rsa_pss_sa_algo) {
  3884. enum wc_HashType hashType = WC_HASH_TYPE_NONE;
  3885. int mgf = 0;
  3886. ret = ConvertHashPss(hashAlgo, &hashType, &mgf);
  3887. if (ret != 0)
  3888. return ret;
  3889. #ifdef HAVE_PK_CALLBACKS
  3890. if (ssl->ctx->RsaPssSignCheckCb) {
  3891. /* The key buffer includes private/public portion,
  3892. but only public is used */
  3893. /* If HSM hardware is checking the signature result you can
  3894. optionally skip the sign check and return 0 */
  3895. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3896. void* ctx = wolfSSL_GetRsaPssSignCtx(ssl);
  3897. ret = ssl->ctx->RsaPssSignCheckCb(ssl, verifySig, sigSz, &out,
  3898. TypeHash(hashAlgo), mgf,
  3899. keyBuf, keySz, ctx);
  3900. if (ret > 0) {
  3901. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  3902. hashType);
  3903. if (ret != 0)
  3904. ret = VERIFY_CERT_ERROR;
  3905. }
  3906. }
  3907. else
  3908. #endif /* HAVE_PK_CALLBACKS */
  3909. {
  3910. ret = wc_RsaPSS_VerifyInline(verifySig, sigSz, &out, hashType, mgf,
  3911. key);
  3912. if (ret > 0) {
  3913. #ifdef HAVE_SELFTEST
  3914. ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret,
  3915. hashType);
  3916. #else
  3917. ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret,
  3918. hashType, -1,
  3919. mp_count_bits(&key->n));
  3920. #endif
  3921. if (ret != 0)
  3922. ret = VERIFY_CERT_ERROR;
  3923. }
  3924. }
  3925. }
  3926. else
  3927. #endif /* WC_RSA_PSS */
  3928. {
  3929. #ifdef HAVE_PK_CALLBACKS
  3930. if (ssl->ctx->RsaSignCheckCb) {
  3931. /* The key buffer includes private/public portion,
  3932. but only public is used */
  3933. /* If HSM hardware is checking the signature result you can
  3934. optionally skip the sign check and return 0 */
  3935. /* The ctx here is the RsaSignCtx set using wolfSSL_SetRsaSignCtx */
  3936. void* ctx = wolfSSL_GetRsaSignCtx(ssl);
  3937. ret = ssl->ctx->RsaSignCheckCb(ssl, verifySig, sigSz, &out,
  3938. keyBuf, keySz, ctx);
  3939. }
  3940. else
  3941. #endif /* HAVE_PK_CALLBACKS */
  3942. {
  3943. ret = wc_RsaSSL_VerifyInline(verifySig, sigSz, &out, key);
  3944. }
  3945. if (ret > 0) {
  3946. if (ret != (int)plainSz || !out ||
  3947. XMEMCMP(plain, out, plainSz) != 0) {
  3948. WOLFSSL_MSG("RSA Signature verification failed");
  3949. ret = RSA_SIGN_FAULT;
  3950. } else {
  3951. ret = 0; /* RSA reset */
  3952. }
  3953. }
  3954. }
  3955. /* Handle async pending response */
  3956. #ifdef WOLFSSL_ASYNC_CRYPT
  3957. if (key && ret == WC_PENDING_E) {
  3958. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  3959. }
  3960. #endif /* WOLFSSL_ASYNC_CRYPT */
  3961. WOLFSSL_LEAVE("VerifyRsaSign", ret);
  3962. return ret;
  3963. }
  3964. #ifndef WOLFSSL_NO_TLS12
  3965. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  3966. int RsaDec(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, word32* outSz,
  3967. RsaKey* key, DerBuffer* keyBufInfo)
  3968. {
  3969. int ret;
  3970. #ifdef HAVE_PK_CALLBACKS
  3971. const byte* keyBuf = NULL;
  3972. word32 keySz = 0;
  3973. if (keyBufInfo) {
  3974. keyBuf = keyBufInfo->buffer;
  3975. keySz = keyBufInfo->length;
  3976. }
  3977. #endif
  3978. (void)ssl;
  3979. (void)keyBufInfo;
  3980. WOLFSSL_ENTER("RsaDec");
  3981. #ifdef WOLFSSL_ASYNC_CRYPT
  3982. /* initialize event */
  3983. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  3984. if (ret != 0)
  3985. return ret;
  3986. #endif
  3987. #ifdef HAVE_PK_CALLBACKS
  3988. if (ssl->ctx->RsaDecCb) {
  3989. void* ctx = wolfSSL_GetRsaDecCtx(ssl);
  3990. ret = ssl->ctx->RsaDecCb(ssl, in, inSz, out, keyBuf, keySz, ctx);
  3991. }
  3992. else
  3993. #endif /* HAVE_PK_CALLBACKS */
  3994. {
  3995. #ifdef WC_RSA_BLINDING
  3996. ret = wc_RsaSetRNG(key, ssl->rng);
  3997. if (ret != 0)
  3998. return ret;
  3999. #endif
  4000. ret = wc_RsaPrivateDecryptInline(in, inSz, out, key);
  4001. }
  4002. /* Handle async pending response */
  4003. #ifdef WOLFSSL_ASYNC_CRYPT
  4004. if (ret == WC_PENDING_E) {
  4005. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4006. }
  4007. #endif /* WOLFSSL_ASYNC_CRYPT */
  4008. /* For positive response return in outSz */
  4009. if (ret > 0) {
  4010. *outSz = ret;
  4011. ret = 0;
  4012. }
  4013. WOLFSSL_LEAVE("RsaDec", ret);
  4014. return ret;
  4015. }
  4016. #endif /* !NO_WOLFSSL_SERVER) || !WOLFSSL_NO_CLIENT_AUTH */
  4017. int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz,
  4018. RsaKey* key, buffer* keyBufInfo)
  4019. {
  4020. int ret = BAD_FUNC_ARG;
  4021. #ifdef HAVE_PK_CALLBACKS
  4022. const byte* keyBuf = NULL;
  4023. word32 keySz = 0;
  4024. if (keyBufInfo) {
  4025. keyBuf = keyBufInfo->buffer;
  4026. keySz = keyBufInfo->length;
  4027. }
  4028. #endif
  4029. (void)ssl;
  4030. (void)keyBufInfo;
  4031. WOLFSSL_ENTER("RsaEnc");
  4032. #ifdef WOLFSSL_ASYNC_CRYPT
  4033. /* initialize event */
  4034. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4035. if (ret != 0)
  4036. return ret;
  4037. #endif
  4038. #ifdef HAVE_PK_CALLBACKS
  4039. if (ssl->ctx->RsaEncCb) {
  4040. void* ctx = wolfSSL_GetRsaEncCtx(ssl);
  4041. ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx);
  4042. }
  4043. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4044. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4045. else
  4046. #else
  4047. if (!ssl->ctx->RsaEncCb || ret == CRYPTOCB_UNAVAILABLE)
  4048. #endif
  4049. #endif /* HAVE_PK_CALLBACKS */
  4050. {
  4051. ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, key, ssl->rng);
  4052. }
  4053. /* Handle async pending response */
  4054. #ifdef WOLFSSL_ASYNC_CRYPT
  4055. if (ret == WC_PENDING_E) {
  4056. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4057. }
  4058. #endif /* WOLFSSL_ASYNC_CRYPT */
  4059. /* For positive response return in outSz */
  4060. if (ret > 0) {
  4061. *outSz = ret;
  4062. ret = 0;
  4063. }
  4064. WOLFSSL_LEAVE("RsaEnc", ret);
  4065. return ret;
  4066. }
  4067. #endif /* !WOLFSSL_NO_TLS12 */
  4068. #endif /* NO_RSA */
  4069. #ifdef HAVE_ECC
  4070. int EccSign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4071. word32* outSz, ecc_key* key, DerBuffer* keyBufInfo)
  4072. {
  4073. int ret;
  4074. #ifdef HAVE_PK_CALLBACKS
  4075. const byte* keyBuf = NULL;
  4076. word32 keySz = 0;
  4077. if (keyBufInfo) {
  4078. keyBuf = keyBufInfo->buffer;
  4079. keySz = keyBufInfo->length;
  4080. }
  4081. #endif
  4082. (void)ssl;
  4083. (void)keyBufInfo;
  4084. WOLFSSL_ENTER("EccSign");
  4085. #ifdef WOLFSSL_ASYNC_CRYPT
  4086. /* initialize event */
  4087. if (key) {
  4088. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4089. if (ret != 0)
  4090. return ret;
  4091. }
  4092. #endif
  4093. #if defined(HAVE_PK_CALLBACKS)
  4094. if (ssl->ctx->EccSignCb) {
  4095. void* ctx = wolfSSL_GetEccSignCtx(ssl);
  4096. if (ctx == NULL) {
  4097. /* Try to get the WOLFSSL_CTX EccSignCtx*/
  4098. ctx = wolfSSL_CTX_GetEccSignCtx(ssl->ctx);
  4099. }
  4100. ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf,
  4101. keySz, ctx);
  4102. }
  4103. else
  4104. #endif /* HAVE_PK_CALLBACKS */
  4105. {
  4106. ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key);
  4107. }
  4108. /* Handle async pending response */
  4109. #ifdef WOLFSSL_ASYNC_CRYPT
  4110. if (key && ret == WC_PENDING_E) {
  4111. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4112. }
  4113. #endif /* WOLFSSL_ASYNC_CRYPT */
  4114. WOLFSSL_LEAVE("EccSign", ret);
  4115. return ret;
  4116. }
  4117. int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out,
  4118. word32 outSz, ecc_key* key, buffer* keyBufInfo)
  4119. {
  4120. int ret = SIG_VERIFY_E;
  4121. #ifdef HAVE_PK_CALLBACKS
  4122. const byte* keyBuf = NULL;
  4123. word32 keySz = 0;
  4124. if (keyBufInfo) {
  4125. keyBuf = keyBufInfo->buffer;
  4126. keySz = keyBufInfo->length;
  4127. }
  4128. #endif
  4129. (void)ssl;
  4130. (void)keyBufInfo;
  4131. WOLFSSL_ENTER("EccVerify");
  4132. #ifdef WOLFSSL_ASYNC_CRYPT
  4133. /* initialize event */
  4134. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4135. if (ret != 0)
  4136. return ret;
  4137. #endif
  4138. #ifdef HAVE_PK_CALLBACKS
  4139. if (ssl->ctx->EccVerifyCb) {
  4140. void* ctx = wolfSSL_GetEccVerifyCtx(ssl);
  4141. ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4142. &ssl->eccVerifyRes, ctx);
  4143. }
  4144. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  4145. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  4146. else
  4147. #else
  4148. if (!ssl->ctx->EccVerifyCb || ret == CRYPTOCB_UNAVAILABLE)
  4149. #endif
  4150. #endif /* HAVE_PK_CALLBACKS */
  4151. {
  4152. ret = wc_ecc_verify_hash(in, inSz, out, outSz, &ssl->eccVerifyRes, key);
  4153. }
  4154. /* Handle async pending response */
  4155. #ifdef WOLFSSL_ASYNC_CRYPT
  4156. if (ret == WC_PENDING_E) {
  4157. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4158. }
  4159. else
  4160. #endif /* WOLFSSL_ASYNC_CRYPT */
  4161. {
  4162. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4163. }
  4164. WOLFSSL_LEAVE("EccVerify", ret);
  4165. return ret;
  4166. }
  4167. int EccSharedSecret(WOLFSSL* ssl, ecc_key* priv_key, ecc_key* pub_key,
  4168. byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen,
  4169. int side)
  4170. {
  4171. int ret;
  4172. #ifdef WOLFSSL_ASYNC_CRYPT
  4173. WC_ASYNC_DEV* asyncDev = NULL;
  4174. #endif
  4175. (void)ssl;
  4176. (void)pubKeyDer;
  4177. (void)pubKeySz;
  4178. (void)side;
  4179. WOLFSSL_ENTER("EccSharedSecret");
  4180. #ifdef WOLFSSL_ASYNC_CRYPT
  4181. /* initialize event */
  4182. if (priv_key != NULL) {
  4183. asyncDev = &priv_key->asyncDev;
  4184. ret = wolfSSL_AsyncInit(ssl, asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4185. if (ret != 0)
  4186. return ret;
  4187. }
  4188. #endif
  4189. #ifdef HAVE_PK_CALLBACKS
  4190. if (ssl->ctx->EccSharedSecretCb) {
  4191. void* ctx = wolfSSL_GetEccSharedSecretCtx(ssl);
  4192. ecc_key* otherKey = (side == WOLFSSL_CLIENT_END) ? pub_key : priv_key;
  4193. ret = ssl->ctx->EccSharedSecretCb(ssl, otherKey, pubKeyDer,
  4194. pubKeySz, out, outlen, side, ctx);
  4195. }
  4196. else
  4197. #endif
  4198. {
  4199. #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
  4200. !defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2)) && \
  4201. !defined(HAVE_SELFTEST)
  4202. ret = wc_ecc_set_rng(priv_key, ssl->rng);
  4203. if (ret == 0)
  4204. #endif
  4205. {
  4206. PRIVATE_KEY_UNLOCK();
  4207. ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
  4208. PRIVATE_KEY_LOCK();
  4209. }
  4210. }
  4211. /* Handle async pending response */
  4212. #ifdef WOLFSSL_ASYNC_CRYPT
  4213. if (ret == WC_PENDING_E) {
  4214. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  4215. }
  4216. #endif /* WOLFSSL_ASYNC_CRYPT */
  4217. WOLFSSL_LEAVE("EccSharedSecret", ret);
  4218. return ret;
  4219. }
  4220. int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer)
  4221. {
  4222. int ret = 0;
  4223. int keySz = 0;
  4224. int ecc_curve = ECC_CURVE_DEF;
  4225. WOLFSSL_ENTER("EccMakeKey");
  4226. #ifdef WOLFSSL_ASYNC_CRYPT
  4227. /* initialize event */
  4228. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4229. if (ret != 0)
  4230. return ret;
  4231. #endif
  4232. /* get key size */
  4233. if (peer == NULL || peer->dp == NULL) {
  4234. keySz = ssl->eccTempKeySz;
  4235. /* get curve type */
  4236. if (ssl->ecdhCurveOID > 0) {
  4237. ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL);
  4238. }
  4239. }
  4240. else {
  4241. keySz = peer->dp->size;
  4242. ecc_curve = peer->dp->id;
  4243. }
  4244. #ifdef HAVE_PK_CALLBACKS
  4245. if (ssl->ctx->EccKeyGenCb) {
  4246. void* ctx = wolfSSL_GetEccKeyGenCtx(ssl);
  4247. ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx);
  4248. }
  4249. else
  4250. #endif
  4251. {
  4252. ret = wc_ecc_make_key_ex(ssl->rng, keySz, key, ecc_curve);
  4253. }
  4254. /* make sure the curve is set for TLS */
  4255. if (ret == 0 && key->dp) {
  4256. ssl->ecdhCurveOID = key->dp->oidSum;
  4257. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4258. ssl->namedGroup = 0;
  4259. #endif
  4260. }
  4261. /* Handle async pending response */
  4262. #ifdef WOLFSSL_ASYNC_CRYPT
  4263. if (ret == WC_PENDING_E) {
  4264. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4265. }
  4266. #endif /* WOLFSSL_ASYNC_CRYPT */
  4267. WOLFSSL_LEAVE("EccMakeKey", ret);
  4268. return ret;
  4269. }
  4270. #endif /* HAVE_ECC */
  4271. #ifdef HAVE_ED25519
  4272. /* Check whether the key contains a public key.
  4273. * If not then pull it out of the leaf certificate.
  4274. *
  4275. * ssl SSL/TLS object.
  4276. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4277. * 0 on success.
  4278. */
  4279. int Ed25519CheckPubKey(WOLFSSL* ssl)
  4280. {
  4281. #ifndef HAVE_ED25519_KEY_IMPORT
  4282. (void)ssl;
  4283. return NOT_COMPILED_IN;
  4284. #else /* HAVE_ED25519_KEY_IMPORT */
  4285. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  4286. int ret = 0;
  4287. /* Public key required for signing. */
  4288. if (key != NULL && !key->pubKeySet) {
  4289. DerBuffer* leaf = ssl->buffers.certificate;
  4290. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert),
  4291. ssl->heap, DYNAMIC_TYPE_DCERT);
  4292. if (cert == NULL)
  4293. ret = MEMORY_E;
  4294. if (ret == 0) {
  4295. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4296. ret = DecodeToKey(cert, 0);
  4297. }
  4298. if (ret == 0) {
  4299. ret = wc_ed25519_import_public(cert->publicKey, cert->pubKeySize,
  4300. key);
  4301. }
  4302. if (cert != NULL) {
  4303. FreeDecodedCert(cert);
  4304. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4305. }
  4306. }
  4307. return ret;
  4308. #endif /* HAVE_ED25519_KEY_IMPORT */
  4309. }
  4310. /* Sign the data using EdDSA and key using Ed25519.
  4311. *
  4312. * ssl SSL object.
  4313. * in Data or message to sign.
  4314. * inSz Length of the data.
  4315. * out Buffer to hold signature.
  4316. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4317. * key The private Ed25519 key data.
  4318. * keySz The length of the private key data in bytes.
  4319. * ctx The callback context.
  4320. * returns 0 on success, otherwise the value is an error.
  4321. */
  4322. int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4323. word32* outSz, ed25519_key* key, DerBuffer* keyBufInfo)
  4324. {
  4325. #ifndef HAVE_ED25519_SIGN
  4326. (void)ssl;
  4327. (void)in;
  4328. (void)inSz;
  4329. (void)out;
  4330. (void)outSz;
  4331. (void)key;
  4332. (void)keyBufInfo;
  4333. return NOT_COMPILED_IN;
  4334. #else /* HAVE_ED25519_SIGN */
  4335. int ret;
  4336. #ifdef HAVE_PK_CALLBACKS
  4337. const byte* keyBuf = NULL;
  4338. word32 keySz = 0;
  4339. if (keyBufInfo) {
  4340. keyBuf = keyBufInfo->buffer;
  4341. keySz = keyBufInfo->length;
  4342. }
  4343. #endif
  4344. (void)ssl;
  4345. (void)keyBufInfo;
  4346. WOLFSSL_ENTER("Ed25519Sign");
  4347. #ifdef WOLFSSL_ASYNC_CRYPT
  4348. /* initialize event */
  4349. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4350. if (ret != 0)
  4351. return ret;
  4352. #endif
  4353. #if defined(HAVE_PK_CALLBACKS)
  4354. if (ssl->ctx->Ed25519SignCb) {
  4355. void* ctx = wolfSSL_GetEd25519SignCtx(ssl);
  4356. ret = ssl->ctx->Ed25519SignCb(ssl, in, inSz, out, outSz, keyBuf,
  4357. keySz, ctx);
  4358. }
  4359. else
  4360. #endif /* HAVE_PK_CALLBACKS */
  4361. {
  4362. ret = wc_ed25519_sign_msg(in, inSz, out, outSz, key);
  4363. }
  4364. /* Handle async pending response */
  4365. #ifdef WOLFSSL_ASYNC_CRYPT
  4366. if (ret == WC_PENDING_E) {
  4367. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4368. }
  4369. #endif /* WOLFSSL_ASYNC_CRYPT */
  4370. WOLFSSL_LEAVE("Ed25519Sign", ret);
  4371. return ret;
  4372. #endif /* HAVE_ED25519_SIGN */
  4373. }
  4374. /* Verify the data using EdDSA and key using Ed25519.
  4375. *
  4376. * ssl SSL object.
  4377. * in Signature data.
  4378. * inSz Length of the signature data in bytes.
  4379. * msg Message to verify.
  4380. * outSz Length of message in bytes.
  4381. * key The public Ed25519 key data.
  4382. * keySz The length of the private key data in bytes.
  4383. * ctx The callback context.
  4384. * returns 0 on success, otherwise the value is an error.
  4385. */
  4386. int Ed25519Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4387. word32 msgSz, ed25519_key* key, buffer* keyBufInfo)
  4388. {
  4389. #ifndef HAVE_ED25519_VERIFY
  4390. (void)ssl;
  4391. (void)in;
  4392. (void)inSz;
  4393. (void)msg;
  4394. (void)msgSz;
  4395. (void)key;
  4396. (void)keyBufInfo;
  4397. return NOT_COMPILED_IN;
  4398. #else /* HAVE_ED25519_VERIFY */
  4399. int ret;
  4400. #ifdef HAVE_PK_CALLBACKS
  4401. const byte* keyBuf = NULL;
  4402. word32 keySz = 0;
  4403. if (keyBufInfo) {
  4404. keyBuf = keyBufInfo->buffer;
  4405. keySz = keyBufInfo->length;
  4406. }
  4407. #endif
  4408. (void)ssl;
  4409. (void)keyBufInfo;
  4410. WOLFSSL_ENTER("Ed25519Verify");
  4411. #ifdef WOLFSSL_ASYNC_CRYPT
  4412. /* initialize event */
  4413. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4414. if (ret != 0)
  4415. return ret;
  4416. #endif
  4417. #ifdef HAVE_PK_CALLBACKS
  4418. if (ssl->ctx->Ed25519VerifyCb) {
  4419. void* ctx = wolfSSL_GetEd25519VerifyCtx(ssl);
  4420. ret = ssl->ctx->Ed25519VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf,
  4421. keySz, &ssl->eccVerifyRes, ctx);
  4422. }
  4423. else
  4424. #endif /* HAVE_PK_CALLBACKS */
  4425. {
  4426. ret = wc_ed25519_verify_msg(in, inSz, msg, msgSz,
  4427. &ssl->eccVerifyRes, key);
  4428. }
  4429. /* Handle async pending response */
  4430. #ifdef WOLFSSL_ASYNC_CRYPT
  4431. if (ret == WC_PENDING_E) {
  4432. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4433. }
  4434. else
  4435. #endif /* WOLFSSL_ASYNC_CRYPT */
  4436. {
  4437. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4438. }
  4439. WOLFSSL_LEAVE("Ed25519Verify", ret);
  4440. return ret;
  4441. #endif /* HAVE_ED25519_VERIFY */
  4442. }
  4443. #endif /* HAVE_ED25519 */
  4444. #ifndef WOLFSSL_NO_TLS12
  4445. #ifdef HAVE_CURVE25519
  4446. #ifdef HAVE_PK_CALLBACKS
  4447. /* Gets X25519 key for shared secret callback testing
  4448. * Client side: returns peer key
  4449. * Server side: returns private key
  4450. */
  4451. static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey)
  4452. {
  4453. int ret = NO_PEER_KEY;
  4454. struct curve25519_key* tmpKey = NULL;
  4455. if (ssl == NULL || otherKey == NULL) {
  4456. return BAD_FUNC_ARG;
  4457. }
  4458. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4459. if (!ssl->peerX25519Key || !ssl->peerX25519KeyPresent ||
  4460. !ssl->peerX25519Key->dp) {
  4461. return NO_PEER_KEY;
  4462. }
  4463. tmpKey = (struct curve25519_key*)ssl->peerX25519Key;
  4464. }
  4465. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4466. if (!ssl->eccTempKeyPresent) {
  4467. return NO_PRIVATE_KEY;
  4468. }
  4469. tmpKey = (struct curve25519_key*)ssl->eccTempKey;
  4470. }
  4471. if (tmpKey) {
  4472. *otherKey = (curve25519_key *)tmpKey;
  4473. ret = 0;
  4474. }
  4475. return ret;
  4476. }
  4477. #endif /* HAVE_PK_CALLBACKS */
  4478. static int X25519SharedSecret(WOLFSSL* ssl, curve25519_key* priv_key,
  4479. curve25519_key* pub_key, byte* pubKeyDer, word32* pubKeySz,
  4480. byte* out, word32* outlen, int side)
  4481. {
  4482. int ret;
  4483. (void)ssl;
  4484. (void)pubKeyDer;
  4485. (void)pubKeySz;
  4486. (void)side;
  4487. WOLFSSL_ENTER("X25519SharedSecret");
  4488. #ifdef WOLFSSL_ASYNC_CRYPT
  4489. /* initialize event */
  4490. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4491. if (ret != 0)
  4492. return ret;
  4493. #endif
  4494. #ifdef HAVE_PK_CALLBACKS
  4495. if (ssl->ctx->X25519SharedSecretCb) {
  4496. curve25519_key* otherKey = NULL;
  4497. ret = X25519GetKey(ssl, &otherKey);
  4498. if (ret == 0) {
  4499. void* ctx = wolfSSL_GetX25519SharedSecretCtx(ssl);
  4500. ret = ssl->ctx->X25519SharedSecretCb(ssl, otherKey, pubKeyDer,
  4501. pubKeySz, out, outlen, side, ctx);
  4502. }
  4503. }
  4504. else
  4505. #endif
  4506. {
  4507. ret = wc_curve25519_shared_secret_ex(priv_key, pub_key, out, outlen,
  4508. EC25519_LITTLE_ENDIAN);
  4509. }
  4510. /* Handle async pending response */
  4511. #ifdef WOLFSSL_ASYNC_CRYPT
  4512. if (ret == WC_PENDING_E) {
  4513. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4514. }
  4515. #endif /* WOLFSSL_ASYNC_CRYPT */
  4516. WOLFSSL_LEAVE("X25519SharedSecret", ret);
  4517. return ret;
  4518. }
  4519. static int X25519MakeKey(WOLFSSL* ssl, curve25519_key* key,
  4520. curve25519_key* peer)
  4521. {
  4522. int ret = 0;
  4523. (void)peer;
  4524. WOLFSSL_ENTER("X25519MakeKey");
  4525. #ifdef WOLFSSL_ASYNC_CRYPT
  4526. /* initialize event */
  4527. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4528. if (ret != 0)
  4529. return ret;
  4530. #endif
  4531. #ifdef HAVE_PK_CALLBACKS
  4532. if (ssl->ctx->X25519KeyGenCb) {
  4533. void* ctx = wolfSSL_GetX25519KeyGenCtx(ssl);
  4534. ret = ssl->ctx->X25519KeyGenCb(ssl, key, CURVE25519_KEYSIZE, ctx);
  4535. }
  4536. else
  4537. #endif
  4538. {
  4539. ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
  4540. }
  4541. if (ret == 0) {
  4542. ssl->ecdhCurveOID = ECC_X25519_OID;
  4543. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4544. ssl->namedGroup = 0;
  4545. #endif
  4546. }
  4547. /* Handle async pending response */
  4548. #ifdef WOLFSSL_ASYNC_CRYPT
  4549. if (ret == WC_PENDING_E) {
  4550. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4551. }
  4552. #endif /* WOLFSSL_ASYNC_CRYPT */
  4553. WOLFSSL_LEAVE("X25519MakeKey", ret);
  4554. return ret;
  4555. }
  4556. #endif /* HAVE_CURVE25519 */
  4557. #endif /* !WOLFSSL_NO_TLS12 */
  4558. #ifdef HAVE_ED448
  4559. /* Check whether the key contains a public key.
  4560. * If not then pull it out of the leaf certificate.
  4561. *
  4562. * ssl SSL/TLS object.
  4563. * returns MEMORY_E when unable to allocate memory, a parsing error, otherwise
  4564. * 0 on success.
  4565. */
  4566. int Ed448CheckPubKey(WOLFSSL* ssl)
  4567. {
  4568. #ifndef HAVE_ED448_KEY_IMPORT
  4569. (void)ssl;
  4570. return NOT_COMPILED_IN;
  4571. #else /* HAVE_ED448_KEY_IMPORT */
  4572. ed448_key* key = (ed448_key*)ssl->hsKey;
  4573. int ret = 0;
  4574. /* Public key required for signing. */
  4575. if (key != NULL && !key->pubKeySet) {
  4576. DerBuffer* leaf = ssl->buffers.certificate;
  4577. DecodedCert* cert = (DecodedCert*)XMALLOC(sizeof(*cert), ssl->heap,
  4578. DYNAMIC_TYPE_DCERT);
  4579. if (cert == NULL)
  4580. ret = MEMORY_E;
  4581. if (ret == 0) {
  4582. InitDecodedCert(cert, leaf->buffer, leaf->length, ssl->heap);
  4583. ret = DecodeToKey(cert, 0);
  4584. }
  4585. if (ret == 0) {
  4586. ret = wc_ed448_import_public(cert->publicKey, cert->pubKeySize,
  4587. key);
  4588. }
  4589. if (cert != NULL) {
  4590. FreeDecodedCert(cert);
  4591. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  4592. }
  4593. }
  4594. return ret;
  4595. #endif /* HAVE_ED448_KEY_IMPORT */
  4596. }
  4597. /* Sign the data using EdDSA and key using Ed448.
  4598. *
  4599. * ssl SSL object.
  4600. * in Data or message to sign.
  4601. * inSz Length of the data.
  4602. * out Buffer to hold signature.
  4603. * outSz On entry, size of the buffer. On exit, the size of the signature.
  4604. * key The private Ed448 key data.
  4605. * keySz The length of the private key data in bytes.
  4606. * ctx The callback context.
  4607. * returns 0 on success, otherwise the value is an error.
  4608. */
  4609. int Ed448Sign(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out,
  4610. word32* outSz, ed448_key* key, DerBuffer* keyBufInfo)
  4611. {
  4612. #ifndef HAVE_ED448_SIGN
  4613. (void)ssl;
  4614. (void)in;
  4615. (void)inSz;
  4616. (void)out;
  4617. (void)outSz;
  4618. (void)key;
  4619. (void)keyBufInfo;
  4620. return NOT_COMPILED_IN;
  4621. #else /* HAVE_ED448_SIGN */
  4622. int ret;
  4623. #ifdef HAVE_PK_CALLBACKS
  4624. const byte* keyBuf = NULL;
  4625. word32 keySz = 0;
  4626. if (keyBufInfo) {
  4627. keyBuf = keyBufInfo->buffer;
  4628. keySz = keyBufInfo->length;
  4629. }
  4630. #endif
  4631. (void)ssl;
  4632. (void)keyBufInfo;
  4633. WOLFSSL_ENTER("Ed448Sign");
  4634. #ifdef WOLFSSL_ASYNC_CRYPT
  4635. /* initialize event */
  4636. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4637. if (ret != 0)
  4638. return ret;
  4639. #endif
  4640. #if defined(HAVE_PK_CALLBACKS)
  4641. if (ssl->ctx->Ed448SignCb) {
  4642. void* ctx = wolfSSL_GetEd448SignCtx(ssl);
  4643. ret = ssl->ctx->Ed448SignCb(ssl, in, inSz, out, outSz, keyBuf, keySz,
  4644. ctx);
  4645. }
  4646. else
  4647. #endif /* HAVE_PK_CALLBACKS */
  4648. {
  4649. ret = wc_ed448_sign_msg(in, inSz, out, outSz, key, NULL, 0);
  4650. }
  4651. /* Handle async pending response */
  4652. #ifdef WOLFSSL_ASYNC_CRYPT
  4653. if (ret == WC_PENDING_E) {
  4654. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4655. }
  4656. #endif /* WOLFSSL_ASYNC_CRYPT */
  4657. WOLFSSL_LEAVE("Ed448Sign", ret);
  4658. return ret;
  4659. #endif /* HAVE_ED448_SIGN */
  4660. }
  4661. /* Verify the data using EdDSA and key using Ed448.
  4662. *
  4663. * ssl SSL object.
  4664. * in Signature data.
  4665. * inSz Length of the signature data in bytes.
  4666. * msg Message to verify.
  4667. * outSz Length of message in bytes.
  4668. * key The public Ed448 key data.
  4669. * keySz The length of the private key data in bytes.
  4670. * ctx The callback context.
  4671. * returns 0 on success, otherwise the value is an error.
  4672. */
  4673. int Ed448Verify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* msg,
  4674. word32 msgSz, ed448_key* key, buffer* keyBufInfo)
  4675. {
  4676. #ifndef HAVE_ED448_VERIFY
  4677. (void)ssl;
  4678. (void)in;
  4679. (void)inSz;
  4680. (void)msg;
  4681. (void)msgSz;
  4682. (void)key;
  4683. (void)keyBufInfo;
  4684. return NOT_COMPILED_IN;
  4685. #else /* HAVE_ED448_VERIFY */
  4686. int ret;
  4687. #ifdef HAVE_PK_CALLBACKS
  4688. const byte* keyBuf = NULL;
  4689. word32 keySz = 0;
  4690. if (keyBufInfo) {
  4691. keyBuf = keyBufInfo->buffer;
  4692. keySz = keyBufInfo->length;
  4693. }
  4694. #endif
  4695. (void)ssl;
  4696. (void)keyBufInfo;
  4697. WOLFSSL_ENTER("Ed448Verify");
  4698. #ifdef WOLFSSL_ASYNC_CRYPT
  4699. /* initialize event */
  4700. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4701. if (ret != 0)
  4702. return ret;
  4703. #endif
  4704. #ifdef HAVE_PK_CALLBACKS
  4705. if (ssl->ctx->Ed448VerifyCb) {
  4706. void* ctx = wolfSSL_GetEd448VerifyCtx(ssl);
  4707. ret = ssl->ctx->Ed448VerifyCb(ssl, in, inSz, msg, msgSz, keyBuf, keySz,
  4708. &ssl->eccVerifyRes, ctx);
  4709. }
  4710. else
  4711. #endif /* HAVE_PK_CALLBACKS */
  4712. {
  4713. ret = wc_ed448_verify_msg(in, inSz, msg, msgSz, &ssl->eccVerifyRes, key,
  4714. NULL, 0);
  4715. }
  4716. /* Handle async pending response */
  4717. #ifdef WOLFSSL_ASYNC_CRYPT
  4718. if (ret == WC_PENDING_E) {
  4719. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4720. }
  4721. else
  4722. #endif /* WOLFSSL_ASYNC_CRYPT */
  4723. {
  4724. ret = (ret != 0 || ssl->eccVerifyRes == 0) ? VERIFY_SIGN_ERROR : 0;
  4725. }
  4726. WOLFSSL_LEAVE("Ed448Verify", ret);
  4727. return ret;
  4728. #endif /* HAVE_ED448_VERIFY */
  4729. }
  4730. #endif /* HAVE_ED448 */
  4731. #ifndef WOLFSSL_NO_TLS12
  4732. #ifdef HAVE_CURVE448
  4733. #ifdef HAVE_PK_CALLBACKS
  4734. /* Gets X448 key for shared secret callback testing
  4735. * Client side: returns peer key
  4736. * Server side: returns private key
  4737. */
  4738. static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey)
  4739. {
  4740. int ret = NO_PEER_KEY;
  4741. struct curve448_key* tmpKey = NULL;
  4742. if (ssl == NULL || otherKey == NULL) {
  4743. return BAD_FUNC_ARG;
  4744. }
  4745. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  4746. if (!ssl->peerX448Key || !ssl->peerX448KeyPresent) {
  4747. return NO_PEER_KEY;
  4748. }
  4749. tmpKey = (struct curve448_key*)ssl->peerX448Key;
  4750. }
  4751. else if (ssl->options.side == WOLFSSL_SERVER_END) {
  4752. if (!ssl->eccTempKeyPresent) {
  4753. return NO_PRIVATE_KEY;
  4754. }
  4755. tmpKey = (struct curve448_key*)ssl->eccTempKey;
  4756. }
  4757. if (tmpKey) {
  4758. *otherKey = (curve448_key *)tmpKey;
  4759. ret = 0;
  4760. }
  4761. return ret;
  4762. }
  4763. #endif /* HAVE_PK_CALLBACKS */
  4764. static int X448SharedSecret(WOLFSSL* ssl, curve448_key* priv_key,
  4765. curve448_key* pub_key, byte* pubKeyDer,
  4766. word32* pubKeySz, byte* out, word32* outlen,
  4767. int side)
  4768. {
  4769. int ret;
  4770. (void)ssl;
  4771. (void)pubKeyDer;
  4772. (void)pubKeySz;
  4773. (void)side;
  4774. WOLFSSL_ENTER("X448SharedSecret");
  4775. #ifdef WOLFSSL_ASYNC_CRYPT
  4776. /* initialize event */
  4777. ret = wolfSSL_AsyncInit(ssl, &priv_key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
  4778. if (ret != 0)
  4779. return ret;
  4780. #endif
  4781. #ifdef HAVE_PK_CALLBACKS
  4782. if (ssl->ctx->X448SharedSecretCb) {
  4783. curve448_key* otherKey = NULL;
  4784. ret = X448GetKey(ssl, &otherKey);
  4785. if (ret == 0) {
  4786. void* ctx = wolfSSL_GetX448SharedSecretCtx(ssl);
  4787. ret = ssl->ctx->X448SharedSecretCb(ssl, otherKey, pubKeyDer,
  4788. pubKeySz, out, outlen, side, ctx);
  4789. }
  4790. }
  4791. else
  4792. #endif
  4793. {
  4794. ret = wc_curve448_shared_secret_ex(priv_key, pub_key, out, outlen,
  4795. EC448_LITTLE_ENDIAN);
  4796. }
  4797. /* Handle async pending response */
  4798. #ifdef WOLFSSL_ASYNC_CRYPT
  4799. if (ret == WC_PENDING_E) {
  4800. ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev);
  4801. }
  4802. #endif /* WOLFSSL_ASYNC_CRYPT */
  4803. WOLFSSL_LEAVE("X448SharedSecret", ret);
  4804. return ret;
  4805. }
  4806. static int X448MakeKey(WOLFSSL* ssl, curve448_key* key, curve448_key* peer)
  4807. {
  4808. int ret = 0;
  4809. (void)peer;
  4810. WOLFSSL_ENTER("X448MakeKey");
  4811. #ifdef WOLFSSL_ASYNC_CRYPT
  4812. /* initialize event */
  4813. ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
  4814. if (ret != 0)
  4815. return ret;
  4816. #endif
  4817. #ifdef HAVE_PK_CALLBACKS
  4818. if (ssl->ctx->X448KeyGenCb) {
  4819. void* ctx = wolfSSL_GetX448KeyGenCtx(ssl);
  4820. ret = ssl->ctx->X448KeyGenCb(ssl, key, CURVE448_KEY_SIZE, ctx);
  4821. }
  4822. else
  4823. #endif
  4824. {
  4825. ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
  4826. }
  4827. if (ret == 0) {
  4828. ssl->ecdhCurveOID = ECC_X448_OID;
  4829. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  4830. ssl->namedGroup = 0;
  4831. #endif
  4832. }
  4833. /* Handle async pending response */
  4834. #ifdef WOLFSSL_ASYNC_CRYPT
  4835. if (ret == WC_PENDING_E) {
  4836. ret = wolfSSL_AsyncPush(ssl, &key->asyncDev);
  4837. }
  4838. #endif /* WOLFSSL_ASYNC_CRYPT */
  4839. WOLFSSL_LEAVE("X448MakeKey", ret);
  4840. return ret;
  4841. }
  4842. #endif /* HAVE_CURVE448 */
  4843. #endif /* !WOLFSSL_NO_TLS12 */
  4844. #if !defined(NO_CERTS) || !defined(NO_PSK)
  4845. #if !defined(NO_DH)
  4846. int DhGenKeyPair(WOLFSSL* ssl, DhKey* dhKey,
  4847. byte* priv, word32* privSz,
  4848. byte* pub, word32* pubSz)
  4849. {
  4850. int ret;
  4851. WOLFSSL_ENTER("DhGenKeyPair");
  4852. #ifdef WOLFSSL_ASYNC_CRYPT
  4853. /* initialize event */
  4854. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4855. if (ret != 0)
  4856. return ret;
  4857. #endif
  4858. PRIVATE_KEY_UNLOCK();
  4859. ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, priv, privSz, pub, pubSz);
  4860. PRIVATE_KEY_LOCK();
  4861. /* Handle async pending response */
  4862. #ifdef WOLFSSL_ASYNC_CRYPT
  4863. if (ret == WC_PENDING_E) {
  4864. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  4865. }
  4866. #endif /* WOLFSSL_ASYNC_CRYPT */
  4867. WOLFSSL_LEAVE("DhGenKeyPair", ret);
  4868. return ret;
  4869. }
  4870. int DhAgree(WOLFSSL* ssl, DhKey* dhKey,
  4871. const byte* priv, word32 privSz,
  4872. const byte* otherPub, word32 otherPubSz,
  4873. byte* agree, word32* agreeSz,
  4874. const byte* prime, word32 primeSz)
  4875. {
  4876. int ret;
  4877. (void)ssl;
  4878. WOLFSSL_ENTER("DhAgree");
  4879. #ifdef WOLFSSL_ASYNC_CRYPT
  4880. /* initialize event */
  4881. ret = wolfSSL_AsyncInit(ssl, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
  4882. if (ret != 0)
  4883. return ret;
  4884. #endif
  4885. #ifdef HAVE_PK_CALLBACKS
  4886. if (ssl->ctx->DhAgreeCb) {
  4887. void* ctx = wolfSSL_GetDhAgreeCtx(ssl);
  4888. WOLFSSL_MSG("Calling DhAgree Callback Function");
  4889. ret = ssl->ctx->DhAgreeCb(ssl, dhKey, priv, privSz,
  4890. otherPub, otherPubSz, agree, agreeSz, ctx);
  4891. }
  4892. else
  4893. #endif
  4894. {
  4895. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  4896. /* check the public key has valid number */
  4897. if (dhKey != NULL && (prime == NULL || primeSz == 0)) {
  4898. /* wc_DhCheckPubKey does not do exponentiation */
  4899. ret = wc_DhCheckPubKey(dhKey, otherPub, otherPubSz);
  4900. }
  4901. else {
  4902. ret = wc_DhCheckPubValue(prime, primeSz, otherPub, otherPubSz);
  4903. }
  4904. if (ret != 0) {
  4905. /* translate to valid error (wc_DhCheckPubValue returns MP_VAL -1) */
  4906. ret = PEER_KEY_ERROR;
  4907. #ifdef OPENSSL_EXTRA
  4908. SendAlert(ssl, alert_fatal, illegal_parameter);
  4909. #endif
  4910. }
  4911. else
  4912. #endif
  4913. {
  4914. PRIVATE_KEY_UNLOCK();
  4915. ret = wc_DhAgree(dhKey, agree, agreeSz, priv, privSz, otherPub,
  4916. otherPubSz);
  4917. PRIVATE_KEY_LOCK();
  4918. }
  4919. }
  4920. /* Handle async pending response */
  4921. #ifdef WOLFSSL_ASYNC_CRYPT
  4922. if (ret == WC_PENDING_E) {
  4923. ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev);
  4924. }
  4925. #endif /* WOLFSSL_ASYNC_CRYPT */
  4926. WOLFSSL_LEAVE("DhAgree", ret);
  4927. (void)prime;
  4928. (void)primeSz;
  4929. return ret;
  4930. }
  4931. #endif /* !NO_DH */
  4932. #endif /* !NO_CERTS || !NO_PSK */
  4933. #ifdef HAVE_PK_CALLBACKS
  4934. int wolfSSL_IsPrivatePkSet(WOLFSSL* ssl)
  4935. {
  4936. int pkcbset = 0;
  4937. (void)ssl;
  4938. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  4939. !defined(NO_RSA)
  4940. if (0
  4941. #ifdef HAVE_ECC
  4942. || (ssl->ctx->EccSignCb != NULL &&
  4943. ssl->buffers.keyType == ecc_dsa_sa_algo)
  4944. #endif
  4945. #ifdef HAVE_ED25519
  4946. || (ssl->ctx->Ed25519SignCb != NULL &&
  4947. ssl->buffers.keyType == ed25519_sa_algo)
  4948. #endif
  4949. #ifdef HAVE_ED448
  4950. || (ssl->ctx->Ed448SignCb != NULL &&
  4951. ssl->buffers.keyType == ed448_sa_algo)
  4952. #endif
  4953. #ifndef NO_RSA
  4954. || (ssl->ctx->RsaSignCb != NULL && ssl->buffers.keyType == rsa_sa_algo)
  4955. || (ssl->ctx->RsaDecCb != NULL && ssl->buffers.keyType == rsa_kea)
  4956. #ifdef WC_RSA_PSS
  4957. || (ssl->ctx->RsaPssSignCb != NULL &&
  4958. ssl->buffers.keyType == rsa_pss_sa_algo)
  4959. #endif
  4960. #endif
  4961. ) {
  4962. pkcbset = 1;
  4963. }
  4964. #endif
  4965. return pkcbset;
  4966. }
  4967. int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
  4968. {
  4969. int pkcbset = 0;
  4970. (void)ctx;
  4971. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  4972. !defined(NO_RSA)
  4973. if (0
  4974. #ifdef HAVE_ECC
  4975. || ctx->EccSignCb != NULL
  4976. #endif
  4977. #ifdef HAVE_ED25519
  4978. || ctx->Ed25519SignCb != NULL
  4979. #endif
  4980. #ifdef HAVE_ED448
  4981. || ctx->Ed448SignCb != NULL
  4982. #endif
  4983. #ifndef NO_RSA
  4984. || ctx->RsaSignCb != NULL
  4985. || ctx->RsaDecCb != NULL
  4986. #ifdef WC_RSA_PSS
  4987. || ctx->RsaPssSignCb != NULL
  4988. #endif
  4989. #endif
  4990. ) {
  4991. pkcbset = 1;
  4992. }
  4993. #endif
  4994. return pkcbset;
  4995. }
  4996. #endif /* HAVE_PK_CALLBACKS */
  4997. int InitSSL_Suites(WOLFSSL* ssl)
  4998. {
  4999. int keySz = 0;
  5000. byte havePSK = 0;
  5001. byte haveAnon = 0;
  5002. byte haveRSA = 0;
  5003. byte haveMcast = 0;
  5004. (void)haveAnon; /* Squash unused var warnings */
  5005. (void)haveMcast;
  5006. if (!ssl)
  5007. return BAD_FUNC_ARG;
  5008. #ifndef NO_RSA
  5009. haveRSA = 1;
  5010. #endif
  5011. #ifndef NO_PSK
  5012. havePSK = (byte)ssl->options.havePSK;
  5013. #endif /* NO_PSK */
  5014. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5015. #ifdef HAVE_ANON
  5016. haveAnon = (byte)ssl->options.haveAnon;
  5017. #endif /* HAVE_ANON*/
  5018. #ifdef WOLFSSL_MULTICAST
  5019. haveMcast = (byte)ssl->options.haveMcast;
  5020. #endif /* WOLFSSL_MULTICAST */
  5021. #endif /* !NO_CERTS && !WOLFSSL_SESSION_EXPORT */
  5022. #ifdef WOLFSSL_EARLY_DATA
  5023. if (ssl->options.side == WOLFSSL_SERVER_END)
  5024. ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz;
  5025. #endif
  5026. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5027. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5028. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5029. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5030. ssl->buffers.keyType == ed25519_sa_algo ||
  5031. ssl->buffers.keyType == ed448_sa_algo;
  5032. #endif
  5033. #ifndef NO_CERTS
  5034. keySz = ssl->buffers.keySz;
  5035. #endif
  5036. /* make sure server has DH parms, and add PSK if there */
  5037. if (ssl->options.side == WOLFSSL_SERVER_END) {
  5038. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  5039. ssl->options.haveDH, ssl->options.haveECDSAsig,
  5040. ssl->options.haveECC, ssl->options.haveStaticECC,
  5041. ssl->options.haveFalconSig, ssl->options.haveAnon,
  5042. ssl->options.side);
  5043. }
  5044. else {
  5045. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, TRUE,
  5046. ssl->options.haveECDSAsig, ssl->options.haveECC,
  5047. ssl->options.haveStaticECC, ssl->options.haveFalconSig,
  5048. ssl->options.haveAnon, ssl->options.side);
  5049. }
  5050. #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT)
  5051. /* make sure server has cert and key unless using PSK, Anon, or
  5052. * Multicast. This should be true even if just switching ssl ctx */
  5053. if (ssl->options.side == WOLFSSL_SERVER_END &&
  5054. !havePSK && !haveAnon && !haveMcast) {
  5055. /* server certificate must be loaded */
  5056. if (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer) {
  5057. WOLFSSL_MSG("Server missing certificate");
  5058. return NO_PRIVATE_KEY;
  5059. }
  5060. if (!ssl->buffers.key || !ssl->buffers.key->buffer) {
  5061. /* allow no private key if using existing key */
  5062. #ifdef WOLF_PRIVATE_KEY_ID
  5063. if (ssl->devId != INVALID_DEVID
  5064. #ifdef HAVE_PK_CALLBACKS
  5065. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  5066. #endif
  5067. ) {
  5068. WOLFSSL_MSG("Allowing no server private key (external)");
  5069. }
  5070. else
  5071. #endif
  5072. {
  5073. WOLFSSL_MSG("Server missing private key");
  5074. return NO_PRIVATE_KEY;
  5075. }
  5076. }
  5077. }
  5078. #endif
  5079. return WOLFSSL_SUCCESS;
  5080. }
  5081. /* returns new reference count. Arg incr positive=up or negative=down */
  5082. int SSL_CTX_RefCount(WOLFSSL_CTX* ctx, int incr)
  5083. {
  5084. int refCount;
  5085. if (ctx == NULL) {
  5086. return BAD_FUNC_ARG;
  5087. }
  5088. if (wc_LockMutex(&ctx->countMutex) != 0) {
  5089. WOLFSSL_MSG("Couldn't lock CTX count mutex");
  5090. return BAD_MUTEX_E;
  5091. }
  5092. ctx->refCount += incr;
  5093. /* make sure refCount is never negative */
  5094. if (ctx->refCount < 0) {
  5095. ctx->refCount = 0;
  5096. }
  5097. refCount = ctx->refCount;
  5098. wc_UnLockMutex(&ctx->countMutex);
  5099. return refCount;
  5100. }
  5101. /* This function inherits a WOLFSSL_CTX's fields into an SSL object.
  5102. It is used during initialization and to switch an ssl's CTX with
  5103. wolfSSL_Set_SSL_CTX. Requires ssl->suites alloc and ssl-arrays with PSK
  5104. unless writeDup is on.
  5105. ssl object to initialize
  5106. ctx parent factory
  5107. writeDup flag indicating this is a write dup only
  5108. WOLFSSL_SUCCESS return value on success */
  5109. int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5110. {
  5111. int ret;
  5112. byte newSSL;
  5113. if (!ssl || !ctx)
  5114. return BAD_FUNC_ARG;
  5115. #ifndef SINGLE_THREADED
  5116. if (ssl->suites == NULL && !writeDup)
  5117. return BAD_FUNC_ARG;
  5118. #endif
  5119. newSSL = ssl->ctx == NULL; /* Assign after null check */
  5120. #ifndef NO_PSK
  5121. if (ctx->server_hint[0] && ssl->arrays == NULL && !writeDup) {
  5122. return BAD_FUNC_ARG; /* needed for copy below */
  5123. }
  5124. #endif
  5125. /* decrement previous CTX reference count if exists.
  5126. * This should only happen if switching ctxs!*/
  5127. if (!newSSL) {
  5128. WOLFSSL_MSG("freeing old ctx to decrement reference count. Switching ctx.");
  5129. wolfSSL_CTX_free(ssl->ctx);
  5130. }
  5131. /* increment CTX reference count */
  5132. if ((ret = SSL_CTX_RefCount(ctx, 1)) < 0) {
  5133. return ret;
  5134. }
  5135. ret = WOLFSSL_SUCCESS; /* set default ret */
  5136. ssl->ctx = ctx; /* only for passing to calls, options could change */
  5137. /* Don't change version on a SSL object that has already started a
  5138. * handshake */
  5139. if (!ssl->msgsReceived.got_client_hello &&
  5140. !ssl->msgsReceived.got_server_hello)
  5141. ssl->version = ctx->method->version;
  5142. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  5143. ssl->options.mask = ctx->mask;
  5144. ssl->options.minProto = ctx->minProto;
  5145. ssl->options.maxProto = ctx->maxProto;
  5146. #endif
  5147. #ifdef OPENSSL_EXTRA
  5148. #ifdef WOLFSSL_TLS13
  5149. if (ssl->version.minor == TLSv1_3_MINOR &&
  5150. (ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
  5151. if (!ctx->method->downgrade) {
  5152. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
  5153. "allowed and downgrading disabled.");
  5154. return VERSION_ERROR;
  5155. }
  5156. WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
  5157. ssl->version.minor = TLSv1_2_MINOR;
  5158. }
  5159. #endif
  5160. if (ssl->version.minor == TLSv1_2_MINOR &&
  5161. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  5162. if (!ctx->method->downgrade) {
  5163. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
  5164. "allowed and downgrading disabled.");
  5165. return VERSION_ERROR;
  5166. }
  5167. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  5168. ssl->version.minor = TLSv1_1_MINOR;
  5169. }
  5170. if (ssl->version.minor == TLSv1_1_MINOR &&
  5171. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  5172. if (!ctx->method->downgrade) {
  5173. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
  5174. "allowed and downgrading disabled.");
  5175. return VERSION_ERROR;
  5176. }
  5177. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  5178. ssl->options.tls1_1 = 0;
  5179. ssl->version.minor = TLSv1_MINOR;
  5180. }
  5181. if (ssl->version.minor == TLSv1_MINOR &&
  5182. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  5183. if (!ctx->method->downgrade) {
  5184. WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
  5185. "allowed and downgrading disabled.");
  5186. return VERSION_ERROR;
  5187. }
  5188. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  5189. ssl->options.tls = 0;
  5190. ssl->options.tls1_1 = 0;
  5191. ssl->version.minor = SSLv3_MINOR;
  5192. }
  5193. if (ssl->version.minor == SSLv3_MINOR &&
  5194. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  5195. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  5196. return VERSION_ERROR;
  5197. }
  5198. if (ssl->version.minor < ssl->options.minDowngrade) {
  5199. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  5200. return VERSION_ERROR;
  5201. }
  5202. #endif
  5203. #ifdef HAVE_ECC
  5204. ssl->eccTempKeySz = ctx->eccTempKeySz;
  5205. ssl->ecdhCurveOID = ctx->ecdhCurveOID;
  5206. #endif
  5207. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  5208. ssl->pkCurveOID = ctx->pkCurveOID;
  5209. #endif
  5210. #ifdef OPENSSL_EXTRA
  5211. ssl->CBIS = ctx->CBIS;
  5212. #endif
  5213. ssl->timeout = ctx->timeout;
  5214. ssl->verifyCallback = ctx->verifyCallback;
  5215. /* If we are setting the ctx on an already initialized SSL object
  5216. * then we possibly already have a side defined. Don't overwrite unless
  5217. * the context has a well defined role. */
  5218. if (newSSL || ctx->method->side != WOLFSSL_NEITHER_END)
  5219. ssl->options.side = ctx->method->side;
  5220. ssl->options.downgrade = ctx->method->downgrade;
  5221. ssl->options.minDowngrade = ctx->minDowngrade;
  5222. ssl->options.haveRSA = ctx->haveRSA;
  5223. ssl->options.haveDH = ctx->haveDH;
  5224. ssl->options.haveECDSAsig = ctx->haveECDSAsig;
  5225. ssl->options.haveECC = ctx->haveECC;
  5226. ssl->options.haveStaticECC = ctx->haveStaticECC;
  5227. ssl->options.haveFalconSig = ctx->haveFalconSig;
  5228. #ifndef NO_PSK
  5229. ssl->options.havePSK = ctx->havePSK;
  5230. ssl->options.client_psk_cb = ctx->client_psk_cb;
  5231. ssl->options.server_psk_cb = ctx->server_psk_cb;
  5232. ssl->options.psk_ctx = ctx->psk_ctx;
  5233. #ifdef WOLFSSL_TLS13
  5234. ssl->options.client_psk_cs_cb = ctx->client_psk_cs_cb;
  5235. ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
  5236. ssl->options.server_psk_tls13_cb = ctx->server_psk_tls13_cb;
  5237. #endif
  5238. #endif /* NO_PSK */
  5239. #ifdef WOLFSSL_EARLY_DATA
  5240. if (ssl->options.side == WOLFSSL_SERVER_END)
  5241. ssl->options.maxEarlyDataSz = ctx->maxEarlyDataSz;
  5242. #endif
  5243. #ifdef HAVE_ANON
  5244. ssl->options.haveAnon = ctx->haveAnon;
  5245. #endif
  5246. #ifndef NO_DH
  5247. ssl->options.minDhKeySz = ctx->minDhKeySz;
  5248. ssl->options.maxDhKeySz = ctx->maxDhKeySz;
  5249. #endif
  5250. #ifndef NO_RSA
  5251. ssl->options.minRsaKeySz = ctx->minRsaKeySz;
  5252. #endif
  5253. #ifdef HAVE_ECC
  5254. ssl->options.minEccKeySz = ctx->minEccKeySz;
  5255. #endif
  5256. #ifdef HAVE_PQC
  5257. ssl->options.minFalconKeySz = ctx->minFalconKeySz;
  5258. #endif
  5259. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  5260. ssl->options.verifyDepth = ctx->verifyDepth;
  5261. #endif
  5262. ssl->options.sessionCacheOff = ctx->sessionCacheOff;
  5263. ssl->options.sessionCacheFlushOff = ctx->sessionCacheFlushOff;
  5264. #ifdef HAVE_EXT_CACHE
  5265. ssl->options.internalCacheOff = ctx->internalCacheOff;
  5266. ssl->options.internalCacheLookupOff = ctx->internalCacheLookupOff;
  5267. #endif
  5268. ssl->options.verifyPeer = ctx->verifyPeer;
  5269. ssl->options.verifyNone = ctx->verifyNone;
  5270. ssl->options.failNoCert = ctx->failNoCert;
  5271. ssl->options.failNoCertxPSK = ctx->failNoCertxPSK;
  5272. ssl->options.sendVerify = ctx->sendVerify;
  5273. ssl->options.partialWrite = ctx->partialWrite;
  5274. ssl->options.quietShutdown = ctx->quietShutdown;
  5275. ssl->options.groupMessages = ctx->groupMessages;
  5276. #ifndef NO_DH
  5277. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5278. !defined(HAVE_SELFTEST)
  5279. ssl->options.dhKeyTested = ctx->dhKeyTested;
  5280. #endif
  5281. ssl->buffers.serverDH_P = ctx->serverDH_P;
  5282. ssl->buffers.serverDH_G = ctx->serverDH_G;
  5283. #endif
  5284. #ifndef NO_CERTS
  5285. /* ctx still owns certificate, certChain, key, dh, and cm */
  5286. ssl->buffers.certificate = ctx->certificate;
  5287. ssl->buffers.certChain = ctx->certChain;
  5288. #ifdef WOLFSSL_TLS13
  5289. ssl->buffers.certChainCnt = ctx->certChainCnt;
  5290. #endif
  5291. ssl->buffers.key = ctx->privateKey;
  5292. ssl->buffers.keyType = ctx->privateKeyType;
  5293. ssl->buffers.keyId = ctx->privateKeyId;
  5294. ssl->buffers.keyLabel = ctx->privateKeyLabel;
  5295. ssl->buffers.keySz = ctx->privateKeySz;
  5296. ssl->buffers.keyDevId = ctx->privateKeyDevId;
  5297. #endif
  5298. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  5299. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  5300. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  5301. ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END ||
  5302. ssl->buffers.keyType == ed25519_sa_algo ||
  5303. ssl->buffers.keyType == ed448_sa_algo;
  5304. #endif
  5305. #ifdef WOLFSSL_ASYNC_CRYPT
  5306. ssl->devId = ctx->devId;
  5307. #endif
  5308. if (writeDup == 0) {
  5309. #ifndef NO_PSK
  5310. if (ctx->server_hint[0]) { /* set in CTX */
  5311. XSTRNCPY(ssl->arrays->server_hint, ctx->server_hint,
  5312. sizeof(ssl->arrays->server_hint));
  5313. ssl->arrays->server_hint[MAX_PSK_ID_LEN] = '\0'; /* null term */
  5314. }
  5315. #endif /* NO_PSK */
  5316. if (ctx->suites) {
  5317. #ifndef SINGLE_THREADED
  5318. *ssl->suites = *ctx->suites;
  5319. #else
  5320. ssl->suites = ctx->suites;
  5321. #endif
  5322. }
  5323. else {
  5324. XMEMSET(ssl->suites, 0, sizeof(Suites));
  5325. }
  5326. if (ssl->options.side != WOLFSSL_NEITHER_END) {
  5327. /* Defer initializing suites until accept or connect */
  5328. ret = InitSSL_Suites(ssl);
  5329. }
  5330. } /* writeDup check */
  5331. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  5332. if (ctx->mask != 0 && wolfSSL_set_options(ssl, ctx->mask) == 0) {
  5333. WOLFSSL_MSG("wolfSSL_set_options error");
  5334. return BAD_FUNC_ARG;
  5335. }
  5336. #endif
  5337. #ifdef WOLFSSL_SESSION_EXPORT
  5338. #ifdef WOLFSSL_DTLS
  5339. ssl->dtls_export = ctx->dtls_export; /* export function for session */
  5340. #endif
  5341. #endif
  5342. #ifdef WOLFSSL_WOLFSENTRY_HOOKS
  5343. ssl->AcceptFilter = ctx->AcceptFilter;
  5344. ssl->AcceptFilter_arg = ctx->AcceptFilter_arg;
  5345. ssl->ConnectFilter = ctx->ConnectFilter;
  5346. ssl->ConnectFilter_arg = ctx->ConnectFilter_arg;
  5347. #endif
  5348. #ifdef OPENSSL_EXTRA
  5349. ssl->readAhead = ctx->readAhead;
  5350. #endif
  5351. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5352. /* Don't change recv callback if currently using BIO's */
  5353. if (ssl->CBIORecv != BioReceive)
  5354. #endif
  5355. ssl->CBIORecv = ctx->CBIORecv;
  5356. #if defined(OPENSSL_EXTRA) && !defined(NO_BIO)
  5357. /* Don't change send callback if currently using BIO's */
  5358. if (ssl->CBIOSend != BioSend)
  5359. #endif
  5360. ssl->CBIOSend = ctx->CBIOSend;
  5361. ssl->verifyDepth = ctx->verifyDepth;
  5362. return ret;
  5363. }
  5364. int InitHandshakeHashes(WOLFSSL* ssl)
  5365. {
  5366. int ret;
  5367. /* make sure existing handshake hashes are free'd */
  5368. if (ssl->hsHashes != NULL) {
  5369. FreeHandshakeHashes(ssl);
  5370. }
  5371. /* allocate handshake hashes */
  5372. ssl->hsHashes = (HS_Hashes*)XMALLOC(sizeof(HS_Hashes), ssl->heap,
  5373. DYNAMIC_TYPE_HASHES);
  5374. if (ssl->hsHashes == NULL) {
  5375. WOLFSSL_MSG("HS_Hashes Memory error");
  5376. return MEMORY_E;
  5377. }
  5378. XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes));
  5379. #ifndef NO_OLD_TLS
  5380. #ifndef NO_MD5
  5381. ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId);
  5382. if (ret != 0)
  5383. return ret;
  5384. #ifdef WOLFSSL_HASH_FLAGS
  5385. wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY);
  5386. #endif
  5387. #endif
  5388. #ifndef NO_SHA
  5389. ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId);
  5390. if (ret != 0)
  5391. return ret;
  5392. #ifdef WOLFSSL_HASH_FLAGS
  5393. wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY);
  5394. #endif
  5395. #endif
  5396. #endif /* !NO_OLD_TLS */
  5397. #ifndef NO_SHA256
  5398. ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId);
  5399. if (ret != 0)
  5400. return ret;
  5401. #ifdef WOLFSSL_HASH_FLAGS
  5402. wc_Sha256SetFlags(&ssl->hsHashes->hashSha256, WC_HASH_FLAG_WILLCOPY);
  5403. #endif
  5404. #endif
  5405. #ifdef WOLFSSL_SHA384
  5406. ret = wc_InitSha384_ex(&ssl->hsHashes->hashSha384, ssl->heap, ssl->devId);
  5407. if (ret != 0)
  5408. return ret;
  5409. #ifdef WOLFSSL_HASH_FLAGS
  5410. wc_Sha384SetFlags(&ssl->hsHashes->hashSha384, WC_HASH_FLAG_WILLCOPY);
  5411. #endif
  5412. #endif
  5413. #ifdef WOLFSSL_SHA512
  5414. ret = wc_InitSha512_ex(&ssl->hsHashes->hashSha512, ssl->heap, ssl->devId);
  5415. if (ret != 0)
  5416. return ret;
  5417. #ifdef WOLFSSL_HASH_FLAGS
  5418. wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY);
  5419. #endif
  5420. #endif
  5421. return ret;
  5422. }
  5423. void FreeHandshakeHashes(WOLFSSL* ssl)
  5424. {
  5425. if (ssl->hsHashes) {
  5426. #ifndef NO_OLD_TLS
  5427. #ifndef NO_MD5
  5428. wc_Md5Free(&ssl->hsHashes->hashMd5);
  5429. #endif
  5430. #ifndef NO_SHA
  5431. wc_ShaFree(&ssl->hsHashes->hashSha);
  5432. #endif
  5433. #endif /* !NO_OLD_TLS */
  5434. #ifndef NO_SHA256
  5435. wc_Sha256Free(&ssl->hsHashes->hashSha256);
  5436. #endif
  5437. #ifdef WOLFSSL_SHA384
  5438. wc_Sha384Free(&ssl->hsHashes->hashSha384);
  5439. #endif
  5440. #ifdef WOLFSSL_SHA512
  5441. wc_Sha512Free(&ssl->hsHashes->hashSha512);
  5442. #endif
  5443. #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \
  5444. !defined(WOLFSSL_NO_CLIENT_AUTH)
  5445. if (ssl->hsHashes->messages != NULL) {
  5446. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  5447. ssl->hsHashes->messages = NULL;
  5448. }
  5449. #endif
  5450. XFREE(ssl->hsHashes, ssl->heap, DYNAMIC_TYPE_HASHES);
  5451. ssl->hsHashes = NULL;
  5452. }
  5453. }
  5454. /* init everything to 0, NULL, default values before calling anything that may
  5455. fail so that destructor has a "good" state to cleanup
  5456. ssl object to initialize
  5457. ctx parent factory
  5458. writeDup flag indicating this is a write dup only
  5459. 0 on success */
  5460. int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
  5461. {
  5462. int ret;
  5463. XMEMSET(ssl, 0, sizeof(WOLFSSL));
  5464. #if defined(WOLFSSL_STATIC_MEMORY)
  5465. if (ctx->heap != NULL) {
  5466. WOLFSSL_HEAP_HINT* ssl_hint;
  5467. WOLFSSL_HEAP_HINT* ctx_hint;
  5468. /* avoid dereferencing a test value */
  5469. #ifdef WOLFSSL_HEAP_TEST
  5470. if (ctx->heap == (void*)WOLFSSL_HEAP_TEST) {
  5471. ssl->heap = ctx->heap;
  5472. }
  5473. else {
  5474. #endif
  5475. ssl->heap = (WOLFSSL_HEAP_HINT*)XMALLOC(sizeof(WOLFSSL_HEAP_HINT),
  5476. ctx->heap, DYNAMIC_TYPE_SSL);
  5477. if (ssl->heap == NULL) {
  5478. return MEMORY_E;
  5479. }
  5480. XMEMSET(ssl->heap, 0, sizeof(WOLFSSL_HEAP_HINT));
  5481. ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap));
  5482. ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap));
  5483. /* lock and check IO count / handshake count */
  5484. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5485. WOLFSSL_MSG("Bad memory_mutex lock");
  5486. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5487. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5488. return BAD_MUTEX_E;
  5489. }
  5490. if (ctx_hint->memory->maxHa > 0 &&
  5491. ctx_hint->memory->maxHa <= ctx_hint->memory->curHa) {
  5492. WOLFSSL_MSG("At max number of handshakes for static memory");
  5493. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5494. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5495. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5496. return MEMORY_E;
  5497. }
  5498. if (ctx_hint->memory->maxIO > 0 &&
  5499. ctx_hint->memory->maxIO <= ctx_hint->memory->curIO) {
  5500. WOLFSSL_MSG("At max number of IO allowed for static memory");
  5501. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5502. XFREE(ssl->heap, ctx->heap, DYNAMIC_TYPE_SSL);
  5503. ssl->heap = NULL; /* free and set to NULL for IO counter */
  5504. return MEMORY_E;
  5505. }
  5506. ctx_hint->memory->curIO++;
  5507. ctx_hint->memory->curHa++;
  5508. ssl_hint->memory = ctx_hint->memory;
  5509. ssl_hint->haFlag = 1;
  5510. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5511. /* check if tracking stats */
  5512. if (ctx_hint->memory->flag & WOLFMEM_TRACK_STATS) {
  5513. ssl_hint->stats = (WOLFSSL_MEM_CONN_STATS*)XMALLOC(
  5514. sizeof(WOLFSSL_MEM_CONN_STATS), ctx->heap, DYNAMIC_TYPE_SSL);
  5515. if (ssl_hint->stats == NULL) {
  5516. return MEMORY_E;
  5517. }
  5518. XMEMSET(ssl_hint->stats, 0, sizeof(WOLFSSL_MEM_CONN_STATS));
  5519. }
  5520. /* check if using fixed IO buffers */
  5521. if (ctx_hint->memory->flag & WOLFMEM_IO_POOL_FIXED) {
  5522. if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) {
  5523. WOLFSSL_MSG("Bad memory_mutex lock");
  5524. return BAD_MUTEX_E;
  5525. }
  5526. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->inBuf)) != 1) {
  5527. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5528. return MEMORY_E;
  5529. }
  5530. if (SetFixedIO(ctx_hint->memory, &(ssl_hint->outBuf)) != 1) {
  5531. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5532. return MEMORY_E;
  5533. }
  5534. if (ssl_hint->outBuf == NULL || ssl_hint->inBuf == NULL) {
  5535. WOLFSSL_MSG("Not enough memory to create fixed IO buffers");
  5536. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5537. return MEMORY_E;
  5538. }
  5539. wc_UnLockMutex(&(ctx_hint->memory->memory_mutex));
  5540. }
  5541. #ifdef WOLFSSL_HEAP_TEST
  5542. }
  5543. #endif
  5544. }
  5545. else {
  5546. ssl->heap = ctx->heap;
  5547. }
  5548. #else
  5549. ssl->heap = ctx->heap; /* carry over user heap without static memory */
  5550. #endif /* WOLFSSL_STATIC_MEMORY */
  5551. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  5552. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5553. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  5554. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  5555. #ifdef KEEP_PEER_CERT
  5556. InitX509(&ssl->peerCert, 0, ssl->heap);
  5557. #endif
  5558. ssl->rfd = -1; /* set to invalid descriptor */
  5559. ssl->wfd = -1;
  5560. ssl->devId = ctx->devId; /* device for async HW (from wolfAsync_DevOpen) */
  5561. /* initialize states */
  5562. ssl->options.serverState = NULL_STATE;
  5563. ssl->options.clientState = NULL_STATE;
  5564. ssl->options.connectState = CONNECT_BEGIN;
  5565. ssl->options.acceptState = ACCEPT_BEGIN;
  5566. ssl->options.handShakeState = NULL_STATE;
  5567. ssl->options.processReply = doProcessInit;
  5568. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  5569. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  5570. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  5571. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  5572. #ifndef NO_DH
  5573. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  5574. !defined(HAVE_SELFTEST)
  5575. ssl->options.dhDoKeyTest = 1;
  5576. #endif
  5577. #endif
  5578. #ifdef WOLFSSL_DTLS
  5579. #ifdef WOLFSSL_SCTP
  5580. ssl->options.dtlsSctp = ctx->dtlsSctp;
  5581. #endif
  5582. #ifdef WOLFSSL_SRTP
  5583. ssl->dtlsSrtpProfiles = ctx->dtlsSrtpProfiles;
  5584. #endif
  5585. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  5586. ssl->dtlsMtuSz = ctx->dtlsMtuSz;
  5587. /* Add some bytes so that we can operate with slight difference
  5588. * in set MTU size on each peer */
  5589. ssl->dtls_expected_rx = ssl->dtlsMtuSz +
  5590. DTLS_MTU_ADDITIONAL_READ_BUFFER;
  5591. #else
  5592. ssl->dtls_expected_rx = MAX_MTU;
  5593. #endif
  5594. ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT;
  5595. ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX;
  5596. ssl->dtls_timeout = ssl->dtls_timeout_init;
  5597. ssl->buffers.dtlsCtx.rfd = -1;
  5598. ssl->buffers.dtlsCtx.wfd = -1;
  5599. ssl->IOCB_ReadCtx = &ssl->buffers.dtlsCtx; /* prevent invalid pointer access if not */
  5600. ssl->IOCB_WriteCtx = &ssl->buffers.dtlsCtx; /* correctly set */
  5601. #else
  5602. #ifdef HAVE_NETX
  5603. ssl->IOCB_ReadCtx = &ssl->nxCtx; /* default NetX IO ctx, same for read */
  5604. ssl->IOCB_WriteCtx = &ssl->nxCtx; /* and write */
  5605. #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  5606. ssl->mnCtx = mynewt_ctx_new();
  5607. if(!ssl->mnCtx) {
  5608. return MEMORY_E;
  5609. }
  5610. ssl->IOCB_ReadCtx = ssl->mnCtx; /* default Mynewt IO ctx, same for read */
  5611. ssl->IOCB_WriteCtx = ssl->mnCtx; /* and write */
  5612. #elif defined (WOLFSSL_GNRC)
  5613. ssl->IOCB_ReadCtx = ssl->gnrcCtx;
  5614. ssl->IOCB_WriteCtx = ssl->gnrcCtx;
  5615. #else
  5616. ssl->IOCB_ReadCtx = &ssl->rfd; /* prevent invalid pointer access if not */
  5617. ssl->IOCB_WriteCtx = &ssl->wfd; /* correctly set */
  5618. #endif
  5619. #endif
  5620. #ifndef WOLFSSL_AEAD_ONLY
  5621. #ifndef NO_OLD_TLS
  5622. ssl->hmac = SSL_hmac; /* default to SSLv3 */
  5623. #elif !defined(WOLFSSL_NO_TLS12)
  5624. #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  5625. !defined(WOLFSSL_RENESAS_TSIP_TLS)
  5626. ssl->hmac = TLS_hmac;
  5627. #else
  5628. ssl->hmac = Renesas_cmn_TLS_hmac;
  5629. #endif
  5630. #endif
  5631. #endif
  5632. #if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
  5633. /* Save arrays by default for OpenVPN */
  5634. ssl->options.saveArrays = 1;
  5635. #endif
  5636. ssl->cipher.ssl = ssl;
  5637. #ifdef HAVE_EXTENDED_MASTER
  5638. ssl->options.haveEMS = ctx->haveEMS;
  5639. #endif
  5640. ssl->options.useClientOrder = ctx->useClientOrder;
  5641. ssl->options.mutualAuth = ctx->mutualAuth;
  5642. #ifdef WOLFSSL_TLS13
  5643. #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
  5644. ssl->options.maxTicketTls13 = ctx->maxTicketTls13;
  5645. #endif
  5646. #ifdef HAVE_SESSION_TICKET
  5647. ssl->options.noTicketTls13 = ctx->noTicketTls13;
  5648. #endif
  5649. ssl->options.noPskDheKe = ctx->noPskDheKe;
  5650. #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  5651. ssl->options.postHandshakeAuth = ctx->postHandshakeAuth;
  5652. ssl->options.verifyPostHandshake = ctx->verifyPostHandshake;
  5653. #endif
  5654. if (ctx->numGroups > 0) {
  5655. XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups);
  5656. ssl->numGroups = ctx->numGroups;
  5657. }
  5658. #endif
  5659. #ifdef HAVE_TLS_EXTENSIONS
  5660. #ifdef HAVE_MAX_FRAGMENT
  5661. ssl->max_fragment = MAX_RECORD_SIZE;
  5662. #endif
  5663. #ifdef HAVE_ALPN
  5664. ssl->alpn_client_list = NULL;
  5665. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
  5666. ssl->alpnSelect = ctx->alpnSelect;
  5667. ssl->alpnSelectArg = ctx->alpnSelectArg;
  5668. #endif
  5669. #if !defined(NO_BIO) && defined(OPENSSL_EXTRA)
  5670. if (ctx->alpn_cli_protos != NULL && ctx->alpn_cli_protos_len > 0) {
  5671. ret = wolfSSL_set_alpn_protos(ssl, ctx->alpn_cli_protos,
  5672. ctx->alpn_cli_protos_len);
  5673. #if defined(WOLFSSL_ERROR_CODE_OPENSSL)
  5674. if (ret) {
  5675. #else
  5676. if (!ret) {
  5677. #endif
  5678. WOLFSSL_MSG("failed to set alpn protos to ssl object");
  5679. return ret;
  5680. }
  5681. }
  5682. #endif
  5683. #endif
  5684. #ifdef HAVE_SUPPORTED_CURVES
  5685. ssl->options.userCurves = ctx->userCurves;
  5686. #endif
  5687. #endif /* HAVE_TLS_EXTENSIONS */
  5688. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  5689. ssl->options.disallowEncThenMac = ctx->disallowEncThenMac;
  5690. #endif
  5691. /* default alert state (none) */
  5692. ssl->alert_history.last_rx.code = -1;
  5693. ssl->alert_history.last_rx.level = -1;
  5694. ssl->alert_history.last_tx.code = -1;
  5695. ssl->alert_history.last_tx.level = -1;
  5696. #ifdef OPENSSL_EXTRA
  5697. /* copy over application session context ID */
  5698. ssl->sessionCtxSz = ctx->sessionCtxSz;
  5699. XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz);
  5700. ssl->cbioFlag = ctx->cbioFlag;
  5701. ssl->protoMsgCb = ctx->protoMsgCb;
  5702. ssl->protoMsgCtx = ctx->protoMsgCtx;
  5703. /* follow default behavior of setting toInfoOn similar to
  5704. * wolfSSL_set_msg_callback when the callback is set */
  5705. if (ctx->protoMsgCb != NULL) {
  5706. ssl->toInfoOn = 1;
  5707. }
  5708. #endif
  5709. InitCiphers(ssl);
  5710. InitCipherSpecs(&ssl->specs);
  5711. /* all done with init, now can return errors, call other stuff */
  5712. if (!writeDup) {
  5713. /* arrays */
  5714. ssl->arrays = (Arrays*)XMALLOC(sizeof(Arrays), ssl->heap,
  5715. DYNAMIC_TYPE_ARRAYS);
  5716. if (ssl->arrays == NULL) {
  5717. WOLFSSL_MSG("Arrays Memory error");
  5718. return MEMORY_E;
  5719. }
  5720. XMEMSET(ssl->arrays, 0, sizeof(Arrays));
  5721. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)
  5722. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  5723. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN, ssl->heap,
  5724. DYNAMIC_TYPE_SECRET);
  5725. if (ssl->arrays->preMasterSecret == NULL) {
  5726. return MEMORY_E;
  5727. }
  5728. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  5729. #endif
  5730. #ifdef OPENSSL_EXTRA
  5731. if ((ssl->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  5732. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  5733. ssl->heap, DYNAMIC_TYPE_OPENSSL)) == NULL) {
  5734. WOLFSSL_MSG("ssl->param memory error");
  5735. return MEMORY_E;
  5736. }
  5737. XMEMSET(ssl->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  5738. #endif
  5739. #ifdef SINGLE_THREADED
  5740. if (ctx->suites == NULL)
  5741. #endif
  5742. {
  5743. /* suites */
  5744. ssl->suites = (Suites*)XMALLOC(sizeof(Suites), ssl->heap,
  5745. DYNAMIC_TYPE_SUITES);
  5746. if (ssl->suites == NULL) {
  5747. WOLFSSL_MSG("Suites Memory error");
  5748. return MEMORY_E;
  5749. }
  5750. #ifdef OPENSSL_ALL
  5751. ssl->suites->stack = NULL;
  5752. #endif
  5753. #ifdef SINGLE_THREADED
  5754. ssl->options.ownSuites = 1;
  5755. #endif
  5756. }
  5757. #ifdef SINGLE_THREADED
  5758. else {
  5759. ssl->options.ownSuites = 0;
  5760. }
  5761. #endif
  5762. }
  5763. /* Initialize SSL with the appropriate fields from it's ctx */
  5764. /* requires valid arrays and suites unless writeDup ing */
  5765. if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS)
  5766. return ret;
  5767. ssl->options.dtls = ssl->version.major == DTLS_MAJOR;
  5768. #ifdef SINGLE_THREADED
  5769. ssl->rng = ctx->rng; /* CTX may have one, if so use it */
  5770. #endif
  5771. if (ssl->rng == NULL) {
  5772. /* RNG */
  5773. ssl->rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), ssl->heap,DYNAMIC_TYPE_RNG);
  5774. if (ssl->rng == NULL) {
  5775. WOLFSSL_MSG("RNG Memory error");
  5776. return MEMORY_E;
  5777. }
  5778. XMEMSET(ssl->rng, 0, sizeof(WC_RNG));
  5779. ssl->options.weOwnRng = 1;
  5780. /* FIPS RNG API does not accept a heap hint */
  5781. #ifndef HAVE_FIPS
  5782. if ( (ret = wc_InitRng_ex(ssl->rng, ssl->heap, ssl->devId)) != 0) {
  5783. WOLFSSL_MSG("RNG Init error");
  5784. return ret;
  5785. }
  5786. #else
  5787. if ( (ret = wc_InitRng(ssl->rng)) != 0) {
  5788. WOLFSSL_MSG("RNG Init error");
  5789. return ret;
  5790. }
  5791. #endif
  5792. }
  5793. #ifdef HAVE_WRITE_DUP
  5794. if (writeDup) {
  5795. /* all done */
  5796. return 0;
  5797. }
  5798. #endif
  5799. /* hsHashes */
  5800. ret = InitHandshakeHashes(ssl);
  5801. if (ret != 0)
  5802. return ret;
  5803. #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER)
  5804. if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) {
  5805. ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0);
  5806. if (ret != 0) {
  5807. WOLFSSL_MSG("DTLS Cookie Secret error");
  5808. return ret;
  5809. }
  5810. }
  5811. #endif /* WOLFSSL_DTLS && !NO_WOLFSSL_SERVER */
  5812. #ifdef HAVE_SECRET_CALLBACK
  5813. ssl->sessionSecretCb = NULL;
  5814. ssl->sessionSecretCtx = NULL;
  5815. #ifdef WOLFSSL_TLS13
  5816. ssl->tls13SecretCb = NULL;
  5817. ssl->tls13SecretCtx = NULL;
  5818. #endif
  5819. #endif
  5820. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  5821. if (ctx->keyLogCb != NULL) {
  5822. ssl->keyLogCb = SessionSecret_callback;
  5823. #if defined(WOLFSSL_TLS13)
  5824. ssl->tls13KeyLogCb = SessionSecret_callback_Tls13;
  5825. #endif /*WOLFSSL_TLS13*/
  5826. }
  5827. #endif /*OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  5828. ssl->session = wolfSSL_NewSession(ssl->heap);
  5829. if (ssl->session == NULL) {
  5830. WOLFSSL_MSG("SSL Session Memory error");
  5831. return MEMORY_E;
  5832. }
  5833. #ifdef HAVE_SESSION_TICKET
  5834. ssl->options.noTicketTls12 = ctx->noTicketTls12;
  5835. #endif
  5836. #ifdef WOLFSSL_MULTICAST
  5837. if (ctx->haveMcast) {
  5838. int i;
  5839. ssl->options.haveMcast = 1;
  5840. ssl->options.mcastID = ctx->mcastID;
  5841. /* Force the state to look like handshake has completed. */
  5842. /* Keying material is supplied externally. */
  5843. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  5844. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  5845. ssl->options.connectState = SECOND_REPLY_DONE;
  5846. ssl->options.acceptState = ACCEPT_THIRD_REPLY_DONE;
  5847. ssl->options.handShakeState = HANDSHAKE_DONE;
  5848. ssl->options.handShakeDone = 1;
  5849. for (i = 0; i < WOLFSSL_DTLS_PEERSEQ_SZ; i++)
  5850. ssl->keys.peerSeq[i].peerId = INVALID_PEER_ID;
  5851. }
  5852. #endif
  5853. #ifdef HAVE_SECURE_RENEGOTIATION
  5854. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  5855. int useSecureReneg = ssl->ctx->useSecureReneg;
  5856. /* use secure renegotiation by default (not recommend) */
  5857. #ifdef WOLFSSL_SECURE_RENEGOTIATION_ON_BY_DEFAULT
  5858. useSecureReneg = 1;
  5859. #endif
  5860. if (useSecureReneg) {
  5861. ret = wolfSSL_UseSecureRenegotiation(ssl);
  5862. if (ret != WOLFSSL_SUCCESS)
  5863. return ret;
  5864. }
  5865. }
  5866. #endif /* HAVE_SECURE_RENEGOTIATION */
  5867. return 0;
  5868. }
  5869. /* free use of temporary arrays */
  5870. void FreeArrays(WOLFSSL* ssl, int keep)
  5871. {
  5872. if (ssl->arrays) {
  5873. if (keep && !IsAtLeastTLSv1_3(ssl->version)) {
  5874. /* keeps session id for user retrieval */
  5875. XMEMCPY(ssl->session->sessionID, ssl->arrays->sessionID, ID_LEN);
  5876. ssl->session->sessionIDSz = ssl->arrays->sessionIDSz;
  5877. }
  5878. if (ssl->arrays->preMasterSecret) {
  5879. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  5880. XFREE(ssl->arrays->preMasterSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  5881. ssl->arrays->preMasterSecret = NULL;
  5882. }
  5883. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  5884. ssl->arrays->pendingMsg = NULL;
  5885. ForceZero(ssl->arrays, sizeof(Arrays)); /* clear arrays struct */
  5886. }
  5887. XFREE(ssl->arrays, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  5888. ssl->arrays = NULL;
  5889. }
  5890. void FreeKey(WOLFSSL* ssl, int type, void** pKey)
  5891. {
  5892. if (ssl && pKey && *pKey) {
  5893. switch (type) {
  5894. #ifndef NO_RSA
  5895. case DYNAMIC_TYPE_RSA:
  5896. wc_FreeRsaKey((RsaKey*)*pKey);
  5897. break;
  5898. #endif /* ! NO_RSA */
  5899. #ifdef HAVE_ECC
  5900. case DYNAMIC_TYPE_ECC:
  5901. wc_ecc_free((ecc_key*)*pKey);
  5902. break;
  5903. #endif /* HAVE_ECC */
  5904. #ifdef HAVE_ED25519
  5905. case DYNAMIC_TYPE_ED25519:
  5906. wc_ed25519_free((ed25519_key*)*pKey);
  5907. break;
  5908. #endif /* HAVE_ED25519 */
  5909. #ifdef HAVE_CURVE25519
  5910. case DYNAMIC_TYPE_CURVE25519:
  5911. wc_curve25519_free((curve25519_key*)*pKey);
  5912. break;
  5913. #endif /* HAVE_CURVE25519 */
  5914. #ifdef HAVE_ED448
  5915. case DYNAMIC_TYPE_ED448:
  5916. wc_ed448_free((ed448_key*)*pKey);
  5917. break;
  5918. #endif /* HAVE_ED448 */
  5919. #ifdef HAVE_CURVE448
  5920. case DYNAMIC_TYPE_CURVE448:
  5921. wc_curve448_free((curve448_key*)*pKey);
  5922. break;
  5923. #endif /* HAVE_CURVE448 */
  5924. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  5925. case DYNAMIC_TYPE_FALCON:
  5926. wc_falcon_free((falcon_key*)*pKey);
  5927. break;
  5928. #endif /* HAVE_PQC && HAVE_FALCON */
  5929. #ifndef NO_DH
  5930. case DYNAMIC_TYPE_DH:
  5931. wc_FreeDhKey((DhKey*)*pKey);
  5932. break;
  5933. #endif /* !NO_DH */
  5934. default:
  5935. break;
  5936. }
  5937. XFREE(*pKey, ssl->heap, type);
  5938. /* Reset pointer */
  5939. *pKey = NULL;
  5940. }
  5941. }
  5942. int AllocKey(WOLFSSL* ssl, int type, void** pKey)
  5943. {
  5944. int ret = BAD_FUNC_ARG;
  5945. int sz = 0;
  5946. if (ssl == NULL || pKey == NULL) {
  5947. return BAD_FUNC_ARG;
  5948. }
  5949. /* Sanity check key destination */
  5950. if (*pKey != NULL) {
  5951. WOLFSSL_MSG("Key already present!");
  5952. return BAD_STATE_E;
  5953. }
  5954. /* Determine size */
  5955. switch (type) {
  5956. #ifndef NO_RSA
  5957. case DYNAMIC_TYPE_RSA:
  5958. sz = sizeof(RsaKey);
  5959. break;
  5960. #endif /* ! NO_RSA */
  5961. #ifdef HAVE_ECC
  5962. case DYNAMIC_TYPE_ECC:
  5963. sz = sizeof(ecc_key);
  5964. break;
  5965. #endif /* HAVE_ECC */
  5966. #ifdef HAVE_ED25519
  5967. case DYNAMIC_TYPE_ED25519:
  5968. sz = sizeof(ed25519_key);
  5969. break;
  5970. #endif /* HAVE_ED25519 */
  5971. #ifdef HAVE_CURVE25519
  5972. case DYNAMIC_TYPE_CURVE25519:
  5973. sz = sizeof(curve25519_key);
  5974. break;
  5975. #endif /* HAVE_CURVE25519 */
  5976. #ifdef HAVE_ED448
  5977. case DYNAMIC_TYPE_ED448:
  5978. sz = sizeof(ed448_key);
  5979. break;
  5980. #endif /* HAVE_ED448 */
  5981. #ifdef HAVE_CURVE448
  5982. case DYNAMIC_TYPE_CURVE448:
  5983. sz = sizeof(curve448_key);
  5984. break;
  5985. #endif /* HAVE_CURVE448 */
  5986. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  5987. case DYNAMIC_TYPE_FALCON:
  5988. sz = sizeof(falcon_key);
  5989. break;
  5990. #endif /* HAVE_PQC */
  5991. #ifndef NO_DH
  5992. case DYNAMIC_TYPE_DH:
  5993. sz = sizeof(DhKey);
  5994. break;
  5995. #endif /* !NO_DH */
  5996. default:
  5997. return BAD_FUNC_ARG;
  5998. }
  5999. /* Allocate memory for key */
  6000. *pKey = (void *)XMALLOC(sz, ssl->heap, type);
  6001. if (*pKey == NULL) {
  6002. return MEMORY_E;
  6003. }
  6004. /* Initialize key */
  6005. switch (type) {
  6006. #ifndef NO_RSA
  6007. case DYNAMIC_TYPE_RSA:
  6008. ret = wc_InitRsaKey_ex((RsaKey*)*pKey, ssl->heap, ssl->devId);
  6009. break;
  6010. #endif /* ! NO_RSA */
  6011. #ifdef HAVE_ECC
  6012. case DYNAMIC_TYPE_ECC:
  6013. ret = wc_ecc_init_ex((ecc_key*)*pKey, ssl->heap, ssl->devId);
  6014. break;
  6015. #endif /* HAVE_ECC */
  6016. #ifdef HAVE_ED25519
  6017. case DYNAMIC_TYPE_ED25519:
  6018. wc_ed25519_init_ex((ed25519_key*)*pKey, ssl->heap, ssl->devId);
  6019. ret = 0;
  6020. break;
  6021. #endif /* HAVE_CURVE25519 */
  6022. #ifdef HAVE_CURVE25519
  6023. case DYNAMIC_TYPE_CURVE25519:
  6024. wc_curve25519_init_ex((curve25519_key*)*pKey, ssl->heap, ssl->devId);
  6025. ret = 0;
  6026. break;
  6027. #endif /* HAVE_CURVE25519 */
  6028. #ifdef HAVE_ED448
  6029. case DYNAMIC_TYPE_ED448:
  6030. wc_ed448_init_ex((ed448_key*)*pKey, ssl->heap, ssl->devId);
  6031. ret = 0;
  6032. break;
  6033. #endif /* HAVE_CURVE448 */
  6034. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  6035. case DYNAMIC_TYPE_FALCON:
  6036. wc_falcon_init((falcon_key*)*pKey);
  6037. ret = 0;
  6038. break;
  6039. #endif
  6040. #ifdef HAVE_CURVE448
  6041. case DYNAMIC_TYPE_CURVE448:
  6042. wc_curve448_init((curve448_key*)*pKey);
  6043. ret = 0;
  6044. break;
  6045. #endif /* HAVE_CURVE448 */
  6046. #ifndef NO_DH
  6047. case DYNAMIC_TYPE_DH:
  6048. ret = wc_InitDhKey_ex((DhKey*)*pKey, ssl->heap, ssl->devId);
  6049. break;
  6050. #endif /* !NO_DH */
  6051. default:
  6052. return BAD_FUNC_ARG;
  6053. }
  6054. /* On error free handshake key */
  6055. if (ret != 0) {
  6056. FreeKey(ssl, type, pKey);
  6057. }
  6058. return ret;
  6059. }
  6060. #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  6061. defined(HAVE_CURVE25519) || defined(HAVE_ED448) || \
  6062. defined(HAVE_CURVE448) || (defined(HAVE_PQC) && defined(HAVE_FALCON))
  6063. static int ReuseKey(WOLFSSL* ssl, int type, void* pKey)
  6064. {
  6065. int ret = 0;
  6066. (void)ssl;
  6067. switch (type) {
  6068. #ifndef NO_RSA
  6069. case DYNAMIC_TYPE_RSA:
  6070. wc_FreeRsaKey((RsaKey*)pKey);
  6071. ret = wc_InitRsaKey_ex((RsaKey*)pKey, ssl->heap, ssl->devId);
  6072. break;
  6073. #endif /* ! NO_RSA */
  6074. #ifdef HAVE_ECC
  6075. case DYNAMIC_TYPE_ECC:
  6076. wc_ecc_free((ecc_key*)pKey);
  6077. ret = wc_ecc_init_ex((ecc_key*)pKey, ssl->heap, ssl->devId);
  6078. break;
  6079. #endif /* HAVE_ECC */
  6080. #ifdef HAVE_ED25519
  6081. case DYNAMIC_TYPE_ED25519:
  6082. wc_ed25519_free((ed25519_key*)pKey);
  6083. ret = wc_ed25519_init_ex((ed25519_key*)pKey, ssl->heap,
  6084. ssl->devId);
  6085. break;
  6086. #endif /* HAVE_CURVE25519 */
  6087. #ifdef HAVE_CURVE25519
  6088. case DYNAMIC_TYPE_CURVE25519:
  6089. wc_curve25519_free((curve25519_key*)pKey);
  6090. ret = wc_curve25519_init_ex((curve25519_key*)pKey, ssl->heap,
  6091. ssl->devId);
  6092. break;
  6093. #endif /* HAVE_CURVE25519 */
  6094. #ifdef HAVE_ED448
  6095. case DYNAMIC_TYPE_ED448:
  6096. wc_ed448_free((ed448_key*)pKey);
  6097. ret = wc_ed448_init_ex((ed448_key*)pKey, ssl->heap, ssl->devId);
  6098. break;
  6099. #endif /* HAVE_CURVE448 */
  6100. #ifdef HAVE_CURVE448
  6101. case DYNAMIC_TYPE_CURVE448:
  6102. wc_curve448_free((curve448_key*)pKey);
  6103. ret = wc_curve448_init((curve448_key*)pKey);
  6104. break;
  6105. #endif /* HAVE_CURVE448 */
  6106. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  6107. case DYNAMIC_TYPE_FALCON:
  6108. wc_falcon_free((falcon_key*)pKey);
  6109. ret = wc_falcon_init((falcon_key*)pKey);
  6110. break;
  6111. #endif /* HAVE_PQC && HAVE_FALCON */
  6112. #ifndef NO_DH
  6113. case DYNAMIC_TYPE_DH:
  6114. wc_FreeDhKey((DhKey*)pKey);
  6115. ret = wc_InitDhKey_ex((DhKey*)pKey, ssl->heap, ssl->devId);
  6116. break;
  6117. #endif /* !NO_DH */
  6118. default:
  6119. return BAD_FUNC_ARG;
  6120. }
  6121. return ret;
  6122. }
  6123. #endif
  6124. #ifdef WOLFSSL_ASYNC_IO
  6125. void FreeAsyncCtx(WOLFSSL* ssl, byte freeAsync)
  6126. {
  6127. if (ssl->async != NULL) {
  6128. if (ssl->async->freeArgs != NULL) {
  6129. ssl->async->freeArgs(ssl, ssl->async->args);
  6130. ssl->async->freeArgs = NULL;
  6131. }
  6132. #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WOLFSSL_NO_TLS12)
  6133. if (ssl->options.buildArgsSet) {
  6134. FreeBuildMsgArgs(ssl, &ssl->async->buildArgs);
  6135. ssl->options.buildArgsSet = 0;
  6136. }
  6137. #endif
  6138. if (freeAsync) {
  6139. XFREE(ssl->async, ssl->heap, DYNAMIC_TYPE_ASYNC);
  6140. ssl->async = NULL;
  6141. }
  6142. }
  6143. }
  6144. #endif
  6145. void FreeKeyExchange(WOLFSSL* ssl)
  6146. {
  6147. /* Cleanup signature buffer */
  6148. if (ssl->buffers.sig.buffer) {
  6149. XFREE(ssl->buffers.sig.buffer, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  6150. ssl->buffers.sig.buffer = NULL;
  6151. ssl->buffers.sig.length = 0;
  6152. }
  6153. /* Cleanup digest buffer */
  6154. if (ssl->buffers.digest.buffer) {
  6155. XFREE(ssl->buffers.digest.buffer, ssl->heap, DYNAMIC_TYPE_DIGEST);
  6156. ssl->buffers.digest.buffer = NULL;
  6157. ssl->buffers.digest.length = 0;
  6158. }
  6159. /* Free handshake key */
  6160. FreeKey(ssl, ssl->hsType, &ssl->hsKey);
  6161. #ifndef NO_DH
  6162. /* Free temp DH key */
  6163. FreeKey(ssl, DYNAMIC_TYPE_DH, (void**)&ssl->buffers.serverDH_Key);
  6164. #endif
  6165. }
  6166. /* Free up all memory used by Suites structure from WOLFSSL */
  6167. void FreeSuites(WOLFSSL* ssl)
  6168. {
  6169. #ifdef SINGLE_THREADED
  6170. if (ssl->options.ownSuites)
  6171. #endif
  6172. {
  6173. #ifdef OPENSSL_ALL
  6174. if (ssl->suites != NULL) {
  6175. /* Enough to free stack structure since WOLFSSL_CIPHER
  6176. * isn't allocated separately. */
  6177. wolfSSL_sk_SSL_CIPHER_free(ssl->suites->stack);
  6178. }
  6179. #endif
  6180. XFREE(ssl->suites, ssl->heap, DYNAMIC_TYPE_SUITES);
  6181. }
  6182. ssl->suites = NULL;
  6183. }
  6184. /* In case holding SSL object in array and don't want to free actual ssl */
  6185. void SSL_ResourceFree(WOLFSSL* ssl)
  6186. {
  6187. /* Note: any resources used during the handshake should be released in the
  6188. * function FreeHandshakeResources(). Be careful with the special cases
  6189. * like the RNG which may optionally be kept for the whole session. (For
  6190. * example with the RNG, it isn't used beyond the handshake except when
  6191. * using stream ciphers where it is retained. */
  6192. if (ssl->options.side == WOLFSSL_SERVER_END) {
  6193. WOLFSSL_MSG("Free'ing server ssl");
  6194. }
  6195. else {
  6196. WOLFSSL_MSG("Free'ing client ssl");
  6197. }
  6198. #ifdef HAVE_EX_DATA_CLEANUP_HOOKS
  6199. wolfSSL_CRYPTO_cleanup_ex_data(&ssl->ex_data);
  6200. #endif
  6201. FreeCiphers(ssl);
  6202. FreeArrays(ssl, 0);
  6203. FreeKeyExchange(ssl);
  6204. #ifdef WOLFSSL_ASYNC_IO
  6205. /* Cleanup async */
  6206. FreeAsyncCtx(ssl, 1);
  6207. #endif
  6208. if (ssl->options.weOwnRng) {
  6209. wc_FreeRng(ssl->rng);
  6210. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  6211. }
  6212. FreeSuites(ssl);
  6213. FreeHandshakeHashes(ssl);
  6214. XFREE(ssl->buffers.domainName.buffer, ssl->heap, DYNAMIC_TYPE_DOMAIN);
  6215. /* clear keys struct after session */
  6216. ForceZero(&ssl->keys, sizeof(Keys));
  6217. #ifdef WOLFSSL_TLS13
  6218. if (ssl->options.tls1_3) {
  6219. ForceZero(&ssl->clientSecret, sizeof(ssl->clientSecret));
  6220. ForceZero(&ssl->serverSecret, sizeof(ssl->serverSecret));
  6221. }
  6222. #endif
  6223. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  6224. ForceZero(&ssl->clientFinished, TLS_FINISHED_SZ_MAX);
  6225. ForceZero(&ssl->serverFinished, TLS_FINISHED_SZ_MAX);
  6226. ssl->serverFinished_len = 0;
  6227. ssl->clientFinished_len = 0;
  6228. #endif
  6229. #ifndef NO_DH
  6230. if (ssl->buffers.serverDH_Priv.buffer) {
  6231. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  6232. ssl->buffers.serverDH_Priv.length);
  6233. }
  6234. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6235. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6236. /* parameters (p,g) may be owned by ctx */
  6237. if (ssl->buffers.weOwnDH) {
  6238. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6239. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6240. }
  6241. #endif /* !NO_DH */
  6242. #ifndef NO_CERTS
  6243. ssl->keepCert = 0; /* make sure certificate is free'd */
  6244. wolfSSL_UnloadCertsKeys(ssl);
  6245. #endif
  6246. #ifndef NO_RSA
  6247. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  6248. ssl->peerRsaKeyPresent = 0;
  6249. #endif
  6250. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT)
  6251. XFREE(ssl->peerSceTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA);
  6252. #endif
  6253. if (ssl->buffers.inputBuffer.dynamicFlag)
  6254. ShrinkInputBuffer(ssl, FORCED_FREE);
  6255. if (ssl->buffers.outputBuffer.dynamicFlag)
  6256. ShrinkOutputBuffer(ssl);
  6257. #if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
  6258. XFREE(ssl->buffers.tls13CookieSecret.buffer, ssl->heap,
  6259. DYNAMIC_TYPE_COOKIE_PWD);
  6260. #endif
  6261. #ifdef WOLFSSL_DTLS
  6262. DtlsMsgPoolReset(ssl);
  6263. if (ssl->dtls_rx_msg_list != NULL) {
  6264. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  6265. ssl->dtls_rx_msg_list = NULL;
  6266. ssl->dtls_rx_msg_list_sz = 0;
  6267. }
  6268. XFREE(ssl->buffers.dtlsCtx.peer.sa, ssl->heap, DYNAMIC_TYPE_SOCKADDR);
  6269. ssl->buffers.dtlsCtx.peer.sa = NULL;
  6270. #ifndef NO_WOLFSSL_SERVER
  6271. XFREE(ssl->buffers.dtlsCookieSecret.buffer, ssl->heap,
  6272. DYNAMIC_TYPE_COOKIE_PWD);
  6273. #endif
  6274. #endif /* WOLFSSL_DTLS */
  6275. #ifdef OPENSSL_EXTRA
  6276. #ifndef NO_BIO
  6277. /* Don't free if there was/is a previous element in the chain.
  6278. * This means that this BIO was part of a chain that will be
  6279. * free'd separately. */
  6280. if (ssl->biord != ssl->biowr) /* only free write if different */
  6281. if (ssl->biowr != NULL && ssl->biowr->prev == NULL)
  6282. wolfSSL_BIO_free(ssl->biowr);
  6283. if (ssl->biord != NULL && ssl->biord->prev == NULL)
  6284. wolfSSL_BIO_free(ssl->biord);
  6285. ssl->biowr = NULL;
  6286. ssl->biord = NULL;
  6287. #endif
  6288. #endif
  6289. #ifdef HAVE_LIBZ
  6290. FreeStreams(ssl);
  6291. #endif
  6292. #ifdef HAVE_ECC
  6293. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  6294. ssl->peerEccKeyPresent = 0;
  6295. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  6296. ssl->peerEccDsaKeyPresent = 0;
  6297. #endif
  6298. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) ||defined(HAVE_CURVE448)
  6299. {
  6300. int dtype = 0;
  6301. #ifdef HAVE_ECC
  6302. dtype = DYNAMIC_TYPE_ECC;
  6303. #endif
  6304. #ifdef HAVE_CURVE25519
  6305. if (ssl->peerX25519KeyPresent
  6306. #ifdef HAVE_ECC
  6307. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519
  6308. #endif /* HAVE_ECC */
  6309. )
  6310. {
  6311. dtype = DYNAMIC_TYPE_CURVE25519;
  6312. }
  6313. #endif /* HAVE_CURVE25519 */
  6314. #ifdef HAVE_CURVE448
  6315. if (ssl->peerX448KeyPresent
  6316. #ifdef HAVE_ECC
  6317. || ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448
  6318. #endif /* HAVE_ECC */
  6319. )
  6320. {
  6321. dtype = DYNAMIC_TYPE_CURVE448;
  6322. }
  6323. #endif /* HAVE_CURVE448 */
  6324. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  6325. ssl->eccTempKeyPresent = 0;
  6326. }
  6327. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  6328. #ifdef HAVE_CURVE25519
  6329. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  6330. ssl->peerX25519KeyPresent = 0;
  6331. #endif
  6332. #ifdef HAVE_ED25519
  6333. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  6334. ssl->peerEd25519KeyPresent = 0;
  6335. #ifdef HAVE_PK_CALLBACKS
  6336. if (ssl->buffers.peerEd25519Key.buffer != NULL) {
  6337. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  6338. DYNAMIC_TYPE_ED25519);
  6339. ssl->buffers.peerEd25519Key.buffer = NULL;
  6340. }
  6341. #endif
  6342. #endif
  6343. #ifdef HAVE_CURVE448
  6344. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  6345. ssl->peerX448KeyPresent = 0;
  6346. #endif
  6347. #ifdef HAVE_ED448
  6348. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  6349. ssl->peerEd448KeyPresent = 0;
  6350. #ifdef HAVE_PK_CALLBACKS
  6351. if (ssl->buffers.peerEd448Key.buffer != NULL) {
  6352. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap,
  6353. DYNAMIC_TYPE_ED448);
  6354. ssl->buffers.peerEd448Key.buffer = NULL;
  6355. }
  6356. #endif
  6357. #endif
  6358. #ifdef HAVE_PQC
  6359. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  6360. ssl->peerFalconKeyPresent = 0;
  6361. #endif
  6362. #ifdef HAVE_PK_CALLBACKS
  6363. #ifdef HAVE_ECC
  6364. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  6365. #endif /* HAVE_ECC */
  6366. #ifndef NO_RSA
  6367. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  6368. #endif /* NO_RSA */
  6369. #endif /* HAVE_PK_CALLBACKS */
  6370. #ifdef HAVE_TLS_EXTENSIONS
  6371. TLSX_FreeAll(ssl->extensions, ssl->heap);
  6372. #ifdef HAVE_ALPN
  6373. if (ssl->alpn_client_list != NULL) {
  6374. XFREE(ssl->alpn_client_list, ssl->heap, DYNAMIC_TYPE_ALPN);
  6375. ssl->alpn_client_list = NULL;
  6376. }
  6377. #endif
  6378. #endif /* HAVE_TLS_EXTENSIONS */
  6379. #if defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP)
  6380. if (ssl->mnCtx) {
  6381. mynewt_ctx_clear(ssl->mnCtx);
  6382. ssl->mnCtx = NULL;
  6383. }
  6384. #endif
  6385. #ifdef HAVE_NETX
  6386. if (ssl->nxCtx.nxPacket)
  6387. nx_packet_release(ssl->nxCtx.nxPacket);
  6388. #endif
  6389. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
  6390. if (ssl->x509_store_pt)
  6391. wolfSSL_X509_STORE_free(ssl->x509_store_pt);
  6392. #endif
  6393. #ifdef KEEP_PEER_CERT
  6394. FreeX509(&ssl->peerCert);
  6395. #endif
  6396. if (ssl->session != NULL)
  6397. wolfSSL_FreeSession(ssl->ctx, ssl->session);
  6398. #ifdef HAVE_WRITE_DUP
  6399. if (ssl->dupWrite) {
  6400. FreeWriteDup(ssl);
  6401. }
  6402. #endif
  6403. #ifdef OPENSSL_EXTRA
  6404. if (ssl->param) {
  6405. XFREE(ssl->param, ssl->heap, DYNAMIC_TYPE_OPENSSL);
  6406. }
  6407. #endif
  6408. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6409. while (ssl->certReqCtx != NULL) {
  6410. CertReqCtx* curr = ssl->certReqCtx;
  6411. ssl->certReqCtx = curr->next;
  6412. XFREE(curr, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  6413. }
  6414. #endif
  6415. #ifdef WOLFSSL_STATIC_EPHEMERAL
  6416. #ifndef NO_DH
  6417. FreeDer(&ssl->staticKE.dhKey);
  6418. #endif
  6419. #ifdef HAVE_ECC
  6420. FreeDer(&ssl->staticKE.ecKey);
  6421. #endif
  6422. #ifdef HAVE_CURVE25519
  6423. FreeDer(&ssl->staticKE.x25519Key);
  6424. #endif
  6425. #ifdef HAVE_CURVE448
  6426. FreeDer(&ssl->staticKE.x448Key);
  6427. #endif
  6428. #endif
  6429. #ifdef WOLFSSL_STATIC_MEMORY
  6430. /* check if using fixed io buffers and free them */
  6431. if (ssl->heap != NULL) {
  6432. #ifdef WOLFSSL_HEAP_TEST
  6433. /* avoid dereferencing a test value */
  6434. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  6435. #endif
  6436. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  6437. WOLFSSL_HEAP* ctx_heap;
  6438. void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap;
  6439. ctx_heap = ssl_hint->memory;
  6440. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  6441. WOLFSSL_MSG("Bad memory_mutex lock");
  6442. }
  6443. ctx_heap->curIO--;
  6444. if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) {
  6445. WOLFSSL_MSG("Error freeing fixed output buffer");
  6446. }
  6447. if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) {
  6448. WOLFSSL_MSG("Error freeing fixed output buffer");
  6449. }
  6450. if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/
  6451. ctx_heap->curHa--;
  6452. }
  6453. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  6454. /* check if tracking stats */
  6455. if (ctx_heap->flag & WOLFMEM_TRACK_STATS) {
  6456. XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL);
  6457. }
  6458. XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL);
  6459. #ifdef WOLFSSL_HEAP_TEST
  6460. }
  6461. #endif
  6462. }
  6463. #endif /* WOLFSSL_STATIC_MEMORY */
  6464. #ifdef OPENSSL_EXTRA
  6465. /* Enough to free stack structure since WOLFSSL_CIPHER
  6466. * isn't allocated separately. */
  6467. wolfSSL_sk_CIPHER_free(ssl->supportedCiphers);
  6468. wolfSSL_sk_X509_pop_free(ssl->peerCertChain, NULL);
  6469. #ifdef KEEP_OUR_CERT
  6470. wolfSSL_sk_X509_pop_free(ssl->ourCertChain, NULL);
  6471. #endif
  6472. #endif
  6473. #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY)
  6474. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  6475. ssl->ca_names = NULL;
  6476. #endif
  6477. }
  6478. /* Free any handshake resources no longer needed */
  6479. void FreeHandshakeResources(WOLFSSL* ssl)
  6480. {
  6481. WOLFSSL_ENTER("FreeHandshakeResources");
  6482. #ifdef WOLFSSL_DTLS
  6483. /* DTLS_POOL */
  6484. if (ssl->options.dtls) {
  6485. DtlsMsgPoolReset(ssl);
  6486. DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
  6487. ssl->dtls_rx_msg_list = NULL;
  6488. ssl->dtls_rx_msg_list_sz = 0;
  6489. }
  6490. #endif
  6491. #ifdef HAVE_SECURE_RENEGOTIATION
  6492. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  6493. WOLFSSL_MSG("Secure Renegotiation needs to retain handshake resources");
  6494. return;
  6495. }
  6496. #endif
  6497. /* input buffer */
  6498. if (ssl->buffers.inputBuffer.dynamicFlag)
  6499. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  6500. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6501. if (!ssl->options.tls1_3)
  6502. #endif
  6503. {
  6504. #ifndef OPENSSL_EXTRA
  6505. /* free suites unless using compatibility layer */
  6506. FreeSuites(ssl);
  6507. #endif
  6508. /* hsHashes */
  6509. FreeHandshakeHashes(ssl);
  6510. }
  6511. /* RNG */
  6512. if (ssl->options.tls1_1 == 0
  6513. #ifndef WOLFSSL_AEAD_ONLY
  6514. || ssl->specs.cipher_type == stream
  6515. #endif
  6516. #if defined(WOLFSSL_TLS13)
  6517. #if !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6518. || ssl->options.tls1_3
  6519. #elif !defined(HAVE_SESSION_TICKET)
  6520. || (ssl->options.tls1_3 && ssl->options.side == WOLFSSL_SERVER_END)
  6521. #endif
  6522. #endif
  6523. ) {
  6524. if (ssl->options.weOwnRng) {
  6525. wc_FreeRng(ssl->rng);
  6526. XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG);
  6527. ssl->rng = NULL;
  6528. ssl->options.weOwnRng = 0;
  6529. }
  6530. }
  6531. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
  6532. defined(HAVE_SESSION_TICKET)
  6533. if (!ssl->options.tls1_3)
  6534. #endif
  6535. /* arrays */
  6536. if (ssl->options.saveArrays == 0)
  6537. FreeArrays(ssl, 1);
  6538. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6539. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  6540. #endif
  6541. {
  6542. #ifndef NO_RSA
  6543. /* peerRsaKey */
  6544. FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey);
  6545. ssl->peerRsaKeyPresent = 0;
  6546. #endif
  6547. #ifdef HAVE_ECC
  6548. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey);
  6549. ssl->peerEccDsaKeyPresent = 0;
  6550. #endif /* HAVE_ECC */
  6551. #ifdef HAVE_ED25519
  6552. FreeKey(ssl, DYNAMIC_TYPE_ED25519, (void**)&ssl->peerEd25519Key);
  6553. ssl->peerEd25519KeyPresent = 0;
  6554. #endif /* HAVE_ED25519 */
  6555. #ifdef HAVE_ED448
  6556. FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key);
  6557. ssl->peerEd448KeyPresent = 0;
  6558. #endif /* HAVE_ED448 */
  6559. #ifdef HAVE_PQC
  6560. FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey);
  6561. ssl->peerFalconKeyPresent = 0;
  6562. #endif /* HAVE_PQC */
  6563. }
  6564. #ifdef HAVE_ECC
  6565. FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
  6566. ssl->peerEccKeyPresent = 0;
  6567. #endif
  6568. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  6569. {
  6570. int dtype;
  6571. #ifdef HAVE_ECC
  6572. dtype = DYNAMIC_TYPE_ECC;
  6573. #elif defined(HAVE_CURVE25519)
  6574. dtype = DYNAMIC_TYPE_CURVE25519;
  6575. #else
  6576. dtype = DYNAMIC_TYPE_CURVE448;
  6577. #endif
  6578. #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
  6579. if (ssl->peerX25519KeyPresent ||
  6580. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
  6581. {
  6582. dtype = DYNAMIC_TYPE_CURVE25519;
  6583. }
  6584. #endif
  6585. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
  6586. defined(HAVE_CURVE448)
  6587. if (ssl->peerX448KeyPresent ||
  6588. ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
  6589. {
  6590. dtype = DYNAMIC_TYPE_CURVE448;
  6591. }
  6592. #endif
  6593. FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
  6594. ssl->eccTempKeyPresent = 0;
  6595. }
  6596. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  6597. #ifdef HAVE_CURVE25519
  6598. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
  6599. ssl->peerX25519KeyPresent = 0;
  6600. #endif
  6601. #ifdef HAVE_CURVE448
  6602. FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
  6603. ssl->peerX448KeyPresent = 0;
  6604. #endif
  6605. #ifndef NO_DH
  6606. if (ssl->buffers.serverDH_Priv.buffer) {
  6607. ForceZero(ssl->buffers.serverDH_Priv.buffer,
  6608. ssl->buffers.serverDH_Priv.length);
  6609. }
  6610. XFREE(ssl->buffers.serverDH_Priv.buffer, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  6611. ssl->buffers.serverDH_Priv.buffer = NULL;
  6612. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6613. ssl->buffers.serverDH_Pub.buffer = NULL;
  6614. /* parameters (p,g) may be owned by ctx */
  6615. if (ssl->buffers.weOwnDH) {
  6616. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6617. ssl->buffers.serverDH_G.buffer = NULL;
  6618. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  6619. ssl->buffers.serverDH_P.buffer = NULL;
  6620. }
  6621. #endif /* !NO_DH */
  6622. #ifndef NO_CERTS
  6623. wolfSSL_UnloadCertsKeys(ssl);
  6624. #endif
  6625. #ifdef HAVE_PK_CALLBACKS
  6626. #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6627. if (!ssl->options.tls1_3 || ssl->options.side == WOLFSSL_CLIENT_END)
  6628. #endif
  6629. {
  6630. #ifdef HAVE_ECC
  6631. XFREE(ssl->buffers.peerEccDsaKey.buffer, ssl->heap, DYNAMIC_TYPE_ECC);
  6632. ssl->buffers.peerEccDsaKey.buffer = NULL;
  6633. #endif /* HAVE_ECC */
  6634. #ifndef NO_RSA
  6635. XFREE(ssl->buffers.peerRsaKey.buffer, ssl->heap, DYNAMIC_TYPE_RSA);
  6636. ssl->buffers.peerRsaKey.buffer = NULL;
  6637. #endif /* NO_RSA */
  6638. #ifdef HAVE_ED25519
  6639. XFREE(ssl->buffers.peerEd25519Key.buffer, ssl->heap,
  6640. DYNAMIC_TYPE_ED25519);
  6641. ssl->buffers.peerEd25519Key.buffer = NULL;
  6642. #endif
  6643. #ifdef HAVE_ED448
  6644. XFREE(ssl->buffers.peerEd448Key.buffer, ssl->heap, DYNAMIC_TYPE_ED448);
  6645. ssl->buffers.peerEd448Key.buffer = NULL;
  6646. #endif
  6647. }
  6648. #endif /* HAVE_PK_CALLBACKS */
  6649. #if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \
  6650. !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  6651. /* Some extensions need to be kept for post-handshake querying. */
  6652. TLSX_FreeAll(ssl->extensions, ssl->heap);
  6653. ssl->extensions = NULL;
  6654. #endif
  6655. #ifdef WOLFSSL_STATIC_MEMORY
  6656. /* when done with handshake decrement current handshake count */
  6657. if (ssl->heap != NULL) {
  6658. #ifdef WOLFSSL_HEAP_TEST
  6659. /* avoid dereferencing a test value */
  6660. if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) {
  6661. #endif
  6662. WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap;
  6663. WOLFSSL_HEAP* ctx_heap;
  6664. ctx_heap = ssl_hint->memory;
  6665. if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) {
  6666. WOLFSSL_MSG("Bad memory_mutex lock");
  6667. }
  6668. ctx_heap->curHa--;
  6669. ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */
  6670. wc_UnLockMutex(&(ctx_heap->memory_mutex));
  6671. #ifdef WOLFSSL_HEAP_TEST
  6672. }
  6673. #endif
  6674. }
  6675. #endif /* WOLFSSL_STATIC_MEMORY */
  6676. }
  6677. /* heap argument is the heap hint used when creating SSL */
  6678. void FreeSSL(WOLFSSL* ssl, void* heap)
  6679. {
  6680. WOLFSSL_CTX* ctx = ssl->ctx;
  6681. SSL_ResourceFree(ssl);
  6682. XFREE(ssl, heap, DYNAMIC_TYPE_SSL);
  6683. if (ctx)
  6684. FreeSSL_Ctx(ctx); /* will decrement and free underlying CTX if 0 */
  6685. (void)heap;
  6686. }
  6687. #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
  6688. !defined(WOLFSSL_NO_TLS12) || \
  6689. ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \
  6690. && defined(HAVE_AEAD))
  6691. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  6692. static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
  6693. {
  6694. if (verify) {
  6695. seq[0] = ssl->keys.peer_sequence_number_hi;
  6696. seq[1] = ssl->keys.peer_sequence_number_lo++;
  6697. if (seq[1] > ssl->keys.peer_sequence_number_lo) {
  6698. /* handle rollover */
  6699. ssl->keys.peer_sequence_number_hi++;
  6700. }
  6701. }
  6702. else {
  6703. seq[0] = ssl->keys.sequence_number_hi;
  6704. seq[1] = ssl->keys.sequence_number_lo++;
  6705. if (seq[1] > ssl->keys.sequence_number_lo) {
  6706. /* handle rollover */
  6707. ssl->keys.sequence_number_hi++;
  6708. }
  6709. }
  6710. }
  6711. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  6712. #ifdef WOLFSSL_DTLS
  6713. static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
  6714. {
  6715. #ifdef HAVE_SECURE_RENEGOTIATION
  6716. order = DtlsCheckOrder(ssl, order);
  6717. #endif
  6718. if (order == PREV_ORDER) {
  6719. /* Previous epoch case */
  6720. if (ssl->options.haveMcast) {
  6721. #ifdef WOLFSSL_MULTICAST
  6722. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  6723. (ssl->options.mcastID << 8) |
  6724. (ssl->keys.dtls_prev_sequence_number_hi & 0xFF);
  6725. #endif
  6726. }
  6727. else
  6728. seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
  6729. (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
  6730. seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
  6731. }
  6732. else if (order == PEER_ORDER) {
  6733. if (ssl->options.haveMcast) {
  6734. #ifdef WOLFSSL_MULTICAST
  6735. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  6736. (ssl->keys.curPeerId << 8) |
  6737. (ssl->keys.curSeq_hi & 0xFF);
  6738. #endif
  6739. }
  6740. else
  6741. seq[0] = ((word32)ssl->keys.curEpoch << 16) |
  6742. (ssl->keys.curSeq_hi & 0xFFFF);
  6743. seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
  6744. }
  6745. else {
  6746. if (ssl->options.haveMcast) {
  6747. #ifdef WOLFSSL_MULTICAST
  6748. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  6749. (ssl->options.mcastID << 8) |
  6750. (ssl->keys.dtls_sequence_number_hi & 0xFF);
  6751. #endif
  6752. }
  6753. else
  6754. seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
  6755. (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
  6756. seq[1] = ssl->keys.dtls_sequence_number_lo;
  6757. }
  6758. }
  6759. static WC_INLINE void DtlsSEQIncrement(WOLFSSL* ssl, int order)
  6760. {
  6761. word32 seq;
  6762. #ifdef HAVE_SECURE_RENEGOTIATION
  6763. order = DtlsCheckOrder(ssl, order);
  6764. #endif
  6765. if (order == PREV_ORDER) {
  6766. seq = ssl->keys.dtls_prev_sequence_number_lo++;
  6767. if (seq > ssl->keys.dtls_prev_sequence_number_lo) {
  6768. /* handle rollover */
  6769. ssl->keys.dtls_prev_sequence_number_hi++;
  6770. }
  6771. }
  6772. else if (order == PEER_ORDER) {
  6773. seq = ssl->keys.peer_sequence_number_lo++;
  6774. if (seq > ssl->keys.peer_sequence_number_lo) {
  6775. /* handle rollover */
  6776. ssl->keys.peer_sequence_number_hi++;
  6777. }
  6778. }
  6779. else {
  6780. seq = ssl->keys.dtls_sequence_number_lo++;
  6781. if (seq > ssl->keys.dtls_sequence_number_lo) {
  6782. /* handle rollover */
  6783. ssl->keys.dtls_sequence_number_hi++;
  6784. }
  6785. }
  6786. }
  6787. #endif /* WOLFSSL_DTLS */
  6788. #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
  6789. void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
  6790. {
  6791. word32 seq[2] = {0, 0};
  6792. if (!ssl->options.dtls) {
  6793. GetSEQIncrement(ssl, verifyOrder, seq);
  6794. }
  6795. else {
  6796. #ifdef WOLFSSL_DTLS
  6797. DtlsGetSEQ(ssl, verifyOrder, seq);
  6798. #endif
  6799. }
  6800. c32toa(seq[0], out);
  6801. c32toa(seq[1], out + OPAQUE32_LEN);
  6802. }
  6803. #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
  6804. #endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
  6805. * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */
  6806. #ifdef WOLFSSL_DTLS
  6807. /* functions for managing DTLS datagram reordering */
  6808. /* Need to allocate space for the handshake message header. The hashing
  6809. * routines assume the message pointer is still within the buffer that
  6810. * has the headers, and will include those headers in the hash. The store
  6811. * routines need to take that into account as well. New will allocate
  6812. * extra space for the headers. */
  6813. DtlsMsg* DtlsMsgNew(word32 sz, void* heap)
  6814. {
  6815. DtlsMsg* msg;
  6816. WOLFSSL_ENTER("DtlsMsgNew()");
  6817. (void)heap;
  6818. msg = (DtlsMsg*)XMALLOC(sizeof(DtlsMsg), heap, DYNAMIC_TYPE_DTLS_MSG);
  6819. if (msg != NULL) {
  6820. XMEMSET(msg, 0, sizeof(DtlsMsg));
  6821. msg->buf = (byte*)XMALLOC(sz + DTLS_HANDSHAKE_HEADER_SZ,
  6822. heap, DYNAMIC_TYPE_DTLS_BUFFER);
  6823. if (msg->buf != NULL) {
  6824. msg->sz = sz;
  6825. msg->type = no_shake;
  6826. msg->msg = msg->buf + DTLS_HANDSHAKE_HEADER_SZ;
  6827. }
  6828. else {
  6829. XFREE(msg, heap, DYNAMIC_TYPE_DTLS_MSG);
  6830. msg = NULL;
  6831. }
  6832. }
  6833. return msg;
  6834. }
  6835. void DtlsMsgDelete(DtlsMsg* item, void* heap)
  6836. {
  6837. (void)heap;
  6838. WOLFSSL_ENTER("DtlsMsgDelete()");
  6839. if (item != NULL) {
  6840. DtlsFrag* cur = item->fragList;
  6841. while (cur != NULL) {
  6842. DtlsFrag* next = cur->next;
  6843. XFREE(cur, heap, DYNAMIC_TYPE_DTLS_FRAG);
  6844. cur = next;
  6845. }
  6846. if (item->buf != NULL)
  6847. XFREE(item->buf, heap, DYNAMIC_TYPE_DTLS_BUFFER);
  6848. XFREE(item, heap, DYNAMIC_TYPE_DTLS_MSG);
  6849. }
  6850. }
  6851. void DtlsMsgListDelete(DtlsMsg* head, void* heap)
  6852. {
  6853. DtlsMsg* next;
  6854. WOLFSSL_ENTER("DtlsMsgListDelete()");
  6855. while (head) {
  6856. next = head->next;
  6857. DtlsMsgDelete(head, heap);
  6858. head = next;
  6859. }
  6860. }
  6861. /**
  6862. * Drop messages when they are no longer going to be retransmitted
  6863. */
  6864. void DtlsTxMsgListClean(WOLFSSL* ssl)
  6865. {
  6866. DtlsMsg* head = ssl->dtls_tx_msg_list;
  6867. DtlsMsg* next;
  6868. WOLFSSL_ENTER("DtlsTxMsgListClean()");
  6869. while (head) {
  6870. next = head->next;
  6871. if (VerifyForTxDtlsMsgDelete(ssl, head))
  6872. DtlsMsgDelete(head, ssl->heap);
  6873. else
  6874. /* Stored packets should be in order so break on first failed
  6875. * verify */
  6876. break;
  6877. ssl->dtls_tx_msg_list_sz--;
  6878. /* Reset timer as deleting a node means that state has progressed */
  6879. ssl->dtls_timeout = ssl->dtls_timeout_init;
  6880. head = next;
  6881. }
  6882. ssl->dtls_tx_msg_list = head;
  6883. }
  6884. /* Create a DTLS Fragment from *begin - end, adjust new *begin and bytesLeft */
  6885. static DtlsFrag* CreateFragment(word32* begin, word32 end, const byte* data,
  6886. byte* buf, word32* bytesLeft, void* heap)
  6887. {
  6888. DtlsFrag* newFrag;
  6889. word32 added = end - *begin + 1;
  6890. WOLFSSL_ENTER("CreateFragment()");
  6891. (void)heap;
  6892. newFrag = (DtlsFrag*)XMALLOC(sizeof(DtlsFrag), heap,
  6893. DYNAMIC_TYPE_DTLS_FRAG);
  6894. if (newFrag != NULL) {
  6895. newFrag->next = NULL;
  6896. newFrag->begin = *begin;
  6897. newFrag->end = end;
  6898. XMEMCPY(buf + *begin, data, added);
  6899. *bytesLeft -= added;
  6900. *begin = newFrag->end + 1;
  6901. }
  6902. return newFrag;
  6903. }
  6904. int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
  6905. word32 fragOffset, word32 fragSz, void* heap)
  6906. {
  6907. WOLFSSL_ENTER("DtlsMsgSet()");
  6908. if (msg != NULL && data != NULL && msg->fragSz <= msg->sz &&
  6909. fragSz <= msg->sz && fragOffset <= msg->sz &&
  6910. (fragOffset + fragSz) <= msg->sz) {
  6911. DtlsFrag* cur = msg->fragList;
  6912. DtlsFrag* prev = cur;
  6913. DtlsFrag* newFrag;
  6914. word32 bytesLeft = fragSz; /* could be overlapping fragment */
  6915. word32 startOffset = fragOffset;
  6916. word32 added;
  6917. msg->seq = seq;
  6918. msg->epoch = epoch;
  6919. msg->type = type;
  6920. if (fragOffset == 0) {
  6921. XMEMCPY(msg->buf, data - DTLS_HANDSHAKE_HEADER_SZ,
  6922. DTLS_HANDSHAKE_HEADER_SZ);
  6923. c32to24(msg->sz, msg->msg - DTLS_HANDSHAKE_FRAG_SZ);
  6924. }
  6925. /* if no message data, just return */
  6926. if (fragSz == 0)
  6927. return 0;
  6928. /* if list is empty add full fragment to front */
  6929. if (cur == NULL) {
  6930. newFrag = CreateFragment(&fragOffset, fragOffset + fragSz - 1, data,
  6931. msg->msg, &bytesLeft, heap);
  6932. if (newFrag == NULL)
  6933. return MEMORY_E;
  6934. msg->fragSz = fragSz;
  6935. msg->fragList = newFrag;
  6936. return 0;
  6937. }
  6938. /* add to front if before current front, up to next->begin */
  6939. if (fragOffset < cur->begin) {
  6940. word32 end = fragOffset + fragSz - 1;
  6941. if (end >= cur->begin)
  6942. end = cur->begin - 1;
  6943. added = end - fragOffset + 1;
  6944. newFrag = CreateFragment(&fragOffset, end, data, msg->msg,
  6945. &bytesLeft, heap);
  6946. if (newFrag == NULL)
  6947. return MEMORY_E;
  6948. msg->fragSz += added;
  6949. newFrag->next = cur;
  6950. msg->fragList = newFrag;
  6951. }
  6952. /* while we have bytes left, try to find a gap to fill */
  6953. while (bytesLeft > 0) {
  6954. /* get previous packet in list */
  6955. while (cur && (fragOffset >= cur->begin)) {
  6956. prev = cur;
  6957. cur = cur->next;
  6958. }
  6959. /* don't add duplicate data */
  6960. if (prev->end >= fragOffset) {
  6961. if ( (fragOffset + bytesLeft - 1) <= prev->end)
  6962. return 0;
  6963. fragOffset = prev->end + 1;
  6964. bytesLeft = startOffset + fragSz - fragOffset;
  6965. }
  6966. if (cur == NULL)
  6967. /* we're at the end */
  6968. added = bytesLeft;
  6969. else
  6970. /* we're in between two frames */
  6971. added = min(bytesLeft, cur->begin - fragOffset);
  6972. /* data already there */
  6973. if (added == 0)
  6974. continue;
  6975. newFrag = CreateFragment(&fragOffset, fragOffset + added - 1,
  6976. data + fragOffset - startOffset,
  6977. msg->msg, &bytesLeft, heap);
  6978. if (newFrag == NULL)
  6979. return MEMORY_E;
  6980. msg->fragSz += added;
  6981. newFrag->next = prev->next;
  6982. prev->next = newFrag;
  6983. }
  6984. }
  6985. return 0;
  6986. }
  6987. DtlsMsg* DtlsMsgFind(DtlsMsg* head, word16 epoch, word32 seq)
  6988. {
  6989. WOLFSSL_ENTER("DtlsMsgFind()");
  6990. while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
  6991. head = head->next;
  6992. }
  6993. return head;
  6994. }
  6995. void DtlsMsgStore(WOLFSSL* ssl, word16 epoch, word32 seq, const byte* data,
  6996. word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
  6997. {
  6998. /* See if seq exists in the list. If it isn't in the list, make
  6999. * a new item of size dataSz, copy fragSz bytes from data to msg->msg
  7000. * starting at offset fragOffset, and add fragSz to msg->fragSz. If
  7001. * the seq is in the list and it isn't full, copy fragSz bytes from
  7002. * data to msg->msg starting at offset fragOffset, and add fragSz to
  7003. * msg->fragSz. Insertions take into account data already in the list
  7004. * in case there are overlaps in the handshake message due to retransmit
  7005. * messages. The new item should be inserted into the list in its
  7006. * proper position.
  7007. *
  7008. * 1. Find seq in list, or where seq should go in list. If seq not in
  7009. * list, create new item and insert into list. Either case, keep
  7010. * pointer to item.
  7011. * 2. Copy the data from the message to the stored message where it
  7012. * belongs without overlaps.
  7013. */
  7014. DtlsMsg* head = ssl->dtls_rx_msg_list;
  7015. WOLFSSL_ENTER("DtlsMsgStore()");
  7016. if (head != NULL) {
  7017. DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
  7018. if (cur == NULL) {
  7019. cur = DtlsMsgNew(dataSz, heap);
  7020. if (cur != NULL) {
  7021. if (DtlsMsgSet(cur, seq, epoch, data, type,
  7022. fragOffset, fragSz, heap) < 0) {
  7023. DtlsMsgDelete(cur, heap);
  7024. }
  7025. else {
  7026. ssl->dtls_rx_msg_list_sz++;
  7027. head = DtlsMsgInsert(head, cur);
  7028. }
  7029. }
  7030. }
  7031. else {
  7032. /* If this fails, the data is just dropped. */
  7033. DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
  7034. fragSz, heap);
  7035. }
  7036. }
  7037. else {
  7038. head = DtlsMsgNew(dataSz, heap);
  7039. if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
  7040. fragSz, heap) < 0) {
  7041. DtlsMsgDelete(head, heap);
  7042. head = NULL;
  7043. }
  7044. else {
  7045. ssl->dtls_rx_msg_list_sz++;
  7046. }
  7047. }
  7048. ssl->dtls_rx_msg_list = head;
  7049. }
  7050. /* DtlsMsgInsert() is an in-order insert. */
  7051. DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
  7052. {
  7053. WOLFSSL_ENTER("DtlsMsgInsert()");
  7054. if (head == NULL || (item->epoch <= head->epoch &&
  7055. item->seq < head->seq)) {
  7056. item->next = head;
  7057. head = item;
  7058. }
  7059. else if (head->next == NULL) {
  7060. head->next = item;
  7061. }
  7062. else {
  7063. DtlsMsg* cur = head->next;
  7064. DtlsMsg* prev = head;
  7065. while (cur) {
  7066. if (item->epoch <= cur->epoch &&
  7067. item->seq < cur->seq) {
  7068. item->next = cur;
  7069. prev->next = item;
  7070. break;
  7071. }
  7072. prev = cur;
  7073. cur = cur->next;
  7074. }
  7075. if (cur == NULL) {
  7076. prev->next = item;
  7077. }
  7078. }
  7079. return head;
  7080. }
  7081. /**
  7082. * DtlsMsgPoolSave() adds the message to the end of the stored transmit
  7083. * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
  7084. * anything else that increments ssl->keys.dtls_handshake_number.
  7085. */
  7086. int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
  7087. enum HandShakeType type)
  7088. {
  7089. DtlsMsg* item;
  7090. int ret = 0;
  7091. WOLFSSL_ENTER("DtlsMsgPoolSave()");
  7092. if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) {
  7093. WOLFSSL_ERROR(DTLS_POOL_SZ_E);
  7094. return DTLS_POOL_SZ_E;
  7095. }
  7096. item = DtlsMsgNew(dataSz, ssl->heap);
  7097. if (item != NULL) {
  7098. DtlsMsg* cur = ssl->dtls_tx_msg_list;
  7099. XMEMCPY(item->buf, data, dataSz);
  7100. item->sz = dataSz;
  7101. item->epoch = ssl->keys.dtls_epoch;
  7102. item->seq = ssl->keys.dtls_handshake_number;
  7103. item->type = type;
  7104. if (cur == NULL)
  7105. ssl->dtls_tx_msg_list = item;
  7106. else {
  7107. while (cur->next)
  7108. cur = cur->next;
  7109. cur->next = item;
  7110. }
  7111. ssl->dtls_tx_msg_list_sz++;
  7112. }
  7113. else
  7114. ret = MEMORY_E;
  7115. WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret);
  7116. return ret;
  7117. }
  7118. /* DtlsMsgPoolTimeout() updates the timeout time. */
  7119. int DtlsMsgPoolTimeout(WOLFSSL* ssl)
  7120. {
  7121. int result = -1;
  7122. WOLFSSL_ENTER("DtlsMsgPoolTimeout()");
  7123. if (ssl->dtls_timeout < ssl->dtls_timeout_max) {
  7124. ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
  7125. result = 0;
  7126. }
  7127. WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result);
  7128. return result;
  7129. }
  7130. /* DtlsMsgPoolReset() deletes the stored transmit list and resets the timeout
  7131. * value. */
  7132. void DtlsMsgPoolReset(WOLFSSL* ssl)
  7133. {
  7134. WOLFSSL_ENTER("DtlsMsgPoolReset()");
  7135. if (ssl->dtls_tx_msg_list) {
  7136. DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap);
  7137. ssl->dtls_tx_msg_list = NULL;
  7138. ssl->dtls_tx_msg = NULL;
  7139. ssl->dtls_tx_msg_list_sz = 0;
  7140. }
  7141. ssl->dtls_timeout = ssl->dtls_timeout_init;
  7142. }
  7143. int VerifyForDtlsMsgPoolSend(WOLFSSL* ssl, byte type, word32 fragOffset)
  7144. {
  7145. /**
  7146. * only the first message from previous flight should be valid
  7147. * to be used for triggering retransmission of whole DtlsMsgPool.
  7148. * change cipher suite type is not verified here
  7149. */
  7150. return ((fragOffset == 0) &&
  7151. (((ssl->options.side == WOLFSSL_SERVER_END) &&
  7152. ((type == client_hello) ||
  7153. ((ssl->options.verifyPeer) && (type == certificate)) ||
  7154. ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
  7155. ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  7156. (type == hello_request || type == server_hello))));
  7157. }
  7158. /**
  7159. * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
  7160. * depending on the current state of the handshake negotiation.
  7161. */
  7162. int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
  7163. {
  7164. WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete()");
  7165. if (item->epoch < ssl->keys.dtls_epoch - 1)
  7166. /* Messages not from current or previous epoch can be deleted */
  7167. return 1;
  7168. switch (ssl->options.side) {
  7169. case WOLFSSL_CLIENT_END:
  7170. if (item->type == client_hello &&
  7171. ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
  7172. return 1; /* client can forget first client_hello if received full
  7173. * flight of packets from server */
  7174. else
  7175. return 0;
  7176. case WOLFSSL_SERVER_END:
  7177. if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
  7178. item->type == hello_request)
  7179. return 1; /* Server can forget HelloRequest if client sent a valid
  7180. * ClientHello */
  7181. if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
  7182. item->type <= server_hello_done)
  7183. return 1; /* server can forget everything up to ServerHelloDone if
  7184. * a client finished message has been received and
  7185. * successfully processed */
  7186. else
  7187. return 0;
  7188. default:
  7189. return 0;
  7190. }
  7191. }
  7192. /* DtlsMsgPoolSend() will send the stored transmit list. The stored list is
  7193. * updated with new sequence numbers, and will be re-encrypted if needed. */
  7194. int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket)
  7195. {
  7196. int ret = 0;
  7197. DtlsMsg* pool;
  7198. int epochOrder;
  7199. WOLFSSL_ENTER("DtlsMsgPoolSend()");
  7200. pool = ssl->dtls_tx_msg == NULL ? ssl->dtls_tx_msg_list : ssl->dtls_tx_msg;
  7201. if (pool != NULL) {
  7202. if ((ssl->options.side == WOLFSSL_SERVER_END &&
  7203. !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
  7204. ssl->options.acceptState == SERVER_HELLO_DONE ||
  7205. ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
  7206. ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
  7207. (ssl->options.side == WOLFSSL_CLIENT_END &&
  7208. !(ssl->options.connectState == CLIENT_HELLO_SENT ||
  7209. ssl->options.connectState == HELLO_AGAIN_REPLY ||
  7210. ssl->options.connectState == FINISHED_DONE ||
  7211. ssl->options.connectState == SECOND_REPLY_DONE))) {
  7212. WOLFSSL_ERROR(DTLS_RETX_OVER_TX);
  7213. ssl->error = DTLS_RETX_OVER_TX;
  7214. return WOLFSSL_FATAL_ERROR;
  7215. }
  7216. while (pool != NULL) {
  7217. if (pool->epoch == 0) {
  7218. DtlsRecordLayerHeader* dtls;
  7219. dtls = (DtlsRecordLayerHeader*)pool->buf;
  7220. /* If the stored record's epoch is 0, and the currently set
  7221. * epoch is 0, use the "current order" sequence number.
  7222. * If the stored record's epoch is 0 and the currently set
  7223. * epoch is not 0, the stored record is considered a "previous
  7224. * order" sequence number. */
  7225. epochOrder = (ssl->keys.dtls_epoch == 0) ?
  7226. CUR_ORDER : PREV_ORDER;
  7227. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  7228. DtlsSEQIncrement(ssl, epochOrder);
  7229. if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) {
  7230. WOLFSSL_ERROR(ret);
  7231. return ret;
  7232. }
  7233. XMEMCPY(ssl->buffers.outputBuffer.buffer +
  7234. ssl->buffers.outputBuffer.idx +
  7235. ssl->buffers.outputBuffer.length,
  7236. pool->buf, pool->sz);
  7237. ssl->buffers.outputBuffer.length += pool->sz;
  7238. }
  7239. else {
  7240. /* Handle sending packets from previous epoch */
  7241. byte* input;
  7242. byte* output;
  7243. int inputSz, sendSz;
  7244. input = pool->buf;
  7245. inputSz = pool->sz;
  7246. sendSz = inputSz + cipherExtraData(ssl);
  7247. #ifdef HAVE_SECURE_RENEGOTIATION
  7248. /*
  7249. * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
  7250. * ssl->keys otherwise
  7251. * PREV_ORDER will always use ssl->keys
  7252. */
  7253. if (DtlsSCRKeysSet(ssl)) {
  7254. if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  7255. epochOrder = CUR_ORDER;
  7256. else
  7257. epochOrder = PREV_ORDER;
  7258. }
  7259. else {
  7260. epochOrder = CUR_ORDER;
  7261. }
  7262. #else
  7263. epochOrder = CUR_ORDER;
  7264. #endif
  7265. /* add back in header space from saved pool size */
  7266. sendSz += DTLS_HANDSHAKE_EXTRA;
  7267. sendSz += DTLS_RECORD_EXTRA;
  7268. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
  7269. WOLFSSL_ERROR(ret);
  7270. return ret;
  7271. }
  7272. output = ssl->buffers.outputBuffer.buffer +
  7273. ssl->buffers.outputBuffer.length;
  7274. if (inputSz != ENUM_LEN)
  7275. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  7276. handshake, 0, 0, 0, epochOrder);
  7277. else
  7278. /* inputSz == ENUM_LEN must mean that this is a change cipher
  7279. * spec message */
  7280. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  7281. change_cipher_spec, 0, 0, 0, epochOrder);
  7282. if (sendSz < 0) {
  7283. WOLFSSL_ERROR(BUILD_MSG_ERROR);
  7284. return BUILD_MSG_ERROR;
  7285. }
  7286. ssl->buffers.outputBuffer.length += sendSz;
  7287. }
  7288. if (!ssl->options.groupMessages)
  7289. ret = SendBuffered(ssl);
  7290. /**
  7291. * on server side, retransmission is being triggered only by sending
  7292. * first message of given flight, in order to trigger client
  7293. * to retransmit its whole flight. Sending the whole previous flight
  7294. * could lead to retransmission of previous client flight for each
  7295. * server message from previous flight. Therefore one message should
  7296. * be enough to do the trick.
  7297. */
  7298. if (sendOnlyFirstPacket &&
  7299. ssl->options.side == WOLFSSL_SERVER_END)
  7300. pool = NULL;
  7301. else
  7302. pool = pool->next;
  7303. ssl->dtls_tx_msg = pool;
  7304. }
  7305. if (ret == 0 && ssl->options.groupMessages)
  7306. ret = SendBuffered(ssl);
  7307. }
  7308. WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret);
  7309. return ret;
  7310. }
  7311. #endif /* WOLFSSL_DTLS */
  7312. #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
  7313. ProtocolVersion MakeSSLv3(void)
  7314. {
  7315. ProtocolVersion pv;
  7316. pv.major = SSLv3_MAJOR;
  7317. pv.minor = SSLv3_MINOR;
  7318. return pv;
  7319. }
  7320. #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
  7321. #ifdef WOLFSSL_DTLS
  7322. ProtocolVersion MakeDTLSv1(void)
  7323. {
  7324. ProtocolVersion pv;
  7325. pv.major = DTLS_MAJOR;
  7326. pv.minor = DTLS_MINOR;
  7327. return pv;
  7328. }
  7329. #ifndef WOLFSSL_NO_TLS12
  7330. ProtocolVersion MakeDTLSv1_2(void)
  7331. {
  7332. ProtocolVersion pv;
  7333. pv.major = DTLS_MAJOR;
  7334. pv.minor = DTLSv1_2_MINOR;
  7335. return pv;
  7336. }
  7337. #endif /* !WOLFSSL_NO_TLS12 */
  7338. #endif /* WOLFSSL_DTLS */
  7339. #ifndef NO_ASN_TIME
  7340. #if defined(USER_TICKS)
  7341. #if 0
  7342. word32 LowResTimer(void)
  7343. {
  7344. /*
  7345. write your own clock tick function if don't want time(0)
  7346. needs second accuracy but doesn't have to correlated to EPOCH
  7347. */
  7348. }
  7349. #endif
  7350. #elif defined(TIME_OVERRIDES)
  7351. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  7352. /* use same asn time overrides unless user wants tick override above */
  7353. word32 LowResTimer(void)
  7354. {
  7355. return (word32) wc_Time(0);
  7356. }
  7357. #else
  7358. #ifndef HAVE_TIME_T_TYPE
  7359. typedef long time_t;
  7360. #endif
  7361. extern time_t XTIME(time_t * timer);
  7362. word32 LowResTimer(void)
  7363. {
  7364. return (word32) XTIME(0);
  7365. }
  7366. #endif
  7367. #elif defined(USE_WINDOWS_API)
  7368. word32 LowResTimer(void)
  7369. {
  7370. static int init = 0;
  7371. static LARGE_INTEGER freq;
  7372. LARGE_INTEGER count;
  7373. if (!init) {
  7374. QueryPerformanceFrequency(&freq);
  7375. init = 1;
  7376. }
  7377. QueryPerformanceCounter(&count);
  7378. return (word32)(count.QuadPart / freq.QuadPart);
  7379. }
  7380. #elif defined(HAVE_RTP_SYS)
  7381. #include "rtptime.h"
  7382. word32 LowResTimer(void)
  7383. {
  7384. return (word32)rtp_get_system_sec();
  7385. }
  7386. #elif defined(WOLFSSL_DEOS)
  7387. word32 LowResTimer(void)
  7388. {
  7389. const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
  7390. const volatile word32 *systemTickPtr = systemTickPointer();
  7391. return (word32) *systemTickPtr/systemTickTimeInHz;
  7392. }
  7393. #elif defined(MICRIUM)
  7394. word32 LowResTimer(void)
  7395. {
  7396. OS_TICK ticks = 0;
  7397. OS_ERR err;
  7398. ticks = OSTimeGet(&err);
  7399. return (word32) (ticks / OSCfg_TickRate_Hz);
  7400. }
  7401. #elif defined(MICROCHIP_TCPIP_V5)
  7402. word32 LowResTimer(void)
  7403. {
  7404. return (word32) (TickGet() / TICKS_PER_SECOND);
  7405. }
  7406. #elif defined(MICROCHIP_TCPIP)
  7407. #if defined(MICROCHIP_MPLAB_HARMONY)
  7408. #include <system/tmr/sys_tmr.h>
  7409. word32 LowResTimer(void)
  7410. {
  7411. return (word32) (SYS_TMR_TickCountGet() /
  7412. SYS_TMR_TickCounterFrequencyGet());
  7413. }
  7414. #else
  7415. word32 LowResTimer(void)
  7416. {
  7417. return (word32) (SYS_TICK_Get() / SYS_TICK_TicksPerSecondGet());
  7418. }
  7419. #endif
  7420. #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
  7421. word32 LowResTimer(void)
  7422. {
  7423. TIME_STRUCT mqxTime;
  7424. _time_get_elapsed(&mqxTime);
  7425. return (word32) mqxTime.SECONDS;
  7426. }
  7427. #elif defined(FREESCALE_FREE_RTOS) || defined(FREESCALE_KSDK_FREERTOS)
  7428. #include "include/task.h"
  7429. unsigned int LowResTimer(void)
  7430. {
  7431. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  7432. }
  7433. #elif defined(FREERTOS)
  7434. #include "task.h"
  7435. unsigned int LowResTimer(void)
  7436. {
  7437. return (unsigned int)(((float)xTaskGetTickCount())/configTICK_RATE_HZ);
  7438. }
  7439. #elif defined(FREESCALE_KSDK_BM)
  7440. #include "lwip/sys.h" /* lwIP */
  7441. word32 LowResTimer(void)
  7442. {
  7443. return sys_now()/1000;
  7444. }
  7445. #elif defined(WOLFSSL_TIRTOS)
  7446. word32 LowResTimer(void)
  7447. {
  7448. return (word32) Seconds_get();
  7449. }
  7450. #elif defined(WOLFSSL_XILINX)
  7451. #include "xrtcpsu.h"
  7452. word32 LowResTimer(void)
  7453. {
  7454. XRtcPsu_Config* con;
  7455. XRtcPsu rtc;
  7456. con = XRtcPsu_LookupConfig(XPAR_XRTCPSU_0_DEVICE_ID);
  7457. if (con != NULL) {
  7458. if (XRtcPsu_CfgInitialize(&rtc, con, con->BaseAddr)
  7459. == XST_SUCCESS) {
  7460. return (word32)XRtcPsu_GetCurrentTime(&rtc);
  7461. }
  7462. else {
  7463. WOLFSSL_MSG("Unable to initialize RTC");
  7464. }
  7465. }
  7466. return 0;
  7467. }
  7468. #elif defined(WOLFSSL_UTASKER)
  7469. word32 LowResTimer(void)
  7470. {
  7471. return (word32)(uTaskerSystemTick / TICK_RESOLUTION);
  7472. }
  7473. #elif defined(WOLFSSL_NUCLEUS_1_2)
  7474. #define NU_TICKS_PER_SECOND 100
  7475. word32 LowResTimer(void)
  7476. {
  7477. /* returns number of 10ms ticks, so 100 ticks/sec */
  7478. return NU_Retrieve_Clock() / NU_TICKS_PER_SECOND;
  7479. }
  7480. #elif defined(WOLFSSL_APACHE_MYNEWT)
  7481. #include "os/os_time.h"
  7482. word32 LowResTimer(void)
  7483. {
  7484. word32 now;
  7485. struct os_timeval tv;
  7486. os_gettimeofday(&tv, NULL);
  7487. now = (word32)tv.tv_sec;
  7488. return now;
  7489. }
  7490. #elif defined(WOLFSSL_ZEPHYR)
  7491. word32 LowResTimer(void)
  7492. {
  7493. return k_uptime_get() / 1000;
  7494. }
  7495. #elif defined(WOLFSSL_LINUXKM)
  7496. word32 LowResTimer(void)
  7497. {
  7498. return (word32)time(NULL);
  7499. }
  7500. #else
  7501. /* Posix style time */
  7502. #if !defined(USER_TIME) && !defined(USE_WOLF_TM)
  7503. #include <time.h>
  7504. #endif
  7505. word32 LowResTimer(void)
  7506. {
  7507. #if !defined(NO_ASN) && !defined(NO_ASN_TIME)
  7508. return (word32)wc_Time(0);
  7509. #else
  7510. return (word32)XTIME(0);
  7511. #endif
  7512. }
  7513. #endif
  7514. #else
  7515. /* user must supply timer function to return elapsed seconds:
  7516. * word32 LowResTimer(void);
  7517. */
  7518. #endif /* !NO_ASN_TIME */
  7519. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  7520. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  7521. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  7522. /* Store the message for use with CertificateVerify using EdDSA.
  7523. *
  7524. * ssl SSL/TLS object.
  7525. * data Message to store.
  7526. * sz Size of message to store.
  7527. * returns MEMORY_E if not able to reallocate, otherwise 0.
  7528. */
  7529. static int EdDSA_Update(WOLFSSL* ssl, const byte* data, int sz)
  7530. {
  7531. int ret = 0;
  7532. byte* msgs;
  7533. if (ssl->options.cacheMessages) {
  7534. msgs = (byte*)XREALLOC(ssl->hsHashes->messages,
  7535. ssl->hsHashes->length + sz,
  7536. ssl->heap, DYNAMIC_TYPE_HASHES);
  7537. if (msgs == NULL)
  7538. ret = MEMORY_E;
  7539. if (ret == 0) {
  7540. ssl->hsHashes->messages = msgs;
  7541. XMEMCPY(msgs + ssl->hsHashes->length, data, sz);
  7542. ssl->hsHashes->prevLen = ssl->hsHashes->length;
  7543. ssl->hsHashes->length += sz;
  7544. }
  7545. }
  7546. return ret;
  7547. }
  7548. #endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  7549. int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
  7550. {
  7551. int ret = 0;
  7552. (void)data;
  7553. (void)sz;
  7554. if (ssl->hsHashes == NULL) {
  7555. return BAD_FUNC_ARG;
  7556. }
  7557. #ifndef NO_OLD_TLS
  7558. #ifndef NO_SHA
  7559. wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
  7560. #endif
  7561. #ifndef NO_MD5
  7562. wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
  7563. #endif
  7564. #endif /* NO_OLD_TLS */
  7565. if (IsAtLeastTLSv1_2(ssl)) {
  7566. #ifndef NO_SHA256
  7567. ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
  7568. if (ret != 0)
  7569. return ret;
  7570. #endif
  7571. #ifdef WOLFSSL_SHA384
  7572. ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
  7573. if (ret != 0)
  7574. return ret;
  7575. #endif
  7576. #ifdef WOLFSSL_SHA512
  7577. ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
  7578. if (ret != 0)
  7579. return ret;
  7580. #endif
  7581. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  7582. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  7583. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  7584. ret = EdDSA_Update(ssl, data, sz);
  7585. if (ret != 0)
  7586. return ret;
  7587. #endif
  7588. }
  7589. return ret;
  7590. }
  7591. /* add output to md5 and sha handshake hashes, exclude record header */
  7592. int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
  7593. {
  7594. const byte* adj;
  7595. if (ssl->hsHashes == NULL)
  7596. return BAD_FUNC_ARG;
  7597. adj = output + RECORD_HEADER_SZ + ivSz;
  7598. sz -= RECORD_HEADER_SZ;
  7599. #ifdef HAVE_FUZZER
  7600. if (ssl->fuzzerCb)
  7601. ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
  7602. #endif
  7603. #ifdef WOLFSSL_DTLS
  7604. if (ssl->options.dtls) {
  7605. adj += DTLS_RECORD_EXTRA;
  7606. sz -= DTLS_RECORD_EXTRA;
  7607. }
  7608. #endif
  7609. return HashRaw(ssl, adj, sz);
  7610. }
  7611. /* add input to md5 and sha handshake hashes, include handshake header */
  7612. int HashInput(WOLFSSL* ssl, const byte* input, int sz)
  7613. {
  7614. const byte* adj;
  7615. if (ssl->hsHashes == NULL) {
  7616. return BAD_FUNC_ARG;
  7617. }
  7618. adj = input - HANDSHAKE_HEADER_SZ;
  7619. sz += HANDSHAKE_HEADER_SZ;
  7620. #ifdef WOLFSSL_DTLS
  7621. if (ssl->options.dtls) {
  7622. adj -= DTLS_HANDSHAKE_EXTRA;
  7623. sz += DTLS_HANDSHAKE_EXTRA;
  7624. }
  7625. #endif
  7626. return HashRaw(ssl, adj, sz);
  7627. }
  7628. /* add record layer header for message */
  7629. static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
  7630. {
  7631. RecordLayerHeader* rl;
  7632. (void)epochOrder;
  7633. /* record layer header */
  7634. rl = (RecordLayerHeader*)output;
  7635. if (rl == NULL) {
  7636. return;
  7637. }
  7638. rl->type = type;
  7639. rl->pvMajor = ssl->version.major; /* type and version same in each */
  7640. #ifdef WOLFSSL_TLS13
  7641. if (IsAtLeastTLSv1_3(ssl->version)) {
  7642. rl->pvMinor = TLSv1_2_MINOR;
  7643. }
  7644. else
  7645. #endif
  7646. rl->pvMinor = ssl->version.minor;
  7647. #ifdef WOLFSSL_ALTERNATIVE_DOWNGRADE
  7648. if (ssl->options.side == WOLFSSL_CLIENT_END
  7649. && ssl->options.connectState == CONNECT_BEGIN
  7650. && !ssl->options.resuming) {
  7651. rl->pvMinor = ssl->options.downgrade ? ssl->options.minDowngrade
  7652. : ssl->version.minor;
  7653. }
  7654. #endif
  7655. if (!ssl->options.dtls) {
  7656. c16toa((word16)length, rl->length);
  7657. }
  7658. else {
  7659. #ifdef WOLFSSL_DTLS
  7660. DtlsRecordLayerHeader* dtls;
  7661. /* dtls record layer header extensions */
  7662. dtls = (DtlsRecordLayerHeader*)output;
  7663. WriteSEQ(ssl, epochOrder, dtls->sequence_number);
  7664. c16toa((word16)length, dtls->length);
  7665. #endif
  7666. }
  7667. }
  7668. #if !defined(WOLFSSL_NO_TLS12) || (defined(HAVE_SESSION_TICKET) && \
  7669. !defined(NO_WOLFSSL_SERVER))
  7670. /* add handshake header for message */
  7671. static void AddHandShakeHeader(byte* output, word32 length,
  7672. word32 fragOffset, word32 fragLength,
  7673. byte type, WOLFSSL* ssl)
  7674. {
  7675. HandShakeHeader* hs;
  7676. (void)fragOffset;
  7677. (void)fragLength;
  7678. (void)ssl;
  7679. /* handshake header */
  7680. hs = (HandShakeHeader*)output;
  7681. if (hs == NULL)
  7682. return;
  7683. hs->type = type;
  7684. c32to24(length, hs->length); /* type and length same for each */
  7685. #ifdef WOLFSSL_DTLS
  7686. if (ssl->options.dtls) {
  7687. DtlsHandShakeHeader* dtls;
  7688. /* dtls handshake header extensions */
  7689. dtls = (DtlsHandShakeHeader*)output;
  7690. c16toa(ssl->keys.dtls_handshake_number++, dtls->message_seq);
  7691. c32to24(fragOffset, dtls->fragment_offset);
  7692. c32to24(fragLength, dtls->fragment_length);
  7693. }
  7694. #endif
  7695. }
  7696. /* add both headers for handshake message */
  7697. static void AddHeaders(byte* output, word32 length, byte type, WOLFSSL* ssl)
  7698. {
  7699. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  7700. word32 outputAdj = RECORD_HEADER_SZ;
  7701. #ifdef WOLFSSL_DTLS
  7702. if (ssl->options.dtls) {
  7703. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  7704. outputAdj += DTLS_RECORD_EXTRA;
  7705. }
  7706. #endif
  7707. AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
  7708. AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
  7709. }
  7710. #endif /* !WOLFSSL_NO_TLS12 || (HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER) */
  7711. #ifndef WOLFSSL_NO_TLS12
  7712. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_SERVER) || \
  7713. !defined(WOLFSSL_NO_CLIENT_AUTH)) || \
  7714. defined(WOLFSSL_DTLS)
  7715. static void AddFragHeaders(byte* output, word32 fragSz, word32 fragOffset,
  7716. word32 length, byte type, WOLFSSL* ssl)
  7717. {
  7718. word32 lengthAdj = HANDSHAKE_HEADER_SZ;
  7719. word32 outputAdj = RECORD_HEADER_SZ;
  7720. (void)fragSz;
  7721. #ifdef WOLFSSL_DTLS
  7722. if (ssl->options.dtls) {
  7723. lengthAdj += DTLS_HANDSHAKE_EXTRA;
  7724. outputAdj += DTLS_RECORD_EXTRA;
  7725. }
  7726. #endif
  7727. AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
  7728. AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
  7729. }
  7730. #endif /* NO_CERTS */
  7731. #if !defined(NO_WOLFSSL_SERVER) || \
  7732. (!defined(NO_WOLFSSL_CLIENT) && !defined(NO_CERTS) && \
  7733. !defined(WOLFSSL_NO_CLIENT_AUTH))
  7734. /**
  7735. * Send the handshake message. This function handles fragmenting the message
  7736. * so that it will fit into the desired MTU or the max fragment size.
  7737. * @param ssl Connection object
  7738. * @param input Input starting at the record layer header. This function
  7739. * assumes that the appropriate record and handshake headers
  7740. * are present. These headers must assume no fragmentation.
  7741. * That is handled here.
  7742. * @param inputSz Length of message excluding headers (this is the total
  7743. * length of all fragments)
  7744. * @param type Type of message being sent
  7745. * @return 0 on success and negative otherwise
  7746. */
  7747. static int SendHandshakeMsg(WOLFSSL* ssl, byte* input, word32 inputSz,
  7748. enum HandShakeType type, const char* packetName)
  7749. {
  7750. int maxFrag;
  7751. int ret = 0;
  7752. int headerSz;
  7753. WOLFSSL_ENTER("SendHandshakeMsg");
  7754. (void)type;
  7755. (void)packetName;
  7756. if (ssl == NULL || input == NULL)
  7757. return BAD_FUNC_ARG;
  7758. #ifdef WOLFSSL_DTLS
  7759. if (ssl->options.dtls)
  7760. headerSz = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  7761. else
  7762. #endif
  7763. {
  7764. /* In TLS we send one handshake header in total, not one
  7765. * per fragment like in DTLS. The handshake header should
  7766. * already be in the input buffer. */
  7767. inputSz += HANDSHAKE_HEADER_SZ;
  7768. headerSz = RECORD_HEADER_SZ;
  7769. }
  7770. maxFrag = wolfSSL_GetMaxFragSize(ssl, (int)inputSz);
  7771. /* Make sure input is not the ssl output buffer as this
  7772. * function doesn't handle that */
  7773. if (input >= ssl->buffers.outputBuffer.buffer &&
  7774. input < ssl->buffers.outputBuffer.buffer +
  7775. ssl->buffers.outputBuffer.bufferSize) {
  7776. WOLFSSL_MSG("Can't use output buffer for input in SendHandshakeMsg");
  7777. return BAD_FUNC_ARG;
  7778. }
  7779. if (!ssl->options.buildingMsg) {
  7780. /* Hash it before the loop as we modify the input with
  7781. * encryption on */
  7782. ret = HashOutput(ssl, input, headerSz + (int)inputSz, 0);
  7783. if (ret != 0)
  7784. return ret;
  7785. #ifdef WOLFSSL_DTLS
  7786. /* Decrement msg number so that we continue to use the
  7787. * same msg number for this msg */
  7788. if (ssl->options.dtls)
  7789. ssl->keys.dtls_handshake_number--;
  7790. #endif
  7791. }
  7792. while (ssl->fragOffset < inputSz) {
  7793. byte* output;
  7794. int outputSz;
  7795. byte* data = input + ssl->fragOffset + headerSz;
  7796. word32 fragSz = (word32)maxFrag;
  7797. ssl->options.buildingMsg = 1;
  7798. if (inputSz - ssl->fragOffset < fragSz)
  7799. fragSz = inputSz - ssl->fragOffset;
  7800. /* check for available size */
  7801. outputSz = headerSz + fragSz;
  7802. if (IsEncryptionOn(ssl, 1))
  7803. outputSz += cipherExtraData(ssl);
  7804. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  7805. return ret;
  7806. if (ssl->buffers.outputBuffer.buffer == NULL)
  7807. return MEMORY_E;
  7808. output = ssl->buffers.outputBuffer.buffer +
  7809. ssl->buffers.outputBuffer.length;
  7810. if (IsEncryptionOn(ssl, 1)) {
  7811. /* First we need to add the fragment header ourselves.
  7812. * We do this in the input to minimize allocations */
  7813. int dataSz = (int)fragSz;
  7814. #ifdef WOLFSSL_DTLS
  7815. if (ssl->options.dtls) {
  7816. data -= DTLS_HANDSHAKE_HEADER_SZ;
  7817. dataSz += DTLS_HANDSHAKE_HEADER_SZ;
  7818. AddHandShakeHeader(data,
  7819. inputSz, ssl->fragOffset, fragSz, type, ssl);
  7820. ssl->keys.dtls_handshake_number--;
  7821. }
  7822. if (IsDtlsNotSctpMode(ssl) &&
  7823. (ret = DtlsMsgPoolSave(ssl, data,
  7824. fragSz + DTLS_HANDSHAKE_HEADER_SZ, type))
  7825. != 0)
  7826. return ret;
  7827. #endif
  7828. ret = BuildMessage(ssl, output, outputSz,
  7829. data, dataSz, handshake, 0, 0, 0, CUR_ORDER);
  7830. if (ret >= 0)
  7831. outputSz = ret;
  7832. else
  7833. return ret;
  7834. ret = 0;
  7835. }
  7836. else {
  7837. #ifdef WOLFSSL_DTLS
  7838. if (ssl->options.dtls)
  7839. AddFragHeaders(output, fragSz, ssl->fragOffset,
  7840. inputSz, type, ssl);
  7841. else
  7842. #endif
  7843. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  7844. XMEMCPY(output + headerSz, data, fragSz);
  7845. #ifdef WOLFSSL_DTLS
  7846. if (ssl->options.dtls) {
  7847. ssl->keys.dtls_handshake_number--;
  7848. DtlsSEQIncrement(ssl, CUR_ORDER);
  7849. }
  7850. if (IsDtlsNotSctpMode(ssl)) {
  7851. if ((ret = DtlsMsgPoolSave(ssl, output, headerSz + fragSz,
  7852. type)) != 0) {
  7853. return ret;
  7854. }
  7855. }
  7856. #endif
  7857. }
  7858. ssl->buffers.outputBuffer.length += outputSz;
  7859. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  7860. if (ssl->hsInfoOn) {
  7861. AddPacketName(ssl, packetName);
  7862. }
  7863. if (ssl->toInfoOn) {
  7864. AddPacketInfo(ssl, packetName, handshake,
  7865. output, outputSz, WRITE_PROTO, ssl->heap);
  7866. }
  7867. #endif
  7868. ssl->fragOffset += fragSz;
  7869. if (!ssl->options.groupMessages)
  7870. ret = SendBuffered(ssl);
  7871. if (ret != 0)
  7872. return ret;
  7873. }
  7874. #ifdef WOLFSSL_DTLS
  7875. /* Increment msg number once we sent all fragments */
  7876. if (ssl->options.dtls)
  7877. ssl->keys.dtls_handshake_number++;
  7878. #endif
  7879. ssl->fragOffset = 0;
  7880. ssl->options.buildingMsg = 0;
  7881. return ret;
  7882. }
  7883. #endif /* !NO_WOLFSSL_SERVER || (!NO_WOLFSSL_CLIENT && !NO_CERTS &&
  7884. * !WOLFSSL_NO_CLIENT_AUTH) */
  7885. #endif /* !WOLFSSL_NO_TLS12 */
  7886. /* return bytes received, -1 on error */
  7887. static int wolfSSLReceive(WOLFSSL* ssl, byte* buf, word32 sz)
  7888. {
  7889. int recvd;
  7890. int retryLimit = WOLFSSL_MODE_AUTO_RETRY_ATTEMPTS;
  7891. if (ssl->CBIORecv == NULL) {
  7892. WOLFSSL_MSG("Your IO Recv callback is null, please set");
  7893. return -1;
  7894. }
  7895. retry:
  7896. recvd = ssl->CBIORecv(ssl, (char *)buf, (int)sz, ssl->IOCB_ReadCtx);
  7897. if (recvd < 0) {
  7898. switch (recvd) {
  7899. case WOLFSSL_CBIO_ERR_GENERAL: /* general/unknown error */
  7900. #ifdef WOLFSSL_APACHE_HTTPD
  7901. #ifndef NO_BIO
  7902. if (ssl->biord) {
  7903. /* If retry and read flags are set, return WANT_READ */
  7904. if ((ssl->biord->flags & WOLFSSL_BIO_FLAG_READ) &&
  7905. (ssl->biord->flags & WOLFSSL_BIO_FLAG_RETRY)) {
  7906. return WANT_READ;
  7907. }
  7908. }
  7909. #endif
  7910. #endif
  7911. return -1;
  7912. case WOLFSSL_CBIO_ERR_WANT_READ: /* want read, would block */
  7913. if (retryLimit > 0 && ssl->ctx->autoRetry &&
  7914. !ssl->options.handShakeDone && !ssl->options.dtls) {
  7915. retryLimit--;
  7916. goto retry;
  7917. }
  7918. return WANT_READ;
  7919. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  7920. #ifdef USE_WINDOWS_API
  7921. if (ssl->options.dtls) {
  7922. goto retry;
  7923. }
  7924. #endif
  7925. ssl->options.connReset = 1;
  7926. return -1;
  7927. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  7928. /* see if we got our timeout */
  7929. #ifdef WOLFSSL_CALLBACKS
  7930. if (ssl->toInfoOn) {
  7931. struct itimerval timeout;
  7932. getitimer(ITIMER_REAL, &timeout);
  7933. if (timeout.it_value.tv_sec == 0 &&
  7934. timeout.it_value.tv_usec == 0) {
  7935. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  7936. "recv() timeout", MAX_TIMEOUT_NAME_SZ);
  7937. ssl->timeoutInfo.timeoutName[
  7938. MAX_TIMEOUT_NAME_SZ] = '\0';
  7939. WOLFSSL_MSG("Got our timeout");
  7940. return WANT_READ;
  7941. }
  7942. }
  7943. #endif
  7944. goto retry;
  7945. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* peer closed connection */
  7946. ssl->options.isClosed = 1;
  7947. return -1;
  7948. case WOLFSSL_CBIO_ERR_TIMEOUT:
  7949. #ifdef WOLFSSL_DTLS
  7950. if (IsDtlsNotSctpMode(ssl) &&
  7951. ssl->options.handShakeState != HANDSHAKE_DONE &&
  7952. DtlsMsgPoolTimeout(ssl) == 0 &&
  7953. DtlsMsgPoolSend(ssl, 0) == 0) {
  7954. /* retry read for DTLS during handshake only */
  7955. goto retry;
  7956. }
  7957. #endif
  7958. return -1;
  7959. default:
  7960. WOLFSSL_MSG("Unexpected recv return code");
  7961. return recvd;
  7962. }
  7963. }
  7964. return recvd;
  7965. }
  7966. /* Switch dynamic output buffer back to static, buffer is assumed clear */
  7967. void ShrinkOutputBuffer(WOLFSSL* ssl)
  7968. {
  7969. WOLFSSL_MSG("Shrinking output buffer");
  7970. XFREE(ssl->buffers.outputBuffer.buffer - ssl->buffers.outputBuffer.offset,
  7971. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  7972. ssl->buffers.outputBuffer.buffer = ssl->buffers.outputBuffer.staticBuffer;
  7973. ssl->buffers.outputBuffer.bufferSize = STATIC_BUFFER_LEN;
  7974. ssl->buffers.outputBuffer.dynamicFlag = 0;
  7975. ssl->buffers.outputBuffer.offset = 0;
  7976. }
  7977. /* Switch dynamic input buffer back to static, keep any remaining input */
  7978. /* forced free means cleaning up */
  7979. void ShrinkInputBuffer(WOLFSSL* ssl, int forcedFree)
  7980. {
  7981. int usedLength = ssl->buffers.inputBuffer.length -
  7982. ssl->buffers.inputBuffer.idx;
  7983. if (!forcedFree && usedLength > STATIC_BUFFER_LEN)
  7984. return;
  7985. WOLFSSL_MSG("Shrinking input buffer");
  7986. if (!forcedFree && usedLength > 0)
  7987. XMEMCPY(ssl->buffers.inputBuffer.staticBuffer,
  7988. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  7989. usedLength);
  7990. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  7991. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  7992. ssl->buffers.inputBuffer.buffer = ssl->buffers.inputBuffer.staticBuffer;
  7993. ssl->buffers.inputBuffer.bufferSize = STATIC_BUFFER_LEN;
  7994. ssl->buffers.inputBuffer.dynamicFlag = 0;
  7995. ssl->buffers.inputBuffer.offset = 0;
  7996. ssl->buffers.inputBuffer.idx = 0;
  7997. ssl->buffers.inputBuffer.length = usedLength;
  7998. }
  7999. int SendBuffered(WOLFSSL* ssl)
  8000. {
  8001. if (ssl->CBIOSend == NULL) {
  8002. WOLFSSL_MSG("Your IO Send callback is null, please set");
  8003. return SOCKET_ERROR_E;
  8004. }
  8005. #ifdef WOLFSSL_DEBUG_TLS
  8006. if (ssl->buffers.outputBuffer.idx == 0) {
  8007. WOLFSSL_MSG("Data to send");
  8008. WOLFSSL_BUFFER(ssl->buffers.outputBuffer.buffer,
  8009. ssl->buffers.outputBuffer.length);
  8010. }
  8011. #endif
  8012. while (ssl->buffers.outputBuffer.length > 0) {
  8013. int sent = ssl->CBIOSend(ssl,
  8014. (char*)ssl->buffers.outputBuffer.buffer +
  8015. ssl->buffers.outputBuffer.idx,
  8016. (int)ssl->buffers.outputBuffer.length,
  8017. ssl->IOCB_WriteCtx);
  8018. if (sent < 0) {
  8019. switch (sent) {
  8020. case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */
  8021. return WANT_WRITE;
  8022. case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */
  8023. ssl->options.connReset = 1;
  8024. break;
  8025. case WOLFSSL_CBIO_ERR_ISR: /* interrupt */
  8026. /* see if we got our timeout */
  8027. #ifdef WOLFSSL_CALLBACKS
  8028. if (ssl->toInfoOn) {
  8029. struct itimerval timeout;
  8030. getitimer(ITIMER_REAL, &timeout);
  8031. if (timeout.it_value.tv_sec == 0 &&
  8032. timeout.it_value.tv_usec == 0) {
  8033. XSTRNCPY(ssl->timeoutInfo.timeoutName,
  8034. "send() timeout", MAX_TIMEOUT_NAME_SZ);
  8035. ssl->timeoutInfo.timeoutName[
  8036. MAX_TIMEOUT_NAME_SZ] = '\0';
  8037. WOLFSSL_MSG("Got our timeout");
  8038. return WANT_WRITE;
  8039. }
  8040. }
  8041. #endif
  8042. continue;
  8043. case WOLFSSL_CBIO_ERR_CONN_CLOSE: /* epipe / conn closed */
  8044. ssl->options.connReset = 1; /* treat same as reset */
  8045. break;
  8046. default:
  8047. return SOCKET_ERROR_E;
  8048. }
  8049. return SOCKET_ERROR_E;
  8050. }
  8051. if (sent > (int)ssl->buffers.outputBuffer.length) {
  8052. WOLFSSL_MSG("SendBuffered() out of bounds read");
  8053. return SEND_OOB_READ_E;
  8054. }
  8055. ssl->buffers.outputBuffer.idx += sent;
  8056. ssl->buffers.outputBuffer.length -= sent;
  8057. }
  8058. ssl->buffers.outputBuffer.idx = 0;
  8059. if (ssl->buffers.outputBuffer.dynamicFlag)
  8060. ShrinkOutputBuffer(ssl);
  8061. return 0;
  8062. }
  8063. /* Grow the output buffer */
  8064. static WC_INLINE int GrowOutputBuffer(WOLFSSL* ssl, int size)
  8065. {
  8066. byte* tmp;
  8067. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8068. byte hdrSz = ssl->options.dtls ? DTLS_RECORD_HEADER_SZ :
  8069. RECORD_HEADER_SZ;
  8070. byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8071. #else
  8072. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8073. #endif
  8074. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8075. /* the encrypted data will be offset from the front of the buffer by
  8076. the header, if the user wants encrypted alignment they need
  8077. to define their alignment requirement */
  8078. while (align < hdrSz)
  8079. align *= 2;
  8080. #endif
  8081. tmp = (byte*)XMALLOC(size + ssl->buffers.outputBuffer.length + align,
  8082. ssl->heap, DYNAMIC_TYPE_OUT_BUFFER);
  8083. WOLFSSL_MSG("growing output buffer");
  8084. if (tmp == NULL)
  8085. return MEMORY_E;
  8086. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8087. if (align)
  8088. tmp += align - hdrSz;
  8089. #endif
  8090. #ifdef WOLFSSL_STATIC_MEMORY
  8091. /* can be from IO memory pool which does not need copy if same buffer */
  8092. if (ssl->buffers.outputBuffer.length &&
  8093. tmp == ssl->buffers.outputBuffer.buffer) {
  8094. ssl->buffers.outputBuffer.bufferSize =
  8095. size + ssl->buffers.outputBuffer.length;
  8096. return 0;
  8097. }
  8098. #endif
  8099. if (ssl->buffers.outputBuffer.length)
  8100. XMEMCPY(tmp, ssl->buffers.outputBuffer.buffer,
  8101. ssl->buffers.outputBuffer.length);
  8102. if (ssl->buffers.outputBuffer.dynamicFlag)
  8103. XFREE(ssl->buffers.outputBuffer.buffer -
  8104. ssl->buffers.outputBuffer.offset, ssl->heap,
  8105. DYNAMIC_TYPE_OUT_BUFFER);
  8106. ssl->buffers.outputBuffer.dynamicFlag = 1;
  8107. #if WOLFSSL_GENERAL_ALIGNMENT > 0
  8108. if (align)
  8109. ssl->buffers.outputBuffer.offset = align - hdrSz;
  8110. else
  8111. #endif
  8112. ssl->buffers.outputBuffer.offset = 0;
  8113. ssl->buffers.outputBuffer.buffer = tmp;
  8114. ssl->buffers.outputBuffer.bufferSize = size +
  8115. ssl->buffers.outputBuffer.length;
  8116. return 0;
  8117. }
  8118. /* Grow the input buffer, should only be to read cert or big app data */
  8119. int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength)
  8120. {
  8121. byte* tmp;
  8122. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8123. byte align = ssl->options.dtls ? WOLFSSL_GENERAL_ALIGNMENT : 0;
  8124. byte hdrSz = DTLS_RECORD_HEADER_SZ;
  8125. #else
  8126. const byte align = WOLFSSL_GENERAL_ALIGNMENT;
  8127. #endif
  8128. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8129. /* the encrypted data will be offset from the front of the buffer by
  8130. the dtls record header, if the user wants encrypted alignment they need
  8131. to define their alignment requirement. in tls we read record header
  8132. to get size of record and put actual data back at front, so don't need */
  8133. if (align) {
  8134. while (align < hdrSz)
  8135. align *= 2;
  8136. }
  8137. #endif
  8138. if (usedLength < 0 || size < 0) {
  8139. WOLFSSL_MSG("GrowInputBuffer() called with negative number");
  8140. return BAD_FUNC_ARG;
  8141. }
  8142. tmp = (byte*)XMALLOC(size + usedLength + align,
  8143. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  8144. WOLFSSL_MSG("growing input buffer");
  8145. if (tmp == NULL)
  8146. return MEMORY_E;
  8147. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8148. if (align)
  8149. tmp += align - hdrSz;
  8150. #endif
  8151. #ifdef WOLFSSL_STATIC_MEMORY
  8152. /* can be from IO memory pool which does not need copy if same buffer */
  8153. if (usedLength && tmp == ssl->buffers.inputBuffer.buffer) {
  8154. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  8155. ssl->buffers.inputBuffer.idx = 0;
  8156. ssl->buffers.inputBuffer.length = usedLength;
  8157. return 0;
  8158. }
  8159. #endif
  8160. if (usedLength)
  8161. XMEMCPY(tmp, ssl->buffers.inputBuffer.buffer +
  8162. ssl->buffers.inputBuffer.idx, usedLength);
  8163. if (ssl->buffers.inputBuffer.dynamicFlag)
  8164. XFREE(ssl->buffers.inputBuffer.buffer - ssl->buffers.inputBuffer.offset,
  8165. ssl->heap,DYNAMIC_TYPE_IN_BUFFER);
  8166. ssl->buffers.inputBuffer.dynamicFlag = 1;
  8167. #if defined(WOLFSSL_DTLS) || WOLFSSL_GENERAL_ALIGNMENT > 0
  8168. if (align)
  8169. ssl->buffers.inputBuffer.offset = align - hdrSz;
  8170. else
  8171. #endif
  8172. ssl->buffers.inputBuffer.offset = 0;
  8173. ssl->buffers.inputBuffer.buffer = tmp;
  8174. ssl->buffers.inputBuffer.bufferSize = size + usedLength;
  8175. ssl->buffers.inputBuffer.idx = 0;
  8176. ssl->buffers.inputBuffer.length = usedLength;
  8177. return 0;
  8178. }
  8179. /* Check available size into output buffer, make room if needed.
  8180. * This function needs to be called before anything gets put
  8181. * into the output buffers since it flushes pending data if it
  8182. * predicts that the msg will exceed MTU. */
  8183. int CheckAvailableSize(WOLFSSL *ssl, int size)
  8184. {
  8185. if (size < 0) {
  8186. WOLFSSL_MSG("CheckAvailableSize() called with negative number");
  8187. return BAD_FUNC_ARG;
  8188. }
  8189. #ifdef WOLFSSL_DTLS
  8190. if (ssl->options.dtls) {
  8191. if (size + ssl->buffers.outputBuffer.length -
  8192. ssl->buffers.outputBuffer.idx >
  8193. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  8194. ssl->dtlsMtuSz
  8195. #else
  8196. ssl->dtls_expected_rx
  8197. #endif
  8198. ) {
  8199. int ret;
  8200. WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
  8201. "to make room for new message");
  8202. if ((ret = SendBuffered(ssl)) != 0) {
  8203. return ret;
  8204. }
  8205. }
  8206. if (size > (int)
  8207. #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
  8208. ssl->dtlsMtuSz
  8209. #else
  8210. ssl->dtls_expected_rx
  8211. #endif
  8212. ) {
  8213. WOLFSSL_MSG("CheckAvailableSize() called with size greater than MTU.");
  8214. return DTLS_SIZE_ERROR;
  8215. }
  8216. }
  8217. #endif
  8218. if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
  8219. < (word32)size) {
  8220. if (GrowOutputBuffer(ssl, size) < 0)
  8221. return MEMORY_E;
  8222. }
  8223. return 0;
  8224. }
  8225. /* do all verify and sanity checks on record header */
  8226. static int GetRecordHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  8227. RecordLayerHeader* rh, word16 *size)
  8228. {
  8229. #ifdef OPENSSL_ALL
  8230. word32 start = *inOutIdx;
  8231. #endif
  8232. if (!ssl->options.dtls) {
  8233. #ifdef HAVE_FUZZER
  8234. if (ssl->fuzzerCb)
  8235. ssl->fuzzerCb(ssl, input + *inOutIdx, RECORD_HEADER_SZ, FUZZ_HEAD,
  8236. ssl->fuzzerCtx);
  8237. #endif
  8238. XMEMCPY(rh, input + *inOutIdx, RECORD_HEADER_SZ);
  8239. *inOutIdx += RECORD_HEADER_SZ;
  8240. ato16(rh->length, size);
  8241. }
  8242. else {
  8243. #ifdef WOLFSSL_DTLS
  8244. #ifdef HAVE_FUZZER
  8245. if (ssl->fuzzerCb)
  8246. ssl->fuzzerCb(ssl, input + *inOutIdx, DTLS_RECORD_HEADER_SZ,
  8247. FUZZ_HEAD, ssl->fuzzerCtx);
  8248. #endif
  8249. /* type and version in same sport */
  8250. XMEMCPY(rh, input + *inOutIdx, ENUM_LEN + VERSION_SZ);
  8251. *inOutIdx += ENUM_LEN + VERSION_SZ;
  8252. ato16(input + *inOutIdx, &ssl->keys.curEpoch);
  8253. *inOutIdx += OPAQUE16_LEN;
  8254. if (ssl->options.haveMcast) {
  8255. #ifdef WOLFSSL_MULTICAST
  8256. ssl->keys.curPeerId = input[*inOutIdx];
  8257. ssl->keys.curSeq_hi = input[*inOutIdx+1];
  8258. #endif
  8259. }
  8260. else
  8261. ato16(input + *inOutIdx, &ssl->keys.curSeq_hi);
  8262. *inOutIdx += OPAQUE16_LEN;
  8263. ato32(input + *inOutIdx, &ssl->keys.curSeq_lo);
  8264. *inOutIdx += OPAQUE32_LEN; /* advance past rest of seq */
  8265. ato16(input + *inOutIdx, size);
  8266. *inOutIdx += LENGTH_SZ;
  8267. #endif
  8268. }
  8269. #ifdef WOLFSSL_DTLS
  8270. if (IsDtlsNotSctpMode(ssl)) {
  8271. if (!DtlsCheckWindow(ssl) ||
  8272. (rh->type == application_data && ssl->keys.curEpoch == 0) ||
  8273. (rh->type == alert && ssl->options.handShakeDone &&
  8274. ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
  8275. WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
  8276. return SEQUENCE_ERROR;
  8277. }
  8278. }
  8279. #endif
  8280. /* catch version mismatch */
  8281. #ifndef WOLFSSL_TLS13
  8282. if (rh->pvMajor != ssl->version.major || rh->pvMinor != ssl->version.minor)
  8283. #else
  8284. if (rh->pvMajor != ssl->version.major ||
  8285. (rh->pvMinor != ssl->version.minor &&
  8286. (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_2_MINOR)
  8287. ))
  8288. #endif
  8289. {
  8290. if (ssl->options.side == WOLFSSL_SERVER_END &&
  8291. ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE)
  8292. WOLFSSL_MSG("Client attempting to connect with different version");
  8293. else if (ssl->options.side == WOLFSSL_CLIENT_END &&
  8294. ssl->options.downgrade &&
  8295. ssl->options.connectState < FIRST_REPLY_DONE)
  8296. WOLFSSL_MSG("Server attempting to accept with different version");
  8297. else if (ssl->options.dtls && rh->type == handshake)
  8298. /* Check the DTLS handshake message RH version later. */
  8299. WOLFSSL_MSG("DTLS handshake, skip RH version number check");
  8300. else {
  8301. WOLFSSL_MSG("SSL version error");
  8302. /* send alert per RFC5246 Appendix E. Backward Compatibility */
  8303. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  8304. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  8305. SendAlert(ssl, alert_fatal, wc_protocol_version);
  8306. #else
  8307. SendAlert(ssl, alert_fatal, protocol_version);
  8308. #endif
  8309. }
  8310. return VERSION_ERROR; /* only use requested version */
  8311. }
  8312. }
  8313. /* record layer length check */
  8314. #ifdef HAVE_MAX_FRAGMENT
  8315. if (*size > (ssl->max_fragment + MAX_COMP_EXTRA + MAX_MSG_EXTRA)) {
  8316. SendAlert(ssl, alert_fatal, record_overflow);
  8317. return LENGTH_ERROR;
  8318. }
  8319. #else
  8320. if (*size > (MAX_RECORD_SIZE + MAX_COMP_EXTRA + MAX_MSG_EXTRA))
  8321. return LENGTH_ERROR;
  8322. #endif
  8323. if (*size == 0 && rh->type != application_data) {
  8324. WOLFSSL_MSG("0 length, non-app data record.");
  8325. return LENGTH_ERROR;
  8326. }
  8327. /* verify record type here as well */
  8328. switch (rh->type) {
  8329. case handshake:
  8330. case change_cipher_spec:
  8331. case application_data:
  8332. case alert:
  8333. break;
  8334. case no_type:
  8335. default:
  8336. #ifdef OPENSSL_ALL
  8337. {
  8338. char *method = (char*)input + start;
  8339. /* Attempt to identify if this is a plain HTTP request.
  8340. * No size checks because this function assumes at least
  8341. * RECORD_HEADER_SZ size of data has been read which is
  8342. * also the longest string comparison in this if. */
  8343. if (XSTRNCMP(method, "GET ", XSTR_SIZEOF("GET ")) == 0 ||
  8344. XSTRNCMP(method, "POST ", XSTR_SIZEOF("POST ")) == 0 ||
  8345. XSTRNCMP(method, "HEAD ", XSTR_SIZEOF("HEAD ")) == 0 ||
  8346. XSTRNCMP(method, "PUT ", XSTR_SIZEOF("PUT ")) == 0) {
  8347. WOLFSSL_MSG("Plain HTTP request detected");
  8348. return SSL_R_HTTP_REQUEST;
  8349. }
  8350. }
  8351. #endif
  8352. WOLFSSL_MSG("Unknown Record Type");
  8353. return UNKNOWN_RECORD_TYPE;
  8354. }
  8355. /* haven't decrypted this record yet */
  8356. ssl->keys.decryptedCur = 0;
  8357. return 0;
  8358. }
  8359. #ifndef WOLFSSL_NO_TLS12
  8360. static int GetHandShakeHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  8361. byte *type, word32 *size, word32 totalSz)
  8362. {
  8363. const byte *ptr = input + *inOutIdx;
  8364. (void)ssl;
  8365. *inOutIdx += HANDSHAKE_HEADER_SZ;
  8366. if (*inOutIdx > totalSz)
  8367. return BUFFER_E;
  8368. *type = ptr[0];
  8369. c24to32(&ptr[1], size);
  8370. return 0;
  8371. }
  8372. #endif
  8373. #ifdef WOLFSSL_DTLS
  8374. static int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input,
  8375. word32* inOutIdx, byte *type, word32 *size,
  8376. word32 *fragOffset, word32 *fragSz,
  8377. word32 totalSz)
  8378. {
  8379. word32 idx = *inOutIdx;
  8380. *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA;
  8381. if (*inOutIdx > totalSz) {
  8382. WOLFSSL_ERROR(BUFFER_E);
  8383. return BUFFER_E;
  8384. }
  8385. *type = input[idx++];
  8386. c24to32(input + idx, size);
  8387. idx += OPAQUE24_LEN;
  8388. ato16(input + idx, &ssl->keys.dtls_peer_handshake_number);
  8389. idx += DTLS_HANDSHAKE_SEQ_SZ;
  8390. c24to32(input + idx, fragOffset);
  8391. idx += DTLS_HANDSHAKE_FRAG_SZ;
  8392. c24to32(input + idx, fragSz);
  8393. if (ssl->curRL.pvMajor != ssl->version.major ||
  8394. ssl->curRL.pvMinor != ssl->version.minor) {
  8395. if (*type != client_hello && *type != hello_verify_request) {
  8396. WOLFSSL_ERROR(VERSION_ERROR);
  8397. return VERSION_ERROR;
  8398. }
  8399. else {
  8400. WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version");
  8401. }
  8402. }
  8403. return 0;
  8404. }
  8405. #endif
  8406. #if !defined(NO_OLD_TLS) || \
  8407. (defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLS_SHA1))
  8408. /* fill with MD5 pad size since biggest required */
  8409. static const byte PAD1[PAD_MD5] =
  8410. { 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  8411. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  8412. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  8413. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  8414. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
  8415. 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
  8416. };
  8417. static const byte PAD2[PAD_MD5] =
  8418. { 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  8419. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  8420. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  8421. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  8422. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
  8423. 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c
  8424. };
  8425. #endif /* !NO_OLD_TLS || (NO_OLD_TLS && WOLFSSL_ALLOW_TLS_SHA1) */
  8426. #ifndef NO_OLD_TLS
  8427. /* calculate MD5 hash for finished */
  8428. #ifdef WOLFSSL_TI_HASH
  8429. #include <wolfssl/wolfcrypt/hash.h>
  8430. #endif
  8431. static int BuildMD5(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  8432. {
  8433. int ret;
  8434. byte md5_result[WC_MD5_DIGEST_SIZE];
  8435. #ifdef WOLFSSL_SMALL_STACK
  8436. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  8437. if (md5 == NULL)
  8438. return MEMORY_E;
  8439. #else
  8440. wc_Md5 md5[1];
  8441. #endif
  8442. /* make md5 inner */
  8443. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5);
  8444. if (ret == 0)
  8445. ret = wc_Md5Update(md5, sender, SIZEOF_SENDER);
  8446. if (ret == 0)
  8447. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  8448. if (ret == 0)
  8449. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  8450. if (ret == 0)
  8451. ret = wc_Md5Final(md5, md5_result);
  8452. /* make md5 outer */
  8453. if (ret == 0) {
  8454. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  8455. if (ret == 0) {
  8456. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  8457. if (ret == 0)
  8458. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  8459. if (ret == 0)
  8460. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  8461. if (ret == 0)
  8462. ret = wc_Md5Final(md5, hashes->md5);
  8463. wc_Md5Free(md5);
  8464. }
  8465. }
  8466. #ifdef WOLFSSL_SMALL_STACK
  8467. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  8468. #endif
  8469. return ret;
  8470. }
  8471. /* calculate SHA hash for finished */
  8472. static int BuildSHA(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  8473. {
  8474. int ret;
  8475. byte sha_result[WC_SHA_DIGEST_SIZE];
  8476. #ifdef WOLFSSL_SMALL_STACK
  8477. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  8478. if (sha == NULL)
  8479. return MEMORY_E;
  8480. #else
  8481. wc_Sha sha[1];
  8482. #endif
  8483. /* make sha inner */
  8484. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  8485. if (ret == 0)
  8486. ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER);
  8487. if (ret == 0)
  8488. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  8489. if (ret == 0)
  8490. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  8491. if (ret == 0)
  8492. ret = wc_ShaFinal(sha, sha_result);
  8493. /* make sha outer */
  8494. if (ret == 0) {
  8495. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  8496. if (ret == 0) {
  8497. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  8498. if (ret == 0)
  8499. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  8500. if (ret == 0)
  8501. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  8502. if (ret == 0)
  8503. ret = wc_ShaFinal(sha, hashes->sha);
  8504. wc_ShaFree(sha);
  8505. }
  8506. }
  8507. #ifdef WOLFSSL_SMALL_STACK
  8508. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  8509. #endif
  8510. return ret;
  8511. }
  8512. #endif
  8513. #ifndef WOLFSSL_NO_TLS12
  8514. /* Finished doesn't support SHA512, not SHA512 cipher suites yet */
  8515. static int BuildFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
  8516. {
  8517. int ret = 0;
  8518. if (ssl == NULL)
  8519. return BAD_FUNC_ARG;
  8520. #ifndef NO_TLS
  8521. if (ssl->options.tls) {
  8522. ret = BuildTlsFinished(ssl, hashes, sender);
  8523. }
  8524. #endif
  8525. #ifndef NO_OLD_TLS
  8526. if (!ssl->options.tls) {
  8527. ret = BuildMD5(ssl, hashes, sender);
  8528. if (ret == 0) {
  8529. ret = BuildSHA(ssl, hashes, sender);
  8530. }
  8531. }
  8532. #endif
  8533. return ret;
  8534. }
  8535. #endif /* WOLFSSL_NO_TLS12 */
  8536. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
  8537. /* cipher requirements */
  8538. enum {
  8539. REQUIRES_RSA,
  8540. REQUIRES_DHE,
  8541. REQUIRES_ECC,
  8542. REQUIRES_ECC_STATIC,
  8543. REQUIRES_PSK,
  8544. REQUIRES_RSA_SIG,
  8545. REQUIRES_AEAD
  8546. };
  8547. /* Does this cipher suite (first, second) have the requirement
  8548. an ephemeral key exchange will still require the key for signing
  8549. the key exchange so ECDHE_RSA requires an rsa key thus rsa_kea */
  8550. static int CipherRequires(byte first, byte second, int requirement)
  8551. {
  8552. (void)requirement;
  8553. #ifndef WOLFSSL_NO_TLS12
  8554. #ifdef HAVE_CHACHA
  8555. if (first == CHACHA_BYTE) {
  8556. switch (second) {
  8557. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  8558. if (requirement == REQUIRES_RSA)
  8559. return 1;
  8560. break;
  8561. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
  8562. if (requirement == REQUIRES_ECC)
  8563. return 1;
  8564. break;
  8565. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
  8566. if (requirement == REQUIRES_RSA)
  8567. return 1;
  8568. if (requirement == REQUIRES_DHE)
  8569. return 1;
  8570. break;
  8571. case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  8572. if (requirement == REQUIRES_RSA)
  8573. return 1;
  8574. break;
  8575. case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  8576. if (requirement == REQUIRES_ECC)
  8577. return 1;
  8578. break;
  8579. case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
  8580. if (requirement == REQUIRES_RSA)
  8581. return 1;
  8582. if (requirement == REQUIRES_DHE)
  8583. return 1;
  8584. break;
  8585. case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  8586. if (requirement == REQUIRES_PSK)
  8587. return 1;
  8588. break;
  8589. case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  8590. if (requirement == REQUIRES_PSK)
  8591. return 1;
  8592. break;
  8593. case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 :
  8594. if (requirement == REQUIRES_PSK)
  8595. return 1;
  8596. if (requirement == REQUIRES_DHE)
  8597. return 1;
  8598. break;
  8599. }
  8600. if (requirement == REQUIRES_AEAD)
  8601. return 1;
  8602. }
  8603. #endif /* HAVE_CHACHA */
  8604. /* ECC extensions */
  8605. if (first == ECC_BYTE) {
  8606. switch (second) {
  8607. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8608. #ifndef NO_RSA
  8609. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
  8610. if (requirement == REQUIRES_RSA)
  8611. return 1;
  8612. break;
  8613. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
  8614. if (requirement == REQUIRES_ECC_STATIC)
  8615. return 1;
  8616. if (requirement == REQUIRES_RSA_SIG)
  8617. return 1;
  8618. break;
  8619. #ifndef NO_DES3
  8620. case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
  8621. if (requirement == REQUIRES_RSA)
  8622. return 1;
  8623. break;
  8624. case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
  8625. if (requirement == REQUIRES_ECC_STATIC)
  8626. return 1;
  8627. if (requirement == REQUIRES_RSA_SIG)
  8628. return 1;
  8629. break;
  8630. #endif /* !NO_DES3 */
  8631. #ifndef NO_RC4
  8632. case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
  8633. if (requirement == REQUIRES_RSA)
  8634. return 1;
  8635. break;
  8636. case TLS_ECDH_RSA_WITH_RC4_128_SHA :
  8637. if (requirement == REQUIRES_ECC_STATIC)
  8638. return 1;
  8639. if (requirement == REQUIRES_RSA_SIG)
  8640. return 1;
  8641. break;
  8642. #endif /* !NO_RC4 */
  8643. #endif /* NO_RSA */
  8644. #ifndef NO_DES3
  8645. case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
  8646. if (requirement == REQUIRES_ECC)
  8647. return 1;
  8648. break;
  8649. case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
  8650. if (requirement == REQUIRES_ECC_STATIC)
  8651. return 1;
  8652. break;
  8653. #endif /* !NO_DES3 */
  8654. #ifndef NO_RC4
  8655. case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
  8656. if (requirement == REQUIRES_ECC)
  8657. return 1;
  8658. break;
  8659. case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
  8660. if (requirement == REQUIRES_ECC_STATIC)
  8661. return 1;
  8662. break;
  8663. #endif /* !NO_RC4 */
  8664. #ifndef NO_RSA
  8665. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
  8666. if (requirement == REQUIRES_RSA)
  8667. return 1;
  8668. break;
  8669. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
  8670. if (requirement == REQUIRES_ECC_STATIC)
  8671. return 1;
  8672. if (requirement == REQUIRES_RSA_SIG)
  8673. return 1;
  8674. break;
  8675. #endif /* !NO_RSA */
  8676. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
  8677. if (requirement == REQUIRES_ECC)
  8678. return 1;
  8679. break;
  8680. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
  8681. if (requirement == REQUIRES_ECC_STATIC)
  8682. return 1;
  8683. break;
  8684. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
  8685. if (requirement == REQUIRES_ECC)
  8686. return 1;
  8687. break;
  8688. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
  8689. if (requirement == REQUIRES_ECC_STATIC)
  8690. return 1;
  8691. break;
  8692. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
  8693. if (requirement == REQUIRES_ECC)
  8694. return 1;
  8695. if (requirement == REQUIRES_AEAD)
  8696. return 1;
  8697. break;
  8698. case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
  8699. if (requirement == REQUIRES_ECC)
  8700. return 1;
  8701. if (requirement == REQUIRES_AEAD)
  8702. return 1;
  8703. break;
  8704. case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
  8705. if (requirement == REQUIRES_ECC_STATIC)
  8706. return 1;
  8707. if (requirement == REQUIRES_AEAD)
  8708. return 1;
  8709. break;
  8710. case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
  8711. if (requirement == REQUIRES_ECC_STATIC)
  8712. return 1;
  8713. if (requirement == REQUIRES_AEAD)
  8714. return 1;
  8715. break;
  8716. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8717. #ifndef NO_RSA
  8718. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8719. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
  8720. if (requirement == REQUIRES_RSA)
  8721. return 1;
  8722. if (requirement == REQUIRES_AEAD)
  8723. return 1;
  8724. break;
  8725. case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
  8726. if (requirement == REQUIRES_RSA)
  8727. return 1;
  8728. if (requirement == REQUIRES_AEAD)
  8729. return 1;
  8730. break;
  8731. case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
  8732. if (requirement == REQUIRES_ECC_STATIC)
  8733. return 1;
  8734. if (requirement == REQUIRES_RSA_SIG)
  8735. return 1;
  8736. if (requirement == REQUIRES_AEAD)
  8737. return 1;
  8738. break;
  8739. case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
  8740. if (requirement == REQUIRES_ECC_STATIC)
  8741. return 1;
  8742. if (requirement == REQUIRES_RSA_SIG)
  8743. return 1;
  8744. if (requirement == REQUIRES_AEAD)
  8745. return 1;
  8746. break;
  8747. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8748. #ifdef HAVE_AESCCM
  8749. case TLS_RSA_WITH_AES_128_CCM_8 :
  8750. case TLS_RSA_WITH_AES_256_CCM_8 :
  8751. if (requirement == REQUIRES_RSA)
  8752. return 1;
  8753. if (requirement == REQUIRES_RSA_SIG)
  8754. return 1;
  8755. if (requirement == REQUIRES_AEAD)
  8756. return 1;
  8757. break;
  8758. #endif /* HAVE_AESCCM */
  8759. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8760. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
  8761. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
  8762. if (requirement == REQUIRES_RSA)
  8763. return 1;
  8764. break;
  8765. case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
  8766. case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
  8767. if (requirement == REQUIRES_RSA_SIG)
  8768. return 1;
  8769. if (requirement == REQUIRES_ECC_STATIC)
  8770. return 1;
  8771. break;
  8772. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8773. #endif /* !NO_RSA */
  8774. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8775. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM :
  8776. case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
  8777. case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
  8778. if (requirement == REQUIRES_ECC)
  8779. return 1;
  8780. if (requirement == REQUIRES_AEAD)
  8781. return 1;
  8782. break;
  8783. case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
  8784. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
  8785. if (requirement == REQUIRES_ECC)
  8786. return 1;
  8787. break;
  8788. case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
  8789. case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
  8790. if (requirement == REQUIRES_ECC)
  8791. return 1;
  8792. if (requirement == REQUIRES_ECC_STATIC)
  8793. return 1;
  8794. break;
  8795. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8796. #ifndef NO_PSK
  8797. case TLS_PSK_WITH_AES_128_CCM:
  8798. case TLS_PSK_WITH_AES_256_CCM:
  8799. case TLS_PSK_WITH_AES_128_CCM_8:
  8800. case TLS_PSK_WITH_AES_256_CCM_8:
  8801. if (requirement == REQUIRES_PSK)
  8802. return 1;
  8803. if (requirement == REQUIRES_AEAD)
  8804. return 1;
  8805. break;
  8806. case TLS_DHE_PSK_WITH_AES_128_CCM:
  8807. case TLS_DHE_PSK_WITH_AES_256_CCM:
  8808. if (requirement == REQUIRES_PSK)
  8809. return 1;
  8810. if (requirement == REQUIRES_DHE)
  8811. return 1;
  8812. if (requirement == REQUIRES_AEAD)
  8813. return 1;
  8814. break;
  8815. #endif /* !NO_PSK */
  8816. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  8817. case TLS_ECDHE_ECDSA_WITH_NULL_SHA :
  8818. if (requirement == REQUIRES_ECC)
  8819. return 1;
  8820. break;
  8821. case TLS_ECDHE_PSK_WITH_NULL_SHA256 :
  8822. if (requirement == REQUIRES_PSK)
  8823. return 1;
  8824. break;
  8825. case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 :
  8826. if (requirement == REQUIRES_PSK)
  8827. return 1;
  8828. break;
  8829. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  8830. #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)
  8831. case TLS_SHA256_SHA256:
  8832. break;
  8833. case TLS_SHA384_SHA384:
  8834. break;
  8835. #endif
  8836. default:
  8837. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC");
  8838. return 0;
  8839. } /* switch */
  8840. } /* if */
  8841. #endif /* !WOLFSSL_NO_TLS12 */
  8842. /* Distinct TLS v1.3 cipher suites with cipher and digest only. */
  8843. if (first == TLS13_BYTE) {
  8844. switch (second) {
  8845. #ifdef WOLFSSL_TLS13
  8846. case TLS_AES_128_GCM_SHA256:
  8847. case TLS_AES_256_GCM_SHA384:
  8848. case TLS_CHACHA20_POLY1305_SHA256:
  8849. case TLS_AES_128_CCM_SHA256:
  8850. case TLS_AES_128_CCM_8_SHA256:
  8851. break;
  8852. #endif
  8853. default:
  8854. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires "
  8855. "TLS v1.3");
  8856. return 0;
  8857. }
  8858. }
  8859. #ifndef WOLFSSL_NO_TLS12
  8860. if (first != ECC_BYTE && first != CHACHA_BYTE &&
  8861. first != TLS13_BYTE) { /* normal suites */
  8862. switch (second) {
  8863. #ifndef NO_RSA
  8864. #ifndef NO_RC4
  8865. case SSL_RSA_WITH_RC4_128_SHA :
  8866. if (requirement == REQUIRES_RSA)
  8867. return 1;
  8868. break;
  8869. case SSL_RSA_WITH_RC4_128_MD5 :
  8870. if (requirement == REQUIRES_RSA)
  8871. return 1;
  8872. break;
  8873. #endif /* NO_RC4 */
  8874. case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
  8875. if (requirement == REQUIRES_RSA)
  8876. return 1;
  8877. break;
  8878. case TLS_RSA_WITH_AES_128_CBC_SHA :
  8879. if (requirement == REQUIRES_RSA)
  8880. return 1;
  8881. break;
  8882. case TLS_RSA_WITH_AES_128_CBC_SHA256 :
  8883. if (requirement == REQUIRES_RSA)
  8884. return 1;
  8885. break;
  8886. case TLS_RSA_WITH_AES_256_CBC_SHA :
  8887. if (requirement == REQUIRES_RSA)
  8888. return 1;
  8889. break;
  8890. case TLS_RSA_WITH_AES_256_CBC_SHA256 :
  8891. if (requirement == REQUIRES_RSA)
  8892. return 1;
  8893. break;
  8894. case TLS_RSA_WITH_NULL_MD5 :
  8895. case TLS_RSA_WITH_NULL_SHA :
  8896. case TLS_RSA_WITH_NULL_SHA256 :
  8897. if (requirement == REQUIRES_RSA)
  8898. return 1;
  8899. break;
  8900. #endif /* !NO_RSA */
  8901. #ifndef NO_PSK
  8902. case TLS_PSK_WITH_AES_128_GCM_SHA256 :
  8903. if (requirement == REQUIRES_PSK)
  8904. return 1;
  8905. if (requirement == REQUIRES_AEAD)
  8906. return 1;
  8907. break;
  8908. case TLS_PSK_WITH_AES_256_GCM_SHA384 :
  8909. if (requirement == REQUIRES_PSK)
  8910. return 1;
  8911. if (requirement == REQUIRES_AEAD)
  8912. return 1;
  8913. break;
  8914. case TLS_PSK_WITH_AES_128_CBC_SHA256 :
  8915. case TLS_PSK_WITH_AES_256_CBC_SHA384 :
  8916. case TLS_PSK_WITH_AES_128_CBC_SHA :
  8917. case TLS_PSK_WITH_AES_256_CBC_SHA :
  8918. case TLS_PSK_WITH_NULL_SHA384 :
  8919. case TLS_PSK_WITH_NULL_SHA256 :
  8920. case TLS_PSK_WITH_NULL_SHA :
  8921. if (requirement == REQUIRES_PSK)
  8922. return 1;
  8923. break;
  8924. case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
  8925. case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
  8926. if (requirement == REQUIRES_DHE)
  8927. return 1;
  8928. if (requirement == REQUIRES_PSK)
  8929. return 1;
  8930. if (requirement == REQUIRES_AEAD)
  8931. return 1;
  8932. break;
  8933. case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
  8934. case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
  8935. case TLS_DHE_PSK_WITH_NULL_SHA384 :
  8936. case TLS_DHE_PSK_WITH_NULL_SHA256 :
  8937. if (requirement == REQUIRES_DHE)
  8938. return 1;
  8939. if (requirement == REQUIRES_PSK)
  8940. return 1;
  8941. break;
  8942. #endif /* NO_PSK */
  8943. #ifndef NO_RSA
  8944. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
  8945. if (requirement == REQUIRES_RSA)
  8946. return 1;
  8947. if (requirement == REQUIRES_DHE)
  8948. return 1;
  8949. break;
  8950. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
  8951. if (requirement == REQUIRES_RSA)
  8952. return 1;
  8953. if (requirement == REQUIRES_DHE)
  8954. return 1;
  8955. break;
  8956. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
  8957. if (requirement == REQUIRES_RSA)
  8958. return 1;
  8959. if (requirement == REQUIRES_DHE)
  8960. return 1;
  8961. break;
  8962. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
  8963. if (requirement == REQUIRES_RSA)
  8964. return 1;
  8965. if (requirement == REQUIRES_DHE)
  8966. return 1;
  8967. break;
  8968. case TLS_RSA_WITH_AES_128_GCM_SHA256 :
  8969. case TLS_RSA_WITH_AES_256_GCM_SHA384 :
  8970. if (requirement == REQUIRES_RSA)
  8971. return 1;
  8972. if (requirement == REQUIRES_AEAD)
  8973. return 1;
  8974. break;
  8975. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
  8976. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
  8977. if (requirement == REQUIRES_RSA)
  8978. return 1;
  8979. if (requirement == REQUIRES_DHE)
  8980. return 1;
  8981. if (requirement == REQUIRES_AEAD)
  8982. return 1;
  8983. break;
  8984. #ifdef HAVE_CAMELLIA
  8985. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
  8986. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
  8987. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  8988. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  8989. if (requirement == REQUIRES_RSA)
  8990. return 1;
  8991. break;
  8992. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
  8993. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
  8994. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
  8995. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
  8996. if (requirement == REQUIRES_RSA)
  8997. return 1;
  8998. if (requirement == REQUIRES_RSA_SIG)
  8999. return 1;
  9000. if (requirement == REQUIRES_DHE)
  9001. return 1;
  9002. break;
  9003. #endif /* HAVE_CAMELLIA */
  9004. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  9005. if (requirement == REQUIRES_RSA)
  9006. return 1;
  9007. if (requirement == REQUIRES_RSA_SIG)
  9008. return 1;
  9009. if (requirement == REQUIRES_DHE)
  9010. return 1;
  9011. break;
  9012. #endif
  9013. #ifdef HAVE_ANON
  9014. case TLS_DH_anon_WITH_AES_128_CBC_SHA :
  9015. if (requirement == REQUIRES_DHE)
  9016. return 1;
  9017. break;
  9018. case TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  9019. if (requirement == REQUIRES_DHE)
  9020. return 1;
  9021. if (requirement == REQUIRES_AEAD)
  9022. return 1;
  9023. break;
  9024. #endif
  9025. #ifdef WOLFSSL_MULTICAST
  9026. case WDM_WITH_NULL_SHA256 :
  9027. break;
  9028. #endif
  9029. default:
  9030. WOLFSSL_MSG("Unsupported cipher suite, CipherRequires");
  9031. return 0;
  9032. } /* switch */
  9033. } /* if ECC / Normal suites else */
  9034. #endif /* !WOLFSSL_NO_TLS12 */
  9035. return 0;
  9036. }
  9037. #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */
  9038. #ifndef NO_CERTS
  9039. /* Match names with wildcards, each wildcard can represent a single name
  9040. component or fragment but not multiple names, i.e.,
  9041. *.z.com matches y.z.com but not x.y.z.com
  9042. return 1 on success */
  9043. int MatchDomainName(const char* pattern, int len, const char* str)
  9044. {
  9045. int ret = 0;
  9046. char p, s;
  9047. if (pattern == NULL || str == NULL || len <= 0)
  9048. return 0;
  9049. while (len > 0) {
  9050. p = (char)XTOLOWER((unsigned char)*pattern++);
  9051. if (p == '\0')
  9052. break;
  9053. if (p == '*') {
  9054. while (--len > 0 &&
  9055. (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') {
  9056. }
  9057. if (len == 0)
  9058. p = '\0';
  9059. while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') {
  9060. if (s == p)
  9061. break;
  9062. if (s == '.')
  9063. return 0;
  9064. str++;
  9065. }
  9066. }
  9067. else {
  9068. if (p != (char)XTOLOWER((unsigned char) *str))
  9069. return 0;
  9070. }
  9071. if (len > 0) {
  9072. str++;
  9073. len--;
  9074. }
  9075. }
  9076. if (*str == '\0' && len == 0) {
  9077. ret = 1; /* success */
  9078. }
  9079. return ret;
  9080. }
  9081. /* Check that alternative names, if they exists, match the domain.
  9082. * Fail if there are wild patterns and they didn't match.
  9083. * Check the common name if no alternative names matched.
  9084. *
  9085. * dCert Decoded cert to get the alternative names from.
  9086. * domain Domain name to compare against.
  9087. * checkCN Whether to check the common name.
  9088. * returns 1 : match was found.
  9089. * 0 : no match found.
  9090. * -1 : No matches and wild pattern match failed.
  9091. */
  9092. int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
  9093. {
  9094. int match = 0;
  9095. DNS_entry* altName = NULL;
  9096. char *buf;
  9097. word32 len;
  9098. WOLFSSL_MSG("Checking AltNames");
  9099. if (dCert)
  9100. altName = dCert->altNames;
  9101. if (checkCN != NULL) {
  9102. *checkCN = (altName == NULL) ? 1 : 0;
  9103. }
  9104. while (altName) {
  9105. WOLFSSL_MSG("\tindividual AltName check");
  9106. #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
  9107. if (altName->type == ASN_IP_TYPE) {
  9108. buf = altName->ipString;
  9109. len = (word32)XSTRLEN(buf);
  9110. }
  9111. else
  9112. #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
  9113. {
  9114. buf = altName->name;
  9115. len = altName->len;
  9116. }
  9117. if (MatchDomainName(buf, len, domain)) {
  9118. match = 1;
  9119. if (checkCN != NULL) {
  9120. *checkCN = 0;
  9121. }
  9122. WOLFSSL_MSG("\tmatch found");
  9123. break;
  9124. }
  9125. /* No matches and wild pattern match failed. */
  9126. else if (buf && (len >=1) && (buf[0] == '*')) {
  9127. match = -1;
  9128. WOLFSSL_MSG("\twildcard match failed");
  9129. }
  9130. altName = altName->next;
  9131. }
  9132. return match;
  9133. }
  9134. /* Check the domain name matches the subject alternative name or the subject
  9135. * name.
  9136. *
  9137. * dcert Decoded certificate.
  9138. * domainName The domain name.
  9139. * domainNameLen The length of the domain name.
  9140. * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
  9141. */
  9142. int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
  9143. {
  9144. int checkCN;
  9145. int ret = DOMAIN_NAME_MISMATCH;
  9146. /* Assume name is NUL terminated. */
  9147. (void)domainNameLen;
  9148. if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
  9149. WOLFSSL_MSG("DomainName match on alt names failed");
  9150. }
  9151. else {
  9152. ret = 0;
  9153. }
  9154. if (checkCN == 1) {
  9155. if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
  9156. domainName) == 1) {
  9157. ret = 0;
  9158. }
  9159. else {
  9160. WOLFSSL_MSG("DomainName match on common name failed");
  9161. }
  9162. }
  9163. return ret;
  9164. }
  9165. int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
  9166. {
  9167. WOLFSSL_MSG("Checking IPAddr");
  9168. return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
  9169. }
  9170. #ifdef SESSION_CERTS
  9171. static void AddSessionCertToChain(WOLFSSL_X509_CHAIN* chain,
  9172. byte* certBuf, word32 certSz)
  9173. {
  9174. if (chain->count < MAX_CHAIN_DEPTH &&
  9175. certSz < MAX_X509_SIZE) {
  9176. chain->certs[chain->count].length = certSz;
  9177. XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz);
  9178. chain->count++;
  9179. }
  9180. else {
  9181. WOLFSSL_MSG("Couldn't store chain cert for session");
  9182. }
  9183. }
  9184. #endif
  9185. #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \
  9186. defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9187. static void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType)
  9188. {
  9189. if (nameType == SUBJECT) {
  9190. XSTRNCPY(name->name, dCert->subject, ASN_NAME_MAX);
  9191. name->name[ASN_NAME_MAX - 1] = '\0';
  9192. name->sz = (int)XSTRLEN(name->name) + 1;
  9193. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  9194. name->rawLen = min(dCert->subjectRawLen, ASN_NAME_MAX);
  9195. XMEMCPY(name->raw, dCert->subjectRaw, name->rawLen);
  9196. #endif
  9197. }
  9198. else {
  9199. XSTRNCPY(name->name, dCert->issuer, ASN_NAME_MAX);
  9200. name->name[ASN_NAME_MAX - 1] = '\0';
  9201. name->sz = (int)XSTRLEN(name->name) + 1;
  9202. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)) \
  9203. && (defined(HAVE_PKCS7) || defined(WOLFSSL_CERT_EXT))
  9204. name->rawLen = min(dCert->issuerRawLen, ASN_NAME_MAX);
  9205. if (name->rawLen) {
  9206. XMEMCPY(name->raw, dCert->issuerRaw, name->rawLen);
  9207. }
  9208. #endif
  9209. }
  9210. }
  9211. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  9212. !defined(IGNORE_NAME_CONSTRAINTS)
  9213. /* copies over additional alt names such as dirName
  9214. * returns 0 on success
  9215. */
  9216. static int CopyAdditionalAltNames(DNS_entry** to, DNS_entry* from, int type,
  9217. void* heap)
  9218. {
  9219. DNS_entry* cur = from;
  9220. if (to == NULL) {
  9221. return BAD_FUNC_ARG;
  9222. }
  9223. while (cur != NULL) {
  9224. if (cur->type == type) {
  9225. DNS_entry* dnsEntry;
  9226. int strLen = cur->len;
  9227. dnsEntry = AltNameNew(heap);
  9228. if (dnsEntry == NULL) {
  9229. WOLFSSL_MSG("\tOut of Memory");
  9230. return MEMORY_E;
  9231. }
  9232. dnsEntry->type = type;
  9233. dnsEntry->name = (char*)XMALLOC(strLen + 1, heap,
  9234. DYNAMIC_TYPE_ALTNAME);
  9235. if (dnsEntry->name == NULL) {
  9236. WOLFSSL_MSG("\tOut of Memory");
  9237. XFREE(dnsEntry, heap, DYNAMIC_TYPE_ALTNAME);
  9238. return MEMORY_E;
  9239. }
  9240. dnsEntry->len = strLen;
  9241. XMEMCPY(dnsEntry->name, cur->name, strLen);
  9242. dnsEntry->name[strLen] = '\0';
  9243. dnsEntry->next = *to;
  9244. *to = dnsEntry;
  9245. }
  9246. cur = cur->next;
  9247. }
  9248. return 0;
  9249. }
  9250. #endif /* OPENSSL_EXTRA */
  9251. #ifdef WOLFSSL_CERT_REQ
  9252. static int CopyREQAttributes(WOLFSSL_X509* x509, DecodedCert* dCert)
  9253. {
  9254. int ret = 0;
  9255. if (dCert->cPwd) {
  9256. if (dCert->cPwdLen < CTC_NAME_SIZE) {
  9257. XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
  9258. x509->challengePw[dCert->cPwdLen] = '\0';
  9259. #ifdef OPENSSL_ALL
  9260. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9261. NID_pkcs9_challengePassword,
  9262. MBSTRING_ASC,
  9263. (const byte*)dCert->cPwd,
  9264. dCert->cPwdLen) != WOLFSSL_SUCCESS) {
  9265. ret = REQ_ATTRIBUTE_E;
  9266. }
  9267. #endif
  9268. }
  9269. else {
  9270. WOLFSSL_MSG("Challenge password too long");
  9271. ret = MEMORY_E;
  9272. }
  9273. }
  9274. if (dCert->contentType) {
  9275. if (dCert->contentTypeLen < CTC_NAME_SIZE) {
  9276. XMEMCPY(x509->contentType, dCert->contentType, dCert->contentTypeLen);
  9277. x509->contentType[dCert->contentTypeLen] = '\0';
  9278. }
  9279. #ifdef OPENSSL_ALL
  9280. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9281. NID_pkcs9_contentType,
  9282. MBSTRING_ASC,
  9283. (const byte*)dCert->contentType,
  9284. dCert->contentTypeLen) !=
  9285. WOLFSSL_SUCCESS) {
  9286. ret = REQ_ATTRIBUTE_E;
  9287. }
  9288. #endif
  9289. }
  9290. #ifdef OPENSSL_ALL
  9291. if (dCert->sNum) {
  9292. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9293. NID_serialNumber,
  9294. MBSTRING_ASC,
  9295. (const byte*)dCert->sNum,
  9296. dCert->sNumLen) != WOLFSSL_SUCCESS) {
  9297. ret = REQ_ATTRIBUTE_E;
  9298. }
  9299. }
  9300. if (dCert->unstructuredName) {
  9301. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9302. NID_pkcs9_unstructuredName,
  9303. MBSTRING_ASC,
  9304. (const byte*)dCert->unstructuredName,
  9305. dCert->unstructuredNameLen)
  9306. != WOLFSSL_SUCCESS) {
  9307. ret = REQ_ATTRIBUTE_E;
  9308. }
  9309. }
  9310. if (dCert->surname) {
  9311. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9312. NID_surname,
  9313. MBSTRING_ASC,
  9314. (const byte*)dCert->surname,
  9315. dCert->surnameLen) != WOLFSSL_SUCCESS) {
  9316. ret = REQ_ATTRIBUTE_E;
  9317. }
  9318. }
  9319. if (dCert->givenName) {
  9320. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9321. NID_givenName,
  9322. MBSTRING_ASC,
  9323. (const byte*)dCert->givenName,
  9324. dCert->givenNameLen) != WOLFSSL_SUCCESS) {
  9325. ret = REQ_ATTRIBUTE_E;
  9326. }
  9327. }
  9328. if (dCert->dnQualifier) {
  9329. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9330. NID_dnQualifier,
  9331. MBSTRING_ASC,
  9332. (const byte*)dCert->dnQualifier,
  9333. dCert->dnQualifierLen) != WOLFSSL_SUCCESS) {
  9334. ret = REQ_ATTRIBUTE_E;
  9335. }
  9336. }
  9337. if (dCert->initials) {
  9338. if (wolfSSL_X509_REQ_add1_attr_by_NID(x509,
  9339. NID_initials,
  9340. MBSTRING_ASC,
  9341. (const byte*)dCert->initials,
  9342. dCert->initialsLen) != WOLFSSL_SUCCESS) {
  9343. ret = REQ_ATTRIBUTE_E;
  9344. }
  9345. }
  9346. #endif /* OPENSSL_ALL */
  9347. return ret;
  9348. }
  9349. #endif /* WOLFSSL_CERT_REQ */
  9350. /* Copy parts X509 needs from Decoded cert, 0 on success */
  9351. /* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the
  9352. * altNames pointers could be free'd by second x509 still active by first */
  9353. int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert)
  9354. {
  9355. int ret = 0;
  9356. if (x509 == NULL || dCert == NULL ||
  9357. dCert->subjectCNLen < 0)
  9358. return BAD_FUNC_ARG;
  9359. if (x509->issuer.name == NULL || x509->subject.name == NULL) {
  9360. WOLFSSL_MSG("Either init was not called on X509 or programming error");
  9361. return BAD_FUNC_ARG;
  9362. }
  9363. x509->version = dCert->version + 1;
  9364. CopyDecodedName(&x509->issuer, dCert, ISSUER);
  9365. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9366. if (dCert->issuerName != NULL) {
  9367. wolfSSL_X509_set_issuer_name(x509,
  9368. (WOLFSSL_X509_NAME*)dCert->issuerName);
  9369. x509->issuer.x509 = x509;
  9370. }
  9371. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  9372. CopyDecodedName(&x509->subject, dCert, SUBJECT);
  9373. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9374. if (dCert->subjectName != NULL) {
  9375. wolfSSL_X509_set_subject_name(x509,
  9376. (WOLFSSL_X509_NAME*)dCert->subjectName);
  9377. x509->subject.x509 = x509;
  9378. }
  9379. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  9380. XMEMCPY(x509->serial, dCert->serial, EXTERNAL_SERIAL_SIZE);
  9381. x509->serialSz = dCert->serialSz;
  9382. if (dCert->subjectCN && dCert->subjectCNLen < ASN_NAME_MAX) {
  9383. XMEMCPY(x509->subjectCN, dCert->subjectCN, dCert->subjectCNLen);
  9384. x509->subjectCN[dCert->subjectCNLen] = '\0';
  9385. }
  9386. else
  9387. x509->subjectCN[0] = '\0';
  9388. #ifdef WOLFSSL_CERT_REQ
  9389. x509->isCSR = dCert->isCSR;
  9390. /* CSR attributes */
  9391. if (x509->isCSR) {
  9392. ret = CopyREQAttributes(x509, dCert);
  9393. }
  9394. #endif /* WOLFSSL_CERT_REQ */
  9395. #ifdef WOLFSSL_SEP
  9396. {
  9397. int minSz = min(dCert->deviceTypeSz, EXTERNAL_SERIAL_SIZE);
  9398. if (minSz > 0) {
  9399. x509->deviceTypeSz = minSz;
  9400. XMEMCPY(x509->deviceType, dCert->deviceType, minSz);
  9401. }
  9402. else
  9403. x509->deviceTypeSz = 0;
  9404. minSz = min(dCert->hwTypeSz, EXTERNAL_SERIAL_SIZE);
  9405. if (minSz > 0) {
  9406. x509->hwTypeSz = minSz;
  9407. XMEMCPY(x509->hwType, dCert->hwType, minSz);
  9408. }
  9409. else
  9410. x509->hwTypeSz = 0;
  9411. minSz = min(dCert->hwSerialNumSz, EXTERNAL_SERIAL_SIZE);
  9412. if (minSz > 0) {
  9413. x509->hwSerialNumSz = minSz;
  9414. XMEMCPY(x509->hwSerialNum, dCert->hwSerialNum, minSz);
  9415. }
  9416. else
  9417. x509->hwSerialNumSz = 0;
  9418. }
  9419. #endif /* WOLFSSL_SEP */
  9420. {
  9421. int minSz;
  9422. if (dCert->beforeDateLen > 0) {
  9423. minSz = min(dCert->beforeDate[1], MAX_DATE_SZ);
  9424. x509->notBefore.type = dCert->beforeDate[0];
  9425. x509->notBefore.length = minSz;
  9426. XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz);
  9427. }
  9428. else
  9429. x509->notBefore.length = 0;
  9430. if (dCert->afterDateLen > 0) {
  9431. minSz = min(dCert->afterDate[1], MAX_DATE_SZ);
  9432. x509->notAfter.type = dCert->afterDate[0];
  9433. x509->notAfter.length = minSz;
  9434. XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz);
  9435. }
  9436. else
  9437. x509->notAfter.length = 0;
  9438. }
  9439. if (dCert->publicKey != NULL && dCert->pubKeySize != 0) {
  9440. x509->pubKey.buffer = (byte*)XMALLOC(
  9441. dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  9442. if (x509->pubKey.buffer != NULL) {
  9443. x509->pubKeyOID = dCert->keyOID;
  9444. x509->pubKey.length = dCert->pubKeySize;
  9445. XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize);
  9446. }
  9447. else
  9448. ret = MEMORY_E;
  9449. #if defined(OPENSSL_ALL)
  9450. if (ret == 0) {
  9451. x509->key.pubKeyOID = dCert->keyOID;
  9452. if (!x509->key.algor) {
  9453. x509->key.algor = wolfSSL_X509_ALGOR_new();
  9454. } else {
  9455. wolfSSL_ASN1_OBJECT_free(x509->key.algor->algorithm);
  9456. }
  9457. if (!x509->key.algor) {
  9458. ret = MEMORY_E;
  9459. } else {
  9460. if (!(x509->key.algor->algorithm =
  9461. wolfSSL_OBJ_nid2obj(oid2nid(dCert->keyOID, oidKeyType)))) {
  9462. ret = PUBLIC_KEY_E;
  9463. }
  9464. }
  9465. wolfSSL_EVP_PKEY_free(x509->key.pkey);
  9466. if (!(x509->key.pkey = wolfSSL_d2i_PUBKEY(NULL,
  9467. &dCert->publicKey,
  9468. dCert->pubKeySize))) {
  9469. ret = PUBLIC_KEY_E;
  9470. }
  9471. }
  9472. #endif
  9473. }
  9474. if (dCert->signature != NULL && dCert->sigLength != 0 &&
  9475. dCert->sigLength <= MAX_ENCODED_SIG_SZ) {
  9476. x509->sig.buffer = (byte*)XMALLOC(
  9477. dCert->sigLength, x509->heap, DYNAMIC_TYPE_SIGNATURE);
  9478. if (x509->sig.buffer == NULL) {
  9479. ret = MEMORY_E;
  9480. }
  9481. else {
  9482. XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength);
  9483. x509->sig.length = dCert->sigLength;
  9484. x509->sigOID = dCert->signatureOID;
  9485. }
  9486. #if defined(OPENSSL_ALL)
  9487. wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm);
  9488. if (!(x509->algor.algorithm =
  9489. wolfSSL_OBJ_nid2obj(oid2nid(dCert->signatureOID, oidSigType)))) {
  9490. ret = PUBLIC_KEY_E;
  9491. }
  9492. #endif
  9493. }
  9494. /* if der contains original source buffer then store for potential
  9495. * retrieval */
  9496. if (dCert->source != NULL && dCert->maxIdx > 0) {
  9497. if (AllocDer(&x509->derCert, dCert->maxIdx, CERT_TYPE, x509->heap)
  9498. == 0) {
  9499. XMEMCPY(x509->derCert->buffer, dCert->source, dCert->maxIdx);
  9500. }
  9501. else {
  9502. ret = MEMORY_E;
  9503. }
  9504. }
  9505. x509->altNames = dCert->altNames;
  9506. dCert->weOwnAltNames = 0;
  9507. x509->altNamesNext = x509->altNames; /* index hint */
  9508. #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
  9509. !defined(IGNORE_NAME_CONSTRAINTS)
  9510. /* add copies of email names from dCert to X509 */
  9511. if (CopyAdditionalAltNames(&x509->altNames, dCert->altEmailNames,
  9512. ASN_RFC822_TYPE, x509->heap) != 0) {
  9513. return MEMORY_E;
  9514. }
  9515. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  9516. #if defined(OPENSSL_EXTRA) && !defined(IGNORE_NAME_CONSTRAINTS)
  9517. /* add copies of alternate directory names from dCert to X509 */
  9518. if (CopyAdditionalAltNames(&x509->altNames, dCert->altDirNames,
  9519. ASN_DIR_TYPE, x509->heap) != 0) {
  9520. return MEMORY_E;
  9521. }
  9522. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  9523. x509->isCa = dCert->isCA;
  9524. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9525. x509->pathLength = dCert->pathLength;
  9526. x509->keyUsage = dCert->extKeyUsage;
  9527. x509->CRLdistSet = dCert->extCRLdistSet;
  9528. x509->CRLdistCrit = dCert->extCRLdistCrit;
  9529. if (dCert->extCrlInfoRaw != NULL && dCert->extCrlInfoRawSz > 0) {
  9530. x509->rawCRLInfo = (byte*)XMALLOC(dCert->extCrlInfoRawSz, x509->heap,
  9531. DYNAMIC_TYPE_X509_EXT);
  9532. if (x509->rawCRLInfo != NULL) {
  9533. XMEMCPY(x509->rawCRLInfo, dCert->extCrlInfoRaw, dCert->extCrlInfoRawSz);
  9534. x509->rawCRLInfoSz = dCert->extCrlInfoRawSz;
  9535. }
  9536. else {
  9537. ret = MEMORY_E;
  9538. }
  9539. }
  9540. if (dCert->extCrlInfo != NULL && dCert->extCrlInfoSz > 0) {
  9541. x509->CRLInfo = (byte*)XMALLOC(dCert->extCrlInfoSz, x509->heap,
  9542. DYNAMIC_TYPE_X509_EXT);
  9543. if (x509->CRLInfo != NULL) {
  9544. XMEMCPY(x509->CRLInfo, dCert->extCrlInfo, dCert->extCrlInfoSz);
  9545. x509->CRLInfoSz = dCert->extCrlInfoSz;
  9546. }
  9547. else {
  9548. ret = MEMORY_E;
  9549. }
  9550. }
  9551. x509->authInfoSet = dCert->extAuthInfoSet;
  9552. x509->authInfoCrit = dCert->extAuthInfoCrit;
  9553. if (dCert->extAuthInfo != NULL && dCert->extAuthInfoSz > 0) {
  9554. x509->authInfo = (byte*)XMALLOC(dCert->extAuthInfoSz, x509->heap,
  9555. DYNAMIC_TYPE_X509_EXT);
  9556. if (x509->authInfo != NULL) {
  9557. XMEMCPY(x509->authInfo, dCert->extAuthInfo, dCert->extAuthInfoSz);
  9558. x509->authInfoSz = dCert->extAuthInfoSz;
  9559. }
  9560. else {
  9561. ret = MEMORY_E;
  9562. }
  9563. }
  9564. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  9565. if (dCert->extAuthInfoCaIssuer != NULL && dCert->extAuthInfoCaIssuerSz > 0) {
  9566. x509->authInfoCaIssuer = (byte*)XMALLOC(dCert->extAuthInfoCaIssuerSz, x509->heap,
  9567. DYNAMIC_TYPE_X509_EXT);
  9568. if (x509->authInfoCaIssuer != NULL) {
  9569. XMEMCPY(x509->authInfoCaIssuer, dCert->extAuthInfoCaIssuer, dCert->extAuthInfoCaIssuerSz);
  9570. x509->authInfoCaIssuerSz = dCert->extAuthInfoCaIssuerSz;
  9571. }
  9572. else {
  9573. ret = MEMORY_E;
  9574. }
  9575. }
  9576. #endif
  9577. x509->basicConstSet = dCert->extBasicConstSet;
  9578. x509->basicConstCrit = dCert->extBasicConstCrit;
  9579. x509->basicConstPlSet = dCert->pathLengthSet;
  9580. x509->subjAltNameSet = dCert->extSubjAltNameSet;
  9581. x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
  9582. x509->authKeyIdSet = dCert->extAuthKeyIdSet;
  9583. x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
  9584. if (dCert->extAuthKeyIdSrc != NULL && dCert->extAuthKeyIdSz != 0) {
  9585. #ifdef WOLFSSL_AKID_NAME
  9586. if (dCert->extRawAuthKeyIdSrc != NULL &&
  9587. dCert->extAuthKeyIdSrc > dCert->extRawAuthKeyIdSrc &&
  9588. dCert->extAuthKeyIdSrc <
  9589. (dCert->extRawAuthKeyIdSrc + dCert->extRawAuthKeyIdSz)) {
  9590. /* Confirmed: extAuthKeyIdSrc points inside extRawAuthKeyIdSrc */
  9591. x509->authKeyIdSrc = (byte*)XMALLOC(dCert->extRawAuthKeyIdSz,
  9592. x509->heap, DYNAMIC_TYPE_X509_EXT);
  9593. if (x509->authKeyIdSrc != NULL) {
  9594. XMEMCPY(x509->authKeyIdSrc, dCert->extRawAuthKeyIdSrc,
  9595. dCert->extRawAuthKeyIdSz);
  9596. x509->authKeyIdSrcSz = dCert->extRawAuthKeyIdSz;
  9597. /* Set authKeyId to same offset inside authKeyIdSrc */
  9598. x509->authKeyId = x509->authKeyIdSrc +
  9599. (dCert->extAuthKeyIdSrc - dCert->extRawAuthKeyIdSrc);
  9600. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  9601. }
  9602. else
  9603. ret = MEMORY_E;
  9604. }
  9605. #else
  9606. x509->authKeyId = (byte*)XMALLOC(dCert->extAuthKeyIdSz, x509->heap,
  9607. DYNAMIC_TYPE_X509_EXT);
  9608. if (x509->authKeyId != NULL) {
  9609. XMEMCPY(x509->authKeyId,
  9610. dCert->extAuthKeyIdSrc, dCert->extAuthKeyIdSz);
  9611. x509->authKeyIdSz = dCert->extAuthKeyIdSz;
  9612. }
  9613. #endif
  9614. else
  9615. ret = MEMORY_E;
  9616. }
  9617. x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
  9618. x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
  9619. if (dCert->extSubjKeyIdSrc != NULL && dCert->extSubjKeyIdSz != 0) {
  9620. x509->subjKeyId = (byte*)XMALLOC(dCert->extSubjKeyIdSz, x509->heap,
  9621. DYNAMIC_TYPE_X509_EXT);
  9622. if (x509->subjKeyId != NULL) {
  9623. XMEMCPY(x509->subjKeyId,
  9624. dCert->extSubjKeyIdSrc, dCert->extSubjKeyIdSz);
  9625. x509->subjKeyIdSz = dCert->extSubjKeyIdSz;
  9626. }
  9627. else
  9628. ret = MEMORY_E;
  9629. }
  9630. x509->keyUsageSet = dCert->extKeyUsageSet;
  9631. x509->keyUsageCrit = dCert->extKeyUsageCrit;
  9632. if (dCert->extExtKeyUsageSrc != NULL && dCert->extExtKeyUsageSz > 0) {
  9633. x509->extKeyUsageSrc = (byte*)XMALLOC(dCert->extExtKeyUsageSz,
  9634. x509->heap, DYNAMIC_TYPE_X509_EXT);
  9635. if (x509->extKeyUsageSrc != NULL) {
  9636. XMEMCPY(x509->extKeyUsageSrc, dCert->extExtKeyUsageSrc,
  9637. dCert->extExtKeyUsageSz);
  9638. x509->extKeyUsage = dCert->extExtKeyUsage;
  9639. x509->extKeyUsageSz = dCert->extExtKeyUsageSz;
  9640. x509->extKeyUsageCrit = dCert->extExtKeyUsageCrit;
  9641. x509->extKeyUsageCount = dCert->extExtKeyUsageCount;
  9642. }
  9643. else {
  9644. ret = MEMORY_E;
  9645. }
  9646. }
  9647. #ifndef IGNORE_NETSCAPE_CERT_TYPE
  9648. x509->nsCertType = dCert->nsCertType;
  9649. #endif
  9650. #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT)
  9651. x509->certPolicySet = dCert->extCertPolicySet;
  9652. x509->certPolicyCrit = dCert->extCertPolicyCrit;
  9653. #endif /* WOLFSSL_SEP || WOLFSSL_QT */
  9654. #ifdef WOLFSSL_CERT_EXT
  9655. {
  9656. int i;
  9657. for (i = 0; i < dCert->extCertPoliciesNb && i < MAX_CERTPOL_NB; i++)
  9658. XMEMCPY(x509->certPolicies[i], dCert->extCertPolicies[i],
  9659. MAX_CERTPOL_SZ);
  9660. x509->certPoliciesNb = dCert->extCertPoliciesNb;
  9661. }
  9662. #endif /* WOLFSSL_CERT_EXT */
  9663. #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
  9664. #ifdef OPENSSL_ALL
  9665. if (dCert->extSubjAltNameSrc != NULL && dCert->extSubjAltNameSz != 0) {
  9666. x509->subjAltNameSrc = (byte*)XMALLOC(dCert->extSubjAltNameSz, x509->heap,
  9667. DYNAMIC_TYPE_X509_EXT);
  9668. if (x509->subjAltNameSrc != NULL) {
  9669. XMEMCPY(x509->subjAltNameSrc,
  9670. dCert->extSubjAltNameSrc, dCert->extSubjAltNameSz);
  9671. x509->subjAltNameSz = dCert->extSubjAltNameSz;
  9672. }
  9673. else
  9674. ret = MEMORY_E;
  9675. }
  9676. #endif
  9677. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  9678. x509->pkCurveOID = dCert->pkCurveOID;
  9679. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  9680. return ret;
  9681. }
  9682. #endif /* KEEP_PEER_CERT || SESSION_CERTS */
  9683. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  9684. (defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && !defined(WOLFSSL_NO_TLS12))
  9685. static int ProcessCSR(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  9686. word32 status_length)
  9687. {
  9688. int ret = 0;
  9689. OcspRequest* request;
  9690. #ifdef WOLFSSL_SMALL_STACK
  9691. CertStatus* status;
  9692. OcspEntry* single;
  9693. OcspResponse* response;
  9694. #else
  9695. CertStatus status[1];
  9696. OcspEntry single[1];
  9697. OcspResponse response[1];
  9698. #endif
  9699. WOLFSSL_ENTER("ProcessCSR");
  9700. do {
  9701. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  9702. if (ssl->status_request) {
  9703. request = (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
  9704. ssl->status_request = 0;
  9705. break;
  9706. }
  9707. #endif
  9708. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  9709. if (ssl->status_request_v2) {
  9710. request = (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
  9711. WOLFSSL_CSR2_OCSP, 0);
  9712. ssl->status_request_v2 = 0;
  9713. break;
  9714. }
  9715. #endif
  9716. return BUFFER_ERROR;
  9717. } while(0);
  9718. if (request == NULL)
  9719. return BAD_CERTIFICATE_STATUS_ERROR; /* not expected */
  9720. #ifdef WOLFSSL_SMALL_STACK
  9721. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  9722. DYNAMIC_TYPE_OCSP_STATUS);
  9723. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  9724. DYNAMIC_TYPE_OCSP_ENTRY);
  9725. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  9726. DYNAMIC_TYPE_OCSP_REQUEST);
  9727. if (status == NULL || single == NULL || response == NULL) {
  9728. if (status)
  9729. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  9730. if (single)
  9731. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  9732. if (response)
  9733. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  9734. return MEMORY_ERROR;
  9735. }
  9736. #endif
  9737. InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
  9738. if (OcspResponseDecode(response, SSL_CM(ssl), ssl->heap, 0) != 0)
  9739. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9740. else if (CompareOcspReqResp(request, response) != 0)
  9741. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9742. else if (response->responseStatus != OCSP_SUCCESSFUL)
  9743. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9744. else if (response->single->status->status == CERT_REVOKED)
  9745. ret = OCSP_CERT_REVOKED;
  9746. else if (response->single->status->status != CERT_GOOD)
  9747. ret = BAD_CERTIFICATE_STATUS_ERROR;
  9748. else {
  9749. XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
  9750. ssl->ocspProducedDateFormat = response->producedDateFormat;
  9751. }
  9752. *inOutIdx += status_length;
  9753. #ifdef WOLFSSL_SMALL_STACK
  9754. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  9755. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  9756. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  9757. #endif
  9758. WOLFSSL_LEAVE("ProcessCSR", ret);
  9759. return ret;
  9760. }
  9761. #endif
  9762. #ifdef HAVE_PK_CALLBACKS
  9763. #ifdef HAVE_ECC
  9764. static int SigPkCbEccVerify(const unsigned char* sig, unsigned int sigSz,
  9765. const unsigned char* hash, unsigned int hashSz,
  9766. const unsigned char* keyDer, unsigned int keySz,
  9767. int* result, void* ctx)
  9768. {
  9769. int ret = NOT_COMPILED_IN;
  9770. WOLFSSL* ssl = (WOLFSSL*)ctx;
  9771. if (ssl && ssl->ctx->EccVerifyCb) {
  9772. ret = ssl->ctx->EccVerifyCb(ssl, sig, sigSz, hash, hashSz,
  9773. keyDer, keySz, result, ssl->EccVerifyCtx);
  9774. }
  9775. return ret;
  9776. }
  9777. #endif
  9778. #ifndef NO_RSA
  9779. static int SigPkCbRsaVerify(unsigned char* sig, unsigned int sigSz,
  9780. unsigned char** out, const unsigned char* keyDer, unsigned int keySz,
  9781. void* ctx)
  9782. {
  9783. int ret = NOT_COMPILED_IN;
  9784. WOLFSSL* ssl = (WOLFSSL*)ctx;
  9785. if (ssl && ssl->ctx->RsaVerifyCb) {
  9786. ret = ssl->ctx->RsaVerifyCb(ssl, sig, sigSz, out, keyDer, keySz,
  9787. ssl->RsaVerifyCtx);
  9788. }
  9789. return ret;
  9790. }
  9791. #endif
  9792. int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx)
  9793. {
  9794. if (ssl == NULL || sigCtx == NULL)
  9795. return BAD_FUNC_ARG;
  9796. /* only setup the verify callback if a PK is set */
  9797. #ifdef HAVE_ECC
  9798. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  9799. sigCtx->pkCbEcc = Renesas_cmn_SigPkCbEccVerify;
  9800. sigCtx->pkCtxEcc = (void*)&sigCtx->CertAtt;
  9801. (void)SigPkCbEccVerify;
  9802. #else
  9803. if (ssl->ctx->EccVerifyCb) {
  9804. sigCtx->pkCbEcc = SigPkCbEccVerify;
  9805. sigCtx->pkCtxEcc = ssl;
  9806. }
  9807. #endif
  9808. #endif
  9809. #ifndef NO_RSA
  9810. /* only setup the verify callback if a PK is set */
  9811. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS)
  9812. sigCtx->pkCbRsa = Renesas_cmn_SigPkCbRsaVerify;
  9813. sigCtx->pkCtxRsa = (void*)&sigCtx->CertAtt;
  9814. (void)SigPkCbRsaVerify;
  9815. #else
  9816. if (ssl->ctx->RsaVerifyCb) {
  9817. sigCtx->pkCbRsa = SigPkCbRsaVerify;
  9818. sigCtx->pkCtxRsa = ssl;
  9819. }
  9820. #endif
  9821. #endif
  9822. return 0;
  9823. }
  9824. #endif /* HAVE_PK_CALLBACKS */
  9825. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  9826. void DoCertFatalAlert(WOLFSSL* ssl, int ret)
  9827. {
  9828. int alertWhy;
  9829. if (ssl == NULL || ret == 0) {
  9830. return;
  9831. }
  9832. WOLFSSL_ERROR(ret);
  9833. /* Determine alert reason */
  9834. alertWhy = bad_certificate;
  9835. if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
  9836. alertWhy = certificate_expired;
  9837. } else if (ret == ASN_NO_SIGNER_E) {
  9838. alertWhy = unknown_ca;
  9839. }
  9840. #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD))
  9841. else if (ret == CRL_CERT_REVOKED) {
  9842. alertWhy = certificate_revoked;
  9843. }
  9844. #endif
  9845. else if (ret == NO_PEER_CERT) {
  9846. #ifdef WOLFSSL_TLS13
  9847. if (ssl->options.tls1_3) {
  9848. alertWhy = certificate_required;
  9849. }
  9850. else
  9851. #endif
  9852. {
  9853. alertWhy = handshake_failure;
  9854. }
  9855. }
  9856. /* send fatal alert and mark connection closed */
  9857. SendAlert(ssl, alert_fatal, alertWhy); /* try to send */
  9858. ssl->options.isClosed = 1;
  9859. }
  9860. /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */
  9861. /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */
  9862. /* Callback is issued for certificate presented in TLS Certificate (11) packet.
  9863. * The intermediates are done first then peer leaf cert last. Use the
  9864. * store->error_depth member to determine index (0=peer, >1 intermediates)
  9865. */
  9866. int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret,
  9867. ProcPeerCertArgs* args)
  9868. {
  9869. int verify_ok = 0, use_cb = 0;
  9870. void *heap;
  9871. if (cm == NULL) {
  9872. return BAD_FUNC_ARG;
  9873. }
  9874. heap = (ssl != NULL) ? ssl->heap : cm->heap;
  9875. /* Determine if verify was okay */
  9876. if (ret == 0) {
  9877. verify_ok = 1;
  9878. }
  9879. /* Determine if verify callback should be used */
  9880. if (ret != 0) {
  9881. if ((ssl != NULL) && (!ssl->options.verifyNone)) {
  9882. use_cb = 1; /* always report errors */
  9883. }
  9884. }
  9885. #ifdef WOLFSSL_ALWAYS_VERIFY_CB
  9886. /* always use verify callback on peer leaf cert */
  9887. if (args->certIdx == 0) {
  9888. use_cb = 1;
  9889. }
  9890. #endif
  9891. #ifdef WOLFSSL_VERIFY_CB_ALL_CERTS
  9892. /* perform verify callback on other intermediate certs (not just peer) */
  9893. if (args->certIdx > 0) {
  9894. use_cb = 1;
  9895. }
  9896. #endif
  9897. #if defined(OPENSSL_EXTRA)
  9898. /* Perform domain and IP check only for the leaf certificate */
  9899. if (args->certIdx == 0) {
  9900. /* perform domain name check on the peer certificate */
  9901. if (args->dCertInit && args->dCert && (ssl != NULL) &&
  9902. ssl->param && ssl->param->hostName[0]) {
  9903. /* If altNames names is present, then subject common name is ignored */
  9904. if (args->dCert->altNames != NULL) {
  9905. if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
  9906. if (ret == 0) {
  9907. ret = DOMAIN_NAME_MISMATCH;
  9908. }
  9909. }
  9910. }
  9911. else {
  9912. if (args->dCert->subjectCN) {
  9913. if (MatchDomainName(args->dCert->subjectCN,
  9914. args->dCert->subjectCNLen,
  9915. ssl->param->hostName) == 0) {
  9916. if (ret == 0) {
  9917. ret = DOMAIN_NAME_MISMATCH;
  9918. }
  9919. }
  9920. }
  9921. }
  9922. }
  9923. /* perform IP address check on the peer certificate */
  9924. if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) &&
  9925. (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) {
  9926. if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) {
  9927. if (ret == 0) {
  9928. ret = IPADDR_MISMATCH;
  9929. }
  9930. }
  9931. }
  9932. }
  9933. #endif
  9934. /* if verify callback has been set */
  9935. if ((use_cb && (ssl != NULL) && ((ssl->verifyCallback != NULL)
  9936. #ifdef OPENSSL_ALL
  9937. || (ssl->ctx->verifyCertCb != NULL)
  9938. #endif
  9939. ))
  9940. #ifndef NO_WOLFSSL_CM_VERIFY
  9941. || (cm->verifyCallback != NULL)
  9942. #endif
  9943. ) {
  9944. int verifyFail = 0;
  9945. #ifdef WOLFSSL_SMALL_STACK
  9946. WOLFSSL_X509_STORE_CTX* store;
  9947. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9948. WOLFSSL_X509* x509;
  9949. #endif
  9950. char* domain = NULL;
  9951. #else
  9952. WOLFSSL_X509_STORE_CTX store[1];
  9953. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9954. WOLFSSL_X509 x509[1];
  9955. #endif
  9956. char domain[ASN_NAME_MAX];
  9957. #endif
  9958. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9959. int x509Free = 0;
  9960. #endif
  9961. #ifdef WOLFSSL_SMALL_STACK
  9962. store = (WOLFSSL_X509_STORE_CTX*)XMALLOC(
  9963. sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE);
  9964. if (store == NULL) {
  9965. return MEMORY_E;
  9966. }
  9967. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9968. x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap,
  9969. DYNAMIC_TYPE_X509);
  9970. if (x509 == NULL) {
  9971. XFREE(store, heap, DYNAMIC_TYPE_X509);
  9972. return MEMORY_E;
  9973. }
  9974. #endif
  9975. domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING);
  9976. if (domain == NULL) {
  9977. XFREE(store, heap, DYNAMIC_TYPE_X509);
  9978. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9979. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  9980. #endif
  9981. return MEMORY_E;
  9982. }
  9983. #endif /* WOLFSSL_SMALL_STACK */
  9984. XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX));
  9985. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  9986. XMEMSET(x509, 0, sizeof(WOLFSSL_X509));
  9987. #endif
  9988. domain[0] = '\0';
  9989. /* build subject CN as string to return in store */
  9990. if (args->dCertInit && args->dCert && args->dCert->subjectCN) {
  9991. int subjectCNLen = args->dCert->subjectCNLen;
  9992. if (subjectCNLen > ASN_NAME_MAX-1)
  9993. subjectCNLen = ASN_NAME_MAX-1;
  9994. if (subjectCNLen > 0) {
  9995. XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen);
  9996. domain[subjectCNLen] = '\0';
  9997. }
  9998. }
  9999. store->error = ret;
  10000. store->error_depth = args->certIdx;
  10001. store->discardSessionCerts = 0;
  10002. store->domain = domain;
  10003. if (ssl != NULL) {
  10004. if (ssl->verifyCbCtx != NULL) {
  10005. /* Use the WOLFSSL user context if set */
  10006. store->userCtx = ssl->verifyCbCtx;
  10007. }
  10008. else {
  10009. /* Else use the WOLFSSL_CTX user context */
  10010. store->userCtx = ssl->ctx->verifyCbCtx;
  10011. }
  10012. }
  10013. else {
  10014. store->userCtx = cm;
  10015. }
  10016. store->certs = args->certs;
  10017. store->totalCerts = args->totalCerts;
  10018. #if defined(HAVE_EX_DATA) && \
  10019. (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
  10020. if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
  10021. != WOLFSSL_SUCCESS) {
  10022. WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX");
  10023. }
  10024. #endif
  10025. if (ssl != NULL) {
  10026. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
  10027. store->store = SSL_STORE(ssl);
  10028. #if defined(OPENSSL_EXTRA)
  10029. store->depth = args->count;
  10030. store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
  10031. sizeof(WOLFSSL_X509_VERIFY_PARAM),
  10032. heap, DYNAMIC_TYPE_OPENSSL);
  10033. if (store->param == NULL) {
  10034. #ifdef WOLFSSL_SMALL_STACK
  10035. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  10036. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10037. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  10038. #endif
  10039. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  10040. #endif
  10041. return MEMORY_E;
  10042. }
  10043. XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM));
  10044. /* Overwrite with non-default param values in SSL */
  10045. if (ssl->param) {
  10046. if (ssl->param->check_time)
  10047. store->param->check_time = ssl->param->check_time;
  10048. if (ssl->param->flags)
  10049. store->param->flags = ssl->param->flags;
  10050. if (ssl->param->hostName[0])
  10051. XMEMCPY(store->param->hostName, ssl->param->hostName,
  10052. WOLFSSL_HOST_NAME_MAX);
  10053. }
  10054. #endif /* defined(OPENSSL_EXTRA) */
  10055. #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/
  10056. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10057. #ifdef KEEP_PEER_CERT
  10058. if (args->certIdx == 0) {
  10059. store->current_cert = &ssl->peerCert; /* use existing X509 */
  10060. }
  10061. else
  10062. #endif
  10063. {
  10064. InitX509(x509, 0, heap);
  10065. if (CopyDecodedToX509(x509, args->dCert) == 0) {
  10066. store->current_cert = x509;
  10067. x509Free = 1;
  10068. }
  10069. else {
  10070. FreeX509(x509);
  10071. }
  10072. }
  10073. #endif
  10074. #ifdef SESSION_CERTS
  10075. store->sesChain = &ssl->session->chain;
  10076. #endif
  10077. }
  10078. #ifndef NO_WOLFSSL_CM_VERIFY
  10079. /* non-zero return code indicates failure override */
  10080. if (cm->verifyCallback != NULL) {
  10081. store->userCtx = cm;
  10082. if (cm->verifyCallback(verify_ok, store)) {
  10083. if (ret != 0) {
  10084. WOLFSSL_MSG("Verify CM callback overriding error!");
  10085. ret = 0;
  10086. }
  10087. }
  10088. else {
  10089. verifyFail = 1;
  10090. }
  10091. }
  10092. #endif
  10093. if (ssl != NULL) {
  10094. #ifdef OPENSSL_ALL
  10095. /* non-zero return code indicates failure override */
  10096. if (ssl->ctx->verifyCertCb) {
  10097. if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) {
  10098. if (ret != 0) {
  10099. WOLFSSL_MSG("Verify Cert callback overriding error!");
  10100. ret = 0;
  10101. }
  10102. }
  10103. else {
  10104. verifyFail = 1;
  10105. }
  10106. }
  10107. #endif
  10108. /* non-zero return code indicates failure override */
  10109. if (ssl->verifyCallback) {
  10110. if (ssl->verifyCallback(verify_ok, store)) {
  10111. if (ret != 0) {
  10112. WOLFSSL_MSG("Verify callback overriding error!");
  10113. ret = 0;
  10114. }
  10115. }
  10116. else {
  10117. verifyFail = 1;
  10118. }
  10119. }
  10120. }
  10121. if (verifyFail) {
  10122. /* induce error if one not present */
  10123. if (ret == 0) {
  10124. ret = VERIFY_CERT_ERROR;
  10125. }
  10126. /* mark as verify error */
  10127. args->verifyErr = 1;
  10128. }
  10129. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10130. if (x509Free) {
  10131. FreeX509(x509);
  10132. }
  10133. #endif
  10134. #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
  10135. wolfSSL_sk_X509_pop_free(store->chain, NULL);
  10136. store->chain = NULL;
  10137. #endif
  10138. #ifdef SESSION_CERTS
  10139. if ((ssl != NULL) && (store->discardSessionCerts)) {
  10140. WOLFSSL_MSG("Verify callback requested discard sess certs");
  10141. ssl->session->chain.count = 0;
  10142. #ifdef WOLFSSL_ALT_CERT_CHAINS
  10143. ssl->session->altChain.count = 0;
  10144. #endif
  10145. }
  10146. #endif /* SESSION_CERTS */
  10147. #ifdef OPENSSL_EXTRA
  10148. if ((ssl != NULL) && (store->param)) {
  10149. XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL);
  10150. }
  10151. #endif
  10152. #ifdef WOLFSSL_SMALL_STACK
  10153. XFREE(domain, heap, DYNAMIC_TYPE_STRING);
  10154. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10155. XFREE(x509, heap, DYNAMIC_TYPE_X509);
  10156. #endif
  10157. XFREE(store, heap, DYNAMIC_TYPE_X509_STORE);
  10158. #endif
  10159. }
  10160. (void)heap;
  10161. return ret;
  10162. }
  10163. static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs)
  10164. {
  10165. ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs;
  10166. (void)ssl;
  10167. if (args->certs) {
  10168. XFREE(args->certs, ssl->heap, DYNAMIC_TYPE_DER);
  10169. args->certs = NULL;
  10170. }
  10171. #ifdef WOLFSSL_TLS13
  10172. if (args->exts) {
  10173. XFREE(args->exts, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  10174. args->exts = NULL;
  10175. }
  10176. #endif
  10177. if (args->dCert) {
  10178. if (args->dCertInit) {
  10179. FreeDecodedCert(args->dCert);
  10180. args->dCertInit = 0;
  10181. }
  10182. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  10183. args->dCert = NULL;
  10184. }
  10185. }
  10186. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  10187. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  10188. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  10189. /* load certificate file which has the form <hash>.(r)N[0..N] */
  10190. /* in the folder. */
  10191. /* (r), in the case of CRL file */
  10192. /* @param store a pointer to X509_STORE structure */
  10193. /* @param issuer a pointer to X509_NAME that presents an issuer */
  10194. /* @param type X509_LU_X509 or X509_LU_CRL */
  10195. /* @return WOLFSSL_SUCCESS on successful, otherwise WOLFSSL_FAILURE */
  10196. int LoadCertByIssuer(WOLFSSL_X509_STORE* store, X509_NAME* issuer, int type)
  10197. {
  10198. const int MAX_SUFFIX = 10;/* The number comes from CA_TABLE_SIZE=10 */
  10199. int ret = WOLFSSL_SUCCESS;
  10200. WOLFSSL_X509_LOOKUP* lookup;
  10201. WOLFSSL_BY_DIR_entry* entry;
  10202. WOLFSSL_BY_DIR_HASH hash_tmp;
  10203. WOLFSSL_BY_DIR_HASH* ph = NULL;
  10204. WOLFSSL_X509* x509;
  10205. unsigned long hash = 0;
  10206. char* filename = NULL;
  10207. const char* post = "";
  10208. byte* pbuf = NULL;
  10209. int len, num, i, idx;
  10210. int suffix = 0;
  10211. int retHash = NOT_COMPILED_IN;
  10212. byte dgt[WC_MAX_DIGEST_SIZE];
  10213. WOLFSSL_ENTER("LoadCertByIssuer");
  10214. /* sanity check */
  10215. if (store == NULL || issuer == NULL || (type != X509_LU_X509 && type != X509_LU_CRL)) {
  10216. return WOLFSSL_FAILURE;
  10217. }
  10218. lookup = &store->lookup;
  10219. if (lookup->dirs == NULL || lookup->type != 1) {
  10220. return WOLFSSL_FAILURE;
  10221. }
  10222. len = wolfSSL_i2d_X509_NAME_canon(issuer, &pbuf);
  10223. if (len > 0) {
  10224. #ifndef NO_SHA
  10225. retHash = wc_ShaHash((const byte*)pbuf, len, dgt);
  10226. #endif
  10227. if (retHash == 0) {
  10228. /* 4 bytes in little endian as unsigned long */
  10229. hash = (((unsigned long)dgt[3] << 24) |
  10230. ((unsigned long)dgt[2] << 16) |
  10231. ((unsigned long)dgt[1] << 8) |
  10232. ((unsigned long)dgt[0]));
  10233. } else {
  10234. WOLFSSL_MSG("failed hash operation");
  10235. return WOLFSSL_FAILURE;
  10236. }
  10237. wolfSSL_OPENSSL_free(pbuf);
  10238. }
  10239. /* try to load each hashed name file in path */
  10240. #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  10241. if (type == X509_LU_CRL) {
  10242. post = "r";
  10243. }
  10244. num = wolfSSL_sk_BY_DIR_entry_num(lookup->dirs->dir_entry);
  10245. for (i=0; i<num; i++) {
  10246. entry = wolfSSL_sk_BY_DIR_entry_value(lookup->dirs->dir_entry, i);
  10247. if (type == X509_LU_CRL && entry->hashes != NULL &&
  10248. wolfSSL_sk_BY_DIR_HASH_num(entry->hashes) > 0) {
  10249. /* lock the list */
  10250. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  10251. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  10252. return BAD_MUTEX_E;
  10253. }
  10254. hash_tmp.hash_value = hash;
  10255. idx = wolfSSL_sk_BY_DIR_HASH_find(entry->hashes, &hash_tmp);
  10256. if (idx >= 0) {
  10257. WOLFSSL_MSG("find hashed CRL in list");
  10258. ph = wolfSSL_sk_BY_DIR_HASH_value(entry->hashes, idx);
  10259. suffix = ph->last_suffix;
  10260. } else {
  10261. ph = NULL;
  10262. suffix = 0;
  10263. }
  10264. wc_UnLockMutex(&lookup->dirs->lock);
  10265. }
  10266. /* Additional buffer length for file name memory allocation : */
  10267. /* / <hashvalue>.(r)N\0 */
  10268. /*|1| 8 |1|1|1|1| => 13 */
  10269. len = (int)XSTRLEN(entry->dir_name) + 13;
  10270. if (filename != NULL) {
  10271. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  10272. }
  10273. filename = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
  10274. if (filename == NULL) {
  10275. WOLFSSL_MSG("memory allocation error");
  10276. return MEMORY_E;
  10277. }
  10278. /* set as FAILURE, if successfully loading cert of CRL, this becomes */
  10279. /* WOLFSSL_SUCCESS */
  10280. ret = WOLFSSL_FAILURE;
  10281. for (; suffix < MAX_SUFFIX; suffix++) {
  10282. /* /folder-path/<hash>.(r)N[0..9] */
  10283. XSNPRINTF(filename, len, "%s/%08lx.%s%d", entry->dir_name,
  10284. hash, post, suffix);
  10285. if(wc_FileExists(filename) == 0/*0 file exists */) {
  10286. if (type == X509_LU_X509) {
  10287. x509 = wolfSSL_X509_load_certificate_file(filename,
  10288. WOLFSSL_FILETYPE_PEM);
  10289. if (x509 != NULL) {
  10290. ret = wolfSSL_X509_STORE_add_cert(store, x509);
  10291. wolfSSL_X509_free(x509);
  10292. } else {
  10293. WOLFSSL_MSG("failed to load certificate");
  10294. ret = WOLFSSL_FAILURE;
  10295. break;
  10296. }
  10297. }
  10298. else if (type == X509_LU_CRL) {
  10299. #if defined(HAVE_CRL)
  10300. ret = wolfSSL_X509_load_crl_file(&store->lookup, filename,
  10301. WOLFSSL_FILETYPE_PEM);
  10302. if (ret != WOLFSSL_SUCCESS) {
  10303. WOLFSSL_MSG("failed to load CRL");
  10304. break;
  10305. }
  10306. #else
  10307. WOLFSSL_MSG("CRL is not supported");
  10308. ret = WOLFSSL_FAILURE;
  10309. break;
  10310. #endif /* HAVE_CRL */
  10311. }
  10312. } else
  10313. break;
  10314. }
  10315. if (ret != WOLFSSL_SUCCESS) {
  10316. WOLFSSL_MSG("not found file");
  10317. ret = WOLFSSL_FAILURE;
  10318. } else {
  10319. if (type == X509_LU_CRL) {
  10320. if (wc_LockMutex(&lookup->dirs->lock) != 0) {
  10321. WOLFSSL_MSG("wc_LockMutex cdir Lock error");
  10322. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  10323. return BAD_MUTEX_E;
  10324. }
  10325. if (ph == NULL) {
  10326. ph = wolfSSL_BY_DIR_HASH_new();
  10327. if (ph == NULL) {
  10328. WOLFSSL_MSG("failed to allocate hash stack");
  10329. ret = WOLFSSL_FAILURE;
  10330. } else {
  10331. ph->hash_value = hash;
  10332. ph->last_suffix = suffix;
  10333. ret = wolfSSL_sk_BY_DIR_HASH_push(entry->hashes, ph);
  10334. }
  10335. }
  10336. wc_UnLockMutex(&lookup->dirs->lock);
  10337. }
  10338. }
  10339. XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL);
  10340. }
  10341. #else
  10342. (void) type;
  10343. (void) ret;
  10344. (void) x509;
  10345. (void) filename;
  10346. (void) suffix;
  10347. (void) num;
  10348. (void) i;
  10349. ret = WOLFSSL_NOT_IMPLEMENTED;
  10350. #endif
  10351. WOLFSSL_LEAVE("LoadCertByIssuer", ret);
  10352. return ret;
  10353. }
  10354. #endif
  10355. static int ProcessPeerCertParse(WOLFSSL* ssl, ProcPeerCertArgs* args,
  10356. int certType, int verify, byte** pSubjectHash, int* pAlreadySigner)
  10357. {
  10358. int ret = 0;
  10359. buffer* cert;
  10360. byte* subjectHash = NULL;
  10361. int alreadySigner = 0;
  10362. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  10363. int sigRet = 0;
  10364. #endif
  10365. if (ssl == NULL || args == NULL
  10366. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  10367. || args->dCert == NULL
  10368. #endif
  10369. ) {
  10370. return BAD_FUNC_ARG;
  10371. }
  10372. /* check to make sure certificate index is valid */
  10373. if (args->certIdx > args->count)
  10374. return BUFFER_E;
  10375. /* check if returning from non-blocking OCSP */
  10376. /* skip this section because cert is already initialized and parsed */
  10377. #ifdef WOLFSSL_NONBLOCK_OCSP
  10378. if (args->lastErr == OCSP_WANT_READ) {
  10379. args->lastErr = 0; /* clear error */
  10380. return 0;
  10381. }
  10382. #endif
  10383. #ifdef WOLFSSL_TRUST_PEER_CERT
  10384. /* we have trusted peer */
  10385. if (args->haveTrustPeer) {
  10386. return 0;
  10387. }
  10388. #endif
  10389. /* get certificate buffer */
  10390. cert = &args->certs[args->certIdx];
  10391. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  10392. if (verify == VERIFY) {
  10393. /* for small cert verify, release decoded cert during signature check to
  10394. reduce peak memory usage */
  10395. if (args->dCert != NULL) {
  10396. if (args->dCertInit) {
  10397. FreeDecodedCert(args->dCert);
  10398. args->dCertInit = 0;
  10399. }
  10400. XFREE(args->dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
  10401. args->dCert = NULL;
  10402. }
  10403. /* perform cert parsing and signature check */
  10404. sigRet = CheckCertSignature(cert->buffer, cert->length,
  10405. ssl->heap, SSL_CM(ssl));
  10406. /* fail on errors here after the ParseCertRelative call, so dCert is populated */
  10407. /* verify name only in ParseCertRelative below, signature check done */
  10408. verify = VERIFY_NAME;
  10409. }
  10410. #endif /* WOLFSSL_SMALL_CERT_VERIFY */
  10411. /* make sure the decoded cert structure is allocated and initialized */
  10412. if (!args->dCertInit
  10413. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  10414. || args->dCert == NULL
  10415. #endif
  10416. ) {
  10417. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  10418. if (args->dCert == NULL) {
  10419. args->dCert = (DecodedCert*)XMALLOC(
  10420. sizeof(DecodedCert), ssl->heap,
  10421. DYNAMIC_TYPE_DCERT);
  10422. if (args->dCert == NULL) {
  10423. return MEMORY_E;
  10424. }
  10425. }
  10426. #endif
  10427. InitDecodedCert(args->dCert, cert->buffer, cert->length, ssl->heap);
  10428. args->dCertInit = 1;
  10429. args->dCert->sigCtx.devId = ssl->devId;
  10430. #ifdef WOLFSSL_ASYNC_CRYPT
  10431. args->dCert->sigCtx.asyncCtx = ssl;
  10432. #endif
  10433. #ifdef HAVE_PK_CALLBACKS
  10434. /* setup the PK callback context */
  10435. ret = InitSigPkCb(ssl, &args->dCert->sigCtx);
  10436. if (ret != 0)
  10437. return ret;
  10438. #endif
  10439. }
  10440. /* Parse Certificate */
  10441. ret = ParseCertRelative(args->dCert, certType, verify, SSL_CM(ssl));
  10442. /* perform below checks for date failure cases */
  10443. if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) {
  10444. /* get subject and determine if already loaded */
  10445. #ifndef NO_SKID
  10446. if (args->dCert->extAuthKeyIdSet)
  10447. subjectHash = args->dCert->extSubjKeyId;
  10448. else
  10449. #endif
  10450. subjectHash = args->dCert->subjectHash;
  10451. alreadySigner = AlreadySigner(SSL_CM(ssl), subjectHash);
  10452. }
  10453. #ifdef WOLFSSL_SMALL_CERT_VERIFY
  10454. /* get signature check failures from above */
  10455. if (ret == 0)
  10456. ret = sigRet;
  10457. #endif
  10458. if (pSubjectHash)
  10459. *pSubjectHash = subjectHash;
  10460. if (pAlreadySigner)
  10461. *pAlreadySigner = alreadySigner;
  10462. #ifdef WOLFSSL_ASYNC_CRYPT
  10463. if (ret == WC_PENDING_E) {
  10464. ret = wolfSSL_AsyncPush(ssl,
  10465. args->dCert->sigCtx.asyncDev);
  10466. }
  10467. #endif
  10468. return ret;
  10469. }
  10470. /* Check key sizes for certs. Is redundant check since
  10471. ProcessBuffer also performs this check. */
  10472. static int ProcessPeerCertCheckKey(WOLFSSL* ssl, ProcPeerCertArgs* args)
  10473. {
  10474. int ret = 0;
  10475. if (ssl->options.verifyNone) {
  10476. return ret;
  10477. }
  10478. switch (args->dCert->keyOID) {
  10479. #ifndef NO_RSA
  10480. case RSAk:
  10481. if (ssl->options.minRsaKeySz < 0 ||
  10482. args->dCert->pubKeySize <
  10483. (word16)ssl->options.minRsaKeySz) {
  10484. WOLFSSL_MSG(
  10485. "RSA key size in cert chain error");
  10486. ret = RSA_KEY_SIZE_E;
  10487. }
  10488. break;
  10489. #endif /* !NO_RSA */
  10490. #ifdef HAVE_ECC
  10491. case ECDSAk:
  10492. if (ssl->options.minEccKeySz < 0 ||
  10493. args->dCert->pubKeySize <
  10494. (word16)ssl->options.minEccKeySz) {
  10495. WOLFSSL_MSG(
  10496. "ECC key size in cert chain error");
  10497. ret = ECC_KEY_SIZE_E;
  10498. }
  10499. break;
  10500. #endif /* HAVE_ECC */
  10501. #ifdef HAVE_ED25519
  10502. case ED25519k:
  10503. if (ssl->options.minEccKeySz < 0 ||
  10504. ED25519_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  10505. WOLFSSL_MSG(
  10506. "ECC key size in cert chain error");
  10507. ret = ECC_KEY_SIZE_E;
  10508. }
  10509. break;
  10510. #endif /* HAVE_ED25519 */
  10511. #ifdef HAVE_ED448
  10512. case ED448k:
  10513. if (ssl->options.minEccKeySz < 0 ||
  10514. ED448_KEY_SIZE < (word16)ssl->options.minEccKeySz) {
  10515. WOLFSSL_MSG(
  10516. "ECC key size in cert chain error");
  10517. ret = ECC_KEY_SIZE_E;
  10518. }
  10519. break;
  10520. #endif /* HAVE_ED448 */
  10521. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  10522. case FALCON_LEVEL1k:
  10523. if (ssl->options.minFalconKeySz < 0 ||
  10524. FALCON_LEVEL1_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  10525. WOLFSSL_MSG(
  10526. "Falcon key size in cert chain error");
  10527. ret = FALCON_KEY_SIZE_E;
  10528. }
  10529. break;
  10530. case FALCON_LEVEL5k:
  10531. if (ssl->options.minFalconKeySz < 0 ||
  10532. FALCON_LEVEL5_KEY_SIZE < (word16)ssl->options.minFalconKeySz) {
  10533. WOLFSSL_MSG(
  10534. "Falcon key size in cert chain error");
  10535. ret = FALCON_KEY_SIZE_E;
  10536. }
  10537. break;
  10538. #endif /* HAVE_PQC && HAVE_FALCON */
  10539. default:
  10540. WOLFSSL_MSG("Key size not checked");
  10541. /* key not being checked for size if not in
  10542. switch */
  10543. break;
  10544. }
  10545. return ret;
  10546. }
  10547. int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  10548. word32 totalSz)
  10549. {
  10550. int ret = 0;
  10551. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  10552. ProcPeerCertArgs* args = NULL;
  10553. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  10554. #elif defined(WOLFSSL_SMALL_STACK)
  10555. ProcPeerCertArgs* args = NULL;
  10556. #else
  10557. ProcPeerCertArgs args[1];
  10558. #endif
  10559. byte* subjectHash = NULL;
  10560. int alreadySigner = 0;
  10561. WOLFSSL_ENTER("ProcessPeerCerts");
  10562. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  10563. if (ssl->async == NULL) {
  10564. ssl->async = (struct WOLFSSL_ASYNC*)
  10565. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  10566. DYNAMIC_TYPE_ASYNC);
  10567. if (ssl->async == NULL)
  10568. ERROR_OUT(MEMORY_E, exit_ppc);
  10569. }
  10570. args = (ProcPeerCertArgs*)ssl->async->args;
  10571. #ifdef WOLFSSL_ASYNC_CRYPT
  10572. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  10573. if (ret != WC_NOT_PENDING_E) {
  10574. /* Check for error */
  10575. if (ret < 0)
  10576. goto exit_ppc;
  10577. }
  10578. else
  10579. #endif
  10580. #ifdef WOLFSSL_NONBLOCK_OCSP
  10581. if (ssl->error == OCSP_WANT_READ) {
  10582. /* Re-entry after non-blocking OCSP */
  10583. }
  10584. else
  10585. #endif
  10586. #elif defined(WOLFSSL_SMALL_STACK)
  10587. args = (ProcPeerCertArgs*)XMALLOC(
  10588. sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  10589. if (args == NULL) {
  10590. ERROR_OUT(MEMORY_E, exit_ppc);
  10591. }
  10592. #endif
  10593. {
  10594. /* Reset state */
  10595. ret = 0;
  10596. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  10597. XMEMSET(args, 0, sizeof(ProcPeerCertArgs));
  10598. args->idx = *inOutIdx;
  10599. args->begin = *inOutIdx;
  10600. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  10601. ssl->async->freeArgs = FreeProcPeerCertArgs;
  10602. #endif
  10603. }
  10604. switch (ssl->options.asyncState)
  10605. {
  10606. case TLS_ASYNC_BEGIN:
  10607. {
  10608. word32 listSz;
  10609. #ifdef WOLFSSL_CALLBACKS
  10610. if (ssl->hsInfoOn)
  10611. AddPacketName(ssl, "Certificate");
  10612. if (ssl->toInfoOn)
  10613. AddLateName("Certificate", &ssl->timeoutInfo);
  10614. #endif
  10615. #ifdef WOLFSSL_TLS13
  10616. if (ssl->options.tls1_3) {
  10617. byte ctxSz;
  10618. /* Certificate Request Context */
  10619. if ((args->idx - args->begin) + OPAQUE8_LEN > totalSz)
  10620. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10621. ctxSz = *(input + args->idx);
  10622. args->idx++;
  10623. if ((args->idx - args->begin) + ctxSz > totalSz)
  10624. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10625. #ifndef NO_WOLFSSL_CLIENT
  10626. /* Must be empty when received from server. */
  10627. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  10628. if (ctxSz != 0) {
  10629. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  10630. }
  10631. }
  10632. #endif
  10633. #ifndef NO_WOLFSSL_SERVER
  10634. /* Must contain value sent in request. */
  10635. if (ssl->options.side == WOLFSSL_SERVER_END) {
  10636. if (ssl->options.handShakeState != HANDSHAKE_DONE &&
  10637. ctxSz != 0) {
  10638. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  10639. }
  10640. else if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  10641. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  10642. CertReqCtx* curr = ssl->certReqCtx;
  10643. CertReqCtx* prev = NULL;
  10644. while (curr != NULL) {
  10645. if ((ctxSz == curr->len) &&
  10646. XMEMCMP(&curr->ctx, input + args->idx, ctxSz)
  10647. == 0) {
  10648. if (prev != NULL)
  10649. prev->next = curr->next;
  10650. else
  10651. ssl->certReqCtx = curr->next;
  10652. XFREE(curr, ssl->heap,
  10653. DYNAMIC_TYPE_TMP_BUFFER);
  10654. break;
  10655. }
  10656. prev = curr;
  10657. curr = curr->next;
  10658. }
  10659. if (curr == NULL)
  10660. #endif
  10661. ERROR_OUT(INVALID_CERT_CTX_E, exit_ppc);
  10662. }
  10663. }
  10664. #endif
  10665. args->idx += ctxSz;
  10666. /* allocate buffer for cert extensions */
  10667. args->exts = (buffer*)XMALLOC(sizeof(buffer) *
  10668. MAX_CHAIN_DEPTH, ssl->heap, DYNAMIC_TYPE_CERT_EXT);
  10669. if (args->exts == NULL) {
  10670. ERROR_OUT(MEMORY_E, exit_ppc);
  10671. }
  10672. }
  10673. #endif
  10674. /* allocate buffer for certs */
  10675. args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
  10676. ssl->heap, DYNAMIC_TYPE_DER);
  10677. if (args->certs == NULL) {
  10678. ERROR_OUT(MEMORY_E, exit_ppc);
  10679. }
  10680. XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
  10681. /* Certificate List */
  10682. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  10683. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10684. }
  10685. c24to32(input + args->idx, &listSz);
  10686. args->idx += OPAQUE24_LEN;
  10687. if (listSz > MAX_CERTIFICATE_SZ) {
  10688. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10689. }
  10690. if ((args->idx - args->begin) + listSz != totalSz) {
  10691. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10692. }
  10693. WOLFSSL_MSG("Loading peer's cert chain");
  10694. /* first put cert chain into buffer so can verify top down
  10695. we're sent bottom up */
  10696. while (listSz) {
  10697. word32 certSz;
  10698. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10699. if (args->totalCerts >= MAX_CHAIN_DEPTH) {
  10700. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  10701. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  10702. ret = MAX_CHAIN_ERROR;
  10703. WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
  10704. break; /* break out to avoid reading more certs then buffer
  10705. * can hold */
  10706. }
  10707. #else
  10708. if (args->totalCerts >= ssl->verifyDepth ||
  10709. args->totalCerts >= MAX_CHAIN_DEPTH) {
  10710. ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
  10711. }
  10712. #endif
  10713. if ((args->idx - args->begin) + OPAQUE24_LEN > totalSz) {
  10714. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10715. }
  10716. c24to32(input + args->idx, &certSz);
  10717. args->idx += OPAQUE24_LEN;
  10718. if ((args->idx - args->begin) + certSz > totalSz) {
  10719. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10720. }
  10721. args->certs[args->totalCerts].length = certSz;
  10722. args->certs[args->totalCerts].buffer = input + args->idx;
  10723. #ifdef SESSION_CERTS
  10724. AddSessionCertToChain(&ssl->session->chain,
  10725. input + args->idx, certSz);
  10726. #endif /* SESSION_CERTS */
  10727. args->idx += certSz;
  10728. listSz -= certSz + CERT_HEADER_SZ;
  10729. #ifdef WOLFSSL_TLS13
  10730. /* Extensions */
  10731. if (ssl->options.tls1_3) {
  10732. word16 extSz;
  10733. if (args->exts == NULL) {
  10734. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10735. }
  10736. if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
  10737. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10738. }
  10739. ato16(input + args->idx, &extSz);
  10740. args->idx += OPAQUE16_LEN;
  10741. if ((args->idx - args->begin) + extSz > totalSz) {
  10742. ERROR_OUT(BUFFER_ERROR, exit_ppc);
  10743. }
  10744. /* Store extension data info for later processing. */
  10745. args->exts[args->totalCerts].length = extSz;
  10746. args->exts[args->totalCerts].buffer = input + args->idx;
  10747. args->idx += extSz;
  10748. listSz -= extSz + OPAQUE16_LEN;
  10749. WOLFSSL_MSG_EX("\tParsing %d bytes of cert extensions",
  10750. args->exts[args->totalCerts].length);
  10751. ret = TLSX_Parse(ssl, args->exts[args->totalCerts].buffer,
  10752. (word16)args->exts[args->totalCerts].length,
  10753. certificate, NULL);
  10754. if (ret < 0) {
  10755. ERROR_OUT(ret, exit_ppc);
  10756. }
  10757. }
  10758. #endif
  10759. args->totalCerts++;
  10760. WOLFSSL_MSG("\tPut another cert into chain");
  10761. } /* while (listSz) */
  10762. args->count = args->totalCerts;
  10763. args->certIdx = 0; /* select peer cert (first one) */
  10764. if (args->count == 0) {
  10765. /* Empty certificate message. */
  10766. if ((ssl->options.side == WOLFSSL_SERVER_END) &&
  10767. (ssl->options.mutualAuth || (ssl->options.failNoCert &&
  10768. IsAtLeastTLSv1_3(ssl->version)))) {
  10769. WOLFSSL_MSG("No peer cert from Client");
  10770. ret = NO_PEER_CERT;
  10771. DoCertFatalAlert(ssl, ret);
  10772. }
  10773. else if ((ssl->options.side == WOLFSSL_CLIENT_END) &&
  10774. IsAtLeastTLSv1_3(ssl->version)) {
  10775. WOLFSSL_MSG("No peer cert from Server");
  10776. ret = NO_PEER_CERT;
  10777. SendAlert(ssl, alert_fatal, decode_error);
  10778. }
  10779. }
  10780. args->dCertInit = 0;
  10781. #ifndef WOLFSSL_SMALL_CERT_VERIFY
  10782. args->dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  10783. DYNAMIC_TYPE_DCERT);
  10784. if (args->dCert == NULL) {
  10785. ERROR_OUT(MEMORY_E, exit_ppc);
  10786. }
  10787. XMEMSET(args->dCert, 0, sizeof(DecodedCert));
  10788. #endif
  10789. /* Advance state and proceed */
  10790. ssl->options.asyncState = TLS_ASYNC_BUILD;
  10791. } /* case TLS_ASYNC_BEGIN */
  10792. FALL_THROUGH;
  10793. case TLS_ASYNC_BUILD:
  10794. {
  10795. if (args->count > 0) {
  10796. /* check for trusted peer and get untrustedDepth */
  10797. #if defined(WOLFSSL_TRUST_PEER_CERT) || defined(OPENSSL_EXTRA)
  10798. if (args->certIdx == 0) {
  10799. #ifdef WOLFSSL_TRUST_PEER_CERT
  10800. TrustedPeerCert* tp;
  10801. #endif
  10802. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, NO_VERIFY,
  10803. &subjectHash, &alreadySigner);
  10804. if (ret != 0)
  10805. goto exit_ppc;
  10806. #ifdef OPENSSL_EXTRA
  10807. /* Determine untrusted depth */
  10808. if (!alreadySigner && (!args->dCert ||
  10809. !args->dCertInit || !args->dCert->selfSigned)) {
  10810. args->untrustedDepth = 1;
  10811. }
  10812. #endif
  10813. #ifdef WOLFSSL_TRUST_PEER_CERT
  10814. tp = GetTrustedPeer(SSL_CM(ssl), args->dCert);
  10815. WOLFSSL_MSG("Checking for trusted peer cert");
  10816. if (tp && MatchTrustedPeer(tp, args->dCert)) {
  10817. WOLFSSL_MSG("Found matching trusted peer cert");
  10818. args->haveTrustPeer = 1;
  10819. }
  10820. else if (tp == NULL) {
  10821. /* no trusted peer cert */
  10822. WOLFSSL_MSG("No matching trusted peer cert. Checking CAs");
  10823. }
  10824. else {
  10825. WOLFSSL_MSG("Trusted peer cert did not match!");
  10826. }
  10827. if (!args->haveTrustPeer)
  10828. #endif
  10829. {
  10830. /* free cert if not trusted peer */
  10831. FreeDecodedCert(args->dCert);
  10832. args->dCertInit = 0;
  10833. }
  10834. }
  10835. #endif /* WOLFSSL_TRUST_PEER_CERT || OPENSSL_EXTRA */
  10836. /* check certificate up to peer's first */
  10837. /* do not verify chain if trusted peer cert found */
  10838. while (args->count > 1
  10839. #ifdef WOLFSSL_TRUST_PEER_CERT
  10840. && !args->haveTrustPeer
  10841. #endif /* WOLFSSL_TRUST_PEER_CERT */
  10842. ) {
  10843. int skipAddCA = 0;
  10844. /* select last certificate */
  10845. args->certIdx = args->count - 1;
  10846. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  10847. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  10848. &subjectHash, &alreadySigner);
  10849. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  10850. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  10851. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  10852. if (ret == ASN_NO_SIGNER_E) {
  10853. WOLFSSL_MSG("try to load certificate if hash dir is set");
  10854. ret = LoadCertByIssuer(SSL_STORE(ssl),
  10855. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  10856. X509_LU_X509);
  10857. if (ret == WOLFSSL_SUCCESS) {
  10858. FreeDecodedCert(args->dCert);
  10859. args->dCertInit = 0;
  10860. /* once again */
  10861. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  10862. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  10863. &subjectHash, &alreadySigner);
  10864. } else
  10865. ret = ASN_NO_SIGNER_E;
  10866. }
  10867. #endif
  10868. #ifdef WOLFSSL_ASYNC_CRYPT
  10869. if (ret == WC_PENDING_E)
  10870. goto exit_ppc;
  10871. #endif
  10872. if (ret == 0) {
  10873. ret = ProcessPeerCertCheckKey(ssl, args);
  10874. }
  10875. if (ret == 0 && args->dCert->isCA == 0) {
  10876. WOLFSSL_MSG("Chain cert is not a CA, not adding as one");
  10877. }
  10878. else if (ret == 0 && ssl->options.verifyNone) {
  10879. WOLFSSL_MSG("Chain cert not verified by option, "
  10880. "not adding as CA");
  10881. }
  10882. else if (ret == 0) {
  10883. #ifdef OPENSSL_EXTRA
  10884. if (args->certIdx > args->untrustedDepth) {
  10885. args->untrustedDepth = (char)args->certIdx + 1;
  10886. }
  10887. #endif
  10888. if (alreadySigner) {
  10889. WOLFSSL_MSG("Verified CA from chain and already had it");
  10890. }
  10891. }
  10892. else {
  10893. WOLFSSL_MSG("Failed to verify CA from chain");
  10894. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10895. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  10896. ssl->peerVerifyRet = X509_V_ERR_INVALID_CA;
  10897. #endif
  10898. }
  10899. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  10900. if (ret == 0) {
  10901. int doCrlLookup = 1;
  10902. #ifdef HAVE_OCSP
  10903. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  10904. if (ssl->status_request_v2) {
  10905. ret = TLSX_CSR2_InitRequests(ssl->extensions,
  10906. args->dCert, 0, ssl->heap);
  10907. }
  10908. else /* skips OCSP and force CRL check */
  10909. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  10910. if (SSL_CM(ssl)->ocspEnabled &&
  10911. SSL_CM(ssl)->ocspCheckAll) {
  10912. WOLFSSL_MSG("Doing Non Leaf OCSP check");
  10913. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  10914. args->dCert, NULL, ssl);
  10915. #ifdef WOLFSSL_NONBLOCK_OCSP
  10916. if (ret == OCSP_WANT_READ) {
  10917. args->lastErr = ret;
  10918. goto exit_ppc;
  10919. }
  10920. #endif
  10921. doCrlLookup = (ret == OCSP_CERT_UNKNOWN);
  10922. if (ret != 0) {
  10923. doCrlLookup = 0;
  10924. WOLFSSL_MSG("\tOCSP Lookup not ok");
  10925. }
  10926. }
  10927. #endif /* HAVE_OCSP */
  10928. #ifdef HAVE_CRL
  10929. if (ret == 0 && doCrlLookup &&
  10930. SSL_CM(ssl)->crlEnabled &&
  10931. SSL_CM(ssl)->crlCheckAll) {
  10932. WOLFSSL_MSG("Doing Non Leaf CRL check");
  10933. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  10934. #ifdef WOLFSSL_NONBLOCK_OCSP
  10935. if (ret == OCSP_WANT_READ) {
  10936. args->lastErr = ret;
  10937. goto exit_ppc;
  10938. }
  10939. #endif
  10940. if (ret != 0) {
  10941. WOLFSSL_MSG("\tCRL check not ok");
  10942. }
  10943. }
  10944. #endif /* HAVE_CRL */
  10945. (void)doCrlLookup;
  10946. }
  10947. #endif /* HAVE_OCSP || HAVE_CRL */
  10948. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10949. if (ret == 0 &&
  10950. /* extend the limit "+1" until reaching
  10951. * an ultimately trusted issuer.*/
  10952. args->count > (ssl->verifyDepth + 1)) {
  10953. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  10954. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  10955. ret = MAX_CHAIN_ERROR;
  10956. }
  10957. #endif
  10958. #ifdef WOLFSSL_ALT_CERT_CHAINS
  10959. /* For alternate cert chain, its okay for a CA cert to fail
  10960. with ASN_NO_SIGNER_E here. The "alternate" certificate
  10961. chain mode only requires that the peer certificate
  10962. validate to a trusted CA */
  10963. if (ret != 0 && args->dCert->isCA) {
  10964. if (ret == ASN_NO_SIGNER_E) {
  10965. if (!ssl->options.usingAltCertChain) {
  10966. WOLFSSL_MSG("Trying alternate cert chain");
  10967. ssl->options.usingAltCertChain = 1;
  10968. }
  10969. ret = 0; /* clear errors and continue */
  10970. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  10971. ssl->peerVerifyRet = 0;
  10972. #endif
  10973. args->verifyErr = 0;
  10974. }
  10975. /* do not add to certificate manager */
  10976. skipAddCA = 1;
  10977. }
  10978. #endif /* WOLFSSL_ALT_CERT_CHAINS */
  10979. /* Do verify callback */
  10980. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  10981. if (ssl->options.verifyNone &&
  10982. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  10983. ret == CRL_CERT_DATE_ERR)) {
  10984. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  10985. ret = ssl->error = 0;
  10986. }
  10987. /* If valid CA then add to Certificate Manager */
  10988. if (ret == 0 && args->dCert->isCA &&
  10989. !ssl->options.verifyNone && !skipAddCA) {
  10990. buffer* cert = &args->certs[args->certIdx];
  10991. /* Is valid CA */
  10992. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  10993. /* if using alternate chain, store the cert used */
  10994. if (ssl->options.usingAltCertChain) {
  10995. AddSessionCertToChain(&ssl->session->altChain,
  10996. cert->buffer, cert->length);
  10997. }
  10998. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  10999. if (!alreadySigner) {
  11000. DerBuffer* add = NULL;
  11001. ret = AllocDer(&add, cert->length, CA_TYPE, ssl->heap);
  11002. if (ret < 0)
  11003. goto exit_ppc;
  11004. XMEMCPY(add->buffer, cert->buffer, cert->length);
  11005. /* CA already verified above in ParseCertRelative */
  11006. WOLFSSL_MSG("Adding CA from chain");
  11007. ret = AddCA(SSL_CM(ssl), &add, WOLFSSL_CHAIN_CA,
  11008. NO_VERIFY);
  11009. if (ret == WOLFSSL_SUCCESS) {
  11010. ret = 0;
  11011. }
  11012. }
  11013. }
  11014. /* Handle error codes */
  11015. if (ret != 0) {
  11016. if (!ssl->options.verifyNone) {
  11017. DoCertFatalAlert(ssl, ret);
  11018. }
  11019. ssl->error = ret; /* Report SSL error */
  11020. if (args->lastErr == 0) {
  11021. args->lastErr = ret; /* save error from last time */
  11022. ret = 0; /* reset error */
  11023. }
  11024. }
  11025. FreeDecodedCert(args->dCert);
  11026. args->dCertInit = 0;
  11027. args->count--;
  11028. } /* while (count > 0 && !args->haveTrustPeer) */
  11029. } /* if (count > 0) */
  11030. /* Check for error */
  11031. if (ret != 0) {
  11032. goto exit_ppc;
  11033. }
  11034. /* Advance state and proceed */
  11035. ssl->options.asyncState = TLS_ASYNC_DO;
  11036. } /* case TLS_ASYNC_BUILD */
  11037. FALL_THROUGH;
  11038. case TLS_ASYNC_DO:
  11039. {
  11040. /* peer's, may not have one if blank client cert sent by TLSv1.2 */
  11041. if (args->count > 0) {
  11042. WOLFSSL_MSG("Verifying Peer's cert");
  11043. /* select peer cert (first one) */
  11044. args->certIdx = 0;
  11045. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  11046. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  11047. &subjectHash, &alreadySigner);
  11048. #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \
  11049. (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \
  11050. !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  11051. if (ret == ASN_NO_SIGNER_E) {
  11052. WOLFSSL_MSG("try to load certificate if hash dir is set");
  11053. ret = LoadCertByIssuer(SSL_STORE(ssl),
  11054. (WOLFSSL_X509_NAME*)args->dCert->issuerName,
  11055. X509_LU_X509);
  11056. if (ret == WOLFSSL_SUCCESS) {
  11057. FreeDecodedCert(args->dCert);
  11058. args->dCertInit = 0;
  11059. /* once again */
  11060. ret = ProcessPeerCertParse(ssl, args, CERT_TYPE,
  11061. !ssl->options.verifyNone ? VERIFY : NO_VERIFY,
  11062. &subjectHash, &alreadySigner);
  11063. } else
  11064. ret = ASN_NO_SIGNER_E;
  11065. }
  11066. #endif
  11067. #ifdef WOLFSSL_ASYNC_CRYPT
  11068. if (ret == WC_PENDING_E)
  11069. goto exit_ppc;
  11070. #endif
  11071. if (ret == 0) {
  11072. WOLFSSL_MSG("Verified Peer's cert");
  11073. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11074. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11075. ssl->peerVerifyRet = X509_V_OK;
  11076. #endif
  11077. #if defined(SESSION_CERTS) && defined(WOLFSSL_ALT_CERT_CHAINS)
  11078. /* if using alternate chain, store the cert used */
  11079. if (ssl->options.usingAltCertChain) {
  11080. buffer* cert = &args->certs[args->certIdx];
  11081. AddSessionCertToChain(&ssl->session->altChain,
  11082. cert->buffer, cert->length);
  11083. }
  11084. #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
  11085. #ifndef OPENSSL_COMPATIBLE_DEFAULTS
  11086. /* Check peer's certificate version number. TLS 1.2 / 1.3
  11087. * requires the clients certificate be version 3 unless a
  11088. * different version has been negotiated using RFC 7250.
  11089. * OpenSSL doesn't appear to be performing this check.
  11090. * For TLS 1.3 see RFC8446 Section 4.4.2.3 */
  11091. if (ssl->options.side == WOLFSSL_SERVER_END) {
  11092. if (args->dCert->version != WOLFSSL_X509_V3) {
  11093. WOLFSSL_MSG("Peers certificate was not version 3!");
  11094. args->lastErr = ASN_VERSION_E;
  11095. /* setting last error but not considering it fatal
  11096. * giving the user a chance to override */
  11097. }
  11098. }
  11099. #endif
  11100. /* check if fatal error */
  11101. if (args->verifyErr) {
  11102. args->fatal = 1;
  11103. ret = args->lastErr;
  11104. }
  11105. else {
  11106. args->fatal = 0;
  11107. }
  11108. }
  11109. else if (ret == ASN_PARSE_E || ret == BUFFER_E) {
  11110. WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR");
  11111. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
  11112. defined(OPENSSL_EXTRA_X509_SMALL)
  11113. DoCertFatalAlert(ssl, ret);
  11114. #endif
  11115. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11116. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11117. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  11118. #endif
  11119. args->fatal = 1;
  11120. }
  11121. else {
  11122. WOLFSSL_MSG("Failed to verify Peer's cert");
  11123. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11124. if (ssl->peerVerifyRet == 0) { /* Return first cert error here */
  11125. if (ret == ASN_BEFORE_DATE_E) {
  11126. ssl->peerVerifyRet =
  11127. (unsigned long)X509_V_ERR_CERT_NOT_YET_VALID;
  11128. }
  11129. else if (ret == ASN_AFTER_DATE_E) {
  11130. ssl->peerVerifyRet =
  11131. (unsigned long)X509_V_ERR_CERT_HAS_EXPIRED;
  11132. }
  11133. else {
  11134. ssl->peerVerifyRet =
  11135. (unsigned long)
  11136. X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE;
  11137. }
  11138. }
  11139. #endif
  11140. if (ssl->verifyCallback) {
  11141. WOLFSSL_MSG(
  11142. "\tCallback override available, will continue");
  11143. /* check if fatal error */
  11144. args->fatal = (args->verifyErr) ? 1 : 0;
  11145. if (args->fatal)
  11146. DoCertFatalAlert(ssl, ret);
  11147. }
  11148. else {
  11149. WOLFSSL_MSG("\tNo callback override available, fatal");
  11150. args->fatal = 1;
  11151. DoCertFatalAlert(ssl, ret);
  11152. }
  11153. }
  11154. #ifdef HAVE_SECURE_RENEGOTIATION
  11155. if (args->fatal == 0 && !IsAtLeastTLSv1_3(ssl->version)
  11156. && ssl->secure_renegotiation
  11157. && ssl->secure_renegotiation->enabled) {
  11158. if (IsEncryptionOn(ssl, 0)) {
  11159. /* compare against previous time */
  11160. if (ssl->secure_renegotiation->subject_hash_set) {
  11161. if (XMEMCMP(args->dCert->subjectHash,
  11162. ssl->secure_renegotiation->subject_hash,
  11163. KEYID_SIZE) != 0) {
  11164. WOLFSSL_MSG(
  11165. "Peer sent different cert during scr, fatal");
  11166. args->fatal = 1;
  11167. ret = SCR_DIFFERENT_CERT_E;
  11168. }
  11169. }
  11170. }
  11171. /* cache peer's hash */
  11172. if (args->fatal == 0) {
  11173. XMEMCPY(ssl->secure_renegotiation->subject_hash,
  11174. args->dCert->subjectHash, KEYID_SIZE);
  11175. ssl->secure_renegotiation->subject_hash_set = 1;
  11176. }
  11177. }
  11178. #endif /* HAVE_SECURE_RENEGOTIATION */
  11179. } /* if (count > 0) */
  11180. /* Check for error */
  11181. if (args->fatal && ret != 0) {
  11182. goto exit_ppc;
  11183. }
  11184. /* Advance state and proceed */
  11185. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  11186. } /* case TLS_ASYNC_DO */
  11187. FALL_THROUGH;
  11188. case TLS_ASYNC_VERIFY:
  11189. {
  11190. if (args->count > 0) {
  11191. #if defined(HAVE_OCSP) || defined(HAVE_CRL)
  11192. /* only attempt to check OCSP or CRL if not previous error such
  11193. * as ASN_BEFORE_DATE_E or ASN_AFTER_DATE_E */
  11194. if (args->fatal == 0 && ret == 0) {
  11195. int doLookup = 1;
  11196. WOLFSSL_MSG("Checking if ocsp needed");
  11197. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11198. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  11199. if (ssl->status_request) {
  11200. args->fatal = (TLSX_CSR_InitRequest(ssl->extensions,
  11201. args->dCert, ssl->heap) != 0);
  11202. doLookup = 0;
  11203. WOLFSSL_MSG("\tHave status request");
  11204. #if defined(WOLFSSL_TLS13)
  11205. if (ssl->options.tls1_3) {
  11206. TLSX* ext = TLSX_Find(ssl->extensions,
  11207. TLSX_STATUS_REQUEST);
  11208. if (ext != NULL) {
  11209. word32 idx = 0;
  11210. CertificateStatusRequest* csr =
  11211. (CertificateStatusRequest*)ext->data;
  11212. ret = ProcessCSR(ssl, csr->response.buffer,
  11213. &idx, csr->response.length);
  11214. if (ret < 0)
  11215. goto exit_ppc;
  11216. }
  11217. }
  11218. #endif
  11219. }
  11220. /* Ensure a stapling response was seen */
  11221. else if (ssl->options.tls1_3 &&
  11222. SSL_CM(ssl)->ocspMustStaple) {
  11223. ret = OCSP_CERT_UNKNOWN;
  11224. goto exit_ppc;
  11225. }
  11226. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  11227. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  11228. if (ssl->status_request_v2) {
  11229. args->fatal = (TLSX_CSR2_InitRequests(ssl->extensions,
  11230. args->dCert, 1, ssl->heap) != 0);
  11231. doLookup = 0;
  11232. WOLFSSL_MSG("\tHave status request v2");
  11233. }
  11234. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  11235. }
  11236. #ifdef HAVE_OCSP
  11237. if (doLookup && SSL_CM(ssl)->ocspEnabled) {
  11238. WOLFSSL_MSG("Doing Leaf OCSP check");
  11239. ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp,
  11240. args->dCert, NULL, ssl);
  11241. #ifdef WOLFSSL_NONBLOCK_OCSP
  11242. if (ret == OCSP_WANT_READ) {
  11243. goto exit_ppc;
  11244. }
  11245. #endif
  11246. doLookup = (ret == OCSP_CERT_UNKNOWN);
  11247. if (ret != 0) {
  11248. WOLFSSL_MSG("\tOCSP Lookup not ok");
  11249. args->fatal = 0;
  11250. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11251. if (ssl->peerVerifyRet == 0) {
  11252. /* Return first cert error here */
  11253. ssl->peerVerifyRet =
  11254. ret == OCSP_CERT_REVOKED
  11255. ? X509_V_ERR_CERT_REVOKED
  11256. : X509_V_ERR_CERT_REJECTED;
  11257. }
  11258. #endif
  11259. }
  11260. }
  11261. #endif /* HAVE_OCSP */
  11262. #ifdef HAVE_CRL
  11263. if (ret == 0 && doLookup && SSL_CM(ssl)->crlEnabled) {
  11264. WOLFSSL_MSG("Doing Leaf CRL check");
  11265. ret = CheckCertCRL(SSL_CM(ssl)->crl, args->dCert);
  11266. #ifdef WOLFSSL_NONBLOCK_OCSP
  11267. if (ret == OCSP_WANT_READ) {
  11268. goto exit_ppc;
  11269. }
  11270. #endif
  11271. if (ret != 0) {
  11272. WOLFSSL_MSG("\tCRL check not ok");
  11273. args->fatal = 0;
  11274. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11275. if (ssl->peerVerifyRet == 0) {
  11276. /* Return first cert error here */
  11277. ssl->peerVerifyRet =
  11278. ret == CRL_CERT_REVOKED
  11279. ? X509_V_ERR_CERT_REVOKED
  11280. : X509_V_ERR_CERT_REJECTED;;
  11281. }
  11282. #endif
  11283. }
  11284. }
  11285. #endif /* HAVE_CRL */
  11286. (void)doLookup;
  11287. }
  11288. #endif /* HAVE_OCSP || HAVE_CRL */
  11289. #ifdef KEEP_PEER_CERT
  11290. if (args->fatal == 0) {
  11291. int copyRet = 0;
  11292. #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
  11293. if (ssl->options.handShakeDone) {
  11294. FreeX509(&ssl->peerCert);
  11295. InitX509(&ssl->peerCert, 0, ssl->heap);
  11296. }
  11297. else
  11298. #endif
  11299. #ifdef HAVE_SECURE_RENEGOTIATION
  11300. if (ssl->secure_renegotiation &&
  11301. ssl->secure_renegotiation->enabled) {
  11302. /* free old peer cert */
  11303. FreeX509(&ssl->peerCert);
  11304. InitX509(&ssl->peerCert, 0, ssl->heap);
  11305. }
  11306. else
  11307. #endif
  11308. {
  11309. }
  11310. /* set X509 format for peer cert */
  11311. copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert);
  11312. if (copyRet == MEMORY_E) {
  11313. args->fatal = 1;
  11314. }
  11315. }
  11316. #endif /* KEEP_PEER_CERT */
  11317. #ifndef IGNORE_KEY_EXTENSIONS
  11318. #if defined(OPENSSL_EXTRA)
  11319. /* when compatibility layer is turned on and no verify is
  11320. * set then ignore the certificate key extension */
  11321. if (args->dCert->extKeyUsageSet &&
  11322. args->dCert->extKeyUsageCrit == 0 &&
  11323. ssl->options.verifyNone) {
  11324. WOLFSSL_MSG("Not verifying certificate key usage");
  11325. }
  11326. else
  11327. #endif
  11328. if (args->dCert->extKeyUsageSet) {
  11329. if ((ssl->specs.kea == rsa_kea) &&
  11330. (ssl->options.side == WOLFSSL_CLIENT_END) &&
  11331. (args->dCert->extKeyUsage & KEYUSE_KEY_ENCIPHER) == 0) {
  11332. ret = KEYUSE_ENCIPHER_E;
  11333. }
  11334. if ((ssl->specs.sig_algo == rsa_sa_algo ||
  11335. (ssl->specs.sig_algo == ecc_dsa_sa_algo &&
  11336. !ssl->specs.static_ecdh)) &&
  11337. (args->dCert->extKeyUsage & KEYUSE_DIGITAL_SIG) == 0) {
  11338. WOLFSSL_MSG("KeyUse Digital Sig not set");
  11339. ret = KEYUSE_SIGNATURE_E;
  11340. }
  11341. }
  11342. #if defined(OPENSSL_EXTRA)
  11343. /* when compatibility layer is turned on and no verify is
  11344. * set then ignore the certificate key extension */
  11345. if (args->dCert->extExtKeyUsageSet &&
  11346. args->dCert->extExtKeyUsageCrit == 0 &&
  11347. ssl->options.verifyNone) {
  11348. WOLFSSL_MSG("Not verifying certificate ext key usage");
  11349. }
  11350. else
  11351. #endif
  11352. if (args->dCert->extExtKeyUsageSet) {
  11353. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  11354. if ((args->dCert->extExtKeyUsage &
  11355. (EXTKEYUSE_ANY | EXTKEYUSE_SERVER_AUTH)) == 0) {
  11356. WOLFSSL_MSG("ExtKeyUse Server Auth not set");
  11357. ret = EXTKEYUSE_AUTH_E;
  11358. }
  11359. }
  11360. else {
  11361. if ((args->dCert->extExtKeyUsage &
  11362. (EXTKEYUSE_ANY | EXTKEYUSE_CLIENT_AUTH)) == 0) {
  11363. WOLFSSL_MSG("ExtKeyUse Client Auth not set");
  11364. ret = EXTKEYUSE_AUTH_E;
  11365. }
  11366. }
  11367. }
  11368. #endif /* IGNORE_KEY_EXTENSIONS */
  11369. if (args->fatal) {
  11370. ssl->error = ret;
  11371. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11372. SendAlert(ssl, alert_fatal, bad_certificate);
  11373. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11374. ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
  11375. #endif
  11376. goto exit_ppc;
  11377. }
  11378. /* Certificate validated and stored. */
  11379. ssl->options.havePeerCert = 1;
  11380. #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_RSA)
  11381. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  11382. ssl->specs.sig_algo == rsa_kea) {
  11383. /* CLIENT: No ServerKeyExchange message sent by server. */
  11384. ssl->options.peerAuthGood = 1;
  11385. }
  11386. #endif
  11387. #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_ECC)
  11388. if (ssl->options.side == WOLFSSL_CLIENT_END &&
  11389. ssl->specs.static_ecdh) {
  11390. /* CLIENT: No ServerKeyExchange message sent by server. */
  11391. ssl->options.peerAuthGood = 1;
  11392. }
  11393. #endif
  11394. if (!ssl->options.verifyNone && ssl->buffers.domainName.buffer) {
  11395. #ifndef WOLFSSL_ALLOW_NO_CN_IN_SAN
  11396. /* Per RFC 5280 section 4.2.1.6, "Whenever such identities
  11397. * are to be bound into a certificate, the subject
  11398. * alternative name extension MUST be used." */
  11399. if (args->dCert->altNames) {
  11400. if (CheckForAltNames(args->dCert,
  11401. (char*)ssl->buffers.domainName.buffer,
  11402. NULL) != 1) {
  11403. WOLFSSL_MSG("DomainName match on alt names failed");
  11404. /* try to get peer key still */
  11405. ret = DOMAIN_NAME_MISMATCH;
  11406. }
  11407. }
  11408. else {
  11409. if (MatchDomainName(
  11410. args->dCert->subjectCN,
  11411. args->dCert->subjectCNLen,
  11412. (char*)ssl->buffers.domainName.buffer) == 0) {
  11413. WOLFSSL_MSG("DomainName match on common name failed");
  11414. ret = DOMAIN_NAME_MISMATCH;
  11415. }
  11416. }
  11417. #else /* WOLFSSL_ALL_NO_CN_IN_SAN */
  11418. /* Old behavior. */
  11419. if (MatchDomainName(args->dCert->subjectCN,
  11420. args->dCert->subjectCNLen,
  11421. (char*)ssl->buffers.domainName.buffer) == 0) {
  11422. WOLFSSL_MSG("DomainName match on common name failed");
  11423. if (CheckForAltNames(args->dCert,
  11424. (char*)ssl->buffers.domainName.buffer,
  11425. NULL) != 1) {
  11426. WOLFSSL_MSG(
  11427. "DomainName match on alt names failed too");
  11428. /* try to get peer key still */
  11429. ret = DOMAIN_NAME_MISMATCH;
  11430. }
  11431. }
  11432. #endif /* WOLFSSL_ALL_NO_CN_IN_SAN */
  11433. }
  11434. /* decode peer key */
  11435. switch (args->dCert->keyOID) {
  11436. #ifndef NO_RSA
  11437. case RSAk:
  11438. {
  11439. word32 keyIdx = 0;
  11440. int keyRet = 0;
  11441. if (ssl->peerRsaKey == NULL) {
  11442. keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA,
  11443. (void**)&ssl->peerRsaKey);
  11444. } else if (ssl->peerRsaKeyPresent) {
  11445. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_RSA,
  11446. ssl->peerRsaKey);
  11447. ssl->peerRsaKeyPresent = 0;
  11448. }
  11449. if (keyRet != 0 || wc_RsaPublicKeyDecode(
  11450. args->dCert->publicKey, &keyIdx, ssl->peerRsaKey,
  11451. args->dCert->pubKeySize) != 0) {
  11452. ret = PEER_KEY_ERROR;
  11453. }
  11454. else {
  11455. ssl->peerRsaKeyPresent = 1;
  11456. #if defined(WOLFSSL_RENESAS_TSIP_TLS) || \
  11457. defined(WOLFSSL_RENESAS_SCEPROTECT)
  11458. /* copy encrypted tsip key index into ssl object */
  11459. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  11460. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  11461. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  11462. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  11463. ssl->heap, DYNAMIC_TYPE_RSA);
  11464. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  11465. args->lastErr = MEMORY_E;
  11466. goto exit_ppc;
  11467. }
  11468. }
  11469. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  11470. args->dCert->sce_tsip_encRsaKeyIdx,
  11471. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  11472. }
  11473. #endif
  11474. #ifdef HAVE_PK_CALLBACKS
  11475. #if defined(HAVE_SECURE_RENEGOTIATION) || \
  11476. defined(WOLFSSL_POST_HANDSHAKE_AUTH)
  11477. if (ssl->buffers.peerRsaKey.buffer) {
  11478. XFREE(ssl->buffers.peerRsaKey.buffer,
  11479. ssl->heap, DYNAMIC_TYPE_RSA);
  11480. ssl->buffers.peerRsaKey.buffer = NULL;
  11481. }
  11482. #endif
  11483. ssl->buffers.peerRsaKey.buffer =
  11484. (byte*)XMALLOC(args->dCert->pubKeySize,
  11485. ssl->heap, DYNAMIC_TYPE_RSA);
  11486. if (ssl->buffers.peerRsaKey.buffer == NULL) {
  11487. ret = MEMORY_ERROR;
  11488. }
  11489. else {
  11490. XMEMCPY(ssl->buffers.peerRsaKey.buffer,
  11491. args->dCert->publicKey,
  11492. args->dCert->pubKeySize);
  11493. ssl->buffers.peerRsaKey.length =
  11494. args->dCert->pubKeySize;
  11495. }
  11496. #endif /* HAVE_PK_CALLBACKS */
  11497. }
  11498. /* check size of peer RSA key */
  11499. if (ret == 0 && ssl->peerRsaKeyPresent &&
  11500. !ssl->options.verifyNone &&
  11501. wc_RsaEncryptSize(ssl->peerRsaKey)
  11502. < ssl->options.minRsaKeySz) {
  11503. ret = RSA_KEY_SIZE_E;
  11504. WOLFSSL_MSG("Peer RSA key is too small");
  11505. }
  11506. break;
  11507. }
  11508. #endif /* NO_RSA */
  11509. #ifdef HAVE_ECC
  11510. case ECDSAk:
  11511. {
  11512. int keyRet = 0;
  11513. word32 idx = 0;
  11514. #if defined(WOLFSSL_RENESAS_SCEPROTECT) || \
  11515. defined(WOLFSSL_RENESAS_TSIP_TLS)
  11516. /* copy encrypted tsip/sce key index into ssl object */
  11517. if (args->dCert->sce_tsip_encRsaKeyIdx) {
  11518. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  11519. ssl->peerSceTsipEncRsaKeyIndex = (byte*)XMALLOC(
  11520. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY,
  11521. ssl->heap, DYNAMIC_TYPE_RSA);
  11522. if (!ssl->peerSceTsipEncRsaKeyIndex) {
  11523. args->lastErr = MEMORY_E;
  11524. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  11525. }
  11526. }
  11527. XMEMCPY(ssl->peerSceTsipEncRsaKeyIndex,
  11528. args->dCert->sce_tsip_encRsaKeyIdx,
  11529. TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY);
  11530. }
  11531. #endif
  11532. if (ssl->peerEccDsaKey == NULL) {
  11533. /* alloc/init on demand */
  11534. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  11535. (void**)&ssl->peerEccDsaKey);
  11536. } else if (ssl->peerEccDsaKeyPresent) {
  11537. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  11538. ssl->peerEccDsaKey);
  11539. ssl->peerEccDsaKeyPresent = 0;
  11540. }
  11541. if (keyRet != 0 ||
  11542. wc_EccPublicKeyDecode(args->dCert->publicKey, &idx,
  11543. ssl->peerEccDsaKey,
  11544. args->dCert->pubKeySize) != 0) {
  11545. ret = PEER_KEY_ERROR;
  11546. }
  11547. else {
  11548. ssl->peerEccDsaKeyPresent = 1;
  11549. #ifdef HAVE_PK_CALLBACKS
  11550. if (ssl->buffers.peerEccDsaKey.buffer)
  11551. XFREE(ssl->buffers.peerEccDsaKey.buffer,
  11552. ssl->heap, DYNAMIC_TYPE_ECC);
  11553. ssl->buffers.peerEccDsaKey.buffer =
  11554. (byte*)XMALLOC(args->dCert->pubKeySize,
  11555. ssl->heap, DYNAMIC_TYPE_ECC);
  11556. if (ssl->buffers.peerEccDsaKey.buffer == NULL) {
  11557. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  11558. }
  11559. else {
  11560. XMEMCPY(ssl->buffers.peerEccDsaKey.buffer,
  11561. args->dCert->publicKey,
  11562. args->dCert->pubKeySize);
  11563. ssl->buffers.peerEccDsaKey.length =
  11564. args->dCert->pubKeySize;
  11565. }
  11566. #endif /* HAVE_PK_CALLBACKS */
  11567. }
  11568. /* check size of peer ECC key */
  11569. if (ret == 0 && ssl->peerEccDsaKeyPresent &&
  11570. !ssl->options.verifyNone &&
  11571. wc_ecc_size(ssl->peerEccDsaKey)
  11572. < ssl->options.minEccKeySz) {
  11573. ret = ECC_KEY_SIZE_E;
  11574. WOLFSSL_MSG("Peer ECC key is too small");
  11575. }
  11576. /* populate curve oid - if missing */
  11577. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  11578. ssl->ecdhCurveOID = args->dCert->pkCurveOID;
  11579. break;
  11580. }
  11581. #endif /* HAVE_ECC */
  11582. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  11583. case ED25519k:
  11584. {
  11585. int keyRet = 0;
  11586. if (ssl->peerEd25519Key == NULL) {
  11587. /* alloc/init on demand */
  11588. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED25519,
  11589. (void**)&ssl->peerEd25519Key);
  11590. } else if (ssl->peerEd25519KeyPresent) {
  11591. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED25519,
  11592. ssl->peerEd25519Key);
  11593. ssl->peerEd25519KeyPresent = 0;
  11594. }
  11595. if (keyRet != 0 ||
  11596. wc_ed25519_import_public(args->dCert->publicKey,
  11597. args->dCert->pubKeySize,
  11598. ssl->peerEd25519Key)
  11599. != 0) {
  11600. ret = PEER_KEY_ERROR;
  11601. }
  11602. else {
  11603. ssl->peerEd25519KeyPresent = 1;
  11604. #ifdef HAVE_PK_CALLBACKS
  11605. ssl->buffers.peerEd25519Key.buffer =
  11606. (byte*)XMALLOC(args->dCert->pubKeySize,
  11607. ssl->heap, DYNAMIC_TYPE_ED25519);
  11608. if (ssl->buffers.peerEd25519Key.buffer == NULL) {
  11609. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  11610. }
  11611. else {
  11612. XMEMCPY(ssl->buffers.peerEd25519Key.buffer,
  11613. args->dCert->publicKey,
  11614. args->dCert->pubKeySize);
  11615. ssl->buffers.peerEd25519Key.length =
  11616. args->dCert->pubKeySize;
  11617. }
  11618. #endif /*HAVE_PK_CALLBACKS */
  11619. }
  11620. /* check size of peer ECC key */
  11621. if (ret == 0 && ssl->peerEd25519KeyPresent &&
  11622. !ssl->options.verifyNone &&
  11623. ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  11624. ret = ECC_KEY_SIZE_E;
  11625. WOLFSSL_MSG("Peer ECC key is too small");
  11626. }
  11627. /* populate curve oid - if missing */
  11628. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  11629. ssl->ecdhCurveOID = ECC_X25519_OID;
  11630. break;
  11631. }
  11632. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  11633. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  11634. case ED448k:
  11635. {
  11636. int keyRet = 0;
  11637. if (ssl->peerEd448Key == NULL) {
  11638. /* alloc/init on demand */
  11639. keyRet = AllocKey(ssl, DYNAMIC_TYPE_ED448,
  11640. (void**)&ssl->peerEd448Key);
  11641. } else if (ssl->peerEd448KeyPresent) {
  11642. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_ED448,
  11643. ssl->peerEd448Key);
  11644. ssl->peerEd448KeyPresent = 0;
  11645. }
  11646. if (keyRet != 0 ||
  11647. wc_ed448_import_public(args->dCert->publicKey,
  11648. args->dCert->pubKeySize,
  11649. ssl->peerEd448Key) != 0) {
  11650. ret = PEER_KEY_ERROR;
  11651. }
  11652. else {
  11653. ssl->peerEd448KeyPresent = 1;
  11654. #ifdef HAVE_PK_CALLBACKS
  11655. ssl->buffers.peerEd448Key.buffer =
  11656. (byte*)XMALLOC(args->dCert->pubKeySize,
  11657. ssl->heap, DYNAMIC_TYPE_ED448);
  11658. if (ssl->buffers.peerEd448Key.buffer == NULL) {
  11659. ERROR_OUT(MEMORY_ERROR, exit_ppc);
  11660. }
  11661. else {
  11662. XMEMCPY(ssl->buffers.peerEd448Key.buffer,
  11663. args->dCert->publicKey,
  11664. args->dCert->pubKeySize);
  11665. ssl->buffers.peerEd448Key.length =
  11666. args->dCert->pubKeySize;
  11667. }
  11668. #endif /*HAVE_PK_CALLBACKS */
  11669. }
  11670. /* check size of peer ECC key */
  11671. if (ret == 0 && ssl->peerEd448KeyPresent &&
  11672. !ssl->options.verifyNone &&
  11673. ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  11674. ret = ECC_KEY_SIZE_E;
  11675. WOLFSSL_MSG("Peer ECC key is too small");
  11676. }
  11677. /* populate curve oid - if missing */
  11678. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
  11679. ssl->ecdhCurveOID = ECC_X448_OID;
  11680. break;
  11681. }
  11682. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  11683. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  11684. case FALCON_LEVEL1k:
  11685. case FALCON_LEVEL5k:
  11686. {
  11687. int keyRet = 0;
  11688. if (ssl->peerFalconKey == NULL) {
  11689. /* alloc/init on demand */
  11690. keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON,
  11691. (void**)&ssl->peerFalconKey);
  11692. } else if (ssl->peerFalconKeyPresent) {
  11693. keyRet = ReuseKey(ssl, DYNAMIC_TYPE_FALCON,
  11694. ssl->peerFalconKey);
  11695. ssl->peerFalconKeyPresent = 0;
  11696. }
  11697. if (keyRet == 0) {
  11698. if (args->dCert->keyOID == FALCON_LEVEL1k) {
  11699. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  11700. 1);
  11701. }
  11702. else {
  11703. keyRet = wc_falcon_set_level(ssl->peerFalconKey,
  11704. 5);
  11705. }
  11706. }
  11707. if (keyRet != 0 ||
  11708. wc_falcon_import_public(args->dCert->publicKey,
  11709. args->dCert->pubKeySize,
  11710. ssl->peerFalconKey) != 0) {
  11711. ret = PEER_KEY_ERROR;
  11712. }
  11713. else {
  11714. ssl->peerFalconKeyPresent = 1;
  11715. }
  11716. /* check size of peer Falcon key */
  11717. if (ret == 0 && ssl->peerFalconKeyPresent &&
  11718. !ssl->options.verifyNone &&
  11719. FALCON_MAX_KEY_SIZE <
  11720. ssl->options.minFalconKeySz) {
  11721. ret = FALCON_KEY_SIZE_E;
  11722. WOLFSSL_MSG("Peer Falcon key is too small");
  11723. }
  11724. }
  11725. #endif /* HAVE_PQC && HAVE_FALCON */
  11726. default:
  11727. break;
  11728. }
  11729. /* args->dCert free'd in function cleanup after callback */
  11730. } /* if (count > 0) */
  11731. /* Check for error */
  11732. if (args->fatal && ret != 0) {
  11733. goto exit_ppc;
  11734. }
  11735. /* Advance state and proceed */
  11736. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  11737. } /* case TLS_ASYNC_VERIFY */
  11738. FALL_THROUGH;
  11739. case TLS_ASYNC_FINALIZE:
  11740. {
  11741. /* load last error */
  11742. if (args->lastErr != 0 && ret == 0) {
  11743. ret = args->lastErr;
  11744. }
  11745. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
  11746. /* limit compliant with OpenSSL verify Depth + 1
  11747. * OpenSSL tries to expand the chain one longer than limit until
  11748. * reaching an ultimately trusted issuer. Becoming failure if
  11749. * we hit the limit, with X509_V_ERR_CERT_CHAIN_TOO_LONG
  11750. */
  11751. if (args->untrustedDepth > (ssl->options.verifyDepth + 1)) {
  11752. if (ssl->peerVerifyRet == 0) /* Return first cert error here */
  11753. ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
  11754. ret = MAX_CHAIN_ERROR;
  11755. }
  11756. #endif
  11757. /* Do verify callback */
  11758. ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args);
  11759. if (ssl->options.verifyNone &&
  11760. (ret == CRL_MISSING || ret == CRL_CERT_REVOKED ||
  11761. ret == CRL_CERT_DATE_ERR)) {
  11762. WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
  11763. ret = ssl->error = 0;
  11764. }
  11765. if (ret != 0) {
  11766. if (!ssl->options.verifyNone) {
  11767. DoCertFatalAlert(ssl, ret);
  11768. }
  11769. ssl->error = ret; /* Report SSL error */
  11770. }
  11771. if (ret == 0 && ssl->options.side == WOLFSSL_CLIENT_END) {
  11772. ssl->options.serverState = SERVER_CERT_COMPLETE;
  11773. }
  11774. if (IsEncryptionOn(ssl, 0)) {
  11775. args->idx += ssl->keys.padSz;
  11776. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11777. if (ssl->options.startedETMRead)
  11778. args->idx += MacSize(ssl);
  11779. #endif
  11780. }
  11781. /* Advance state and proceed */
  11782. ssl->options.asyncState = TLS_ASYNC_END;
  11783. } /* case TLS_ASYNC_FINALIZE */
  11784. FALL_THROUGH;
  11785. case TLS_ASYNC_END:
  11786. {
  11787. /* Set final index */
  11788. *inOutIdx = args->idx;
  11789. break;
  11790. }
  11791. default:
  11792. ret = INPUT_CASE_ERROR;
  11793. break;
  11794. } /* switch(ssl->options.asyncState) */
  11795. exit_ppc:
  11796. WOLFSSL_LEAVE("ProcessPeerCerts", ret);
  11797. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11798. if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) {
  11799. /* Mark message as not received so it can process again */
  11800. ssl->msgsReceived.got_certificate = 0;
  11801. return ret;
  11802. }
  11803. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  11804. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  11805. /* Cleanup async */
  11806. FreeAsyncCtx(ssl, 0);
  11807. #elif defined(WOLFSSL_SMALL_STACK)
  11808. if (args)
  11809. {
  11810. FreeProcPeerCertArgs(ssl, args);
  11811. }
  11812. #else
  11813. FreeProcPeerCertArgs(ssl, args);
  11814. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
  11815. #if defined(WOLFSSL_ASYNC_CRYPT)
  11816. #elif defined(WOLFSSL_SMALL_STACK)
  11817. XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
  11818. #endif
  11819. FreeKeyExchange(ssl);
  11820. return ret;
  11821. }
  11822. #endif
  11823. #ifndef WOLFSSL_NO_TLS12
  11824. #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  11825. /* handle processing of certificate (11) */
  11826. static int DoCertificate(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11827. word32 size)
  11828. {
  11829. int ret;
  11830. WOLFSSL_START(WC_FUNC_CERTIFICATE_DO);
  11831. WOLFSSL_ENTER("DoCertificate");
  11832. #ifdef SESSION_CERTS
  11833. /* Reset the session cert chain count in case the session resume failed. */
  11834. ssl->session->chain.count = 0;
  11835. #ifdef WOLFSSL_ALT_CERT_CHAINS
  11836. ssl->session->altChain.count = 0;
  11837. #endif
  11838. #endif /* SESSION_CERTS */
  11839. ret = ProcessPeerCerts(ssl, input, inOutIdx, size);
  11840. #ifdef WOLFSSL_EXTRA_ALERTS
  11841. if (ret == BUFFER_ERROR || ret == ASN_PARSE_E)
  11842. SendAlert(ssl, alert_fatal, decode_error);
  11843. #endif
  11844. #ifdef OPENSSL_EXTRA
  11845. ssl->options.serverState = SERVER_CERT_COMPLETE;
  11846. #endif
  11847. WOLFSSL_LEAVE("DoCertificate", ret);
  11848. WOLFSSL_END(WC_FUNC_CERTIFICATE_DO);
  11849. return ret;
  11850. }
  11851. /* handle processing of certificate_status (22) */
  11852. static int DoCertificateStatus(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  11853. word32 size)
  11854. {
  11855. int ret = 0;
  11856. byte status_type;
  11857. word32 status_length;
  11858. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO);
  11859. WOLFSSL_ENTER("DoCertificateStatus");
  11860. if (size < ENUM_LEN + OPAQUE24_LEN)
  11861. return BUFFER_ERROR;
  11862. status_type = input[(*inOutIdx)++];
  11863. c24to32(input + *inOutIdx, &status_length);
  11864. *inOutIdx += OPAQUE24_LEN;
  11865. if (size != ENUM_LEN + OPAQUE24_LEN + status_length)
  11866. return BUFFER_ERROR;
  11867. switch (status_type) {
  11868. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  11869. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  11870. /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */
  11871. case WOLFSSL_CSR2_OCSP:
  11872. ret = ProcessCSR(ssl, input, inOutIdx, status_length);
  11873. break;
  11874. #endif
  11875. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  11876. case WOLFSSL_CSR2_OCSP_MULTI: {
  11877. OcspRequest* request;
  11878. word32 list_length = status_length;
  11879. byte idx = 0;
  11880. #ifdef WOLFSSL_SMALL_STACK
  11881. CertStatus* status;
  11882. OcspEntry* single;
  11883. OcspResponse* response;
  11884. #else
  11885. CertStatus status[1];
  11886. OcspEntry single[1];
  11887. OcspResponse response[1];
  11888. #endif
  11889. do {
  11890. if (ssl->status_request_v2) {
  11891. ssl->status_request_v2 = 0;
  11892. break;
  11893. }
  11894. return BUFFER_ERROR;
  11895. } while(0);
  11896. #ifdef WOLFSSL_SMALL_STACK
  11897. status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
  11898. DYNAMIC_TYPE_OCSP_STATUS);
  11899. single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
  11900. DYNAMIC_TYPE_OCSP_ENTRY);
  11901. response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
  11902. DYNAMIC_TYPE_OCSP_REQUEST);
  11903. if (status == NULL || single == NULL || response == NULL) {
  11904. if (status)
  11905. XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
  11906. if (single)
  11907. XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
  11908. if (response)
  11909. XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  11910. return MEMORY_ERROR;
  11911. }
  11912. #endif
  11913. while (list_length && ret == 0) {
  11914. if (OPAQUE24_LEN > list_length) {
  11915. ret = BUFFER_ERROR;
  11916. break;
  11917. }
  11918. c24to32(input + *inOutIdx, &status_length);
  11919. *inOutIdx += OPAQUE24_LEN;
  11920. list_length -= OPAQUE24_LEN;
  11921. if (status_length > list_length) {
  11922. ret = BUFFER_ERROR;
  11923. break;
  11924. }
  11925. if (status_length) {
  11926. InitOcspResponse(response, single, status, input +*inOutIdx,
  11927. status_length, ssl->heap);
  11928. if ((OcspResponseDecode(response, SSL_CM(ssl), ssl->heap,
  11929. 0) != 0)
  11930. || (response->responseStatus != OCSP_SUCCESSFUL)
  11931. || (response->single->status->status != CERT_GOOD))
  11932. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11933. while (ret == 0) {
  11934. request = (OcspRequest*)TLSX_CSR2_GetRequest(
  11935. ssl->extensions, status_type, idx++);
  11936. if (request == NULL)
  11937. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11938. else if (CompareOcspReqResp(request, response) == 0)
  11939. break;
  11940. else if (idx == 1) /* server cert must be OK */
  11941. ret = BAD_CERTIFICATE_STATUS_ERROR;
  11942. }
  11943. FreeOcspResponse(response);
  11944. *inOutIdx += status_length;
  11945. list_length -= status_length;
  11946. }
  11947. }
  11948. ssl->status_request_v2 = 0;
  11949. #ifdef WOLFSSL_SMALL_STACK
  11950. XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
  11951. XFREE(single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
  11952. XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
  11953. #endif
  11954. }
  11955. break;
  11956. #endif
  11957. default:
  11958. ret = BUFFER_ERROR;
  11959. }
  11960. if (ret != 0)
  11961. SendAlert(ssl, alert_fatal, bad_certificate_status_response);
  11962. if (IsEncryptionOn(ssl, 0)) {
  11963. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11964. if (ssl->options.startedETMRead) {
  11965. word32 digestSz = MacSize(ssl);
  11966. if (*inOutIdx + ssl->keys.padSz + digestSz > size)
  11967. return BUFFER_E;
  11968. *inOutIdx += ssl->keys.padSz + digestSz;
  11969. }
  11970. else
  11971. #endif
  11972. {
  11973. if (*inOutIdx + ssl->keys.padSz > size)
  11974. return BUFFER_E;
  11975. *inOutIdx += ssl->keys.padSz;
  11976. }
  11977. }
  11978. WOLFSSL_LEAVE("DoCertificateStatus", ret);
  11979. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_DO);
  11980. return ret;
  11981. }
  11982. #endif
  11983. #endif /* !WOLFSSL_NO_TLS12 */
  11984. #endif /* !NO_CERTS */
  11985. #ifndef WOLFSSL_NO_TLS12
  11986. static int DoHelloRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  11987. word32 size, word32 totalSz)
  11988. {
  11989. (void)input;
  11990. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_DO);
  11991. WOLFSSL_ENTER("DoHelloRequest");
  11992. if (size) /* must be 0 */
  11993. return BUFFER_ERROR;
  11994. if (IsEncryptionOn(ssl, 0)) {
  11995. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  11996. * about padding */
  11997. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  11998. if (ssl->options.startedETMRead) {
  11999. word32 digestSz = MacSize(ssl);
  12000. if (size != totalSz &&
  12001. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  12002. return BUFFER_E;
  12003. *inOutIdx += ssl->keys.padSz + digestSz;
  12004. }
  12005. else
  12006. #endif
  12007. {
  12008. /* access beyond input + size should be checked against totalSz */
  12009. if (size != totalSz &&
  12010. *inOutIdx + ssl->keys.padSz > totalSz)
  12011. return BUFFER_E;
  12012. *inOutIdx += ssl->keys.padSz;
  12013. }
  12014. }
  12015. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12016. SendAlert(ssl, alert_fatal, unexpected_message); /* try */
  12017. return FATAL_ERROR;
  12018. }
  12019. #ifdef HAVE_SECURE_RENEGOTIATION
  12020. else if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  12021. ssl->secure_renegotiation->startScr = 1;
  12022. WOLFSSL_LEAVE("DoHelloRequest", 0);
  12023. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_DO);
  12024. return 0;
  12025. }
  12026. #endif
  12027. else {
  12028. return SendAlert(ssl, alert_warning, no_renegotiation);
  12029. }
  12030. }
  12031. int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size,
  12032. word32 totalSz, int sniff)
  12033. {
  12034. word32 finishedSz = (ssl->options.tls ? TLS_FINISHED_SZ : FINISHED_SZ);
  12035. WOLFSSL_START(WC_FUNC_FINISHED_DO);
  12036. WOLFSSL_ENTER("DoFinished");
  12037. if (finishedSz != size)
  12038. return BUFFER_ERROR;
  12039. /* check against totalSz
  12040. * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
  12041. * padding */
  12042. if (size != totalSz) {
  12043. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12044. if (ssl->options.startedETMRead) {
  12045. if (*inOutIdx + size + ssl->keys.padSz + MacSize(ssl) > totalSz)
  12046. return BUFFER_E;
  12047. }
  12048. else
  12049. #endif
  12050. {
  12051. if (*inOutIdx + size + ssl->keys.padSz > totalSz)
  12052. return BUFFER_E;
  12053. }
  12054. }
  12055. #ifdef WOLFSSL_CALLBACKS
  12056. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  12057. if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
  12058. #endif
  12059. if (sniff == NO_SNIFF) {
  12060. if (XMEMCMP(input + *inOutIdx, &ssl->hsHashes->verifyHashes,size) != 0){
  12061. WOLFSSL_MSG("Verify finished error on hashes");
  12062. #ifdef WOLFSSL_EXTRA_ALERTS
  12063. SendAlert(ssl, alert_fatal, decrypt_error);
  12064. #endif
  12065. return VERIFY_FINISHED_ERROR;
  12066. }
  12067. }
  12068. #ifdef HAVE_SECURE_RENEGOTIATION
  12069. if (ssl->secure_renegotiation) {
  12070. /* save peer's state */
  12071. if (ssl->options.side == WOLFSSL_CLIENT_END)
  12072. XMEMCPY(ssl->secure_renegotiation->server_verify_data,
  12073. input + *inOutIdx, TLS_FINISHED_SZ);
  12074. else
  12075. XMEMCPY(ssl->secure_renegotiation->client_verify_data,
  12076. input + *inOutIdx, TLS_FINISHED_SZ);
  12077. ssl->secure_renegotiation->verifySet = 1;
  12078. }
  12079. #endif
  12080. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  12081. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12082. XMEMCPY(ssl->serverFinished,
  12083. input + *inOutIdx, TLS_FINISHED_SZ);
  12084. ssl->serverFinished_len = TLS_FINISHED_SZ;
  12085. }
  12086. else {
  12087. XMEMCPY(ssl->clientFinished,
  12088. input + *inOutIdx, TLS_FINISHED_SZ);
  12089. ssl->clientFinished_len = TLS_FINISHED_SZ;
  12090. }
  12091. #endif
  12092. /* force input exhaustion at ProcessReply consuming padSz */
  12093. *inOutIdx += size + ssl->keys.padSz;
  12094. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12095. if (ssl->options.startedETMRead)
  12096. *inOutIdx += MacSize(ssl);
  12097. #endif
  12098. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12099. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  12100. #ifdef OPENSSL_EXTRA
  12101. ssl->cbmode = SSL_CB_MODE_WRITE;
  12102. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  12103. #endif
  12104. if (!ssl->options.resuming) {
  12105. #ifdef OPENSSL_EXTRA
  12106. if (ssl->CBIS != NULL) {
  12107. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  12108. }
  12109. #endif
  12110. ssl->options.handShakeState = HANDSHAKE_DONE;
  12111. ssl->options.handShakeDone = 1;
  12112. }
  12113. }
  12114. else {
  12115. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  12116. #ifdef OPENSSL_EXTRA
  12117. ssl->cbmode = SSL_CB_MODE_READ;
  12118. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  12119. #endif
  12120. if (ssl->options.resuming) {
  12121. #ifdef OPENSSL_EXTRA
  12122. if (ssl->CBIS != NULL) {
  12123. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  12124. }
  12125. #endif
  12126. ssl->options.handShakeState = HANDSHAKE_DONE;
  12127. ssl->options.handShakeDone = 1;
  12128. }
  12129. }
  12130. #ifdef WOLFSSL_DTLS
  12131. if (ssl->options.dtls) {
  12132. if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
  12133. (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
  12134. DtlsMsgPoolReset(ssl);
  12135. ssl->keys.dtls_handshake_number = 0;
  12136. ssl->keys.dtls_expected_peer_handshake_number = 0;
  12137. }
  12138. }
  12139. #endif
  12140. WOLFSSL_LEAVE("DoFinished", 0);
  12141. WOLFSSL_END(WC_FUNC_FINISHED_DO);
  12142. return 0;
  12143. }
  12144. /* Make sure no duplicates, no fast forward, or other problems; 0 on success */
  12145. static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type)
  12146. {
  12147. /* verify not a duplicate, mark received, check state */
  12148. switch (type) {
  12149. #ifndef NO_WOLFSSL_CLIENT
  12150. case hello_request:
  12151. #ifndef NO_WOLFSSL_SERVER
  12152. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12153. WOLFSSL_MSG("HelloRequest received by server");
  12154. return SIDE_ERROR;
  12155. }
  12156. #endif
  12157. if (ssl->msgsReceived.got_hello_request) {
  12158. WOLFSSL_MSG("Duplicate HelloRequest received");
  12159. return DUPLICATE_MSG_E;
  12160. }
  12161. ssl->msgsReceived.got_hello_request = 1;
  12162. break;
  12163. #endif
  12164. #ifndef NO_WOLFSSL_SERVER
  12165. case client_hello:
  12166. #ifndef NO_WOLFSSL_CLIENT
  12167. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12168. WOLFSSL_MSG("ClientHello received by client");
  12169. return SIDE_ERROR;
  12170. }
  12171. #endif
  12172. if (ssl->msgsReceived.got_client_hello) {
  12173. WOLFSSL_MSG("Duplicate ClientHello received");
  12174. #ifdef WOLFSSL_EXTRA_ALERTS
  12175. SendAlert(ssl, alert_fatal, unexpected_message);
  12176. #endif
  12177. return DUPLICATE_MSG_E;
  12178. }
  12179. ssl->msgsReceived.got_client_hello = 1;
  12180. break;
  12181. #endif
  12182. #ifndef NO_WOLFSSL_CLIENT
  12183. case server_hello:
  12184. #ifndef NO_WOLFSSL_SERVER
  12185. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12186. WOLFSSL_MSG("ServerHello received by server");
  12187. return SIDE_ERROR;
  12188. }
  12189. #endif
  12190. if (ssl->msgsReceived.got_server_hello) {
  12191. WOLFSSL_MSG("Duplicate ServerHello received");
  12192. return DUPLICATE_MSG_E;
  12193. }
  12194. ssl->msgsReceived.got_server_hello = 1;
  12195. break;
  12196. #endif
  12197. #ifndef NO_WOLFSSL_CLIENT
  12198. case hello_verify_request:
  12199. #ifndef NO_WOLFSSL_SERVER
  12200. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12201. WOLFSSL_MSG("HelloVerifyRequest received by server");
  12202. return SIDE_ERROR;
  12203. }
  12204. #endif
  12205. if (ssl->msgsReceived.got_hello_verify_request) {
  12206. WOLFSSL_MSG("Duplicate HelloVerifyRequest received");
  12207. return DUPLICATE_MSG_E;
  12208. }
  12209. ssl->msgsReceived.got_hello_verify_request = 1;
  12210. break;
  12211. #endif
  12212. #ifndef NO_WOLFSSL_CLIENT
  12213. case session_ticket:
  12214. #ifndef NO_WOLFSSL_SERVER
  12215. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12216. WOLFSSL_MSG("SessionTicket received by server");
  12217. return SIDE_ERROR;
  12218. }
  12219. #endif
  12220. if (ssl->msgsReceived.got_session_ticket) {
  12221. WOLFSSL_MSG("Duplicate SessionTicket received");
  12222. return DUPLICATE_MSG_E;
  12223. }
  12224. ssl->msgsReceived.got_session_ticket = 1;
  12225. break;
  12226. #endif
  12227. case certificate:
  12228. if (ssl->msgsReceived.got_certificate) {
  12229. WOLFSSL_MSG("Duplicate Certificate received");
  12230. return DUPLICATE_MSG_E;
  12231. }
  12232. ssl->msgsReceived.got_certificate = 1;
  12233. #ifndef NO_WOLFSSL_CLIENT
  12234. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12235. if ( ssl->msgsReceived.got_server_hello == 0) {
  12236. WOLFSSL_MSG("No ServerHello before Cert");
  12237. return OUT_OF_ORDER_E;
  12238. }
  12239. }
  12240. #endif
  12241. #ifndef NO_WOLFSSL_SERVER
  12242. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12243. if ( ssl->msgsReceived.got_client_hello == 0) {
  12244. WOLFSSL_MSG("No ClientHello before Cert");
  12245. return OUT_OF_ORDER_E;
  12246. }
  12247. }
  12248. #endif
  12249. break;
  12250. #ifndef NO_WOLFSSL_CLIENT
  12251. case certificate_status:
  12252. #ifndef NO_WOLFSSL_SERVER
  12253. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12254. WOLFSSL_MSG("CertificateStatus received by server");
  12255. return SIDE_ERROR;
  12256. }
  12257. #endif
  12258. if (ssl->msgsReceived.got_certificate_status) {
  12259. WOLFSSL_MSG("Duplicate CertificateStatus received");
  12260. return DUPLICATE_MSG_E;
  12261. }
  12262. ssl->msgsReceived.got_certificate_status = 1;
  12263. if (ssl->msgsReceived.got_certificate == 0) {
  12264. WOLFSSL_MSG("No Certificate before CertificateStatus");
  12265. return OUT_OF_ORDER_E;
  12266. }
  12267. if (ssl->msgsReceived.got_server_key_exchange != 0) {
  12268. WOLFSSL_MSG("CertificateStatus after ServerKeyExchange");
  12269. return OUT_OF_ORDER_E;
  12270. }
  12271. break;
  12272. #endif
  12273. #ifndef NO_WOLFSSL_CLIENT
  12274. case server_key_exchange:
  12275. #ifndef NO_WOLFSSL_SERVER
  12276. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12277. WOLFSSL_MSG("ServerKeyExchange received by server");
  12278. return SIDE_ERROR;
  12279. }
  12280. #endif
  12281. if (ssl->msgsReceived.got_server_key_exchange) {
  12282. WOLFSSL_MSG("Duplicate ServerKeyExchange received");
  12283. return DUPLICATE_MSG_E;
  12284. }
  12285. ssl->msgsReceived.got_server_key_exchange = 1;
  12286. if (ssl->msgsReceived.got_server_hello == 0) {
  12287. WOLFSSL_MSG("No ServerHello before ServerKeyExchange");
  12288. return OUT_OF_ORDER_E;
  12289. }
  12290. if (ssl->msgsReceived.got_certificate_status == 0) {
  12291. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  12292. if (ssl->status_request) {
  12293. int ret;
  12294. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  12295. if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0)
  12296. return ret;
  12297. }
  12298. #endif
  12299. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  12300. if (ssl->status_request_v2) {
  12301. int ret;
  12302. WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange");
  12303. if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0)
  12304. return ret;
  12305. }
  12306. #endif
  12307. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  12308. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  12309. /* Check that a status request extension was seen as the
  12310. * CertificateStatus wasn't when an OCSP staple is required.
  12311. */
  12312. if (
  12313. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  12314. !ssl->status_request &&
  12315. #endif
  12316. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  12317. !ssl->status_request_v2 &&
  12318. #endif
  12319. SSL_CM(ssl)->ocspMustStaple) {
  12320. return OCSP_CERT_UNKNOWN;
  12321. }
  12322. #endif
  12323. }
  12324. break;
  12325. #endif
  12326. #ifndef NO_WOLFSSL_CLIENT
  12327. case certificate_request:
  12328. #ifndef NO_WOLFSSL_SERVER
  12329. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12330. WOLFSSL_MSG("CertificateRequest received by server");
  12331. return SIDE_ERROR;
  12332. }
  12333. #endif
  12334. if (ssl->msgsReceived.got_certificate_request) {
  12335. WOLFSSL_MSG("Duplicate CertificateRequest received");
  12336. return DUPLICATE_MSG_E;
  12337. }
  12338. ssl->msgsReceived.got_certificate_request = 1;
  12339. break;
  12340. #endif
  12341. #ifndef NO_WOLFSSL_CLIENT
  12342. case server_hello_done:
  12343. #ifndef NO_WOLFSSL_SERVER
  12344. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12345. WOLFSSL_MSG("ServerHelloDone received by server");
  12346. return SIDE_ERROR;
  12347. }
  12348. #endif
  12349. if (ssl->msgsReceived.got_server_hello_done) {
  12350. WOLFSSL_MSG("Duplicate ServerHelloDone received");
  12351. return DUPLICATE_MSG_E;
  12352. }
  12353. ssl->msgsReceived.got_server_hello_done = 1;
  12354. if (ssl->msgsReceived.got_certificate == 0) {
  12355. if (ssl->specs.kea == psk_kea ||
  12356. ssl->specs.kea == dhe_psk_kea ||
  12357. ssl->specs.kea == ecdhe_psk_kea ||
  12358. ssl->options.usingAnon_cipher) {
  12359. WOLFSSL_MSG("No Cert required");
  12360. } else {
  12361. WOLFSSL_MSG("No Certificate before ServerHelloDone");
  12362. return OUT_OF_ORDER_E;
  12363. }
  12364. }
  12365. if (ssl->msgsReceived.got_server_key_exchange == 0) {
  12366. int pskNoServerHint = 0; /* not required in this case */
  12367. #ifndef NO_PSK
  12368. if (ssl->specs.kea == psk_kea &&
  12369. ssl->arrays != NULL &&
  12370. ssl->arrays->server_hint[0] == 0)
  12371. pskNoServerHint = 1;
  12372. #endif
  12373. if (ssl->specs.static_ecdh == 1 ||
  12374. ssl->specs.kea == rsa_kea ||
  12375. pskNoServerHint) {
  12376. WOLFSSL_MSG("No KeyExchange required");
  12377. } else {
  12378. WOLFSSL_MSG("No ServerKeyExchange before ServerDone");
  12379. return OUT_OF_ORDER_E;
  12380. }
  12381. }
  12382. break;
  12383. #endif
  12384. #ifndef NO_WOLFSSL_SERVER
  12385. case certificate_verify:
  12386. #ifndef NO_WOLFSSL_CLIENT
  12387. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12388. WOLFSSL_MSG("CertificateVerify received by client");
  12389. return SIDE_ERROR;
  12390. }
  12391. #endif
  12392. if (ssl->msgsReceived.got_certificate_verify) {
  12393. WOLFSSL_MSG("Duplicate CertificateVerify received");
  12394. return DUPLICATE_MSG_E;
  12395. }
  12396. ssl->msgsReceived.got_certificate_verify = 1;
  12397. if ( ssl->msgsReceived.got_certificate == 0) {
  12398. WOLFSSL_MSG("No Cert before CertVerify");
  12399. return OUT_OF_ORDER_E;
  12400. }
  12401. break;
  12402. #endif
  12403. #ifndef NO_WOLFSSL_SERVER
  12404. case client_key_exchange:
  12405. #ifndef NO_WOLFSSL_CLIENT
  12406. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12407. WOLFSSL_MSG("ClientKeyExchange received by client");
  12408. return SIDE_ERROR;
  12409. }
  12410. #endif
  12411. if (ssl->msgsReceived.got_client_key_exchange) {
  12412. WOLFSSL_MSG("Duplicate ClientKeyExchange received");
  12413. #ifdef WOLFSSL_EXTRA_ALERTS
  12414. SendAlert(ssl, alert_fatal, unexpected_message);
  12415. #endif
  12416. return DUPLICATE_MSG_E;
  12417. }
  12418. ssl->msgsReceived.got_client_key_exchange = 1;
  12419. if (ssl->msgsReceived.got_client_hello == 0) {
  12420. WOLFSSL_MSG("No ClientHello before ClientKeyExchange");
  12421. return OUT_OF_ORDER_E;
  12422. }
  12423. break;
  12424. #endif
  12425. case finished:
  12426. if (ssl->msgsReceived.got_finished) {
  12427. WOLFSSL_MSG("Duplicate Finished received");
  12428. return DUPLICATE_MSG_E;
  12429. }
  12430. #ifdef WOLFSSL_DTLS
  12431. if (ssl->options.dtls) {
  12432. if (ssl->keys.curEpoch == 0) {
  12433. WOLFSSL_MSG("Finished received with epoch 0");
  12434. return SEQUENCE_ERROR;
  12435. }
  12436. }
  12437. #endif
  12438. ssl->msgsReceived.got_finished = 1;
  12439. if (ssl->msgsReceived.got_change_cipher == 0) {
  12440. WOLFSSL_MSG("Finished received before ChangeCipher");
  12441. #ifdef WOLFSSL_EXTRA_ALERTS
  12442. SendAlert(ssl, alert_fatal, unexpected_message);
  12443. #endif
  12444. return NO_CHANGE_CIPHER_E;
  12445. }
  12446. break;
  12447. case change_cipher_hs:
  12448. if (ssl->msgsReceived.got_change_cipher) {
  12449. WOLFSSL_MSG("Duplicate ChangeCipher received");
  12450. return DUPLICATE_MSG_E;
  12451. }
  12452. /* DTLS is going to ignore the CCS message if the client key
  12453. * exchange message wasn't received yet. */
  12454. if (!ssl->options.dtls)
  12455. ssl->msgsReceived.got_change_cipher = 1;
  12456. #ifndef NO_WOLFSSL_CLIENT
  12457. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  12458. if (!ssl->options.resuming) {
  12459. if (ssl->msgsReceived.got_server_hello_done == 0) {
  12460. WOLFSSL_MSG("No ServerHelloDone before ChangeCipher");
  12461. return OUT_OF_ORDER_E;
  12462. }
  12463. }
  12464. else {
  12465. if (ssl->msgsReceived.got_server_hello == 0) {
  12466. WOLFSSL_MSG("No ServerHello before ChangeCipher on Resume");
  12467. return OUT_OF_ORDER_E;
  12468. }
  12469. }
  12470. #ifdef HAVE_SESSION_TICKET
  12471. if (ssl->expect_session_ticket) {
  12472. WOLFSSL_MSG("Expected session ticket missing");
  12473. #ifdef WOLFSSL_DTLS
  12474. if (ssl->options.dtls)
  12475. return OUT_OF_ORDER_E;
  12476. #endif
  12477. return SESSION_TICKET_EXPECT_E;
  12478. }
  12479. #endif
  12480. }
  12481. #endif
  12482. #ifndef NO_WOLFSSL_SERVER
  12483. if (ssl->options.side == WOLFSSL_SERVER_END) {
  12484. if (!ssl->options.resuming &&
  12485. ssl->msgsReceived.got_client_key_exchange == 0) {
  12486. WOLFSSL_MSG("No ClientKeyExchange before ChangeCipher");
  12487. #ifdef WOLFSSL_EXTRA_ALERTS
  12488. SendAlert(ssl, alert_fatal, unexpected_message);
  12489. #endif
  12490. return OUT_OF_ORDER_E;
  12491. }
  12492. #ifndef NO_CERTS
  12493. if (ssl->options.verifyPeer &&
  12494. ssl->options.havePeerCert) {
  12495. if (!ssl->options.havePeerVerify ||
  12496. !ssl->msgsReceived.got_certificate_verify) {
  12497. WOLFSSL_MSG("client didn't send cert verify");
  12498. #ifdef WOLFSSL_DTLS
  12499. if (ssl->options.dtls)
  12500. return OUT_OF_ORDER_E;
  12501. #endif
  12502. return NO_PEER_VERIFY;
  12503. }
  12504. }
  12505. #endif
  12506. }
  12507. #endif
  12508. if (ssl->options.dtls)
  12509. ssl->msgsReceived.got_change_cipher = 1;
  12510. break;
  12511. default:
  12512. WOLFSSL_MSG("Unknown message type");
  12513. return SANITY_MSG_E;
  12514. }
  12515. return 0;
  12516. }
  12517. static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12518. byte type, word32 size, word32 totalSz)
  12519. {
  12520. int ret = 0;
  12521. word32 expectedIdx;
  12522. WOLFSSL_ENTER("DoHandShakeMsgType");
  12523. #ifdef WOLFSSL_TLS13
  12524. if (type == hello_retry_request) {
  12525. return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size,
  12526. totalSz);
  12527. }
  12528. #endif
  12529. /* make sure can read the message */
  12530. if (*inOutIdx + size > totalSz) {
  12531. WOLFSSL_MSG("Incomplete Data");
  12532. return INCOMPLETE_DATA;
  12533. }
  12534. expectedIdx = *inOutIdx + size +
  12535. (ssl->keys.encryptionOn ? ssl->keys.padSz : 0);
  12536. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12537. if (ssl->options.startedETMRead && ssl->keys.encryptionOn)
  12538. expectedIdx += MacSize(ssl);
  12539. #endif
  12540. #if !defined(NO_WOLFSSL_SERVER) && \
  12541. defined(HAVE_SECURE_RENEGOTIATION) && \
  12542. defined(HAVE_SERVER_RENEGOTIATION_INFO)
  12543. if (ssl->options.handShakeDone && type == client_hello &&
  12544. ssl->secure_renegotiation &&
  12545. ssl->secure_renegotiation->enabled)
  12546. {
  12547. WOLFSSL_MSG("Reset handshake state");
  12548. XMEMSET(&ssl->msgsReceived, 0, sizeof(MsgsReceived));
  12549. ssl->options.serverState = NULL_STATE;
  12550. ssl->options.clientState = NULL_STATE;
  12551. ssl->options.connectState = CONNECT_BEGIN;
  12552. ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE;
  12553. ssl->options.handShakeState = NULL_STATE;
  12554. ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED;
  12555. ret = InitHandshakeHashes(ssl);
  12556. if (ret != 0)
  12557. return ret;
  12558. }
  12559. #endif
  12560. /* sanity check msg received */
  12561. if ( (ret = SanityCheckMsgReceived(ssl, type)) != 0) {
  12562. WOLFSSL_MSG("Sanity Check on handshake message type received failed");
  12563. return ret;
  12564. }
  12565. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  12566. /* add name later, add on record and handshake header part back on */
  12567. if (ssl->toInfoOn) {
  12568. int add = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  12569. AddPacketInfo(ssl, 0, handshake, input + *inOutIdx - add,
  12570. size + add, READ_PROTO, ssl->heap);
  12571. #ifdef WOLFSSL_CALLBACKS
  12572. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  12573. #endif
  12574. }
  12575. #endif
  12576. if (ssl->options.handShakeState == HANDSHAKE_DONE && type != hello_request){
  12577. WOLFSSL_MSG("HandShake message after handshake complete");
  12578. SendAlert(ssl, alert_fatal, unexpected_message);
  12579. return OUT_OF_ORDER_E;
  12580. }
  12581. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 &&
  12582. ssl->options.serverState == NULL_STATE && type != server_hello) {
  12583. WOLFSSL_MSG("First server message not server hello");
  12584. SendAlert(ssl, alert_fatal, unexpected_message);
  12585. return OUT_OF_ORDER_E;
  12586. }
  12587. if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls &&
  12588. type == server_hello_done &&
  12589. ssl->options.serverState < SERVER_HELLO_COMPLETE) {
  12590. WOLFSSL_MSG("Server hello done received before server hello in DTLS");
  12591. SendAlert(ssl, alert_fatal, unexpected_message);
  12592. return OUT_OF_ORDER_E;
  12593. }
  12594. if (ssl->options.side == WOLFSSL_SERVER_END &&
  12595. ssl->options.clientState == NULL_STATE && type != client_hello) {
  12596. WOLFSSL_MSG("First client message not client hello");
  12597. SendAlert(ssl, alert_fatal, unexpected_message);
  12598. return OUT_OF_ORDER_E;
  12599. }
  12600. /* above checks handshake state */
  12601. /* hello_request not hashed */
  12602. /* Also, skip hashing the client_hello message here for DTLS. It will be
  12603. * hashed later if the DTLS cookie is correct. */
  12604. if (type != hello_request
  12605. #ifdef WOLFSSL_ASYNC_CRYPT
  12606. && ssl->error != WC_PENDING_E
  12607. #endif
  12608. #ifdef WOLFSSL_NONBLOCK_OCSP
  12609. && ssl->error != OCSP_WANT_READ
  12610. #endif
  12611. ) {
  12612. ret = HashInput(ssl, input + *inOutIdx, size);
  12613. if (ret != 0) {
  12614. WOLFSSL_MSG("Incomplete handshake hashes");
  12615. return ret;
  12616. }
  12617. }
  12618. #ifdef OPENSSL_EXTRA
  12619. if (ssl->CBIS != NULL){
  12620. ssl->cbmode = SSL_CB_MODE_READ;
  12621. ssl->cbtype = type;
  12622. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  12623. }
  12624. #endif
  12625. switch (type) {
  12626. case hello_request:
  12627. WOLFSSL_MSG("processing hello request");
  12628. ret = DoHelloRequest(ssl, input, inOutIdx, size, totalSz);
  12629. break;
  12630. #ifndef NO_WOLFSSL_CLIENT
  12631. case hello_verify_request:
  12632. WOLFSSL_MSG("processing hello verify request");
  12633. ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
  12634. if (IsEncryptionOn(ssl, 0)) {
  12635. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12636. if (ssl->options.startedETMRead) {
  12637. word32 digestSz = MacSize(ssl);
  12638. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  12639. return BUFFER_E;
  12640. *inOutIdx += ssl->keys.padSz + digestSz;
  12641. }
  12642. else
  12643. #endif
  12644. {
  12645. /* access beyond input + size should be checked against totalSz
  12646. */
  12647. if (*inOutIdx + ssl->keys.padSz > totalSz)
  12648. return BUFFER_E;
  12649. *inOutIdx += ssl->keys.padSz;
  12650. }
  12651. }
  12652. break;
  12653. case server_hello:
  12654. WOLFSSL_MSG("processing server hello");
  12655. ret = DoServerHello(ssl, input, inOutIdx, size);
  12656. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  12657. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  12658. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  12659. if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) ||
  12660. IsAtLeastTLSv1_3(ssl->version)) {
  12661. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12662. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  12663. #endif
  12664. {
  12665. ssl->options.cacheMessages = 0;
  12666. if (ssl->hsHashes->messages != NULL) {
  12667. XFREE(ssl->hsHashes->messages, ssl->heap,
  12668. DYNAMIC_TYPE_HASHES);
  12669. ssl->hsHashes->messages = NULL;
  12670. }
  12671. }
  12672. }
  12673. #endif
  12674. break;
  12675. #ifndef NO_CERTS
  12676. case certificate_request:
  12677. WOLFSSL_MSG("processing certificate request");
  12678. ret = DoCertificateRequest(ssl, input, inOutIdx, size);
  12679. break;
  12680. #endif
  12681. case server_key_exchange:
  12682. WOLFSSL_MSG("processing server key exchange");
  12683. ret = DoServerKeyExchange(ssl, input, inOutIdx, size);
  12684. break;
  12685. #ifdef HAVE_SESSION_TICKET
  12686. case session_ticket:
  12687. WOLFSSL_MSG("processing session ticket");
  12688. ret = DoSessionTicket(ssl, input, inOutIdx, size);
  12689. break;
  12690. #endif /* HAVE_SESSION_TICKET */
  12691. #endif
  12692. #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
  12693. !defined(WOLFSSL_NO_CLIENT_AUTH))
  12694. case certificate:
  12695. WOLFSSL_MSG("processing certificate");
  12696. ret = DoCertificate(ssl, input, inOutIdx, size);
  12697. break;
  12698. case certificate_status:
  12699. WOLFSSL_MSG("processing certificate status");
  12700. ret = DoCertificateStatus(ssl, input, inOutIdx, size);
  12701. break;
  12702. #endif
  12703. case server_hello_done:
  12704. WOLFSSL_MSG("processing server hello done");
  12705. #ifdef WOLFSSL_CALLBACKS
  12706. if (ssl->hsInfoOn)
  12707. AddPacketName(ssl, "ServerHelloDone");
  12708. if (ssl->toInfoOn)
  12709. AddLateName("ServerHelloDone", &ssl->timeoutInfo);
  12710. #endif
  12711. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  12712. if (IsEncryptionOn(ssl, 0)) {
  12713. *inOutIdx += ssl->keys.padSz;
  12714. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12715. if (ssl->options.startedETMRead)
  12716. *inOutIdx += MacSize(ssl);
  12717. #endif
  12718. }
  12719. if (ssl->options.resuming) {
  12720. WOLFSSL_MSG("Not resuming as thought");
  12721. ssl->options.resuming = 0;
  12722. /* CLIENT: No longer resuming, reset peer authentication state. */
  12723. ssl->options.peerAuthGood = 0;
  12724. }
  12725. break;
  12726. case finished:
  12727. WOLFSSL_MSG("processing finished");
  12728. ret = DoFinished(ssl, input, inOutIdx, size, totalSz, NO_SNIFF);
  12729. break;
  12730. #ifndef NO_WOLFSSL_SERVER
  12731. case client_hello:
  12732. WOLFSSL_MSG("processing client hello");
  12733. ret = DoClientHello(ssl, input, inOutIdx, size);
  12734. #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
  12735. ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
  12736. (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
  12737. if (ssl->options.resuming || !ssl->options.verifyPeer || \
  12738. !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) {
  12739. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12740. if (ret != WC_PENDING_E && ret != OCSP_WANT_READ)
  12741. #endif
  12742. {
  12743. ssl->options.cacheMessages = 0;
  12744. if (ssl->hsHashes->messages != NULL) {
  12745. XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
  12746. ssl->hsHashes->messages = NULL;
  12747. }
  12748. }
  12749. }
  12750. #endif
  12751. /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
  12752. * about padding */
  12753. if (IsEncryptionOn(ssl, 0)) {
  12754. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12755. if (ssl->options.startedETMRead) {
  12756. word32 digestSz = MacSize(ssl);
  12757. if (size != totalSz &&
  12758. *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  12759. return BUFFER_E;
  12760. *inOutIdx += ssl->keys.padSz + digestSz;
  12761. }
  12762. else
  12763. #endif
  12764. {
  12765. /* access beyond input + size should be checked against totalSz
  12766. */
  12767. if (size != totalSz &&
  12768. *inOutIdx + ssl->keys.padSz > totalSz)
  12769. return BUFFER_E;
  12770. *inOutIdx += ssl->keys.padSz;
  12771. }
  12772. }
  12773. break;
  12774. case client_key_exchange:
  12775. WOLFSSL_MSG("processing client key exchange");
  12776. ret = DoClientKeyExchange(ssl, input, inOutIdx, size);
  12777. break;
  12778. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  12779. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  12780. case certificate_verify:
  12781. WOLFSSL_MSG("processing certificate verify");
  12782. ret = DoCertificateVerify(ssl, input, inOutIdx, size);
  12783. break;
  12784. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  12785. #endif /* !NO_WOLFSSL_SERVER */
  12786. default:
  12787. WOLFSSL_MSG("Unknown handshake message type");
  12788. ret = UNKNOWN_HANDSHAKE_TYPE;
  12789. break;
  12790. }
  12791. if (ret == 0 && expectedIdx != *inOutIdx) {
  12792. WOLFSSL_MSG("Extra data in handshake message");
  12793. if (!ssl->options.dtls)
  12794. SendAlert(ssl, alert_fatal, decode_error);
  12795. ret = DECODE_E;
  12796. }
  12797. if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag
  12798. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12799. /* do not shrink input for async or non-block */
  12800. && ssl->error != WC_PENDING_E && ssl->error != OCSP_WANT_READ
  12801. #endif
  12802. ) {
  12803. if (IsEncryptionOn(ssl, 0)) {
  12804. word32 extra = ssl->keys.padSz;
  12805. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  12806. if (ssl->options.startedETMRead)
  12807. extra += MacSize(ssl);
  12808. #endif
  12809. if (extra > ssl->buffers.inputBuffer.idx)
  12810. return BUFFER_E;
  12811. ssl->buffers.inputBuffer.idx -= extra;
  12812. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  12813. ssl->buffers.inputBuffer.idx += extra;
  12814. }
  12815. else {
  12816. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  12817. }
  12818. }
  12819. #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)
  12820. /* if async, offset index so this msg will be processed again */
  12821. if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) {
  12822. *inOutIdx -= HANDSHAKE_HEADER_SZ;
  12823. #ifdef WOLFSSL_DTLS
  12824. if (ssl->options.dtls) {
  12825. *inOutIdx -= DTLS_HANDSHAKE_EXTRA;
  12826. }
  12827. #endif
  12828. }
  12829. /* make sure async error is cleared */
  12830. if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) {
  12831. ssl->error = 0;
  12832. }
  12833. #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
  12834. #ifdef WOLFSSL_DTLS
  12835. if (ret == 0) {
  12836. if (type == client_hello) {
  12837. /* Advance expected number only if cookie exchange complete */
  12838. if (ssl->msgsReceived.got_client_hello)
  12839. ssl->keys.dtls_expected_peer_handshake_number =
  12840. ssl->keys.dtls_peer_handshake_number + 1;
  12841. }
  12842. else if (type != finished) {
  12843. ssl->keys.dtls_expected_peer_handshake_number++;
  12844. }
  12845. }
  12846. #endif
  12847. WOLFSSL_LEAVE("DoHandShakeMsgType()", ret);
  12848. return ret;
  12849. }
  12850. static int DoHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  12851. word32 totalSz)
  12852. {
  12853. int ret = 0;
  12854. word32 inputLength;
  12855. WOLFSSL_ENTER("DoHandShakeMsg()");
  12856. if (ssl->arrays == NULL) {
  12857. byte type;
  12858. word32 size;
  12859. if (GetHandShakeHeader(ssl,input,inOutIdx,&type, &size, totalSz) != 0)
  12860. return PARSE_ERROR;
  12861. return DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  12862. }
  12863. inputLength = ssl->buffers.inputBuffer.length - *inOutIdx;
  12864. /* If there is a pending fragmented handshake message,
  12865. * pending message size will be non-zero. */
  12866. if (ssl->arrays->pendingMsgSz == 0) {
  12867. byte type;
  12868. word32 size;
  12869. if (GetHandShakeHeader(ssl,input, inOutIdx, &type, &size, totalSz) != 0)
  12870. return PARSE_ERROR;
  12871. /* Cap the maximum size of a handshake message to something reasonable.
  12872. * By default is the maximum size of a certificate message assuming
  12873. * nine 2048-bit RSA certificates in the chain. */
  12874. if (size > MAX_HANDSHAKE_SZ) {
  12875. WOLFSSL_MSG("Handshake message too large");
  12876. return HANDSHAKE_SIZE_ERROR;
  12877. }
  12878. /* size is the size of the certificate message payload */
  12879. if (inputLength - HANDSHAKE_HEADER_SZ < size) {
  12880. ssl->arrays->pendingMsgType = type;
  12881. ssl->arrays->pendingMsgSz = size + HANDSHAKE_HEADER_SZ;
  12882. ssl->arrays->pendingMsg = (byte*)XMALLOC(size + HANDSHAKE_HEADER_SZ,
  12883. ssl->heap,
  12884. DYNAMIC_TYPE_ARRAYS);
  12885. if (ssl->arrays->pendingMsg == NULL)
  12886. return MEMORY_E;
  12887. XMEMCPY(ssl->arrays->pendingMsg,
  12888. input + *inOutIdx - HANDSHAKE_HEADER_SZ,
  12889. inputLength);
  12890. ssl->arrays->pendingMsgOffset = inputLength;
  12891. *inOutIdx += inputLength - HANDSHAKE_HEADER_SZ;
  12892. return 0;
  12893. }
  12894. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  12895. }
  12896. else {
  12897. word32 pendSz =
  12898. ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset;
  12899. /* Catch the case where there may be the remainder of a fragmented
  12900. * handshake message and the next handshake message in the same
  12901. * record. */
  12902. if (inputLength > pendSz)
  12903. inputLength = pendSz;
  12904. #ifdef WOLFSSL_ASYNC_CRYPT
  12905. if (ssl->error != WC_PENDING_E)
  12906. #endif
  12907. {
  12908. /* for async this copy was already done, do not replace, since
  12909. * contents may have been changed for inline operations */
  12910. XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset,
  12911. input + *inOutIdx, inputLength);
  12912. }
  12913. ssl->arrays->pendingMsgOffset += inputLength;
  12914. *inOutIdx += inputLength;
  12915. if (ssl->arrays->pendingMsgOffset == ssl->arrays->pendingMsgSz)
  12916. {
  12917. word32 idx = HANDSHAKE_HEADER_SZ;
  12918. ret = DoHandShakeMsgType(ssl,
  12919. ssl->arrays->pendingMsg,
  12920. &idx, ssl->arrays->pendingMsgType,
  12921. ssl->arrays->pendingMsgSz - idx,
  12922. ssl->arrays->pendingMsgSz);
  12923. #ifdef WOLFSSL_ASYNC_CRYPT
  12924. if (ret == WC_PENDING_E) {
  12925. /* setup to process fragment again */
  12926. ssl->arrays->pendingMsgOffset -= inputLength;
  12927. *inOutIdx -= inputLength;
  12928. }
  12929. else
  12930. #endif
  12931. {
  12932. XFREE(ssl->arrays->pendingMsg, ssl->heap, DYNAMIC_TYPE_ARRAYS);
  12933. ssl->arrays->pendingMsg = NULL;
  12934. ssl->arrays->pendingMsgSz = 0;
  12935. }
  12936. }
  12937. }
  12938. WOLFSSL_LEAVE("DoHandShakeMsg()", ret);
  12939. return ret;
  12940. }
  12941. #endif /* !WOLFSSL_NO_TLS12 */
  12942. #ifdef WOLFSSL_DTLS
  12943. static WC_INLINE int DtlsCheckWindow(WOLFSSL* ssl)
  12944. {
  12945. word32* window;
  12946. word16 cur_hi, next_hi;
  12947. word32 cur_lo, next_lo, diff;
  12948. int curLT;
  12949. WOLFSSL_DTLS_PEERSEQ* peerSeq = NULL;
  12950. if (!ssl->options.haveMcast)
  12951. peerSeq = ssl->keys.peerSeq;
  12952. else {
  12953. #ifdef WOLFSSL_MULTICAST
  12954. WOLFSSL_DTLS_PEERSEQ* p;
  12955. int i;
  12956. for (i = 0, p = ssl->keys.peerSeq;
  12957. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  12958. i++, p++) {
  12959. if (p->peerId == ssl->keys.curPeerId) {
  12960. peerSeq = p;
  12961. break;
  12962. }
  12963. }
  12964. #endif
  12965. }
  12966. if (peerSeq == NULL) {
  12967. WOLFSSL_MSG("Could not find peer sequence");
  12968. return 0;
  12969. }
  12970. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  12971. next_hi = peerSeq->nextSeq_hi;
  12972. next_lo = peerSeq->nextSeq_lo;
  12973. window = peerSeq->window;
  12974. }
  12975. else if (ssl->keys.curEpoch == peerSeq->nextEpoch - 1) {
  12976. next_hi = peerSeq->prevSeq_hi;
  12977. next_lo = peerSeq->prevSeq_lo;
  12978. window = peerSeq->prevWindow;
  12979. }
  12980. else {
  12981. return 0;
  12982. }
  12983. cur_hi = ssl->keys.curSeq_hi;
  12984. cur_lo = ssl->keys.curSeq_lo;
  12985. /* If the difference between next and cur is > 2^32, way outside window. */
  12986. if ((cur_hi > next_hi + 1) || (next_hi > cur_hi + 1)) {
  12987. WOLFSSL_MSG("Current record from way too far in the future.");
  12988. return 0;
  12989. }
  12990. if (cur_hi == next_hi) {
  12991. curLT = cur_lo < next_lo;
  12992. diff = curLT ? next_lo - cur_lo : cur_lo - next_lo;
  12993. }
  12994. else {
  12995. curLT = cur_hi < next_hi;
  12996. diff = curLT ? cur_lo - next_lo : next_lo - cur_lo;
  12997. }
  12998. /* Check to see that the next value is greater than the number of messages
  12999. * trackable in the window, and that the difference between the next
  13000. * expected sequence number and the received sequence number is inside the
  13001. * window. */
  13002. if ((next_hi || next_lo > DTLS_SEQ_BITS) &&
  13003. curLT && (diff > DTLS_SEQ_BITS)) {
  13004. WOLFSSL_MSG("Current record sequence number from the past.");
  13005. return 0;
  13006. }
  13007. #ifdef WOLFSSL_DTLS_DISALLOW_FUTURE
  13008. else if (!curLT && (diff > DTLS_SEQ_BITS)) {
  13009. WOLFSSL_MSG("Rejecting message too far into the future.");
  13010. return 0;
  13011. }
  13012. #endif
  13013. else if (curLT) {
  13014. word32 idx;
  13015. word32 newDiff;
  13016. if (diff == 0) {
  13017. WOLFSSL_MSG("DTLS sanity check failed");
  13018. return 0;
  13019. }
  13020. diff--;
  13021. idx = diff / DTLS_WORD_BITS;
  13022. newDiff = diff % DTLS_WORD_BITS;
  13023. /* verify idx is valid for window array */
  13024. if (idx >= WOLFSSL_DTLS_WINDOW_WORDS) {
  13025. WOLFSSL_MSG("Invalid DTLS windows index");
  13026. return 0;
  13027. }
  13028. if (window[idx] & (1 << newDiff)) {
  13029. WOLFSSL_MSG("Current record sequence number already received.");
  13030. return 0;
  13031. }
  13032. }
  13033. return 1;
  13034. }
  13035. #ifdef WOLFSSL_MULTICAST
  13036. static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
  13037. word32 second, word32 high)
  13038. {
  13039. word32 newCur = 0;
  13040. if (cur < first)
  13041. newCur = first;
  13042. else if (cur < second)
  13043. newCur = second;
  13044. else if (cur < high)
  13045. newCur = high;
  13046. return newCur;
  13047. }
  13048. #endif /* WOLFSSL_MULTICAST */
  13049. static WC_INLINE int DtlsUpdateWindow(WOLFSSL* ssl)
  13050. {
  13051. word32* window;
  13052. word32* next_lo;
  13053. word16* next_hi;
  13054. int curLT;
  13055. word32 cur_lo, diff;
  13056. word16 cur_hi;
  13057. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  13058. cur_hi = ssl->keys.curSeq_hi;
  13059. cur_lo = ssl->keys.curSeq_lo;
  13060. #ifdef WOLFSSL_MULTICAST
  13061. if (ssl->options.haveMcast) {
  13062. WOLFSSL_DTLS_PEERSEQ* p;
  13063. int i;
  13064. peerSeq = NULL;
  13065. for (i = 0, p = ssl->keys.peerSeq;
  13066. i < WOLFSSL_DTLS_PEERSEQ_SZ;
  13067. i++, p++) {
  13068. if (p->peerId == ssl->keys.curPeerId) {
  13069. peerSeq = p;
  13070. break;
  13071. }
  13072. }
  13073. if (peerSeq == NULL) {
  13074. WOLFSSL_MSG("Couldn't find that peer ID to update window.");
  13075. return 0;
  13076. }
  13077. if (p->highwaterMark && cur_lo >= p->highwaterMark) {
  13078. int cbError = 0;
  13079. if (ssl->ctx->mcastHwCb)
  13080. cbError = ssl->ctx->mcastHwCb(p->peerId,
  13081. ssl->ctx->mcastMaxSeq,
  13082. cur_lo, ssl->mcastHwCbCtx);
  13083. if (cbError) {
  13084. WOLFSSL_MSG("Multicast highwater callback returned an error.");
  13085. return MCAST_HIGHWATER_CB_E;
  13086. }
  13087. p->highwaterMark = UpdateHighwaterMark(cur_lo,
  13088. ssl->ctx->mcastFirstSeq,
  13089. ssl->ctx->mcastSecondSeq,
  13090. ssl->ctx->mcastMaxSeq);
  13091. }
  13092. }
  13093. #endif
  13094. if (ssl->keys.curEpoch == peerSeq->nextEpoch) {
  13095. next_hi = &peerSeq->nextSeq_hi;
  13096. next_lo = &peerSeq->nextSeq_lo;
  13097. window = peerSeq->window;
  13098. }
  13099. else {
  13100. next_hi = &peerSeq->prevSeq_hi;
  13101. next_lo = &peerSeq->prevSeq_lo;
  13102. window = peerSeq->prevWindow;
  13103. }
  13104. if (cur_hi == *next_hi) {
  13105. curLT = cur_lo < *next_lo;
  13106. diff = curLT ? *next_lo - cur_lo - 1 : cur_lo - *next_lo + 1;
  13107. }
  13108. else {
  13109. curLT = cur_hi < *next_hi;
  13110. diff = curLT ? cur_lo - *next_lo - 1 : *next_lo - cur_lo + 1;
  13111. }
  13112. if (curLT) {
  13113. word32 idx = diff / DTLS_WORD_BITS;
  13114. word32 newDiff = diff % DTLS_WORD_BITS;
  13115. if (idx < WOLFSSL_DTLS_WINDOW_WORDS)
  13116. window[idx] |= (1 << newDiff);
  13117. }
  13118. else {
  13119. if (diff >= DTLS_SEQ_BITS)
  13120. XMEMSET(window, 0, DTLS_SEQ_SZ);
  13121. else {
  13122. word32 idx, newDiff, temp, i;
  13123. word32 oldWindow[WOLFSSL_DTLS_WINDOW_WORDS];
  13124. temp = 0;
  13125. idx = diff / DTLS_WORD_BITS;
  13126. newDiff = diff % DTLS_WORD_BITS;
  13127. XMEMCPY(oldWindow, window, sizeof(oldWindow));
  13128. for (i = 0; i < WOLFSSL_DTLS_WINDOW_WORDS; i++) {
  13129. if (i < idx)
  13130. window[i] = 0;
  13131. else {
  13132. temp |= (oldWindow[i-idx] << newDiff);
  13133. window[i] = temp;
  13134. temp = oldWindow[i-idx] >> (DTLS_WORD_BITS - newDiff - 1);
  13135. }
  13136. }
  13137. }
  13138. window[0] |= 1;
  13139. *next_lo = cur_lo + 1;
  13140. if (*next_lo < cur_lo)
  13141. (*next_hi)++;
  13142. }
  13143. return 1;
  13144. }
  13145. static int DtlsMsgDrain(WOLFSSL* ssl)
  13146. {
  13147. DtlsMsg* item = ssl->dtls_rx_msg_list;
  13148. int ret = 0;
  13149. WOLFSSL_ENTER("DtlsMsgDrain()");
  13150. /* While there is an item in the store list, and it is the expected
  13151. * message, and it is complete, and there hasn't been an error in the
  13152. * last message... */
  13153. while (item != NULL &&
  13154. ssl->keys.dtls_expected_peer_handshake_number == item->seq &&
  13155. item->fragSz == item->sz &&
  13156. ret == 0) {
  13157. word32 idx = 0;
  13158. if ((ret = DoHandShakeMsgType(ssl, item->msg, &idx, item->type,
  13159. item->sz, item->sz)) == 0) {
  13160. DtlsTxMsgListClean(ssl);
  13161. }
  13162. #ifdef WOLFSSL_ASYNC_CRYPT
  13163. if (ret == WC_PENDING_E) {
  13164. break;
  13165. }
  13166. #endif
  13167. ssl->dtls_rx_msg_list = item->next;
  13168. DtlsMsgDelete(item, ssl->heap);
  13169. item = ssl->dtls_rx_msg_list;
  13170. ssl->dtls_rx_msg_list_sz--;
  13171. }
  13172. WOLFSSL_LEAVE("DtlsMsgDrain()", ret);
  13173. return ret;
  13174. }
  13175. static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  13176. word32 totalSz)
  13177. {
  13178. byte type;
  13179. word32 size;
  13180. word32 fragOffset, fragSz;
  13181. int ret = 0;
  13182. int ignoreFinished = 0;
  13183. WOLFSSL_ENTER("DoDtlsHandShakeMsg()");
  13184. /* parse header */
  13185. if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type,
  13186. &size, &fragOffset, &fragSz, totalSz) != 0) {
  13187. WOLFSSL_ERROR(PARSE_ERROR);
  13188. return PARSE_ERROR;
  13189. }
  13190. /* Cap the maximum size of a handshake message to something reasonable.
  13191. * By default is the maximum size of a certificate message assuming
  13192. * nine 2048-bit RSA certificates in the chain. */
  13193. if (size > MAX_HANDSHAKE_SZ) {
  13194. WOLFSSL_MSG("Handshake message too large");
  13195. return HANDSHAKE_SIZE_ERROR;
  13196. }
  13197. /* check that we have complete fragment */
  13198. if (*inOutIdx + fragSz > totalSz) {
  13199. WOLFSSL_ERROR(INCOMPLETE_DATA);
  13200. return INCOMPLETE_DATA;
  13201. }
  13202. if (type == finished && ssl->keys.dtls_peer_handshake_number >=
  13203. ssl->keys.dtls_expected_peer_handshake_number &&
  13204. ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
  13205. /* finished msg should be ignore from the current epoch
  13206. * if it comes from a previous handshake */
  13207. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  13208. ignoreFinished = ssl->options.connectState < FINISHED_DONE;
  13209. }
  13210. else {
  13211. ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
  13212. }
  13213. }
  13214. /* Check the handshake sequence number first. If out of order,
  13215. * add the current message to the list. If the message is in order,
  13216. * but it is a fragment, add the current message to the list, then
  13217. * check the head of the list to see if it is complete, if so, pop
  13218. * it out as the current message. If the message is complete and in
  13219. * order, process it. Check the head of the list to see if it is in
  13220. * order, if so, process it. (Repeat until list exhausted.) If the
  13221. * head is out of order, return for more processing.
  13222. */
  13223. if (ssl->keys.dtls_peer_handshake_number >
  13224. ssl->keys.dtls_expected_peer_handshake_number &&
  13225. /* Only client_hello shouldn't be ignored if the handshake
  13226. * num is greater */
  13227. (type == client_hello ||
  13228. ssl->options.handShakeState != HANDSHAKE_DONE) &&
  13229. !ignoreFinished) {
  13230. /* Current message is out of order. It will get stored in the list.
  13231. * Storing also takes care of defragmentation. If the messages is a
  13232. * client hello, we need to process this out of order; the server
  13233. * is not supposed to keep state, but the second client hello will
  13234. * have a different handshake sequence number than is expected, and
  13235. * the server shouldn't be expecting any particular handshake sequence
  13236. * number. (If the cookie changes multiple times in quick succession,
  13237. * the client could be sending multiple new client hello messages
  13238. * with newer and newer cookies.) */
  13239. if (type != client_hello) {
  13240. WOLFSSL_MSG("Current message is out of order");
  13241. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  13242. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  13243. ssl->keys.dtls_peer_handshake_number,
  13244. input + *inOutIdx, size, type,
  13245. fragOffset, fragSz, ssl->heap);
  13246. }
  13247. *inOutIdx += fragSz;
  13248. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13249. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  13250. word32 digestSz = MacSize(ssl);
  13251. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  13252. return BUFFER_E;
  13253. *inOutIdx += digestSz;
  13254. }
  13255. else
  13256. #endif
  13257. {
  13258. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  13259. WOLFSSL_ERROR(BUFFER_E);
  13260. return BUFFER_E;
  13261. }
  13262. }
  13263. *inOutIdx += ssl->keys.padSz;
  13264. ret = 0;
  13265. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  13266. /* If we receive an out of order last flight msg then retransmit */
  13267. if (type == server_hello_done || type == finished) {
  13268. ret = DtlsMsgPoolSend(ssl, 0);
  13269. }
  13270. #endif
  13271. }
  13272. else {
  13273. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  13274. }
  13275. }
  13276. else if (ssl->keys.dtls_peer_handshake_number <
  13277. ssl->keys.dtls_expected_peer_handshake_number ||
  13278. /* ignore all handshake messages if we are done with the
  13279. * handshake */
  13280. (ssl->keys.dtls_peer_handshake_number >
  13281. ssl->keys.dtls_expected_peer_handshake_number &&
  13282. ssl->options.handShakeState == HANDSHAKE_DONE) ||
  13283. ignoreFinished) {
  13284. /* Already saw this message and processed it. It can be ignored. */
  13285. WOLFSSL_MSG("Already saw this message and processed it");
  13286. *inOutIdx += fragSz;
  13287. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13288. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  13289. word32 digestSz = MacSize(ssl);
  13290. if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
  13291. return BUFFER_E;
  13292. *inOutIdx += digestSz;
  13293. }
  13294. else
  13295. #endif
  13296. {
  13297. if (*inOutIdx + ssl->keys.padSz > totalSz) {
  13298. WOLFSSL_ERROR(BUFFER_E);
  13299. return BUFFER_E;
  13300. }
  13301. }
  13302. #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
  13303. if (IsDtlsNotSctpMode(ssl) &&
  13304. VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
  13305. ret = DtlsMsgPoolSend(ssl, 0);
  13306. }
  13307. #endif
  13308. *inOutIdx += ssl->keys.padSz;
  13309. }
  13310. else if (fragSz < size) {
  13311. /* Since this branch is in order, but fragmented, dtls_rx_msg_list will
  13312. * be pointing to the message with this fragment in it. Check it to see
  13313. * if it is completed. */
  13314. WOLFSSL_MSG("Branch is in order, but fragmented");
  13315. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  13316. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  13317. ssl->keys.dtls_peer_handshake_number,
  13318. input + *inOutIdx, size, type,
  13319. fragOffset, fragSz, ssl->heap);
  13320. }
  13321. *inOutIdx += fragSz;
  13322. *inOutIdx += ssl->keys.padSz;
  13323. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13324. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  13325. word32 digestSz = MacSize(ssl);
  13326. if (*inOutIdx + digestSz > totalSz)
  13327. return BUFFER_E;
  13328. *inOutIdx += digestSz;
  13329. }
  13330. #endif
  13331. ret = 0;
  13332. if (ssl->dtls_rx_msg_list != NULL &&
  13333. ssl->dtls_rx_msg_list->fragSz >= ssl->dtls_rx_msg_list->sz)
  13334. ret = DtlsMsgDrain(ssl);
  13335. }
  13336. else {
  13337. /* This branch is in order next, and a complete message. On success
  13338. * clean the tx list. */
  13339. #ifdef WOLFSSL_ASYNC_CRYPT
  13340. word32 idx = *inOutIdx;
  13341. #endif
  13342. WOLFSSL_MSG("Branch is in order and a complete message");
  13343. #ifdef WOLFSSL_ASYNC_CRYPT
  13344. /* In async mode always store the message and process it with
  13345. * DtlsMsgDrain because in case of a WC_PENDING_E it will be
  13346. * easier this way. */
  13347. if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
  13348. DtlsMsgStore(ssl, ssl->keys.curEpoch,
  13349. ssl->keys.dtls_peer_handshake_number,
  13350. input + idx, size, type,
  13351. fragOffset, fragSz, ssl->heap);
  13352. }
  13353. if (idx + fragSz + ssl->keys.padSz > totalSz)
  13354. return BUFFER_E;
  13355. *inOutIdx = idx + fragSz + ssl->keys.padSz;
  13356. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  13357. if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
  13358. word32 digestSz = MacSize(ssl);
  13359. if (*inOutIdx + digestSz > totalSz)
  13360. return BUFFER_E;
  13361. *inOutIdx += digestSz;
  13362. }
  13363. #endif
  13364. ret = DtlsMsgDrain(ssl);
  13365. #else
  13366. ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
  13367. if (ret == 0) {
  13368. DtlsTxMsgListClean(ssl);
  13369. if (ssl->dtls_rx_msg_list != NULL) {
  13370. ret = DtlsMsgDrain(ssl);
  13371. }
  13372. }
  13373. #endif
  13374. }
  13375. WOLFSSL_LEAVE("DoDtlsHandShakeMsg()", ret);
  13376. return ret;
  13377. }
  13378. #endif
  13379. #ifndef WOLFSSL_NO_TLS12
  13380. #ifdef HAVE_AEAD
  13381. #if (!defined(NO_PUBLIC_GCM_SET_IV) && \
  13382. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  13383. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
  13384. (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
  13385. static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
  13386. {
  13387. int i;
  13388. for (i = AEAD_MAX_EXP_SZ-1; i >= 0; i--) {
  13389. if (++ssl->keys.aead_exp_IV[i]) return;
  13390. }
  13391. }
  13392. #endif
  13393. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && !defined(NO_CHAPOL_AEAD)
  13394. /* Used for the older version of creating AEAD tags with Poly1305 */
  13395. static int Poly1305TagOld(WOLFSSL* ssl, byte* additional, const byte* out,
  13396. byte* cipher, word16 sz, byte* tag)
  13397. {
  13398. int ret = 0;
  13399. int msglen = (sz - ssl->specs.aead_mac_size);
  13400. word32 keySz = 32;
  13401. byte padding[8]; /* used to temporarily store lengths */
  13402. #ifdef CHACHA_AEAD_TEST
  13403. printf("Using old version of poly1305 input.\n");
  13404. #endif
  13405. if (msglen < 0)
  13406. return INPUT_CASE_ERROR;
  13407. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, cipher, keySz)) != 0)
  13408. return ret;
  13409. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, additional,
  13410. AEAD_AUTH_DATA_SZ)) != 0)
  13411. return ret;
  13412. /* length of additional input plus padding */
  13413. XMEMSET(padding, 0, sizeof(padding));
  13414. padding[0] = AEAD_AUTH_DATA_SZ;
  13415. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding,
  13416. sizeof(padding))) != 0)
  13417. return ret;
  13418. /* add cipher info and then its length */
  13419. XMEMSET(padding, 0, sizeof(padding));
  13420. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0)
  13421. return ret;
  13422. /* 32 bit size of cipher to 64 bit endian */
  13423. padding[0] = msglen & 0xff;
  13424. padding[1] = (msglen >> 8) & 0xff;
  13425. padding[2] = ((word32)msglen >> 16) & 0xff;
  13426. padding[3] = ((word32)msglen >> 24) & 0xff;
  13427. if ((ret = wc_Poly1305Update(ssl->auth.poly1305, padding, sizeof(padding)))
  13428. != 0)
  13429. return ret;
  13430. /* generate tag */
  13431. if ((ret = wc_Poly1305Final(ssl->auth.poly1305, tag)) != 0)
  13432. return ret;
  13433. return ret;
  13434. }
  13435. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  13436. * the implementation follows an older draft for creating the nonce and MAC.
  13437. * The flag oldPoly gets set automatically depending on what cipher suite was
  13438. * negotiated in the handshake. This is able to be done because the IDs for the
  13439. * cipher suites was updated in RFC7905 giving unique values for the older
  13440. * draft in comparison to the more recent RFC.
  13441. *
  13442. * ssl WOLFSSL structure to get cipher and TLS state from
  13443. * out output buffer to hold encrypted data
  13444. * input data to encrypt
  13445. * sz size of input
  13446. *
  13447. * Return 0 on success negative values in error case
  13448. */
  13449. int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input,
  13450. word16 sz)
  13451. {
  13452. const byte* additionalSrc = input - RECORD_HEADER_SZ;
  13453. int ret = 0;
  13454. word32 msgLen = (sz - ssl->specs.aead_mac_size);
  13455. byte tag[POLY1305_AUTH_SZ];
  13456. byte add[AEAD_AUTH_DATA_SZ];
  13457. byte nonce[CHACHA20_NONCE_SZ];
  13458. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for poly1305 */
  13459. #ifdef CHACHA_AEAD_TEST
  13460. int i;
  13461. #endif
  13462. Keys* keys = &ssl->keys;
  13463. XMEMSET(tag, 0, sizeof(tag));
  13464. XMEMSET(nonce, 0, sizeof(nonce));
  13465. XMEMSET(poly, 0, sizeof(poly));
  13466. XMEMSET(add, 0, sizeof(add));
  13467. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  13468. /*
  13469. * For epochs 2+:
  13470. * * use ssl->secure_renegotiation when encrypting the current epoch as it
  13471. * has the current epoch cipher material
  13472. * * use PREV_ORDER if encrypting the epoch not in
  13473. * ssl->secure_renegotiation
  13474. */
  13475. /* opaque SEQ number stored for AD */
  13476. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  13477. if (ssl->keys.dtls_epoch ==
  13478. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  13479. keys = &ssl->secure_renegotiation->tmp_keys;
  13480. WriteSEQ(ssl, CUR_ORDER, add);
  13481. }
  13482. else
  13483. WriteSEQ(ssl, PREV_ORDER, add);
  13484. }
  13485. else
  13486. #endif
  13487. WriteSEQ(ssl, CUR_ORDER, add);
  13488. if (ssl->options.oldPoly != 0) {
  13489. /* get nonce. SEQ should not be incremented again here */
  13490. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  13491. }
  13492. /* Store the type, version. Unfortunately, they are in
  13493. * the input buffer ahead of the plaintext. */
  13494. #ifdef WOLFSSL_DTLS
  13495. if (ssl->options.dtls) {
  13496. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  13497. }
  13498. #endif
  13499. /* add TLS message size to additional data */
  13500. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  13501. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  13502. XMEMCPY(add + AEAD_TYPE_OFFSET, additionalSrc, 3);
  13503. #ifdef CHACHA_AEAD_TEST
  13504. printf("Encrypt Additional : ");
  13505. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  13506. printf("%02x", add[i]);
  13507. }
  13508. printf("\n\n");
  13509. printf("input before encryption :\n");
  13510. for (i = 0; i < sz; i++) {
  13511. printf("%02x", input[i]);
  13512. if ((i + 1) % 16 == 0)
  13513. printf("\n");
  13514. }
  13515. printf("\n");
  13516. #endif
  13517. if (ssl->options.oldPoly == 0) {
  13518. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  13519. * record sequence number XORed with client_write_IV/server_write_IV */
  13520. XMEMCPY(nonce, keys->aead_enc_imp_IV, CHACHA20_IMP_IV_SZ);
  13521. nonce[4] ^= add[0];
  13522. nonce[5] ^= add[1];
  13523. nonce[6] ^= add[2];
  13524. nonce[7] ^= add[3];
  13525. nonce[8] ^= add[4];
  13526. nonce[9] ^= add[5];
  13527. nonce[10] ^= add[6];
  13528. nonce[11] ^= add[7];
  13529. }
  13530. /* set the nonce for chacha and get poly1305 key */
  13531. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 0)) != 0) {
  13532. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13533. return ret;
  13534. }
  13535. /* create Poly1305 key using chacha20 keystream */
  13536. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, poly,
  13537. poly, sizeof(poly))) != 0) {
  13538. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13539. return ret;
  13540. }
  13541. /* set the counter after getting poly1305 key */
  13542. if ((ret = wc_Chacha_SetIV(ssl->encrypt.chacha, nonce, 1)) != 0) {
  13543. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13544. return ret;
  13545. }
  13546. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  13547. /* encrypt the plain text */
  13548. if ((ret = wc_Chacha_Process(ssl->encrypt.chacha, out,
  13549. input, msgLen)) != 0) {
  13550. ForceZero(poly, sizeof(poly));
  13551. return ret;
  13552. }
  13553. /* get the poly1305 tag using either old padding scheme or more recent */
  13554. if (ssl->options.oldPoly != 0) {
  13555. if ((ret = Poly1305TagOld(ssl, add, (const byte* )out,
  13556. poly, sz, tag)) != 0) {
  13557. ForceZero(poly, sizeof(poly));
  13558. return ret;
  13559. }
  13560. }
  13561. else {
  13562. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  13563. sizeof(poly))) != 0) {
  13564. ForceZero(poly, sizeof(poly));
  13565. return ret;
  13566. }
  13567. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  13568. sizeof(add), out, msgLen, tag, sizeof(tag))) != 0) {
  13569. ForceZero(poly, sizeof(poly));
  13570. return ret;
  13571. }
  13572. }
  13573. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  13574. /* append tag to ciphertext */
  13575. XMEMCPY(out + msgLen, tag, sizeof(tag));
  13576. AeadIncrementExpIV(ssl);
  13577. #ifdef CHACHA_AEAD_TEST
  13578. printf("mac tag :\n");
  13579. for (i = 0; i < 16; i++) {
  13580. printf("%02x", tag[i]);
  13581. if ((i + 1) % 16 == 0)
  13582. printf("\n");
  13583. }
  13584. printf("\n\noutput after encrypt :\n");
  13585. for (i = 0; i < sz; i++) {
  13586. printf("%02x", out[i]);
  13587. if ((i + 1) % 16 == 0)
  13588. printf("\n");
  13589. }
  13590. printf("\n");
  13591. #endif
  13592. return ret;
  13593. }
  13594. /* When the flag oldPoly is not set this follows RFC7905. When oldPoly is set
  13595. * the implementation follows an older draft for creating the nonce and MAC.
  13596. * The flag oldPoly gets set automatically depending on what cipher suite was
  13597. * negotiated in the handshake. This is able to be done because the IDs for the
  13598. * cipher suites was updated in RFC7905 giving unique values for the older
  13599. * draft in comparison to the more recent RFC.
  13600. *
  13601. * ssl WOLFSSL structure to get cipher and TLS state from
  13602. * plain output buffer to hold decrypted data
  13603. * input data to decrypt
  13604. * sz size of input
  13605. *
  13606. * Return 0 on success negative values in error case
  13607. */
  13608. static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input,
  13609. word16 sz)
  13610. {
  13611. byte add[AEAD_AUTH_DATA_SZ];
  13612. byte nonce[CHACHA20_NONCE_SZ];
  13613. byte tag[POLY1305_AUTH_SZ];
  13614. byte poly[CHACHA20_256_KEY_SIZE]; /* generated key for mac */
  13615. int ret = 0;
  13616. int msgLen = (sz - ssl->specs.aead_mac_size);
  13617. Keys* keys = &ssl->keys;
  13618. #ifdef CHACHA_AEAD_TEST
  13619. int i;
  13620. printf("input before decrypt :\n");
  13621. for (i = 0; i < sz; i++) {
  13622. printf("%02x", input[i]);
  13623. if ((i + 1) % 16 == 0)
  13624. printf("\n");
  13625. }
  13626. printf("\n");
  13627. #endif
  13628. XMEMSET(tag, 0, sizeof(tag));
  13629. XMEMSET(poly, 0, sizeof(poly));
  13630. XMEMSET(nonce, 0, sizeof(nonce));
  13631. XMEMSET(add, 0, sizeof(add));
  13632. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  13633. /*
  13634. * For epochs 2+:
  13635. * * use ssl->secure_renegotiation when decrypting the latest epoch as it
  13636. * has the latest epoch cipher material
  13637. */
  13638. if (ssl->options.dtls && DtlsSCRKeysSet(ssl) &&
  13639. ssl->keys.curEpoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
  13640. keys = &ssl->secure_renegotiation->tmp_keys;
  13641. #endif
  13642. /* sequence number field is 64-bits */
  13643. WriteSEQ(ssl, PEER_ORDER, add);
  13644. if (ssl->options.oldPoly != 0) {
  13645. /* get nonce, SEQ should not be incremented again here */
  13646. XMEMCPY(nonce + CHACHA20_OLD_OFFSET, add, OPAQUE32_LEN * 2);
  13647. }
  13648. /* get AD info */
  13649. /* Store the type, version. */
  13650. add[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  13651. add[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  13652. add[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  13653. /* add TLS message size to additional data */
  13654. add[AEAD_AUTH_DATA_SZ - 2] = (msgLen >> 8) & 0xff;
  13655. add[AEAD_AUTH_DATA_SZ - 1] = msgLen & 0xff;
  13656. #ifdef CHACHA_AEAD_TEST
  13657. printf("Decrypt Additional : ");
  13658. for (i = 0; i < AEAD_AUTH_DATA_SZ; i++) {
  13659. printf("%02x", add[i]);
  13660. }
  13661. printf("\n\n");
  13662. #endif
  13663. if (ssl->options.oldPoly == 0) {
  13664. /* nonce is formed by 4 0x00 byte padded to the left followed by 8 byte
  13665. * record sequence number XORed with client_write_IV/server_write_IV */
  13666. XMEMCPY(nonce, keys->aead_dec_imp_IV, CHACHA20_IMP_IV_SZ);
  13667. nonce[4] ^= add[0];
  13668. nonce[5] ^= add[1];
  13669. nonce[6] ^= add[2];
  13670. nonce[7] ^= add[3];
  13671. nonce[8] ^= add[4];
  13672. nonce[9] ^= add[5];
  13673. nonce[10] ^= add[6];
  13674. nonce[11] ^= add[7];
  13675. }
  13676. /* set nonce and get poly1305 key */
  13677. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 0)) != 0) {
  13678. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13679. return ret;
  13680. }
  13681. /* use chacha20 keystream to get poly1305 key for tag */
  13682. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, poly,
  13683. poly, sizeof(poly))) != 0) {
  13684. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13685. return ret;
  13686. }
  13687. /* set counter after getting poly1305 key */
  13688. if ((ret = wc_Chacha_SetIV(ssl->decrypt.chacha, nonce, 1)) != 0) {
  13689. ForceZero(nonce, CHACHA20_NONCE_SZ);
  13690. return ret;
  13691. }
  13692. ForceZero(nonce, CHACHA20_NONCE_SZ); /* done with nonce, clear it */
  13693. /* get the tag using Poly1305 */
  13694. if (ssl->options.oldPoly != 0) {
  13695. if ((ret = Poly1305TagOld(ssl, add, input, poly, sz, tag)) != 0) {
  13696. ForceZero(poly, sizeof(poly));
  13697. return ret;
  13698. }
  13699. }
  13700. else {
  13701. if ((ret = wc_Poly1305SetKey(ssl->auth.poly1305, poly,
  13702. sizeof(poly))) != 0) {
  13703. ForceZero(poly, sizeof(poly));
  13704. return ret;
  13705. }
  13706. if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add,
  13707. sizeof(add), input, msgLen, tag, sizeof(tag))) != 0) {
  13708. ForceZero(poly, sizeof(poly));
  13709. return ret;
  13710. }
  13711. }
  13712. ForceZero(poly, sizeof(poly)); /* done with poly1305 key, clear it */
  13713. /* check tag sent along with packet */
  13714. if (ConstantCompare(input + msgLen, tag, ssl->specs.aead_mac_size) != 0) {
  13715. WOLFSSL_MSG("MAC did not match");
  13716. if (!ssl->options.dtls)
  13717. SendAlert(ssl, alert_fatal, bad_record_mac);
  13718. return VERIFY_MAC_ERROR;
  13719. }
  13720. /* if the tag was good decrypt message */
  13721. if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain,
  13722. input, msgLen)) != 0)
  13723. return ret;
  13724. #ifdef CHACHA_AEAD_TEST
  13725. printf("plain after decrypt :\n");
  13726. for (i = 0; i < sz; i++) {
  13727. printf("%02x", plain[i]);
  13728. if ((i + 1) % 16 == 0)
  13729. printf("\n");
  13730. }
  13731. printf("\n");
  13732. #endif
  13733. return ret;
  13734. }
  13735. #endif /* HAVE_CHACHA && HAVE_POLY1305 && !NO_CHAPOL_AEAD*/
  13736. #endif /* HAVE_AEAD */
  13737. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13738. #if !defined(NO_GCM_ENCRYPT_EXTRA) && \
  13739. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  13740. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  13741. /* The following type is used to share code between AES-GCM and AES-CCM. */
  13742. typedef int (*AesAuthEncryptFunc)(Aes* aes, byte* out,
  13743. const byte* in, word32 sz,
  13744. byte* iv, word32 ivSz,
  13745. byte* authTag, word32 authTagSz,
  13746. const byte* authIn, word32 authInSz);
  13747. #define AES_AUTH_ENCRYPT_FUNC AesAuthEncryptFunc
  13748. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt_ex
  13749. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt_ex
  13750. #else
  13751. #define AES_AUTH_ENCRYPT_FUNC wc_AesAuthEncryptFunc
  13752. #define AES_GCM_ENCRYPT wc_AesGcmEncrypt
  13753. #define AES_CCM_ENCRYPT wc_AesCcmEncrypt
  13754. #endif
  13755. #endif
  13756. static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input,
  13757. word16 sz, int asyncOkay)
  13758. {
  13759. int ret = 0;
  13760. #ifdef WOLFSSL_ASYNC_CRYPT
  13761. WC_ASYNC_DEV* asyncDev = NULL;
  13762. word32 event_flags = WC_ASYNC_FLAG_CALL_AGAIN;
  13763. #else
  13764. (void)asyncOkay;
  13765. #endif
  13766. (void)out;
  13767. (void)input;
  13768. (void)sz;
  13769. if (input == NULL) {
  13770. return BAD_FUNC_ARG;
  13771. }
  13772. switch (ssl->specs.bulk_cipher_algorithm) {
  13773. #ifdef BUILD_ARC4
  13774. case wolfssl_rc4:
  13775. wc_Arc4Process(ssl->encrypt.arc4, out, input, sz);
  13776. break;
  13777. #endif
  13778. #ifdef BUILD_DES3
  13779. case wolfssl_triple_des:
  13780. #ifdef WOLFSSL_ASYNC_CRYPT
  13781. /* initialize event */
  13782. asyncDev = &ssl->encrypt.des3->asyncDev;
  13783. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  13784. if (ret != 0)
  13785. break;
  13786. #endif
  13787. ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz);
  13788. #ifdef WOLFSSL_ASYNC_CRYPT
  13789. if (ret == WC_PENDING_E && asyncOkay) {
  13790. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  13791. }
  13792. #endif
  13793. break;
  13794. #endif
  13795. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  13796. case wolfssl_aes:
  13797. #ifdef WOLFSSL_ASYNC_CRYPT
  13798. /* initialize event */
  13799. asyncDev = &ssl->encrypt.aes->asyncDev;
  13800. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  13801. if (ret != 0)
  13802. break;
  13803. #endif
  13804. ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz);
  13805. #ifdef WOLFSSL_ASYNC_CRYPT
  13806. if (ret == WC_PENDING_E && asyncOkay) {
  13807. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  13808. }
  13809. #endif
  13810. break;
  13811. #endif
  13812. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13813. case wolfssl_aes_gcm:
  13814. case wolfssl_aes_ccm:/* GCM AEAD macros use same size as CCM */
  13815. {
  13816. AES_AUTH_ENCRYPT_FUNC aes_auth_fn;
  13817. const byte* additionalSrc;
  13818. #ifdef WOLFSSL_ASYNC_CRYPT
  13819. /* initialize event */
  13820. asyncDev = &ssl->encrypt.aes->asyncDev;
  13821. ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags);
  13822. if (ret != 0)
  13823. break;
  13824. #endif
  13825. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  13826. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  13827. ? AES_GCM_ENCRYPT : AES_CCM_ENCRYPT;
  13828. #elif defined(BUILD_AESGCM)
  13829. aes_auth_fn = AES_GCM_ENCRYPT;
  13830. #else
  13831. aes_auth_fn = AES_CCM_ENCRYPT;
  13832. #endif
  13833. additionalSrc = input - 5;
  13834. XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  13835. /* sequence number field is 64-bits */
  13836. WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional);
  13837. /* Store the type, version. Unfortunately, they are in
  13838. * the input buffer ahead of the plaintext. */
  13839. #ifdef WOLFSSL_DTLS
  13840. if (ssl->options.dtls) {
  13841. additionalSrc -= DTLS_HANDSHAKE_EXTRA;
  13842. }
  13843. #endif
  13844. XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET,
  13845. additionalSrc, 3);
  13846. /* Store the length of the plain text minus the explicit
  13847. * IV length minus the authentication tag size. */
  13848. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  13849. ssl->encrypt.additional + AEAD_LEN_OFFSET);
  13850. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  13851. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  13852. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  13853. XMEMCPY(ssl->encrypt.nonce,
  13854. ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ);
  13855. XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ,
  13856. ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  13857. #endif
  13858. ret = aes_auth_fn(ssl->encrypt.aes,
  13859. out + AESGCM_EXP_IV_SZ, input + AESGCM_EXP_IV_SZ,
  13860. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  13861. ssl->encrypt.nonce, AESGCM_NONCE_SZ,
  13862. out + sz - ssl->specs.aead_mac_size,
  13863. ssl->specs.aead_mac_size,
  13864. ssl->encrypt.additional, AEAD_AUTH_DATA_SZ);
  13865. #ifdef WOLFSSL_ASYNC_CRYPT
  13866. if (ret == WC_PENDING_E && asyncOkay) {
  13867. ret = wolfSSL_AsyncPush(ssl, asyncDev);
  13868. }
  13869. #endif
  13870. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  13871. ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \
  13872. (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)))
  13873. XMEMCPY(out,
  13874. ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ);
  13875. #endif
  13876. }
  13877. break;
  13878. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13879. #ifdef HAVE_CAMELLIA
  13880. case wolfssl_camellia:
  13881. ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz);
  13882. break;
  13883. #endif
  13884. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  13885. !defined(NO_CHAPOL_AEAD)
  13886. case wolfssl_chacha:
  13887. ret = ChachaAEADEncrypt(ssl, out, input, sz);
  13888. break;
  13889. #endif
  13890. #ifdef HAVE_NULL_CIPHER
  13891. case wolfssl_cipher_null:
  13892. if (input != out) {
  13893. XMEMMOVE(out, input, sz);
  13894. }
  13895. break;
  13896. #endif
  13897. default:
  13898. WOLFSSL_MSG("wolfSSL Encrypt programming error");
  13899. ret = ENCRYPT_ERROR;
  13900. }
  13901. #ifdef WOLFSSL_ASYNC_CRYPT
  13902. /* if async is not okay, then block */
  13903. if (ret == WC_PENDING_E && !asyncOkay) {
  13904. ret = wc_AsyncWait(ret, asyncDev, event_flags);
  13905. }
  13906. #endif
  13907. return ret;
  13908. }
  13909. static WC_INLINE int Encrypt(WOLFSSL* ssl, byte* out, const byte* input,
  13910. word16 sz, int asyncOkay)
  13911. {
  13912. int ret = 0;
  13913. #ifdef WOLFSSL_ASYNC_CRYPT
  13914. if (ssl->error == WC_PENDING_E) {
  13915. ssl->error = 0; /* clear async */
  13916. }
  13917. #endif
  13918. switch (ssl->encrypt.state) {
  13919. case CIPHER_STATE_BEGIN:
  13920. {
  13921. if (ssl->encrypt.setup == 0) {
  13922. WOLFSSL_MSG("Encrypt ciphers not setup");
  13923. return ENCRYPT_ERROR;
  13924. }
  13925. #ifdef HAVE_FUZZER
  13926. if (ssl->fuzzerCb)
  13927. ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx);
  13928. #endif
  13929. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13930. /* make sure AES GCM/CCM memory is allocated */
  13931. /* free for these happens in FreeCiphers */
  13932. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  13933. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  13934. /* make sure auth iv and auth are allocated */
  13935. if (ssl->encrypt.additional == NULL)
  13936. ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  13937. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  13938. if (ssl->encrypt.nonce == NULL)
  13939. ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  13940. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  13941. if (ssl->encrypt.additional == NULL ||
  13942. ssl->encrypt.nonce == NULL) {
  13943. return MEMORY_E;
  13944. }
  13945. }
  13946. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13947. /* Advance state and proceed */
  13948. ssl->encrypt.state = CIPHER_STATE_DO;
  13949. }
  13950. FALL_THROUGH;
  13951. case CIPHER_STATE_DO:
  13952. {
  13953. ret = EncryptDo(ssl, out, input, sz, asyncOkay);
  13954. /* Advance state */
  13955. ssl->encrypt.state = CIPHER_STATE_END;
  13956. #ifdef WOLFSSL_ASYNC_CRYPT
  13957. /* If pending, then leave and return will resume below */
  13958. if (ret == WC_PENDING_E) {
  13959. return ret;
  13960. }
  13961. #endif
  13962. }
  13963. FALL_THROUGH;
  13964. case CIPHER_STATE_END:
  13965. {
  13966. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  13967. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  13968. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  13969. {
  13970. /* finalize authentication cipher */
  13971. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  13972. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  13973. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))
  13974. AeadIncrementExpIV(ssl);
  13975. #endif
  13976. if (ssl->encrypt.nonce)
  13977. ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ);
  13978. }
  13979. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  13980. break;
  13981. }
  13982. default:
  13983. break;
  13984. }
  13985. /* Reset state */
  13986. ssl->encrypt.state = CIPHER_STATE_BEGIN;
  13987. return ret;
  13988. }
  13989. static WC_INLINE int DecryptDo(WOLFSSL* ssl, byte* plain, const byte* input,
  13990. word16 sz)
  13991. {
  13992. int ret = 0;
  13993. (void)plain;
  13994. (void)input;
  13995. (void)sz;
  13996. switch (ssl->specs.bulk_cipher_algorithm)
  13997. {
  13998. #ifdef BUILD_ARC4
  13999. case wolfssl_rc4:
  14000. wc_Arc4Process(ssl->decrypt.arc4, plain, input, sz);
  14001. break;
  14002. #endif
  14003. #ifdef BUILD_DES3
  14004. case wolfssl_triple_des:
  14005. #ifdef WOLFSSL_ASYNC_CRYPT
  14006. /* initialize event */
  14007. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.des3->asyncDev,
  14008. WC_ASYNC_FLAG_CALL_AGAIN);
  14009. if (ret != 0)
  14010. break;
  14011. #endif
  14012. ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz);
  14013. #ifdef WOLFSSL_ASYNC_CRYPT
  14014. if (ret == WC_PENDING_E) {
  14015. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev);
  14016. }
  14017. #endif
  14018. break;
  14019. #endif
  14020. #if defined(BUILD_AES) && defined(HAVE_AES_CBC)
  14021. case wolfssl_aes:
  14022. #ifdef WOLFSSL_ASYNC_CRYPT
  14023. /* initialize event */
  14024. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  14025. WC_ASYNC_FLAG_CALL_AGAIN);
  14026. if (ret != 0)
  14027. break;
  14028. #endif
  14029. ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz);
  14030. #ifdef WOLFSSL_ASYNC_CRYPT
  14031. if (ret == WC_PENDING_E) {
  14032. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  14033. }
  14034. #endif
  14035. break;
  14036. #endif
  14037. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  14038. case wolfssl_aes_gcm:
  14039. case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
  14040. {
  14041. wc_AesAuthDecryptFunc aes_auth_fn;
  14042. #ifdef WOLFSSL_ASYNC_CRYPT
  14043. /* initialize event */
  14044. ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev,
  14045. WC_ASYNC_FLAG_CALL_AGAIN);
  14046. if (ret != 0)
  14047. break;
  14048. #endif
  14049. #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
  14050. aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
  14051. ? wc_AesGcmDecrypt : wc_AesCcmDecrypt;
  14052. #elif defined(BUILD_AESGCM)
  14053. aes_auth_fn = wc_AesGcmDecrypt;
  14054. #else
  14055. aes_auth_fn = wc_AesCcmDecrypt;
  14056. #endif
  14057. XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ);
  14058. /* sequence number field is 64-bits */
  14059. WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional);
  14060. ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type;
  14061. ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor;
  14062. ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor;
  14063. c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  14064. ssl->decrypt.additional + AEAD_LEN_OFFSET);
  14065. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  14066. if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
  14067. XMEMCPY(ssl->decrypt.nonce,
  14068. ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
  14069. AESGCM_IMP_IV_SZ);
  14070. else
  14071. #endif
  14072. XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
  14073. AESGCM_IMP_IV_SZ);
  14074. XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
  14075. AESGCM_EXP_IV_SZ);
  14076. if ((ret = aes_auth_fn(ssl->decrypt.aes,
  14077. plain + AESGCM_EXP_IV_SZ,
  14078. input + AESGCM_EXP_IV_SZ,
  14079. sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
  14080. ssl->decrypt.nonce, AESGCM_NONCE_SZ,
  14081. input + sz - ssl->specs.aead_mac_size,
  14082. ssl->specs.aead_mac_size,
  14083. ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) {
  14084. #ifdef WOLFSSL_ASYNC_CRYPT
  14085. if (ret == WC_PENDING_E) {
  14086. ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev);
  14087. }
  14088. #endif
  14089. }
  14090. }
  14091. break;
  14092. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  14093. #ifdef HAVE_CAMELLIA
  14094. case wolfssl_camellia:
  14095. ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz);
  14096. break;
  14097. #endif
  14098. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  14099. !defined(NO_CHAPOL_AEAD)
  14100. case wolfssl_chacha:
  14101. ret = ChachaAEADDecrypt(ssl, plain, input, sz);
  14102. break;
  14103. #endif
  14104. #ifdef HAVE_NULL_CIPHER
  14105. case wolfssl_cipher_null:
  14106. if (input != plain) {
  14107. XMEMMOVE(plain, input, sz);
  14108. }
  14109. break;
  14110. #endif
  14111. default:
  14112. WOLFSSL_MSG("wolfSSL Decrypt programming error");
  14113. ret = DECRYPT_ERROR;
  14114. }
  14115. return ret;
  14116. }
  14117. static int DecryptTls(WOLFSSL* ssl, byte* plain, const byte* input, word16 sz)
  14118. {
  14119. int ret = 0;
  14120. #ifdef WOLFSSL_ASYNC_CRYPT
  14121. ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state);
  14122. if (ret != WC_NOT_PENDING_E) {
  14123. /* check for still pending */
  14124. if (ret == WC_PENDING_E)
  14125. return ret;
  14126. ssl->error = 0; /* clear async */
  14127. /* let failures through so CIPHER_STATE_END logic is run */
  14128. }
  14129. else
  14130. #endif
  14131. {
  14132. /* Reset state */
  14133. ret = 0;
  14134. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  14135. }
  14136. switch (ssl->decrypt.state) {
  14137. case CIPHER_STATE_BEGIN:
  14138. {
  14139. if (ssl->decrypt.setup == 0) {
  14140. WOLFSSL_MSG("Decrypt ciphers not setup");
  14141. return DECRYPT_ERROR;
  14142. }
  14143. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  14144. /* make sure AES GCM/CCM memory is allocated */
  14145. /* free for these happens in FreeCiphers */
  14146. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  14147. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  14148. /* make sure auth iv and auth are allocated */
  14149. if (ssl->decrypt.additional == NULL)
  14150. ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ,
  14151. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  14152. if (ssl->decrypt.nonce == NULL)
  14153. ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ,
  14154. ssl->heap, DYNAMIC_TYPE_AES_BUFFER);
  14155. if (ssl->decrypt.additional == NULL ||
  14156. ssl->decrypt.nonce == NULL) {
  14157. return MEMORY_E;
  14158. }
  14159. }
  14160. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  14161. /* Advance state and proceed */
  14162. ssl->decrypt.state = CIPHER_STATE_DO;
  14163. }
  14164. FALL_THROUGH;
  14165. case CIPHER_STATE_DO:
  14166. {
  14167. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  14168. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  14169. /* For epochs >1 the current cipher parameters are located in
  14170. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  14171. * parameters and for epoch 1 use ssl->keys */
  14172. if (ssl->keys.curEpoch ==
  14173. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  14174. if (ssl->decrypt.src != SCR) {
  14175. ssl->secure_renegotiation->cache_status =
  14176. SCR_CACHE_NEEDED;
  14177. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  14178. break;
  14179. }
  14180. }
  14181. else {
  14182. if (ssl->decrypt.src != KEYS) {
  14183. ssl->secure_renegotiation->cache_status =
  14184. SCR_CACHE_NULL;
  14185. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  14186. break;
  14187. }
  14188. }
  14189. }
  14190. #endif
  14191. ret = DecryptDo(ssl, plain, input, sz);
  14192. /* Advance state */
  14193. ssl->decrypt.state = CIPHER_STATE_END;
  14194. #ifdef WOLFSSL_ASYNC_CRYPT
  14195. /* If pending, leave and return below */
  14196. if (ret == WC_PENDING_E) {
  14197. return ret;
  14198. }
  14199. #endif
  14200. }
  14201. FALL_THROUGH;
  14202. case CIPHER_STATE_END:
  14203. {
  14204. #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM)
  14205. /* make sure AES GCM/CCM nonce is cleared */
  14206. if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm ||
  14207. ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) {
  14208. if (ssl->decrypt.nonce)
  14209. ForceZero(ssl->decrypt.nonce, AESGCM_NONCE_SZ);
  14210. if (ret < 0)
  14211. ret = VERIFY_MAC_ERROR;
  14212. }
  14213. #endif /* BUILD_AESGCM || HAVE_AESCCM */
  14214. break;
  14215. }
  14216. default:
  14217. break;
  14218. }
  14219. /* Reset state */
  14220. ssl->decrypt.state = CIPHER_STATE_BEGIN;
  14221. /* handle mac error case */
  14222. if (ret == VERIFY_MAC_ERROR) {
  14223. if (!ssl->options.dtls) {
  14224. SendAlert(ssl, alert_fatal, bad_record_mac);
  14225. }
  14226. #ifdef WOLFSSL_DTLS_DROP_STATS
  14227. if (ssl->options.dtls)
  14228. ssl->macDropCount++;
  14229. #endif /* WOLFSSL_DTLS_DROP_STATS */
  14230. }
  14231. return ret;
  14232. }
  14233. #endif /* !WOLFSSL_NO_TLS12 */
  14234. /* Check conditions for a cipher to have an explicit IV.
  14235. *
  14236. * ssl The SSL/TLS object.
  14237. * returns 1 if the cipher in use has an explicit IV and 0 otherwise.
  14238. */
  14239. static WC_INLINE int CipherHasExpIV(WOLFSSL *ssl)
  14240. {
  14241. #ifdef WOLFSSL_TLS13
  14242. if (ssl->options.tls1_3)
  14243. return 0;
  14244. #endif
  14245. return (ssl->specs.cipher_type == aead) &&
  14246. (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha);
  14247. }
  14248. /* check cipher text size for sanity */
  14249. static int SanityCheckCipherText(WOLFSSL* ssl, word32 encryptSz)
  14250. {
  14251. #ifdef HAVE_TRUNCATED_HMAC
  14252. word32 minLength = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  14253. : ssl->specs.hash_size;
  14254. #else
  14255. word32 minLength = ssl->specs.hash_size; /* covers stream */
  14256. #endif
  14257. #ifndef WOLFSSL_AEAD_ONLY
  14258. if (ssl->specs.cipher_type == block) {
  14259. #ifdef HAVE_ENCRYPT_THEN_MAC
  14260. if (ssl->options.startedETMRead) {
  14261. if ((encryptSz - MacSize(ssl)) % ssl->specs.block_size) {
  14262. WOLFSSL_MSG("Block ciphertext not block size");
  14263. return SANITY_CIPHER_E;
  14264. }
  14265. }
  14266. else
  14267. #endif
  14268. if (encryptSz % ssl->specs.block_size) {
  14269. WOLFSSL_MSG("Block ciphertext not block size");
  14270. return SANITY_CIPHER_E;
  14271. }
  14272. minLength++; /* pad byte */
  14273. if (ssl->specs.block_size > minLength)
  14274. minLength = ssl->specs.block_size;
  14275. if (ssl->options.tls1_1)
  14276. minLength += ssl->specs.block_size; /* explicit IV */
  14277. }
  14278. else
  14279. #endif
  14280. if (ssl->specs.cipher_type == aead) {
  14281. minLength = ssl->specs.aead_mac_size; /* authTag size */
  14282. if (CipherHasExpIV(ssl))
  14283. minLength += AESGCM_EXP_IV_SZ; /* explicit IV */
  14284. }
  14285. if (encryptSz < minLength) {
  14286. WOLFSSL_MSG("Ciphertext not minimum size");
  14287. return SANITY_CIPHER_E;
  14288. }
  14289. return 0;
  14290. }
  14291. #ifndef WOLFSSL_AEAD_ONLY
  14292. #ifdef WOLSSL_OLD_TIMINGPADVERIFY
  14293. #define COMPRESS_LOWER 64
  14294. #define COMPRESS_UPPER 55
  14295. #define COMPRESS_CONSTANT 13
  14296. #ifndef NO_OLD_TLS
  14297. static WC_INLINE void Md5Rounds(int rounds, const byte* data, int sz)
  14298. {
  14299. wc_Md5 md5;
  14300. int i;
  14301. wc_InitMd5(&md5); /* no error check on purpose, dummy round */
  14302. for (i = 0; i < rounds; i++)
  14303. wc_Md5Update(&md5, data, sz);
  14304. wc_Md5Free(&md5); /* in case needed to release resources */
  14305. }
  14306. /* do a dummy sha round */
  14307. static WC_INLINE void ShaRounds(int rounds, const byte* data, int sz)
  14308. {
  14309. wc_Sha sha;
  14310. int i;
  14311. wc_InitSha(&sha); /* no error check on purpose, dummy round */
  14312. for (i = 0; i < rounds; i++)
  14313. wc_ShaUpdate(&sha, data, sz);
  14314. wc_ShaFree(&sha); /* in case needed to release resources */
  14315. }
  14316. #endif
  14317. #ifndef NO_SHA256
  14318. static WC_INLINE void Sha256Rounds(int rounds, const byte* data, int sz)
  14319. {
  14320. wc_Sha256 sha256;
  14321. int i;
  14322. wc_InitSha256(&sha256); /* no error check on purpose, dummy round */
  14323. for (i = 0; i < rounds; i++) {
  14324. wc_Sha256Update(&sha256, data, sz);
  14325. /* no error check on purpose, dummy round */
  14326. }
  14327. wc_Sha256Free(&sha256); /* in case needed to release resources */
  14328. }
  14329. #endif
  14330. #ifdef WOLFSSL_SHA384
  14331. static WC_INLINE void Sha384Rounds(int rounds, const byte* data, int sz)
  14332. {
  14333. wc_Sha384 sha384;
  14334. int i;
  14335. wc_InitSha384(&sha384); /* no error check on purpose, dummy round */
  14336. for (i = 0; i < rounds; i++) {
  14337. wc_Sha384Update(&sha384, data, sz);
  14338. /* no error check on purpose, dummy round */
  14339. }
  14340. wc_Sha384Free(&sha384); /* in case needed to release resources */
  14341. }
  14342. #endif
  14343. #ifdef WOLFSSL_SHA512
  14344. static WC_INLINE void Sha512Rounds(int rounds, const byte* data, int sz)
  14345. {
  14346. wc_Sha512 sha512;
  14347. int i;
  14348. wc_InitSha512(&sha512); /* no error check on purpose, dummy round */
  14349. for (i = 0; i < rounds; i++) {
  14350. wc_Sha512Update(&sha512, data, sz);
  14351. /* no error check on purpose, dummy round */
  14352. }
  14353. wc_Sha512Free(&sha512); /* in case needed to release resources */
  14354. }
  14355. #endif
  14356. #ifdef WOLFSSL_RIPEMD
  14357. static WC_INLINE void RmdRounds(int rounds, const byte* data, int sz)
  14358. {
  14359. RipeMd ripemd;
  14360. int i;
  14361. wc_InitRipeMd(&ripemd);
  14362. for (i = 0; i < rounds; i++)
  14363. wc_RipeMdUpdate(&ripemd, data, sz);
  14364. }
  14365. #endif
  14366. /* Do dummy rounds */
  14367. static WC_INLINE void DoRounds(int type, int rounds, const byte* data, int sz)
  14368. {
  14369. (void)rounds;
  14370. (void)data;
  14371. (void)sz;
  14372. switch (type) {
  14373. case no_mac :
  14374. break;
  14375. #ifndef NO_OLD_TLS
  14376. #ifndef NO_MD5
  14377. case md5_mac :
  14378. Md5Rounds(rounds, data, sz);
  14379. break;
  14380. #endif
  14381. #ifndef NO_SHA
  14382. case sha_mac :
  14383. ShaRounds(rounds, data, sz);
  14384. break;
  14385. #endif
  14386. #endif
  14387. #ifndef NO_SHA256
  14388. case sha256_mac :
  14389. Sha256Rounds(rounds, data, sz);
  14390. break;
  14391. #endif
  14392. #ifdef WOLFSSL_SHA384
  14393. case sha384_mac :
  14394. Sha384Rounds(rounds, data, sz);
  14395. break;
  14396. #endif
  14397. #ifdef WOLFSSL_SHA512
  14398. case sha512_mac :
  14399. Sha512Rounds(rounds, data, sz);
  14400. break;
  14401. #endif
  14402. #ifdef WOLFSSL_RIPEMD
  14403. case rmd_mac :
  14404. RmdRounds(rounds, data, sz);
  14405. break;
  14406. #endif
  14407. default:
  14408. WOLFSSL_MSG("Bad round type");
  14409. break;
  14410. }
  14411. }
  14412. /* do number of compression rounds on dummy data */
  14413. static WC_INLINE void CompressRounds(WOLFSSL* ssl, int rounds, const byte* dummy)
  14414. {
  14415. if (rounds)
  14416. DoRounds(ssl->specs.mac_algorithm, rounds, dummy, COMPRESS_LOWER);
  14417. }
  14418. /* check all length bytes for the pad value, return 0 on success */
  14419. static int PadCheck(const byte* a, byte pad, int length)
  14420. {
  14421. int i;
  14422. int compareSum = 0;
  14423. for (i = 0; i < length; i++) {
  14424. compareSum |= a[i] ^ pad;
  14425. }
  14426. return compareSum;
  14427. }
  14428. /* get compression extra rounds */
  14429. static WC_INLINE int GetRounds(int pLen, int padLen, int t)
  14430. {
  14431. int roundL1 = 1; /* round up flags */
  14432. int roundL2 = 1;
  14433. int L1 = COMPRESS_CONSTANT + pLen - t;
  14434. int L2 = COMPRESS_CONSTANT + pLen - padLen - 1 - t;
  14435. L1 -= COMPRESS_UPPER;
  14436. L2 -= COMPRESS_UPPER;
  14437. if ( (L1 % COMPRESS_LOWER) == 0)
  14438. roundL1 = 0;
  14439. if ( (L2 % COMPRESS_LOWER) == 0)
  14440. roundL2 = 0;
  14441. L1 /= COMPRESS_LOWER;
  14442. L2 /= COMPRESS_LOWER;
  14443. L1 += roundL1;
  14444. L2 += roundL2;
  14445. return L1 - L2;
  14446. }
  14447. /* timing resistant pad/verify check, return 0 on success */
  14448. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int t,
  14449. int pLen, int content)
  14450. {
  14451. byte verify[WC_MAX_DIGEST_SIZE];
  14452. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  14453. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  14454. int ret = 0;
  14455. (void)dmy;
  14456. if ( (t + padLen + 1) > pLen) {
  14457. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  14458. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE);
  14459. /* still compare */
  14460. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  14461. ConstantCompare(verify, input + pLen - t, t);
  14462. return VERIFY_MAC_ERROR;
  14463. }
  14464. if (PadCheck(input + pLen - (padLen + 1), (byte)padLen, padLen + 1) != 0) {
  14465. WOLFSSL_MSG("PadCheck failed");
  14466. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  14467. /* still compare */
  14468. ssl->hmac(ssl, verify, input, pLen - t, -1, content, 1, PEER_ORDER);
  14469. ConstantCompare(verify, input + pLen - t, t);
  14470. return VERIFY_MAC_ERROR;
  14471. }
  14472. PadCheck(dummy, (byte)padLen, MAX_PAD_SIZE - padLen - 1);
  14473. ret = ssl->hmac(ssl, verify, input, pLen - padLen - 1 - t, -1, content,
  14474. 1, PEER_ORDER);
  14475. CompressRounds(ssl, GetRounds(pLen, padLen, t), dummy);
  14476. if (ConstantCompare(verify, input + (pLen - padLen - 1 - t), t) != 0) {
  14477. WOLFSSL_MSG("Verify MAC compare failed");
  14478. return VERIFY_MAC_ERROR;
  14479. }
  14480. /* treat any faulure as verify MAC error */
  14481. if (ret != 0)
  14482. ret = VERIFY_MAC_ERROR;
  14483. return ret;
  14484. }
  14485. #else
  14486. /* check all length bytes for the pad value, return 0 on success */
  14487. static int PadCheck(const byte* a, byte pad, int length)
  14488. {
  14489. int i;
  14490. int compareSum = 0;
  14491. for (i = 0; i < length; i++) {
  14492. compareSum |= a[i] ^ pad;
  14493. }
  14494. return compareSum;
  14495. }
  14496. /* Mask the padding bytes with the expected values.
  14497. * Constant time implementation - does maximum pad size possible.
  14498. *
  14499. * data Message data.
  14500. * sz Size of the message including MAC and padding and padding length.
  14501. * macSz Size of the MAC.
  14502. * returns 0 on success, otherwise failure.
  14503. */
  14504. static byte MaskPadding(const byte* data, int sz, int macSz)
  14505. {
  14506. int i;
  14507. int checkSz = sz - 1;
  14508. byte paddingSz = data[sz - 1];
  14509. byte mask;
  14510. byte good = ctMaskGT(paddingSz, sz - 1 - macSz);
  14511. if (checkSz > TLS_MAX_PAD_SZ)
  14512. checkSz = TLS_MAX_PAD_SZ;
  14513. for (i = 0; i < checkSz; i++) {
  14514. mask = ctMaskLTE(i, paddingSz);
  14515. good |= mask & (data[sz - 1 - i] ^ paddingSz);
  14516. }
  14517. return good;
  14518. }
  14519. /* Mask the MAC in the message with the MAC calculated.
  14520. * Constant time implementation - starts looking for MAC where maximum padding
  14521. * size has it.
  14522. *
  14523. * data Message data.
  14524. * sz Size of the message including MAC and padding and padding length.
  14525. * macSz Size of the MAC data.
  14526. * expMac Expected MAC value.
  14527. * returns 0 on success, otherwise failure.
  14528. */
  14529. static byte MaskMac(const byte* data, int sz, int macSz, byte* expMac)
  14530. {
  14531. int i, j;
  14532. unsigned char mac[WC_MAX_DIGEST_SIZE];
  14533. int scanStart = sz - 1 - TLS_MAX_PAD_SZ - macSz;
  14534. int macEnd = sz - 1 - data[sz - 1];
  14535. int macStart = macEnd - macSz;
  14536. int r = 0;
  14537. unsigned char started, notEnded;
  14538. unsigned char good = 0;
  14539. scanStart &= ctMaskIntGTE(scanStart, 0);
  14540. macStart &= ctMaskIntGTE(macStart, 0);
  14541. /* Div on Intel has different speeds depending on value.
  14542. * Use a bitwise AND or mod a specific value (converted to mul). */
  14543. if ((macSz & (macSz - 1)) == 0)
  14544. r = (macSz - (scanStart - macStart)) & (macSz - 1);
  14545. #ifndef NO_SHA
  14546. else if (macSz == WC_SHA_DIGEST_SIZE)
  14547. r = (macSz - (scanStart - macStart)) % WC_SHA_DIGEST_SIZE;
  14548. #endif
  14549. #ifdef WOLFSSL_SHA384
  14550. else if (macSz == WC_SHA384_DIGEST_SIZE)
  14551. r = (macSz - (scanStart - macStart)) % WC_SHA384_DIGEST_SIZE;
  14552. #endif
  14553. XMEMSET(mac, 0, macSz);
  14554. for (i = scanStart; i < sz; i += macSz) {
  14555. for (j = 0; j < macSz && j + i < sz; j++) {
  14556. started = ctMaskGTE(i + j, macStart);
  14557. notEnded = ctMaskLT(i + j, macEnd);
  14558. mac[j] |= started & notEnded & data[i + j];
  14559. }
  14560. }
  14561. if ((macSz & (macSz - 1)) == 0) {
  14562. for (i = 0; i < macSz; i++)
  14563. good |= expMac[i] ^ mac[(i + r) & (macSz - 1)];
  14564. }
  14565. #ifndef NO_SHA
  14566. else if (macSz == WC_SHA_DIGEST_SIZE) {
  14567. for (i = 0; i < macSz; i++)
  14568. good |= expMac[i] ^ mac[(i + r) % WC_SHA_DIGEST_SIZE];
  14569. }
  14570. #endif
  14571. #ifdef WOLFSSL_SHA384
  14572. else if (macSz == WC_SHA384_DIGEST_SIZE) {
  14573. for (i = 0; i < macSz; i++)
  14574. good |= expMac[i] ^ mac[(i + r) % WC_SHA384_DIGEST_SIZE];
  14575. }
  14576. #endif
  14577. return good;
  14578. }
  14579. /* timing resistant pad/verify check, return 0 on success */
  14580. int TimingPadVerify(WOLFSSL* ssl, const byte* input, int padLen, int macSz,
  14581. int pLen, int content)
  14582. {
  14583. byte verify[WC_MAX_DIGEST_SIZE];
  14584. byte good;
  14585. int ret = 0;
  14586. good = MaskPadding(input, pLen, macSz);
  14587. /* 4th argument has potential to underflow, ssl->hmac function should
  14588. * either increment the size by (macSz + padLen + 1) before use or check on
  14589. * the size to make sure is valid. */
  14590. ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
  14591. content, 1, PEER_ORDER);
  14592. good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
  14593. /* Non-zero on failure. */
  14594. good = (byte)~(word32)good;
  14595. good &= good >> 4;
  14596. good &= good >> 2;
  14597. good &= good >> 1;
  14598. /* Make ret negative on masking failure. */
  14599. ret -= 1 - good;
  14600. /* Treat any failure as verify MAC error. */
  14601. if (ret != 0)
  14602. ret = VERIFY_MAC_ERROR;
  14603. return ret;
  14604. }
  14605. #endif
  14606. #endif
  14607. int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx, int sniff)
  14608. {
  14609. word32 msgSz = ssl->keys.encryptSz;
  14610. word32 idx = *inOutIdx;
  14611. int dataSz;
  14612. int ivExtra = 0;
  14613. byte* rawData = input + idx; /* keep current for hmac */
  14614. #ifdef HAVE_LIBZ
  14615. byte decomp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  14616. #endif
  14617. #ifdef WOLFSSL_EARLY_DATA
  14618. if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
  14619. int process = 0;
  14620. if (ssl->options.side == WOLFSSL_SERVER_END) {
  14621. if ((ssl->earlyData != no_early_data) &&
  14622. (ssl->options.clientState == CLIENT_HELLO_COMPLETE)) {
  14623. process = 1;
  14624. }
  14625. if (!process) {
  14626. WOLFSSL_MSG("Ignoring EarlyData!");
  14627. *inOutIdx += ssl->curSize;
  14628. if (*inOutIdx > ssl->buffers.inputBuffer.length)
  14629. return BUFFER_E;
  14630. return 0;
  14631. }
  14632. }
  14633. if (!process) {
  14634. WOLFSSL_MSG("Received App data before a handshake completed");
  14635. if (sniff == NO_SNIFF) {
  14636. SendAlert(ssl, alert_fatal, unexpected_message);
  14637. }
  14638. return OUT_OF_ORDER_E;
  14639. }
  14640. }
  14641. else
  14642. #endif
  14643. if (ssl->options.handShakeDone == 0) {
  14644. WOLFSSL_MSG("Received App data before a handshake completed");
  14645. if (sniff == NO_SNIFF) {
  14646. SendAlert(ssl, alert_fatal, unexpected_message);
  14647. }
  14648. return OUT_OF_ORDER_E;
  14649. }
  14650. #ifndef WOLFSSL_AEAD_ONLY
  14651. if (ssl->specs.cipher_type == block) {
  14652. if (ssl->options.tls1_1)
  14653. ivExtra = ssl->specs.block_size;
  14654. }
  14655. else
  14656. #endif
  14657. if (ssl->specs.cipher_type == aead) {
  14658. if (CipherHasExpIV(ssl))
  14659. ivExtra = AESGCM_EXP_IV_SZ;
  14660. }
  14661. dataSz = msgSz - ivExtra - ssl->keys.padSz;
  14662. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14663. if (ssl->options.startedETMRead)
  14664. dataSz -= MacSize(ssl);
  14665. #endif
  14666. if (dataSz < 0) {
  14667. WOLFSSL_MSG("App data buffer error, malicious input?");
  14668. if (sniff == NO_SNIFF) {
  14669. SendAlert(ssl, alert_fatal, unexpected_message);
  14670. }
  14671. return BUFFER_ERROR;
  14672. }
  14673. #ifdef WOLFSSL_EARLY_DATA
  14674. if (ssl->earlyData > early_data_ext) {
  14675. if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) {
  14676. if (sniff == NO_SNIFF) {
  14677. SendAlert(ssl, alert_fatal, unexpected_message);
  14678. }
  14679. return WOLFSSL_FATAL_ERROR;
  14680. }
  14681. ssl->earlyDataSz += dataSz;
  14682. }
  14683. #endif
  14684. /* read data */
  14685. if (dataSz) {
  14686. int rawSz = dataSz; /* keep raw size for idx adjustment */
  14687. #ifdef HAVE_LIBZ
  14688. if (ssl->options.usingCompression) {
  14689. dataSz = myDeCompress(ssl, rawData, dataSz, decomp, sizeof(decomp));
  14690. if (dataSz < 0) return dataSz;
  14691. }
  14692. #endif
  14693. idx += rawSz;
  14694. ssl->buffers.clearOutputBuffer.buffer = rawData;
  14695. ssl->buffers.clearOutputBuffer.length = dataSz;
  14696. }
  14697. idx += ssl->keys.padSz;
  14698. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14699. if (ssl->options.startedETMRead)
  14700. idx += MacSize(ssl);
  14701. #endif
  14702. #ifdef HAVE_LIBZ
  14703. /* decompress could be bigger, overwrite after verify */
  14704. if (ssl->options.usingCompression)
  14705. XMEMMOVE(rawData, decomp, dataSz);
  14706. #endif
  14707. *inOutIdx = idx;
  14708. #ifdef HAVE_SECURE_RENEGOTIATION
  14709. if (IsSCR(ssl)) {
  14710. /* Reset the processReply state since
  14711. * we finished processing this message. */
  14712. ssl->options.processReply = doProcessInit;
  14713. /* If we are in a secure renegotiation then APP DATA is treated
  14714. * differently */
  14715. return APP_DATA_READY;
  14716. }
  14717. #endif
  14718. return 0;
  14719. }
  14720. const char* AlertTypeToString(int type)
  14721. {
  14722. switch (type) {
  14723. case close_notify:
  14724. {
  14725. static const char close_notify_str[] =
  14726. "close_notify";
  14727. return close_notify_str;
  14728. }
  14729. case unexpected_message:
  14730. {
  14731. static const char unexpected_message_str[] =
  14732. "unexpected_message";
  14733. return unexpected_message_str;
  14734. }
  14735. case bad_record_mac:
  14736. {
  14737. static const char bad_record_mac_str[] =
  14738. "bad_record_mac";
  14739. return bad_record_mac_str;
  14740. }
  14741. case record_overflow:
  14742. {
  14743. static const char record_overflow_str[] =
  14744. "record_overflow";
  14745. return record_overflow_str;
  14746. }
  14747. case decompression_failure:
  14748. {
  14749. static const char decompression_failure_str[] =
  14750. "decompression_failure";
  14751. return decompression_failure_str;
  14752. }
  14753. case handshake_failure:
  14754. {
  14755. static const char handshake_failure_str[] =
  14756. "handshake_failure";
  14757. return handshake_failure_str;
  14758. }
  14759. case no_certificate:
  14760. {
  14761. static const char no_certificate_str[] =
  14762. "no_certificate";
  14763. return no_certificate_str;
  14764. }
  14765. case bad_certificate:
  14766. {
  14767. static const char bad_certificate_str[] =
  14768. "bad_certificate";
  14769. return bad_certificate_str;
  14770. }
  14771. case unsupported_certificate:
  14772. {
  14773. static const char unsupported_certificate_str[] =
  14774. "unsupported_certificate";
  14775. return unsupported_certificate_str;
  14776. }
  14777. case certificate_revoked:
  14778. {
  14779. static const char certificate_revoked_str[] =
  14780. "certificate_revoked";
  14781. return certificate_revoked_str;
  14782. }
  14783. case certificate_expired:
  14784. {
  14785. static const char certificate_expired_str[] =
  14786. "certificate_expired";
  14787. return certificate_expired_str;
  14788. }
  14789. case certificate_unknown:
  14790. {
  14791. static const char certificate_unknown_str[] =
  14792. "certificate_unknown";
  14793. return certificate_unknown_str;
  14794. }
  14795. case illegal_parameter:
  14796. {
  14797. static const char illegal_parameter_str[] =
  14798. "illegal_parameter";
  14799. return illegal_parameter_str;
  14800. }
  14801. case unknown_ca:
  14802. {
  14803. static const char unknown_ca_str[] =
  14804. "unknown_ca";
  14805. return unknown_ca_str;
  14806. }
  14807. case access_denied:
  14808. {
  14809. static const char access_denied_str[] =
  14810. "access_denied";
  14811. return access_denied_str;
  14812. }
  14813. case decode_error:
  14814. {
  14815. static const char decode_error_str[] =
  14816. "decode_error";
  14817. return decode_error_str;
  14818. }
  14819. case decrypt_error:
  14820. {
  14821. static const char decrypt_error_str[] =
  14822. "decrypt_error";
  14823. return decrypt_error_str;
  14824. }
  14825. #ifdef WOLFSSL_MYSQL_COMPATIBLE
  14826. /* catch name conflict for enum protocol with MYSQL build */
  14827. case wc_protocol_version:
  14828. {
  14829. static const char wc_protocol_version_str[] =
  14830. "wc_protocol_version";
  14831. return wc_protocol_version_str;
  14832. }
  14833. #else
  14834. case protocol_version:
  14835. {
  14836. static const char protocol_version_str[] =
  14837. "protocol_version";
  14838. return protocol_version_str;
  14839. }
  14840. #endif
  14841. case insufficient_security:
  14842. {
  14843. static const char insufficient_security_str[] =
  14844. "insufficient_security";
  14845. return insufficient_security_str;
  14846. }
  14847. case internal_error:
  14848. {
  14849. static const char internal_error_str[] =
  14850. "internal_error";
  14851. return internal_error_str;
  14852. }
  14853. case user_canceled:
  14854. {
  14855. static const char user_canceled_str[] =
  14856. "user_canceled";
  14857. return user_canceled_str;
  14858. }
  14859. case no_renegotiation:
  14860. {
  14861. static const char no_renegotiation_str[] =
  14862. "no_renegotiation";
  14863. return no_renegotiation_str;
  14864. }
  14865. case unrecognized_name:
  14866. {
  14867. static const char unrecognized_name_str[] =
  14868. "unrecognized_name";
  14869. return unrecognized_name_str;
  14870. }
  14871. case bad_certificate_status_response:
  14872. {
  14873. static const char bad_certificate_status_response_str[] =
  14874. "bad_certificate_status_response";
  14875. return bad_certificate_status_response_str;
  14876. }
  14877. case no_application_protocol:
  14878. {
  14879. static const char no_application_protocol_str[] =
  14880. "no_application_protocol";
  14881. return no_application_protocol_str;
  14882. }
  14883. default:
  14884. WOLFSSL_MSG("Unknown Alert");
  14885. return NULL;
  14886. }
  14887. }
  14888. static void LogAlert(int type)
  14889. {
  14890. #ifdef DEBUG_WOLFSSL
  14891. const char* typeStr;
  14892. char buff[60];
  14893. typeStr = AlertTypeToString(type);
  14894. if (typeStr != NULL) {
  14895. XSNPRINTF(buff, sizeof(buff), "Alert type: %s", typeStr);
  14896. WOLFSSL_MSG(buff);
  14897. }
  14898. #else
  14899. (void)type;
  14900. #endif /* DEBUG_WOLFSSL */
  14901. }
  14902. /* process alert, return level */
  14903. static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
  14904. {
  14905. byte level;
  14906. byte code;
  14907. word32 dataSz = (word32)ssl->curSize;
  14908. int ivExtra = 0;
  14909. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  14910. if (ssl->hsInfoOn)
  14911. AddPacketName(ssl, "Alert");
  14912. if (ssl->toInfoOn)
  14913. /* add record header back on to info + alert bytes level/code */
  14914. AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx -
  14915. RECORD_HEADER_SZ, RECORD_HEADER_SZ + ALERT_SIZE,
  14916. READ_PROTO, ssl->heap);
  14917. #endif
  14918. if (IsEncryptionOn(ssl, 0)) {
  14919. #ifndef WOLFSSL_AEAD_ONLY
  14920. if (ssl->specs.cipher_type == block) {
  14921. if (ssl->options.tls1_1)
  14922. ivExtra = ssl->specs.block_size;
  14923. }
  14924. else
  14925. #endif
  14926. if (ssl->specs.cipher_type == aead) {
  14927. if (CipherHasExpIV(ssl))
  14928. ivExtra = AESGCM_EXP_IV_SZ;
  14929. }
  14930. dataSz -= ivExtra;
  14931. dataSz -= ssl->keys.padSz;
  14932. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14933. if (ssl->options.startedETMRead)
  14934. dataSz -= MacSize(ssl);
  14935. #endif
  14936. }
  14937. /* make sure can read the message */
  14938. if (dataSz != ALERT_SIZE) {
  14939. #ifdef WOLFSSL_EXTRA_ALERTS
  14940. SendAlert(ssl, alert_fatal, unexpected_message);
  14941. #endif
  14942. return BUFFER_E;
  14943. }
  14944. level = input[(*inOutIdx)++];
  14945. code = input[(*inOutIdx)++];
  14946. ssl->alert_history.last_rx.code = code;
  14947. ssl->alert_history.last_rx.level = level;
  14948. *type = code;
  14949. if (level == alert_fatal) {
  14950. ssl->options.isClosed = 1; /* Don't send close_notify */
  14951. }
  14952. if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
  14953. WOLFSSL_MSG("Alert count exceeded");
  14954. #ifdef WOLFSSL_EXTRA_ALERTS
  14955. if (level != alert_warning || code != close_notify)
  14956. SendAlert(ssl, alert_fatal, unexpected_message);
  14957. #endif
  14958. return ALERT_COUNT_E;
  14959. }
  14960. LogAlert(*type);
  14961. if (*type == close_notify) {
  14962. ssl->options.closeNotify = 1;
  14963. }
  14964. WOLFSSL_ERROR(*type);
  14965. if (IsEncryptionOn(ssl, 0)) {
  14966. *inOutIdx += ssl->keys.padSz;
  14967. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  14968. if (ssl->options.startedETMRead)
  14969. *inOutIdx += MacSize(ssl);
  14970. #endif
  14971. }
  14972. return level;
  14973. }
  14974. static int GetInputData(WOLFSSL *ssl, word32 size)
  14975. {
  14976. int in;
  14977. int inSz;
  14978. int maxLength;
  14979. int usedLength;
  14980. int dtlsExtra = 0;
  14981. /* check max input length */
  14982. usedLength = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx;
  14983. maxLength = ssl->buffers.inputBuffer.bufferSize - usedLength;
  14984. inSz = (int)(size - usedLength); /* from last partial read */
  14985. #ifdef WOLFSSL_DTLS
  14986. if (ssl->options.dtls) {
  14987. if (size < ssl->dtls_expected_rx)
  14988. dtlsExtra = (int)(ssl->dtls_expected_rx - size);
  14989. inSz = ssl->dtls_expected_rx;
  14990. }
  14991. #endif
  14992. /* check that no lengths or size values are negative */
  14993. if (usedLength < 0 || maxLength < 0 || inSz <= 0) {
  14994. return BUFFER_ERROR;
  14995. }
  14996. if (inSz > maxLength) {
  14997. if (GrowInputBuffer(ssl, size + dtlsExtra, usedLength) < 0)
  14998. return MEMORY_E;
  14999. }
  15000. /* Put buffer data at start if not there */
  15001. if (usedLength > 0 && ssl->buffers.inputBuffer.idx != 0)
  15002. XMEMMOVE(ssl->buffers.inputBuffer.buffer,
  15003. ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.idx,
  15004. usedLength);
  15005. /* remove processed data */
  15006. ssl->buffers.inputBuffer.idx = 0;
  15007. ssl->buffers.inputBuffer.length = usedLength;
  15008. /* read data from network */
  15009. do {
  15010. in = wolfSSLReceive(ssl,
  15011. ssl->buffers.inputBuffer.buffer +
  15012. ssl->buffers.inputBuffer.length,
  15013. inSz);
  15014. if (in == WANT_READ)
  15015. return WANT_READ;
  15016. if (in < 0)
  15017. return SOCKET_ERROR_E;
  15018. if (in > inSz)
  15019. return RECV_OVERFLOW_E;
  15020. ssl->buffers.inputBuffer.length += in;
  15021. inSz -= in;
  15022. } while (ssl->buffers.inputBuffer.length < size);
  15023. #ifdef WOLFSSL_DEBUG_TLS
  15024. if (ssl->buffers.inputBuffer.idx == 0) {
  15025. WOLFSSL_MSG("Data received");
  15026. WOLFSSL_BUFFER(ssl->buffers.inputBuffer.buffer,
  15027. ssl->buffers.inputBuffer.length);
  15028. }
  15029. #endif
  15030. return 0;
  15031. }
  15032. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15033. static WC_INLINE int VerifyMacEnc(WOLFSSL* ssl, const byte* input, word32 msgSz,
  15034. int content)
  15035. {
  15036. int ret;
  15037. #ifdef HAVE_TRUNCATED_HMAC
  15038. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  15039. : ssl->specs.hash_size;
  15040. #else
  15041. word32 digestSz = ssl->specs.hash_size;
  15042. #endif
  15043. byte verify[WC_MAX_DIGEST_SIZE];
  15044. WOLFSSL_MSG("Verify MAC of Encrypted Data");
  15045. if (msgSz < digestSz) {
  15046. return VERIFY_MAC_ERROR;
  15047. }
  15048. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
  15049. ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
  15050. if (ret != 0) {
  15051. return VERIFY_MAC_ERROR;
  15052. }
  15053. return 0;
  15054. }
  15055. #endif
  15056. static WC_INLINE int VerifyMac(WOLFSSL* ssl, const byte* input, word32 msgSz,
  15057. int content, word32* padSz)
  15058. {
  15059. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  15060. int ivExtra = 0;
  15061. int ret;
  15062. word32 pad = 0;
  15063. word32 padByte = 0;
  15064. #ifdef HAVE_TRUNCATED_HMAC
  15065. word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
  15066. : ssl->specs.hash_size;
  15067. #else
  15068. word32 digestSz = ssl->specs.hash_size;
  15069. #endif
  15070. byte verify[WC_MAX_DIGEST_SIZE];
  15071. if (ssl->specs.cipher_type == block) {
  15072. if (ssl->options.tls1_1)
  15073. ivExtra = ssl->specs.block_size;
  15074. pad = *(input + msgSz - ivExtra - 1);
  15075. padByte = 1;
  15076. if (ssl->options.tls) {
  15077. #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
  15078. ret = PROTOCOLCB_UNAVAILABLE;
  15079. if(ssl->ctx->VerifyMacCb) {
  15080. void* ctx = wolfSSL_GetVerifyMacCtx(ssl);
  15081. ret = ssl->ctx->VerifyMacCb(ssl, input,
  15082. (msgSz - ivExtra) - digestSz - pad - 1,
  15083. digestSz, content, ctx);
  15084. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  15085. return ret;
  15086. }
  15087. }
  15088. if (!ssl->ctx->VerifyMacCb || ret == PROTOCOLCB_UNAVAILABLE)
  15089. #endif
  15090. ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra,
  15091. content);
  15092. if (ret != 0)
  15093. return ret;
  15094. }
  15095. else { /* sslv3, some implementations have bad padding, but don't
  15096. * allow bad read */
  15097. int badPadLen = 0;
  15098. byte dmy[sizeof(WOLFSSL) >= MAX_PAD_SIZE ? 1 : MAX_PAD_SIZE] = {0};
  15099. byte* dummy = sizeof(dmy) < MAX_PAD_SIZE ? (byte*) ssl : dmy;
  15100. (void)dmy;
  15101. if (pad > (msgSz - digestSz - 1)) {
  15102. WOLFSSL_MSG("Plain Len not long enough for pad/mac");
  15103. pad = 0; /* no bad read */
  15104. badPadLen = 1;
  15105. }
  15106. (void)PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */
  15107. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
  15108. pad, content, 1, PEER_ORDER);
  15109. if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
  15110. digestSz) != 0)
  15111. return VERIFY_MAC_ERROR;
  15112. if (ret != 0 || badPadLen)
  15113. return VERIFY_MAC_ERROR;
  15114. }
  15115. }
  15116. else if (ssl->specs.cipher_type == stream) {
  15117. ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
  15118. PEER_ORDER);
  15119. if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0){
  15120. return VERIFY_MAC_ERROR;
  15121. }
  15122. if (ret != 0)
  15123. return VERIFY_MAC_ERROR;
  15124. }
  15125. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  15126. if (ssl->specs.cipher_type == aead) {
  15127. *padSz = ssl->specs.aead_mac_size;
  15128. }
  15129. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY)
  15130. else {
  15131. *padSz = digestSz + pad + padByte;
  15132. }
  15133. #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */
  15134. (void)input;
  15135. (void)msgSz;
  15136. (void)content;
  15137. return 0;
  15138. }
  15139. int ProcessReply(WOLFSSL* ssl)
  15140. {
  15141. return ProcessReplyEx(ssl, 0);
  15142. }
  15143. /* Process input requests. Return 0 is done, 1 is call again to complete, and
  15144. negative number is error. If allowSocketErr is set, SOCKET_ERROR_E in
  15145. ssl->error will be whitelisted. This is useful when the connection has been
  15146. closed and the endpoint wants to check for an alert sent by the other end. */
  15147. int ProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
  15148. {
  15149. int ret = 0, type, readSz;
  15150. int atomicUser = 0;
  15151. word32 startIdx = 0;
  15152. #if defined(WOLFSSL_DTLS)
  15153. int used;
  15154. #endif
  15155. #ifdef ATOMIC_USER
  15156. if (ssl->ctx->DecryptVerifyCb)
  15157. atomicUser = 1;
  15158. #endif
  15159. if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
  15160. #ifdef HAVE_SECURE_RENEGOTIATION
  15161. && ssl->error != APP_DATA_READY
  15162. #endif
  15163. #ifdef WOLFSSL_ASYNC_CRYPT
  15164. && ssl->error != WC_PENDING_E
  15165. #endif
  15166. #ifdef WOLFSSL_NONBLOCK_OCSP
  15167. && ssl->error != OCSP_WANT_READ
  15168. #endif
  15169. && (allowSocketErr != 1 || ssl->error != SOCKET_ERROR_E)
  15170. ) {
  15171. WOLFSSL_MSG("ProcessReply retry in error state, not allowed");
  15172. return ssl->error;
  15173. }
  15174. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
  15175. /* process any pending DTLS messages - this flow can happen with async */
  15176. if (ssl->dtls_rx_msg_list != NULL) {
  15177. ret = DtlsMsgDrain(ssl);
  15178. if (ret != 0) {
  15179. WOLFSSL_ERROR(ret);
  15180. return ret;
  15181. }
  15182. }
  15183. #endif
  15184. for (;;) {
  15185. switch (ssl->options.processReply) {
  15186. /* in the WOLFSSL_SERVER case, get the first byte for detecting
  15187. * old client hello */
  15188. case doProcessInit:
  15189. readSz = RECORD_HEADER_SZ;
  15190. #ifdef WOLFSSL_DTLS
  15191. if (ssl->options.dtls)
  15192. readSz = DTLS_RECORD_HEADER_SZ;
  15193. #endif
  15194. /* get header or return error */
  15195. if (!ssl->options.dtls) {
  15196. if ((ret = GetInputData(ssl, readSz)) < 0)
  15197. return ret;
  15198. } else {
  15199. #ifdef WOLFSSL_DTLS
  15200. /* read ahead may already have header */
  15201. used = ssl->buffers.inputBuffer.length -
  15202. ssl->buffers.inputBuffer.idx;
  15203. if (used < readSz) {
  15204. if ((ret = GetInputData(ssl, readSz)) < 0)
  15205. return ret;
  15206. }
  15207. #endif
  15208. }
  15209. #ifdef OLD_HELLO_ALLOWED
  15210. /* see if sending SSLv2 client hello */
  15211. if ( ssl->options.side == WOLFSSL_SERVER_END &&
  15212. ssl->options.clientState == NULL_STATE &&
  15213. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx]
  15214. != handshake) {
  15215. byte b0, b1;
  15216. ssl->options.processReply = runProcessOldClientHello;
  15217. /* sanity checks before getting size at front */
  15218. if (ssl->buffers.inputBuffer.buffer[
  15219. ssl->buffers.inputBuffer.idx + OPAQUE16_LEN] != OLD_HELLO_ID) {
  15220. WOLFSSL_MSG("Not a valid old client hello");
  15221. return PARSE_ERROR;
  15222. }
  15223. if (ssl->buffers.inputBuffer.buffer[
  15224. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != SSLv3_MAJOR &&
  15225. ssl->buffers.inputBuffer.buffer[
  15226. ssl->buffers.inputBuffer.idx + OPAQUE24_LEN] != DTLS_MAJOR) {
  15227. WOLFSSL_MSG("Not a valid version in old client hello");
  15228. return PARSE_ERROR;
  15229. }
  15230. /* how many bytes need ProcessOldClientHello */
  15231. b0 =
  15232. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  15233. b1 =
  15234. ssl->buffers.inputBuffer.buffer[ssl->buffers.inputBuffer.idx++];
  15235. ssl->curSize = (word16)(((b0 & 0x7f) << 8) | b1);
  15236. }
  15237. else {
  15238. ssl->options.processReply = getRecordLayerHeader;
  15239. continue;
  15240. }
  15241. FALL_THROUGH;
  15242. /* in the WOLFSSL_SERVER case, run the old client hello */
  15243. case runProcessOldClientHello:
  15244. /* get sz bytes or return error */
  15245. if (!ssl->options.dtls) {
  15246. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  15247. return ret;
  15248. } else {
  15249. #ifdef WOLFSSL_DTLS
  15250. /* read ahead may already have */
  15251. used = ssl->buffers.inputBuffer.length -
  15252. ssl->buffers.inputBuffer.idx;
  15253. if (used < ssl->curSize)
  15254. if ((ret = GetInputData(ssl, ssl->curSize - used)) < 0)
  15255. return ret;
  15256. #endif /* WOLFSSL_DTLS */
  15257. }
  15258. ret = ProcessOldClientHello(ssl, ssl->buffers.inputBuffer.buffer,
  15259. &ssl->buffers.inputBuffer.idx,
  15260. ssl->buffers.inputBuffer.length -
  15261. ssl->buffers.inputBuffer.idx,
  15262. ssl->curSize);
  15263. if (ret < 0)
  15264. return ret;
  15265. else if (ssl->buffers.inputBuffer.idx ==
  15266. ssl->buffers.inputBuffer.length) {
  15267. ssl->options.processReply = doProcessInit;
  15268. return 0;
  15269. }
  15270. #endif /* OLD_HELLO_ALLOWED */
  15271. FALL_THROUGH;
  15272. /* get the record layer header */
  15273. case getRecordLayerHeader:
  15274. ret = GetRecordHeader(ssl, ssl->buffers.inputBuffer.buffer,
  15275. &ssl->buffers.inputBuffer.idx,
  15276. &ssl->curRL, &ssl->curSize);
  15277. #ifdef WOLFSSL_DTLS
  15278. if (ssl->options.dtls && ret == SEQUENCE_ERROR) {
  15279. WOLFSSL_MSG("Silently dropping out of order DTLS message");
  15280. ssl->options.processReply = doProcessInit;
  15281. ssl->buffers.inputBuffer.length = 0;
  15282. ssl->buffers.inputBuffer.idx = 0;
  15283. #ifdef WOLFSSL_DTLS_DROP_STATS
  15284. ssl->replayDropCount++;
  15285. #endif /* WOLFSSL_DTLS_DROP_STATS */
  15286. continue;
  15287. }
  15288. #endif
  15289. if (ret != 0)
  15290. return ret;
  15291. #ifdef WOLFSSL_TLS13
  15292. if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
  15293. ssl->curRL.type != application_data &&
  15294. ssl->curRL.type != change_cipher_spec) {
  15295. SendAlert(ssl, alert_fatal, unexpected_message);
  15296. return PARSE_ERROR;
  15297. }
  15298. #endif
  15299. ssl->options.processReply = getData;
  15300. FALL_THROUGH;
  15301. /* retrieve record layer data */
  15302. case getData:
  15303. /* get sz bytes or return error */
  15304. if (!ssl->options.dtls) {
  15305. if ((ret = GetInputData(ssl, ssl->curSize)) < 0) {
  15306. #ifdef WOLFSSL_EXTRA_ALERTS
  15307. if (ret != WANT_READ)
  15308. SendAlert(ssl, alert_fatal, bad_record_mac);
  15309. #endif
  15310. return ret;
  15311. }
  15312. }
  15313. else {
  15314. #ifdef WOLFSSL_DTLS
  15315. /* read ahead may already have */
  15316. used = ssl->buffers.inputBuffer.length -
  15317. ssl->buffers.inputBuffer.idx;
  15318. if (used < ssl->curSize)
  15319. if ((ret = GetInputData(ssl, ssl->curSize)) < 0)
  15320. return ret;
  15321. #endif
  15322. }
  15323. if (IsEncryptionOn(ssl, 0)) {
  15324. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  15325. int tooLong = 0;
  15326. #endif
  15327. #ifdef WOLFSSL_TLS13
  15328. if (IsAtLeastTLSv1_3(ssl->version)) {
  15329. tooLong = ssl->curSize > MAX_TLS13_ENC_SZ;
  15330. tooLong |= ssl->curSize - ssl->specs.aead_mac_size >
  15331. MAX_TLS13_PLAIN_SZ;
  15332. }
  15333. #endif
  15334. #ifdef WOLFSSL_EXTRA_ALERTS
  15335. if (!IsAtLeastTLSv1_3(ssl->version))
  15336. tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
  15337. #endif
  15338. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  15339. if (tooLong) {
  15340. WOLFSSL_MSG("Encrypted data too long");
  15341. SendAlert(ssl, alert_fatal, record_overflow);
  15342. return BUFFER_ERROR;
  15343. }
  15344. #endif
  15345. }
  15346. ssl->keys.padSz = 0;
  15347. ssl->options.processReply = verifyEncryptedMessage;
  15348. startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */
  15349. FALL_THROUGH;
  15350. /* verify digest of encrypted message */
  15351. case verifyEncryptedMessage:
  15352. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15353. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  15354. !atomicUser && ssl->options.startedETMRead) {
  15355. ret = VerifyMacEnc(ssl, ssl->buffers.inputBuffer.buffer +
  15356. ssl->buffers.inputBuffer.idx,
  15357. ssl->curSize, ssl->curRL.type);
  15358. #ifdef WOLFSSL_ASYNC_CRYPT
  15359. if (ret == WC_PENDING_E)
  15360. return ret;
  15361. #endif
  15362. if (ret < 0) {
  15363. WOLFSSL_MSG("VerifyMacEnc failed");
  15364. WOLFSSL_ERROR(ret);
  15365. #ifdef WOLFSSL_DTLS
  15366. /* If in DTLS mode, if the decrypt fails for any
  15367. * reason, pretend the datagram never happened. */
  15368. if (ssl->options.dtls) {
  15369. ssl->options.processReply = doProcessInit;
  15370. ssl->buffers.inputBuffer.idx =
  15371. ssl->buffers.inputBuffer.length;
  15372. #ifdef WOLFSSL_DTLS_DROP_STATS
  15373. ssl->macDropCount++;
  15374. #endif /* WOLFSSL_DTLS_DROP_STATS */
  15375. }
  15376. #endif /* WOLFSSL_DTLS */
  15377. #ifdef WOLFSSL_EXTRA_ALERTS
  15378. if (!ssl->options.dtls)
  15379. SendAlert(ssl, alert_fatal, bad_record_mac);
  15380. #endif
  15381. return DECRYPT_ERROR;
  15382. }
  15383. ssl->keys.encryptSz = ssl->curSize;
  15384. }
  15385. #endif
  15386. ssl->options.processReply = decryptMessage;
  15387. FALL_THROUGH;
  15388. /* decrypt message */
  15389. case decryptMessage:
  15390. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  15391. (!IsAtLeastTLSv1_3(ssl->version) ||
  15392. ssl->curRL.type != change_cipher_spec))
  15393. {
  15394. bufferStatic* in = &ssl->buffers.inputBuffer;
  15395. ret = SanityCheckCipherText(ssl, ssl->curSize);
  15396. if (ret < 0) {
  15397. #ifdef WOLFSSL_EXTRA_ALERTS
  15398. SendAlert(ssl, alert_fatal, bad_record_mac);
  15399. #endif
  15400. return ret;
  15401. }
  15402. if (atomicUser) {
  15403. #ifdef ATOMIC_USER
  15404. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15405. if (ssl->options.startedETMRead) {
  15406. ret = ssl->ctx->VerifyDecryptCb(ssl,
  15407. in->buffer + in->idx, in->buffer + in->idx,
  15408. ssl->curSize - MacSize(ssl),
  15409. ssl->curRL.type, 1, &ssl->keys.padSz,
  15410. ssl->DecryptVerifyCtx);
  15411. }
  15412. else
  15413. #endif
  15414. {
  15415. ret = ssl->ctx->DecryptVerifyCb(ssl,
  15416. in->buffer + in->idx,
  15417. in->buffer + in->idx,
  15418. ssl->curSize, ssl->curRL.type, 1,
  15419. &ssl->keys.padSz, ssl->DecryptVerifyCtx);
  15420. }
  15421. #endif /* ATOMIC_USER */
  15422. }
  15423. else {
  15424. if (!ssl->options.tls1_3) {
  15425. #ifndef WOLFSSL_NO_TLS12
  15426. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15427. if (ssl->options.startedETMRead) {
  15428. word32 digestSz = MacSize(ssl);
  15429. ret = DecryptTls(ssl,
  15430. in->buffer + in->idx,
  15431. in->buffer + in->idx,
  15432. ssl->curSize - (word16)digestSz);
  15433. if (ret == 0) {
  15434. byte invalid = 0;
  15435. byte padding = (byte)-1;
  15436. word32 i;
  15437. word32 off = in->idx + ssl->curSize - digestSz - 1;
  15438. /* Last of padding bytes - indicates length. */
  15439. ssl->keys.padSz = in->buffer[off];
  15440. /* Constant time checking of padding - don't leak
  15441. * the length of the data.
  15442. */
  15443. /* Compare max pad bytes or at most data + pad. */
  15444. for (i = 1; i < MAX_PAD_SIZE && off >= i; i++) {
  15445. /* Mask on indicates this is expected to be a
  15446. * padding byte.
  15447. */
  15448. padding &= ctMaskLTE(i, ssl->keys.padSz);
  15449. /* When this is a padding byte and not equal
  15450. * to length then mask is set.
  15451. */
  15452. invalid |= padding &
  15453. ctMaskNotEq(in->buffer[off - i],
  15454. ssl->keys.padSz);
  15455. }
  15456. /* If mask is set then there was an error. */
  15457. if (invalid) {
  15458. ret = DECRYPT_ERROR;
  15459. }
  15460. ssl->keys.padSz += 1;
  15461. ssl->keys.decryptedCur = 1;
  15462. }
  15463. }
  15464. else
  15465. #endif
  15466. {
  15467. ret = DecryptTls(ssl,
  15468. in->buffer + in->idx,
  15469. in->buffer + in->idx,
  15470. ssl->curSize);
  15471. }
  15472. #else
  15473. ret = DECRYPT_ERROR;
  15474. #endif
  15475. }
  15476. else
  15477. {
  15478. #ifdef WOLFSSL_TLS13
  15479. ret = DecryptTls13(ssl,
  15480. in->buffer + in->idx,
  15481. in->buffer + in->idx,
  15482. ssl->curSize,
  15483. (byte*)&ssl->curRL, RECORD_HEADER_SZ, 1);
  15484. #else
  15485. ret = DECRYPT_ERROR;
  15486. #endif /* WOLFSSL_TLS13 */
  15487. }
  15488. }
  15489. #ifdef WOLFSSL_ASYNC_CRYPT
  15490. if (ret == WC_PENDING_E)
  15491. return ret;
  15492. #endif
  15493. if (ret >= 0) {
  15494. #ifndef WOLFSSL_NO_TLS12
  15495. /* handle success */
  15496. #ifndef WOLFSSL_AEAD_ONLY
  15497. if (ssl->options.tls1_1 && ssl->specs.cipher_type == block)
  15498. ssl->buffers.inputBuffer.idx += ssl->specs.block_size;
  15499. #endif
  15500. /* go past TLSv1.1 IV */
  15501. if (CipherHasExpIV(ssl))
  15502. ssl->buffers.inputBuffer.idx += AESGCM_EXP_IV_SZ;
  15503. #endif
  15504. }
  15505. else {
  15506. WOLFSSL_MSG("Decrypt failed");
  15507. WOLFSSL_ERROR(ret);
  15508. #ifdef WOLFSSL_EARLY_DATA
  15509. if (ssl->options.tls1_3) {
  15510. if (ssl->options.side == WOLFSSL_SERVER_END &&
  15511. ssl->earlyData != no_early_data &&
  15512. ssl->options.clientState <
  15513. CLIENT_FINISHED_COMPLETE) {
  15514. ssl->earlyDataSz += ssl->curSize;
  15515. if (ssl->earlyDataSz <=
  15516. ssl->options.maxEarlyDataSz) {
  15517. WOLFSSL_MSG("Ignoring EarlyData!");
  15518. if (ssl->keys.peer_sequence_number_lo-- == 0)
  15519. ssl->keys.peer_sequence_number_hi--;
  15520. ssl->options.processReply = doProcessInit;
  15521. ssl->buffers.inputBuffer.idx += ssl->curSize;
  15522. if (ssl->buffers.inputBuffer.idx >
  15523. ssl->buffers.inputBuffer.length)
  15524. return BUFFER_E;
  15525. return 0;
  15526. }
  15527. WOLFSSL_MSG("Too much EarlyData!");
  15528. }
  15529. SendAlert(ssl, alert_fatal, bad_record_mac);
  15530. }
  15531. #endif
  15532. #ifdef WOLFSSL_DTLS
  15533. /* If in DTLS mode, if the decrypt fails for any
  15534. * reason, pretend the datagram never happened. */
  15535. if (ssl->options.dtls) {
  15536. ssl->options.processReply = doProcessInit;
  15537. ssl->buffers.inputBuffer.idx =
  15538. ssl->buffers.inputBuffer.length;
  15539. #ifdef WOLFSSL_DTLS_DROP_STATS
  15540. ssl->macDropCount++;
  15541. #endif /* WOLFSSL_DTLS_DROP_STATS */
  15542. }
  15543. #endif /* WOLFSSL_DTLS */
  15544. return DECRYPT_ERROR;
  15545. }
  15546. }
  15547. ssl->options.processReply = verifyMessage;
  15548. FALL_THROUGH;
  15549. /* verify digest of message */
  15550. case verifyMessage:
  15551. if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
  15552. (!IsAtLeastTLSv1_3(ssl->version) ||
  15553. ssl->curRL.type != change_cipher_spec))
  15554. {
  15555. if (!atomicUser
  15556. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15557. && !ssl->options.startedETMRead
  15558. #endif
  15559. ) {
  15560. ret = VerifyMac(ssl, ssl->buffers.inputBuffer.buffer +
  15561. ssl->buffers.inputBuffer.idx,
  15562. ssl->curSize, ssl->curRL.type,
  15563. &ssl->keys.padSz);
  15564. #ifdef WOLFSSL_ASYNC_CRYPT
  15565. if (ret == WC_PENDING_E)
  15566. return ret;
  15567. #endif
  15568. if (ret < 0) {
  15569. WOLFSSL_MSG("VerifyMac failed");
  15570. WOLFSSL_ERROR(ret);
  15571. #ifdef WOLFSSL_DTLS
  15572. /* If in DTLS mode, if the decrypt fails for any
  15573. * reason, pretend the datagram never happened. */
  15574. if (ssl->options.dtls) {
  15575. ssl->options.processReply = doProcessInit;
  15576. ssl->buffers.inputBuffer.idx =
  15577. ssl->buffers.inputBuffer.length;
  15578. #ifdef WOLFSSL_DTLS_DROP_STATS
  15579. ssl->macDropCount++;
  15580. #endif /* WOLFSSL_DTLS_DROP_STATS */
  15581. }
  15582. #endif /* WOLFSSL_DTLS */
  15583. #ifdef WOLFSSL_EXTRA_ALERTS
  15584. if (!ssl->options.dtls)
  15585. SendAlert(ssl, alert_fatal, bad_record_mac);
  15586. #endif
  15587. return DECRYPT_ERROR;
  15588. }
  15589. }
  15590. ssl->keys.encryptSz = ssl->curSize;
  15591. ssl->keys.decryptedCur = 1;
  15592. #ifdef WOLFSSL_TLS13
  15593. if (ssl->options.tls1_3) {
  15594. /* end of plaintext */
  15595. word16 i = (word16)(ssl->buffers.inputBuffer.idx +
  15596. ssl->curSize - ssl->specs.aead_mac_size);
  15597. if (i > ssl->buffers.inputBuffer.length) {
  15598. WOLFSSL_ERROR(BUFFER_ERROR);
  15599. return BUFFER_ERROR;
  15600. }
  15601. /* Remove padding from end of plain text. */
  15602. for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
  15603. if (ssl->buffers.inputBuffer.buffer[i] != 0)
  15604. break;
  15605. }
  15606. /* Get the real content type from the end of the data. */
  15607. ssl->curRL.type = ssl->buffers.inputBuffer.buffer[i];
  15608. /* consider both contentType byte and MAC as padding */
  15609. ssl->keys.padSz = ssl->buffers.inputBuffer.idx
  15610. + ssl->curSize - i;
  15611. }
  15612. #endif
  15613. }
  15614. ssl->options.processReply = runProcessingOneMessage;
  15615. FALL_THROUGH;
  15616. /* the record layer is here */
  15617. case runProcessingOneMessage:
  15618. /* can't process a message if we have no data. */
  15619. if (ssl->buffers.inputBuffer.idx
  15620. >= ssl->buffers.inputBuffer.length)
  15621. return BUFFER_ERROR;
  15622. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15623. if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
  15624. if ((ssl->curSize -
  15625. ssl->keys.padSz -
  15626. MacSize(ssl) > MAX_PLAINTEXT_SZ)
  15627. #ifdef WOLFSSL_ASYNC_CRYPT
  15628. && ssl->buffers.inputBuffer.length !=
  15629. ssl->buffers.inputBuffer.idx
  15630. #endif
  15631. ) {
  15632. WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
  15633. #if defined(WOLFSSL_EXTRA_ALERTS)
  15634. SendAlert(ssl, alert_fatal, record_overflow);
  15635. #endif
  15636. return BUFFER_ERROR;
  15637. }
  15638. }
  15639. else
  15640. #endif
  15641. /* TLS13 plaintext limit is checked earlier before decryption */
  15642. if (!IsAtLeastTLSv1_3(ssl->version)
  15643. && ssl->curSize - ssl->keys.padSz > MAX_PLAINTEXT_SZ
  15644. #ifdef WOLFSSL_ASYNC_CRYPT
  15645. && ssl->buffers.inputBuffer.length !=
  15646. ssl->buffers.inputBuffer.idx
  15647. #endif
  15648. ) {
  15649. WOLFSSL_MSG("Plaintext too long");
  15650. #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
  15651. SendAlert(ssl, alert_fatal, record_overflow);
  15652. #endif
  15653. return BUFFER_ERROR;
  15654. }
  15655. #ifdef WOLFSSL_DTLS
  15656. if (IsDtlsNotSctpMode(ssl)) {
  15657. DtlsUpdateWindow(ssl);
  15658. }
  15659. #endif /* WOLFSSL_DTLS */
  15660. WOLFSSL_MSG("received record layer msg");
  15661. switch (ssl->curRL.type) {
  15662. case handshake :
  15663. WOLFSSL_MSG("got HANDSHAKE");
  15664. /* debugging in DoHandShakeMsg */
  15665. if (ssl->options.dtls) {
  15666. #ifdef WOLFSSL_DTLS
  15667. ret = DoDtlsHandShakeMsg(ssl,
  15668. ssl->buffers.inputBuffer.buffer,
  15669. &ssl->buffers.inputBuffer.idx,
  15670. ssl->buffers.inputBuffer.length);
  15671. #endif
  15672. }
  15673. else if (!IsAtLeastTLSv1_3(ssl->version)
  15674. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  15675. || !TLSv1_3_Capable(ssl)
  15676. #endif
  15677. ) {
  15678. #ifndef WOLFSSL_NO_TLS12
  15679. ret = DoHandShakeMsg(ssl,
  15680. ssl->buffers.inputBuffer.buffer,
  15681. &ssl->buffers.inputBuffer.idx,
  15682. ssl->buffers.inputBuffer.length);
  15683. #else
  15684. ret = BUFFER_ERROR;
  15685. #endif
  15686. }
  15687. else {
  15688. #ifdef WOLFSSL_TLS13
  15689. ssl->msgsReceived.got_change_cipher = 0;
  15690. ret = DoTls13HandShakeMsg(ssl,
  15691. ssl->buffers.inputBuffer.buffer,
  15692. &ssl->buffers.inputBuffer.idx,
  15693. ssl->buffers.inputBuffer.length);
  15694. #ifdef WOLFSSL_EARLY_DATA
  15695. if (ret != 0)
  15696. return ret;
  15697. if (ssl->options.side == WOLFSSL_SERVER_END &&
  15698. ssl->earlyData > early_data_ext &&
  15699. ssl->options.handShakeState == HANDSHAKE_DONE) {
  15700. ssl->earlyData = no_early_data;
  15701. ssl->options.processReply = doProcessInit;
  15702. return ZERO_RETURN;
  15703. }
  15704. #endif
  15705. #else
  15706. ret = BUFFER_ERROR;
  15707. #endif
  15708. }
  15709. if (ret != 0
  15710. /* DoDtlsHandShakeMsg can return a WANT_WRITE when
  15711. * calling DtlsMsgPoolSend. This msg is done
  15712. * processing so let's move on. */
  15713. && (!ssl->options.dtls
  15714. || ret != WANT_WRITE)
  15715. #ifdef WOLFSSL_ASYNC_CRYPT
  15716. /* In async case, on pending, move onto next message.
  15717. * Current message should have been DtlsMsgStore'ed and
  15718. * should be processed with DtlsMsgDrain */
  15719. && (!ssl->options.dtls
  15720. || ret != WC_PENDING_E)
  15721. #endif
  15722. ) {
  15723. WOLFSSL_ERROR(ret);
  15724. return ret;
  15725. }
  15726. break;
  15727. case change_cipher_spec:
  15728. WOLFSSL_MSG("got CHANGE CIPHER SPEC");
  15729. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  15730. if (ssl->hsInfoOn)
  15731. AddPacketName(ssl, "ChangeCipher");
  15732. /* add record header back on info */
  15733. if (ssl->toInfoOn) {
  15734. AddPacketInfo(ssl, "ChangeCipher",
  15735. change_cipher_spec,
  15736. ssl->buffers.inputBuffer.buffer +
  15737. ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ -
  15738. (ssl->options.dtls ? DTLS_RECORD_EXTRA : 0),
  15739. 1 + RECORD_HEADER_SZ, READ_PROTO, ssl->heap);
  15740. #ifdef WOLFSSL_CALLBACKS
  15741. AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
  15742. #endif
  15743. }
  15744. #endif
  15745. #ifdef WOLFSSL_TLS13
  15746. if (IsAtLeastTLSv1_3(ssl->version)) {
  15747. word32 i = ssl->buffers.inputBuffer.idx;
  15748. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  15749. SendAlert(ssl, alert_fatal, unexpected_message);
  15750. return UNKNOWN_RECORD_TYPE;
  15751. }
  15752. if (ssl->curSize != 1 ||
  15753. ssl->buffers.inputBuffer.buffer[i] != 1) {
  15754. SendAlert(ssl, alert_fatal, illegal_parameter);
  15755. return UNKNOWN_RECORD_TYPE;
  15756. }
  15757. ssl->buffers.inputBuffer.idx++;
  15758. if (!ssl->msgsReceived.got_change_cipher) {
  15759. ssl->msgsReceived.got_change_cipher = 1;
  15760. }
  15761. else {
  15762. SendAlert(ssl, alert_fatal, illegal_parameter);
  15763. return UNKNOWN_RECORD_TYPE;
  15764. }
  15765. break;
  15766. }
  15767. #endif
  15768. #ifndef WOLFSSL_NO_TLS12
  15769. if (ssl->buffers.inputBuffer.idx >=
  15770. ssl->buffers.inputBuffer.length ||
  15771. ssl->curSize < 1) {
  15772. WOLFSSL_MSG("ChangeCipher msg too short");
  15773. return LENGTH_ERROR;
  15774. }
  15775. if (ssl->buffers.inputBuffer.buffer[
  15776. ssl->buffers.inputBuffer.idx] != 1) {
  15777. WOLFSSL_MSG("ChangeCipher msg wrong value");
  15778. return LENGTH_ERROR;
  15779. }
  15780. if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
  15781. #ifdef HAVE_AEAD
  15782. if (ssl->specs.cipher_type == aead) {
  15783. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  15784. ssl->curSize -= AESGCM_EXP_IV_SZ;
  15785. ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
  15786. ssl->curSize -= ssl->specs.aead_mac_size;
  15787. }
  15788. else
  15789. #endif
  15790. {
  15791. ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
  15792. ssl->curSize -= (word16)ssl->keys.padSz;
  15793. ssl->curSize -= ssl->specs.iv_size;
  15794. }
  15795. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15796. if (ssl->options.startedETMRead) {
  15797. word32 digestSz = MacSize(ssl);
  15798. ssl->buffers.inputBuffer.idx += digestSz;
  15799. ssl->curSize -= (word16)digestSz;
  15800. }
  15801. #endif
  15802. }
  15803. if (ssl->curSize != 1) {
  15804. WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
  15805. return LENGTH_ERROR;
  15806. }
  15807. ssl->buffers.inputBuffer.idx++;
  15808. ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
  15809. if (ret != 0) {
  15810. if (!ssl->options.dtls) {
  15811. return ret;
  15812. }
  15813. else {
  15814. #ifdef WOLFSSL_DTLS
  15815. /* Check for duplicate CCS message in DTLS mode.
  15816. * DTLS allows for duplicate messages, and it should be
  15817. * skipped. Also skip if out of order. */
  15818. if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
  15819. return ret;
  15820. /* Reset error */
  15821. ret = 0;
  15822. break;
  15823. #endif /* WOLFSSL_DTLS */
  15824. }
  15825. }
  15826. ssl->keys.encryptionOn = 1;
  15827. /* setup decrypt keys for following messages */
  15828. /* XXX This might not be what we want to do when
  15829. * receiving a CCS with multicast. We update the
  15830. * key when the application updates them. */
  15831. if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
  15832. return ret;
  15833. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15834. ssl->options.startedETMRead = ssl->options.encThenMac;
  15835. #endif
  15836. #ifdef WOLFSSL_DTLS
  15837. if (ssl->options.dtls) {
  15838. WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq;
  15839. #ifdef WOLFSSL_MULTICAST
  15840. if (ssl->options.haveMcast) {
  15841. peerSeq += ssl->keys.curPeerId;
  15842. peerSeq->highwaterMark = UpdateHighwaterMark(0,
  15843. ssl->ctx->mcastFirstSeq,
  15844. ssl->ctx->mcastSecondSeq,
  15845. ssl->ctx->mcastMaxSeq);
  15846. }
  15847. #endif
  15848. peerSeq->nextEpoch++;
  15849. peerSeq->prevSeq_lo = peerSeq->nextSeq_lo;
  15850. peerSeq->prevSeq_hi = peerSeq->nextSeq_hi;
  15851. peerSeq->nextSeq_lo = 0;
  15852. peerSeq->nextSeq_hi = 0;
  15853. XMEMCPY(peerSeq->prevWindow, peerSeq->window,
  15854. DTLS_SEQ_SZ);
  15855. XMEMSET(peerSeq->window, 0, DTLS_SEQ_SZ);
  15856. }
  15857. #endif
  15858. #ifdef HAVE_LIBZ
  15859. if (ssl->options.usingCompression)
  15860. if ( (ret = InitStreams(ssl)) != 0)
  15861. return ret;
  15862. #endif
  15863. ret = BuildFinished(ssl, &ssl->hsHashes->verifyHashes,
  15864. ssl->options.side == WOLFSSL_CLIENT_END ?
  15865. server : client);
  15866. if (ret != 0)
  15867. return ret;
  15868. #endif /* !WOLFSSL_NO_TLS12 */
  15869. break;
  15870. case application_data:
  15871. WOLFSSL_MSG("got app DATA");
  15872. #ifdef WOLFSSL_DTLS
  15873. if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
  15874. #ifdef HAVE_SECURE_RENEGOTIATION
  15875. /*
  15876. * Only free HS resources when not in the process of a
  15877. * secure renegotiation and we have received APP DATA
  15878. * from the current epoch
  15879. */
  15880. if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
  15881. || !DtlsSCRKeysSet(ssl))) {
  15882. FreeHandshakeResources(ssl);
  15883. ssl->options.dtlsHsRetain = 0;
  15884. }
  15885. #else
  15886. FreeHandshakeResources(ssl);
  15887. ssl->options.dtlsHsRetain = 0;
  15888. #endif
  15889. }
  15890. #endif
  15891. #ifdef WOLFSSL_TLS13
  15892. if (ssl->keys.keyUpdateRespond) {
  15893. WOLFSSL_MSG("No KeyUpdate from peer seen");
  15894. return SANITY_MSG_E;
  15895. }
  15896. #endif
  15897. if ((ret = DoApplicationData(ssl,
  15898. ssl->buffers.inputBuffer.buffer,
  15899. &ssl->buffers.inputBuffer.idx,
  15900. NO_SNIFF)) != 0) {
  15901. WOLFSSL_ERROR(ret);
  15902. return ret;
  15903. }
  15904. break;
  15905. case alert:
  15906. WOLFSSL_MSG("got ALERT!");
  15907. ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer,
  15908. &ssl->buffers.inputBuffer.idx, &type);
  15909. if (ret == alert_fatal)
  15910. return FATAL_ERROR;
  15911. else if (ret < 0)
  15912. return ret;
  15913. /* catch warnings that are handled as errors */
  15914. if (type == close_notify) {
  15915. ssl->buffers.inputBuffer.idx =
  15916. ssl->buffers.inputBuffer.length;
  15917. ssl->options.processReply = doProcessInit;
  15918. return ssl->error = ZERO_RETURN;
  15919. }
  15920. if (type == decrypt_error)
  15921. return FATAL_ERROR;
  15922. /* Reset error if we got an alert level in ret */
  15923. if (ret > 0)
  15924. ret = 0;
  15925. break;
  15926. default:
  15927. WOLFSSL_ERROR(UNKNOWN_RECORD_TYPE);
  15928. return UNKNOWN_RECORD_TYPE;
  15929. }
  15930. ssl->options.processReply = doProcessInit;
  15931. /* input exhausted */
  15932. if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
  15933. #ifdef WOLFSSL_DTLS
  15934. /* If app data was processed then return now to avoid
  15935. * dropping any app data. */
  15936. || (ssl->options.dtls && ssl->curRL.type == application_data)
  15937. #endif
  15938. )
  15939. return ret;
  15940. /* more messages per record */
  15941. else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) {
  15942. WOLFSSL_MSG("More messages in record");
  15943. ssl->options.processReply = runProcessingOneMessage;
  15944. if (IsEncryptionOn(ssl, 0)) {
  15945. WOLFSSL_MSG("Bundled encrypted messages, remove middle pad");
  15946. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  15947. if (ssl->options.startedETMRead) {
  15948. word32 digestSz = MacSize(ssl);
  15949. if (ssl->buffers.inputBuffer.idx >=
  15950. ssl->keys.padSz + digestSz) {
  15951. ssl->buffers.inputBuffer.idx -=
  15952. ssl->keys.padSz + digestSz;
  15953. }
  15954. else {
  15955. WOLFSSL_MSG("\tmiddle padding error");
  15956. return FATAL_ERROR;
  15957. }
  15958. }
  15959. else
  15960. #endif
  15961. {
  15962. if (ssl->buffers.inputBuffer.idx >= ssl->keys.padSz) {
  15963. ssl->buffers.inputBuffer.idx -= ssl->keys.padSz;
  15964. }
  15965. else {
  15966. WOLFSSL_MSG("\tmiddle padding error");
  15967. return FATAL_ERROR;
  15968. }
  15969. }
  15970. }
  15971. }
  15972. /* more records */
  15973. else {
  15974. WOLFSSL_MSG("More records in input");
  15975. }
  15976. #ifdef WOLFSSL_ASYNC_CRYPT
  15977. /* We are setup to read next message/record but we had an error
  15978. * (probably WC_PENDING_E) so return that so it can be handled
  15979. * by higher layers. */
  15980. if (ret != 0)
  15981. return ret;
  15982. #endif
  15983. continue;
  15984. default:
  15985. WOLFSSL_MSG("Bad process input state, programming error");
  15986. return INPUT_CASE_ERROR;
  15987. }
  15988. }
  15989. }
  15990. #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
  15991. (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
  15992. int SendChangeCipher(WOLFSSL* ssl)
  15993. {
  15994. byte *output;
  15995. int sendSz = RECORD_HEADER_SZ + ENUM_LEN;
  15996. int idx = RECORD_HEADER_SZ;
  15997. int ret;
  15998. #ifdef OPENSSL_EXTRA
  15999. ssl->cbmode = SSL_CB_MODE_WRITE;
  16000. if (ssl->options.side == WOLFSSL_SERVER_END){
  16001. ssl->options.serverState = SERVER_CHANGECIPHERSPEC_COMPLETE;
  16002. if (ssl->CBIS != NULL)
  16003. ssl->CBIS(ssl, SSL_CB_ACCEPT_LOOP, SSL_SUCCESS);
  16004. }
  16005. else{
  16006. ssl->options.clientState =
  16007. CLIENT_CHANGECIPHERSPEC_COMPLETE;
  16008. if (ssl->CBIS != NULL)
  16009. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  16010. }
  16011. #endif
  16012. #ifdef WOLFSSL_DTLS
  16013. if (ssl->options.dtls) {
  16014. sendSz += DTLS_RECORD_EXTRA;
  16015. idx += DTLS_RECORD_EXTRA;
  16016. }
  16017. #endif
  16018. /* are we in scr */
  16019. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  16020. sendSz += MAX_MSG_EXTRA;
  16021. }
  16022. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  16023. * is not advanced yet */
  16024. ssl->options.buildingMsg = 1;
  16025. /* check for available size */
  16026. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  16027. return ret;
  16028. /* get output buffer */
  16029. output = ssl->buffers.outputBuffer.buffer +
  16030. ssl->buffers.outputBuffer.length;
  16031. AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
  16032. output[idx] = 1; /* turn it on */
  16033. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  16034. byte input[ENUM_LEN];
  16035. int inputSz = ENUM_LEN;
  16036. input[0] = 1; /* turn it on */
  16037. #ifdef WOLFSSL_DTLS
  16038. if (IsDtlsNotSctpMode(ssl) &&
  16039. (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
  16040. return ret;
  16041. }
  16042. #endif
  16043. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  16044. change_cipher_spec, 0, 0, 0, CUR_ORDER);
  16045. if (sendSz < 0) {
  16046. return sendSz;
  16047. }
  16048. }
  16049. #ifdef WOLFSSL_DTLS
  16050. else {
  16051. if (IsDtlsNotSctpMode(ssl)) {
  16052. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
  16053. return ret;
  16054. DtlsSEQIncrement(ssl, CUR_ORDER);
  16055. }
  16056. }
  16057. #endif
  16058. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16059. if (ssl->hsInfoOn) AddPacketName(ssl, "ChangeCipher");
  16060. if (ssl->toInfoOn)
  16061. AddPacketInfo(ssl, "ChangeCipher", change_cipher_spec, output,
  16062. sendSz, WRITE_PROTO, ssl->heap);
  16063. #endif
  16064. ssl->buffers.outputBuffer.length += sendSz;
  16065. #ifdef WOLFSSL_TLS13
  16066. if (!ssl->options.tls1_3)
  16067. #endif
  16068. {
  16069. /* setup encrypt keys */
  16070. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  16071. return ret;
  16072. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16073. ssl->options.startedETMWrite = ssl->options.encThenMac;
  16074. #endif
  16075. }
  16076. ssl->options.buildingMsg = 0;
  16077. if (ssl->options.groupMessages)
  16078. return 0;
  16079. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_DEBUG_DTLS)
  16080. else if (ssl->options.dtls) {
  16081. /* If using DTLS, force the ChangeCipherSpec message to be in the
  16082. * same datagram as the finished message. */
  16083. return 0;
  16084. }
  16085. #endif
  16086. else
  16087. return SendBuffered(ssl);
  16088. }
  16089. #endif
  16090. #if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
  16091. static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
  16092. int padLen, int content, int verify, int epochOrder)
  16093. {
  16094. byte result[WC_MAX_DIGEST_SIZE];
  16095. word32 digestSz = ssl->specs.hash_size; /* actual sizes */
  16096. word32 padSz = ssl->specs.pad_size;
  16097. int ret = 0;
  16098. wc_Md5 md5;
  16099. wc_Sha sha;
  16100. /* data */
  16101. byte seq[SEQ_SZ];
  16102. byte conLen[ENUM_LEN + LENGTH_SZ]; /* content & length */
  16103. const byte* macSecret = NULL;
  16104. (void)padLen;
  16105. #ifdef HAVE_FUZZER
  16106. if (ssl->fuzzerCb)
  16107. ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
  16108. #endif
  16109. #ifdef WOLFSSL_DTLS
  16110. if (ssl->options.dtls)
  16111. macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
  16112. else
  16113. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  16114. #else
  16115. macSecret = wolfSSL_GetMacSecret(ssl, verify);
  16116. #endif
  16117. XMEMSET(seq, 0, SEQ_SZ);
  16118. conLen[0] = (byte)content;
  16119. c16toa((word16)sz, &conLen[ENUM_LEN]);
  16120. WriteSEQ(ssl, epochOrder, seq);
  16121. if (ssl->specs.mac_algorithm == md5_mac) {
  16122. ret = wc_InitMd5_ex(&md5, ssl->heap, ssl->devId);
  16123. if (ret != 0)
  16124. return ret;
  16125. /* inner */
  16126. ret = wc_Md5Update(&md5, macSecret, digestSz);
  16127. ret |= wc_Md5Update(&md5, PAD1, padSz);
  16128. ret |= wc_Md5Update(&md5, seq, SEQ_SZ);
  16129. ret |= wc_Md5Update(&md5, conLen, sizeof(conLen));
  16130. /* in buffer */
  16131. ret |= wc_Md5Update(&md5, in, sz);
  16132. if (ret != 0)
  16133. return VERIFY_MAC_ERROR;
  16134. ret = wc_Md5Final(&md5, result);
  16135. #ifdef WOLFSSL_ASYNC_CRYPT
  16136. /* TODO: Make non-blocking */
  16137. if (ret == WC_PENDING_E) {
  16138. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  16139. }
  16140. #endif
  16141. if (ret != 0)
  16142. return VERIFY_MAC_ERROR;
  16143. /* outer */
  16144. ret = wc_Md5Update(&md5, macSecret, digestSz);
  16145. ret |= wc_Md5Update(&md5, PAD2, padSz);
  16146. ret |= wc_Md5Update(&md5, result, digestSz);
  16147. if (ret != 0)
  16148. return VERIFY_MAC_ERROR;
  16149. ret = wc_Md5Final(&md5, digest);
  16150. #ifdef WOLFSSL_ASYNC_CRYPT
  16151. /* TODO: Make non-blocking */
  16152. if (ret == WC_PENDING_E) {
  16153. ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE);
  16154. }
  16155. #endif
  16156. if (ret != 0)
  16157. return VERIFY_MAC_ERROR;
  16158. wc_Md5Free(&md5);
  16159. }
  16160. else {
  16161. ret = wc_InitSha_ex(&sha, ssl->heap, ssl->devId);
  16162. if (ret != 0)
  16163. return ret;
  16164. /* inner */
  16165. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  16166. ret |= wc_ShaUpdate(&sha, PAD1, padSz);
  16167. ret |= wc_ShaUpdate(&sha, seq, SEQ_SZ);
  16168. ret |= wc_ShaUpdate(&sha, conLen, sizeof(conLen));
  16169. /* in buffer */
  16170. ret |= wc_ShaUpdate(&sha, in, sz);
  16171. if (ret != 0)
  16172. return VERIFY_MAC_ERROR;
  16173. ret = wc_ShaFinal(&sha, result);
  16174. #ifdef WOLFSSL_ASYNC_CRYPT
  16175. /* TODO: Make non-blocking */
  16176. if (ret == WC_PENDING_E) {
  16177. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  16178. }
  16179. #endif
  16180. if (ret != 0)
  16181. return VERIFY_MAC_ERROR;
  16182. /* outer */
  16183. ret = wc_ShaUpdate(&sha, macSecret, digestSz);
  16184. ret |= wc_ShaUpdate(&sha, PAD2, padSz);
  16185. ret |= wc_ShaUpdate(&sha, result, digestSz);
  16186. if (ret != 0)
  16187. return VERIFY_MAC_ERROR;
  16188. ret = wc_ShaFinal(&sha, digest);
  16189. #ifdef WOLFSSL_ASYNC_CRYPT
  16190. /* TODO: Make non-blocking */
  16191. if (ret == WC_PENDING_E) {
  16192. ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE);
  16193. }
  16194. #endif
  16195. if (ret != 0)
  16196. return VERIFY_MAC_ERROR;
  16197. wc_ShaFree(&sha);
  16198. }
  16199. return 0;
  16200. }
  16201. #endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
  16202. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  16203. static int BuildMD5_CertVerify(WOLFSSL* ssl, byte* digest)
  16204. {
  16205. int ret;
  16206. byte md5_result[WC_MD5_DIGEST_SIZE];
  16207. #ifdef WOLFSSL_SMALL_STACK
  16208. wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  16209. #else
  16210. wc_Md5 md5[1];
  16211. #endif
  16212. /* make md5 inner */
  16213. ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */
  16214. if (ret == 0)
  16215. ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN);
  16216. if (ret == 0)
  16217. ret = wc_Md5Update(md5, PAD1, PAD_MD5);
  16218. if (ret == 0)
  16219. ret = wc_Md5Final(md5, md5_result);
  16220. /* make md5 outer */
  16221. if (ret == 0) {
  16222. ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId);
  16223. if (ret == 0) {
  16224. ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN);
  16225. if (ret == 0)
  16226. ret = wc_Md5Update(md5, PAD2, PAD_MD5);
  16227. if (ret == 0)
  16228. ret = wc_Md5Update(md5, md5_result, WC_MD5_DIGEST_SIZE);
  16229. if (ret == 0)
  16230. ret = wc_Md5Final(md5, digest);
  16231. wc_Md5Free(md5);
  16232. }
  16233. }
  16234. #ifdef WOLFSSL_SMALL_STACK
  16235. XFREE(md5, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  16236. #endif
  16237. return ret;
  16238. }
  16239. #endif /* !NO_MD5 && !NO_OLD_TLS */
  16240. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  16241. defined(WOLFSSL_ALLOW_TLS_SHA1))
  16242. static int BuildSHA_CertVerify(WOLFSSL* ssl, byte* digest)
  16243. {
  16244. int ret;
  16245. byte sha_result[WC_SHA_DIGEST_SIZE];
  16246. #ifdef WOLFSSL_SMALL_STACK
  16247. wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX);
  16248. #else
  16249. wc_Sha sha[1];
  16250. #endif
  16251. /* make sha inner */
  16252. ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */
  16253. if (ret == 0)
  16254. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  16255. if (ret == 0)
  16256. ret = wc_ShaUpdate(sha, PAD1, PAD_SHA);
  16257. if (ret == 0)
  16258. ret = wc_ShaFinal(sha, sha_result);
  16259. /* make sha outer */
  16260. if (ret == 0) {
  16261. ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId);
  16262. if (ret == 0) {
  16263. ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN);
  16264. if (ret == 0)
  16265. ret = wc_ShaUpdate(sha, PAD2, PAD_SHA);
  16266. if (ret == 0)
  16267. ret = wc_ShaUpdate(sha, sha_result, WC_SHA_DIGEST_SIZE);
  16268. if (ret == 0)
  16269. ret = wc_ShaFinal(sha, digest);
  16270. wc_ShaFree(sha);
  16271. }
  16272. }
  16273. #ifdef WOLFSSL_SMALL_STACK
  16274. XFREE(sha, ssl->heap, DYNAMIC_TYPE_HASHCTX);
  16275. #endif
  16276. return ret;
  16277. }
  16278. #endif /* !NO_SHA && (!NO_OLD_TLS || WOLFSSL_ALLOW_TLS_SHA1) */
  16279. int BuildCertHashes(WOLFSSL* ssl, Hashes* hashes)
  16280. {
  16281. int ret = 0;
  16282. (void)hashes;
  16283. if (ssl->options.tls) {
  16284. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  16285. ret = wc_Md5GetHash(&ssl->hsHashes->hashMd5, hashes->md5);
  16286. if (ret != 0)
  16287. return ret;
  16288. #endif
  16289. #if !defined(NO_SHA)
  16290. ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha);
  16291. if (ret != 0)
  16292. return ret;
  16293. #endif
  16294. if (IsAtLeastTLSv1_2(ssl)) {
  16295. #ifndef NO_SHA256
  16296. ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256,
  16297. hashes->sha256);
  16298. if (ret != 0)
  16299. return ret;
  16300. #endif
  16301. #ifdef WOLFSSL_SHA384
  16302. ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384,
  16303. hashes->sha384);
  16304. if (ret != 0)
  16305. return ret;
  16306. #endif
  16307. #ifdef WOLFSSL_SHA512
  16308. ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512,
  16309. hashes->sha512);
  16310. if (ret != 0)
  16311. return ret;
  16312. #endif
  16313. }
  16314. }
  16315. else {
  16316. #if !defined(NO_MD5) && !defined(NO_OLD_TLS)
  16317. ret = BuildMD5_CertVerify(ssl, hashes->md5);
  16318. if (ret != 0)
  16319. return ret;
  16320. #endif
  16321. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  16322. defined(WOLFSSL_ALLOW_TLS_SHA1))
  16323. ret = BuildSHA_CertVerify(ssl, hashes->sha);
  16324. if (ret != 0)
  16325. return ret;
  16326. #endif
  16327. }
  16328. return ret;
  16329. }
  16330. #ifndef WOLFSSL_NO_TLS12
  16331. void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
  16332. {
  16333. if (args
  16334. #ifdef WOLFSSL_ASYNC_CRYPT
  16335. && ssl->options.buildArgsSet
  16336. #endif
  16337. ) {
  16338. /* only free the IV if it was dynamically allocated */
  16339. if (ssl && args->iv && (args->iv != args->staticIvBuffer)) {
  16340. XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
  16341. }
  16342. }
  16343. #ifdef WOLFSSL_ASYNC_CRYPT
  16344. ssl->options.buildArgsSet = 0;
  16345. #endif
  16346. }
  16347. #endif
  16348. /* Build SSL Message, encrypted */
  16349. int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
  16350. int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
  16351. int epochOrder)
  16352. {
  16353. #ifndef WOLFSSL_NO_TLS12
  16354. int ret;
  16355. BuildMsgArgs* args;
  16356. BuildMsgArgs lcl_args;
  16357. #endif
  16358. WOLFSSL_ENTER("BuildMessage");
  16359. if (ssl == NULL) {
  16360. return BAD_FUNC_ARG;
  16361. }
  16362. /* catch mistaken sizeOnly parameter */
  16363. if (!sizeOnly && (output == NULL || input == NULL) ) {
  16364. return BAD_FUNC_ARG;
  16365. }
  16366. if (sizeOnly && (output || input) ) {
  16367. return BAD_FUNC_ARG;
  16368. }
  16369. (void)epochOrder;
  16370. #ifdef WOLFSSL_NO_TLS12
  16371. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  16372. hashOutput, sizeOnly, asyncOkay);
  16373. #else
  16374. #ifdef WOLFSSL_TLS13
  16375. if (ssl->options.tls1_3) {
  16376. return BuildTls13Message(ssl, output, outSz, input, inSz, type,
  16377. hashOutput, sizeOnly, asyncOkay);
  16378. }
  16379. #endif
  16380. #ifdef WOLFSSL_ASYNC_CRYPT
  16381. ret = WC_NOT_PENDING_E;
  16382. if (asyncOkay) {
  16383. if (ssl->async == NULL) {
  16384. return BAD_FUNC_ARG;
  16385. }
  16386. args = &ssl->async->buildArgs;
  16387. ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState);
  16388. if (ret != WC_NOT_PENDING_E) {
  16389. /* Check for error */
  16390. if (ret < 0)
  16391. goto exit_buildmsg;
  16392. }
  16393. }
  16394. else
  16395. #endif
  16396. {
  16397. args = &lcl_args;
  16398. }
  16399. /* Reset state */
  16400. #ifdef WOLFSSL_ASYNC_CRYPT
  16401. if (ret == WC_NOT_PENDING_E)
  16402. #endif
  16403. {
  16404. ret = 0;
  16405. #ifdef WOLFSSL_ASYNC_CRYPT
  16406. ssl->options.buildArgsSet = 1;
  16407. #endif
  16408. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  16409. XMEMSET(args, 0, sizeof(BuildMsgArgs));
  16410. args->sz = RECORD_HEADER_SZ + inSz;
  16411. args->idx = RECORD_HEADER_SZ;
  16412. args->headerSz = RECORD_HEADER_SZ;
  16413. }
  16414. switch (ssl->options.buildMsgState) {
  16415. case BUILD_MSG_BEGIN:
  16416. {
  16417. #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
  16418. if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
  16419. /* For epochs >1 the current cipher parameters are located in
  16420. * ssl->secure_renegotiation->tmp_keys. Previous cipher
  16421. * parameters and for epoch 1 use ssl->keys */
  16422. switch (epochOrder) {
  16423. case PREV_ORDER:
  16424. if (ssl->encrypt.src != KEYS) {
  16425. ssl->secure_renegotiation->cache_status =
  16426. SCR_CACHE_NULL;
  16427. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
  16428. ERROR_OUT(ret, exit_buildmsg);
  16429. }
  16430. break;
  16431. case CUR_ORDER:
  16432. if (ssl->keys.dtls_epoch ==
  16433. ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
  16434. if (ssl->encrypt.src != SCR) {
  16435. ssl->secure_renegotiation->cache_status =
  16436. SCR_CACHE_NEEDED;
  16437. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  16438. != 0)
  16439. ERROR_OUT(ret, exit_buildmsg);
  16440. }
  16441. }
  16442. else {
  16443. if (ssl->encrypt.src != KEYS) {
  16444. ssl->secure_renegotiation->cache_status =
  16445. SCR_CACHE_NULL;
  16446. if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
  16447. != 0)
  16448. ERROR_OUT(ret, exit_buildmsg);
  16449. }
  16450. }
  16451. break;
  16452. default:
  16453. WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
  16454. "CUR_ORDER");
  16455. ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
  16456. }
  16457. }
  16458. #endif
  16459. ssl->options.buildMsgState = BUILD_MSG_SIZE;
  16460. }
  16461. FALL_THROUGH;
  16462. case BUILD_MSG_SIZE:
  16463. {
  16464. args->digestSz = ssl->specs.hash_size;
  16465. #ifdef HAVE_TRUNCATED_HMAC
  16466. if (ssl->truncated_hmac)
  16467. args->digestSz = min(TRUNCATED_HMAC_SZ, args->digestSz);
  16468. #endif
  16469. args->sz += args->digestSz;
  16470. #ifdef WOLFSSL_DTLS
  16471. if (ssl->options.dtls) {
  16472. args->sz += DTLS_RECORD_EXTRA;
  16473. args->idx += DTLS_RECORD_EXTRA;
  16474. args->headerSz += DTLS_RECORD_EXTRA;
  16475. }
  16476. #endif
  16477. #ifndef WOLFSSL_AEAD_ONLY
  16478. if (ssl->specs.cipher_type == block) {
  16479. word32 blockSz = ssl->specs.block_size;
  16480. if (blockSz == 0) {
  16481. WOLFSSL_MSG("Invalid block size with block cipher type");
  16482. ERROR_OUT(BAD_STATE_E, exit_buildmsg);
  16483. }
  16484. if (ssl->options.tls1_1) {
  16485. args->ivSz = blockSz;
  16486. args->sz += args->ivSz;
  16487. if (args->ivSz > MAX_IV_SZ)
  16488. ERROR_OUT(BUFFER_E, exit_buildmsg);
  16489. }
  16490. args->sz += 1; /* pad byte */
  16491. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16492. if (ssl->options.startedETMWrite) {
  16493. args->pad = (args->sz - args->headerSz -
  16494. args->digestSz) % blockSz;
  16495. }
  16496. else
  16497. #endif
  16498. {
  16499. args->pad = (args->sz - args->headerSz) % blockSz;
  16500. }
  16501. if (args->pad != 0)
  16502. args->pad = blockSz - args->pad;
  16503. args->sz += args->pad;
  16504. }
  16505. #endif /* WOLFSSL_AEAD_ONLY */
  16506. #ifdef HAVE_AEAD
  16507. if (ssl->specs.cipher_type == aead) {
  16508. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  16509. args->ivSz = AESGCM_EXP_IV_SZ;
  16510. args->sz += (args->ivSz + ssl->specs.aead_mac_size - args->digestSz);
  16511. }
  16512. #endif
  16513. /* done with size calculations */
  16514. if (sizeOnly)
  16515. goto exit_buildmsg;
  16516. if (args->sz > (word32)outSz) {
  16517. WOLFSSL_MSG("Oops, want to write past output buffer size");
  16518. ERROR_OUT(BUFFER_E, exit_buildmsg);
  16519. }
  16520. if (args->ivSz > 0) {
  16521. if (args->ivSz > sizeof(args->staticIvBuffer)) {
  16522. args->iv = (byte*)XMALLOC(args->ivSz, ssl->heap,
  16523. DYNAMIC_TYPE_SALT);
  16524. if (args->iv == NULL) {
  16525. ERROR_OUT(MEMORY_E, exit_buildmsg);
  16526. }
  16527. }
  16528. else {
  16529. args->iv = args->staticIvBuffer;
  16530. }
  16531. ret = wc_RNG_GenerateBlock(ssl->rng, args->iv, args->ivSz);
  16532. if (ret != 0)
  16533. goto exit_buildmsg;
  16534. }
  16535. #if !defined(NO_PUBLIC_GCM_SET_IV) && \
  16536. ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
  16537. (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) && \
  16538. defined(HAVE_AEAD))
  16539. if (ssl->specs.cipher_type == aead) {
  16540. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
  16541. XMEMCPY(args->iv, ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ);
  16542. }
  16543. #endif
  16544. args->size = (word16)(args->sz - args->headerSz); /* include mac and digest */
  16545. AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
  16546. /* write to output */
  16547. if (args->ivSz > 0) {
  16548. XMEMCPY(output + args->idx, args->iv,
  16549. min(args->ivSz, MAX_IV_SZ));
  16550. args->idx += args->ivSz;
  16551. }
  16552. XMEMCPY(output + args->idx, input, inSz);
  16553. args->idx += inSz;
  16554. ssl->options.buildMsgState = BUILD_MSG_HASH;
  16555. }
  16556. FALL_THROUGH;
  16557. case BUILD_MSG_HASH:
  16558. {
  16559. /* done with size calculations */
  16560. if (sizeOnly)
  16561. goto exit_buildmsg;
  16562. if (type == handshake && hashOutput) {
  16563. ret = HashOutput(ssl, output, args->headerSz + inSz, args->ivSz);
  16564. if (ret != 0)
  16565. goto exit_buildmsg;
  16566. }
  16567. #ifndef WOLFSSL_AEAD_ONLY
  16568. if (ssl->specs.cipher_type == block) {
  16569. word32 tmpIdx;
  16570. word32 i;
  16571. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16572. if (ssl->options.startedETMWrite)
  16573. tmpIdx = args->idx;
  16574. else
  16575. #endif
  16576. tmpIdx = args->idx + args->digestSz;
  16577. for (i = 0; i <= args->pad; i++)
  16578. output[tmpIdx++] = (byte)args->pad; /* pad byte gets pad value */
  16579. }
  16580. #endif
  16581. ssl->options.buildMsgState = BUILD_MSG_VERIFY_MAC;
  16582. }
  16583. FALL_THROUGH;
  16584. case BUILD_MSG_VERIFY_MAC:
  16585. {
  16586. /* done with size calculations */
  16587. if (sizeOnly)
  16588. goto exit_buildmsg;
  16589. /* User Record Layer Callback handling */
  16590. #ifdef ATOMIC_USER
  16591. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16592. if (ssl->options.startedETMWrite) {
  16593. if (ssl->ctx->EncryptMacCb) {
  16594. ret = ssl->ctx->EncryptMacCb(ssl, output + args->idx +
  16595. args->pad + 1, type, 0,
  16596. output + args->headerSz,
  16597. output + args->headerSz,
  16598. args->size - args->digestSz,
  16599. ssl->MacEncryptCtx);
  16600. goto exit_buildmsg;
  16601. }
  16602. }
  16603. else
  16604. #endif
  16605. {
  16606. if (ssl->ctx->MacEncryptCb) {
  16607. ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx,
  16608. output + args->headerSz + args->ivSz, inSz,
  16609. type, 0, output + args->headerSz,
  16610. output + args->headerSz, args->size,
  16611. ssl->MacEncryptCtx);
  16612. goto exit_buildmsg;
  16613. }
  16614. }
  16615. #endif
  16616. #ifndef WOLFSSL_AEAD_ONLY
  16617. if (ssl->specs.cipher_type != aead
  16618. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16619. && !ssl->options.startedETMWrite
  16620. #endif
  16621. ) {
  16622. #ifdef HAVE_TRUNCATED_HMAC
  16623. if (ssl->truncated_hmac &&
  16624. ssl->specs.hash_size > args->digestSz) {
  16625. #ifdef WOLFSSL_SMALL_STACK
  16626. byte* hmac;
  16627. #else
  16628. byte hmac[WC_MAX_DIGEST_SIZE];
  16629. #endif
  16630. #ifdef WOLFSSL_SMALL_STACK
  16631. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  16632. DYNAMIC_TYPE_DIGEST);
  16633. if (hmac == NULL)
  16634. ERROR_OUT(MEMORY_E, exit_buildmsg);
  16635. #endif
  16636. ret = ssl->hmac(ssl, hmac,
  16637. output + args->headerSz + args->ivSz, inSz,
  16638. -1, type, 0, epochOrder);
  16639. XMEMCPY(output + args->idx, hmac, args->digestSz);
  16640. #ifdef WOLFSSL_SMALL_STACK
  16641. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  16642. #endif
  16643. }
  16644. else
  16645. #endif
  16646. {
  16647. ret = ssl->hmac(ssl, output + args->idx, output +
  16648. args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
  16649. }
  16650. }
  16651. #endif /* WOLFSSL_AEAD_ONLY */
  16652. if (ret != 0)
  16653. goto exit_buildmsg;
  16654. ssl->options.buildMsgState = BUILD_MSG_ENCRYPT;
  16655. }
  16656. FALL_THROUGH;
  16657. case BUILD_MSG_ENCRYPT:
  16658. {
  16659. /* done with size calculations */
  16660. if (sizeOnly)
  16661. goto exit_buildmsg;
  16662. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  16663. /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
  16664. * for all encryption algos that use it for encryption parameters */
  16665. word16 dtls_epoch = 0;
  16666. word16 dtls_sequence_number_hi = 0;
  16667. word32 dtls_sequence_number_lo = 0;
  16668. int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
  16669. DtlsUseSCRKeys(ssl);
  16670. if (swap_seq) {
  16671. dtls_epoch = ssl->keys.dtls_epoch;
  16672. dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
  16673. dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
  16674. ssl->keys.dtls_epoch--;
  16675. ssl->keys.dtls_sequence_number_hi =
  16676. ssl->keys.dtls_prev_sequence_number_hi;
  16677. ssl->keys.dtls_sequence_number_lo =
  16678. ssl->keys.dtls_prev_sequence_number_lo;
  16679. }
  16680. #endif
  16681. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16682. if (ssl->options.startedETMWrite) {
  16683. ret = Encrypt(ssl, output + args->headerSz,
  16684. output + args->headerSz,
  16685. (word16)(args->size - args->digestSz),
  16686. asyncOkay);
  16687. }
  16688. else
  16689. #endif
  16690. {
  16691. ret = Encrypt(ssl, output + args->headerSz,
  16692. output + args->headerSz, args->size, asyncOkay);
  16693. }
  16694. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  16695. /* Restore sequence numbers */
  16696. if (swap_seq) {
  16697. ssl->keys.dtls_epoch = dtls_epoch;
  16698. ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
  16699. ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
  16700. }
  16701. #endif
  16702. if (ret != 0)
  16703. goto exit_buildmsg;
  16704. ssl->options.buildMsgState = BUILD_MSG_ENCRYPTED_VERIFY_MAC;
  16705. }
  16706. FALL_THROUGH;
  16707. case BUILD_MSG_ENCRYPTED_VERIFY_MAC:
  16708. {
  16709. /* done with size calculations */
  16710. if (sizeOnly)
  16711. goto exit_buildmsg;
  16712. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  16713. if (ssl->options.startedETMWrite) {
  16714. WOLFSSL_MSG("Calculate MAC of Encrypted Data");
  16715. #ifdef HAVE_TRUNCATED_HMAC
  16716. if (ssl->truncated_hmac &&
  16717. ssl->specs.hash_size > args->digestSz) {
  16718. #ifdef WOLFSSL_SMALL_STACK
  16719. byte* hmac = NULL;
  16720. #else
  16721. byte hmac[WC_MAX_DIGEST_SIZE];
  16722. #endif
  16723. #ifdef WOLFSSL_SMALL_STACK
  16724. hmac = (byte*)XMALLOC(WC_MAX_DIGEST_SIZE, ssl->heap,
  16725. DYNAMIC_TYPE_DIGEST);
  16726. if (hmac == NULL)
  16727. ERROR_OUT(MEMORY_E, exit_buildmsg);
  16728. #endif
  16729. ret = ssl->hmac(ssl, hmac, output + args->headerSz,
  16730. args->ivSz + inSz + args->pad + 1, -1, type,
  16731. 0, epochOrder);
  16732. XMEMCPY(output + args->idx + args->pad + 1, hmac,
  16733. args->digestSz);
  16734. #ifdef WOLFSSL_SMALL_STACK
  16735. XFREE(hmac, ssl->heap, DYNAMIC_TYPE_DIGEST);
  16736. #endif
  16737. }
  16738. else
  16739. #endif
  16740. {
  16741. ret = ssl->hmac(ssl, output + args->idx + args->pad + 1,
  16742. output + args->headerSz,
  16743. args->ivSz + inSz + args->pad + 1, -1, type,
  16744. 0, epochOrder);
  16745. }
  16746. }
  16747. #endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
  16748. }
  16749. FALL_THROUGH;
  16750. default:
  16751. break;
  16752. }
  16753. exit_buildmsg:
  16754. WOLFSSL_LEAVE("BuildMessage", ret);
  16755. #ifdef WOLFSSL_ASYNC_CRYPT
  16756. if (ret == WC_PENDING_E) {
  16757. return ret;
  16758. }
  16759. #endif
  16760. /* make sure build message state is reset */
  16761. ssl->options.buildMsgState = BUILD_MSG_BEGIN;
  16762. #ifdef WOLFSSL_DTLS
  16763. if (ret == 0 && ssl->options.dtls && !sizeOnly)
  16764. DtlsSEQIncrement(ssl, epochOrder);
  16765. #endif
  16766. /* return sz on success */
  16767. if (ret == 0)
  16768. ret = args->sz;
  16769. /* Final cleanup */
  16770. FreeBuildMsgArgs(ssl, args);
  16771. return ret;
  16772. #endif /* !WOLFSSL_NO_TLS12 */
  16773. }
  16774. #ifndef WOLFSSL_NO_TLS12
  16775. int SendFinished(WOLFSSL* ssl)
  16776. {
  16777. int sendSz,
  16778. finishedSz = ssl->options.tls ? TLS_FINISHED_SZ :
  16779. FINISHED_SZ;
  16780. byte input[FINISHED_SZ + DTLS_HANDSHAKE_HEADER_SZ]; /* max */
  16781. byte *output;
  16782. Hashes* hashes;
  16783. int ret;
  16784. int headerSz = HANDSHAKE_HEADER_SZ;
  16785. int outputSz;
  16786. WOLFSSL_START(WC_FUNC_FINISHED_SEND);
  16787. WOLFSSL_ENTER("SendFinished");
  16788. /* check for available size */
  16789. outputSz = sizeof(input) + MAX_MSG_EXTRA;
  16790. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  16791. * is not advanced yet */
  16792. ssl->options.buildingMsg = 1;
  16793. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  16794. return ret;
  16795. #ifdef WOLFSSL_DTLS
  16796. if (ssl->options.dtls) {
  16797. headerSz += DTLS_HANDSHAKE_EXTRA;
  16798. ssl->keys.dtls_epoch++;
  16799. ssl->keys.dtls_prev_sequence_number_hi =
  16800. ssl->keys.dtls_sequence_number_hi;
  16801. ssl->keys.dtls_prev_sequence_number_lo =
  16802. ssl->keys.dtls_sequence_number_lo;
  16803. ssl->keys.dtls_sequence_number_hi = 0;
  16804. ssl->keys.dtls_sequence_number_lo = 0;
  16805. }
  16806. #endif
  16807. /* get output buffer */
  16808. output = ssl->buffers.outputBuffer.buffer +
  16809. ssl->buffers.outputBuffer.length;
  16810. AddHandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl);
  16811. /* make finished hashes */
  16812. hashes = (Hashes*)&input[headerSz];
  16813. ret = BuildFinished(ssl, hashes,
  16814. ssl->options.side == WOLFSSL_CLIENT_END ? client : server);
  16815. if (ret != 0) return ret;
  16816. #ifdef HAVE_SECURE_RENEGOTIATION
  16817. if (ssl->secure_renegotiation) {
  16818. if (ssl->options.side == WOLFSSL_CLIENT_END)
  16819. XMEMCPY(ssl->secure_renegotiation->client_verify_data, hashes,
  16820. TLS_FINISHED_SZ);
  16821. else
  16822. XMEMCPY(ssl->secure_renegotiation->server_verify_data, hashes,
  16823. TLS_FINISHED_SZ);
  16824. }
  16825. #endif
  16826. #ifdef WOLFSSL_HAVE_TLS_UNIQUE
  16827. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  16828. XMEMCPY(ssl->clientFinished,
  16829. hashes, TLS_FINISHED_SZ);
  16830. ssl->clientFinished_len = TLS_FINISHED_SZ;
  16831. }
  16832. else {
  16833. XMEMCPY(ssl->serverFinished,
  16834. hashes, TLS_FINISHED_SZ);
  16835. ssl->serverFinished_len = TLS_FINISHED_SZ;
  16836. }
  16837. #endif
  16838. #ifdef WOLFSSL_DTLS
  16839. if (IsDtlsNotSctpMode(ssl)) {
  16840. if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz, finished)) != 0)
  16841. return ret;
  16842. }
  16843. #endif
  16844. sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
  16845. handshake, 1, 0, 0, CUR_ORDER);
  16846. if (sendSz < 0)
  16847. return BUILD_MSG_ERROR;
  16848. if (!ssl->options.resuming) {
  16849. #ifndef NO_SESSION_CACHE
  16850. AddSession(ssl); /* just try */
  16851. #endif
  16852. if (ssl->options.side == WOLFSSL_SERVER_END) {
  16853. #ifdef OPENSSL_EXTRA
  16854. ssl->options.serverState = SERVER_FINISHED_COMPLETE;
  16855. ssl->cbmode = SSL_CB_MODE_WRITE;
  16856. if (ssl->CBIS != NULL)
  16857. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  16858. #endif
  16859. ssl->options.handShakeState = HANDSHAKE_DONE;
  16860. ssl->options.handShakeDone = 1;
  16861. }
  16862. }
  16863. else {
  16864. if (ssl->options.side == WOLFSSL_CLIENT_END) {
  16865. #ifdef OPENSSL_EXTRA
  16866. ssl->options.clientState = CLIENT_FINISHED_COMPLETE;
  16867. ssl->cbmode = SSL_CB_MODE_WRITE;
  16868. if (ssl->CBIS != NULL)
  16869. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_DONE, SSL_SUCCESS);
  16870. #endif
  16871. ssl->options.handShakeState = HANDSHAKE_DONE;
  16872. ssl->options.handShakeDone = 1;
  16873. }
  16874. }
  16875. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  16876. if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
  16877. if (ssl->toInfoOn)
  16878. AddPacketInfo(ssl, "Finished", handshake, output, sendSz,
  16879. WRITE_PROTO, ssl->heap);
  16880. #endif
  16881. ssl->buffers.outputBuffer.length += sendSz;
  16882. ret = SendBuffered(ssl);
  16883. ssl->options.buildingMsg = 0;
  16884. #ifdef WOLFSSL_DTLS
  16885. if ((!ssl->options.resuming &&
  16886. ssl->options.side == WOLFSSL_SERVER_END) ||
  16887. (ssl->options.resuming &&
  16888. ssl->options.side == WOLFSSL_CLIENT_END)) {
  16889. ssl->keys.dtls_handshake_number = 0;
  16890. ssl->keys.dtls_expected_peer_handshake_number = 0;
  16891. }
  16892. #endif
  16893. WOLFSSL_LEAVE("SendFinished", ret);
  16894. WOLFSSL_END(WC_FUNC_FINISHED_SEND);
  16895. return ret;
  16896. }
  16897. #endif /* WOLFSSL_NO_TLS12 */
  16898. #ifndef NO_WOLFSSL_SERVER
  16899. #if (!defined(WOLFSSL_NO_TLS12) && \
  16900. (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
  16901. defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))) || \
  16902. (defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST))
  16903. /* Parses and decodes the certificate then initializes "request". In the case
  16904. * of !ssl->buffers.weOwnCert, ssl->ctx->certOcspRequest gets set to "request".
  16905. *
  16906. * Returns 0 on success
  16907. */
  16908. static int CreateOcspRequest(WOLFSSL* ssl, OcspRequest* request,
  16909. DecodedCert* cert, byte* certData, word32 length)
  16910. {
  16911. int ret;
  16912. if (request != NULL)
  16913. XMEMSET(request, 0, sizeof(OcspRequest));
  16914. InitDecodedCert(cert, certData, length, ssl->heap);
  16915. /* TODO: Setup async support here */
  16916. ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl));
  16917. if (ret != 0) {
  16918. WOLFSSL_MSG("ParseCert failed");
  16919. }
  16920. if (ret == 0)
  16921. ret = InitOcspRequest(request, cert, 0, ssl->heap);
  16922. if (ret == 0) {
  16923. /* make sure ctx OCSP request is updated */
  16924. if (!ssl->buffers.weOwnCert) {
  16925. wolfSSL_Mutex* ocspLock = &SSL_CM(ssl)->ocsp_stapling->ocspLock;
  16926. if (wc_LockMutex(ocspLock) == 0) {
  16927. if (ssl->ctx->certOcspRequest == NULL)
  16928. ssl->ctx->certOcspRequest = request;
  16929. wc_UnLockMutex(ocspLock);
  16930. }
  16931. }
  16932. }
  16933. FreeDecodedCert(cert);
  16934. return ret;
  16935. }
  16936. /* Creates OCSP response and places it in variable "response". Memory
  16937. * management for "buffer* response" is up to the caller.
  16938. *
  16939. * Also creates an OcspRequest in the case that ocspRequest is null or that
  16940. * ssl->buffers.weOwnCert is set. In those cases managing ocspRequest free'ing
  16941. * is up to the caller. NOTE: in OcspCreateRequest ssl->ctx->certOcspRequest can
  16942. * be set to point to "ocspRequest" and it then should not be free'd since
  16943. * wolfSSL_CTX_free will take care of it.
  16944. *
  16945. * Returns 0 on success
  16946. */
  16947. int CreateOcspResponse(WOLFSSL* ssl, OcspRequest** ocspRequest,
  16948. buffer* response)
  16949. {
  16950. int ret = 0;
  16951. OcspRequest* request = NULL;
  16952. byte createdRequest = 0;
  16953. if (ssl == NULL || ocspRequest == NULL || response == NULL)
  16954. return BAD_FUNC_ARG;
  16955. XMEMSET(response, 0, sizeof(*response));
  16956. request = *ocspRequest;
  16957. /* unable to fetch status. skip. */
  16958. if (SSL_CM(ssl) == NULL || SSL_CM(ssl)->ocspStaplingEnabled == 0)
  16959. return 0;
  16960. if (request == NULL || ssl->buffers.weOwnCert) {
  16961. DerBuffer* der = ssl->buffers.certificate;
  16962. #ifdef WOLFSSL_SMALL_STACK
  16963. DecodedCert* cert = NULL;
  16964. #else
  16965. DecodedCert cert[1];
  16966. #endif
  16967. /* unable to fetch status. skip. */
  16968. if (der->buffer == NULL || der->length == 0)
  16969. return 0;
  16970. #ifdef WOLFSSL_SMALL_STACK
  16971. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  16972. DYNAMIC_TYPE_DCERT);
  16973. if (cert == NULL)
  16974. return MEMORY_E;
  16975. #endif
  16976. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  16977. DYNAMIC_TYPE_OCSP_REQUEST);
  16978. if (request == NULL)
  16979. ret = MEMORY_E;
  16980. createdRequest = 1;
  16981. if (ret == 0) {
  16982. ret = CreateOcspRequest(ssl, request, cert, der->buffer,
  16983. der->length);
  16984. }
  16985. if (ret != 0) {
  16986. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  16987. request = NULL;
  16988. }
  16989. #ifdef WOLFSSL_SMALL_STACK
  16990. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  16991. #endif
  16992. }
  16993. if (ret == 0) {
  16994. request->ssl = ssl;
  16995. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, request, response);
  16996. /* Suppressing, not critical */
  16997. if (ret == OCSP_CERT_REVOKED ||
  16998. ret == OCSP_CERT_UNKNOWN ||
  16999. ret == OCSP_LOOKUP_FAIL) {
  17000. ret = 0;
  17001. }
  17002. }
  17003. /* free request up if error case found otherwise return it */
  17004. if (ret != 0 && createdRequest) {
  17005. FreeOcspRequest(request);
  17006. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  17007. }
  17008. if (ret == 0)
  17009. *ocspRequest = request;
  17010. return ret;
  17011. }
  17012. #endif
  17013. #endif /* !NO_WOLFSSL_SERVER */
  17014. static int cipherExtraData(WOLFSSL* ssl)
  17015. {
  17016. int cipherExtra;
  17017. /* Cipher data that may be added by BuildMessage */
  17018. /* There is always an IV (expect for chacha). For AEAD ciphers,
  17019. * there is the authentication tag (aead_mac_size). For block
  17020. * ciphers we have the hash_size MAC on the message, and one
  17021. * block size for possible padding. */
  17022. if (ssl->specs.cipher_type == aead) {
  17023. cipherExtra = ssl->specs.aead_mac_size;
  17024. /* CHACHA does not have an explicit IV. */
  17025. if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha) {
  17026. cipherExtra += AESGCM_EXP_IV_SZ;
  17027. }
  17028. }
  17029. else {
  17030. cipherExtra = ssl->specs.iv_size + ssl->specs.block_size +
  17031. ssl->specs.hash_size;
  17032. }
  17033. /* Sanity check so we don't ever return negative. */
  17034. return cipherExtra > 0 ? cipherExtra : 0;
  17035. }
  17036. #ifndef WOLFSSL_NO_TLS12
  17037. #ifndef NO_CERTS
  17038. #if !defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)
  17039. /* handle generation of certificate (11) */
  17040. int SendCertificate(WOLFSSL* ssl)
  17041. {
  17042. int ret = 0;
  17043. word32 certSz, certChainSz, headerSz, listSz, payloadSz;
  17044. word32 length, maxFragment;
  17045. WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND);
  17046. WOLFSSL_ENTER("SendCertificate");
  17047. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher) {
  17048. WOLFSSL_MSG("Not sending certificate msg. Using PSK or ANON cipher.");
  17049. return 0; /* not needed */
  17050. }
  17051. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  17052. #ifdef OPENSSL_EXTRA
  17053. if (ssl->version.major == SSLv3_MAJOR
  17054. && ssl->version.minor == SSLv3_MINOR){
  17055. SendAlert(ssl, alert_warning, no_certificate);
  17056. return 0;
  17057. } else {
  17058. #endif
  17059. certSz = 0;
  17060. certChainSz = 0;
  17061. headerSz = CERT_HEADER_SZ;
  17062. length = CERT_HEADER_SZ;
  17063. listSz = 0;
  17064. #ifdef OPENSSL_EXTRA
  17065. }
  17066. #endif
  17067. }
  17068. else {
  17069. if (!ssl->buffers.certificate) {
  17070. WOLFSSL_MSG("Send Cert missing certificate buffer");
  17071. return BUFFER_ERROR;
  17072. }
  17073. certSz = ssl->buffers.certificate->length;
  17074. headerSz = 2 * CERT_HEADER_SZ;
  17075. /* list + cert size */
  17076. length = certSz + headerSz;
  17077. listSz = certSz + CERT_HEADER_SZ;
  17078. /* may need to send rest of chain, already has leading size(s) */
  17079. if (certSz && ssl->buffers.certChain) {
  17080. certChainSz = ssl->buffers.certChain->length;
  17081. length += certChainSz;
  17082. listSz += certChainSz;
  17083. }
  17084. else
  17085. certChainSz = 0;
  17086. }
  17087. payloadSz = length;
  17088. if (ssl->fragOffset != 0)
  17089. length -= (ssl->fragOffset + headerSz);
  17090. maxFragment = MAX_RECORD_SIZE;
  17091. maxFragment = wolfSSL_GetMaxFragSize(ssl, maxFragment);
  17092. while (length > 0 && ret == 0) {
  17093. byte* output = NULL;
  17094. word32 fragSz = 0;
  17095. word32 i = RECORD_HEADER_SZ;
  17096. int sendSz = RECORD_HEADER_SZ;
  17097. ssl->options.buildingMsg = 1;
  17098. if (!ssl->options.dtls) {
  17099. if (ssl->fragOffset == 0) {
  17100. if (headerSz + certSz + certChainSz <=
  17101. maxFragment - HANDSHAKE_HEADER_SZ) {
  17102. fragSz = headerSz + certSz + certChainSz;
  17103. }
  17104. else {
  17105. fragSz = maxFragment - HANDSHAKE_HEADER_SZ;
  17106. }
  17107. sendSz += fragSz + HANDSHAKE_HEADER_SZ;
  17108. i += HANDSHAKE_HEADER_SZ;
  17109. }
  17110. else {
  17111. fragSz = min(length, maxFragment);
  17112. sendSz += fragSz;
  17113. }
  17114. if (IsEncryptionOn(ssl, 1))
  17115. sendSz += MAX_MSG_EXTRA;
  17116. }
  17117. else {
  17118. #ifdef WOLFSSL_DTLS
  17119. fragSz = min(length, maxFragment);
  17120. sendSz += fragSz + DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  17121. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_HEADER_SZ;
  17122. #endif
  17123. }
  17124. if (IsEncryptionOn(ssl, 1))
  17125. sendSz += cipherExtraData(ssl);
  17126. /* check for available size */
  17127. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  17128. return ret;
  17129. /* get output buffer */
  17130. output = ssl->buffers.outputBuffer.buffer +
  17131. ssl->buffers.outputBuffer.length;
  17132. /* Safe to use ssl->fragOffset since it will be incremented immediately
  17133. * after this block. This block needs to be entered only once to not
  17134. * hash the cert msg twice. */
  17135. if (ssl->fragOffset == 0) {
  17136. if (!ssl->options.dtls) {
  17137. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  17138. if (!IsEncryptionOn(ssl, 1))
  17139. HashRaw(ssl, output + RECORD_HEADER_SZ,
  17140. HANDSHAKE_HEADER_SZ);
  17141. }
  17142. else {
  17143. #ifdef WOLFSSL_DTLS
  17144. AddHeaders(output, payloadSz, certificate, ssl);
  17145. HashRaw(ssl,
  17146. output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
  17147. HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
  17148. /* Adding the headers increments these, decrement them for
  17149. * actual message header. */
  17150. ssl->keys.dtls_handshake_number--;
  17151. AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
  17152. ssl->keys.dtls_handshake_number--;
  17153. #endif /* WOLFSSL_DTLS */
  17154. }
  17155. /* list total */
  17156. c32to24(listSz, output + i);
  17157. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  17158. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  17159. i += CERT_HEADER_SZ;
  17160. length -= CERT_HEADER_SZ;
  17161. fragSz -= CERT_HEADER_SZ;
  17162. if (certSz) {
  17163. c32to24(certSz, output + i);
  17164. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
  17165. HashRaw(ssl, output + i, CERT_HEADER_SZ);
  17166. i += CERT_HEADER_SZ;
  17167. length -= CERT_HEADER_SZ;
  17168. fragSz -= CERT_HEADER_SZ;
  17169. if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
  17170. HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
  17171. if (certChainSz)
  17172. HashRaw(ssl, ssl->buffers.certChain->buffer,
  17173. certChainSz);
  17174. }
  17175. }
  17176. }
  17177. else {
  17178. if (!ssl->options.dtls) {
  17179. AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
  17180. }
  17181. else {
  17182. #ifdef WOLFSSL_DTLS
  17183. AddFragHeaders(output, fragSz, ssl->fragOffset + headerSz,
  17184. payloadSz, certificate, ssl);
  17185. ssl->keys.dtls_handshake_number--;
  17186. #endif /* WOLFSSL_DTLS */
  17187. }
  17188. }
  17189. /* member */
  17190. if (certSz && ssl->fragOffset < certSz) {
  17191. word32 copySz = min(certSz - ssl->fragOffset, fragSz);
  17192. XMEMCPY(output + i,
  17193. ssl->buffers.certificate->buffer + ssl->fragOffset, copySz);
  17194. i += copySz;
  17195. ssl->fragOffset += copySz;
  17196. length -= copySz;
  17197. fragSz -= copySz;
  17198. }
  17199. if (certChainSz && fragSz) {
  17200. word32 copySz = min(certChainSz + certSz - ssl->fragOffset, fragSz);
  17201. XMEMCPY(output + i,
  17202. ssl->buffers.certChain->buffer + ssl->fragOffset - certSz,
  17203. copySz);
  17204. i += copySz;
  17205. ssl->fragOffset += copySz;
  17206. length -= copySz;
  17207. }
  17208. if (IsEncryptionOn(ssl, 1)) {
  17209. byte* input = NULL;
  17210. int inputSz = i; /* build msg adds rec hdr */
  17211. int recordHeaderSz = RECORD_HEADER_SZ;
  17212. if (ssl->options.dtls)
  17213. recordHeaderSz += DTLS_RECORD_EXTRA;
  17214. inputSz -= recordHeaderSz;
  17215. if (inputSz < 0) {
  17216. WOLFSSL_MSG("Send Cert bad inputSz");
  17217. return BUFFER_E;
  17218. }
  17219. if (inputSz > 0) { /* clang thinks could be zero, let's help */
  17220. input = (byte*)XMALLOC(inputSz, ssl->heap,
  17221. DYNAMIC_TYPE_IN_BUFFER);
  17222. if (input == NULL)
  17223. return MEMORY_E;
  17224. XMEMCPY(input, output + recordHeaderSz, inputSz);
  17225. }
  17226. #ifndef WOLFSSL_DTLS
  17227. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  17228. handshake, 1, 0, 0, CUR_ORDER);
  17229. #else
  17230. if (!ssl->options.dtls)
  17231. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  17232. handshake, 1, 0, 0, CUR_ORDER);
  17233. else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
  17234. * calculate the hash ourselves above */ {
  17235. if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
  17236. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17237. return ret;
  17238. }
  17239. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  17240. handshake, 0, 0, 0, CUR_ORDER);
  17241. }
  17242. #endif
  17243. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17244. if (sendSz < 0)
  17245. return sendSz;
  17246. }
  17247. else {
  17248. sendSz = i;
  17249. #ifdef WOLFSSL_DTLS
  17250. if (IsDtlsNotSctpMode(ssl)) {
  17251. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
  17252. return ret;
  17253. }
  17254. if (ssl->options.dtls)
  17255. DtlsSEQIncrement(ssl, CUR_ORDER);
  17256. #endif
  17257. }
  17258. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17259. if (ssl->hsInfoOn)
  17260. AddPacketName(ssl, "Certificate");
  17261. if (ssl->toInfoOn)
  17262. AddPacketInfo(ssl, "Certificate", handshake, output, sendSz,
  17263. WRITE_PROTO, ssl->heap);
  17264. #endif
  17265. ssl->buffers.outputBuffer.length += sendSz;
  17266. if (!ssl->options.groupMessages)
  17267. ret = SendBuffered(ssl);
  17268. }
  17269. if (ret != WANT_WRITE) {
  17270. /* Clean up the fragment offset. */
  17271. ssl->options.buildingMsg = 0;
  17272. ssl->fragOffset = 0;
  17273. #ifdef WOLFSSL_DTLS
  17274. if (ssl->options.dtls)
  17275. ssl->keys.dtls_handshake_number++;
  17276. #endif
  17277. if (ssl->options.side == WOLFSSL_SERVER_END){
  17278. ssl->options.serverState = SERVER_CERT_COMPLETE;
  17279. }
  17280. }
  17281. WOLFSSL_LEAVE("SendCertificate", ret);
  17282. WOLFSSL_END(WC_FUNC_CERTIFICATE_SEND);
  17283. return ret;
  17284. }
  17285. #endif /* !NO_WOLFSSL_SERVER || !WOLFSSL_NO_CLIENT_AUTH */
  17286. /* handle generation of certificate_request (13) */
  17287. int SendCertificateRequest(WOLFSSL* ssl)
  17288. {
  17289. byte *output;
  17290. int ret;
  17291. int sendSz;
  17292. word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  17293. word32 dnLen = 0;
  17294. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  17295. WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
  17296. #endif
  17297. int typeTotal = 1; /* only 1 for now */
  17298. int reqSz = ENUM_LEN + typeTotal + REQ_HEADER_SZ; /* add auth later */
  17299. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  17300. WOLFSSL_ENTER("SendCertificateRequest");
  17301. if (IsAtLeastTLSv1_2(ssl))
  17302. reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz;
  17303. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  17304. /* Certificate Authorities */
  17305. names = SSL_CA_NAMES(ssl);
  17306. while (names != NULL) {
  17307. byte seq[MAX_SEQ_SZ];
  17308. WOLFSSL_X509_NAME* name = names->data.name;
  17309. if (name != NULL) {
  17310. /* 16-bit length | SEQ | Len | DER of name */
  17311. dnLen += OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
  17312. name->rawLen;
  17313. }
  17314. names = names->next;
  17315. }
  17316. reqSz += dnLen;
  17317. #endif
  17318. if (ssl->options.usingPSK_cipher || ssl->options.usingAnon_cipher)
  17319. return 0; /* not needed */
  17320. sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
  17321. if (!ssl->options.dtls) {
  17322. if (IsEncryptionOn(ssl, 1))
  17323. sendSz += MAX_MSG_EXTRA;
  17324. }
  17325. else {
  17326. #ifdef WOLFSSL_DTLS
  17327. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  17328. i += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  17329. #endif
  17330. }
  17331. if (IsEncryptionOn(ssl, 1))
  17332. sendSz += cipherExtraData(ssl);
  17333. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  17334. * is not advanced yet */
  17335. ssl->options.buildingMsg = 1;
  17336. /* check for available size */
  17337. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  17338. return ret;
  17339. /* get output buffer */
  17340. output = ssl->buffers.outputBuffer.buffer +
  17341. ssl->buffers.outputBuffer.length;
  17342. AddHeaders(output, reqSz, certificate_request, ssl);
  17343. /* write to output */
  17344. output[i++] = (byte)typeTotal; /* # of types */
  17345. #ifdef HAVE_ECC
  17346. if ((ssl->options.cipherSuite0 == ECC_BYTE ||
  17347. ssl->options.cipherSuite0 == CHACHA_BYTE) &&
  17348. ssl->specs.sig_algo == ecc_dsa_sa_algo) {
  17349. output[i++] = ecdsa_sign;
  17350. } else
  17351. #endif /* HAVE_ECC */
  17352. {
  17353. output[i++] = rsa_sign;
  17354. }
  17355. /* supported hash/sig */
  17356. if (IsAtLeastTLSv1_2(ssl)) {
  17357. c16toa(ssl->suites->hashSigAlgoSz, &output[i]);
  17358. i += OPAQUE16_LEN;
  17359. XMEMCPY(&output[i],
  17360. ssl->suites->hashSigAlgo, ssl->suites->hashSigAlgoSz);
  17361. i += ssl->suites->hashSigAlgoSz;
  17362. }
  17363. /* Certificate Authorities */
  17364. c16toa((word16)dnLen, &output[i]); /* auth's */
  17365. i += REQ_HEADER_SZ;
  17366. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  17367. names = SSL_CA_NAMES(ssl);
  17368. while (names != NULL) {
  17369. byte seq[MAX_SEQ_SZ];
  17370. WOLFSSL_X509_NAME* name = names->data.name;
  17371. if (name != NULL) {
  17372. c16toa((word16)name->rawLen +
  17373. (word16)SetSequence(name->rawLen, seq), &output[i]);
  17374. i += OPAQUE16_LEN;
  17375. i += SetSequence(name->rawLen, output + i);
  17376. XMEMCPY(output + i, name->raw, name->rawLen);
  17377. i += name->rawLen;
  17378. }
  17379. names = names->next;
  17380. }
  17381. #endif
  17382. (void)i;
  17383. if (IsEncryptionOn(ssl, 1)) {
  17384. byte* input = NULL;
  17385. int inputSz = i; /* build msg adds rec hdr */
  17386. int recordHeaderSz = RECORD_HEADER_SZ;
  17387. if (ssl->options.dtls)
  17388. recordHeaderSz += DTLS_RECORD_EXTRA;
  17389. inputSz -= recordHeaderSz;
  17390. if (inputSz <= 0) {
  17391. WOLFSSL_MSG("Send Cert Req bad inputSz");
  17392. return BUFFER_E;
  17393. }
  17394. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17395. if (input == NULL)
  17396. return MEMORY_E;
  17397. XMEMCPY(input, output + recordHeaderSz, inputSz);
  17398. #ifdef WOLFSSL_DTLS
  17399. if (IsDtlsNotSctpMode(ssl) &&
  17400. (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
  17401. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17402. return ret;
  17403. }
  17404. #endif
  17405. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  17406. handshake, 1, 0, 0, CUR_ORDER);
  17407. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17408. if (sendSz < 0)
  17409. return sendSz;
  17410. } else {
  17411. sendSz = i;
  17412. #ifdef WOLFSSL_DTLS
  17413. if (IsDtlsNotSctpMode(ssl)) {
  17414. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
  17415. return ret;
  17416. }
  17417. if (ssl->options.dtls)
  17418. DtlsSEQIncrement(ssl, CUR_ORDER);
  17419. #endif
  17420. ret = HashOutput(ssl, output, sendSz, 0);
  17421. if (ret != 0)
  17422. return ret;
  17423. }
  17424. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17425. if (ssl->hsInfoOn)
  17426. AddPacketName(ssl, "CertificateRequest");
  17427. if (ssl->toInfoOn)
  17428. AddPacketInfo(ssl, "CertificateRequest", handshake, output, sendSz,
  17429. WRITE_PROTO, ssl->heap);
  17430. #endif
  17431. ssl->buffers.outputBuffer.length += sendSz;
  17432. if (ssl->options.groupMessages)
  17433. ret = 0;
  17434. else
  17435. ret = SendBuffered(ssl);
  17436. ssl->options.buildingMsg = 0;
  17437. WOLFSSL_LEAVE("SendCertificateRequest", ret);
  17438. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_SEND);
  17439. return ret;
  17440. }
  17441. #ifndef NO_WOLFSSL_SERVER
  17442. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  17443. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  17444. static int BuildCertificateStatus(WOLFSSL* ssl, byte type, buffer* status,
  17445. byte count)
  17446. {
  17447. byte* output = NULL;
  17448. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  17449. word32 length = ENUM_LEN;
  17450. int sendSz = 0;
  17451. int ret = 0;
  17452. int i = 0;
  17453. WOLFSSL_ENTER("BuildCertificateStatus");
  17454. switch (type) {
  17455. case WOLFSSL_CSR2_OCSP_MULTI:
  17456. length += OPAQUE24_LEN;
  17457. FALL_THROUGH; /* followed by */
  17458. case WOLFSSL_CSR2_OCSP:
  17459. for (i = 0; i < count; i++)
  17460. length += OPAQUE24_LEN + status[i].length;
  17461. break;
  17462. default:
  17463. return 0;
  17464. }
  17465. sendSz = idx + length;
  17466. if (ssl->keys.encryptionOn)
  17467. sendSz += MAX_MSG_EXTRA;
  17468. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  17469. * is not advanced yet */
  17470. ssl->options.buildingMsg = 1;
  17471. if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) {
  17472. output = ssl->buffers.outputBuffer.buffer +
  17473. ssl->buffers.outputBuffer.length;
  17474. AddHeaders(output, length, certificate_status, ssl);
  17475. output[idx++] = type;
  17476. if (type == WOLFSSL_CSR2_OCSP_MULTI) {
  17477. c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx);
  17478. idx += OPAQUE24_LEN;
  17479. }
  17480. for (i = 0; i < count; i++) {
  17481. c32to24(status[i].length, output + idx);
  17482. idx += OPAQUE24_LEN;
  17483. XMEMCPY(output + idx, status[i].buffer, status[i].length);
  17484. idx += status[i].length;
  17485. }
  17486. if (IsEncryptionOn(ssl, 1)) {
  17487. byte* input;
  17488. int inputSz = idx; /* build msg adds rec hdr */
  17489. int recordHeaderSz = RECORD_HEADER_SZ;
  17490. if (ssl->options.dtls)
  17491. recordHeaderSz += DTLS_RECORD_EXTRA;
  17492. inputSz -= recordHeaderSz;
  17493. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17494. if (input == NULL)
  17495. return MEMORY_E;
  17496. XMEMCPY(input, output + recordHeaderSz, inputSz);
  17497. #ifdef WOLFSSL_DTLS
  17498. ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
  17499. #endif
  17500. if (ret == 0)
  17501. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  17502. handshake, 1, 0, 0, CUR_ORDER);
  17503. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  17504. if (sendSz < 0)
  17505. ret = sendSz;
  17506. }
  17507. else {
  17508. #ifdef WOLFSSL_DTLS
  17509. if (ret == 0 && IsDtlsNotSctpMode(ssl))
  17510. ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
  17511. if (ret == 0 && ssl->options.dtls)
  17512. DtlsSEQIncrement(ssl, CUR_ORDER);
  17513. #endif
  17514. ret = HashOutput(ssl, output, sendSz, 0);
  17515. }
  17516. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  17517. if (ret == 0 && ssl->hsInfoOn)
  17518. AddPacketName(ssl, "CertificateStatus");
  17519. if (ret == 0 && ssl->toInfoOn)
  17520. AddPacketInfo(ssl, "CertificateStatus", handshake, output, sendSz,
  17521. WRITE_PROTO, ssl->heap);
  17522. #endif
  17523. if (ret == 0) {
  17524. ssl->options.buildingMsg = 0;
  17525. ssl->buffers.outputBuffer.length += sendSz;
  17526. if (!ssl->options.groupMessages)
  17527. ret = SendBuffered(ssl);
  17528. }
  17529. }
  17530. WOLFSSL_LEAVE("BuildCertificateStatus", ret);
  17531. return ret;
  17532. }
  17533. #endif
  17534. #endif /* NO_WOLFSSL_SERVER */
  17535. /* handle generation of certificate_status (22) */
  17536. int SendCertificateStatus(WOLFSSL* ssl)
  17537. {
  17538. int ret = 0;
  17539. byte status_type = 0;
  17540. WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_SEND);
  17541. WOLFSSL_ENTER("SendCertificateStatus");
  17542. (void) ssl;
  17543. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
  17544. status_type = ssl->status_request;
  17545. #endif
  17546. #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
  17547. status_type = status_type ? status_type : ssl->status_request_v2;
  17548. #endif
  17549. switch (status_type) {
  17550. #ifndef NO_WOLFSSL_SERVER
  17551. #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
  17552. || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
  17553. /* case WOLFSSL_CSR_OCSP: */
  17554. case WOLFSSL_CSR2_OCSP:
  17555. {
  17556. OcspRequest* request = ssl->ctx->certOcspRequest;
  17557. buffer response;
  17558. ret = CreateOcspResponse(ssl, &request, &response);
  17559. /* if a request was successfully created and not stored in
  17560. * ssl->ctx then free it */
  17561. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  17562. FreeOcspRequest(request);
  17563. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  17564. request = NULL;
  17565. }
  17566. if (ret == 0 && response.buffer) {
  17567. ret = BuildCertificateStatus(ssl, status_type, &response, 1);
  17568. XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  17569. response.buffer = NULL;
  17570. }
  17571. break;
  17572. }
  17573. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
  17574. /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  17575. #if defined HAVE_CERTIFICATE_STATUS_REQUEST_V2
  17576. case WOLFSSL_CSR2_OCSP_MULTI:
  17577. {
  17578. OcspRequest* request = ssl->ctx->certOcspRequest;
  17579. buffer responses[1 + MAX_CHAIN_DEPTH];
  17580. int i = 0;
  17581. XMEMSET(responses, 0, sizeof(responses));
  17582. ret = CreateOcspResponse(ssl, &request, &responses[0]);
  17583. /* if a request was successfully created and not stored in
  17584. * ssl->ctx then free it */
  17585. if (ret == 0 && request != ssl->ctx->certOcspRequest) {
  17586. FreeOcspRequest(request);
  17587. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  17588. request = NULL;
  17589. }
  17590. if (ret == 0 && (!ssl->ctx->chainOcspRequest[0]
  17591. || ssl->buffers.weOwnCertChain)) {
  17592. buffer der;
  17593. word32 idx = 0;
  17594. #ifdef WOLFSSL_SMALL_STACK
  17595. DecodedCert* cert;
  17596. #else
  17597. DecodedCert cert[1];
  17598. #endif
  17599. DerBuffer* chain;
  17600. #ifdef WOLFSSL_SMALL_STACK
  17601. cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
  17602. DYNAMIC_TYPE_DCERT);
  17603. if (cert == NULL)
  17604. return MEMORY_E;
  17605. #endif
  17606. request = (OcspRequest*)XMALLOC(sizeof(OcspRequest), ssl->heap,
  17607. DYNAMIC_TYPE_OCSP_REQUEST);
  17608. if (request == NULL) {
  17609. #ifdef WOLFSSL_SMALL_STACK
  17610. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  17611. #endif
  17612. return MEMORY_E;
  17613. }
  17614. /* use certChain if available, otherwise use peer certificate */
  17615. chain = ssl->buffers.certChain;
  17616. if (chain == NULL) {
  17617. chain = ssl->buffers.certificate;
  17618. }
  17619. if (chain && chain->buffer) {
  17620. while (idx + OPAQUE24_LEN < chain->length) {
  17621. c24to32(chain->buffer + idx, &der.length);
  17622. idx += OPAQUE24_LEN;
  17623. der.buffer = chain->buffer + idx;
  17624. idx += der.length;
  17625. if (idx > chain->length)
  17626. break;
  17627. ret = CreateOcspRequest(ssl, request, cert, der.buffer,
  17628. der.length);
  17629. if (ret == 0) {
  17630. request->ssl = ssl;
  17631. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  17632. request, &responses[i + 1]);
  17633. /* Suppressing, not critical */
  17634. if (ret == OCSP_CERT_REVOKED ||
  17635. ret == OCSP_CERT_UNKNOWN ||
  17636. ret == OCSP_LOOKUP_FAIL) {
  17637. ret = 0;
  17638. }
  17639. i++;
  17640. FreeOcspRequest(request);
  17641. }
  17642. }
  17643. }
  17644. XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
  17645. #ifdef WOLFSSL_SMALL_STACK
  17646. XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
  17647. #endif
  17648. }
  17649. else {
  17650. while (ret == 0 &&
  17651. NULL != (request = ssl->ctx->chainOcspRequest[i])) {
  17652. request->ssl = ssl;
  17653. ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
  17654. request, &responses[++i]);
  17655. /* Suppressing, not critical */
  17656. if (ret == OCSP_CERT_REVOKED ||
  17657. ret == OCSP_CERT_UNKNOWN ||
  17658. ret == OCSP_LOOKUP_FAIL) {
  17659. ret = 0;
  17660. }
  17661. }
  17662. }
  17663. if (responses[0].buffer) {
  17664. if (ret == 0) {
  17665. ret = BuildCertificateStatus(ssl, status_type, responses,
  17666. (byte)i + 1);
  17667. }
  17668. for (i = 0; i < 1 + MAX_CHAIN_DEPTH; i++) {
  17669. if (responses[i].buffer) {
  17670. XFREE(responses[i].buffer, ssl->heap,
  17671. DYNAMIC_TYPE_OCSP_REQUEST);
  17672. }
  17673. }
  17674. }
  17675. break;
  17676. }
  17677. #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
  17678. #endif /* NO_WOLFSSL_SERVER */
  17679. default:
  17680. break;
  17681. }
  17682. WOLFSSL_LEAVE("SendCertificateStatus", ret);
  17683. WOLFSSL_END(WC_FUNC_CERTIFICATE_STATUS_SEND);
  17684. return ret;
  17685. }
  17686. #endif /* !NO_CERTS */
  17687. #endif /* WOLFSSL_NO_TLS12 */
  17688. #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
  17689. /**
  17690. * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
  17691. */
  17692. int DtlsSCRKeysSet(WOLFSSL* ssl)
  17693. {
  17694. return ssl->secure_renegotiation &&
  17695. ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
  17696. }
  17697. /**
  17698. * ssl->keys contains the current cipher parameters only for epoch 1. For
  17699. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  17700. * cipher parameters. This function checks if the message currently being
  17701. * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  17702. */
  17703. int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
  17704. {
  17705. return DtlsSCRKeysSet(ssl) &&
  17706. ssl->keys.curEpoch ==
  17707. ssl->secure_renegotiation->tmp_keys.dtls_epoch;
  17708. }
  17709. /**
  17710. * ssl->keys contains the current cipher parameters only for epoch 1. For
  17711. * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
  17712. * cipher parameters. This function checks if the message currently being
  17713. * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
  17714. */
  17715. int DtlsUseSCRKeys(WOLFSSL* ssl)
  17716. {
  17717. return DtlsSCRKeysSet(ssl) &&
  17718. ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
  17719. ssl->keys.dtls_epoch;
  17720. }
  17721. /**
  17722. * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
  17723. * then PREV_ORDER refers to the current epoch.
  17724. * */
  17725. int DtlsCheckOrder(WOLFSSL* ssl, int order)
  17726. {
  17727. if (order == PREV_ORDER && ssl->secure_renegotiation &&
  17728. ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
  17729. return CUR_ORDER;
  17730. }
  17731. else {
  17732. return order;
  17733. }
  17734. }
  17735. #endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
  17736. /* If secure renegotiation is disabled, this will always return false.
  17737. * Otherwise it checks to see if we are currently renegotiating. */
  17738. int IsSCR(WOLFSSL* ssl)
  17739. {
  17740. #ifndef HAVE_SECURE_RENEGOTIATION
  17741. (void)ssl;
  17742. #else /* HAVE_SECURE_RENEGOTIATION */
  17743. if (ssl->secure_renegotiation &&
  17744. ssl->secure_renegotiation->enabled && /* Is SCR enabled? */
  17745. ssl->options.handShakeDone && /* At least one handshake done? */
  17746. ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
  17747. return 1;
  17748. #endif /* HAVE_SECURE_RENEGOTIATION */
  17749. return 0;
  17750. }
  17751. #ifdef WOLFSSL_DTLS
  17752. static int ModifyForMTU(WOLFSSL* ssl, int buffSz, int outputSz, int mtuSz)
  17753. {
  17754. int recordExtra = outputSz - buffSz;
  17755. (void)ssl;
  17756. if (recordExtra > 0 && outputSz > mtuSz) {
  17757. buffSz = mtuSz - recordExtra;
  17758. #ifndef WOLFSSL_AEAD_ONLY
  17759. /* Subtract a block size to be certain that returned fragment
  17760. * size won't get more padding. */
  17761. if (ssl->specs.cipher_type == block)
  17762. buffSz -= ssl->specs.block_size;
  17763. #endif
  17764. }
  17765. return buffSz;
  17766. }
  17767. #endif /* WOLFSSL_DTLS */
  17768. int SendData(WOLFSSL* ssl, const void* data, int sz)
  17769. {
  17770. int sent = 0, /* plainText size */
  17771. sendSz,
  17772. ret;
  17773. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  17774. int groupMsgs = 0;
  17775. #endif
  17776. if (ssl->error == WANT_WRITE
  17777. #ifdef WOLFSSL_ASYNC_CRYPT
  17778. || ssl->error == WC_PENDING_E
  17779. #endif
  17780. ) {
  17781. ssl->error = 0;
  17782. }
  17783. /* don't allow write after decrypt or mac error */
  17784. if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) {
  17785. /* For DTLS allow these possible errors and allow the session
  17786. to continue despite them */
  17787. if (ssl->options.dtls) {
  17788. ssl->error = 0;
  17789. }
  17790. else {
  17791. WOLFSSL_MSG("Not allowing write after decrypt or mac error");
  17792. return WOLFSSL_FATAL_ERROR;
  17793. }
  17794. }
  17795. #ifdef WOLFSSL_EARLY_DATA
  17796. if (ssl->earlyData != no_early_data) {
  17797. if (ssl->options.handShakeState == HANDSHAKE_DONE) {
  17798. WOLFSSL_MSG("handshake complete, trying to send early data");
  17799. ssl->error = BUILD_MSG_ERROR;
  17800. return WOLFSSL_FATAL_ERROR;
  17801. }
  17802. #ifdef WOLFSSL_EARLY_DATA_GROUP
  17803. groupMsgs = 1;
  17804. #endif
  17805. }
  17806. else
  17807. #endif
  17808. if (ssl->options.handShakeState != HANDSHAKE_DONE && !IsSCR(ssl)) {
  17809. int err;
  17810. WOLFSSL_MSG("handshake not complete, trying to finish");
  17811. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  17812. #ifdef WOLFSSL_ASYNC_CRYPT
  17813. /* if async would block return WANT_WRITE */
  17814. if (ssl->error == WC_PENDING_E) {
  17815. return WOLFSSL_CBIO_ERR_WANT_WRITE;
  17816. }
  17817. #endif
  17818. return err;
  17819. }
  17820. }
  17821. /* last time system socket output buffer was full, try again to send */
  17822. if (ssl->buffers.outputBuffer.length > 0
  17823. #if defined(WOLFSSL_EARLY_DATA) && defined(WOLFSSL_EARLY_DATA_GROUP)
  17824. && !groupMsgs
  17825. #endif
  17826. ) {
  17827. WOLFSSL_MSG("output buffer was full, trying to send again");
  17828. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  17829. WOLFSSL_ERROR(ssl->error);
  17830. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  17831. ssl->options.isClosed)) {
  17832. ssl->error = SOCKET_PEER_CLOSED_E;
  17833. WOLFSSL_ERROR(ssl->error);
  17834. return 0; /* peer reset or closed */
  17835. }
  17836. return ssl->error;
  17837. }
  17838. else {
  17839. /* advance sent to previous sent + plain size just sent */
  17840. sent = ssl->buffers.prevSent + ssl->buffers.plainSz;
  17841. WOLFSSL_MSG("sent write buffered data");
  17842. if (sent > sz) {
  17843. WOLFSSL_MSG("error: write() after WANT_WRITE with short size");
  17844. return ssl->error = BAD_FUNC_ARG;
  17845. }
  17846. }
  17847. }
  17848. for (;;) {
  17849. byte* out;
  17850. byte* sendBuffer = (byte*)data + sent; /* may switch on comp */
  17851. int buffSz; /* may switch on comp */
  17852. int outputSz;
  17853. #ifdef HAVE_LIBZ
  17854. byte comp[MAX_RECORD_SIZE + MAX_COMP_EXTRA];
  17855. #endif
  17856. #ifdef WOLFSSL_DTLS
  17857. if (ssl->options.dtls) {
  17858. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  17859. }
  17860. else
  17861. #endif
  17862. {
  17863. buffSz = wolfSSL_GetMaxFragSize(ssl, sz - sent);
  17864. }
  17865. if (sent == sz) break;
  17866. #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
  17867. if (ssl->options.dtls && (buffSz < sz - sent)) {
  17868. ssl->error = DTLS_SIZE_ERROR;
  17869. WOLFSSL_ERROR(ssl->error);
  17870. return ssl->error;
  17871. }
  17872. #endif
  17873. outputSz = buffSz + COMP_EXTRA + DTLS_RECORD_HEADER_SZ;
  17874. if (IsEncryptionOn(ssl, 1) || ssl->options.tls1_3)
  17875. outputSz += cipherExtraData(ssl);
  17876. /* check for available size */
  17877. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0)
  17878. return ssl->error = ret;
  17879. /* get output buffer */
  17880. out = ssl->buffers.outputBuffer.buffer +
  17881. ssl->buffers.outputBuffer.length;
  17882. #ifdef HAVE_LIBZ
  17883. if (ssl->options.usingCompression) {
  17884. buffSz = myCompress(ssl, sendBuffer, buffSz, comp, sizeof(comp));
  17885. if (buffSz < 0) {
  17886. return buffSz;
  17887. }
  17888. sendBuffer = comp;
  17889. }
  17890. #endif
  17891. if (!ssl->options.tls1_3) {
  17892. #ifdef WOLFSSL_ASYNC_CRYPT
  17893. if (ssl->async == NULL) {
  17894. ssl->async = (struct WOLFSSL_ASYNC*)
  17895. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  17896. DYNAMIC_TYPE_ASYNC);
  17897. if (ssl->async == NULL)
  17898. return MEMORY_E;
  17899. ssl->async->freeArgs = NULL;
  17900. }
  17901. #endif
  17902. sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
  17903. application_data, 0, 0, 1, CUR_ORDER);
  17904. }
  17905. else {
  17906. #ifdef WOLFSSL_TLS13
  17907. sendSz = BuildTls13Message(ssl, out, outputSz, sendBuffer, buffSz,
  17908. application_data, 0, 0, 1);
  17909. #else
  17910. sendSz = BUFFER_ERROR;
  17911. #endif
  17912. }
  17913. if (sendSz < 0) {
  17914. #ifdef WOLFSSL_ASYNC_CRYPT
  17915. if (sendSz == WC_PENDING_E)
  17916. ssl->error = sendSz;
  17917. #endif
  17918. return BUILD_MSG_ERROR;
  17919. }
  17920. #ifdef WOLFSSL_ASYNC_CRYPT
  17921. FreeAsyncCtx(ssl, 0);
  17922. #endif
  17923. ssl->buffers.outputBuffer.length += sendSz;
  17924. if ( (ssl->error = SendBuffered(ssl)) < 0) {
  17925. WOLFSSL_ERROR(ssl->error);
  17926. /* store for next call if WANT_WRITE or user embedSend() that
  17927. doesn't present like WANT_WRITE */
  17928. ssl->buffers.plainSz = buffSz;
  17929. ssl->buffers.prevSent = sent;
  17930. if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset ||
  17931. ssl->options.isClosed)) {
  17932. ssl->error = SOCKET_PEER_CLOSED_E;
  17933. WOLFSSL_ERROR(ssl->error);
  17934. return 0; /* peer reset or closed */
  17935. }
  17936. return ssl->error;
  17937. }
  17938. sent += buffSz;
  17939. /* only one message per attempt */
  17940. if (ssl->options.partialWrite == 1) {
  17941. WOLFSSL_MSG("Partial Write on, only sending one record");
  17942. break;
  17943. }
  17944. }
  17945. return sent;
  17946. }
  17947. /* process input data */
  17948. int ReceiveData(WOLFSSL* ssl, byte* output, int sz, int peek)
  17949. {
  17950. int size;
  17951. WOLFSSL_ENTER("ReceiveData()");
  17952. /* reset error state */
  17953. if (ssl->error == WANT_READ || ssl->error == WOLFSSL_ERROR_WANT_READ) {
  17954. ssl->error = 0;
  17955. }
  17956. #ifdef WOLFSSL_DTLS
  17957. if (ssl->options.dtls) {
  17958. /* In DTLS mode, we forgive some errors and allow the session
  17959. * to continue despite them. */
  17960. if (ssl->error == VERIFY_MAC_ERROR ||
  17961. ssl->error == DECRYPT_ERROR ||
  17962. ssl->error == DTLS_SIZE_ERROR) {
  17963. ssl->error = 0;
  17964. }
  17965. }
  17966. #endif /* WOLFSSL_DTLS */
  17967. if (ssl->error != 0 && ssl->error != WANT_WRITE
  17968. #ifdef WOLFSSL_ASYNC_CRYPT
  17969. && ssl->error != WC_PENDING_E
  17970. #endif
  17971. #ifdef HAVE_SECURE_RENEGOTIATION
  17972. && ssl->error != APP_DATA_READY
  17973. #endif
  17974. ) {
  17975. WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
  17976. return ssl->error;
  17977. }
  17978. #ifdef WOLFSSL_EARLY_DATA
  17979. if (ssl->earlyData != no_early_data) {
  17980. }
  17981. else
  17982. #endif
  17983. {
  17984. int negotiate = 0;
  17985. #ifdef HAVE_SECURE_RENEGOTIATION
  17986. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
  17987. if (ssl->options.handShakeState != HANDSHAKE_DONE
  17988. && ssl->buffers.clearOutputBuffer.length == 0)
  17989. negotiate = 1;
  17990. }
  17991. else
  17992. #endif
  17993. if (ssl->options.handShakeState != HANDSHAKE_DONE)
  17994. negotiate = 1;
  17995. if (negotiate) {
  17996. int err;
  17997. WOLFSSL_MSG("Handshake not complete, trying to finish");
  17998. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  17999. #ifdef WOLFSSL_ASYNC_CRYPT
  18000. /* if async would block return WANT_WRITE */
  18001. if (ssl->error == WC_PENDING_E) {
  18002. return WOLFSSL_CBIO_ERR_WANT_READ;
  18003. }
  18004. #endif
  18005. return err;
  18006. }
  18007. }
  18008. }
  18009. #ifdef HAVE_SECURE_RENEGOTIATION
  18010. startScr:
  18011. if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
  18012. int ret;
  18013. WOLFSSL_MSG("Need to start scr, server requested");
  18014. ret = wolfSSL_Rehandshake(ssl);
  18015. ssl->secure_renegotiation->startScr = 0; /* only start once */
  18016. if (ret != WOLFSSL_SUCCESS)
  18017. return ret;
  18018. }
  18019. #endif
  18020. while (ssl->buffers.clearOutputBuffer.length == 0) {
  18021. if ( (ssl->error = ProcessReply(ssl)) < 0) {
  18022. WOLFSSL_ERROR(ssl->error);
  18023. if (ssl->error == ZERO_RETURN) {
  18024. WOLFSSL_MSG("Zero return, no more data coming");
  18025. return 0; /* no more data coming */
  18026. }
  18027. if (ssl->error == SOCKET_ERROR_E) {
  18028. if (ssl->options.connReset || ssl->options.isClosed) {
  18029. WOLFSSL_MSG("Peer reset or closed, connection done");
  18030. ssl->error = SOCKET_PEER_CLOSED_E;
  18031. WOLFSSL_ERROR(ssl->error);
  18032. return 0; /* peer reset or closed */
  18033. }
  18034. }
  18035. return ssl->error;
  18036. }
  18037. #ifdef HAVE_SECURE_RENEGOTIATION
  18038. if (ssl->secure_renegotiation &&
  18039. ssl->secure_renegotiation->startScr) {
  18040. goto startScr;
  18041. }
  18042. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  18043. ssl->options.handShakeState != HANDSHAKE_DONE
  18044. && ssl->buffers.clearOutputBuffer.length == 0) {
  18045. /* ProcessReply processed a handshake packet and not any APP DATA
  18046. * so let's move the handshake along */
  18047. int err;
  18048. WOLFSSL_MSG("Handshake not complete, trying to finish");
  18049. if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
  18050. #ifdef WOLFSSL_ASYNC_CRYPT
  18051. /* if async would block return WANT_WRITE */
  18052. if (ssl->error == WC_PENDING_E) {
  18053. return WOLFSSL_CBIO_ERR_WANT_READ;
  18054. }
  18055. #endif
  18056. return err;
  18057. }
  18058. }
  18059. #endif
  18060. #ifndef WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE
  18061. #ifdef WOLFSSL_TLS13
  18062. if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
  18063. ssl->curRL.type == handshake && peek) {
  18064. WOLFSSL_MSG("Got Handshake Messge in APP data");
  18065. if (ssl->buffers.inputBuffer.length == 0) {
  18066. ssl->error = WOLFSSL_ERROR_WANT_READ;
  18067. return 0;
  18068. }
  18069. }
  18070. #endif
  18071. #endif
  18072. }
  18073. size = min(sz, (int)ssl->buffers.clearOutputBuffer.length);
  18074. XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
  18075. if (peek == 0) {
  18076. ssl->buffers.clearOutputBuffer.length -= size;
  18077. ssl->buffers.clearOutputBuffer.buffer += size;
  18078. }
  18079. if (ssl->buffers.clearOutputBuffer.length == 0 &&
  18080. ssl->buffers.inputBuffer.dynamicFlag)
  18081. ShrinkInputBuffer(ssl, NO_FORCED_FREE);
  18082. WOLFSSL_LEAVE("ReceiveData()", size);
  18083. return size;
  18084. }
  18085. /* send alert message */
  18086. int SendAlert(WOLFSSL* ssl, int severity, int type)
  18087. {
  18088. byte input[ALERT_SIZE];
  18089. byte *output;
  18090. int sendSz;
  18091. int ret;
  18092. int outputSz;
  18093. int dtlsExtra = 0;
  18094. WOLFSSL_ENTER("SendAlert");
  18095. #ifdef HAVE_WRITE_DUP
  18096. if (ssl->dupWrite && ssl->dupSide == READ_DUP_SIDE) {
  18097. int notifyErr = 0;
  18098. WOLFSSL_MSG("Read dup side cannot write alerts, notifying sibling");
  18099. if (type == close_notify) {
  18100. notifyErr = ZERO_RETURN;
  18101. } else if (severity == alert_fatal) {
  18102. notifyErr = FATAL_ERROR;
  18103. }
  18104. if (notifyErr != 0) {
  18105. return NotifyWriteSide(ssl, notifyErr);
  18106. }
  18107. return 0;
  18108. }
  18109. #endif
  18110. /* if sendalert is called again for nonblocking */
  18111. if (ssl->options.sendAlertState != 0) {
  18112. ret = SendBuffered(ssl);
  18113. if (ret == 0)
  18114. ssl->options.sendAlertState = 0;
  18115. return ret;
  18116. }
  18117. #ifdef OPENSSL_EXTRA
  18118. if (ssl->CBIS != NULL) {
  18119. ssl->CBIS(ssl, SSL_CB_ALERT, type);
  18120. }
  18121. #endif
  18122. #ifdef WOLFSSL_DTLS
  18123. if (ssl->options.dtls)
  18124. dtlsExtra = DTLS_RECORD_EXTRA;
  18125. #endif
  18126. /* check for available size */
  18127. outputSz = ALERT_SIZE + MAX_MSG_EXTRA + dtlsExtra;
  18128. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  18129. /* If CheckAvailableSize returned WANT_WRITE due to a blocking write
  18130. * then discard pending output and just send the alert. */
  18131. if (ret != WANT_WRITE || severity != alert_fatal)
  18132. return ret;
  18133. ShrinkOutputBuffer(ssl);
  18134. if ((ret = CheckAvailableSize(ssl, outputSz)) != 0) {
  18135. return ret;
  18136. }
  18137. }
  18138. /* Check output buffer */
  18139. if (ssl->buffers.outputBuffer.buffer == NULL)
  18140. return BUFFER_E;
  18141. /* get output buffer */
  18142. output = ssl->buffers.outputBuffer.buffer +
  18143. ssl->buffers.outputBuffer.length;
  18144. input[0] = (byte)severity;
  18145. input[1] = (byte)type;
  18146. ssl->alert_history.last_tx.code = type;
  18147. ssl->alert_history.last_tx.level = severity;
  18148. if (severity == alert_fatal) {
  18149. ssl->options.isClosed = 1; /* Don't send close_notify */
  18150. }
  18151. /* send encrypted alert if encryption is on - can be a rehandshake over
  18152. * an existing encrypted channel.
  18153. * TLS 1.3 encrypts handshake packets after the ServerHello
  18154. */
  18155. if (IsEncryptionOn(ssl, 1)) {
  18156. sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
  18157. 0, 0, 0, CUR_ORDER);
  18158. }
  18159. else {
  18160. AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
  18161. output += RECORD_HEADER_SZ;
  18162. #ifdef WOLFSSL_DTLS
  18163. if (ssl->options.dtls)
  18164. output += DTLS_RECORD_EXTRA;
  18165. #endif
  18166. XMEMCPY(output, input, ALERT_SIZE);
  18167. sendSz = RECORD_HEADER_SZ + ALERT_SIZE;
  18168. #ifdef WOLFSSL_DTLS
  18169. if (ssl->options.dtls)
  18170. sendSz += DTLS_RECORD_EXTRA;
  18171. #endif
  18172. }
  18173. if (sendSz < 0)
  18174. return BUILD_MSG_ERROR;
  18175. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  18176. if (ssl->hsInfoOn)
  18177. AddPacketName(ssl, "Alert");
  18178. if (ssl->toInfoOn)
  18179. AddPacketInfo(ssl, "Alert", alert, output, sendSz, WRITE_PROTO,
  18180. ssl->heap);
  18181. #endif
  18182. ssl->buffers.outputBuffer.length += sendSz;
  18183. ssl->options.sendAlertState = 1;
  18184. ret = SendBuffered(ssl);
  18185. WOLFSSL_LEAVE("SendAlert", ret);
  18186. return ret;
  18187. }
  18188. const char* wolfSSL_ERR_reason_error_string(unsigned long e)
  18189. {
  18190. #ifdef NO_ERROR_STRINGS
  18191. (void)e;
  18192. return "no support for error strings built in";
  18193. #else
  18194. int error = (int)e;
  18195. #ifdef OPENSSL_EXTRA
  18196. /* OpenSSL uses positive error codes */
  18197. if (error > 0) {
  18198. error = -error;
  18199. }
  18200. #endif
  18201. /* pass to wolfCrypt */
  18202. if (error < MAX_CODE_E && error > MIN_CODE_E) {
  18203. return wc_GetErrorString(error);
  18204. }
  18205. switch (error) {
  18206. #ifdef OPENSSL_EXTRA
  18207. case 0 :
  18208. return "ok";
  18209. #endif
  18210. case UNSUPPORTED_SUITE :
  18211. return "unsupported cipher suite";
  18212. case INPUT_CASE_ERROR :
  18213. return "input state error";
  18214. case PREFIX_ERROR :
  18215. return "bad index to key rounds";
  18216. case MEMORY_ERROR :
  18217. return "out of memory";
  18218. case VERIFY_FINISHED_ERROR :
  18219. return "verify problem on finished";
  18220. case VERIFY_MAC_ERROR :
  18221. return "verify mac problem";
  18222. case PARSE_ERROR :
  18223. return "parse error on header";
  18224. case SIDE_ERROR :
  18225. return "wrong client/server type";
  18226. case NO_PEER_CERT : /* OpenSSL compatibility expects this exact text */
  18227. return "peer did not return a certificate";
  18228. case UNKNOWN_HANDSHAKE_TYPE :
  18229. return "weird handshake type";
  18230. case SOCKET_ERROR_E :
  18231. return "error state on socket";
  18232. case SOCKET_NODATA :
  18233. return "expected data, not there";
  18234. case INCOMPLETE_DATA :
  18235. return "don't have enough data to complete task";
  18236. case UNKNOWN_RECORD_TYPE :
  18237. return "unknown type in record hdr";
  18238. case DECRYPT_ERROR :
  18239. return "error during decryption";
  18240. case FATAL_ERROR :
  18241. return "received alert fatal error";
  18242. case ENCRYPT_ERROR :
  18243. return "error during encryption";
  18244. case FREAD_ERROR :
  18245. return "fread problem";
  18246. case NO_PEER_KEY :
  18247. return "need peer's key";
  18248. case NO_PRIVATE_KEY :
  18249. return "need the private key";
  18250. case NO_DH_PARAMS :
  18251. return "server missing DH params";
  18252. case RSA_PRIVATE_ERROR :
  18253. return "error during rsa priv op";
  18254. case MATCH_SUITE_ERROR :
  18255. return "can't match cipher suite";
  18256. case COMPRESSION_ERROR :
  18257. return "compression mismatch error";
  18258. case BUILD_MSG_ERROR :
  18259. return "build message failure";
  18260. case BAD_HELLO :
  18261. return "client hello malformed";
  18262. case DOMAIN_NAME_MISMATCH :
  18263. return "peer subject name mismatch";
  18264. case IPADDR_MISMATCH :
  18265. return "peer ip address mismatch";
  18266. case WANT_READ :
  18267. case WOLFSSL_ERROR_WANT_READ :
  18268. return "non-blocking socket wants data to be read";
  18269. case NOT_READY_ERROR :
  18270. return "handshake layer not ready yet, complete first";
  18271. case VERSION_ERROR :
  18272. return "record layer version error";
  18273. case WANT_WRITE :
  18274. case WOLFSSL_ERROR_WANT_WRITE :
  18275. return "non-blocking socket write buffer full";
  18276. case BUFFER_ERROR :
  18277. return "malformed buffer input error";
  18278. case VERIFY_CERT_ERROR :
  18279. return "verify problem on certificate";
  18280. case VERIFY_SIGN_ERROR :
  18281. return "verify problem based on signature";
  18282. case CLIENT_ID_ERROR :
  18283. return "psk client identity error";
  18284. case SERVER_HINT_ERROR:
  18285. return "psk server hint error";
  18286. case PSK_KEY_ERROR:
  18287. return "psk key callback error";
  18288. case GETTIME_ERROR:
  18289. return "gettimeofday() error";
  18290. case GETITIMER_ERROR:
  18291. return "getitimer() error";
  18292. case SIGACT_ERROR:
  18293. return "sigaction() error";
  18294. case SETITIMER_ERROR:
  18295. return "setitimer() error";
  18296. case LENGTH_ERROR:
  18297. return "record layer length error";
  18298. case PEER_KEY_ERROR:
  18299. return "cant decode peer key";
  18300. case ZERO_RETURN:
  18301. case WOLFSSL_ERROR_ZERO_RETURN:
  18302. return "peer sent close notify alert";
  18303. case ECC_CURVETYPE_ERROR:
  18304. return "Bad ECC Curve Type or unsupported";
  18305. case ECC_CURVE_ERROR:
  18306. return "Bad ECC Curve or unsupported";
  18307. case ECC_PEERKEY_ERROR:
  18308. return "Bad ECC Peer Key";
  18309. case ECC_MAKEKEY_ERROR:
  18310. return "ECC Make Key failure";
  18311. case ECC_EXPORT_ERROR:
  18312. return "ECC Export Key failure";
  18313. case ECC_SHARED_ERROR:
  18314. return "ECC DHE shared failure";
  18315. case NOT_CA_ERROR:
  18316. return "Not a CA by basic constraint error";
  18317. case BAD_CERT_MANAGER_ERROR:
  18318. return "Bad Cert Manager error";
  18319. case OCSP_CERT_REVOKED:
  18320. return "OCSP Cert revoked";
  18321. case CRL_CERT_REVOKED:
  18322. return "CRL Cert revoked";
  18323. case CRL_MISSING:
  18324. return "CRL missing, not loaded";
  18325. case MONITOR_SETUP_E:
  18326. return "CRL monitor setup error";
  18327. case THREAD_CREATE_E:
  18328. return "Thread creation problem";
  18329. case OCSP_NEED_URL:
  18330. return "OCSP need URL";
  18331. case OCSP_CERT_UNKNOWN:
  18332. return "OCSP Cert unknown";
  18333. case OCSP_LOOKUP_FAIL:
  18334. return "OCSP Responder lookup fail";
  18335. case MAX_CHAIN_ERROR:
  18336. return "Maximum Chain Depth Exceeded";
  18337. case COOKIE_ERROR:
  18338. return "DTLS Cookie Error";
  18339. case SEQUENCE_ERROR:
  18340. return "DTLS Sequence Error";
  18341. case SUITES_ERROR:
  18342. return "Suites Pointer Error";
  18343. case OUT_OF_ORDER_E:
  18344. return "Out of order message, fatal";
  18345. case BAD_KEA_TYPE_E:
  18346. return "Bad KEA type found";
  18347. case SANITY_CIPHER_E:
  18348. return "Sanity check on ciphertext failed";
  18349. case RECV_OVERFLOW_E:
  18350. return "Receive callback returned more than requested";
  18351. case GEN_COOKIE_E:
  18352. return "Generate Cookie Error";
  18353. case NO_PEER_VERIFY:
  18354. return "Need peer certificate verify Error";
  18355. case FWRITE_ERROR:
  18356. return "fwrite Error";
  18357. case CACHE_MATCH_ERROR:
  18358. return "Cache restore header match Error";
  18359. case UNKNOWN_SNI_HOST_NAME_E:
  18360. return "Unrecognized host name Error";
  18361. case UNKNOWN_MAX_FRAG_LEN_E:
  18362. return "Unrecognized max frag len Error";
  18363. case KEYUSE_SIGNATURE_E:
  18364. return "Key Use digitalSignature not set Error";
  18365. case KEYUSE_ENCIPHER_E:
  18366. return "Key Use keyEncipherment not set Error";
  18367. case EXTKEYUSE_AUTH_E:
  18368. return "Ext Key Use server/client auth not set Error";
  18369. case SEND_OOB_READ_E:
  18370. return "Send Callback Out of Bounds Read Error";
  18371. case SECURE_RENEGOTIATION_E:
  18372. return "Invalid Renegotiation Error";
  18373. case SESSION_TICKET_LEN_E:
  18374. return "Session Ticket Too Long Error";
  18375. case SESSION_TICKET_EXPECT_E:
  18376. return "Session Ticket Error";
  18377. case SESSION_SECRET_CB_E:
  18378. return "Session Secret Callback Error";
  18379. case NO_CHANGE_CIPHER_E:
  18380. return "Finished received from peer before Change Cipher Error";
  18381. case SANITY_MSG_E:
  18382. return "Sanity Check on message order Error";
  18383. case DUPLICATE_MSG_E:
  18384. return "Duplicate HandShake message Error";
  18385. case SNI_UNSUPPORTED:
  18386. return "Protocol version does not support SNI Error";
  18387. case SOCKET_PEER_CLOSED_E:
  18388. return "Peer closed underlying transport Error";
  18389. case BAD_TICKET_KEY_CB_SZ:
  18390. return "Bad user session ticket key callback Size Error";
  18391. case BAD_TICKET_MSG_SZ:
  18392. return "Bad session ticket message Size Error";
  18393. case BAD_TICKET_ENCRYPT:
  18394. return "Bad user ticket callback encrypt Error";
  18395. case DH_KEY_SIZE_E:
  18396. return "DH key too small Error";
  18397. case SNI_ABSENT_ERROR:
  18398. return "No Server Name Indication extension Error";
  18399. case RSA_SIGN_FAULT:
  18400. return "RSA Signature Fault Error";
  18401. case HANDSHAKE_SIZE_ERROR:
  18402. return "Handshake message too large Error";
  18403. case UNKNOWN_ALPN_PROTOCOL_NAME_E:
  18404. return "Unrecognized protocol name Error";
  18405. case BAD_CERTIFICATE_STATUS_ERROR:
  18406. return "Bad Certificate Status Message Error";
  18407. case OCSP_INVALID_STATUS:
  18408. return "Invalid OCSP Status Error";
  18409. case OCSP_WANT_READ:
  18410. return "OCSP nonblock wants read";
  18411. case RSA_KEY_SIZE_E:
  18412. return "RSA key too small";
  18413. case ECC_KEY_SIZE_E:
  18414. return "ECC key too small";
  18415. case DTLS_EXPORT_VER_E:
  18416. return "Version needs updated after code change or version mismatch";
  18417. case INPUT_SIZE_E:
  18418. return "Input size too large Error";
  18419. case CTX_INIT_MUTEX_E:
  18420. return "Initialize ctx mutex error";
  18421. case EXT_MASTER_SECRET_NEEDED_E:
  18422. return "Extended Master Secret must be enabled to resume EMS session";
  18423. case DTLS_POOL_SZ_E:
  18424. return "Maximum DTLS pool size exceeded";
  18425. case DECODE_E:
  18426. return "Decode handshake message error";
  18427. case WRITE_DUP_READ_E:
  18428. return "Write dup write side can't read error";
  18429. case WRITE_DUP_WRITE_E:
  18430. return "Write dup read side can't write error";
  18431. case INVALID_CERT_CTX_E:
  18432. return "Certificate context does not match request or not empty";
  18433. case BAD_KEY_SHARE_DATA:
  18434. return "The Key Share data contains group that wasn't in Client Hello";
  18435. case MISSING_HANDSHAKE_DATA:
  18436. return "The handshake message is missing required data";
  18437. case BAD_BINDER: /* OpenSSL compatibility expects this exact text */
  18438. return "binder does not verify";
  18439. case EXT_NOT_ALLOWED:
  18440. return "Extension type not allowed in handshake message type";
  18441. case INVALID_PARAMETER:
  18442. return "The security parameter is invalid";
  18443. case UNSUPPORTED_EXTENSION:
  18444. return "TLS Extension not requested by the client";
  18445. case PRF_MISSING:
  18446. return "Pseudo-random function is not enabled";
  18447. case KEY_SHARE_ERROR:
  18448. return "Key share extension did not contain a valid named group";
  18449. case POST_HAND_AUTH_ERROR:
  18450. return "Client will not do post handshake authentication";
  18451. case HRR_COOKIE_ERROR:
  18452. return "Cookie does not match one sent in HelloRetryRequest";
  18453. case MCAST_HIGHWATER_CB_E:
  18454. return "Multicast highwater callback returned error";
  18455. case ALERT_COUNT_E:
  18456. return "Alert Count exceeded error";
  18457. case EXT_MISSING:
  18458. return "Required TLS extension missing";
  18459. case DTLS_RETX_OVER_TX:
  18460. return "DTLS interrupting flight transmit with retransmit";
  18461. case DH_PARAMS_NOT_FFDHE_E:
  18462. return "Server DH parameters were not from the FFDHE set as required";
  18463. case TCA_INVALID_ID_TYPE:
  18464. return "TLS Extension Trusted CA ID type invalid";
  18465. case TCA_ABSENT_ERROR:
  18466. return "TLS Extension Trusted CA ID response absent";
  18467. case TSIP_MAC_DIGSZ_E:
  18468. return "TSIP MAC size invalid, must be sized for SHA-1 or SHA-256";
  18469. case CLIENT_CERT_CB_ERROR:
  18470. return "Error importing client cert or key from callback";
  18471. case SSL_SHUTDOWN_ALREADY_DONE_E:
  18472. return "Shutdown has already occurred";
  18473. case TLS13_SECRET_CB_E:
  18474. return "TLS1.3 Secret Callback Error";
  18475. case DTLS_SIZE_ERROR:
  18476. return "DTLS trying to send too much in single datagram error";
  18477. case NO_CERT_ERROR:
  18478. return "TLS1.3 No Certificate Set Error";
  18479. case APP_DATA_READY:
  18480. return "Application data is available for reading";
  18481. case TOO_MUCH_EARLY_DATA:
  18482. return "Too much early data";
  18483. case SOCKET_FILTERED_E:
  18484. return "Session stopped by network filter";
  18485. #ifdef HAVE_HTTP_CLIENT
  18486. case HTTP_TIMEOUT:
  18487. return "HTTP timeout for OCSP or CRL req";
  18488. case HTTP_RECV_ERR:
  18489. return "HTTP Receive error";
  18490. case HTTP_HEADER_ERR:
  18491. return "HTTP Header error";
  18492. case HTTP_PROTO_ERR:
  18493. return "HTTP Protocol error";
  18494. case HTTP_STATUS_ERR:
  18495. return "HTTP Status error";
  18496. case HTTP_VERSION_ERR:
  18497. return "HTTP Version error";
  18498. case HTTP_APPSTR_ERR:
  18499. return "HTTP Application string error";
  18500. #endif
  18501. #ifdef OPENSSL_EXTRA
  18502. case -X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
  18503. return "unable to get local issuer certificate";
  18504. #endif
  18505. case UNSUPPORTED_PROTO_VERSION:
  18506. #ifdef OPENSSL_ALL
  18507. return "WRONG_SSL_VERSION";
  18508. #else
  18509. return "bad/unsupported protocol version";
  18510. #endif
  18511. case FALCON_KEY_SIZE_E:
  18512. return "Wrong key size for Falcon.";
  18513. default :
  18514. return "unknown error number";
  18515. }
  18516. #endif /* NO_ERROR_STRINGS */
  18517. }
  18518. const char* wolfSSL_ERR_func_error_string(unsigned long e)
  18519. {
  18520. (void)e;
  18521. WOLFSSL_MSG("wolfSSL_ERR_func_error_string does not return the name of "
  18522. "the function that failed. Please inspect the wolfSSL debug "
  18523. "logs to determine where the error occurred.");
  18524. return "";
  18525. }
  18526. /* return library name
  18527. * @param e error code
  18528. * @return text library name,
  18529. * if there is no suitable library found, returns empty string
  18530. */
  18531. const char* wolfSSL_ERR_lib_error_string(unsigned long e)
  18532. {
  18533. int libe = 0;
  18534. (void)libe;
  18535. (void)e;
  18536. #if defined(OPENSSL_EXTRA)
  18537. libe = wolfSSL_ERR_GET_LIB(e);
  18538. switch (libe) {
  18539. case ERR_LIB_PEM:
  18540. return "wolfSSL PEM routines";
  18541. case ERR_LIB_EVP:
  18542. return "wolfSSL digital envelope routines";
  18543. default:
  18544. return "";
  18545. }
  18546. #else
  18547. return "";
  18548. #endif
  18549. }
  18550. void SetErrorString(int error, char* str)
  18551. {
  18552. XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ);
  18553. str[WOLFSSL_MAX_ERROR_SZ-1] = 0;
  18554. }
  18555. #ifdef NO_CIPHER_SUITE_ALIASES
  18556. #ifndef NO_ERROR_STRINGS
  18557. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  18558. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  18559. #define SUITE_ALIAS(x,z,w,v,u)
  18560. #else
  18561. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  18562. #define SUITE_ALIAS(x,z,w,v,u)
  18563. #endif
  18564. #else
  18565. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
  18566. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  18567. #define SUITE_ALIAS(x,z,w,v,u)
  18568. #else
  18569. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  18570. #define SUITE_ALIAS(x,z,w,v,u)
  18571. #endif
  18572. #endif
  18573. #else /* !NO_CIPHER_SUITE_ALIASES */
  18574. /* note that the comma is included at the end of the SUITE_ALIAS() macro
  18575. * definitions, to allow aliases to be gated out by the above null macros
  18576. * in the NO_CIPHER_SUITE_ALIASES section.
  18577. */
  18578. #ifndef NO_ERROR_STRINGS
  18579. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  18580. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  18581. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  18582. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  18583. #else
  18584. #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  18585. #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  18586. #endif
  18587. #else
  18588. #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
  18589. defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
  18590. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  18591. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  18592. #else
  18593. #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
  18594. #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
  18595. #endif
  18596. #endif
  18597. #endif /* NO_CIPHER_SUITE_ALIASES */
  18598. static const CipherSuiteInfo cipher_names[] =
  18599. {
  18600. #ifdef BUILD_TLS_AES_128_GCM_SHA256
  18601. SUITE_INFO("TLS13-AES128-GCM-SHA256","TLS_AES_128_GCM_SHA256",TLS13_BYTE,TLS_AES_128_GCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  18602. #endif
  18603. #ifdef BUILD_TLS_AES_256_GCM_SHA384
  18604. SUITE_INFO("TLS13-AES256-GCM-SHA384","TLS_AES_256_GCM_SHA384",TLS13_BYTE,TLS_AES_256_GCM_SHA384, TLSv1_3_MINOR, SSLv3_MAJOR),
  18605. #endif
  18606. #ifdef BUILD_TLS_CHACHA20_POLY1305_SHA256
  18607. SUITE_INFO("TLS13-CHACHA20-POLY1305-SHA256","TLS_CHACHA20_POLY1305_SHA256",TLS13_BYTE,TLS_CHACHA20_POLY1305_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  18608. #endif
  18609. #ifdef BUILD_TLS_AES_128_CCM_SHA256
  18610. SUITE_INFO("TLS13-AES128-CCM-SHA256","TLS_AES_128_CCM_SHA256",TLS13_BYTE,TLS_AES_128_CCM_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR),
  18611. #endif
  18612. #ifdef BUILD_TLS_AES_128_CCM_8_SHA256
  18613. 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),
  18614. SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
  18615. #endif
  18616. #ifdef BUILD_TLS_SHA256_SHA256
  18617. SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
  18618. #endif
  18619. #ifdef BUILD_TLS_SHA384_SHA384
  18620. SUITE_INFO("TLS13-SHA384-SHA384","TLS_SHA384_SHA384",ECC_BYTE,TLS_SHA384_SHA384,TLSv1_3_MINOR, SSLv3_MAJOR),
  18621. #endif
  18622. #ifndef WOLFSSL_NO_TLS12
  18623. #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
  18624. SUITE_INFO("RC4-SHA","SSL_RSA_WITH_RC4_128_SHA",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  18625. #endif
  18626. #ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
  18627. SUITE_INFO("RC4-MD5","SSL_RSA_WITH_RC4_128_MD5",CIPHER_BYTE,SSL_RSA_WITH_RC4_128_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  18628. #endif
  18629. #ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
  18630. 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),
  18631. #endif
  18632. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
  18633. SUITE_INFO("AES128-SHA","TLS_RSA_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  18634. #endif
  18635. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
  18636. SUITE_INFO("AES256-SHA","TLS_RSA_WITH_AES_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_AES_256_CBC_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  18637. #endif
  18638. #ifdef BUILD_TLS_RSA_WITH_NULL_MD5
  18639. SUITE_INFO("NULL-MD5","TLS_RSA_WITH_NULL_MD5",CIPHER_BYTE,TLS_RSA_WITH_NULL_MD5,SSLv3_MINOR,SSLv3_MAJOR),
  18640. #endif
  18641. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA
  18642. SUITE_INFO("NULL-SHA","TLS_RSA_WITH_NULL_SHA",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA,SSLv3_MINOR,SSLv3_MAJOR),
  18643. #endif
  18644. #ifdef BUILD_TLS_RSA_WITH_NULL_SHA256
  18645. SUITE_INFO("NULL-SHA256","TLS_RSA_WITH_NULL_SHA256",CIPHER_BYTE,TLS_RSA_WITH_NULL_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  18646. #endif
  18647. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  18648. 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),
  18649. #endif
  18650. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  18651. 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),
  18652. #endif
  18653. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384
  18654. 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),
  18655. #endif
  18656. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
  18657. 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),
  18658. #endif
  18659. #ifdef BUILD_TLS_PSK_WITH_AES_256_GCM_SHA384
  18660. 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),
  18661. #endif
  18662. #ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
  18663. 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),
  18664. #endif
  18665. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384
  18666. 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),
  18667. #endif
  18668. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
  18669. 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),
  18670. #endif
  18671. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA384
  18672. 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),
  18673. #endif
  18674. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
  18675. 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),
  18676. #endif
  18677. #ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
  18678. 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),
  18679. #endif
  18680. #ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
  18681. 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),
  18682. #endif
  18683. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
  18684. 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),
  18685. #endif
  18686. #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_CCM
  18687. 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),
  18688. #endif
  18689. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
  18690. SUITE_INFO("PSK-AES128-CCM","TLS_PSK_WITH_AES_128_CCM",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  18691. #endif
  18692. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM
  18693. SUITE_INFO("PSK-AES256-CCM","TLS_PSK_WITH_AES_256_CCM",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM,TLSv1_MINOR,SSLv3_MAJOR),
  18694. #endif
  18695. #ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
  18696. 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),
  18697. SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  18698. #endif
  18699. #ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
  18700. 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),
  18701. SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
  18702. #endif
  18703. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA384
  18704. SUITE_INFO("DHE-PSK-NULL-SHA384","TLS_DHE_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  18705. #endif
  18706. #ifdef BUILD_TLS_DHE_PSK_WITH_NULL_SHA256
  18707. SUITE_INFO("DHE-PSK-NULL-SHA256","TLS_DHE_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_DHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  18708. #endif
  18709. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA384
  18710. SUITE_INFO("PSK-NULL-SHA384","TLS_PSK_WITH_NULL_SHA384",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA384,TLSv1_MINOR,SSLv3_MAJOR),
  18711. #endif
  18712. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA256
  18713. SUITE_INFO("PSK-NULL-SHA256","TLS_PSK_WITH_NULL_SHA256",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  18714. #endif
  18715. #ifdef BUILD_TLS_PSK_WITH_NULL_SHA
  18716. SUITE_INFO("PSK-NULL-SHA","TLS_PSK_WITH_NULL_SHA",CIPHER_BYTE,TLS_PSK_WITH_NULL_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  18717. #endif
  18718. #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
  18719. 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),
  18720. SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  18721. #endif
  18722. #ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
  18723. 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),
  18724. SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  18725. #endif
  18726. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
  18727. 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),
  18728. #endif
  18729. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
  18730. 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),
  18731. SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  18732. #endif
  18733. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
  18734. 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),
  18735. SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
  18736. #endif
  18737. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  18738. 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),
  18739. #endif
  18740. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  18741. 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),
  18742. #endif
  18743. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  18744. 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),
  18745. #endif
  18746. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  18747. 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),
  18748. #endif
  18749. #ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
  18750. 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),
  18751. #endif
  18752. #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
  18753. 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),
  18754. #endif
  18755. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
  18756. 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),
  18757. #endif
  18758. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
  18759. 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),
  18760. #endif
  18761. #ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
  18762. SUITE_INFO("AES128-SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_AES_128_CBC_SHA256, TLSv1_MINOR, SSLv3_MAJOR),
  18763. #endif
  18764. #ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA256
  18765. 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),
  18766. #endif
  18767. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  18768. 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),
  18769. #endif
  18770. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  18771. 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),
  18772. #endif
  18773. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
  18774. 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),
  18775. #endif
  18776. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
  18777. 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),
  18778. #endif
  18779. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
  18780. 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),
  18781. #endif
  18782. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
  18783. 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),
  18784. #endif
  18785. #ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
  18786. 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),
  18787. #endif
  18788. #ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
  18789. 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),
  18790. #endif
  18791. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
  18792. 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),
  18793. #endif
  18794. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
  18795. 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),
  18796. #endif
  18797. #ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
  18798. 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),
  18799. #endif
  18800. #ifdef BUILD_TLS_RSA_WITH_AES_256_GCM_SHA384
  18801. 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),
  18802. #endif
  18803. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  18804. 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),
  18805. #endif
  18806. #ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  18807. 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),
  18808. #endif
  18809. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  18810. 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),
  18811. #endif
  18812. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  18813. 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),
  18814. #endif
  18815. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  18816. 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),
  18817. #endif
  18818. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  18819. 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),
  18820. #endif
  18821. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
  18822. 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),
  18823. #endif
  18824. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
  18825. 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),
  18826. #endif
  18827. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
  18828. 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),
  18829. #endif
  18830. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
  18831. 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),
  18832. #endif
  18833. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
  18834. SUITE_INFO("CAMELLIA128-SHA","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  18835. #endif
  18836. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
  18837. 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),
  18838. #endif
  18839. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
  18840. SUITE_INFO("CAMELLIA256-SHA","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLSv1_MINOR,SSLv3_MAJOR),
  18841. #endif
  18842. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
  18843. 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),
  18844. #endif
  18845. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256
  18846. SUITE_INFO("CAMELLIA128-SHA256","TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  18847. #endif
  18848. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256
  18849. 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),
  18850. #endif
  18851. #ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256
  18852. SUITE_INFO("CAMELLIA256-SHA256","TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",CIPHER_BYTE,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  18853. #endif
  18854. #ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256
  18855. 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),
  18856. #endif
  18857. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  18858. 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),
  18859. #endif
  18860. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  18861. 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),
  18862. #endif
  18863. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
  18864. 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),
  18865. #endif
  18866. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
  18867. 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),
  18868. #endif
  18869. #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  18870. 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),
  18871. #endif
  18872. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  18873. 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),
  18874. #endif
  18875. #ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
  18876. 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),
  18877. #endif
  18878. #ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
  18879. 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),
  18880. #endif
  18881. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  18882. 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),
  18883. #endif
  18884. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  18885. 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),
  18886. #endif
  18887. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  18888. 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),
  18889. #endif
  18890. #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  18891. 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),
  18892. #endif
  18893. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  18894. 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),
  18895. #endif
  18896. #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256
  18897. 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),
  18898. #endif
  18899. #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
  18900. 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),
  18901. #endif
  18902. #ifdef BUILD_TLS_DH_anon_WITH_AES_256_GCM_SHA384
  18903. 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),
  18904. #endif
  18905. #ifdef HAVE_RENEGOTIATION_INDICATION
  18906. SUITE_INFO("RENEGOTIATION-INFO","TLS_EMPTY_RENEGOTIATION_INFO_SCSV",CIPHER_BYTE,TLS_EMPTY_RENEGOTIATION_INFO_SCSV,SSLv3_MINOR,SSLv3_MAJOR),
  18907. #endif
  18908. #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
  18909. SUITE_INFO("ECDHE-ECDSA-NULL-SHA","TLS_ECDHE_ECDSA_WITH_NULL_SHA",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_NULL_SHA, TLSv1_MINOR, SSLv3_MAJOR),
  18910. #endif
  18911. #ifdef BUILD_TLS_ECDHE_PSK_WITH_NULL_SHA256
  18912. SUITE_INFO("ECDHE-PSK-NULL-SHA256","TLS_ECDHE_PSK_WITH_NULL_SHA256",ECC_BYTE,TLS_ECDHE_PSK_WITH_NULL_SHA256,TLSv1_MINOR,SSLv3_MAJOR),
  18913. #endif
  18914. #ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
  18915. 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),
  18916. #endif
  18917. #ifdef BUILD_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256
  18918. SUITE_INFO("PSK-CHACHA20-POLY1305","TLS_PSK_WITH_CHACHA20_POLY1305_SHA256",CHACHA_BYTE,TLS_PSK_WITH_CHACHA20_POLY1305_SHA256,TLSv1_2_MINOR,SSLv3_MAJOR),
  18919. #endif
  18920. #ifdef BUILD_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  18921. 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),
  18922. #endif
  18923. #ifdef BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256
  18924. 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),
  18925. #endif
  18926. #ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  18927. 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),
  18928. #endif
  18929. #ifdef BUILD_WDM_WITH_NULL_SHA256
  18930. SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR)
  18931. #endif
  18932. #endif /* WOLFSSL_NO_TLS12 */
  18933. };
  18934. /* returns the cipher_names array */
  18935. const CipherSuiteInfo* GetCipherNames(void)
  18936. {
  18937. return cipher_names;
  18938. }
  18939. /* returns the number of elements in the cipher_names array */
  18940. int GetCipherNamesSize(void)
  18941. {
  18942. return (int)(sizeof(cipher_names) / sizeof(CipherSuiteInfo));
  18943. }
  18944. const char* GetCipherNameInternal(const byte cipherSuite0, const byte cipherSuite)
  18945. {
  18946. int i;
  18947. const char* nameInternal = "None";
  18948. for (i = 0; i < GetCipherNamesSize(); i++) {
  18949. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  18950. (cipher_names[i].cipherSuite == cipherSuite)
  18951. #ifndef NO_CIPHER_SUITE_ALIASES
  18952. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  18953. #endif
  18954. ) {
  18955. nameInternal = cipher_names[i].name;
  18956. break;
  18957. }
  18958. }
  18959. return nameInternal;
  18960. }
  18961. #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
  18962. /* Segment cipher name into n[n0,n1,n2,n4]
  18963. * @param cipher a pointer to WOLFSSL_CIPHER
  18964. * @param n return segment cipher name
  18965. * return cipher name if cipher is in the list,
  18966. * otherwise NULL
  18967. */
  18968. const char* GetCipherSegment(const WOLFSSL_CIPHER* cipher, char n[][MAX_SEGMENT_SZ])
  18969. {
  18970. int i,j,k;
  18971. int strLen;
  18972. unsigned long offset;
  18973. const char* name;
  18974. /* sanity check */
  18975. if (cipher == NULL || n == NULL)
  18976. return NULL;
  18977. offset = cipher->offset;
  18978. if (offset >= (unsigned long)GetCipherNamesSize())
  18979. return NULL;
  18980. name = cipher_names[offset].name;
  18981. if (name == NULL)
  18982. return NULL;
  18983. /* Segment cipher name into n[n0,n1,n2,n4]
  18984. * These are used later for comparisons to create:
  18985. * keaStr, authStr, encStr, macStr
  18986. *
  18987. * If cipher_name = ECDHE-ECDSA-AES256-SHA
  18988. * then n0 = "ECDHE", n1 = "ECDSA", n2 = "AES256", n3 = "SHA"
  18989. * and n = [n0,n1,n2,n3,0]
  18990. */
  18991. strLen = (int)XSTRLEN(name);
  18992. for (i = 0, j = 0, k = 0; i <= strLen; i++) {
  18993. if (k >= MAX_SEGMENTS || j >= MAX_SEGMENT_SZ)
  18994. break;
  18995. if (name[i] != '-' && name[i] != '\0') {
  18996. n[k][j] = name[i]; /* Fill kth segment string until '-' */
  18997. j++;
  18998. }
  18999. else {
  19000. n[k][j] = '\0';
  19001. j = 0;
  19002. k++;
  19003. }
  19004. }
  19005. return name;
  19006. }
  19007. const char* GetCipherKeaStr(char n[][MAX_SEGMENT_SZ]) {
  19008. const char* keaStr = NULL;
  19009. if (XSTRCMP(n[0],"ECDHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  19010. keaStr = "ECDHEPSK";
  19011. else if ((XSTRCMP(n[0],"ECDH") == 0) || (XSTRCMP(n[0],"ECDHE") == 0))
  19012. keaStr = "ECDH";
  19013. else if (XSTRCMP(n[0],"DHE") == 0 && XSTRCMP(n[1],"PSK") == 0)
  19014. keaStr = "DHEPSK";
  19015. else if (XSTRCMP(n[0],"DHE") == 0)
  19016. keaStr = "DH";
  19017. else if (XSTRCMP(n[0],"RSA") == 0 && XSTRCMP(n[1],"PSK") == 0)
  19018. keaStr = "RSAPSK";
  19019. else if (XSTRCMP(n[0],"SRP") == 0)
  19020. keaStr = "SRP";
  19021. else if (XSTRCMP(n[0],"PSK") == 0)
  19022. keaStr = "PSK";
  19023. else if (XSTRCMP(n[0],"EDH") == 0)
  19024. keaStr = "EDH";
  19025. else if ((XSTRCMP(n[1],"SHA") == 0) || (XSTRCMP(n[2],"SHA") == 0) ||
  19026. (XSTRCMP(n[3],"SHA") == 0) || (XSTRCMP(n[4],"SHA") == 0) ||
  19027. (XSTRCMP(n[2],"RSA") == 0) || (XSTRCMP(n[0],"AES128") == 0) ||
  19028. (XSTRCMP(n[0],"AES256") == 0) || (XSTRCMP(n[1],"MD5") == 0))
  19029. keaStr = "RSA";
  19030. else
  19031. keaStr = "unknown";
  19032. return keaStr;
  19033. }
  19034. const char* GetCipherAuthStr(char n[][MAX_SEGMENT_SZ]) {
  19035. const char* authStr = NULL;
  19036. if ((XSTRCMP(n[0],"AES128") == 0) || (XSTRCMP(n[0],"AES256") == 0) ||
  19037. ((XSTRCMP(n[0],"TLS13") == 0) && ((XSTRCMP(n[1],"AES128") == 0) ||
  19038. (XSTRCMP(n[1],"AES256") == 0) || (XSTRCMP(n[1],"CHACHA20") == 0))) ||
  19039. (XSTRCMP(n[0],"RSA") == 0) || (XSTRCMP(n[1],"RSA") == 0) ||
  19040. (XSTRCMP(n[1],"SHA") == 0) || (XSTRCMP(n[2],"SHA") == 0) ||
  19041. (XSTRCMP(n[1],"MD5") == 0))
  19042. authStr = "RSA";
  19043. else if (XSTRCMP(n[0],"PSK") == 0 || XSTRCMP(n[1],"PSK") == 0)
  19044. authStr = "PSK";
  19045. else if (XSTRCMP(n[0],"SRP") == 0 && XSTRCMP(n[1],"AES") == 0)
  19046. authStr = "SRP";
  19047. else if (XSTRCMP(n[1],"ECDSA") == 0)
  19048. authStr = "ECDSA";
  19049. else if (XSTRCMP(n[0],"ADH") == 0)
  19050. authStr = "None";
  19051. else
  19052. authStr = "unknown";
  19053. return authStr;
  19054. }
  19055. const char* GetCipherEncStr(char n[][MAX_SEGMENT_SZ]) {
  19056. const char* encStr = NULL;
  19057. if ((XSTRCMP(n[0],"AES256") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  19058. (XSTRCMP(n[1],"AES256") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  19059. (XSTRCMP(n[2],"AES256") == 0 && XSTRCMP(n[3],"GCM") == 0))
  19060. encStr = "AESGCM(256)";
  19061. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"GCM") == 0) ||
  19062. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"GCM") == 0) ||
  19063. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"GCM") == 0))
  19064. encStr = "AESGCM(128)";
  19065. else if ((XSTRCMP(n[0],"AES128") == 0 && XSTRCMP(n[1],"CCM") == 0) ||
  19066. (XSTRCMP(n[1],"AES128") == 0 && XSTRCMP(n[2],"CCM") == 0) ||
  19067. (XSTRCMP(n[2],"AES128") == 0 && XSTRCMP(n[3],"CCM") == 0))
  19068. encStr = "AESCCM(128)";
  19069. else if ((XSTRCMP(n[0],"AES128") == 0) ||
  19070. (XSTRCMP(n[1],"AES128") == 0) ||
  19071. (XSTRCMP(n[2],"AES128") == 0) ||
  19072. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"128") == 0) ||
  19073. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"128") == 0))
  19074. encStr = "AES(128)";
  19075. else if ((XSTRCMP(n[0],"AES256") == 0) ||
  19076. (XSTRCMP(n[1],"AES256") == 0) ||
  19077. (XSTRCMP(n[2],"AES256") == 0) ||
  19078. (XSTRCMP(n[1],"AES") == 0 && XSTRCMP(n[2],"256") == 0) ||
  19079. (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"256") == 0))
  19080. encStr = "AES(256)";
  19081. else if ((XSTRCMP(n[0],"CAMELLIA256") == 0) ||
  19082. (XSTRCMP(n[2],"CAMELLIA256") == 0))
  19083. encStr = "CAMELLIA(256)";
  19084. else if ((XSTRCMP(n[0],"CAMELLIA128") == 0) ||
  19085. (XSTRCMP(n[2],"CAMELLIA128") == 0))
  19086. encStr = "CAMELLIA(128)";
  19087. else if ((XSTRCMP(n[0],"RC4") == 0) || (XSTRCMP(n[1],"RC4") == 0) ||
  19088. (XSTRCMP(n[2],"RC4") == 0))
  19089. encStr = "RC4";
  19090. else if (((XSTRCMP(n[0],"DES") == 0) || (XSTRCMP(n[1],"DES") == 0) ||
  19091. (XSTRCMP(n[2],"DES") == 0)) &&
  19092. ((XSTRCMP(n[1],"CBC3") == 0) || (XSTRCMP(n[2],"CBC3") == 0) ||
  19093. (XSTRCMP(n[3],"CBC3") == 0)))
  19094. encStr = "3DES";
  19095. else if ((XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  19096. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  19097. encStr = "CHACHA20/POLY1305(256)";
  19098. else if ((XSTRCMP(n[0],"NULL") == 0) || (XSTRCMP(n[1],"NULL") == 0) ||
  19099. (XSTRCMP(n[2],"NULL") == 0) ||
  19100. ((XSTRCMP(n[0],"TLS13") == 0) && (XSTRCMP(n[3],"") == 0)))
  19101. encStr = "None";
  19102. else
  19103. encStr = "unknown";
  19104. return encStr;
  19105. }
  19106. /* Check if a cipher is AEAD
  19107. * @param n return segment cipher name
  19108. * return 1 if the cipher is AEAD, otherwise 0
  19109. */
  19110. int IsCipherAEAD(char n[][MAX_SEGMENT_SZ])
  19111. {
  19112. WOLFSSL_ENTER("IsCipherAEAD");
  19113. if (n == NULL) {
  19114. WOLFSSL_MSG("bad function argumet. n is NULL.");
  19115. return 0;
  19116. }
  19117. if ((XSTRCMP(n[2],"GCM") == 0) || (XSTRCMP(n[3],"GCM") == 0) ||
  19118. (XSTRCMP(n[1],"CCM") == 0) ||
  19119. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  19120. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  19121. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  19122. return 1;
  19123. return 0;
  19124. }
  19125. /* Returns the MAC string of a cipher or "unknown" on failure */
  19126. const char* GetCipherMacStr(char n[][MAX_SEGMENT_SZ]) {
  19127. const char* macStr = NULL;
  19128. if ((XSTRCMP(n[4],"SHA256") == 0) || (XSTRCMP(n[3],"SHA256") == 0) ||
  19129. (XSTRCMP(n[2],"SHA256") == 0) || (XSTRCMP(n[1],"SHA256") == 0))
  19130. macStr = "SHA256";
  19131. else if ((XSTRCMP(n[4],"SHA384") == 0) ||
  19132. (XSTRCMP(n[3],"SHA384") == 0) ||
  19133. (XSTRCMP(n[2],"SHA384") == 0) ||
  19134. (XSTRCMP(n[1],"SHA384") == 0))
  19135. macStr = "SHA384";
  19136. else if ((XSTRCMP(n[4],"SHA") == 0) || (XSTRCMP(n[3],"SHA") == 0) ||
  19137. (XSTRCMP(n[2],"SHA") == 0) || (XSTRCMP(n[1],"SHA") == 0) ||
  19138. (XSTRCMP(n[1],"MD5") == 0))
  19139. macStr = "SHA1";
  19140. else if ((XSTRCMP(n[3],"GCM") == 0) ||
  19141. (XSTRCMP(n[1],"CCM") == 0) ||
  19142. (XSTRCMP(n[2],"CCM") == 0) || (XSTRCMP(n[3],"CCM") == 0) ||
  19143. (XSTRCMP(n[1],"CHACHA20") == 0 && XSTRCMP(n[2],"POLY1305") == 0) ||
  19144. (XSTRCMP(n[2],"CHACHA20") == 0 && XSTRCMP(n[3],"POLY1305") == 0))
  19145. macStr = "AEAD";
  19146. else
  19147. macStr = "unknown";
  19148. return macStr;
  19149. }
  19150. /* Returns the number of bits based on the cipher enc string, or 0 on failure */
  19151. int SetCipherBits(const char* enc) {
  19152. int ret = WOLFSSL_FAILURE;
  19153. if ((XSTRCMP(enc,"AESGCM(256)") == 0) ||
  19154. (XSTRCMP(enc,"AES(256)") == 0) ||
  19155. (XSTRCMP(enc,"CAMELLIA(256)") == 0) ||
  19156. (XSTRCMP(enc,"CHACHA20/POLY1305(256)") == 0))
  19157. ret = 256;
  19158. else if
  19159. ((XSTRCMP(enc,"3DES") == 0))
  19160. ret = 168;
  19161. else if
  19162. ((XSTRCMP(enc,"AESGCM(128)") == 0) ||
  19163. (XSTRCMP(enc,"AES(128)") == 0) ||
  19164. (XSTRCMP(enc,"CAMELLIA(128)") == 0) ||
  19165. (XSTRCMP(enc,"RC4") == 0))
  19166. ret = 128;
  19167. else if
  19168. ((XSTRCMP(enc,"DES") == 0))
  19169. ret = 56;
  19170. return ret;
  19171. }
  19172. #endif /* WOLFSSL_QT || OPENSSL_ALL */
  19173. const char* GetCipherNameIana(const byte cipherSuite0, const byte cipherSuite)
  19174. {
  19175. #ifndef NO_ERROR_STRINGS
  19176. int i;
  19177. const char* nameIana = "NONE";
  19178. for (i = 0; i < GetCipherNamesSize(); i++) {
  19179. if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
  19180. (cipher_names[i].cipherSuite == cipherSuite)
  19181. #ifndef NO_CIPHER_SUITE_ALIASES
  19182. && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
  19183. #endif
  19184. ) {
  19185. nameIana = cipher_names[i].name_iana;
  19186. break;
  19187. }
  19188. }
  19189. return nameIana;
  19190. #else
  19191. (void)cipherSuite0;
  19192. (void)cipherSuite;
  19193. return NULL;
  19194. #endif
  19195. }
  19196. const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl)
  19197. {
  19198. if (ssl == NULL) {
  19199. return NULL;
  19200. }
  19201. return GetCipherNameInternal(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  19202. }
  19203. const char* wolfSSL_get_cipher_name_iana(WOLFSSL* ssl)
  19204. {
  19205. if (ssl == NULL) {
  19206. return NULL;
  19207. }
  19208. return GetCipherNameIana(ssl->options.cipherSuite0, ssl->options.cipherSuite);
  19209. }
  19210. int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
  19211. byte* cipherSuite, int* flags)
  19212. {
  19213. int ret = BAD_FUNC_ARG;
  19214. int i;
  19215. unsigned long len;
  19216. const char* nameDelim;
  19217. /* Support trailing : */
  19218. nameDelim = XSTRSTR(name, ":");
  19219. if (nameDelim)
  19220. len = (unsigned long)(nameDelim - name);
  19221. else
  19222. len = (unsigned long)XSTRLEN(name);
  19223. for (i = 0; i < GetCipherNamesSize(); i++) {
  19224. if ((XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
  19225. (cipher_names[i].name[len] == 0)) {
  19226. *cipherSuite0 = cipher_names[i].cipherSuite0;
  19227. *cipherSuite = cipher_names[i].cipherSuite;
  19228. *flags = cipher_names[i].flags;
  19229. ret = 0;
  19230. break;
  19231. }
  19232. }
  19233. return ret;
  19234. }
  19235. /**
  19236. Set the enabled cipher suites.
  19237. @param [out] suites Suites structure.
  19238. @param [in] list List of cipher suites, only supports full name from
  19239. cipher_names[] delimited by ':'.
  19240. @return true on success, else false.
  19241. */
  19242. int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list)
  19243. {
  19244. int ret = 0;
  19245. int idx = 0;
  19246. int haveRSAsig = 0;
  19247. int haveECDSAsig = 0;
  19248. int haveFalconSig = 0;
  19249. int haveAnon = 0;
  19250. const int suiteSz = GetCipherNamesSize();
  19251. const char* next = list;
  19252. if (suites == NULL || list == NULL) {
  19253. WOLFSSL_MSG("SetCipherList parameter error");
  19254. return 0;
  19255. }
  19256. if (next[0] == 0 || XSTRCMP(next, "ALL") == 0 ||
  19257. XSTRCMP(next, "DEFAULT") == 0 || XSTRCMP(next, "HIGH") == 0)
  19258. return 1; /* wolfSSL default */
  19259. do {
  19260. const char* current = next;
  19261. char name[MAX_SUITE_NAME + 1];
  19262. int i;
  19263. word32 length;
  19264. next = XSTRSTR(next, ":");
  19265. length = MAX_SUITE_NAME;
  19266. if (next != NULL) {
  19267. word32 currLen = (word32)(next - current);
  19268. if (length > currLen) {
  19269. length = currLen;
  19270. }
  19271. }
  19272. XSTRNCPY(name, current, length);
  19273. name[(length == sizeof(name)) ? length - 1 : length] = 0;
  19274. for (i = 0; i < suiteSz; i++) {
  19275. if (XSTRNCMP(name, cipher_names[i].name, sizeof(name)) == 0
  19276. #ifndef NO_ERROR_STRINGS
  19277. || XSTRNCMP(name, cipher_names[i].name_iana, sizeof(name)) == 0
  19278. #endif
  19279. ) {
  19280. #ifdef WOLFSSL_DTLS
  19281. /* don't allow stream ciphers with DTLS */
  19282. if (ctx->method->version.major == DTLS_MAJOR) {
  19283. if (XSTRSTR(name, "RC4"))
  19284. {
  19285. WOLFSSL_MSG("Stream ciphers not supported with DTLS");
  19286. continue;
  19287. }
  19288. }
  19289. #endif /* WOLFSSL_DTLS */
  19290. if (idx + 1 >= WOLFSSL_MAX_SUITE_SZ) {
  19291. WOLFSSL_MSG("WOLFSSL_MAX_SUITE_SZ set too low");
  19292. return 0; /* suites buffer not large enough, error out */
  19293. }
  19294. suites->suites[idx++] = cipher_names[i].cipherSuite0;
  19295. suites->suites[idx++] = cipher_names[i].cipherSuite;
  19296. /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA
  19297. * suites don't necessarily have RSA in the name. */
  19298. #ifdef WOLFSSL_TLS13
  19299. if (cipher_names[i].cipherSuite0 == TLS13_BYTE ||
  19300. (cipher_names[i].cipherSuite0 == ECC_BYTE &&
  19301. (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 ||
  19302. cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) {
  19303. #ifndef NO_RSA
  19304. haveRSAsig = 1;
  19305. #endif
  19306. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  19307. defined(HAVE_ED448)
  19308. haveECDSAsig = 1;
  19309. #endif
  19310. #if defined(HAVE_PQC)
  19311. haveFalconSig = 1;
  19312. #endif
  19313. }
  19314. else
  19315. #endif
  19316. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  19317. defined(HAVE_ED448)
  19318. if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA"))
  19319. haveECDSAsig = 1;
  19320. else
  19321. #endif
  19322. #ifdef HAVE_ANON
  19323. if (XSTRSTR(name, "ADH"))
  19324. haveAnon = 1;
  19325. else
  19326. #endif
  19327. if (haveRSAsig == 0
  19328. #ifndef NO_PSK
  19329. && (XSTRSTR(name, "PSK") == NULL)
  19330. #endif
  19331. ) {
  19332. haveRSAsig = 1;
  19333. }
  19334. ret = 1; /* found at least one */
  19335. break;
  19336. }
  19337. }
  19338. }
  19339. while (next++); /* ++ needed to skip ':' */
  19340. if (ret) {
  19341. int keySz = 0;
  19342. #ifndef NO_CERTS
  19343. keySz = ctx->privateKeySz;
  19344. #endif
  19345. suites->setSuites = 1;
  19346. suites->suiteSz = (word16)idx;
  19347. InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig, haveFalconSig,
  19348. haveAnon, 1, keySz);
  19349. }
  19350. (void)ctx;
  19351. return ret;
  19352. }
  19353. #ifdef OPENSSL_EXTRA
  19354. struct mac_algs {
  19355. byte alg;
  19356. const char* name;
  19357. } mac_names[] = {
  19358. #ifndef NO_SHA256
  19359. { sha256_mac, "SHA256" },
  19360. #endif
  19361. #ifdef WOLFSSL_SHA384
  19362. { sha384_mac, "SHA384" },
  19363. #endif
  19364. #ifdef WOLFSSL_SHA512
  19365. { sha512_mac, "SHA512" },
  19366. #endif
  19367. #ifdef WOLFSSL_SHA224
  19368. { sha224_mac, "SHA224" },
  19369. #endif
  19370. #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \
  19371. defined(WOLFSSL_ALLOW_TLS_SHA1))
  19372. { sha_mac, "SHA1" },
  19373. #endif
  19374. };
  19375. #define MAC_NAMES_SZ (int)(sizeof(mac_names)/sizeof(*mac_names))
  19376. /* Convert the hash algorithm string to a TLS MAC algorithm num. */
  19377. static byte GetMacAlgFromName(const char* name, int len)
  19378. {
  19379. byte alg = no_mac;
  19380. int i;
  19381. for (i = 0; i < MAC_NAMES_SZ; i++) {
  19382. if (((int)XSTRLEN(mac_names[i].name) == len) &&
  19383. (XMEMCMP(mac_names[i].name, name, len) == 0)) {
  19384. alg = mac_names[i].alg;
  19385. break;
  19386. }
  19387. }
  19388. return alg;
  19389. }
  19390. struct sig_algs {
  19391. byte alg;
  19392. const char* name;
  19393. } sig_names[] = {
  19394. #ifndef NO_RSA
  19395. { rsa_sa_algo, "RSA" },
  19396. #ifdef WC_RSA_PSS
  19397. { rsa_pss_sa_algo, "RSA-PSS" },
  19398. { rsa_pss_sa_algo, "PSS" },
  19399. #endif
  19400. #endif
  19401. #ifdef HAVE_ECC
  19402. { ecc_dsa_sa_algo, "ECDSA" },
  19403. #endif
  19404. #ifdef HAVE_ED25519
  19405. { ed25519_sa_algo, "ED25519" },
  19406. #endif
  19407. #ifdef HAVE_ED448
  19408. { ed448_sa_algo, "ED448" },
  19409. #endif
  19410. #ifndef NO_DSA
  19411. { dsa_sa_algo, "DSA" },
  19412. #endif
  19413. };
  19414. #define SIG_NAMES_SZ (int)(sizeof(sig_names)/sizeof(*sig_names))
  19415. /* Convert the signature algorithm string to a TLS signature algorithm num. */
  19416. static byte GetSigAlgFromName(const char* name, int len)
  19417. {
  19418. byte alg = anonymous_sa_algo;
  19419. int i;
  19420. for (i = 0; i < SIG_NAMES_SZ; i++) {
  19421. if (((int)XSTRLEN(sig_names[i].name) == len) &&
  19422. (XMEMCMP(sig_names[i].name, name, len) == 0)) {
  19423. alg = sig_names[i].alg;
  19424. break;
  19425. }
  19426. }
  19427. return alg;
  19428. }
  19429. /* Set the hash/signature algorithms that are supported for certificate signing.
  19430. *
  19431. * suites [in,out] Cipher suites and signature algorithms.
  19432. * list [in] String representing hash/signature algorithms to set.
  19433. * returns 0 on failure.
  19434. * 1 on success.
  19435. */
  19436. int SetSuitesHashSigAlgo(Suites* suites, const char* list)
  19437. {
  19438. int ret = 1;
  19439. word16 idx = 0;
  19440. const char* s = list;
  19441. byte sig_alg = 0;
  19442. byte mac_alg = no_mac;
  19443. /* Setting is destructive on error. */
  19444. suites->hashSigAlgoSz = 0;
  19445. do {
  19446. if (*list == '+') {
  19447. if (mac_alg != 0) {
  19448. ret = 0;
  19449. break;
  19450. }
  19451. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  19452. if (sig_alg == 0) {
  19453. ret = 0;
  19454. break;
  19455. }
  19456. s = list + 1;
  19457. }
  19458. else if (*list == ':' || *list == '\0') {
  19459. if (sig_alg == 0) {
  19460. /* No signature algorithm set yet.
  19461. * Ed25519 and Ed448 have implied MAC algorithm.
  19462. */
  19463. sig_alg = GetSigAlgFromName(s, (int)(list - s));
  19464. if (sig_alg != ed25519_sa_algo && sig_alg != ed448_sa_algo) {
  19465. ret = 0;
  19466. break;
  19467. }
  19468. }
  19469. else {
  19470. mac_alg = GetMacAlgFromName(s, (int)(list - s));
  19471. if (mac_alg == 0) {
  19472. ret = 0;
  19473. break;
  19474. }
  19475. }
  19476. AddSuiteHashSigAlgo(suites, mac_alg, sig_alg, 0, &idx);
  19477. sig_alg = 0;
  19478. mac_alg = no_mac;
  19479. s = list + 1;
  19480. }
  19481. list++;
  19482. }
  19483. while (*(list-1) != '\0');
  19484. if (s != list && (sig_alg != 0 || mac_alg != 0)) {
  19485. ret = 0;
  19486. }
  19487. else {
  19488. suites->hashSigAlgoSz = idx;
  19489. }
  19490. return ret;
  19491. }
  19492. #endif /* OPENSSL_EXTRA */
  19493. #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
  19494. static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
  19495. {
  19496. #ifdef HAVE_ED25519
  19497. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  19498. /* Certificate has Ed25519 key, only match with Ed25519 sig alg */
  19499. return sigAlgo == ed25519_sa_algo;
  19500. }
  19501. #endif
  19502. #ifdef HAVE_ED448
  19503. if (ssl->pkCurveOID == ECC_ED448_OID) {
  19504. /* Certificate has Ed448 key, only match with Ed448 sig alg */
  19505. return sigAlgo == ed448_sa_algo;
  19506. }
  19507. #endif
  19508. #ifdef HAVE_PQC
  19509. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1) {
  19510. /* Certificate has Falcon level 1 key, only match with Falcon level 1
  19511. * sig alg */
  19512. return sigAlgo == falcon_level1_sa_algo;
  19513. }
  19514. if (ssl->pkCurveOID == CTC_FALCON_LEVEL5) {
  19515. /* Certificate has Falcon level 5 key, only match with Falcon level 5
  19516. * sig alg */
  19517. return sigAlgo == falcon_level5_sa_algo;
  19518. }
  19519. #endif
  19520. #ifdef WC_RSA_PSS
  19521. /* RSA certificate and PSS sig alg. */
  19522. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  19523. #if defined(WOLFSSL_TLS13)
  19524. /* TLS 1.3 only supports RSA-PSS. */
  19525. if (IsAtLeastTLSv1_3(ssl->version))
  19526. return sigAlgo == rsa_pss_sa_algo;
  19527. #endif
  19528. /* TLS 1.2 and below - RSA-PSS allowed. */
  19529. if (sigAlgo == rsa_pss_sa_algo)
  19530. return 1;
  19531. }
  19532. #endif
  19533. /* Signature algorithm matches certificate. */
  19534. return sigAlgo == ssl->suites->sigAlgo;
  19535. }
  19536. #if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
  19537. defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  19538. static int CmpEccStrength(int hashAlgo, int curveSz)
  19539. {
  19540. int dgstSz = GetMacDigestSize((byte)hashAlgo);
  19541. if (dgstSz <= 0)
  19542. return -1;
  19543. return dgstSz - (curveSz & (~0x3));
  19544. }
  19545. #endif
  19546. static byte MinHashAlgo(WOLFSSL* ssl)
  19547. {
  19548. #ifdef WOLFSSL_TLS13
  19549. if (IsAtLeastTLSv1_3(ssl->version)) {
  19550. return sha256_mac;
  19551. }
  19552. #endif
  19553. #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
  19554. if (IsAtLeastTLSv1_2(ssl)) {
  19555. return sha256_mac;
  19556. }
  19557. #endif /* WOLFSSL_NO_TLS12 */
  19558. (void)ssl;
  19559. return sha_mac;
  19560. }
  19561. int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
  19562. {
  19563. word32 i;
  19564. int ret = MATCH_SUITE_ERROR;
  19565. byte minHash;
  19566. /* set defaults */
  19567. if (IsAtLeastTLSv1_3(ssl->version)) {
  19568. #ifndef NO_CERTS
  19569. /* TLS 1.3 cipher suites don't have public key algorithms in them.
  19570. * Using the one in the certificate - if any.
  19571. */
  19572. ssl->suites->sigAlgo = ssl->buffers.keyType;
  19573. #endif
  19574. }
  19575. else {
  19576. ssl->suites->sigAlgo = ssl->specs.sig_algo;
  19577. }
  19578. if (ssl->suites->sigAlgo == anonymous_sa_algo) {
  19579. /* PSK ciphersuite - get digest to use from cipher suite */
  19580. ssl->suites->hashAlgo = ssl->specs.mac_algorithm;
  19581. return 0;
  19582. }
  19583. ssl->suites->hashAlgo = minHash = MinHashAlgo(ssl);
  19584. /* No list means go with the defaults. */
  19585. if (hashSigAlgoSz == 0)
  19586. return 0;
  19587. /* i+1 since two bytes used to describe hash and signature algorithm */
  19588. for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
  19589. byte hashAlgo = 0, sigAlgo = 0;
  19590. DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
  19591. /* Keep looking if hash algorithm not strong enough. */
  19592. if (hashAlgo < minHash)
  19593. continue;
  19594. /* Keep looking if signature algorithm isn't supported by cert. */
  19595. if (!MatchSigAlgo(ssl, sigAlgo))
  19596. continue;
  19597. #ifdef HAVE_ED25519
  19598. if (ssl->pkCurveOID == ECC_ED25519_OID) {
  19599. /* Matched Ed25519 - set chosen and finished. */
  19600. ssl->suites->sigAlgo = sigAlgo;
  19601. ssl->suites->hashAlgo = hashAlgo;
  19602. ret = 0;
  19603. break;
  19604. }
  19605. #endif
  19606. #ifdef HAVE_ED448
  19607. if (ssl->pkCurveOID == ECC_ED448_OID) {
  19608. /* Matched Ed448 - set chosen and finished. */
  19609. ssl->suites->sigAlgo = sigAlgo;
  19610. ssl->suites->hashAlgo = hashAlgo;
  19611. ret = 0;
  19612. break;
  19613. }
  19614. #endif
  19615. #if defined(HAVE_PQC)
  19616. if (ssl->pkCurveOID == CTC_FALCON_LEVEL1 ||
  19617. ssl->pkCurveOID == CTC_FALCON_LEVEL5 ) {
  19618. /* Matched Falcon - set chosen and finished. */
  19619. ssl->suites->sigAlgo = sigAlgo;
  19620. ssl->suites->hashAlgo = hashAlgo;
  19621. ret = 0;
  19622. break;
  19623. }
  19624. #endif
  19625. #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  19626. #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
  19627. "be used together"
  19628. #endif
  19629. #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
  19630. defined(WOLFSSL_ECDSA_MATCH_HASH))
  19631. if (sigAlgo == ecc_dsa_sa_algo
  19632. #ifndef WOLFSSL_ECDSA_MATCH_HASH
  19633. && IsAtLeastTLSv1_3(ssl->version)
  19634. #endif
  19635. ) {
  19636. /* Must be exact match. */
  19637. if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
  19638. continue;
  19639. /* Matched ECDSA exaclty - set chosen and finished. */
  19640. ssl->suites->hashAlgo = hashAlgo;
  19641. ssl->suites->sigAlgo = sigAlgo;
  19642. ret = 0;
  19643. break;
  19644. }
  19645. #endif
  19646. /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
  19647. * algorithm that matches the ephemeral ECDHE key size or the next highest
  19648. * available. This workaround resolves issue with some peer's that do not
  19649. * properly support scenarios such as a P-256 key hashed with SHA512.
  19650. */
  19651. #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
  19652. if (sigAlgo == ecc_dsa_sa_algo) {
  19653. int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
  19654. /* Keep looking if digest not strong enough. */
  19655. if (cmp < 0)
  19656. continue;
  19657. /* Looking for exact match or next highest. */
  19658. if (ret != 0 || hashAlgo <= ssl->suites->hashAlgo) {
  19659. ssl->suites->hashAlgo = hashAlgo;
  19660. ssl->suites->sigAlgo = sigAlgo;
  19661. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  19662. ssl->namedGroup = 0;
  19663. #endif
  19664. ret = 0;
  19665. }
  19666. /* Continue looking if not the same strength. */
  19667. if (cmp > 0)
  19668. continue;
  19669. /* Exact match - finished. */
  19670. break;
  19671. }
  19672. #endif
  19673. switch (hashAlgo) {
  19674. #ifndef NO_SHA
  19675. case sha_mac:
  19676. #endif
  19677. #ifdef WOLFSSL_SHA224
  19678. case sha224_mac:
  19679. #endif
  19680. #ifndef NO_SHA256
  19681. case sha256_mac:
  19682. #endif
  19683. #ifdef WOLFSSL_SHA384
  19684. case sha384_mac:
  19685. #endif
  19686. #ifdef WOLFSSL_SHA512
  19687. case sha512_mac:
  19688. #endif
  19689. #ifdef WOLFSSL_STRONGEST_HASH_SIG
  19690. /* Is hash algorithm weaker than chosen/min? */
  19691. if (hashAlgo < ssl->suites->hashAlgo)
  19692. break;
  19693. #else
  19694. /* Is hash algorithm stonger than last chosen? */
  19695. if (ret == 0 && hashAlgo > ssl->suites->hashAlgo)
  19696. break;
  19697. #endif
  19698. /* The chosen one - but keep looking. */
  19699. ssl->suites->hashAlgo = hashAlgo;
  19700. ssl->suites->sigAlgo = sigAlgo;
  19701. ret = 0;
  19702. break;
  19703. default:
  19704. /* Support for hash algorithm not compiled in. */
  19705. break;
  19706. }
  19707. }
  19708. return ret;
  19709. }
  19710. #endif /* !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) */
  19711. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  19712. /* Initialize HandShakeInfo */
  19713. void InitHandShakeInfo(HandShakeInfo* info, WOLFSSL* ssl)
  19714. {
  19715. int i;
  19716. info->ssl = ssl;
  19717. info->cipherName[0] = 0;
  19718. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  19719. info->packetNames[i][0] = 0;
  19720. info->numberPackets = 0;
  19721. info->negotiationError = 0;
  19722. }
  19723. /* Set Final HandShakeInfo parameters */
  19724. void FinishHandShakeInfo(HandShakeInfo* info)
  19725. {
  19726. int i;
  19727. int sz = GetCipherNamesSize();
  19728. for (i = 0; i < sz; i++) {
  19729. #ifndef NO_CIPHER_SUITE_ALIASES
  19730. if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
  19731. continue;
  19732. #endif
  19733. if (info->ssl->options.cipherSuite ==
  19734. (byte)cipher_names[i].cipherSuite) {
  19735. if (info->ssl->options.cipherSuite0 == ECC_BYTE)
  19736. continue; /* ECC suites at end */
  19737. XSTRNCPY(info->cipherName, cipher_names[i].name, MAX_CIPHERNAME_SZ);
  19738. info->cipherName[MAX_CIPHERNAME_SZ] = '\0';
  19739. break;
  19740. }
  19741. }
  19742. /* error max and min are negative numbers */
  19743. if (info->ssl->error <= MIN_PARAM_ERR && info->ssl->error >= MAX_PARAM_ERR)
  19744. info->negotiationError = info->ssl->error;
  19745. }
  19746. /* Add name to info packet names, increase packet name count */
  19747. void AddPacketName(WOLFSSL* ssl, const char* name)
  19748. {
  19749. #ifdef WOLFSSL_CALLBACKS
  19750. HandShakeInfo* info = &ssl->handShakeInfo;
  19751. if (info->numberPackets < MAX_PACKETS_HANDSHAKE) {
  19752. char* packetName = info->packetNames[info->numberPackets];
  19753. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  19754. packetName[MAX_PACKETNAME_SZ] = '\0';
  19755. info->numberPackets++;
  19756. }
  19757. #endif
  19758. (void)ssl;
  19759. (void)name;
  19760. }
  19761. #ifdef WOLFSSL_CALLBACKS
  19762. /* Initialize TimeoutInfo */
  19763. void InitTimeoutInfo(TimeoutInfo* info)
  19764. {
  19765. int i;
  19766. info->timeoutName[0] = 0;
  19767. info->flags = 0;
  19768. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++) {
  19769. info->packets[i].packetName[0] = 0;
  19770. info->packets[i].timestamp.tv_sec = 0;
  19771. info->packets[i].timestamp.tv_usec = 0;
  19772. info->packets[i].bufferValue = 0;
  19773. info->packets[i].valueSz = 0;
  19774. }
  19775. info->numberPackets = 0;
  19776. info->timeoutValue.tv_sec = 0;
  19777. info->timeoutValue.tv_usec = 0;
  19778. }
  19779. /* Free TimeoutInfo */
  19780. void FreeTimeoutInfo(TimeoutInfo* info, void* heap)
  19781. {
  19782. int i;
  19783. (void)heap;
  19784. for (i = 0; i < MAX_PACKETS_HANDSHAKE; i++)
  19785. if (info->packets[i].bufferValue) {
  19786. XFREE(info->packets[i].bufferValue, heap, DYNAMIC_TYPE_INFO);
  19787. info->packets[i].bufferValue = 0;
  19788. }
  19789. }
  19790. /* Add packet name to previously added packet info */
  19791. void AddLateName(const char* name, TimeoutInfo* info)
  19792. {
  19793. /* make sure we have a valid previous one */
  19794. if (info->numberPackets > 0 && info->numberPackets <
  19795. MAX_PACKETS_HANDSHAKE) {
  19796. char* packetName = info->packets[info->numberPackets-1].packetName;
  19797. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  19798. packetName[MAX_PACKETNAME_SZ] = '\0';
  19799. }
  19800. }
  19801. /* Add record header to previously added packet info */
  19802. void AddLateRecordHeader(const RecordLayerHeader* rl, TimeoutInfo* info)
  19803. {
  19804. /* make sure we have a valid previous one */
  19805. if (info->numberPackets > 0 && info->numberPackets <
  19806. MAX_PACKETS_HANDSHAKE) {
  19807. if (info->packets[info->numberPackets - 1].bufferValue)
  19808. XMEMCPY(info->packets[info->numberPackets - 1].bufferValue, rl,
  19809. RECORD_HEADER_SZ);
  19810. else
  19811. XMEMCPY(info->packets[info->numberPackets - 1].value, rl,
  19812. RECORD_HEADER_SZ);
  19813. }
  19814. }
  19815. #endif /* WOLFSSL_CALLBACKS */
  19816. /* Add PacketInfo to TimeoutInfo
  19817. *
  19818. * ssl WOLFSSL structure sending or receiving packet
  19819. * name name of packet being sent
  19820. * type type of packet being sent
  19821. * data data bing sent with packet
  19822. * sz size of data buffer
  19823. * written 1 if this packet is being written to wire, 0 if being read
  19824. * heap custom heap to use for mallocs/frees
  19825. */
  19826. void AddPacketInfo(WOLFSSL* ssl, const char* name, int type,
  19827. const byte* data, int sz, int written, void* heap)
  19828. {
  19829. #ifdef WOLFSSL_CALLBACKS
  19830. TimeoutInfo* info = &ssl->timeoutInfo;
  19831. if (info->numberPackets < (MAX_PACKETS_HANDSHAKE - 1)) {
  19832. WOLFSSL_TIMEVAL currTime;
  19833. /* may add name after */
  19834. if (name) {
  19835. char* packetName = info->packets[info->numberPackets].packetName;
  19836. XSTRNCPY(packetName, name, MAX_PACKETNAME_SZ);
  19837. packetName[MAX_PACKETNAME_SZ] = '\0';
  19838. }
  19839. /* add data, put in buffer if bigger than static buffer */
  19840. info->packets[info->numberPackets].valueSz = sz;
  19841. if (sz < MAX_VALUE_SZ)
  19842. XMEMCPY(info->packets[info->numberPackets].value, data, sz);
  19843. else {
  19844. info->packets[info->numberPackets].bufferValue =
  19845. (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_INFO);
  19846. if (!info->packets[info->numberPackets].bufferValue)
  19847. /* let next alloc catch, just don't fill, not fatal here */
  19848. info->packets[info->numberPackets].valueSz = 0;
  19849. else
  19850. XMEMCPY(info->packets[info->numberPackets].bufferValue,
  19851. data, sz);
  19852. }
  19853. gettimeofday(&currTime, 0);
  19854. info->packets[info->numberPackets].timestamp.tv_sec =
  19855. currTime.tv_sec;
  19856. info->packets[info->numberPackets].timestamp.tv_usec =
  19857. currTime.tv_usec;
  19858. info->numberPackets++;
  19859. }
  19860. #endif /* WOLFSSL_CALLBACKS */
  19861. #ifdef OPENSSL_EXTRA
  19862. if (ssl->protoMsgCb != NULL && sz > RECORD_HEADER_SZ) {
  19863. /* version from hex to dec 16 is 16^1, 256 from 16^2 and
  19864. 4096 from 16^3 */
  19865. int version = (ssl->version.minor & 0x0F) +
  19866. ((ssl->version.minor & 0xF0) << 4) +
  19867. ((ssl->version.major & 0x0F) << 8) +
  19868. ((ssl->version.major & 0xF0) << 12);
  19869. ssl->protoMsgCb(written, version, type,
  19870. (const void *)(data + RECORD_HEADER_SZ),
  19871. (size_t)(sz - RECORD_HEADER_SZ),
  19872. ssl, ssl->protoMsgCtx);
  19873. }
  19874. #endif /* OPENSSL_EXTRA */
  19875. (void)written;
  19876. (void)name;
  19877. (void)heap;
  19878. (void)type;
  19879. (void)ssl;
  19880. }
  19881. #endif /* WOLFSSL_CALLBACKS */
  19882. #if !defined(NO_CERTS)
  19883. #if defined(WOLF_PRIVATE_KEY_ID) && !defined(NO_CHECK_PRIVATE_KEY)
  19884. /* Create a private key for a device.
  19885. *
  19886. * pkey Key object.
  19887. * data Data to identify key.
  19888. * length Length of data.
  19889. * hsType Type of the key to create.
  19890. * heap Custom heap to use for mallocs/frees
  19891. * devId Id for device.
  19892. * return 0 on success.
  19893. * return NOT_COMPILED_IN if algorithm type not supported.
  19894. * return MEMORY_E on memory allocation failure.
  19895. * return other internal error
  19896. */
  19897. int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
  19898. int label, int id, void* heap, int devId)
  19899. {
  19900. int ret = NOT_COMPILED_IN;
  19901. if (hsType == DYNAMIC_TYPE_RSA) {
  19902. #ifndef NO_RSA
  19903. RsaKey* rsaKey;
  19904. rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
  19905. if (rsaKey == NULL) {
  19906. return MEMORY_E;
  19907. }
  19908. if (label) {
  19909. ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
  19910. }
  19911. else if (id) {
  19912. ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId);
  19913. }
  19914. if (ret == 0) {
  19915. *pkey = (void*)rsaKey;
  19916. }
  19917. else {
  19918. XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
  19919. }
  19920. #endif
  19921. }
  19922. else if (hsType == DYNAMIC_TYPE_ECC) {
  19923. #ifdef HAVE_ECC
  19924. ecc_key* ecKey;
  19925. ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
  19926. if (ecKey == NULL) {
  19927. return MEMORY_E;
  19928. }
  19929. if (label) {
  19930. ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
  19931. }
  19932. else if (id) {
  19933. ret = wc_ecc_init_id(ecKey, data, length, heap, devId);
  19934. }
  19935. if (ret == 0) {
  19936. *pkey = (void*)ecKey;
  19937. }
  19938. else {
  19939. XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
  19940. }
  19941. #endif
  19942. }
  19943. return ret;
  19944. }
  19945. #endif /* WOLF_PRIVATE_KEY_ID && !NO_CHECK_PRIVATE_KEY */
  19946. /* Decode the private key - RSA/ECC/Ed25519/Ed448/Falcon - and creates a key
  19947. * object.
  19948. *
  19949. * The signature type is set as well.
  19950. * The maximum length of a signature is returned.
  19951. *
  19952. * ssl The SSL/TLS object.
  19953. * length The length of a signature.
  19954. * returns 0 on success, otherwise failure.
  19955. */
  19956. int DecodePrivateKey(WOLFSSL *ssl, word16* length)
  19957. {
  19958. int ret = BAD_FUNC_ARG;
  19959. int keySz;
  19960. word32 idx;
  19961. /* make sure private key exists */
  19962. if (ssl->buffers.key == NULL || ssl->buffers.key->buffer == NULL) {
  19963. /* allow no private key if using external */
  19964. #ifdef WOLF_PRIVATE_KEY_ID
  19965. if (ssl->devId != INVALID_DEVID
  19966. #ifdef HAVE_PK_CALLBACKS
  19967. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  19968. #endif
  19969. ) {
  19970. *length = GetPrivateKeySigSize(ssl);
  19971. return 0;
  19972. }
  19973. else
  19974. #endif
  19975. {
  19976. WOLFSSL_MSG("Private key missing!");
  19977. ERROR_OUT(NO_PRIVATE_KEY, exit_dpk);
  19978. }
  19979. }
  19980. #ifdef WOLF_PRIVATE_KEY_ID
  19981. if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
  19982. ssl->buffers.keyLabel)) {
  19983. if (ssl->buffers.keyType == rsa_sa_algo)
  19984. ssl->hsType = DYNAMIC_TYPE_RSA;
  19985. else if (ssl->buffers.keyType == ecc_dsa_sa_algo)
  19986. ssl->hsType = DYNAMIC_TYPE_ECC;
  19987. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  19988. if (ret != 0) {
  19989. goto exit_dpk;
  19990. }
  19991. if (ssl->buffers.keyType == rsa_sa_algo) {
  19992. #ifndef NO_RSA
  19993. if (ssl->buffers.keyLabel) {
  19994. ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
  19995. (char*)ssl->buffers.key->buffer,
  19996. ssl->heap, ssl->buffers.keyDevId);
  19997. }
  19998. else if (ssl->buffers.keyId) {
  19999. ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
  20000. ssl->buffers.key->buffer,
  20001. ssl->buffers.key->length, ssl->heap,
  20002. ssl->buffers.keyDevId);
  20003. }
  20004. if (ret == 0) {
  20005. if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
  20006. WOLFSSL_MSG("RSA key size too small");
  20007. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  20008. }
  20009. /* Return the maximum signature length. */
  20010. *length = (word16)ssl->buffers.keySz;
  20011. }
  20012. #else
  20013. ret = NOT_COMPILED_IN;
  20014. #endif
  20015. }
  20016. else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
  20017. #ifdef HAVE_ECC
  20018. if (ssl->buffers.keyLabel) {
  20019. ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
  20020. (char*)ssl->buffers.key->buffer,
  20021. ssl->heap, ssl->buffers.keyDevId);
  20022. }
  20023. else if (ssl->buffers.keyId) {
  20024. ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
  20025. ssl->buffers.key->buffer,
  20026. ssl->buffers.key->length, ssl->heap,
  20027. ssl->buffers.keyDevId);
  20028. }
  20029. if (ret == 0) {
  20030. if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
  20031. WOLFSSL_MSG("ECC key size too small");
  20032. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  20033. }
  20034. /* Return the maximum signature length. */
  20035. *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz);
  20036. }
  20037. #else
  20038. ret = NOT_COMPILED_IN;
  20039. #endif
  20040. }
  20041. goto exit_dpk;
  20042. }
  20043. #endif /* WOLF_PRIVATE_KEY_ID */
  20044. #ifndef NO_RSA
  20045. if (ssl->buffers.keyType == rsa_sa_algo || ssl->buffers.keyType == 0) {
  20046. ssl->hsType = DYNAMIC_TYPE_RSA;
  20047. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20048. if (ret != 0) {
  20049. goto exit_dpk;
  20050. }
  20051. WOLFSSL_MSG("Trying RSA private key");
  20052. /* Set start of data to beginning of buffer. */
  20053. idx = 0;
  20054. /* Decode the key assuming it is an RSA private key. */
  20055. ret = wc_RsaPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  20056. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  20057. #ifdef WOLF_PRIVATE_KEY_ID
  20058. /* if using external key then allow using a public key */
  20059. if (ret != 0 && (ssl->devId != INVALID_DEVID
  20060. #ifdef HAVE_PK_CALLBACKS
  20061. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  20062. #endif
  20063. )) {
  20064. WOLFSSL_MSG("Trying RSA public key with crypto callbacks");
  20065. idx = 0;
  20066. ret = wc_RsaPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  20067. (RsaKey*)ssl->hsKey, ssl->buffers.key->length);
  20068. }
  20069. #endif
  20070. if (ret == 0) {
  20071. WOLFSSL_MSG("Using RSA private key");
  20072. /* It worked so check it meets minimum key size requirements. */
  20073. keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsKey);
  20074. if (keySz < 0) { /* check if keySz has error case */
  20075. ERROR_OUT(keySz, exit_dpk);
  20076. }
  20077. if (keySz < ssl->options.minRsaKeySz) {
  20078. WOLFSSL_MSG("RSA key size too small");
  20079. ERROR_OUT(RSA_KEY_SIZE_E, exit_dpk);
  20080. }
  20081. /* Return the maximum signature length. */
  20082. *length = (word16)keySz;
  20083. goto exit_dpk;
  20084. }
  20085. }
  20086. #endif /* !NO_RSA */
  20087. #ifdef HAVE_ECC
  20088. #ifndef NO_RSA
  20089. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  20090. #endif /* !NO_RSA */
  20091. if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0) {
  20092. ssl->hsType = DYNAMIC_TYPE_ECC;
  20093. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20094. if (ret != 0) {
  20095. goto exit_dpk;
  20096. }
  20097. #ifndef NO_RSA
  20098. WOLFSSL_MSG("Trying ECC private key, RSA didn't work");
  20099. #else
  20100. WOLFSSL_MSG("Trying ECC private key");
  20101. #endif
  20102. /* Set start of data to beginning of buffer. */
  20103. idx = 0;
  20104. /* Decode the key assuming it is an ECC private key. */
  20105. ret = wc_EccPrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  20106. (ecc_key*)ssl->hsKey,
  20107. ssl->buffers.key->length);
  20108. #ifdef WOLF_PRIVATE_KEY_ID
  20109. /* if using external key then allow using a public key */
  20110. if (ret != 0 && (ssl->devId != INVALID_DEVID
  20111. #ifdef HAVE_PK_CALLBACKS
  20112. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  20113. #endif
  20114. )) {
  20115. WOLFSSL_MSG("Trying ECC public key with crypto callbacks");
  20116. idx = 0;
  20117. ret = wc_EccPublicKeyDecode(ssl->buffers.key->buffer, &idx,
  20118. (ecc_key*)ssl->hsKey,
  20119. ssl->buffers.key->length);
  20120. }
  20121. #endif
  20122. if (ret == 0) {
  20123. WOLFSSL_MSG("Using ECC private key");
  20124. /* Check it meets the minimum ECC key size requirements. */
  20125. keySz = wc_ecc_size((ecc_key*)ssl->hsKey);
  20126. if (keySz < ssl->options.minEccKeySz) {
  20127. WOLFSSL_MSG("ECC key size too small");
  20128. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  20129. }
  20130. /* Return the maximum signature length. */
  20131. *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey);
  20132. goto exit_dpk;
  20133. }
  20134. }
  20135. #endif
  20136. #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT)
  20137. #if !defined(NO_RSA) || defined(HAVE_ECC)
  20138. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  20139. #endif
  20140. if (ssl->buffers.keyType == ed25519_sa_algo || ssl->buffers.keyType == 0) {
  20141. ssl->hsType = DYNAMIC_TYPE_ED25519;
  20142. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20143. if (ret != 0) {
  20144. goto exit_dpk;
  20145. }
  20146. #ifdef HAVE_ECC
  20147. WOLFSSL_MSG("Trying ED25519 private key, ECC didn't work");
  20148. #elif !defined(NO_RSA)
  20149. WOLFSSL_MSG("Trying ED25519 private key, RSA didn't work");
  20150. #else
  20151. WOLFSSL_MSG("Trying ED25519 private key");
  20152. #endif
  20153. /* Set start of data to beginning of buffer. */
  20154. idx = 0;
  20155. /* Decode the key assuming it is an ED25519 private key. */
  20156. ret = wc_Ed25519PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  20157. (ed25519_key*)ssl->hsKey,
  20158. ssl->buffers.key->length);
  20159. #ifdef WOLF_PRIVATE_KEY_ID
  20160. /* if using external key then allow using a public key */
  20161. if (ret != 0 && (ssl->devId != INVALID_DEVID
  20162. #ifdef HAVE_PK_CALLBACKS
  20163. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  20164. #endif
  20165. )) {
  20166. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  20167. idx = 0;
  20168. ret = wc_Ed25519PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  20169. (ed25519_key*)ssl->hsKey,
  20170. ssl->buffers.key->length);
  20171. }
  20172. #endif
  20173. if (ret == 0) {
  20174. WOLFSSL_MSG("Using ED25519 private key");
  20175. /* Check it meets the minimum ECC key size requirements. */
  20176. if (ED25519_KEY_SIZE < ssl->options.minEccKeySz) {
  20177. WOLFSSL_MSG("ED25519 key size too small");
  20178. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  20179. }
  20180. /* Return the maximum signature length. */
  20181. *length = ED25519_SIG_SIZE;
  20182. goto exit_dpk;
  20183. }
  20184. }
  20185. #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */
  20186. #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)
  20187. #if !defined(NO_RSA) || defined(HAVE_ECC)
  20188. FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey);
  20189. #endif
  20190. if (ssl->buffers.keyType == ed448_sa_algo || ssl->buffers.keyType == 0) {
  20191. ssl->hsType = DYNAMIC_TYPE_ED448;
  20192. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20193. if (ret != 0) {
  20194. goto exit_dpk;
  20195. }
  20196. #ifdef HAVE_ED25519
  20197. WOLFSSL_MSG("Trying ED448 private key, ED25519 didn't work");
  20198. #elif defined(HAVE_ECC)
  20199. WOLFSSL_MSG("Trying ED448 private key, ECC didn't work");
  20200. #elif !defined(NO_RSA)
  20201. WOLFSSL_MSG("Trying ED448 private key, RSA didn't work");
  20202. #else
  20203. WOLFSSL_MSG("Trying ED448 private key");
  20204. #endif
  20205. /* Set start of data to beginning of buffer. */
  20206. idx = 0;
  20207. /* Decode the key assuming it is an ED448 private key. */
  20208. ret = wc_Ed448PrivateKeyDecode(ssl->buffers.key->buffer, &idx,
  20209. (ed448_key*)ssl->hsKey,
  20210. ssl->buffers.key->length);
  20211. #ifdef WOLF_PRIVATE_KEY_ID
  20212. /* if using external key then allow using a public key */
  20213. if (ret != 0 && (ssl->devId != INVALID_DEVID
  20214. #ifdef HAVE_PK_CALLBACKS
  20215. || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)
  20216. #endif
  20217. )) {
  20218. WOLFSSL_MSG("Trying ED25519 public key with crypto callbacks");
  20219. idx = 0;
  20220. ret = wc_Ed448PublicKeyDecode(ssl->buffers.key->buffer, &idx,
  20221. (ed448_key*)ssl->hsKey,
  20222. ssl->buffers.key->length);
  20223. }
  20224. #endif
  20225. if (ret == 0) {
  20226. WOLFSSL_MSG("Using ED448 private key");
  20227. /* Check it meets the minimum ECC key size requirements. */
  20228. if (ED448_KEY_SIZE < ssl->options.minEccKeySz) {
  20229. WOLFSSL_MSG("ED448 key size too small");
  20230. ERROR_OUT(ECC_KEY_SIZE_E, exit_dpk);
  20231. }
  20232. /* Return the maximum signature length. */
  20233. *length = ED448_SIG_SIZE;
  20234. goto exit_dpk;
  20235. }
  20236. }
  20237. #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */
  20238. #if defined(HAVE_PQC) && defined(HAVE_FALCON)
  20239. if (ssl->buffers.keyType == falcon_level1_sa_algo ||
  20240. ssl->buffers.keyType == falcon_level5_sa_algo ||
  20241. ssl->buffers.keyType == 0) {
  20242. ssl->hsType = DYNAMIC_TYPE_FALCON;
  20243. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  20244. if (ret != 0) {
  20245. goto exit_dpk;
  20246. }
  20247. if (ssl->buffers.keyType == falcon_level1_sa_algo) {
  20248. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 1);
  20249. }
  20250. else if (ssl->buffers.keyType == falcon_level5_sa_algo) {
  20251. ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 5);
  20252. }
  20253. else {
  20254. /* What if ssl->buffers.keyType is 0? We might want to do something
  20255. * more graceful here. */
  20256. ret = ALGO_ID_E;
  20257. }
  20258. if (ret != 0) {
  20259. goto exit_dpk;
  20260. }
  20261. #if defined(HAVE_ED448)
  20262. WOLFSSL_MSG("Trying Falcon private key, ED448 didn't work");
  20263. #elif defined(HAVE_ED25519)
  20264. WOLFSSL_MSG("Trying Falcon private key, ED25519 didn't work");
  20265. #elif defined(HAVE_ECC)
  20266. WOLFSSL_MSG("Trying Falcon private key, ECC didn't work");
  20267. #elif !defined(NO_RSA)
  20268. WOLFSSL_MSG("Trying Falcon private key, RSA didn't work");
  20269. #else
  20270. WOLFSSL_MSG("Trying Falcon private key");
  20271. #endif
  20272. /* Set start of data to beginning of buffer. */
  20273. idx = 0;
  20274. /* Decode the key assuming it is a Falcon private key. */
  20275. ret = wc_falcon_import_private_only(ssl->buffers.key->buffer,
  20276. ssl->buffers.key->length,
  20277. (falcon_key*)ssl->hsKey);
  20278. if (ret == 0) {
  20279. WOLFSSL_MSG("Using Falcon private key");
  20280. /* Check it meets the minimum Falcon key size requirements. */
  20281. if (FALCON_MAX_KEY_SIZE < ssl->options.minFalconKeySz) {
  20282. WOLFSSL_MSG("Falcon key size too small");
  20283. ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk);
  20284. }
  20285. /* Return the maximum signature length. */
  20286. *length = FALCON_MAX_SIG_SIZE;
  20287. goto exit_dpk;
  20288. }
  20289. }
  20290. #endif /* HAVE_PQC && HAVE_FALCON */
  20291. (void)idx;
  20292. (void)keySz;
  20293. (void)length;
  20294. exit_dpk:
  20295. return ret;
  20296. }
  20297. #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
  20298. #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
  20299. /* returns 1 if able to do TLS 1.3 otherwise 0 */
  20300. int TLSv1_3_Capable(WOLFSSL* ssl)
  20301. {
  20302. #ifndef WOLFSSL_TLS13
  20303. return 0;
  20304. #else
  20305. int ret = 0;
  20306. if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
  20307. ret = 1;
  20308. }
  20309. #ifdef OPENSSL_EXTRA
  20310. if ((wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_3)) {
  20311. /* option set at run time to disable TLS 1.3 */
  20312. ret = 0;
  20313. }
  20314. #endif
  20315. return ret;
  20316. #endif
  20317. }
  20318. #endif /* WOLFSSL_TLS13 */
  20319. /* client only parts */
  20320. #ifndef NO_WOLFSSL_CLIENT
  20321. #ifndef WOLFSSL_NO_TLS12
  20322. /* handle generation of client_hello (1) */
  20323. int SendClientHello(WOLFSSL* ssl)
  20324. {
  20325. byte *output;
  20326. word32 length, idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  20327. int sendSz;
  20328. int idSz;
  20329. int ret;
  20330. word16 extSz = 0;
  20331. if (ssl == NULL) {
  20332. return BAD_FUNC_ARG;
  20333. }
  20334. idSz = ssl->options.resuming ? ssl->session->sessionIDSz : 0;
  20335. #ifdef WOLFSSL_TLS13
  20336. if (IsAtLeastTLSv1_3(ssl->version))
  20337. return SendTls13ClientHello(ssl);
  20338. #endif
  20339. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND);
  20340. WOLFSSL_ENTER("SendClientHello");
  20341. if (ssl->suites == NULL) {
  20342. WOLFSSL_MSG("Bad suites pointer in SendClientHello");
  20343. return SUITES_ERROR;
  20344. }
  20345. #ifdef HAVE_SESSION_TICKET
  20346. if (ssl->options.resuming && ssl->session->ticketLen > 0) {
  20347. SessionTicket* ticket;
  20348. ticket = TLSX_SessionTicket_Create(0, ssl->session->ticket,
  20349. ssl->session->ticketLen, ssl->heap);
  20350. if (ticket == NULL) return MEMORY_E;
  20351. ret = TLSX_UseSessionTicket(&ssl->extensions, ticket, ssl->heap);
  20352. if (ret != WOLFSSL_SUCCESS) {
  20353. TLSX_SessionTicket_Free(ticket, ssl->heap);
  20354. return ret;
  20355. }
  20356. idSz = 0;
  20357. }
  20358. #endif
  20359. length = VERSION_SZ + RAN_LEN
  20360. + idSz + ENUM_LEN
  20361. + ssl->suites->suiteSz + SUITE_LEN
  20362. + COMP_LEN + ENUM_LEN;
  20363. #ifdef HAVE_TLS_EXTENSIONS
  20364. /* auto populate extensions supported unless user defined */
  20365. if ((ret = TLSX_PopulateExtensions(ssl, 0)) != 0)
  20366. return ret;
  20367. extSz = 0;
  20368. ret = TLSX_GetRequestSize(ssl, client_hello, &extSz);
  20369. if (ret != 0)
  20370. return ret;
  20371. length += extSz;
  20372. #else
  20373. if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
  20374. extSz += HELLO_EXT_SZ + HELLO_EXT_SIGALGO_SZ
  20375. + ssl->suites->hashSigAlgoSz;
  20376. #ifdef HAVE_EXTENDED_MASTER
  20377. if (ssl->options.haveEMS)
  20378. extSz += HELLO_EXT_SZ;
  20379. #endif
  20380. if (extSz != 0)
  20381. length += extSz + HELLO_EXT_SZ_SZ;
  20382. #endif
  20383. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  20384. if (ssl->arrays == NULL) {
  20385. return BAD_FUNC_ARG;
  20386. }
  20387. #ifdef WOLFSSL_DTLS
  20388. if (ssl->options.dtls) {
  20389. length += ENUM_LEN; /* cookie */
  20390. if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz;
  20391. sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ;
  20392. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  20393. }
  20394. #endif
  20395. if (IsEncryptionOn(ssl, 1))
  20396. sendSz += MAX_MSG_EXTRA;
  20397. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  20398. * is not advanced yet */
  20399. ssl->options.buildingMsg = 1;
  20400. /* check for available size */
  20401. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  20402. return ret;
  20403. /* get output buffer */
  20404. output = ssl->buffers.outputBuffer.buffer +
  20405. ssl->buffers.outputBuffer.length;
  20406. AddHeaders(output, length, client_hello, ssl);
  20407. /* client hello, first version */
  20408. output[idx++] = ssl->version.major;
  20409. output[idx++] = ssl->version.minor;
  20410. ssl->chVersion = ssl->version; /* store in case changed */
  20411. /* then random */
  20412. if (ssl->options.connectState == CONNECT_BEGIN) {
  20413. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, RAN_LEN);
  20414. if (ret != 0)
  20415. return ret;
  20416. /* store random */
  20417. XMEMCPY(ssl->arrays->clientRandom, output + idx, RAN_LEN);
  20418. } else {
  20419. #ifdef WOLFSSL_DTLS
  20420. /* send same random on hello again */
  20421. XMEMCPY(output + idx, ssl->arrays->clientRandom, RAN_LEN);
  20422. #endif
  20423. }
  20424. idx += RAN_LEN;
  20425. /* then session id */
  20426. output[idx++] = (byte)idSz;
  20427. if (idSz) {
  20428. XMEMCPY(output + idx, ssl->session->sessionID,
  20429. ssl->session->sessionIDSz);
  20430. idx += ssl->session->sessionIDSz;
  20431. }
  20432. /* then DTLS cookie */
  20433. #ifdef WOLFSSL_DTLS
  20434. if (ssl->options.dtls) {
  20435. byte cookieSz = ssl->arrays->cookieSz;
  20436. output[idx++] = cookieSz;
  20437. if (cookieSz) {
  20438. XMEMCPY(&output[idx], ssl->arrays->cookie, cookieSz);
  20439. idx += cookieSz;
  20440. }
  20441. }
  20442. #endif
  20443. /* then cipher suites */
  20444. c16toa(ssl->suites->suiteSz, output + idx);
  20445. idx += OPAQUE16_LEN;
  20446. XMEMCPY(output + idx, &ssl->suites->suites, ssl->suites->suiteSz);
  20447. idx += ssl->suites->suiteSz;
  20448. /* last, compression */
  20449. output[idx++] = COMP_LEN;
  20450. if (ssl->options.usingCompression)
  20451. output[idx++] = ZLIB_COMPRESSION;
  20452. else
  20453. output[idx++] = NO_COMPRESSION;
  20454. #ifdef HAVE_TLS_EXTENSIONS
  20455. extSz = 0;
  20456. ret = TLSX_WriteRequest(ssl, output + idx, client_hello, &extSz);
  20457. if (ret != 0)
  20458. return ret;
  20459. idx += extSz;
  20460. (void)idx; /* suppress analyzer warning, keep idx current */
  20461. #else
  20462. if (extSz != 0) {
  20463. c16toa(extSz, output + idx);
  20464. idx += HELLO_EXT_SZ_SZ;
  20465. if (IsAtLeastTLSv1_2(ssl)) {
  20466. if (ssl->suites->hashSigAlgoSz) {
  20467. word16 i;
  20468. /* extension type */
  20469. c16toa(HELLO_EXT_SIG_ALGO, output + idx);
  20470. idx += HELLO_EXT_TYPE_SZ;
  20471. /* extension data length */
  20472. c16toa(HELLO_EXT_SIGALGO_SZ + ssl->suites->hashSigAlgoSz,
  20473. output + idx);
  20474. idx += HELLO_EXT_SZ_SZ;
  20475. /* sig algos length */
  20476. c16toa(ssl->suites->hashSigAlgoSz, output + idx);
  20477. idx += HELLO_EXT_SIGALGO_SZ;
  20478. for (i=0; i < ssl->suites->hashSigAlgoSz; i++, idx++) {
  20479. output[idx] = ssl->suites->hashSigAlgo[i];
  20480. }
  20481. }
  20482. }
  20483. #ifdef HAVE_EXTENDED_MASTER
  20484. if (ssl->options.haveEMS) {
  20485. c16toa(HELLO_EXT_EXTMS, output + idx);
  20486. idx += HELLO_EXT_TYPE_SZ;
  20487. c16toa(0, output + idx);
  20488. idx += HELLO_EXT_SZ_SZ;
  20489. }
  20490. #endif
  20491. }
  20492. #endif
  20493. if (IsEncryptionOn(ssl, 1)) {
  20494. byte* input;
  20495. int inputSz = idx; /* build msg adds rec hdr */
  20496. int recordHeaderSz = RECORD_HEADER_SZ;
  20497. if (ssl->options.dtls)
  20498. recordHeaderSz += DTLS_RECORD_EXTRA;
  20499. inputSz -= recordHeaderSz;
  20500. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20501. if (input == NULL)
  20502. return MEMORY_E;
  20503. XMEMCPY(input, output + recordHeaderSz, inputSz);
  20504. #ifdef WOLFSSL_DTLS
  20505. if (IsDtlsNotSctpMode(ssl) &&
  20506. (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
  20507. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20508. return ret;
  20509. }
  20510. #endif
  20511. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  20512. handshake, 1, 0, 0, CUR_ORDER);
  20513. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  20514. if (sendSz < 0)
  20515. return sendSz;
  20516. } else {
  20517. #ifdef WOLFSSL_DTLS
  20518. if (IsDtlsNotSctpMode(ssl)) {
  20519. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
  20520. return ret;
  20521. }
  20522. if (ssl->options.dtls)
  20523. DtlsSEQIncrement(ssl, CUR_ORDER);
  20524. #endif
  20525. ret = HashOutput(ssl, output, sendSz, 0);
  20526. if (ret != 0)
  20527. return ret;
  20528. }
  20529. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  20530. #ifdef OPENSSL_EXTRA
  20531. ssl->cbmode = SSL_CB_MODE_WRITE;
  20532. if (ssl->CBIS != NULL)
  20533. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  20534. #endif
  20535. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  20536. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  20537. if (ssl->toInfoOn)
  20538. AddPacketInfo(ssl, "ClientHello", handshake, output, sendSz,
  20539. WRITE_PROTO, ssl->heap);
  20540. #endif
  20541. ssl->options.buildingMsg = 0;
  20542. ssl->buffers.outputBuffer.length += sendSz;
  20543. ret = SendBuffered(ssl);
  20544. WOLFSSL_LEAVE("SendClientHello", ret);
  20545. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
  20546. return ret;
  20547. }
  20548. /* handle processing of DTLS hello_verify_request (3) */
  20549. static int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input,
  20550. word32* inOutIdx, word32 size)
  20551. {
  20552. ProtocolVersion pv;
  20553. byte cookieSz;
  20554. word32 begin = *inOutIdx;
  20555. #ifdef WOLFSSL_CALLBACKS
  20556. if (ssl->hsInfoOn) AddPacketName(ssl, "HelloVerifyRequest");
  20557. if (ssl->toInfoOn) AddLateName("HelloVerifyRequest", &ssl->timeoutInfo);
  20558. #endif
  20559. #ifdef WOLFSSL_DTLS
  20560. if (ssl->options.dtls) {
  20561. DtlsMsgPoolReset(ssl);
  20562. }
  20563. #endif
  20564. if (OPAQUE16_LEN + OPAQUE8_LEN > size)
  20565. return BUFFER_ERROR;
  20566. XMEMCPY(&pv, input + *inOutIdx, OPAQUE16_LEN);
  20567. *inOutIdx += OPAQUE16_LEN;
  20568. if (pv.major != DTLS_MAJOR ||
  20569. (pv.minor != DTLS_MINOR && pv.minor != DTLSv1_2_MINOR))
  20570. return VERSION_ERROR;
  20571. cookieSz = input[(*inOutIdx)++];
  20572. if (cookieSz) {
  20573. if ((*inOutIdx - begin) + cookieSz > size)
  20574. return BUFFER_ERROR;
  20575. #ifdef WOLFSSL_DTLS
  20576. if (cookieSz <= MAX_COOKIE_LEN) {
  20577. XMEMCPY(ssl->arrays->cookie, input + *inOutIdx, cookieSz);
  20578. ssl->arrays->cookieSz = cookieSz;
  20579. }
  20580. #endif
  20581. *inOutIdx += cookieSz;
  20582. }
  20583. ssl->options.serverState = SERVER_HELLOVERIFYREQUEST_COMPLETE;
  20584. return 0;
  20585. }
  20586. static WC_INLINE int DSH_CheckSessionId(WOLFSSL* ssl)
  20587. {
  20588. int ret = 0;
  20589. #ifdef HAVE_SECRET_CALLBACK
  20590. /* If a session secret callback exists, we are using that
  20591. * key instead of the saved session key. */
  20592. ret = ret || (ssl->sessionSecretCb != NULL);
  20593. #endif
  20594. #ifdef HAVE_SESSION_TICKET
  20595. /* server may send blank ticket which may not be expected to indicate
  20596. * existing one ok but will also be sending a new one */
  20597. ret = ret || (ssl->session->ticketLen > 0);
  20598. #endif
  20599. ret = ret ||
  20600. (ssl->options.haveSessionId && XMEMCMP(ssl->arrays->sessionID,
  20601. ssl->session->sessionID, ID_LEN) == 0);
  20602. return ret;
  20603. }
  20604. /* Check the version in the received message is valid and set protocol
  20605. * version to use.
  20606. *
  20607. * ssl The SSL/TLS object.
  20608. * pv The protocol version from the packet.
  20609. * returns 0 on success, otherwise failure.
  20610. */
  20611. int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv)
  20612. {
  20613. #ifdef WOLFSSL_TLS13_DRAFT
  20614. if (pv.major == TLS_DRAFT_MAJOR) {
  20615. pv.major = SSLv3_MAJOR;
  20616. pv.minor = TLSv1_3_MINOR;
  20617. }
  20618. #endif
  20619. #ifdef OPENSSL_EXTRA
  20620. if (ssl->CBIS != NULL) {
  20621. ssl->CBIS(ssl, SSL_CB_HANDSHAKE_START, SSL_SUCCESS);
  20622. }
  20623. #endif
  20624. if (pv.minor > ssl->version.minor) {
  20625. WOLFSSL_MSG("Server using higher version, fatal error");
  20626. return VERSION_ERROR;
  20627. }
  20628. if (pv.minor < ssl->version.minor) {
  20629. WOLFSSL_MSG("server using lower version");
  20630. /* Check for downgrade attack. */
  20631. if (!ssl->options.downgrade) {
  20632. WOLFSSL_MSG("\tno downgrade allowed, fatal error");
  20633. return VERSION_ERROR;
  20634. }
  20635. if (pv.minor < ssl->options.minDowngrade) {
  20636. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  20637. return VERSION_ERROR;
  20638. }
  20639. #ifdef HAVE_SECURE_RENEGOTIATION
  20640. if (ssl->secure_renegotiation &&
  20641. ssl->secure_renegotiation->enabled &&
  20642. ssl->options.handShakeDone) {
  20643. WOLFSSL_MSG("Server changed version during scr");
  20644. return VERSION_ERROR;
  20645. }
  20646. #endif
  20647. /* Checks made - OK to downgrade. */
  20648. if (pv.minor == SSLv3_MINOR) {
  20649. /* turn off tls */
  20650. WOLFSSL_MSG("\tdowngrading to SSLv3");
  20651. ssl->options.tls = 0;
  20652. ssl->options.tls1_1 = 0;
  20653. ssl->version.minor = SSLv3_MINOR;
  20654. }
  20655. else if (pv.minor == TLSv1_MINOR) {
  20656. /* turn off tls 1.1+ */
  20657. WOLFSSL_MSG("\tdowngrading to TLSv1");
  20658. ssl->options.tls1_1 = 0;
  20659. ssl->version.minor = TLSv1_MINOR;
  20660. }
  20661. else if (pv.minor == TLSv1_1_MINOR) {
  20662. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  20663. ssl->version.minor = TLSv1_1_MINOR;
  20664. }
  20665. else if (pv.minor == TLSv1_2_MINOR) {
  20666. WOLFSSL_MSG(" downgrading to TLSv1.2");
  20667. ssl->version.minor = TLSv1_2_MINOR;
  20668. }
  20669. }
  20670. #ifdef OPENSSL_EXTRA
  20671. /* check if option is set to not allow the current version
  20672. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  20673. if (!ssl->options.dtls && ssl->options.downgrade &&
  20674. ssl->options.mask > 0) {
  20675. if (ssl->version.minor == TLSv1_2_MINOR &&
  20676. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  20677. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  20678. ssl->version.minor = TLSv1_1_MINOR;
  20679. }
  20680. if (ssl->version.minor == TLSv1_1_MINOR &&
  20681. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  20682. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  20683. ssl->options.tls1_1 = 0;
  20684. ssl->version.minor = TLSv1_MINOR;
  20685. }
  20686. if (ssl->version.minor == TLSv1_MINOR &&
  20687. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  20688. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  20689. ssl->options.tls = 0;
  20690. ssl->options.tls1_1 = 0;
  20691. ssl->version.minor = SSLv3_MINOR;
  20692. }
  20693. if (ssl->version.minor == SSLv3_MINOR &&
  20694. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  20695. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  20696. return VERSION_ERROR;
  20697. }
  20698. if (ssl->version.minor < ssl->options.minDowngrade) {
  20699. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  20700. return VERSION_ERROR;
  20701. }
  20702. }
  20703. #endif
  20704. return 0;
  20705. }
  20706. /* handle processing of server_hello (2) */
  20707. int DoServerHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  20708. word32 helloSz)
  20709. {
  20710. byte cs0; /* cipher suite bytes 0, 1 */
  20711. byte cs1;
  20712. ProtocolVersion pv;
  20713. byte compression;
  20714. word32 i = *inOutIdx;
  20715. word32 begin = i;
  20716. int ret;
  20717. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DO);
  20718. WOLFSSL_ENTER("DoServerHello");
  20719. #ifdef WOLFSSL_CALLBACKS
  20720. if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
  20721. if (ssl->toInfoOn) AddLateName("ServerHello", &ssl->timeoutInfo);
  20722. #endif
  20723. /* protocol version, random and session id length check */
  20724. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  20725. return BUFFER_ERROR;
  20726. /* protocol version */
  20727. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  20728. i += OPAQUE16_LEN;
  20729. ret = CheckVersion(ssl, pv);
  20730. if (ret != 0)
  20731. return ret;
  20732. #ifdef WOLFSSL_TLS13
  20733. if (IsAtLeastTLSv1_3(pv)) {
  20734. byte type = server_hello;
  20735. return DoTls13ServerHello(ssl, input, inOutIdx, helloSz, &type);
  20736. }
  20737. #endif
  20738. /* random */
  20739. XMEMCPY(ssl->arrays->serverRandom, input + i, RAN_LEN);
  20740. i += RAN_LEN;
  20741. /* session id */
  20742. ssl->arrays->sessionIDSz = input[i++];
  20743. if (ssl->arrays->sessionIDSz > ID_LEN) {
  20744. WOLFSSL_MSG("Invalid session ID size");
  20745. ssl->arrays->sessionIDSz = 0;
  20746. return BUFFER_ERROR;
  20747. }
  20748. else if (ssl->arrays->sessionIDSz) {
  20749. if ((i - begin) + ssl->arrays->sessionIDSz > helloSz)
  20750. return BUFFER_ERROR;
  20751. XMEMCPY(ssl->arrays->sessionID, input + i,
  20752. ssl->arrays->sessionIDSz);
  20753. i += ssl->arrays->sessionIDSz;
  20754. ssl->options.haveSessionId = 1;
  20755. }
  20756. /* suite and compression */
  20757. if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
  20758. return BUFFER_ERROR;
  20759. cs0 = input[i++];
  20760. cs1 = input[i++];
  20761. #ifdef HAVE_SECURE_RENEGOTIATION
  20762. if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
  20763. ssl->options.handShakeDone) {
  20764. if (ssl->options.cipherSuite0 != cs0 ||
  20765. ssl->options.cipherSuite != cs1) {
  20766. WOLFSSL_MSG("Server changed cipher suite during scr");
  20767. return MATCH_SUITE_ERROR;
  20768. }
  20769. }
  20770. #endif
  20771. ssl->options.cipherSuite0 = cs0;
  20772. ssl->options.cipherSuite = cs1;
  20773. #ifdef WOLFSSL_DEBUG_TLS
  20774. WOLFSSL_MSG("Chosen cipher suite:");
  20775. WOLFSSL_MSG(GetCipherNameInternal(ssl->options.cipherSuite0,
  20776. ssl->options.cipherSuite));
  20777. #endif
  20778. compression = input[i++];
  20779. #ifndef WOLFSSL_NO_STRICT_CIPHER_SUITE
  20780. {
  20781. word32 idx, found = 0;
  20782. /* confirm server_hello cipher suite is one sent in client_hello */
  20783. for (idx = 0; idx < ssl->suites->suiteSz; idx += 2) {
  20784. if (ssl->suites->suites[idx] == cs0 &&
  20785. ssl->suites->suites[idx+1] == cs1) {
  20786. found = 1;
  20787. break;
  20788. }
  20789. }
  20790. if (!found) {
  20791. WOLFSSL_MSG("ServerHello did not use cipher suite from ClientHello");
  20792. return MATCH_SUITE_ERROR;
  20793. }
  20794. }
  20795. #endif /* !WOLFSSL_NO_STRICT_CIPHER_SUITE */
  20796. if (compression != NO_COMPRESSION && !ssl->options.usingCompression) {
  20797. WOLFSSL_MSG("Server forcing compression w/o support");
  20798. return COMPRESSION_ERROR;
  20799. }
  20800. if (compression != ZLIB_COMPRESSION && ssl->options.usingCompression) {
  20801. WOLFSSL_MSG("Server refused compression, turning off");
  20802. ssl->options.usingCompression = 0; /* turn off if server refused */
  20803. }
  20804. *inOutIdx = i;
  20805. #ifdef HAVE_TLS_EXTENSIONS
  20806. if ( (i - begin) < helloSz) {
  20807. if (TLSX_SupportExtensions(ssl)) {
  20808. word16 totalExtSz;
  20809. if ((i - begin) + OPAQUE16_LEN > helloSz)
  20810. return BUFFER_ERROR;
  20811. ato16(&input[i], &totalExtSz);
  20812. i += OPAQUE16_LEN;
  20813. if ((i - begin) + totalExtSz > helloSz)
  20814. return BUFFER_ERROR;
  20815. if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
  20816. server_hello, NULL)))
  20817. return ret;
  20818. i += totalExtSz;
  20819. *inOutIdx = i;
  20820. }
  20821. else
  20822. *inOutIdx = begin + helloSz; /* skip extensions */
  20823. }
  20824. else
  20825. ssl->options.haveEMS = 0; /* If no extensions, no EMS */
  20826. #else
  20827. {
  20828. int allowExt = 0;
  20829. byte pendingEMS = 0;
  20830. if ( (i - begin) < helloSz) {
  20831. if (ssl->version.major == SSLv3_MAJOR &&
  20832. ssl->version.minor >= TLSv1_MINOR) {
  20833. allowExt = 1;
  20834. }
  20835. #ifdef WOLFSSL_DTLS
  20836. if (ssl->version.major == DTLS_MAJOR)
  20837. allowExt = 1;
  20838. #endif
  20839. if (allowExt) {
  20840. word16 totalExtSz;
  20841. if ((i - begin) + OPAQUE16_LEN > helloSz)
  20842. return BUFFER_ERROR;
  20843. ato16(&input[i], &totalExtSz);
  20844. i += OPAQUE16_LEN;
  20845. if ((i - begin) + totalExtSz > helloSz)
  20846. return BUFFER_ERROR;
  20847. while (totalExtSz) {
  20848. word16 extId, extSz;
  20849. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
  20850. return BUFFER_ERROR;
  20851. ato16(&input[i], &extId);
  20852. i += OPAQUE16_LEN;
  20853. ato16(&input[i], &extSz);
  20854. i += OPAQUE16_LEN;
  20855. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
  20856. return BUFFER_ERROR;
  20857. if (extId == HELLO_EXT_EXTMS)
  20858. pendingEMS = 1;
  20859. else
  20860. i += extSz;
  20861. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  20862. }
  20863. *inOutIdx = i;
  20864. }
  20865. else
  20866. *inOutIdx = begin + helloSz; /* skip extensions */
  20867. }
  20868. if (!pendingEMS && ssl->options.haveEMS)
  20869. ssl->options.haveEMS = 0;
  20870. }
  20871. #endif
  20872. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  20873. if (IsEncryptionOn(ssl, 0)) {
  20874. *inOutIdx += ssl->keys.padSz;
  20875. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  20876. if (ssl->options.startedETMWrite &&
  20877. ssl->specs.cipher_type == block) {
  20878. *inOutIdx += MacSize(ssl);
  20879. }
  20880. #endif
  20881. }
  20882. #ifdef HAVE_SECRET_CALLBACK
  20883. if (ssl->sessionSecretCb != NULL) {
  20884. int secretSz = SECRET_LEN;
  20885. ret = ssl->sessionSecretCb(ssl, ssl->session->masterSecret,
  20886. &secretSz, ssl->sessionSecretCtx);
  20887. if (ret != 0 || secretSz != SECRET_LEN)
  20888. return SESSION_SECRET_CB_E;
  20889. }
  20890. #endif /* HAVE_SECRET_CALLBACK */
  20891. ret = CompleteServerHello(ssl);
  20892. WOLFSSL_LEAVE("DoServerHello", ret);
  20893. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DO);
  20894. return ret;
  20895. }
  20896. int CompleteServerHello(WOLFSSL* ssl)
  20897. {
  20898. int ret;
  20899. if (!ssl->options.resuming) {
  20900. byte* down = ssl->arrays->serverRandom + RAN_LEN -
  20901. TLS13_DOWNGRADE_SZ - 1;
  20902. byte vers = ssl->arrays->serverRandom[RAN_LEN - 1];
  20903. #ifdef WOLFSSL_TLS13
  20904. if (TLSv1_3_Capable(ssl)) {
  20905. /* TLS v1.3 capable client not allowed to downgrade when
  20906. * connecting to TLS v1.3 capable server unless cipher suite
  20907. * demands it.
  20908. */
  20909. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  20910. (vers == 0 || vers == 1)) {
  20911. SendAlert(ssl, alert_fatal, illegal_parameter);
  20912. return VERSION_ERROR;
  20913. }
  20914. }
  20915. else
  20916. #endif
  20917. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  20918. ssl->ctx->method->version.minor == TLSv1_2_MINOR
  20919. #ifdef OPENSSL_EXTRA
  20920. && (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0
  20921. #endif
  20922. ) {
  20923. /* TLS v1.2 capable client not allowed to downgrade when
  20924. * connecting to TLS v1.2 capable server.
  20925. */
  20926. if (XMEMCMP(down, tls13Downgrade, TLS13_DOWNGRADE_SZ) == 0 &&
  20927. vers == 0) {
  20928. SendAlert(ssl, alert_fatal, illegal_parameter);
  20929. return VERSION_ERROR;
  20930. }
  20931. }
  20932. }
  20933. else {
  20934. if (DSH_CheckSessionId(ssl)) {
  20935. if (SetCipherSpecs(ssl) == 0) {
  20936. XMEMCPY(ssl->arrays->masterSecret,
  20937. ssl->session->masterSecret, SECRET_LEN);
  20938. #ifdef NO_OLD_TLS
  20939. ret = DeriveTlsKeys(ssl);
  20940. #else
  20941. ret = -1; /* default value */
  20942. #ifndef NO_TLS
  20943. if (ssl->options.tls)
  20944. ret = DeriveTlsKeys(ssl);
  20945. #endif
  20946. if (!ssl->options.tls)
  20947. ret = DeriveKeys(ssl);
  20948. #endif /* NO_OLD_TLS */
  20949. /* SERVER: peer auth based on session secret. */
  20950. ssl->options.peerAuthGood = (ret == 0);
  20951. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  20952. return ret;
  20953. }
  20954. else {
  20955. WOLFSSL_MSG("Unsupported cipher suite, DoServerHello");
  20956. return UNSUPPORTED_SUITE;
  20957. }
  20958. }
  20959. else {
  20960. WOLFSSL_MSG("Server denied resumption attempt");
  20961. ssl->options.resuming = 0; /* server denied resumption try */
  20962. }
  20963. }
  20964. return SetCipherSpecs(ssl);
  20965. }
  20966. #endif /* !WOLFSSL_NO_TLS12 */
  20967. /* Make sure client setup is valid for this suite, true on success */
  20968. int VerifyClientSuite(WOLFSSL* ssl)
  20969. {
  20970. #ifndef NO_PSK
  20971. int havePSK = ssl->options.havePSK;
  20972. #endif
  20973. byte first = ssl->options.cipherSuite0;
  20974. byte second = ssl->options.cipherSuite;
  20975. WOLFSSL_ENTER("VerifyClientSuite");
  20976. if (CipherRequires(first, second, REQUIRES_PSK)) {
  20977. WOLFSSL_MSG("Requires PSK");
  20978. #ifndef NO_PSK
  20979. if (havePSK == 0)
  20980. #endif
  20981. {
  20982. WOLFSSL_MSG("Don't have PSK");
  20983. return 0;
  20984. }
  20985. }
  20986. return 1; /* success */
  20987. }
  20988. #ifndef WOLFSSL_NO_TLS12
  20989. #ifndef NO_CERTS
  20990. /* handle processing of certificate_request (13) */
  20991. static int DoCertificateRequest(WOLFSSL* ssl, const byte* input, word32*
  20992. inOutIdx, word32 size)
  20993. {
  20994. word16 len;
  20995. word32 begin = *inOutIdx;
  20996. #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) || \
  20997. defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  20998. int ret;
  20999. #endif
  21000. #ifdef OPENSSL_EXTRA
  21001. WOLFSSL_X509* x509 = NULL;
  21002. WOLFSSL_EVP_PKEY* pkey = NULL;
  21003. #endif
  21004. WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_DO);
  21005. WOLFSSL_ENTER("DoCertificateRequest");
  21006. #ifdef WOLFSSL_CALLBACKS
  21007. if (ssl->hsInfoOn)
  21008. AddPacketName(ssl, "CertificateRequest");
  21009. if (ssl->toInfoOn)
  21010. AddLateName("CertificateRequest", &ssl->timeoutInfo);
  21011. #endif
  21012. if (OPAQUE8_LEN > size)
  21013. return BUFFER_ERROR;
  21014. len = input[(*inOutIdx)++];
  21015. if ((*inOutIdx - begin) + len > size)
  21016. return BUFFER_ERROR;
  21017. /* types, read in here */
  21018. *inOutIdx += len;
  21019. /* signature and hash signature algorithm */
  21020. if (IsAtLeastTLSv1_2(ssl)) {
  21021. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  21022. return BUFFER_ERROR;
  21023. ato16(input + *inOutIdx, &len);
  21024. *inOutIdx += OPAQUE16_LEN;
  21025. if ((len > size) || ((*inOutIdx - begin) + len > size))
  21026. return BUFFER_ERROR;
  21027. if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
  21028. ssl->buffers.certificate &&
  21029. ssl->buffers.certificate->buffer) {
  21030. #ifdef HAVE_PK_CALLBACKS
  21031. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  21032. WOLFSSL_MSG("Using PK for client private key");
  21033. return INVALID_PARAMETER;
  21034. }
  21035. #endif
  21036. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  21037. return INVALID_PARAMETER;
  21038. }
  21039. }
  21040. *inOutIdx += len;
  21041. #ifdef WC_RSA_PSS
  21042. ssl->pssAlgo = 0;
  21043. if (ssl->suites->sigAlgo == rsa_pss_sa_algo)
  21044. ssl->pssAlgo |= 1 << ssl->suites->hashAlgo;
  21045. #endif
  21046. }
  21047. /* authorities */
  21048. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  21049. return BUFFER_ERROR;
  21050. /* DN seq length */
  21051. ato16(input + *inOutIdx, &len);
  21052. *inOutIdx += OPAQUE16_LEN;
  21053. if ((*inOutIdx - begin) + len > size)
  21054. return BUFFER_ERROR;
  21055. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  21056. if (ssl->ca_names != ssl->ctx->ca_names)
  21057. wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL);
  21058. ssl->ca_names = wolfSSL_sk_X509_NAME_new(NULL);
  21059. if (ssl->ca_names == NULL) {
  21060. return MEMORY_ERROR;
  21061. }
  21062. #endif
  21063. while (len) {
  21064. word16 dnSz;
  21065. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  21066. return BUFFER_ERROR;
  21067. ato16(input + *inOutIdx, &dnSz);
  21068. *inOutIdx += OPAQUE16_LEN;
  21069. if ((*inOutIdx - begin) + dnSz > size)
  21070. return BUFFER_ERROR;
  21071. #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
  21072. {
  21073. /* Use a DecodedCert struct to get access to GetName to
  21074. * parse DN name */
  21075. DecodedCert cert;
  21076. WOLFSSL_X509_NAME* name;
  21077. InitDecodedCert(&cert, input + *inOutIdx, dnSz, ssl->heap);
  21078. if ((ret = GetName(&cert, SUBJECT, dnSz)) != 0) {
  21079. FreeDecodedCert(&cert);
  21080. return ret;
  21081. }
  21082. if ((name = wolfSSL_X509_NAME_new()) == NULL) {
  21083. FreeDecodedCert(&cert);
  21084. return MEMORY_ERROR;
  21085. }
  21086. CopyDecodedName(name, &cert, SUBJECT);
  21087. if (wolfSSL_sk_X509_NAME_push(ssl->ca_names, name)
  21088. == WOLFSSL_FAILURE) {
  21089. FreeDecodedCert(&cert);
  21090. wolfSSL_X509_NAME_free(name);
  21091. return MEMORY_ERROR;
  21092. }
  21093. FreeDecodedCert(&cert);
  21094. }
  21095. #endif
  21096. *inOutIdx += dnSz;
  21097. len -= OPAQUE16_LEN + dnSz;
  21098. }
  21099. #ifdef OPENSSL_EXTRA
  21100. /* call client cert callback if no cert has been loaded */
  21101. if ((ssl->ctx->CBClientCert != NULL) &&
  21102. (!ssl->buffers.certificate || !ssl->buffers.certificate->buffer)) {
  21103. ret = ssl->ctx->CBClientCert(ssl, &x509, &pkey);
  21104. if (ret == 1) {
  21105. if ((wolfSSL_use_certificate(ssl, x509) != WOLFSSL_SUCCESS) ||
  21106. (wolfSSL_use_PrivateKey(ssl, pkey) != WOLFSSL_SUCCESS)) {
  21107. return CLIENT_CERT_CB_ERROR;
  21108. }
  21109. wolfSSL_X509_free(x509);
  21110. wolfSSL_EVP_PKEY_free(pkey);
  21111. } else if (ret < 0) {
  21112. return WOLFSSL_ERROR_WANT_X509_LOOKUP;
  21113. }
  21114. }
  21115. if ((ret = CertSetupCbWrapper(ssl)) != 0)
  21116. return ret;
  21117. #endif
  21118. /* don't send client cert or cert verify if user hasn't provided
  21119. cert and private key */
  21120. if (ssl->buffers.certificate && ssl->buffers.certificate->buffer) {
  21121. #ifdef HAVE_PK_CALLBACKS
  21122. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  21123. WOLFSSL_MSG("Using PK for client private key");
  21124. ssl->options.sendVerify = SEND_CERT;
  21125. }
  21126. #endif
  21127. if (ssl->buffers.key && ssl->buffers.key->buffer) {
  21128. ssl->options.sendVerify = SEND_CERT;
  21129. }
  21130. }
  21131. #ifdef OPENSSL_EXTRA
  21132. else
  21133. #else
  21134. else if (IsTLS(ssl))
  21135. #endif
  21136. {
  21137. ssl->options.sendVerify = SEND_BLANK_CERT;
  21138. }
  21139. if (IsEncryptionOn(ssl, 0)) {
  21140. *inOutIdx += ssl->keys.padSz;
  21141. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  21142. if (ssl->options.startedETMRead)
  21143. *inOutIdx += MacSize(ssl);
  21144. #endif
  21145. }
  21146. WOLFSSL_LEAVE("DoCertificateRequest", 0);
  21147. WOLFSSL_END(WC_FUNC_CERTIFICATE_REQUEST_DO);
  21148. return 0;
  21149. }
  21150. #endif /* !NO_CERTS */
  21151. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  21152. static int CheckCurveId(int tlsCurveId)
  21153. {
  21154. int ret = ECC_CURVE_ERROR;
  21155. switch (tlsCurveId) {
  21156. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  21157. #ifndef NO_ECC_SECP
  21158. case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
  21159. #endif /* !NO_ECC_SECP */
  21160. #ifdef HAVE_ECC_SECPR2
  21161. case WOLFSSL_ECC_SECP160R2: return ECC_SECP160R2_OID;
  21162. #endif /* HAVE_ECC_SECPR2 */
  21163. #ifdef HAVE_ECC_KOBLITZ
  21164. case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID;
  21165. #endif /* HAVE_ECC_KOBLITZ */
  21166. #endif
  21167. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  21168. #ifndef NO_ECC_SECP
  21169. case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
  21170. #endif /* !NO_ECC_SECP */
  21171. #ifdef HAVE_ECC_KOBLITZ
  21172. case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID;
  21173. #endif /* HAVE_ECC_KOBLITZ */
  21174. #endif
  21175. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  21176. #ifndef NO_ECC_SECP
  21177. case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
  21178. #endif /* !NO_ECC_SECP */
  21179. #ifdef HAVE_ECC_KOBLITZ
  21180. case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID;
  21181. #endif /* HAVE_ECC_KOBLITZ */
  21182. #endif
  21183. #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
  21184. case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
  21185. #endif
  21186. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  21187. #ifndef NO_ECC_SECP
  21188. case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
  21189. #endif /* !NO_ECC_SECP */
  21190. #ifdef HAVE_ECC_KOBLITZ
  21191. case WOLFSSL_ECC_SECP256K1: return ECC_SECP256K1_OID;
  21192. #endif /* HAVE_ECC_KOBLITZ */
  21193. #ifdef HAVE_ECC_BRAINPOOL
  21194. case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID;
  21195. #endif /* HAVE_ECC_BRAINPOOL */
  21196. #endif
  21197. #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
  21198. case WOLFSSL_ECC_X448: return ECC_X448_OID;
  21199. #endif
  21200. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  21201. #ifndef NO_ECC_SECP
  21202. case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
  21203. #endif /* !NO_ECC_SECP */
  21204. #ifdef HAVE_ECC_BRAINPOOL
  21205. case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID;
  21206. #endif /* HAVE_ECC_BRAINPOOL */
  21207. #endif
  21208. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  21209. #ifdef HAVE_ECC_BRAINPOOL
  21210. case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
  21211. #endif /* HAVE_ECC_BRAINPOOL */
  21212. #endif
  21213. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  21214. #ifndef NO_ECC_SECP
  21215. case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
  21216. #endif /* !NO_ECC_SECP */
  21217. #endif
  21218. default: break;
  21219. }
  21220. return ret;
  21221. }
  21222. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  21223. /* Persistable DoServerKeyExchange arguments */
  21224. typedef struct DskeArgs {
  21225. byte* output; /* not allocated */
  21226. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21227. defined(HAVE_CURVE448)
  21228. byte* verifySig;
  21229. #endif
  21230. word32 idx;
  21231. word32 begin;
  21232. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21233. defined(HAVE_CURVE448)
  21234. word16 verifySigSz;
  21235. #endif
  21236. word16 sigSz;
  21237. byte sigAlgo;
  21238. byte hashAlgo;
  21239. #if !defined(NO_RSA) && defined(WC_RSA_PSS)
  21240. int bits;
  21241. #endif
  21242. } DskeArgs;
  21243. static void FreeDskeArgs(WOLFSSL* ssl, void* pArgs)
  21244. {
  21245. DskeArgs* args = (DskeArgs*)pArgs;
  21246. (void)ssl;
  21247. (void)args;
  21248. #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21249. defined(HAVE_CURVE448)
  21250. if (args->verifySig) {
  21251. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21252. args->verifySig = NULL;
  21253. }
  21254. #endif
  21255. }
  21256. #ifndef NO_DH
  21257. static int GetDhPublicKey(WOLFSSL* ssl, const byte* input, word32 size,
  21258. DskeArgs* args)
  21259. {
  21260. int ret = 0;
  21261. word16 length;
  21262. #ifdef HAVE_FFDHE
  21263. #ifdef HAVE_PUBLIC_FFDHE
  21264. const DhParams* params = NULL;
  21265. #endif
  21266. word16 group = 0;
  21267. #endif
  21268. if (ssl->buffers.weOwnDH) {
  21269. if (ssl->buffers.serverDH_P.buffer) {
  21270. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  21271. DYNAMIC_TYPE_PUBLIC_KEY);
  21272. ssl->buffers.serverDH_P.buffer = NULL;
  21273. }
  21274. if (ssl->buffers.serverDH_G.buffer) {
  21275. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  21276. DYNAMIC_TYPE_PUBLIC_KEY);
  21277. ssl->buffers.serverDH_G.buffer = NULL;
  21278. }
  21279. }
  21280. if (ssl->buffers.serverDH_Pub.buffer) {
  21281. XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
  21282. DYNAMIC_TYPE_PUBLIC_KEY);
  21283. ssl->buffers.serverDH_Pub.buffer = NULL;
  21284. }
  21285. /* p */
  21286. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  21287. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  21288. }
  21289. ato16(input + args->idx, &length);
  21290. args->idx += OPAQUE16_LEN;
  21291. if ((args->idx - args->begin) + length > size) {
  21292. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  21293. }
  21294. if (length < ssl->options.minDhKeySz) {
  21295. WOLFSSL_MSG("Server using a DH key that is too small");
  21296. SendAlert(ssl, alert_fatal, handshake_failure);
  21297. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  21298. }
  21299. if (length > ssl->options.maxDhKeySz) {
  21300. WOLFSSL_MSG("Server using a DH key that is too big");
  21301. SendAlert(ssl, alert_fatal, handshake_failure);
  21302. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  21303. }
  21304. ssl->buffers.serverDH_P.buffer =
  21305. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21306. if (ssl->buffers.serverDH_P.buffer) {
  21307. ssl->buffers.serverDH_P.length = length;
  21308. }
  21309. else {
  21310. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  21311. }
  21312. XMEMCPY(ssl->buffers.serverDH_P.buffer, input + args->idx,
  21313. length);
  21314. args->idx += length;
  21315. ssl->options.dhKeySz = length;
  21316. /* g */
  21317. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  21318. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  21319. DYNAMIC_TYPE_PUBLIC_KEY);
  21320. ssl->buffers.serverDH_P.buffer = NULL;
  21321. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  21322. }
  21323. ato16(input + args->idx, &length);
  21324. args->idx += OPAQUE16_LEN;
  21325. if ((args->idx - args->begin) + length > size) {
  21326. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  21327. DYNAMIC_TYPE_PUBLIC_KEY);
  21328. ssl->buffers.serverDH_P.buffer = NULL;
  21329. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  21330. }
  21331. if (length > ssl->options.maxDhKeySz) {
  21332. WOLFSSL_MSG("Server using a DH key generator that is too big");
  21333. SendAlert(ssl, alert_fatal, handshake_failure);
  21334. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  21335. DYNAMIC_TYPE_PUBLIC_KEY);
  21336. ssl->buffers.serverDH_P.buffer = NULL;
  21337. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  21338. }
  21339. ssl->buffers.serverDH_G.buffer =
  21340. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21341. if (ssl->buffers.serverDH_G.buffer) {
  21342. ssl->buffers.serverDH_G.length = length;
  21343. }
  21344. else {
  21345. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  21346. DYNAMIC_TYPE_PUBLIC_KEY);
  21347. ssl->buffers.serverDH_P.buffer = NULL;
  21348. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  21349. }
  21350. XMEMCPY(ssl->buffers.serverDH_G.buffer, input + args->idx,
  21351. length);
  21352. args->idx += length;
  21353. /* pub */
  21354. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  21355. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  21356. DYNAMIC_TYPE_PUBLIC_KEY);
  21357. ssl->buffers.serverDH_P.buffer = NULL;
  21358. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  21359. DYNAMIC_TYPE_PUBLIC_KEY);
  21360. ssl->buffers.serverDH_G.buffer = NULL;
  21361. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  21362. }
  21363. ato16(input + args->idx, &length);
  21364. args->idx += OPAQUE16_LEN;
  21365. if ((args->idx - args->begin) + length > size) {
  21366. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  21367. DYNAMIC_TYPE_PUBLIC_KEY);
  21368. ssl->buffers.serverDH_P.buffer = NULL;
  21369. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  21370. DYNAMIC_TYPE_PUBLIC_KEY);
  21371. ssl->buffers.serverDH_G.buffer = NULL;
  21372. ERROR_OUT(BUFFER_ERROR, exit_gdpk);
  21373. }
  21374. if (length > ssl->options.maxDhKeySz) {
  21375. WOLFSSL_MSG("Server using a public DH key that is too big");
  21376. SendAlert(ssl, alert_fatal, handshake_failure);
  21377. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  21378. DYNAMIC_TYPE_PUBLIC_KEY);
  21379. ssl->buffers.serverDH_P.buffer = NULL;
  21380. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  21381. DYNAMIC_TYPE_PUBLIC_KEY);
  21382. ssl->buffers.serverDH_G.buffer = NULL;
  21383. ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
  21384. }
  21385. ssl->buffers.serverDH_Pub.buffer =
  21386. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  21387. if (ssl->buffers.serverDH_Pub.buffer) {
  21388. ssl->buffers.serverDH_Pub.length = length;
  21389. }
  21390. else {
  21391. XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
  21392. DYNAMIC_TYPE_PUBLIC_KEY);
  21393. ssl->buffers.serverDH_P.buffer = NULL;
  21394. XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
  21395. DYNAMIC_TYPE_PUBLIC_KEY);
  21396. ssl->buffers.serverDH_G.buffer = NULL;
  21397. ERROR_OUT(MEMORY_ERROR, exit_gdpk);
  21398. }
  21399. XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
  21400. length);
  21401. ssl->buffers.weOwnDH = 1;
  21402. args->idx += length;
  21403. #ifdef HAVE_FFDHE
  21404. switch (ssl->options.dhKeySz) {
  21405. #ifdef HAVE_FFDHE_2048
  21406. case 2048/8:
  21407. #ifdef HAVE_PUBLIC_FFDHE
  21408. params = wc_Dh_ffdhe2048_Get();
  21409. #endif
  21410. group = WOLFSSL_FFDHE_2048;
  21411. break;
  21412. #endif
  21413. #ifdef HAVE_FFDHE_3072
  21414. case 3072/8:
  21415. #ifdef HAVE_PUBLIC_FFDHE
  21416. params = wc_Dh_ffdhe3072_Get();
  21417. #endif
  21418. group = WOLFSSL_FFDHE_3072;
  21419. break;
  21420. #endif
  21421. #ifdef HAVE_FFDHE_4096
  21422. case 4096/8:
  21423. #ifdef HAVE_PUBLIC_FFDHE
  21424. params = wc_Dh_ffdhe4096_Get();
  21425. #endif
  21426. group = WOLFSSL_FFDHE_4096;
  21427. break;
  21428. #endif
  21429. #ifdef HAVE_FFDHE_6144
  21430. case 6144/8:
  21431. #ifdef HAVE_PUBLIC_FFDHE
  21432. params = wc_Dh_ffdhe6144_Get();
  21433. #endif
  21434. group = WOLFSSL_FFDHE_6144;
  21435. break;
  21436. #endif
  21437. #ifdef HAVE_FFDHE_8192
  21438. case 8192/8:
  21439. #ifdef HAVE_PUBLIC_FFDHE
  21440. params = wc_Dh_ffdhe8192_Get();
  21441. #endif
  21442. group = WOLFSSL_FFDHE_8192;
  21443. break;
  21444. #endif
  21445. default:
  21446. break;
  21447. }
  21448. #ifdef HAVE_PUBLIC_FFDHE
  21449. if (params == NULL || params->g_len != ssl->buffers.serverDH_G.length ||
  21450. (XMEMCMP(ssl->buffers.serverDH_G.buffer, params->g,
  21451. params->g_len) != 0) ||
  21452. (XMEMCMP(ssl->buffers.serverDH_P.buffer, params->p,
  21453. params->p_len) != 0))
  21454. #else
  21455. if (!wc_DhCmpNamedKey(group, 1,
  21456. ssl->buffers.serverDH_P.buffer, ssl->buffers.serverDH_P.length,
  21457. ssl->buffers.serverDH_G.buffer, ssl->buffers.serverDH_G.length,
  21458. NULL, 0))
  21459. #endif
  21460. {
  21461. WOLFSSL_MSG("Server not using FFDHE parameters");
  21462. #ifdef WOLFSSL_REQUIRE_FFDHE
  21463. SendAlert(ssl, alert_fatal, handshake_failure);
  21464. ERROR_OUT(DH_PARAMS_NOT_FFDHE_E, exit_gdpk);
  21465. #endif
  21466. }
  21467. else {
  21468. ssl->namedGroup = group;
  21469. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \
  21470. !defined(HAVE_SELFTEST)
  21471. ssl->options.dhDoKeyTest = 0;
  21472. #endif
  21473. }
  21474. #endif /* HAVE_FFDHE */
  21475. exit_gdpk:
  21476. return ret;
  21477. }
  21478. #endif
  21479. /* handle processing of server_key_exchange (12) */
  21480. static int DoServerKeyExchange(WOLFSSL* ssl, const byte* input,
  21481. word32* inOutIdx, word32 size)
  21482. {
  21483. int ret = 0;
  21484. #ifdef WOLFSSL_ASYNC_CRYPT
  21485. DskeArgs* args = NULL;
  21486. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  21487. #else
  21488. DskeArgs args[1];
  21489. #endif
  21490. (void)input;
  21491. (void)size;
  21492. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  21493. WOLFSSL_ENTER("DoServerKeyExchange");
  21494. #ifdef WOLFSSL_ASYNC_CRYPT
  21495. if (ssl->async == NULL) {
  21496. ssl->async = (struct WOLFSSL_ASYNC*)
  21497. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  21498. DYNAMIC_TYPE_ASYNC);
  21499. if (ssl->async == NULL)
  21500. ERROR_OUT(MEMORY_E, exit_dske);
  21501. }
  21502. args = (DskeArgs*)ssl->async->args;
  21503. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  21504. if (ret != WC_NOT_PENDING_E) {
  21505. /* Check for error */
  21506. if (ret < 0)
  21507. goto exit_dske;
  21508. }
  21509. else
  21510. #endif
  21511. {
  21512. /* Reset state */
  21513. ret = 0;
  21514. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  21515. XMEMSET(args, 0, sizeof(DskeArgs));
  21516. args->idx = *inOutIdx;
  21517. args->begin = *inOutIdx;
  21518. args->sigAlgo = ssl->specs.sig_algo;
  21519. args->hashAlgo = sha_mac;
  21520. #ifdef WOLFSSL_ASYNC_CRYPT
  21521. ssl->async->freeArgs = FreeDskeArgs;
  21522. #endif
  21523. }
  21524. switch(ssl->options.asyncState)
  21525. {
  21526. case TLS_ASYNC_BEGIN:
  21527. {
  21528. #ifdef WOLFSSL_CALLBACKS
  21529. if (ssl->hsInfoOn)
  21530. AddPacketName(ssl, "ServerKeyExchange");
  21531. if (ssl->toInfoOn)
  21532. AddLateName("ServerKeyExchange", &ssl->timeoutInfo);
  21533. #endif
  21534. switch(ssl->specs.kea)
  21535. {
  21536. #ifndef NO_PSK
  21537. case psk_kea:
  21538. {
  21539. int srvHintLen;
  21540. word16 length;
  21541. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  21542. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21543. }
  21544. ato16(input + args->idx, &length);
  21545. args->idx += OPAQUE16_LEN;
  21546. if ((args->idx - args->begin) + length > size) {
  21547. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21548. }
  21549. /* get PSK server hint from the wire */
  21550. srvHintLen = min(length, MAX_PSK_ID_LEN);
  21551. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  21552. srvHintLen);
  21553. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  21554. args->idx += length;
  21555. break;
  21556. }
  21557. #endif /* !NO_PSK */
  21558. #ifndef NO_DH
  21559. case diffie_hellman_kea:
  21560. {
  21561. ret = GetDhPublicKey(ssl, input, size, args);
  21562. if (ret != 0)
  21563. goto exit_dske;
  21564. break;
  21565. }
  21566. #endif /* !NO_DH */
  21567. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21568. defined(HAVE_CURVE448)
  21569. case ecc_diffie_hellman_kea:
  21570. {
  21571. byte b;
  21572. #ifdef HAVE_ECC
  21573. int curveId;
  21574. #endif
  21575. int curveOid;
  21576. word16 length;
  21577. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  21578. OPAQUE8_LEN > size) {
  21579. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21580. }
  21581. b = input[args->idx++];
  21582. if (b != named_curve) {
  21583. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  21584. }
  21585. args->idx += 1; /* curve type, eat leading 0 */
  21586. b = input[args->idx++];
  21587. if ((curveOid = CheckCurveId(b)) < 0) {
  21588. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  21589. }
  21590. ssl->ecdhCurveOID = curveOid;
  21591. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  21592. ssl->namedGroup = 0;
  21593. #endif
  21594. length = input[args->idx++];
  21595. if ((args->idx - args->begin) + length > size) {
  21596. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21597. }
  21598. #ifdef HAVE_CURVE25519
  21599. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  21600. if (ssl->peerX25519Key == NULL) {
  21601. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  21602. (void**)&ssl->peerX25519Key);
  21603. if (ret != 0) {
  21604. goto exit_dske;
  21605. }
  21606. } else if (ssl->peerX25519KeyPresent) {
  21607. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  21608. ssl->peerX25519Key);
  21609. ssl->peerX25519KeyPresent = 0;
  21610. if (ret != 0) {
  21611. goto exit_dske;
  21612. }
  21613. }
  21614. if ((ret = wc_curve25519_check_public(
  21615. input + args->idx, length,
  21616. EC25519_LITTLE_ENDIAN)) != 0) {
  21617. #ifdef WOLFSSL_EXTRA_ALERTS
  21618. if (ret == BUFFER_E)
  21619. SendAlert(ssl, alert_fatal, decode_error);
  21620. else if (ret == ECC_OUT_OF_RANGE_E)
  21621. SendAlert(ssl, alert_fatal, bad_record_mac);
  21622. else {
  21623. SendAlert(ssl, alert_fatal, illegal_parameter);
  21624. }
  21625. #endif
  21626. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21627. }
  21628. if (wc_curve25519_import_public_ex(input + args->idx,
  21629. length, ssl->peerX25519Key,
  21630. EC25519_LITTLE_ENDIAN) != 0) {
  21631. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21632. }
  21633. args->idx += length;
  21634. ssl->peerX25519KeyPresent = 1;
  21635. break;
  21636. }
  21637. #endif
  21638. #ifdef HAVE_CURVE448
  21639. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  21640. if (ssl->peerX448Key == NULL) {
  21641. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  21642. (void**)&ssl->peerX448Key);
  21643. if (ret != 0) {
  21644. goto exit_dske;
  21645. }
  21646. } else if (ssl->peerX448KeyPresent) {
  21647. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  21648. ssl->peerX448Key);
  21649. ssl->peerX448KeyPresent = 0;
  21650. if (ret != 0) {
  21651. goto exit_dske;
  21652. }
  21653. }
  21654. if ((ret = wc_curve448_check_public(
  21655. input + args->idx, length,
  21656. EC448_LITTLE_ENDIAN)) != 0) {
  21657. #ifdef WOLFSSL_EXTRA_ALERTS
  21658. if (ret == BUFFER_E)
  21659. SendAlert(ssl, alert_fatal, decode_error);
  21660. else if (ret == ECC_OUT_OF_RANGE_E)
  21661. SendAlert(ssl, alert_fatal, bad_record_mac);
  21662. else {
  21663. SendAlert(ssl, alert_fatal, illegal_parameter);
  21664. }
  21665. #endif
  21666. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21667. }
  21668. if (wc_curve448_import_public_ex(input + args->idx,
  21669. length, ssl->peerX448Key,
  21670. EC448_LITTLE_ENDIAN) != 0) {
  21671. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21672. }
  21673. args->idx += length;
  21674. ssl->peerX448KeyPresent = 1;
  21675. break;
  21676. }
  21677. #endif
  21678. #ifdef HAVE_ECC
  21679. if (ssl->peerEccKey == NULL) {
  21680. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  21681. (void**)&ssl->peerEccKey);
  21682. if (ret != 0) {
  21683. goto exit_dske;
  21684. }
  21685. } else if (ssl->peerEccKeyPresent) {
  21686. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  21687. ssl->peerEccKeyPresent = 0;
  21688. if (ret != 0) {
  21689. goto exit_dske;
  21690. }
  21691. }
  21692. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  21693. if (wc_ecc_import_x963_ex(input + args->idx, length,
  21694. ssl->peerEccKey, curveId) != 0) {
  21695. #ifdef WOLFSSL_EXTRA_ALERTS
  21696. SendAlert(ssl, alert_fatal, illegal_parameter);
  21697. #endif
  21698. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21699. }
  21700. args->idx += length;
  21701. ssl->peerEccKeyPresent = 1;
  21702. #endif
  21703. break;
  21704. }
  21705. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  21706. #if !defined(NO_DH) && !defined(NO_PSK)
  21707. case dhe_psk_kea:
  21708. {
  21709. int srvHintLen;
  21710. word16 length;
  21711. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  21712. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21713. }
  21714. ato16(input + args->idx, &length);
  21715. args->idx += OPAQUE16_LEN;
  21716. if ((args->idx - args->begin) + length > size) {
  21717. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21718. }
  21719. /* get PSK server hint from the wire */
  21720. srvHintLen = min(length, MAX_PSK_ID_LEN);
  21721. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  21722. srvHintLen);
  21723. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  21724. args->idx += length;
  21725. ret = GetDhPublicKey(ssl, input, size, args);
  21726. if (ret != 0)
  21727. goto exit_dske;
  21728. break;
  21729. }
  21730. #endif /* !NO_DH && !NO_PSK */
  21731. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  21732. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  21733. case ecdhe_psk_kea:
  21734. {
  21735. byte b;
  21736. int curveOid, curveId;
  21737. int srvHintLen;
  21738. word16 length;
  21739. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  21740. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21741. }
  21742. ato16(input + args->idx, &length);
  21743. args->idx += OPAQUE16_LEN;
  21744. if ((args->idx - args->begin) + length > size) {
  21745. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21746. }
  21747. /* get PSK server hint from the wire */
  21748. srvHintLen = min(length, MAX_PSK_ID_LEN);
  21749. XMEMCPY(ssl->arrays->server_hint, input + args->idx,
  21750. srvHintLen);
  21751. ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */
  21752. args->idx += length;
  21753. if ((args->idx - args->begin) + ENUM_LEN + OPAQUE16_LEN +
  21754. OPAQUE8_LEN > size) {
  21755. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21756. }
  21757. /* Check curve name and ID */
  21758. b = input[args->idx++];
  21759. if (b != named_curve) {
  21760. ERROR_OUT(ECC_CURVETYPE_ERROR, exit_dske);
  21761. }
  21762. args->idx += 1; /* curve type, eat leading 0 */
  21763. b = input[args->idx++];
  21764. if ((curveOid = CheckCurveId(b)) < 0) {
  21765. ERROR_OUT(ECC_CURVE_ERROR, exit_dske);
  21766. }
  21767. length = input[args->idx++];
  21768. if ((args->idx - args->begin) + length > size) {
  21769. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21770. }
  21771. #ifdef HAVE_CURVE25519
  21772. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  21773. if (ssl->peerX25519Key == NULL) {
  21774. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  21775. (void**)&ssl->peerX25519Key);
  21776. if (ret != 0) {
  21777. goto exit_dske;
  21778. }
  21779. } else if (ssl->peerEccKeyPresent) {
  21780. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  21781. ssl->peerX25519Key);
  21782. ssl->peerX25519KeyPresent = 0;
  21783. if (ret != 0) {
  21784. goto exit_dske;
  21785. }
  21786. }
  21787. if ((ret = wc_curve25519_check_public(
  21788. input + args->idx, length,
  21789. EC25519_LITTLE_ENDIAN)) != 0) {
  21790. #ifdef WOLFSSL_EXTRA_ALERTS
  21791. if (ret == BUFFER_E)
  21792. SendAlert(ssl, alert_fatal, decode_error);
  21793. else if (ret == ECC_OUT_OF_RANGE_E)
  21794. SendAlert(ssl, alert_fatal, bad_record_mac);
  21795. else {
  21796. SendAlert(ssl, alert_fatal, illegal_parameter);
  21797. }
  21798. #endif
  21799. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21800. }
  21801. if (wc_curve25519_import_public_ex(input + args->idx,
  21802. length, ssl->peerX25519Key,
  21803. EC25519_LITTLE_ENDIAN) != 0) {
  21804. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21805. }
  21806. args->idx += length;
  21807. ssl->peerX25519KeyPresent = 1;
  21808. break;
  21809. }
  21810. #endif
  21811. #ifdef HAVE_CURVE448
  21812. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  21813. if (ssl->peerX448Key == NULL) {
  21814. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  21815. (void**)&ssl->peerX448Key);
  21816. if (ret != 0) {
  21817. goto exit_dske;
  21818. }
  21819. } else if (ssl->peerEccKeyPresent) {
  21820. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  21821. ssl->peerX448Key);
  21822. ssl->peerX448KeyPresent = 0;
  21823. if (ret != 0) {
  21824. goto exit_dske;
  21825. }
  21826. }
  21827. if ((ret = wc_curve448_check_public(
  21828. input + args->idx, length,
  21829. EC448_LITTLE_ENDIAN)) != 0) {
  21830. #ifdef WOLFSSL_EXTRA_ALERTS
  21831. if (ret == BUFFER_E)
  21832. SendAlert(ssl, alert_fatal, decode_error);
  21833. else if (ret == ECC_OUT_OF_RANGE_E)
  21834. SendAlert(ssl, alert_fatal, bad_record_mac);
  21835. else {
  21836. SendAlert(ssl, alert_fatal, illegal_parameter);
  21837. }
  21838. #endif
  21839. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21840. }
  21841. if (wc_curve448_import_public_ex(input + args->idx,
  21842. length, ssl->peerX448Key,
  21843. EC448_LITTLE_ENDIAN) != 0) {
  21844. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21845. }
  21846. args->idx += length;
  21847. ssl->peerX448KeyPresent = 1;
  21848. break;
  21849. }
  21850. #endif
  21851. if (ssl->peerEccKey == NULL) {
  21852. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  21853. (void**)&ssl->peerEccKey);
  21854. if (ret != 0) {
  21855. goto exit_dske;
  21856. }
  21857. } else if (ssl->peerEccKeyPresent) {
  21858. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC, ssl->peerEccKey);
  21859. ssl->peerEccKeyPresent = 0;
  21860. if (ret != 0) {
  21861. goto exit_dske;
  21862. }
  21863. }
  21864. curveId = wc_ecc_get_oid(curveOid, NULL, NULL);
  21865. if (wc_ecc_import_x963_ex(input + args->idx, length,
  21866. ssl->peerEccKey, curveId) != 0) {
  21867. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske);
  21868. }
  21869. args->idx += length;
  21870. ssl->peerEccKeyPresent = 1;
  21871. break;
  21872. }
  21873. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  21874. default:
  21875. ret = BAD_KEA_TYPE_E;
  21876. } /* switch(ssl->specs.kea) */
  21877. /* Check for error */
  21878. if (ret != 0) {
  21879. goto exit_dske;
  21880. }
  21881. /* Advance state and proceed */
  21882. ssl->options.asyncState = TLS_ASYNC_BUILD;
  21883. } /* case TLS_ASYNC_BEGIN */
  21884. FALL_THROUGH;
  21885. case TLS_ASYNC_BUILD:
  21886. {
  21887. switch(ssl->specs.kea)
  21888. {
  21889. case psk_kea:
  21890. case dhe_psk_kea:
  21891. case ecdhe_psk_kea:
  21892. {
  21893. /* Nothing to do in this sub-state */
  21894. break;
  21895. }
  21896. case diffie_hellman_kea:
  21897. case ecc_diffie_hellman_kea:
  21898. {
  21899. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  21900. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  21901. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  21902. #else
  21903. enum wc_HashType hashType;
  21904. word16 verifySz;
  21905. byte sigAlgo;
  21906. if (ssl->options.usingAnon_cipher) {
  21907. break;
  21908. }
  21909. verifySz = (word16)(args->idx - args->begin);
  21910. if (verifySz > MAX_DH_SZ) {
  21911. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21912. }
  21913. if (IsAtLeastTLSv1_2(ssl)) {
  21914. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN >
  21915. size) {
  21916. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21917. }
  21918. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  21919. &sigAlgo);
  21920. #ifndef NO_RSA
  21921. if (sigAlgo == rsa_pss_sa_algo &&
  21922. args->sigAlgo == rsa_sa_algo) {
  21923. args->sigAlgo = sigAlgo;
  21924. }
  21925. else
  21926. #endif
  21927. #ifdef HAVE_ED25519
  21928. if (sigAlgo == ed25519_sa_algo &&
  21929. args->sigAlgo == ecc_dsa_sa_algo) {
  21930. args->sigAlgo = sigAlgo;
  21931. }
  21932. else
  21933. #endif
  21934. #ifdef HAVE_ED448
  21935. if (sigAlgo == ed448_sa_algo &&
  21936. args->sigAlgo == ecc_dsa_sa_algo) {
  21937. args->sigAlgo = sigAlgo;
  21938. }
  21939. else
  21940. #endif
  21941. /* Signature algorithm from message must match signature
  21942. * algorithm in cipher suite. */
  21943. if (sigAlgo != args->sigAlgo) {
  21944. ERROR_OUT(ALGO_ID_E, exit_dske);
  21945. }
  21946. args->idx += 2;
  21947. hashType = HashAlgoToType(args->hashAlgo);
  21948. if (hashType == WC_HASH_TYPE_NONE) {
  21949. ERROR_OUT(ALGO_ID_E, exit_dske);
  21950. }
  21951. } else {
  21952. /* only using sha and md5 for rsa */
  21953. #ifndef NO_OLD_TLS
  21954. hashType = WC_HASH_TYPE_SHA;
  21955. if (args->sigAlgo == rsa_sa_algo) {
  21956. hashType = WC_HASH_TYPE_MD5_SHA;
  21957. }
  21958. #else
  21959. ERROR_OUT(ALGO_ID_E, exit_dske);
  21960. #endif
  21961. }
  21962. /* signature */
  21963. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  21964. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21965. }
  21966. ato16(input + args->idx, &args->verifySigSz);
  21967. args->idx += OPAQUE16_LEN;
  21968. if ((args->idx - args->begin) + args->verifySigSz > size) {
  21969. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21970. }
  21971. /* buffer for signature */
  21972. ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + verifySz,
  21973. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  21974. if (ssl->buffers.sig.buffer == NULL) {
  21975. ERROR_OUT(MEMORY_E, exit_dske);
  21976. }
  21977. ssl->buffers.sig.length = SEED_LEN + verifySz;
  21978. /* build message to hash */
  21979. XMEMCPY(ssl->buffers.sig.buffer,
  21980. ssl->arrays->clientRandom, RAN_LEN);
  21981. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN],
  21982. ssl->arrays->serverRandom, RAN_LEN);
  21983. XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2],
  21984. input + args->begin, verifySz); /* message */
  21985. if (args->sigAlgo != ed25519_sa_algo) {
  21986. int digest_sz = wc_HashGetDigestSize(hashType);
  21987. if (digest_sz <= 0) {
  21988. ERROR_OUT(BUFFER_ERROR, exit_dske);
  21989. }
  21990. ssl->buffers.digest.length = (unsigned int)digest_sz;
  21991. /* buffer for hash */
  21992. ssl->buffers.digest.buffer = (byte*)XMALLOC(
  21993. ssl->buffers.digest.length, ssl->heap,
  21994. DYNAMIC_TYPE_DIGEST);
  21995. if (ssl->buffers.digest.buffer == NULL) {
  21996. ERROR_OUT(MEMORY_E, exit_dske);
  21997. }
  21998. /* Perform hash */
  21999. ret = wc_Hash(hashType, ssl->buffers.sig.buffer,
  22000. ssl->buffers.sig.length,
  22001. ssl->buffers.digest.buffer,
  22002. ssl->buffers.digest.length);
  22003. if (ret != 0) {
  22004. goto exit_dske;
  22005. }
  22006. }
  22007. switch (args->sigAlgo)
  22008. {
  22009. #ifndef NO_RSA
  22010. #ifdef WC_RSA_PSS
  22011. case rsa_pss_sa_algo:
  22012. #endif
  22013. case rsa_sa_algo:
  22014. {
  22015. if (ssl->peerRsaKey == NULL ||
  22016. !ssl->peerRsaKeyPresent) {
  22017. ERROR_OUT(NO_PEER_KEY, exit_dske);
  22018. }
  22019. break;
  22020. }
  22021. #endif /* !NO_RSA */
  22022. #ifdef HAVE_ECC
  22023. case ecc_dsa_sa_algo:
  22024. {
  22025. if (!ssl->peerEccDsaKeyPresent) {
  22026. ERROR_OUT(NO_PEER_KEY, exit_dske);
  22027. }
  22028. break;
  22029. }
  22030. #endif /* HAVE_ECC */
  22031. #if defined(HAVE_ED25519)
  22032. case ed25519_sa_algo:
  22033. {
  22034. if (!ssl->peerEd25519KeyPresent) {
  22035. ERROR_OUT(NO_PEER_KEY, exit_dske);
  22036. }
  22037. break;
  22038. }
  22039. #endif /* HAVE_ED25519 */
  22040. #if defined(HAVE_ED448)
  22041. case ed448_sa_algo:
  22042. {
  22043. if (!ssl->peerEd448KeyPresent) {
  22044. ERROR_OUT(NO_PEER_KEY, exit_dske);
  22045. }
  22046. break;
  22047. }
  22048. #endif /* HAVE_ED448 */
  22049. default:
  22050. ret = ALGO_ID_E;
  22051. } /* switch (args->sigAlgo) */
  22052. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  22053. break;
  22054. }
  22055. default:
  22056. ret = BAD_KEA_TYPE_E;
  22057. } /* switch(ssl->specs.kea) */
  22058. /* Check for error */
  22059. if (ret != 0) {
  22060. goto exit_dske;
  22061. }
  22062. /* Advance state and proceed */
  22063. ssl->options.asyncState = TLS_ASYNC_DO;
  22064. } /* case TLS_ASYNC_BUILD */
  22065. FALL_THROUGH;
  22066. case TLS_ASYNC_DO:
  22067. {
  22068. switch(ssl->specs.kea)
  22069. {
  22070. case psk_kea:
  22071. case dhe_psk_kea:
  22072. case ecdhe_psk_kea:
  22073. {
  22074. /* Nothing to do in this sub-state */
  22075. break;
  22076. }
  22077. case diffie_hellman_kea:
  22078. case ecc_diffie_hellman_kea:
  22079. {
  22080. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  22081. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  22082. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  22083. #else
  22084. if (ssl->options.usingAnon_cipher) {
  22085. break;
  22086. }
  22087. if (args->verifySig == NULL) {
  22088. args->verifySig = (byte*)XMALLOC(args->verifySigSz,
  22089. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22090. if (args->verifySig == NULL) {
  22091. ERROR_OUT(MEMORY_E, exit_dske);
  22092. }
  22093. XMEMCPY(args->verifySig, input + args->idx,
  22094. args->verifySigSz);
  22095. }
  22096. switch (args->sigAlgo)
  22097. {
  22098. #ifndef NO_RSA
  22099. #ifdef WC_RSA_PSS
  22100. case rsa_pss_sa_algo:
  22101. #endif
  22102. case rsa_sa_algo:
  22103. {
  22104. ret = RsaVerify(ssl,
  22105. args->verifySig, args->verifySigSz,
  22106. &args->output,
  22107. args->sigAlgo, args->hashAlgo,
  22108. ssl->peerRsaKey,
  22109. #ifdef HAVE_PK_CALLBACKS
  22110. &ssl->buffers.peerRsaKey
  22111. #else
  22112. NULL
  22113. #endif
  22114. );
  22115. if (ret >= 0) {
  22116. args->sigSz = (word16)ret;
  22117. #ifdef WC_RSA_PSS
  22118. args->bits = mp_count_bits(&ssl->peerRsaKey->n);
  22119. #endif
  22120. ret = 0;
  22121. }
  22122. #ifdef WOLFSSL_ASYNC_CRYPT
  22123. if (ret != WC_PENDING_E)
  22124. #endif
  22125. {
  22126. /* peerRsaKey */
  22127. FreeKey(ssl, DYNAMIC_TYPE_RSA,
  22128. (void**)&ssl->peerRsaKey);
  22129. ssl->peerRsaKeyPresent = 0;
  22130. }
  22131. break;
  22132. }
  22133. #endif /* !NO_RSA */
  22134. #ifdef HAVE_ECC
  22135. case ecc_dsa_sa_algo:
  22136. {
  22137. ret = EccVerify(ssl,
  22138. args->verifySig, args->verifySigSz,
  22139. ssl->buffers.digest.buffer,
  22140. ssl->buffers.digest.length,
  22141. ssl->peerEccDsaKey,
  22142. #ifdef HAVE_PK_CALLBACKS
  22143. &ssl->buffers.peerEccDsaKey
  22144. #else
  22145. NULL
  22146. #endif
  22147. );
  22148. #ifdef WOLFSSL_ASYNC_CRYPT
  22149. if (ret != WC_PENDING_E)
  22150. #endif
  22151. {
  22152. /* peerEccDsaKey */
  22153. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  22154. (void**)&ssl->peerEccDsaKey);
  22155. ssl->peerEccDsaKeyPresent = 0;
  22156. }
  22157. /* CLIENT: Data verified with cert's public key. */
  22158. ssl->options.peerAuthGood =
  22159. ssl->options.havePeerCert && (ret == 0);
  22160. break;
  22161. }
  22162. #endif /* HAVE_ECC */
  22163. #if defined(HAVE_ED25519)
  22164. case ed25519_sa_algo:
  22165. {
  22166. ret = Ed25519Verify(ssl,
  22167. args->verifySig, args->verifySigSz,
  22168. ssl->buffers.sig.buffer,
  22169. ssl->buffers.sig.length,
  22170. ssl->peerEd25519Key,
  22171. #ifdef HAVE_PK_CALLBACKS
  22172. &ssl->buffers.peerEd25519Key
  22173. #else
  22174. NULL
  22175. #endif
  22176. );
  22177. #ifdef WOLFSSL_ASYNC_CRYPT
  22178. if (ret != WC_PENDING_E)
  22179. #endif
  22180. {
  22181. /* peerEccDsaKey */
  22182. FreeKey(ssl, DYNAMIC_TYPE_ED25519,
  22183. (void**)&ssl->peerEd25519Key);
  22184. ssl->peerEd25519KeyPresent = 0;
  22185. }
  22186. /* CLIENT: Data verified with cert's public key. */
  22187. ssl->options.peerAuthGood =
  22188. ssl->options.havePeerCert && (ret == 0);
  22189. break;
  22190. }
  22191. #endif /* HAVE_ED25519 */
  22192. #if defined(HAVE_ED448)
  22193. case ed448_sa_algo:
  22194. {
  22195. ret = Ed448Verify(ssl,
  22196. args->verifySig, args->verifySigSz,
  22197. ssl->buffers.sig.buffer,
  22198. ssl->buffers.sig.length,
  22199. ssl->peerEd448Key,
  22200. #ifdef HAVE_PK_CALLBACKS
  22201. &ssl->buffers.peerEd448Key
  22202. #else
  22203. NULL
  22204. #endif
  22205. );
  22206. #ifdef WOLFSSL_ASYNC_CRYPT
  22207. if (ret != WC_PENDING_E)
  22208. #endif
  22209. {
  22210. /* peerEccDsaKey */
  22211. FreeKey(ssl, DYNAMIC_TYPE_ED448,
  22212. (void**)&ssl->peerEd448Key);
  22213. ssl->peerEd448KeyPresent = 0;
  22214. }
  22215. /* CLIENT: Data verified with cert's public key. */
  22216. ssl->options.peerAuthGood =
  22217. ssl->options.havePeerCert && (ret == 0);
  22218. break;
  22219. }
  22220. #endif /* HAVE_ED448 */
  22221. default:
  22222. ret = ALGO_ID_E;
  22223. } /* switch (sigAlgo) */
  22224. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  22225. break;
  22226. }
  22227. default:
  22228. ret = BAD_KEA_TYPE_E;
  22229. } /* switch(ssl->specs.kea) */
  22230. /* Check for error */
  22231. if (ret != 0) {
  22232. goto exit_dske;
  22233. }
  22234. /* Advance state and proceed */
  22235. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  22236. } /* case TLS_ASYNC_DO */
  22237. FALL_THROUGH;
  22238. case TLS_ASYNC_VERIFY:
  22239. {
  22240. switch(ssl->specs.kea)
  22241. {
  22242. case psk_kea:
  22243. case dhe_psk_kea:
  22244. case ecdhe_psk_kea:
  22245. {
  22246. /* Nothing to do in this sub-state */
  22247. break;
  22248. }
  22249. case diffie_hellman_kea:
  22250. case ecc_diffie_hellman_kea:
  22251. {
  22252. #if defined(NO_DH) && !defined(HAVE_ECC) && \
  22253. !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
  22254. ERROR_OUT(NOT_COMPILED_IN, exit_dske);
  22255. #else
  22256. if (ssl->options.usingAnon_cipher) {
  22257. break;
  22258. }
  22259. /* increment index after verify is done */
  22260. args->idx += args->verifySigSz;
  22261. switch(args->sigAlgo)
  22262. {
  22263. #ifndef NO_RSA
  22264. #ifdef WC_RSA_PSS
  22265. case rsa_pss_sa_algo:
  22266. #ifdef HAVE_SELFTEST
  22267. ret = wc_RsaPSS_CheckPadding(
  22268. ssl->buffers.digest.buffer,
  22269. ssl->buffers.digest.length,
  22270. args->output, args->sigSz,
  22271. HashAlgoToType(args->hashAlgo));
  22272. #else
  22273. ret = wc_RsaPSS_CheckPadding_ex(
  22274. ssl->buffers.digest.buffer,
  22275. ssl->buffers.digest.length,
  22276. args->output, args->sigSz,
  22277. HashAlgoToType(args->hashAlgo),
  22278. -1, args->bits);
  22279. #endif
  22280. if (ret != 0)
  22281. return ret;
  22282. /* CLIENT: Data verified with cert's public key. */
  22283. ssl->options.peerAuthGood =
  22284. ssl->options.havePeerCert;
  22285. break;
  22286. #endif
  22287. case rsa_sa_algo:
  22288. {
  22289. #if (defined(WOLFSSL_RENESAS_SCEPROTECT) && \
  22290. defined(WOLFSSL_RENESAS_SCEPROTECT_ECC)) || \
  22291. defined(WOLFSSL_RENESAS_TSIP_TLS)
  22292. /* already checked signature result by SCE */
  22293. /* skip the sign checks below */
  22294. if (Renesas_cmn_usable(ssl, 0)) {
  22295. break;
  22296. }
  22297. #endif
  22298. if (IsAtLeastTLSv1_2(ssl)) {
  22299. #ifdef WOLFSSL_SMALL_STACK
  22300. byte* encodedSig;
  22301. #else
  22302. byte encodedSig[MAX_ENCODED_SIG_SZ];
  22303. #endif
  22304. word32 encSigSz;
  22305. #ifdef WOLFSSL_SMALL_STACK
  22306. encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  22307. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22308. if (encodedSig == NULL) {
  22309. ERROR_OUT(MEMORY_E, exit_dske);
  22310. }
  22311. #endif
  22312. encSigSz = wc_EncodeSignature(encodedSig,
  22313. ssl->buffers.digest.buffer,
  22314. ssl->buffers.digest.length,
  22315. TypeHash(args->hashAlgo));
  22316. if (encSigSz != args->sigSz || !args->output ||
  22317. XMEMCMP(args->output, encodedSig,
  22318. min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  22319. ret = VERIFY_SIGN_ERROR;
  22320. }
  22321. #ifdef WOLFSSL_SMALL_STACK
  22322. XFREE(encodedSig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22323. #endif
  22324. if (ret != 0) {
  22325. goto exit_dske;
  22326. }
  22327. }
  22328. else if (args->sigSz != FINISHED_SZ ||
  22329. !args->output ||
  22330. XMEMCMP(args->output,
  22331. ssl->buffers.digest.buffer,
  22332. FINISHED_SZ) != 0) {
  22333. ERROR_OUT(VERIFY_SIGN_ERROR, exit_dske);
  22334. }
  22335. /* CLIENT: Data verified with cert's public key. */
  22336. ssl->options.peerAuthGood =
  22337. ssl->options.havePeerCert;
  22338. break;
  22339. }
  22340. #endif /* !NO_RSA */
  22341. #ifdef HAVE_ECC
  22342. case ecc_dsa_sa_algo:
  22343. /* Nothing to do in this algo */
  22344. break;
  22345. #endif /* HAVE_ECC */
  22346. #if defined(HAVE_ED25519)
  22347. case ed25519_sa_algo:
  22348. /* Nothing to do in this algo */
  22349. break;
  22350. #endif /* HAVE_ED25519 */
  22351. #if defined(HAVE_ED448)
  22352. case ed448_sa_algo:
  22353. /* Nothing to do in this algo */
  22354. break;
  22355. #endif /* HAVE_ED448 */
  22356. default:
  22357. ret = ALGO_ID_E;
  22358. } /* switch (sigAlgo) */
  22359. #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */
  22360. break;
  22361. }
  22362. default:
  22363. ret = BAD_KEA_TYPE_E;
  22364. } /* switch(ssl->specs.kea) */
  22365. /* Check for error */
  22366. if (ret != 0) {
  22367. goto exit_dske;
  22368. }
  22369. /* Advance state and proceed */
  22370. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  22371. } /* case TLS_ASYNC_VERIFY */
  22372. FALL_THROUGH;
  22373. case TLS_ASYNC_FINALIZE:
  22374. {
  22375. if (IsEncryptionOn(ssl, 0)) {
  22376. args->idx += ssl->keys.padSz;
  22377. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  22378. if (ssl->options.startedETMRead)
  22379. args->idx += MacSize(ssl);
  22380. #endif
  22381. }
  22382. /* Advance state and proceed */
  22383. ssl->options.asyncState = TLS_ASYNC_END;
  22384. } /* case TLS_ASYNC_FINALIZE */
  22385. FALL_THROUGH;
  22386. case TLS_ASYNC_END:
  22387. {
  22388. /* return index */
  22389. *inOutIdx = args->idx;
  22390. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  22391. break;
  22392. }
  22393. default:
  22394. ret = INPUT_CASE_ERROR;
  22395. } /* switch(ssl->options.asyncState) */
  22396. exit_dske:
  22397. WOLFSSL_LEAVE("DoServerKeyExchange", ret);
  22398. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_DO);
  22399. #ifdef WOLFSSL_ASYNC_CRYPT
  22400. /* Handle async operation */
  22401. if (ret == WC_PENDING_E) {
  22402. /* Mark message as not received so it can process again */
  22403. ssl->msgsReceived.got_server_key_exchange = 0;
  22404. return ret;
  22405. }
  22406. /* Cleanup async */
  22407. FreeAsyncCtx(ssl, 0);
  22408. #else
  22409. FreeDskeArgs(ssl, args);
  22410. #endif /* WOLFSSL_ASYNC_CRYPT */
  22411. /* Final cleanup */
  22412. FreeKeyExchange(ssl);
  22413. return ret;
  22414. }
  22415. typedef struct SckeArgs {
  22416. byte* output; /* not allocated */
  22417. byte* encSecret;
  22418. byte* input;
  22419. word32 encSz;
  22420. word32 length;
  22421. int sendSz;
  22422. int inputSz;
  22423. } SckeArgs;
  22424. static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
  22425. {
  22426. SckeArgs* args = (SckeArgs*)pArgs;
  22427. (void)ssl;
  22428. if (args->encSecret) {
  22429. XFREE(args->encSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
  22430. args->encSecret = NULL;
  22431. }
  22432. if (args->input) {
  22433. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  22434. args->input = NULL;
  22435. }
  22436. }
  22437. /* handle generation client_key_exchange (16) */
  22438. int SendClientKeyExchange(WOLFSSL* ssl)
  22439. {
  22440. int ret = 0;
  22441. #ifdef WOLFSSL_ASYNC_IO
  22442. SckeArgs* args = NULL;
  22443. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  22444. #else
  22445. SckeArgs args[1];
  22446. #endif
  22447. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  22448. WOLFSSL_ENTER("SendClientKeyExchange");
  22449. #ifdef OPENSSL_EXTRA
  22450. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  22451. ssl->cbmode = SSL_CB_MODE_WRITE;
  22452. if (ssl->CBIS != NULL)
  22453. ssl->CBIS(ssl, SSL_CB_CONNECT_LOOP, SSL_SUCCESS);
  22454. #endif
  22455. #ifdef WOLFSSL_ASYNC_IO
  22456. if (ssl->async == NULL) {
  22457. ssl->async = (struct WOLFSSL_ASYNC*)
  22458. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  22459. DYNAMIC_TYPE_ASYNC);
  22460. if (ssl->async == NULL)
  22461. ERROR_OUT(MEMORY_E, exit_scke);
  22462. }
  22463. args = (SckeArgs*)ssl->async->args;
  22464. #ifdef WOLFSSL_ASYNC_CRYPT
  22465. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  22466. if (ret != WC_NOT_PENDING_E) {
  22467. /* Check for error */
  22468. if (ret < 0)
  22469. goto exit_scke;
  22470. }
  22471. else
  22472. #endif
  22473. if (ssl->options.buildingMsg) {
  22474. /* Continue building the message */
  22475. }
  22476. else
  22477. #endif
  22478. {
  22479. /* Reset state */
  22480. ret = 0;
  22481. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  22482. XMEMSET(args, 0, sizeof(SckeArgs));
  22483. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  22484. * is not advanced yet */
  22485. ssl->options.buildingMsg = 1;
  22486. #ifdef WOLFSSL_ASYNC_IO
  22487. ssl->async->freeArgs = FreeSckeArgs;
  22488. #endif
  22489. }
  22490. switch(ssl->options.asyncState)
  22491. {
  22492. case TLS_ASYNC_BEGIN:
  22493. {
  22494. switch (ssl->specs.kea) {
  22495. #ifndef NO_RSA
  22496. case rsa_kea:
  22497. if (ssl->peerRsaKey == NULL ||
  22498. ssl->peerRsaKeyPresent == 0) {
  22499. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22500. }
  22501. break;
  22502. #endif
  22503. #ifndef NO_DH
  22504. case diffie_hellman_kea:
  22505. if (ssl->buffers.serverDH_P.buffer == NULL ||
  22506. ssl->buffers.serverDH_G.buffer == NULL ||
  22507. ssl->buffers.serverDH_Pub.buffer == NULL) {
  22508. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22509. }
  22510. break;
  22511. #endif /* NO_DH */
  22512. #ifndef NO_PSK
  22513. case psk_kea:
  22514. /* sanity check that PSK client callback has been set */
  22515. if (ssl->options.client_psk_cb == NULL) {
  22516. WOLFSSL_MSG("No client PSK callback set");
  22517. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  22518. }
  22519. break;
  22520. #endif /* NO_PSK */
  22521. #if !defined(NO_DH) && !defined(NO_PSK)
  22522. case dhe_psk_kea:
  22523. if (ssl->buffers.serverDH_P.buffer == NULL ||
  22524. ssl->buffers.serverDH_G.buffer == NULL ||
  22525. ssl->buffers.serverDH_Pub.buffer == NULL) {
  22526. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22527. }
  22528. /* sanity check that PSK client callback has been set */
  22529. if (ssl->options.client_psk_cb == NULL) {
  22530. WOLFSSL_MSG("No client PSK callback set");
  22531. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  22532. }
  22533. break;
  22534. #endif /* !NO_DH && !NO_PSK */
  22535. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22536. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22537. case ecdhe_psk_kea:
  22538. /* sanity check that PSK client callback has been set */
  22539. if (ssl->options.client_psk_cb == NULL) {
  22540. WOLFSSL_MSG("No client PSK callback set");
  22541. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  22542. }
  22543. #ifdef HAVE_CURVE25519
  22544. if (ssl->peerX25519KeyPresent) {
  22545. /* Check client ECC public key */
  22546. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  22547. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22548. }
  22549. #ifdef HAVE_PK_CALLBACKS
  22550. /* if callback then use it for shared secret */
  22551. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  22552. break;
  22553. }
  22554. #endif
  22555. /* create private key */
  22556. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  22557. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22558. if (ret != 0) {
  22559. goto exit_scke;
  22560. }
  22561. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  22562. ssl->peerX25519Key);
  22563. break;
  22564. }
  22565. #endif
  22566. #ifdef HAVE_CURVE448
  22567. if (ssl->peerX448KeyPresent) {
  22568. /* Check client ECC public key */
  22569. if (!ssl->peerX448Key) {
  22570. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22571. }
  22572. #ifdef HAVE_PK_CALLBACKS
  22573. /* if callback then use it for shared secret */
  22574. if (ssl->ctx->X448SharedSecretCb != NULL) {
  22575. break;
  22576. }
  22577. #endif
  22578. /* create private key */
  22579. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  22580. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22581. if (ret != 0) {
  22582. goto exit_scke;
  22583. }
  22584. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  22585. ssl->peerX448Key);
  22586. break;
  22587. }
  22588. #endif
  22589. /* Check client ECC public key */
  22590. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent ||
  22591. !ssl->peerEccKey->dp) {
  22592. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22593. }
  22594. #ifdef HAVE_PK_CALLBACKS
  22595. /* if callback then use it for shared secret */
  22596. if (ssl->ctx->EccSharedSecretCb != NULL) {
  22597. break;
  22598. }
  22599. #endif
  22600. /* create ephemeral private key */
  22601. ssl->hsType = DYNAMIC_TYPE_ECC;
  22602. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22603. if (ret != 0) {
  22604. goto exit_scke;
  22605. }
  22606. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, ssl->peerEccKey);
  22607. break;
  22608. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  22609. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22610. defined(HAVE_CURVE448)
  22611. case ecc_diffie_hellman_kea:
  22612. {
  22613. #ifdef HAVE_ECC
  22614. ecc_key* peerKey;
  22615. #endif
  22616. #ifdef HAVE_PK_CALLBACKS
  22617. /* if callback then use it for shared secret */
  22618. #ifdef HAVE_CURVE25519
  22619. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22620. if (ssl->ctx->X25519SharedSecretCb != NULL)
  22621. break;
  22622. }
  22623. else
  22624. #endif
  22625. #ifdef HAVE_CURVE448
  22626. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  22627. if (ssl->ctx->X448SharedSecretCb != NULL)
  22628. break;
  22629. }
  22630. else
  22631. #endif
  22632. #ifdef HAVE_ECC
  22633. if (ssl->ctx->EccSharedSecretCb != NULL) {
  22634. break;
  22635. }
  22636. else
  22637. #endif
  22638. {
  22639. }
  22640. #endif /* HAVE_PK_CALLBACKS */
  22641. #ifdef HAVE_CURVE25519
  22642. if (ssl->peerX25519KeyPresent) {
  22643. if (!ssl->peerX25519Key || !ssl->peerX25519Key->dp) {
  22644. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22645. }
  22646. /* create private key */
  22647. ssl->hsType = DYNAMIC_TYPE_CURVE25519;
  22648. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22649. if (ret != 0) {
  22650. goto exit_scke;
  22651. }
  22652. ret = X25519MakeKey(ssl, (curve25519_key*)ssl->hsKey,
  22653. ssl->peerX25519Key);
  22654. break;
  22655. }
  22656. #endif
  22657. #ifdef HAVE_CURVE448
  22658. if (ssl->peerX448KeyPresent) {
  22659. if (!ssl->peerX448Key) {
  22660. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22661. }
  22662. /* create private key */
  22663. ssl->hsType = DYNAMIC_TYPE_CURVE448;
  22664. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22665. if (ret != 0) {
  22666. goto exit_scke;
  22667. }
  22668. ret = X448MakeKey(ssl, (curve448_key*)ssl->hsKey,
  22669. ssl->peerX448Key);
  22670. break;
  22671. }
  22672. #endif
  22673. #ifdef HAVE_ECC
  22674. if (ssl->specs.static_ecdh) {
  22675. /* Note: EccDsa is really fixed Ecc key here */
  22676. if (!ssl->peerEccDsaKey || !ssl->peerEccDsaKeyPresent) {
  22677. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22678. }
  22679. peerKey = ssl->peerEccDsaKey;
  22680. }
  22681. else {
  22682. if (!ssl->peerEccKey || !ssl->peerEccKeyPresent) {
  22683. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22684. }
  22685. peerKey = ssl->peerEccKey;
  22686. }
  22687. if (peerKey == NULL) {
  22688. ERROR_OUT(NO_PEER_KEY, exit_scke);
  22689. }
  22690. /* create ephemeral private key */
  22691. ssl->hsType = DYNAMIC_TYPE_ECC;
  22692. ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey);
  22693. if (ret != 0) {
  22694. goto exit_scke;
  22695. }
  22696. ret = EccMakeKey(ssl, (ecc_key*)ssl->hsKey, peerKey);
  22697. #endif
  22698. break;
  22699. }
  22700. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  22701. default:
  22702. ret = BAD_KEA_TYPE_E;
  22703. } /* switch(ssl->specs.kea) */
  22704. /* Check for error */
  22705. if (ret != 0) {
  22706. goto exit_scke;
  22707. }
  22708. /* Advance state and proceed */
  22709. ssl->options.asyncState = TLS_ASYNC_BUILD;
  22710. } /* case TLS_ASYNC_BEGIN */
  22711. FALL_THROUGH;
  22712. case TLS_ASYNC_BUILD:
  22713. {
  22714. args->encSz = MAX_ENCRYPT_SZ;
  22715. args->encSecret = (byte*)XMALLOC(MAX_ENCRYPT_SZ, ssl->heap,
  22716. DYNAMIC_TYPE_SECRET);
  22717. if (args->encSecret == NULL) {
  22718. ERROR_OUT(MEMORY_E, exit_scke);
  22719. }
  22720. if (ssl->arrays->preMasterSecret == NULL) {
  22721. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  22722. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  22723. ssl->heap, DYNAMIC_TYPE_SECRET);
  22724. if (ssl->arrays->preMasterSecret == NULL) {
  22725. ERROR_OUT(MEMORY_E, exit_scke);
  22726. }
  22727. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  22728. }
  22729. switch(ssl->specs.kea)
  22730. {
  22731. #ifndef NO_RSA
  22732. case rsa_kea:
  22733. {
  22734. #ifdef HAVE_PK_CALLBACKS
  22735. if (ssl->ctx->GenPreMasterCb) {
  22736. void* ctx = wolfSSL_GetGenPreMasterCtx(ssl);
  22737. ret = ssl->ctx->GenPreMasterCb(ssl,
  22738. ssl->arrays->preMasterSecret, ENCRYPT_LEN, ctx);
  22739. if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) {
  22740. goto exit_scke;
  22741. }
  22742. }
  22743. if (!ssl->ctx->GenPreMasterCb || ret == PROTOCOLCB_UNAVAILABLE)
  22744. #endif
  22745. {
  22746. /* build PreMasterSecret with RNG data */
  22747. ret = wc_RNG_GenerateBlock(ssl->rng,
  22748. &ssl->arrays->preMasterSecret[VERSION_SZ],
  22749. SECRET_LEN - VERSION_SZ);
  22750. if (ret != 0) {
  22751. goto exit_scke;
  22752. }
  22753. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  22754. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  22755. ssl->arrays->preMasterSz = SECRET_LEN;
  22756. }
  22757. break;
  22758. }
  22759. #endif /* !NO_RSA */
  22760. #ifndef NO_DH
  22761. case diffie_hellman_kea:
  22762. {
  22763. ssl->buffers.sig.length = ENCRYPT_LEN;
  22764. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  22765. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22766. if (ssl->buffers.sig.buffer == NULL) {
  22767. ERROR_OUT(MEMORY_E, exit_scke);
  22768. }
  22769. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  22770. (void**)&ssl->buffers.serverDH_Key);
  22771. if (ret != 0) {
  22772. goto exit_scke;
  22773. }
  22774. #if defined(HAVE_FFDHE) && !defined(HAVE_PUBLIC_FFDHE)
  22775. if (ssl->namedGroup) {
  22776. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  22777. ssl->namedGroup);
  22778. if (ret != 0) {
  22779. goto exit_scke;
  22780. }
  22781. ssl->buffers.sig.length =
  22782. wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  22783. }
  22784. else
  22785. #endif
  22786. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  22787. !defined(WOLFSSL_OLD_PRIME_CHECK)
  22788. if (ssl->options.dhDoKeyTest &&
  22789. !ssl->options.dhKeyTested)
  22790. {
  22791. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  22792. ssl->buffers.serverDH_P.buffer,
  22793. ssl->buffers.serverDH_P.length,
  22794. ssl->buffers.serverDH_G.buffer,
  22795. ssl->buffers.serverDH_G.length,
  22796. NULL, 0, 0, ssl->rng);
  22797. if (ret != 0) {
  22798. goto exit_scke;
  22799. }
  22800. ssl->options.dhKeyTested = 1;
  22801. }
  22802. else
  22803. #endif
  22804. {
  22805. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  22806. ssl->buffers.serverDH_P.buffer,
  22807. ssl->buffers.serverDH_P.length,
  22808. ssl->buffers.serverDH_G.buffer,
  22809. ssl->buffers.serverDH_G.length);
  22810. if (ret != 0) {
  22811. goto exit_scke;
  22812. }
  22813. }
  22814. /* for DH, encSecret is Yc, agree is pre-master */
  22815. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  22816. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  22817. args->encSecret, &args->encSz);
  22818. /* set the max agree result size */
  22819. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  22820. break;
  22821. }
  22822. #endif /* !NO_DH */
  22823. #ifndef NO_PSK
  22824. case psk_kea:
  22825. {
  22826. byte* pms = ssl->arrays->preMasterSecret;
  22827. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  22828. ssl->arrays->server_hint, ssl->arrays->client_identity,
  22829. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  22830. if (ssl->arrays->psk_keySz == 0 ||
  22831. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  22832. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  22833. }
  22834. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  22835. args->encSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  22836. if (args->encSz > MAX_PSK_ID_LEN) {
  22837. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  22838. }
  22839. XMEMCPY(args->encSecret, ssl->arrays->client_identity,
  22840. args->encSz);
  22841. /* CLIENT: Pre-shared Key for peer authentication. */
  22842. ssl->options.peerAuthGood = 1;
  22843. /* make psk pre master secret */
  22844. /* length of key + length 0s + length of key + key */
  22845. c16toa((word16)ssl->arrays->psk_keySz, pms);
  22846. pms += OPAQUE16_LEN;
  22847. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  22848. pms += ssl->arrays->psk_keySz;
  22849. c16toa((word16)ssl->arrays->psk_keySz, pms);
  22850. pms += OPAQUE16_LEN;
  22851. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  22852. ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
  22853. (2 * OPAQUE16_LEN);
  22854. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  22855. ssl->arrays->psk_keySz = 0; /* No further need */
  22856. break;
  22857. }
  22858. #endif /* !NO_PSK */
  22859. #if !defined(NO_DH) && !defined(NO_PSK)
  22860. case dhe_psk_kea:
  22861. {
  22862. word32 esSz = 0;
  22863. args->output = args->encSecret;
  22864. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  22865. ssl->arrays->server_hint, ssl->arrays->client_identity,
  22866. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  22867. if (ssl->arrays->psk_keySz == 0 ||
  22868. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  22869. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  22870. }
  22871. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  22872. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  22873. if (esSz > MAX_PSK_ID_LEN) {
  22874. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  22875. }
  22876. /* CLIENT: Pre-shared Key for peer authentication. */
  22877. ssl->options.peerAuthGood = 1;
  22878. ssl->buffers.sig.length = ENCRYPT_LEN;
  22879. ssl->buffers.sig.buffer = (byte*)XMALLOC(ENCRYPT_LEN,
  22880. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  22881. if (ssl->buffers.sig.buffer == NULL) {
  22882. ERROR_OUT(MEMORY_E, exit_scke);
  22883. }
  22884. c16toa((word16)esSz, args->output);
  22885. args->output += OPAQUE16_LEN;
  22886. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  22887. args->output += esSz;
  22888. args->length = args->encSz - esSz - OPAQUE16_LEN;
  22889. args->encSz = esSz + OPAQUE16_LEN;
  22890. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  22891. (void**)&ssl->buffers.serverDH_Key);
  22892. if (ret != 0) {
  22893. goto exit_scke;
  22894. }
  22895. #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \
  22896. !defined(WOLFSSL_OLD_PRIME_CHECK)
  22897. if (ssl->options.dhDoKeyTest &&
  22898. !ssl->options.dhKeyTested)
  22899. {
  22900. ret = wc_DhSetCheckKey(ssl->buffers.serverDH_Key,
  22901. ssl->buffers.serverDH_P.buffer,
  22902. ssl->buffers.serverDH_P.length,
  22903. ssl->buffers.serverDH_G.buffer,
  22904. ssl->buffers.serverDH_G.length,
  22905. NULL, 0, 0, ssl->rng);
  22906. if (ret != 0) {
  22907. goto exit_scke;
  22908. }
  22909. ssl->options.dhKeyTested = 1;
  22910. }
  22911. else
  22912. #endif
  22913. {
  22914. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  22915. ssl->buffers.serverDH_P.buffer,
  22916. ssl->buffers.serverDH_P.length,
  22917. ssl->buffers.serverDH_G.buffer,
  22918. ssl->buffers.serverDH_G.length);
  22919. if (ret != 0) {
  22920. goto exit_scke;
  22921. }
  22922. }
  22923. /* for DH, encSecret is Yc, agree is pre-master */
  22924. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  22925. ssl->buffers.sig.buffer,
  22926. (word32*)&ssl->buffers.sig.length,
  22927. args->output + OPAQUE16_LEN, &args->length);
  22928. break;
  22929. }
  22930. #endif /* !NO_DH && !NO_PSK */
  22931. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  22932. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  22933. case ecdhe_psk_kea:
  22934. {
  22935. word32 esSz = 0;
  22936. args->output = args->encSecret;
  22937. /* Send PSK client identity */
  22938. ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
  22939. ssl->arrays->server_hint, ssl->arrays->client_identity,
  22940. MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
  22941. if (ssl->arrays->psk_keySz == 0 ||
  22942. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  22943. ERROR_OUT(PSK_KEY_ERROR, exit_scke);
  22944. }
  22945. ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */
  22946. esSz = (word32)XSTRLEN(ssl->arrays->client_identity);
  22947. if (esSz > MAX_PSK_ID_LEN) {
  22948. ERROR_OUT(CLIENT_ID_ERROR, exit_scke);
  22949. }
  22950. /* CLIENT: Pre-shared Key for peer authentication. */
  22951. ssl->options.peerAuthGood = 1;
  22952. /* place size and identity in output buffer sz:identity */
  22953. c16toa((word16)esSz, args->output);
  22954. args->output += OPAQUE16_LEN;
  22955. XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
  22956. args->output += esSz;
  22957. args->encSz = esSz + OPAQUE16_LEN;
  22958. /* length is used for public key size */
  22959. args->length = MAX_ENCRYPT_SZ;
  22960. /* Create shared ECC key leaving room at the beginning
  22961. of buffer for size of shared key. */
  22962. ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN;
  22963. #ifdef HAVE_CURVE25519
  22964. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  22965. #ifdef HAVE_PK_CALLBACKS
  22966. /* if callback then use it for shared secret */
  22967. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  22968. break;
  22969. }
  22970. #endif
  22971. ret = wc_curve25519_export_public_ex(
  22972. (curve25519_key*)ssl->hsKey,
  22973. args->output + OPAQUE8_LEN, &args->length,
  22974. EC25519_LITTLE_ENDIAN);
  22975. if (ret != 0) {
  22976. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  22977. }
  22978. break;
  22979. }
  22980. #endif
  22981. #ifdef HAVE_CURVE448
  22982. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  22983. #ifdef HAVE_PK_CALLBACKS
  22984. /* if callback then use it for shared secret */
  22985. if (ssl->ctx->X448SharedSecretCb != NULL) {
  22986. break;
  22987. }
  22988. #endif
  22989. ret = wc_curve448_export_public_ex(
  22990. (curve448_key*)ssl->hsKey,
  22991. args->output + OPAQUE8_LEN, &args->length,
  22992. EC448_LITTLE_ENDIAN);
  22993. if (ret != 0) {
  22994. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  22995. }
  22996. break;
  22997. }
  22998. #endif
  22999. #ifdef HAVE_PK_CALLBACKS
  23000. /* if callback then use it for shared secret */
  23001. if (ssl->ctx->EccSharedSecretCb != NULL) {
  23002. break;
  23003. }
  23004. #endif
  23005. /* Place ECC key in output buffer, leaving room for size */
  23006. PRIVATE_KEY_UNLOCK();
  23007. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  23008. args->output + OPAQUE8_LEN, &args->length);
  23009. PRIVATE_KEY_LOCK();
  23010. if (ret != 0) {
  23011. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  23012. }
  23013. break;
  23014. }
  23015. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  23016. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23017. defined(HAVE_CURVE448)
  23018. case ecc_diffie_hellman_kea:
  23019. {
  23020. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  23021. #ifdef HAVE_CURVE25519
  23022. if (ssl->hsType == DYNAMIC_TYPE_CURVE25519) {
  23023. #ifdef HAVE_PK_CALLBACKS
  23024. /* if callback then use it for shared secret */
  23025. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  23026. break;
  23027. }
  23028. #endif
  23029. ret = wc_curve25519_export_public_ex(
  23030. (curve25519_key*)ssl->hsKey,
  23031. args->encSecret + OPAQUE8_LEN, &args->encSz,
  23032. EC25519_LITTLE_ENDIAN);
  23033. if (ret != 0) {
  23034. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  23035. }
  23036. break;
  23037. }
  23038. #endif
  23039. #ifdef HAVE_CURVE448
  23040. if (ssl->hsType == DYNAMIC_TYPE_CURVE448) {
  23041. #ifdef HAVE_PK_CALLBACKS
  23042. /* if callback then use it for shared secret */
  23043. if (ssl->ctx->X448SharedSecretCb != NULL) {
  23044. break;
  23045. }
  23046. #endif
  23047. ret = wc_curve448_export_public_ex(
  23048. (curve448_key*)ssl->hsKey,
  23049. args->encSecret + OPAQUE8_LEN, &args->encSz,
  23050. EC448_LITTLE_ENDIAN);
  23051. if (ret != 0) {
  23052. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  23053. }
  23054. break;
  23055. }
  23056. #endif
  23057. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  23058. #ifdef HAVE_PK_CALLBACKS
  23059. /* if callback then use it for shared secret */
  23060. if (ssl->ctx->EccSharedSecretCb != NULL) {
  23061. break;
  23062. }
  23063. #endif
  23064. /* Place ECC key in buffer, leaving room for size */
  23065. PRIVATE_KEY_UNLOCK();
  23066. ret = wc_ecc_export_x963((ecc_key*)ssl->hsKey,
  23067. args->encSecret + OPAQUE8_LEN, &args->encSz);
  23068. PRIVATE_KEY_LOCK();
  23069. if (ret != 0) {
  23070. ERROR_OUT(ECC_EXPORT_ERROR, exit_scke);
  23071. }
  23072. #endif /* HAVE_ECC */
  23073. break;
  23074. }
  23075. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23076. default:
  23077. ret = BAD_KEA_TYPE_E;
  23078. } /* switch(ssl->specs.kea) */
  23079. /* Check for error */
  23080. if (ret != 0) {
  23081. goto exit_scke;
  23082. }
  23083. /* Advance state and proceed */
  23084. ssl->options.asyncState = TLS_ASYNC_DO;
  23085. } /* case TLS_ASYNC_BUILD */
  23086. FALL_THROUGH;
  23087. case TLS_ASYNC_DO:
  23088. {
  23089. switch(ssl->specs.kea)
  23090. {
  23091. #ifndef NO_RSA
  23092. case rsa_kea:
  23093. {
  23094. ret = RsaEnc(ssl,
  23095. ssl->arrays->preMasterSecret, SECRET_LEN,
  23096. args->encSecret, &args->encSz,
  23097. ssl->peerRsaKey,
  23098. #if defined(HAVE_PK_CALLBACKS)
  23099. &ssl->buffers.peerRsaKey
  23100. #else
  23101. NULL
  23102. #endif
  23103. );
  23104. break;
  23105. }
  23106. #endif /* !NO_RSA */
  23107. #ifndef NO_DH
  23108. case diffie_hellman_kea:
  23109. {
  23110. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  23111. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  23112. ssl->buffers.serverDH_Pub.buffer,
  23113. ssl->buffers.serverDH_Pub.length,
  23114. ssl->arrays->preMasterSecret,
  23115. &ssl->arrays->preMasterSz,
  23116. ssl->buffers.serverDH_P.buffer,
  23117. ssl->buffers.serverDH_P.length);
  23118. break;
  23119. }
  23120. #endif /* !NO_DH */
  23121. #ifndef NO_PSK
  23122. case psk_kea:
  23123. {
  23124. break;
  23125. }
  23126. #endif /* !NO_PSK */
  23127. #if !defined(NO_DH) && !defined(NO_PSK)
  23128. case dhe_psk_kea:
  23129. {
  23130. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  23131. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  23132. ssl->buffers.serverDH_Pub.buffer,
  23133. ssl->buffers.serverDH_Pub.length,
  23134. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  23135. &ssl->arrays->preMasterSz,
  23136. ssl->buffers.serverDH_P.buffer,
  23137. ssl->buffers.serverDH_P.length);
  23138. break;
  23139. }
  23140. #endif /* !NO_DH && !NO_PSK */
  23141. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23142. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23143. case ecdhe_psk_kea:
  23144. {
  23145. #ifdef HAVE_CURVE25519
  23146. if (ssl->peerX25519KeyPresent) {
  23147. ret = X25519SharedSecret(ssl,
  23148. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  23149. args->output + OPAQUE8_LEN, &args->length,
  23150. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  23151. &ssl->arrays->preMasterSz,
  23152. WOLFSSL_CLIENT_END
  23153. );
  23154. if (!ssl->specs.static_ecdh
  23155. #ifdef WOLFSSL_ASYNC_CRYPT
  23156. && ret != WC_PENDING_E
  23157. #endif
  23158. ) {
  23159. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  23160. (void**)&ssl->peerX25519Key);
  23161. ssl->peerX25519KeyPresent = 0;
  23162. }
  23163. break;
  23164. }
  23165. #endif
  23166. #ifdef HAVE_CURVE448
  23167. if (ssl->peerX448KeyPresent) {
  23168. ret = X448SharedSecret(ssl,
  23169. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  23170. args->output + OPAQUE8_LEN, &args->length,
  23171. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  23172. &ssl->arrays->preMasterSz,
  23173. WOLFSSL_CLIENT_END
  23174. );
  23175. if (!ssl->specs.static_ecdh
  23176. #ifdef WOLFSSL_ASYNC_CRYPT
  23177. && ret != WC_PENDING_E
  23178. #endif
  23179. ) {
  23180. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  23181. (void**)&ssl->peerX448Key);
  23182. ssl->peerX448KeyPresent = 0;
  23183. }
  23184. break;
  23185. }
  23186. #endif
  23187. ret = EccSharedSecret(ssl,
  23188. (ecc_key*)ssl->hsKey, ssl->peerEccKey,
  23189. args->output + OPAQUE8_LEN, &args->length,
  23190. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  23191. &ssl->arrays->preMasterSz,
  23192. WOLFSSL_CLIENT_END
  23193. );
  23194. #ifdef WOLFSSL_ASYNC_CRYPT
  23195. if (ret != WC_PENDING_E)
  23196. #endif
  23197. {
  23198. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  23199. (void**)&ssl->peerEccKey);
  23200. ssl->peerEccKeyPresent = 0;
  23201. }
  23202. break;
  23203. }
  23204. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  23205. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23206. defined(HAVE_CURVE448)
  23207. case ecc_diffie_hellman_kea:
  23208. {
  23209. #ifdef HAVE_ECC
  23210. ecc_key* peerKey;
  23211. #endif
  23212. #ifdef HAVE_CURVE25519
  23213. if (ssl->peerX25519KeyPresent) {
  23214. ret = X25519SharedSecret(ssl,
  23215. (curve25519_key*)ssl->hsKey, ssl->peerX25519Key,
  23216. args->encSecret + OPAQUE8_LEN, &args->encSz,
  23217. ssl->arrays->preMasterSecret,
  23218. &ssl->arrays->preMasterSz,
  23219. WOLFSSL_CLIENT_END
  23220. );
  23221. if (!ssl->specs.static_ecdh
  23222. #ifdef WOLFSSL_ASYNC_CRYPT
  23223. && ret != WC_PENDING_E
  23224. #endif
  23225. ) {
  23226. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  23227. (void**)&ssl->peerX25519Key);
  23228. ssl->peerX25519KeyPresent = 0;
  23229. }
  23230. break;
  23231. }
  23232. #endif
  23233. #ifdef HAVE_CURVE448
  23234. if (ssl->peerX448KeyPresent) {
  23235. ret = X448SharedSecret(ssl,
  23236. (curve448_key*)ssl->hsKey, ssl->peerX448Key,
  23237. args->encSecret + OPAQUE8_LEN, &args->encSz,
  23238. ssl->arrays->preMasterSecret,
  23239. &ssl->arrays->preMasterSz,
  23240. WOLFSSL_CLIENT_END
  23241. );
  23242. if (!ssl->specs.static_ecdh
  23243. #ifdef WOLFSSL_ASYNC_CRYPT
  23244. && ret != WC_PENDING_E
  23245. #endif
  23246. ) {
  23247. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  23248. (void**)&ssl->peerX448Key);
  23249. ssl->peerX448KeyPresent = 0;
  23250. }
  23251. break;
  23252. }
  23253. #endif
  23254. #ifdef HAVE_ECC
  23255. peerKey = (ssl->specs.static_ecdh) ?
  23256. ssl->peerEccDsaKey : ssl->peerEccKey;
  23257. ret = EccSharedSecret(ssl,
  23258. (ecc_key*)ssl->hsKey, peerKey,
  23259. args->encSecret + OPAQUE8_LEN, &args->encSz,
  23260. ssl->arrays->preMasterSecret,
  23261. &ssl->arrays->preMasterSz,
  23262. WOLFSSL_CLIENT_END
  23263. );
  23264. if (!ssl->specs.static_ecdh
  23265. #ifdef WOLFSSL_ASYNC_CRYPT
  23266. && ret != WC_PENDING_E
  23267. #endif
  23268. && !ssl->options.keepResources) {
  23269. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  23270. (void**)&ssl->peerEccKey);
  23271. ssl->peerEccKeyPresent = 0;
  23272. }
  23273. #endif
  23274. break;
  23275. }
  23276. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23277. default:
  23278. ret = BAD_KEA_TYPE_E;
  23279. } /* switch(ssl->specs.kea) */
  23280. /* Check for error */
  23281. if (ret != 0) {
  23282. goto exit_scke;
  23283. }
  23284. /* Advance state and proceed */
  23285. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  23286. } /* case TLS_ASYNC_DO */
  23287. FALL_THROUGH;
  23288. case TLS_ASYNC_VERIFY:
  23289. {
  23290. switch(ssl->specs.kea)
  23291. {
  23292. #ifndef NO_RSA
  23293. case rsa_kea:
  23294. {
  23295. break;
  23296. }
  23297. #endif /* !NO_RSA */
  23298. #ifndef NO_DH
  23299. case diffie_hellman_kea:
  23300. {
  23301. break;
  23302. }
  23303. #endif /* !NO_DH */
  23304. #ifndef NO_PSK
  23305. case psk_kea:
  23306. {
  23307. break;
  23308. }
  23309. #endif /* !NO_PSK */
  23310. #if !defined(NO_DH) && !defined(NO_PSK)
  23311. case dhe_psk_kea:
  23312. {
  23313. byte* pms = ssl->arrays->preMasterSecret;
  23314. /* validate args */
  23315. if (args->output == NULL || args->length == 0) {
  23316. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  23317. }
  23318. c16toa((word16)args->length, args->output);
  23319. args->encSz += args->length + OPAQUE16_LEN;
  23320. c16toa((word16)ssl->arrays->preMasterSz, pms);
  23321. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  23322. pms += ssl->arrays->preMasterSz;
  23323. /* make psk pre master secret */
  23324. /* length of key + length 0s + length of key + key */
  23325. c16toa((word16)ssl->arrays->psk_keySz, pms);
  23326. pms += OPAQUE16_LEN;
  23327. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  23328. ssl->arrays->preMasterSz +=
  23329. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  23330. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  23331. ssl->arrays->psk_keySz = 0; /* No further need */
  23332. break;
  23333. }
  23334. #endif /* !NO_DH && !NO_PSK */
  23335. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23336. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  23337. case ecdhe_psk_kea:
  23338. {
  23339. byte* pms = ssl->arrays->preMasterSecret;
  23340. /* validate args */
  23341. if (args->output == NULL || args->length > ENCRYPT_LEN) {
  23342. ERROR_OUT(BAD_FUNC_ARG, exit_scke);
  23343. }
  23344. /* place size of public key in output buffer */
  23345. *args->output = (byte)args->length;
  23346. args->encSz += args->length + OPAQUE8_LEN;
  23347. /* Create pre master secret is the concatenation of
  23348. eccSize + eccSharedKey + pskSize + pskKey */
  23349. c16toa((word16)ssl->arrays->preMasterSz, pms);
  23350. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  23351. pms += ssl->arrays->preMasterSz;
  23352. c16toa((word16)ssl->arrays->psk_keySz, pms);
  23353. pms += OPAQUE16_LEN;
  23354. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  23355. ssl->arrays->preMasterSz +=
  23356. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  23357. ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  23358. ssl->arrays->psk_keySz = 0; /* No further need */
  23359. break;
  23360. }
  23361. #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
  23362. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  23363. defined(HAVE_CURVE448)
  23364. case ecc_diffie_hellman_kea:
  23365. {
  23366. /* place size of public key in buffer */
  23367. *args->encSecret = (byte)args->encSz;
  23368. args->encSz += OPAQUE8_LEN;
  23369. break;
  23370. }
  23371. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  23372. default:
  23373. ret = BAD_KEA_TYPE_E;
  23374. } /* switch(ssl->specs.kea) */
  23375. /* Check for error */
  23376. if (ret != 0) {
  23377. goto exit_scke;
  23378. }
  23379. /* Advance state and proceed */
  23380. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  23381. } /* case TLS_ASYNC_VERIFY */
  23382. FALL_THROUGH;
  23383. case TLS_ASYNC_FINALIZE:
  23384. {
  23385. word32 tlsSz = 0;
  23386. word32 idx = 0;
  23387. if (ssl->options.tls || ssl->specs.kea == diffie_hellman_kea) {
  23388. tlsSz = 2;
  23389. }
  23390. if (ssl->specs.kea == ecc_diffie_hellman_kea ||
  23391. ssl->specs.kea == dhe_psk_kea ||
  23392. ssl->specs.kea == ecdhe_psk_kea) { /* always off */
  23393. tlsSz = 0;
  23394. }
  23395. idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  23396. args->sendSz = args->encSz + tlsSz + idx;
  23397. #ifdef WOLFSSL_DTLS
  23398. if (ssl->options.dtls) {
  23399. idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  23400. args->sendSz += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA;
  23401. }
  23402. #endif
  23403. if (IsEncryptionOn(ssl, 1)) {
  23404. args->sendSz += MAX_MSG_EXTRA;
  23405. }
  23406. /* check for available size */
  23407. if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0)
  23408. goto exit_scke;
  23409. /* get output buffer */
  23410. args->output = ssl->buffers.outputBuffer.buffer +
  23411. ssl->buffers.outputBuffer.length;
  23412. AddHeaders(args->output, args->encSz + tlsSz, client_key_exchange, ssl);
  23413. if (tlsSz) {
  23414. c16toa((word16)args->encSz, &args->output[idx]);
  23415. idx += OPAQUE16_LEN;
  23416. }
  23417. XMEMCPY(args->output + idx, args->encSecret, args->encSz);
  23418. idx += args->encSz;
  23419. if (IsEncryptionOn(ssl, 1)) {
  23420. int recordHeaderSz = RECORD_HEADER_SZ;
  23421. if (ssl->options.dtls)
  23422. recordHeaderSz += DTLS_RECORD_EXTRA;
  23423. args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
  23424. args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
  23425. DYNAMIC_TYPE_IN_BUFFER);
  23426. if (args->input == NULL) {
  23427. ERROR_OUT(MEMORY_E, exit_scke);
  23428. }
  23429. XMEMCPY(args->input, args->output + recordHeaderSz,
  23430. args->inputSz);
  23431. }
  23432. /* Advance state and proceed */
  23433. ssl->options.asyncState = TLS_ASYNC_END;
  23434. } /* case TLS_ASYNC_FINALIZE */
  23435. FALL_THROUGH;
  23436. case TLS_ASYNC_END:
  23437. {
  23438. if (IsEncryptionOn(ssl, 1)) {
  23439. #ifdef WOLFSSL_DTLS
  23440. if (IsDtlsNotSctpMode(ssl) &&
  23441. (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
  23442. goto exit_scke;
  23443. }
  23444. #endif
  23445. ret = BuildMessage(ssl, args->output, args->sendSz,
  23446. args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
  23447. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23448. args->input = NULL; /* make sure its not double free'd on cleanup */
  23449. if (ret >= 0) {
  23450. args->sendSz = ret;
  23451. ret = 0;
  23452. }
  23453. }
  23454. else {
  23455. #ifdef WOLFSSL_DTLS
  23456. if (IsDtlsNotSctpMode(ssl)) {
  23457. if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
  23458. goto exit_scke;
  23459. }
  23460. }
  23461. if (ssl->options.dtls)
  23462. DtlsSEQIncrement(ssl, CUR_ORDER);
  23463. #endif
  23464. ret = HashOutput(ssl, args->output, args->sendSz, 0);
  23465. }
  23466. if (ret != 0) {
  23467. goto exit_scke;
  23468. }
  23469. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  23470. if (ssl->hsInfoOn)
  23471. AddPacketName(ssl, "ClientKeyExchange");
  23472. if (ssl->toInfoOn)
  23473. AddPacketInfo(ssl, "ClientKeyExchange", handshake,
  23474. args->output, args->sendSz, WRITE_PROTO, ssl->heap);
  23475. #endif
  23476. ssl->buffers.outputBuffer.length += args->sendSz;
  23477. if (!ssl->options.groupMessages) {
  23478. ret = SendBuffered(ssl);
  23479. }
  23480. if (ret == 0 || ret == WANT_WRITE) {
  23481. int tmpRet = MakeMasterSecret(ssl);
  23482. if (tmpRet != 0) {
  23483. ret = tmpRet; /* save WANT_WRITE unless more serious */
  23484. }
  23485. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  23486. ssl->options.buildingMsg = 0;
  23487. }
  23488. #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
  23489. if (ssl->keyLogCb != NULL) {
  23490. int secretSz = SECRET_LEN;
  23491. ret = ssl->keyLogCb(ssl, ssl->arrays->masterSecret, &secretSz,
  23492. NULL);
  23493. if (ret != 0 || secretSz != SECRET_LEN)
  23494. return SESSION_SECRET_CB_E;
  23495. }
  23496. #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
  23497. break;
  23498. }
  23499. default:
  23500. ret = INPUT_CASE_ERROR;
  23501. } /* switch(ssl->options.asyncState) */
  23502. exit_scke:
  23503. WOLFSSL_LEAVE("SendClientKeyExchange", ret);
  23504. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_SEND);
  23505. #ifdef WOLFSSL_ASYNC_IO
  23506. /* Handle async operation */
  23507. if (ret == WC_PENDING_E || ret == WANT_WRITE) {
  23508. if (ssl->options.buildingMsg)
  23509. return ret;
  23510. /* If we have completed all states then we will not enter this function
  23511. * again. We need to do clean up now. */
  23512. }
  23513. #endif
  23514. /* No further need for PMS */
  23515. if (ssl->arrays->preMasterSecret != NULL) {
  23516. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  23517. }
  23518. ssl->arrays->preMasterSz = 0;
  23519. /* Final cleanup */
  23520. #ifdef WOLFSSL_ASYNC_IO
  23521. /* Cleanup async */
  23522. FreeAsyncCtx(ssl, 0);
  23523. #else
  23524. FreeSckeArgs(ssl, args);
  23525. #endif
  23526. FreeKeyExchange(ssl);
  23527. return ret;
  23528. }
  23529. #endif /* !WOLFSSL_NO_TLS12 */
  23530. #ifndef NO_CERTS
  23531. #ifndef WOLFSSL_NO_TLS12
  23532. #ifndef WOLFSSL_NO_CLIENT_AUTH
  23533. typedef struct ScvArgs {
  23534. byte* output; /* not allocated */
  23535. #ifndef NO_RSA
  23536. byte* verifySig;
  23537. #endif
  23538. byte* verify; /* not allocated */
  23539. byte* input;
  23540. word32 idx;
  23541. word32 extraSz;
  23542. word32 sigSz;
  23543. int sendSz;
  23544. int inputSz;
  23545. word16 length;
  23546. byte sigAlgo;
  23547. } ScvArgs;
  23548. static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
  23549. {
  23550. ScvArgs* args = (ScvArgs*)pArgs;
  23551. (void)ssl;
  23552. #ifndef NO_RSA
  23553. if (args->verifySig) {
  23554. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23555. args->verifySig = NULL;
  23556. }
  23557. #endif
  23558. if (args->input) {
  23559. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23560. args->input = NULL;
  23561. }
  23562. }
  23563. /* handle generation of certificate_verify (15) */
  23564. int SendCertificateVerify(WOLFSSL* ssl)
  23565. {
  23566. int ret = 0;
  23567. #ifdef WOLFSSL_ASYNC_IO
  23568. ScvArgs* args = NULL;
  23569. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  23570. #else
  23571. ScvArgs args[1];
  23572. #endif
  23573. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  23574. WOLFSSL_ENTER("SendCertificateVerify");
  23575. #ifdef WOLFSSL_ASYNC_IO
  23576. if (ssl->async == NULL) {
  23577. ssl->async = (struct WOLFSSL_ASYNC*)
  23578. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  23579. DYNAMIC_TYPE_ASYNC);
  23580. if (ssl->async == NULL)
  23581. ERROR_OUT(MEMORY_E, exit_scv);
  23582. }
  23583. args = (ScvArgs*)ssl->async->args;
  23584. #ifdef WOLFSSL_ASYNC_CRYPT
  23585. /* BuildMessage does its own Pop */
  23586. if (ssl->error != WC_PENDING_E ||
  23587. ssl->options.asyncState != TLS_ASYNC_END)
  23588. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  23589. if (ret != WC_NOT_PENDING_E) {
  23590. /* Check for error */
  23591. if (ret < 0)
  23592. goto exit_scv;
  23593. }
  23594. else
  23595. #endif
  23596. if (ssl->options.buildingMsg) {
  23597. /* We should be in the sending state. */
  23598. if (ssl->options.asyncState != TLS_ASYNC_END) {
  23599. ret = BAD_STATE_E;
  23600. goto exit_scv;
  23601. }
  23602. }
  23603. else
  23604. #endif
  23605. {
  23606. /* Reset state */
  23607. ret = 0;
  23608. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  23609. XMEMSET(args, 0, sizeof(ScvArgs));
  23610. #ifdef WOLFSSL_ASYNC_IO
  23611. ssl->async->freeArgs = FreeScvArgs;
  23612. #endif
  23613. }
  23614. switch(ssl->options.asyncState)
  23615. {
  23616. case TLS_ASYNC_BEGIN:
  23617. {
  23618. if (ssl->options.sendVerify == SEND_BLANK_CERT) {
  23619. return 0; /* sent blank cert, can't verify */
  23620. }
  23621. args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
  23622. if (IsEncryptionOn(ssl, 1)) {
  23623. args->sendSz += MAX_MSG_EXTRA;
  23624. }
  23625. /* Use tmp buffer */
  23626. args->input = (byte*)XMALLOC(args->sendSz,
  23627. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  23628. if (args->input == NULL)
  23629. ERROR_OUT(MEMORY_E, exit_scv);
  23630. args->output = args->input;
  23631. /* Advance state and proceed */
  23632. ssl->options.asyncState = TLS_ASYNC_BUILD;
  23633. } /* case TLS_ASYNC_BEGIN */
  23634. FALL_THROUGH;
  23635. case TLS_ASYNC_BUILD:
  23636. {
  23637. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  23638. if (ret != 0) {
  23639. goto exit_scv;
  23640. }
  23641. if (ssl->buffers.key == NULL) {
  23642. #ifdef HAVE_PK_CALLBACKS
  23643. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  23644. args->length = GetPrivateKeySigSize(ssl);
  23645. else
  23646. #endif
  23647. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  23648. }
  23649. else {
  23650. /* Decode private key. */
  23651. ret = DecodePrivateKey(ssl, &args->length);
  23652. if (ret != 0) {
  23653. goto exit_scv;
  23654. }
  23655. }
  23656. if (args->length == 0) {
  23657. ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
  23658. }
  23659. /* idx is used to track verify pointer offset to output */
  23660. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  23661. args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
  23662. args->extraSz = 0; /* tls 1.2 hash/sig */
  23663. /* build encoded signature buffer */
  23664. ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
  23665. ssl->buffers.sig.buffer = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  23666. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23667. if (ssl->buffers.sig.buffer == NULL) {
  23668. ERROR_OUT(MEMORY_E, exit_scv);
  23669. }
  23670. #ifdef WOLFSSL_DTLS
  23671. if (ssl->options.dtls) {
  23672. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23673. args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  23674. }
  23675. #endif
  23676. #ifndef NO_OLD_TLS
  23677. #ifndef NO_SHA
  23678. /* old tls default */
  23679. SetDigest(ssl, sha_mac);
  23680. #endif
  23681. #else
  23682. #ifndef NO_SHA256
  23683. /* new tls default */
  23684. SetDigest(ssl, sha256_mac);
  23685. #endif
  23686. #endif /* !NO_OLD_TLS */
  23687. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  23688. #ifdef WC_RSA_PSS
  23689. if (IsAtLeastTLSv1_2(ssl) &&
  23690. (ssl->pssAlgo & (1 << ssl->suites->hashAlgo))) {
  23691. args->sigAlgo = rsa_pss_sa_algo;
  23692. }
  23693. else
  23694. #endif
  23695. args->sigAlgo = rsa_sa_algo;
  23696. }
  23697. else if (ssl->hsType == DYNAMIC_TYPE_ECC)
  23698. args->sigAlgo = ecc_dsa_sa_algo;
  23699. else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
  23700. args->sigAlgo = ed25519_sa_algo;
  23701. else if (ssl->hsType == DYNAMIC_TYPE_ED448)
  23702. args->sigAlgo = ed448_sa_algo;
  23703. if (IsAtLeastTLSv1_2(ssl)) {
  23704. EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo,
  23705. args->verify);
  23706. args->extraSz = HASH_SIG_SIZE;
  23707. SetDigest(ssl, ssl->suites->hashAlgo);
  23708. }
  23709. #ifndef NO_OLD_TLS
  23710. else {
  23711. /* if old TLS load MD5 and SHA hash as value to sign
  23712. * MD5 and SHA must be first two buffers in stucture */
  23713. XMEMCPY(ssl->buffers.sig.buffer,
  23714. (byte*)&ssl->hsHashes->certHashes, FINISHED_SZ);
  23715. }
  23716. #endif
  23717. #ifndef NO_RSA
  23718. if (args->sigAlgo == rsa_sa_algo) {
  23719. ssl->buffers.sig.length = FINISHED_SZ;
  23720. args->sigSz = ENCRYPT_LEN;
  23721. if (IsAtLeastTLSv1_2(ssl)) {
  23722. ssl->buffers.sig.length = wc_EncodeSignature(
  23723. ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  23724. ssl->buffers.digest.length,
  23725. TypeHash(ssl->suites->hashAlgo));
  23726. }
  23727. /* prepend hdr */
  23728. c16toa(args->length, args->verify + args->extraSz);
  23729. }
  23730. #ifdef WC_RSA_PSS
  23731. else if (args->sigAlgo == rsa_pss_sa_algo) {
  23732. XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
  23733. ssl->buffers.digest.length);
  23734. ssl->buffers.sig.length = ssl->buffers.digest.length;
  23735. args->sigSz = ENCRYPT_LEN;
  23736. /* prepend hdr */
  23737. c16toa(args->length, args->verify + args->extraSz);
  23738. }
  23739. #endif
  23740. #endif /* !NO_RSA */
  23741. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  23742. if (args->sigAlgo == ed25519_sa_algo) {
  23743. ret = Ed25519CheckPubKey(ssl);
  23744. if (ret != 0)
  23745. goto exit_scv;
  23746. }
  23747. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  23748. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  23749. if (args->sigAlgo == ed448_sa_algo) {
  23750. ret = Ed448CheckPubKey(ssl);
  23751. if (ret != 0)
  23752. goto exit_scv;
  23753. }
  23754. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  23755. /* Advance state and proceed */
  23756. ssl->options.asyncState = TLS_ASYNC_DO;
  23757. } /* case TLS_ASYNC_BUILD */
  23758. FALL_THROUGH;
  23759. case TLS_ASYNC_DO:
  23760. {
  23761. #ifdef HAVE_ECC
  23762. if (ssl->hsType == DYNAMIC_TYPE_ECC) {
  23763. ecc_key* key = (ecc_key*)ssl->hsKey;
  23764. ret = EccSign(ssl,
  23765. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  23766. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  23767. key,
  23768. #ifdef HAVE_PK_CALLBACKS
  23769. ssl->buffers.key
  23770. #else
  23771. NULL
  23772. #endif
  23773. );
  23774. }
  23775. #endif /* HAVE_ECC */
  23776. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  23777. if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
  23778. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  23779. ret = Ed25519Sign(ssl,
  23780. ssl->hsHashes->messages, ssl->hsHashes->length,
  23781. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  23782. key,
  23783. #ifdef HAVE_PK_CALLBACKS
  23784. ssl->buffers.key
  23785. #else
  23786. NULL
  23787. #endif
  23788. );
  23789. }
  23790. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  23791. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  23792. if (ssl->hsType == DYNAMIC_TYPE_ED448) {
  23793. ed448_key* key = (ed448_key*)ssl->hsKey;
  23794. ret = Ed448Sign(ssl,
  23795. ssl->hsHashes->messages, ssl->hsHashes->length,
  23796. ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
  23797. key,
  23798. #ifdef HAVE_PK_CALLBACKS
  23799. ssl->buffers.key
  23800. #else
  23801. NULL
  23802. #endif
  23803. );
  23804. }
  23805. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  23806. #ifndef NO_RSA
  23807. if (ssl->hsType == DYNAMIC_TYPE_RSA) {
  23808. RsaKey* key = (RsaKey*)ssl->hsKey;
  23809. /* restore verify pointer */
  23810. args->verify = &args->output[args->idx];
  23811. ret = RsaSign(ssl,
  23812. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  23813. args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
  23814. args->sigAlgo, ssl->suites->hashAlgo, key,
  23815. ssl->buffers.key
  23816. );
  23817. }
  23818. #endif /* !NO_RSA */
  23819. /* Check for error */
  23820. if (ret != 0) {
  23821. goto exit_scv;
  23822. }
  23823. /* Advance state and proceed */
  23824. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  23825. } /* case TLS_ASYNC_DO */
  23826. FALL_THROUGH;
  23827. case TLS_ASYNC_VERIFY:
  23828. {
  23829. /* restore verify pointer */
  23830. args->verify = &args->output[args->idx];
  23831. switch (ssl->hsType) {
  23832. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
  23833. #ifdef HAVE_ECC
  23834. case DYNAMIC_TYPE_ECC:
  23835. #endif
  23836. #ifdef HAVE_ED25519
  23837. case DYNAMIC_TYPE_ED25519:
  23838. #endif
  23839. #ifdef HAVE_ED448
  23840. case DYNAMIC_TYPE_ED448:
  23841. #endif
  23842. args->length = (word16)ssl->buffers.sig.length;
  23843. /* prepend hdr */
  23844. c16toa(args->length, args->verify + args->extraSz);
  23845. XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
  23846. ssl->buffers.sig.buffer, ssl->buffers.sig.length);
  23847. break;
  23848. #endif
  23849. #ifndef NO_RSA
  23850. case DYNAMIC_TYPE_RSA:
  23851. {
  23852. RsaKey* key = (RsaKey*)ssl->hsKey;
  23853. if (args->verifySig == NULL) {
  23854. args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
  23855. DYNAMIC_TYPE_SIGNATURE);
  23856. if (args->verifySig == NULL) {
  23857. ERROR_OUT(MEMORY_E, exit_scv);
  23858. }
  23859. XMEMCPY(args->verifySig, args->verify + args->extraSz +
  23860. VERIFY_HEADER, args->sigSz);
  23861. }
  23862. /* check for signature faults */
  23863. ret = VerifyRsaSign(ssl,
  23864. args->verifySig, args->sigSz,
  23865. ssl->buffers.sig.buffer, ssl->buffers.sig.length,
  23866. args->sigAlgo, ssl->suites->hashAlgo, key,
  23867. ssl->buffers.key
  23868. );
  23869. /* free temporary buffer now */
  23870. if (ret != WC_PENDING_E) {
  23871. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  23872. args->verifySig = NULL;
  23873. }
  23874. break;
  23875. }
  23876. #endif /* !NO_RSA */
  23877. default:
  23878. break;
  23879. }
  23880. /* Check for error */
  23881. if (ret != 0) {
  23882. goto exit_scv;
  23883. }
  23884. /* Advance state and proceed */
  23885. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  23886. } /* case TLS_ASYNC_VERIFY */
  23887. FALL_THROUGH;
  23888. case TLS_ASYNC_FINALIZE:
  23889. {
  23890. if (args->output == NULL) {
  23891. ERROR_OUT(BUFFER_ERROR, exit_scv);
  23892. }
  23893. AddHeaders(args->output, (word32)args->length + args->extraSz +
  23894. VERIFY_HEADER, certificate_verify, ssl);
  23895. /* Advance state and proceed */
  23896. ssl->options.asyncState = TLS_ASYNC_END;
  23897. } /* case TLS_ASYNC_FINALIZE */
  23898. FALL_THROUGH;
  23899. case TLS_ASYNC_END:
  23900. {
  23901. ret = SendHandshakeMsg(ssl, args->output,
  23902. (word32)args->length + args->extraSz + VERIFY_HEADER,
  23903. certificate_verify, "CertificateVerify");
  23904. if (ret != 0)
  23905. goto exit_scv;
  23906. break;
  23907. }
  23908. default:
  23909. ret = INPUT_CASE_ERROR;
  23910. } /* switch(ssl->options.asyncState) */
  23911. exit_scv:
  23912. WOLFSSL_LEAVE("SendCertificateVerify", ret);
  23913. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
  23914. #ifdef WOLFSSL_ASYNC_IO
  23915. /* Handle async operation */
  23916. if (ret == WANT_WRITE
  23917. #ifdef WOLFSSL_ASYNC_CRYPT
  23918. || ret == WC_PENDING_E
  23919. #endif
  23920. )
  23921. return ret;
  23922. #endif /* WOLFSSL_ASYNC_IO */
  23923. /* Digest is not allocated, so do this to prevent free */
  23924. ssl->buffers.digest.buffer = NULL;
  23925. ssl->buffers.digest.length = 0;
  23926. /* Final cleanup */
  23927. #ifdef WOLFSSL_ASYNC_IO
  23928. /* Cleanup async */
  23929. FreeAsyncCtx(ssl, 0);
  23930. #else
  23931. FreeScvArgs(ssl, args);
  23932. #endif
  23933. FreeKeyExchange(ssl);
  23934. return ret;
  23935. }
  23936. #endif /* WOLFSSL_NO_CLIENT_AUTH */
  23937. #endif /* WOLFSSL_NO_TLS12 */
  23938. #endif /* NO_CERTS */
  23939. #ifdef HAVE_SESSION_TICKET
  23940. int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
  23941. {
  23942. /* Free old dynamic ticket if we already had one */
  23943. if (ssl->session->ticketLenAlloc > 0) {
  23944. XFREE(ssl->session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  23945. ssl->session->ticket = ssl->session->_staticTicket;
  23946. ssl->session->ticketLenAlloc = 0;
  23947. }
  23948. if (length > sizeof(ssl->session->_staticTicket)) {
  23949. byte* sessionTicket =
  23950. (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
  23951. if (sessionTicket == NULL)
  23952. return MEMORY_E;
  23953. ssl->session->ticket = sessionTicket;
  23954. ssl->session->ticketLenAlloc = (word16)length;
  23955. }
  23956. ssl->session->ticketLen = (word16)length;
  23957. if (length > 0) {
  23958. XMEMCPY(ssl->session->ticket, ticket, length);
  23959. if (ssl->session_ticket_cb != NULL) {
  23960. ssl->session_ticket_cb(ssl,
  23961. ssl->session->ticket, ssl->session->ticketLen,
  23962. ssl->session_ticket_ctx);
  23963. }
  23964. /* Create a fake sessionID based on the ticket, this will
  23965. * supersede the existing session cache info. */
  23966. ssl->options.haveSessionId = 1;
  23967. #ifdef WOLFSSL_TLS13
  23968. if (ssl->options.tls1_3) {
  23969. XMEMCPY(ssl->session->sessionID,
  23970. ssl->session->ticket + length - ID_LEN, ID_LEN);
  23971. ssl->session->sessionIDSz = ID_LEN;
  23972. }
  23973. else
  23974. #endif
  23975. {
  23976. XMEMCPY(ssl->arrays->sessionID,
  23977. ssl->session->ticket + length - ID_LEN, ID_LEN);
  23978. ssl->arrays->sessionIDSz = ID_LEN;
  23979. }
  23980. }
  23981. return 0;
  23982. }
  23983. #ifndef WOLFSSL_NO_TLS12
  23984. /* handle processing of session_ticket (4) */
  23985. static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  23986. word32 size)
  23987. {
  23988. word32 begin = *inOutIdx;
  23989. word32 lifetime;
  23990. word16 length;
  23991. int ret;
  23992. if (ssl->expect_session_ticket == 0) {
  23993. WOLFSSL_MSG("Unexpected session ticket");
  23994. return SESSION_TICKET_EXPECT_E;
  23995. }
  23996. if (OPAQUE32_LEN > size)
  23997. return BUFFER_ERROR;
  23998. ato32(input + *inOutIdx, &lifetime);
  23999. *inOutIdx += OPAQUE32_LEN;
  24000. if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
  24001. return BUFFER_ERROR;
  24002. ato16(input + *inOutIdx, &length);
  24003. *inOutIdx += OPAQUE16_LEN;
  24004. if ((*inOutIdx - begin) + length > size)
  24005. return BUFFER_ERROR;
  24006. if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
  24007. return ret;
  24008. *inOutIdx += length;
  24009. if (length > 0) {
  24010. ssl->timeout = lifetime;
  24011. #ifndef NO_SESSION_CACHE
  24012. AddSession(ssl);
  24013. #endif
  24014. }
  24015. if (IsEncryptionOn(ssl, 0)) {
  24016. *inOutIdx += ssl->keys.padSz;
  24017. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  24018. if (ssl->options.startedETMRead)
  24019. *inOutIdx += MacSize(ssl);
  24020. #endif
  24021. }
  24022. ssl->expect_session_ticket = 0;
  24023. return 0;
  24024. }
  24025. #endif /* !WOLFSSL_NO_TLS12 */
  24026. #endif /* HAVE_SESSION_TICKET */
  24027. #endif /* NO_WOLFSSL_CLIENT */
  24028. #ifndef NO_CERTS
  24029. #ifdef WOLF_PRIVATE_KEY_ID
  24030. int GetPrivateKeySigSize(WOLFSSL* ssl)
  24031. {
  24032. int sigSz = 0;
  24033. if (ssl == NULL)
  24034. return 0;
  24035. switch (ssl->buffers.keyType) {
  24036. #ifndef NO_RSA
  24037. #ifdef WC_RSA_PSS
  24038. case rsa_pss_sa_algo:
  24039. #endif
  24040. case rsa_sa_algo:
  24041. sigSz = ssl->buffers.keySz;
  24042. ssl->hsType = DYNAMIC_TYPE_RSA;
  24043. break;
  24044. #endif
  24045. #ifdef HAVE_ECC
  24046. case ecc_dsa_sa_algo:
  24047. sigSz = wc_ecc_sig_size_calc(ssl->buffers.keySz);
  24048. ssl->hsType = DYNAMIC_TYPE_ECC;
  24049. break;
  24050. #endif
  24051. #ifdef HAVE_ED25519
  24052. case ed25519_sa_algo:
  24053. sigSz = ED25519_SIG_SIZE; /* fixed known value */
  24054. ssl->hsType = DYNAMIC_TYPE_ED25519;
  24055. break;
  24056. #endif
  24057. #ifdef HAVE_ED448
  24058. case ed448_sa_algo:
  24059. sigSz = ED448_SIG_SIZE; /* fixed known value */
  24060. ssl->hsType = DYNAMIC_TYPE_ED448;
  24061. break;
  24062. #endif
  24063. default:
  24064. break;
  24065. }
  24066. return sigSz;
  24067. }
  24068. #endif /* HAVE_PK_CALLBACKS */
  24069. #endif /* NO_CERTS */
  24070. #ifdef HAVE_ECC
  24071. /* returns the WOLFSSL_* version of the curve from the OID sum */
  24072. word16 GetCurveByOID(int oidSum) {
  24073. switch(oidSum) {
  24074. #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
  24075. #ifndef NO_ECC_SECP
  24076. case ECC_SECP160R1_OID:
  24077. return WOLFSSL_ECC_SECP160R1;
  24078. #endif /* !NO_ECC_SECP */
  24079. #ifdef HAVE_ECC_SECPR2
  24080. case ECC_SECP160R2_OID:
  24081. return WOLFSSL_ECC_SECP160R2;
  24082. #endif /* HAVE_ECC_SECPR2 */
  24083. #ifdef HAVE_ECC_KOBLITZ
  24084. case ECC_SECP160K1_OID:
  24085. return WOLFSSL_ECC_SECP160K1;
  24086. #endif /* HAVE_ECC_KOBLITZ */
  24087. #endif
  24088. #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
  24089. #ifndef NO_ECC_SECP
  24090. case ECC_SECP192R1_OID:
  24091. return WOLFSSL_ECC_SECP192R1;
  24092. #endif /* !NO_ECC_SECP */
  24093. #ifdef HAVE_ECC_KOBLITZ
  24094. case ECC_SECP192K1_OID:
  24095. return WOLFSSL_ECC_SECP192K1;
  24096. #endif /* HAVE_ECC_KOBLITZ */
  24097. #endif
  24098. #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
  24099. #ifndef NO_ECC_SECP
  24100. case ECC_SECP224R1_OID:
  24101. return WOLFSSL_ECC_SECP224R1;
  24102. #endif /* !NO_ECC_SECP */
  24103. #ifdef HAVE_ECC_KOBLITZ
  24104. case ECC_SECP224K1_OID:
  24105. return WOLFSSL_ECC_SECP224K1;
  24106. #endif /* HAVE_ECC_KOBLITZ */
  24107. #endif
  24108. #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
  24109. #ifndef NO_ECC_SECP
  24110. case ECC_SECP256R1_OID:
  24111. return WOLFSSL_ECC_SECP256R1;
  24112. #endif /* !NO_ECC_SECP */
  24113. #ifdef HAVE_ECC_KOBLITZ
  24114. case ECC_SECP256K1_OID:
  24115. return WOLFSSL_ECC_SECP256K1;
  24116. #endif /* HAVE_ECC_KOBLITZ */
  24117. #ifdef HAVE_ECC_BRAINPOOL
  24118. case ECC_BRAINPOOLP256R1_OID:
  24119. return WOLFSSL_ECC_BRAINPOOLP256R1;
  24120. #endif /* HAVE_ECC_BRAINPOOL */
  24121. #endif
  24122. #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
  24123. #ifndef NO_ECC_SECP
  24124. case ECC_SECP384R1_OID:
  24125. return WOLFSSL_ECC_SECP384R1;
  24126. #endif /* !NO_ECC_SECP */
  24127. #ifdef HAVE_ECC_BRAINPOOL
  24128. case ECC_BRAINPOOLP384R1_OID:
  24129. return WOLFSSL_ECC_BRAINPOOLP384R1;
  24130. #endif /* HAVE_ECC_BRAINPOOL */
  24131. #endif
  24132. #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
  24133. #ifdef HAVE_ECC_BRAINPOOL
  24134. case ECC_BRAINPOOLP512R1_OID:
  24135. return WOLFSSL_ECC_BRAINPOOLP512R1;
  24136. #endif /* HAVE_ECC_BRAINPOOL */
  24137. #endif
  24138. #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
  24139. #ifndef NO_ECC_SECP
  24140. case ECC_SECP521R1_OID:
  24141. return WOLFSSL_ECC_SECP521R1;
  24142. #endif /* !NO_ECC_SECP */
  24143. #endif
  24144. default:
  24145. WOLFSSL_MSG("Curve OID not compiled in or implemented");
  24146. return 0;
  24147. }
  24148. }
  24149. #endif /* HAVE_ECC */
  24150. #ifndef NO_WOLFSSL_SERVER
  24151. #ifndef WOLFSSL_NO_TLS12
  24152. /* handle generation of server_hello (2) */
  24153. int SendServerHello(WOLFSSL* ssl)
  24154. {
  24155. int ret;
  24156. byte *output;
  24157. word16 length;
  24158. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  24159. int sendSz;
  24160. byte sessIdSz = ID_LEN;
  24161. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  24162. byte echoId = 0; /* ticket echo id flag */
  24163. #endif
  24164. byte cacheOff = 0; /* session cache off flag */
  24165. WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
  24166. WOLFSSL_ENTER("SendServerHello");
  24167. length = VERSION_SZ + RAN_LEN
  24168. + ID_LEN + ENUM_LEN
  24169. + SUITE_LEN
  24170. + ENUM_LEN;
  24171. #ifdef HAVE_TLS_EXTENSIONS
  24172. ret = TLSX_GetResponseSize(ssl, server_hello, &length);
  24173. if (ret != 0)
  24174. return ret;
  24175. #ifdef HAVE_SESSION_TICKET
  24176. if (ssl->options.useTicket) {
  24177. /* echo session id sz can be 0,32 or bogus len in between */
  24178. sessIdSz = ssl->arrays->sessionIDSz;
  24179. if (sessIdSz > ID_LEN) {
  24180. WOLFSSL_MSG("Bad bogus session id len");
  24181. return BUFFER_ERROR;
  24182. }
  24183. if (!IsAtLeastTLSv1_3(ssl->version))
  24184. length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
  24185. echoId = 1;
  24186. }
  24187. #endif /* HAVE_SESSION_TICKET */
  24188. #else
  24189. if (ssl->options.haveEMS) {
  24190. length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
  24191. }
  24192. #endif
  24193. /* is the session cache off at build or runtime */
  24194. #ifdef NO_SESSION_CACHE
  24195. cacheOff = 1;
  24196. #else
  24197. if (ssl->options.sessionCacheOff == 1) {
  24198. cacheOff = 1;
  24199. }
  24200. #endif
  24201. /* if no session cache don't send a session ID unless we're echoing
  24202. * an ID as part of session tickets */
  24203. if (cacheOff == 1
  24204. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
  24205. && echoId == 0
  24206. #endif
  24207. ) {
  24208. length -= ID_LEN; /* adjust ID_LEN assumption */
  24209. sessIdSz = 0;
  24210. }
  24211. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  24212. #ifdef WOLFSSL_DTLS
  24213. if (ssl->options.dtls) {
  24214. if (((ssl->keys.dtls_sequence_number_hi == ssl->keys.curSeq_hi &&
  24215. ssl->keys.dtls_sequence_number_lo < ssl->keys.curSeq_lo) ||
  24216. (ssl->keys.dtls_sequence_number_hi < ssl->keys.curSeq_hi))) {
  24217. /* Server Hello should use the same sequence number as the
  24218. * Client Hello if available. */
  24219. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  24220. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  24221. }
  24222. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24223. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24224. }
  24225. #endif /* WOLFSSL_DTLS */
  24226. if (IsEncryptionOn(ssl, 1))
  24227. sendSz += MAX_MSG_EXTRA;
  24228. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  24229. * is not advanced yet */
  24230. ssl->options.buildingMsg = 1;
  24231. /* check for available size */
  24232. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  24233. return ret;
  24234. /* get output buffer */
  24235. output = ssl->buffers.outputBuffer.buffer +
  24236. ssl->buffers.outputBuffer.length;
  24237. AddHeaders(output, length, server_hello, ssl);
  24238. /* now write to output */
  24239. /* first version */
  24240. output[idx++] = (byte)ssl->version.major;
  24241. output[idx++] = (byte)ssl->version.minor;
  24242. /* then random and session id */
  24243. if (!ssl->options.resuming) {
  24244. /* generate random part and session id */
  24245. ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
  24246. RAN_LEN + sizeof(sessIdSz) + sessIdSz);
  24247. if (ret != 0)
  24248. return ret;
  24249. #ifdef WOLFSSL_TLS13
  24250. if (TLSv1_3_Capable(ssl)) {
  24251. /* TLS v1.3 capable server downgraded. */
  24252. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  24253. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  24254. output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
  24255. }
  24256. else
  24257. #endif
  24258. if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
  24259. ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
  24260. #ifdef OPENSSL_EXTRA
  24261. (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0 &&
  24262. #endif
  24263. !IsAtLeastTLSv1_2(ssl)) {
  24264. /* TLS v1.2 capable server downgraded. */
  24265. XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
  24266. tls13Downgrade, TLS13_DOWNGRADE_SZ);
  24267. output[idx + RAN_LEN - 1] = 0;
  24268. }
  24269. /* store info in SSL for later */
  24270. XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
  24271. idx += RAN_LEN;
  24272. output[idx++] = sessIdSz;
  24273. XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
  24274. ssl->arrays->sessionIDSz = sessIdSz;
  24275. }
  24276. else {
  24277. /* If resuming, use info from SSL */
  24278. XMEMCPY(output + idx, ssl->arrays->serverRandom, RAN_LEN);
  24279. idx += RAN_LEN;
  24280. output[idx++] = sessIdSz;
  24281. XMEMCPY(output + idx, ssl->arrays->sessionID, sessIdSz);
  24282. }
  24283. idx += sessIdSz;
  24284. #ifdef SHOW_SECRETS
  24285. {
  24286. int j;
  24287. printf("server random: ");
  24288. for (j = 0; j < RAN_LEN; j++)
  24289. printf("%02x", ssl->arrays->serverRandom[j]);
  24290. printf("\n");
  24291. }
  24292. #endif
  24293. /* then cipher suite */
  24294. output[idx++] = ssl->options.cipherSuite0;
  24295. output[idx++] = ssl->options.cipherSuite;
  24296. /* then compression */
  24297. if (ssl->options.usingCompression)
  24298. output[idx++] = ZLIB_COMPRESSION;
  24299. else
  24300. output[idx++] = NO_COMPRESSION;
  24301. /* last, extensions */
  24302. #ifdef HAVE_TLS_EXTENSIONS
  24303. {
  24304. word16 offset = 0;
  24305. ret = TLSX_WriteResponse(ssl, output + idx, server_hello, &offset);
  24306. if (ret != 0)
  24307. return ret;
  24308. idx += offset;
  24309. }
  24310. #else
  24311. #ifdef HAVE_EXTENDED_MASTER
  24312. if (ssl->options.haveEMS) {
  24313. c16toa(HELLO_EXT_SZ, output + idx);
  24314. idx += HELLO_EXT_SZ_SZ;
  24315. c16toa(HELLO_EXT_EXTMS, output + idx);
  24316. idx += HELLO_EXT_TYPE_SZ;
  24317. c16toa(0, output + idx);
  24318. /*idx += HELLO_EXT_SZ_SZ;*/
  24319. /* idx is not used after this point. uncomment the line above
  24320. * if adding any more extensions in the future. */
  24321. }
  24322. #endif
  24323. #endif
  24324. if (IsEncryptionOn(ssl, 1)) {
  24325. byte* input;
  24326. int inputSz = idx; /* build msg adds rec hdr */
  24327. int recordHeaderSz = RECORD_HEADER_SZ;
  24328. if (ssl->options.dtls)
  24329. recordHeaderSz += DTLS_RECORD_EXTRA;
  24330. inputSz -= recordHeaderSz;
  24331. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24332. if (input == NULL)
  24333. return MEMORY_E;
  24334. XMEMCPY(input, output + recordHeaderSz, inputSz);
  24335. #ifdef WOLFSSL_DTLS
  24336. if (IsDtlsNotSctpMode(ssl) &&
  24337. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
  24338. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24339. return ret;
  24340. }
  24341. #endif
  24342. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  24343. handshake, 1, 0, 0, CUR_ORDER);
  24344. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24345. if (sendSz < 0)
  24346. return sendSz;
  24347. } else {
  24348. #ifdef WOLFSSL_DTLS
  24349. if (IsDtlsNotSctpMode(ssl)) {
  24350. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
  24351. return ret;
  24352. }
  24353. if (ssl->options.dtls)
  24354. DtlsSEQIncrement(ssl, CUR_ORDER);
  24355. #endif
  24356. ret = HashOutput(ssl, output, sendSz, 0);
  24357. if (ret != 0)
  24358. return ret;
  24359. }
  24360. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  24361. if (ssl->hsInfoOn)
  24362. AddPacketName(ssl, "ServerHello");
  24363. if (ssl->toInfoOn)
  24364. AddPacketInfo(ssl, "ServerHello", handshake, output, sendSz,
  24365. WRITE_PROTO, ssl->heap);
  24366. #endif
  24367. ssl->options.serverState = SERVER_HELLO_COMPLETE;
  24368. ssl->options.buildingMsg = 0;
  24369. ssl->buffers.outputBuffer.length += sendSz;
  24370. if (ssl->options.groupMessages)
  24371. ret = 0;
  24372. else
  24373. ret = SendBuffered(ssl);
  24374. WOLFSSL_LEAVE("SendServerHello", ret);
  24375. WOLFSSL_END(WC_FUNC_SERVER_HELLO_SEND);
  24376. return ret;
  24377. }
  24378. #if defined(HAVE_ECC)
  24379. static byte SetCurveId(ecc_key* key)
  24380. {
  24381. if (key == NULL || key->dp == NULL) {
  24382. WOLFSSL_MSG("SetCurveId: Invalid key!");
  24383. return 0;
  24384. }
  24385. return (byte)GetCurveByOID(key->dp->oidSum);
  24386. }
  24387. #endif /* HAVE_ECC */
  24388. typedef struct SskeArgs {
  24389. byte* output; /* not allocated */
  24390. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  24391. !defined(NO_RSA)
  24392. byte* sigDataBuf;
  24393. #endif
  24394. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  24395. byte* exportBuf;
  24396. #endif
  24397. #ifndef NO_RSA
  24398. byte* verifySig;
  24399. #endif
  24400. byte* input;
  24401. word32 idx;
  24402. word32 tmpSigSz;
  24403. word32 length;
  24404. word32 sigSz;
  24405. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  24406. !defined(NO_RSA)
  24407. word32 sigDataSz;
  24408. #endif
  24409. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  24410. word32 exportSz;
  24411. #endif
  24412. int sendSz;
  24413. int inputSz;
  24414. } SskeArgs;
  24415. static void FreeSskeArgs(WOLFSSL* ssl, void* pArgs)
  24416. {
  24417. SskeArgs* args = (SskeArgs*)pArgs;
  24418. (void)ssl;
  24419. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
  24420. if (args->exportBuf) {
  24421. XFREE(args->exportBuf, ssl->heap, DYNAMIC_TYPE_DER);
  24422. args->exportBuf = NULL;
  24423. }
  24424. #endif
  24425. #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  24426. (!defined(NO_DH) && !defined(NO_RSA))
  24427. if (args->sigDataBuf) {
  24428. XFREE(args->sigDataBuf, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24429. args->sigDataBuf = NULL;
  24430. }
  24431. #endif
  24432. #ifndef NO_RSA
  24433. if (args->verifySig) {
  24434. XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  24435. args->verifySig = NULL;
  24436. }
  24437. #endif
  24438. (void)args;
  24439. }
  24440. /* handle generation of server_key_exchange (12) */
  24441. int SendServerKeyExchange(WOLFSSL* ssl)
  24442. {
  24443. int ret = 0;
  24444. #ifdef WOLFSSL_ASYNC_IO
  24445. SskeArgs* args = NULL;
  24446. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  24447. #else
  24448. SskeArgs args[1];
  24449. #endif
  24450. WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  24451. WOLFSSL_ENTER("SendServerKeyExchange");
  24452. #ifdef WOLFSSL_ASYNC_IO
  24453. if (ssl->async == NULL) {
  24454. ssl->async = (struct WOLFSSL_ASYNC*)
  24455. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  24456. DYNAMIC_TYPE_ASYNC);
  24457. if (ssl->async == NULL)
  24458. ERROR_OUT(MEMORY_E, exit_sske);
  24459. }
  24460. args = (SskeArgs*)ssl->async->args;
  24461. #ifdef WOLFSSL_ASYNC_CRYPT
  24462. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  24463. if (ret != WC_NOT_PENDING_E) {
  24464. /* Check for error */
  24465. if (ret < 0)
  24466. goto exit_sske;
  24467. }
  24468. else
  24469. #endif
  24470. if (ssl->options.buildingMsg) {
  24471. /* We should be in the sending state. */
  24472. if (ssl->options.asyncState != TLS_ASYNC_END) {
  24473. ret = BAD_STATE_E;
  24474. goto exit_sske;
  24475. }
  24476. }
  24477. else
  24478. #endif
  24479. {
  24480. /* Reset state */
  24481. ret = 0;
  24482. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  24483. XMEMSET(args, 0, sizeof(SskeArgs));
  24484. #ifdef WOLFSSL_ASYNC_IO
  24485. ssl->async->freeArgs = FreeSskeArgs;
  24486. #endif
  24487. }
  24488. switch(ssl->options.asyncState)
  24489. {
  24490. case TLS_ASYNC_BEGIN:
  24491. {
  24492. /* Do some checks / debug msgs */
  24493. switch(ssl->specs.kea)
  24494. {
  24495. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24496. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  24497. case ecdhe_psk_kea:
  24498. {
  24499. WOLFSSL_MSG("Using ephemeral ECDH PSK");
  24500. break;
  24501. }
  24502. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  24503. #if defined(HAVE_ECC)
  24504. case ecc_diffie_hellman_kea:
  24505. {
  24506. if (ssl->specs.static_ecdh) {
  24507. WOLFSSL_MSG("Using Static ECDH, not sending "
  24508. "ServerKeyExchange");
  24509. ERROR_OUT(0, exit_sske);
  24510. }
  24511. WOLFSSL_MSG("Using ephemeral ECDH");
  24512. break;
  24513. }
  24514. #endif /* HAVE_ECC */
  24515. }
  24516. /* Preparing keys */
  24517. switch(ssl->specs.kea)
  24518. {
  24519. #ifndef NO_PSK
  24520. case psk_kea:
  24521. {
  24522. /* Nothing to do in this sub-state */
  24523. break;
  24524. }
  24525. #endif /* !NO_PSK */
  24526. #if !defined(NO_DH) && (!defined(NO_PSK) || !defined(NO_RSA) \
  24527. || (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  24528. #if !defined(NO_PSK)
  24529. case dhe_psk_kea:
  24530. #endif
  24531. #if !defined(NO_RSA) || (defined(HAVE_ANON) && \
  24532. !defined(WOLFSSL_NO_TLS12))
  24533. case diffie_hellman_kea:
  24534. #endif
  24535. #if (defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)) && !defined(HAVE_PUBLIC_FFDHE)
  24536. if (ssl->namedGroup) {
  24537. word32 pSz = 0;
  24538. ret = wc_DhGetNamedKeyParamSize(ssl->namedGroup, &pSz,
  24539. NULL, NULL);
  24540. if (ret != 0)
  24541. goto exit_sske;
  24542. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  24543. /* Free'd in SSL_ResourceFree and
  24544. * FreeHandshakeResources */
  24545. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  24546. pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  24547. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  24548. ERROR_OUT(MEMORY_E, exit_sske);
  24549. }
  24550. ssl->buffers.serverDH_Pub.length = pSz;
  24551. }
  24552. ssl->options.dhKeySz =(word16)pSz;
  24553. pSz = wc_DhGetNamedKeyMinSize(ssl->namedGroup);
  24554. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  24555. /* Free'd in SSL_ResourceFree and
  24556. * FreeHandshakeResources */
  24557. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  24558. pSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  24559. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  24560. ERROR_OUT(MEMORY_E, exit_sske);
  24561. }
  24562. ssl->buffers.serverDH_Priv.length = pSz;
  24563. }
  24564. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  24565. (void**)&ssl->buffers.serverDH_Key);
  24566. if (ret != 0) {
  24567. goto exit_sske;
  24568. }
  24569. ret = wc_DhSetNamedKey(ssl->buffers.serverDH_Key,
  24570. ssl->namedGroup);
  24571. if (ret != 0) {
  24572. goto exit_sske;
  24573. }
  24574. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  24575. !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
  24576. ssl->options.dhKeyTested = 1;
  24577. #endif
  24578. #ifdef HAVE_SECURE_RENEGOTIATION
  24579. /* Check that the DH public key buffer is large
  24580. * enough to hold the key. This may occur on a
  24581. * renegotiation when the key generated in the
  24582. * initial handshake is shorter than the key
  24583. * generated in the renegotiation. */
  24584. if (ssl->buffers.serverDH_Pub.length <
  24585. ssl->buffers.serverDH_P.length) {
  24586. byte* tmp = (byte*)XREALLOC(
  24587. ssl->buffers.serverDH_Pub.buffer,
  24588. ssl->buffers.serverDH_P.length +
  24589. OPAQUE16_LEN,
  24590. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  24591. if (tmp == NULL)
  24592. ERROR_OUT(MEMORY_E, exit_sske);
  24593. ssl->buffers.serverDH_Pub.buffer = tmp;
  24594. ssl->buffers.serverDH_Pub.length =
  24595. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  24596. }
  24597. #endif
  24598. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  24599. ssl->buffers.serverDH_Priv.buffer,
  24600. (word32*)&ssl->buffers.serverDH_Priv.length,
  24601. ssl->buffers.serverDH_Pub.buffer,
  24602. (word32*)&ssl->buffers.serverDH_Pub.length);
  24603. break;
  24604. }
  24605. else
  24606. #endif
  24607. {
  24608. /* Allocate DH key buffers and generate key */
  24609. if (ssl->buffers.serverDH_P.buffer == NULL ||
  24610. ssl->buffers.serverDH_G.buffer == NULL) {
  24611. ERROR_OUT(NO_DH_PARAMS, exit_sske);
  24612. }
  24613. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  24614. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  24615. ssl->buffers.serverDH_Pub.buffer = (byte*)XMALLOC(
  24616. ssl->buffers.serverDH_P.length,
  24617. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  24618. if (ssl->buffers.serverDH_Pub.buffer == NULL) {
  24619. ERROR_OUT(MEMORY_E, exit_sske);
  24620. }
  24621. ssl->buffers.serverDH_Pub.length =
  24622. ssl->buffers.serverDH_P.length;
  24623. }
  24624. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  24625. /* Free'd in SSL_ResourceFree and FreeHandshakeResources */
  24626. ssl->buffers.serverDH_Priv.buffer = (byte*)XMALLOC(
  24627. ssl->buffers.serverDH_P.length,
  24628. ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
  24629. if (ssl->buffers.serverDH_Priv.buffer == NULL) {
  24630. ERROR_OUT(MEMORY_E, exit_sske);
  24631. }
  24632. ssl->buffers.serverDH_Priv.length =
  24633. ssl->buffers.serverDH_P.length;
  24634. }
  24635. ssl->options.dhKeySz =
  24636. (word16)ssl->buffers.serverDH_P.length;
  24637. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  24638. (void**)&ssl->buffers.serverDH_Key);
  24639. if (ret != 0) {
  24640. goto exit_sske;
  24641. }
  24642. #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
  24643. !defined(HAVE_FIPS) && \
  24644. !defined(HAVE_SELFTEST)
  24645. if (ssl->options.dhDoKeyTest &&
  24646. !ssl->options.dhKeyTested)
  24647. {
  24648. ret = wc_DhSetCheckKey(
  24649. ssl->buffers.serverDH_Key,
  24650. ssl->buffers.serverDH_P.buffer,
  24651. ssl->buffers.serverDH_P.length,
  24652. ssl->buffers.serverDH_G.buffer,
  24653. ssl->buffers.serverDH_G.length,
  24654. NULL, 0, 0, ssl->rng);
  24655. if (ret != 0) {
  24656. goto exit_sske;
  24657. }
  24658. ssl->options.dhKeyTested = 1;
  24659. }
  24660. else
  24661. #endif
  24662. {
  24663. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  24664. ssl->buffers.serverDH_P.buffer,
  24665. ssl->buffers.serverDH_P.length,
  24666. ssl->buffers.serverDH_G.buffer,
  24667. ssl->buffers.serverDH_G.length);
  24668. if (ret != 0) {
  24669. goto exit_sske;
  24670. }
  24671. }
  24672. #ifdef HAVE_SECURE_RENEGOTIATION
  24673. /* Check that the DH public key buffer is large
  24674. * enough to hold the key. This may occur on a
  24675. * renegotiation when the key generated in the
  24676. * initial handshake is shorter than the key
  24677. * generated in the renegotiation. */
  24678. if (ssl->buffers.serverDH_Pub.length <
  24679. ssl->buffers.serverDH_P.length) {
  24680. byte* tmp = (byte*)XREALLOC(
  24681. ssl->buffers.serverDH_Pub.buffer,
  24682. ssl->buffers.serverDH_P.length +
  24683. OPAQUE16_LEN,
  24684. ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
  24685. if (tmp == NULL)
  24686. ERROR_OUT(MEMORY_E, exit_sske);
  24687. ssl->buffers.serverDH_Pub.buffer = tmp;
  24688. ssl->buffers.serverDH_Pub.length =
  24689. ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
  24690. }
  24691. #endif
  24692. ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key,
  24693. ssl->buffers.serverDH_Priv.buffer,
  24694. (word32*)&ssl->buffers.serverDH_Priv.length,
  24695. ssl->buffers.serverDH_Pub.buffer,
  24696. (word32*)&ssl->buffers.serverDH_Pub.length);
  24697. break;
  24698. }
  24699. #endif /* !NO_DH && (!NO_PSK || !NO_RSA) */
  24700. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24701. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  24702. case ecdhe_psk_kea:
  24703. /* Fall through to create temp ECC key */
  24704. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  24705. #if defined(HAVE_ECC) || \
  24706. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  24707. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  24708. !defined(NO_RSA)))
  24709. case ecc_diffie_hellman_kea:
  24710. {
  24711. #ifdef HAVE_CURVE25519
  24712. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  24713. /* need ephemeral key now, create it if missing */
  24714. if (ssl->eccTempKey == NULL) {
  24715. /* alloc/init on demand */
  24716. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  24717. (void**)&ssl->eccTempKey);
  24718. if (ret != 0) {
  24719. goto exit_sske;
  24720. }
  24721. }
  24722. if (ssl->eccTempKeyPresent == 0) {
  24723. ret = X25519MakeKey(ssl,
  24724. (curve25519_key*)ssl->eccTempKey, NULL);
  24725. if (ret == 0 || ret == WC_PENDING_E) {
  24726. ssl->eccTempKeyPresent =
  24727. DYNAMIC_TYPE_CURVE25519;
  24728. }
  24729. }
  24730. break;
  24731. }
  24732. #endif
  24733. #ifdef HAVE_CURVE448
  24734. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  24735. /* need ephemeral key now, create it if missing */
  24736. if (ssl->eccTempKey == NULL) {
  24737. /* alloc/init on demand */
  24738. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  24739. (void**)&ssl->eccTempKey);
  24740. if (ret != 0) {
  24741. goto exit_sske;
  24742. }
  24743. }
  24744. if (ssl->eccTempKeyPresent == 0) {
  24745. ret = X448MakeKey(ssl,
  24746. (curve448_key*)ssl->eccTempKey, NULL);
  24747. if (ret == 0 || ret == WC_PENDING_E) {
  24748. ssl->eccTempKeyPresent =
  24749. DYNAMIC_TYPE_CURVE448;
  24750. }
  24751. }
  24752. break;
  24753. }
  24754. #endif
  24755. #ifdef HAVE_ECC
  24756. /* need ephemeral key now, create it if missing */
  24757. if (ssl->eccTempKey == NULL) {
  24758. /* alloc/init on demand */
  24759. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  24760. (void**)&ssl->eccTempKey);
  24761. if (ret != 0) {
  24762. goto exit_sske;
  24763. }
  24764. }
  24765. if (ssl->eccTempKeyPresent == 0) {
  24766. ret = EccMakeKey(ssl, ssl->eccTempKey, NULL);
  24767. if (ret == 0 || ret == WC_PENDING_E) {
  24768. ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC;
  24769. }
  24770. }
  24771. #endif
  24772. break;
  24773. }
  24774. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  24775. default:
  24776. /* Skip ServerKeyExchange */
  24777. goto exit_sske;
  24778. } /* switch(ssl->specs.kea) */
  24779. /* Check for error */
  24780. if (ret != 0) {
  24781. goto exit_sske;
  24782. }
  24783. /* Advance state and proceed */
  24784. ssl->options.asyncState = TLS_ASYNC_BUILD;
  24785. } /* case TLS_ASYNC_BEGIN */
  24786. FALL_THROUGH;
  24787. case TLS_ASYNC_BUILD:
  24788. {
  24789. switch(ssl->specs.kea)
  24790. {
  24791. #ifndef NO_PSK
  24792. case psk_kea:
  24793. {
  24794. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  24795. if (ssl->arrays->server_hint[0] == 0) {
  24796. ERROR_OUT(0, exit_sske); /* don't send */
  24797. }
  24798. /* include size part */
  24799. args->length = (word32)XSTRLEN(ssl->arrays->server_hint);
  24800. if (args->length > MAX_PSK_ID_LEN) {
  24801. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  24802. }
  24803. args->length += HINT_LEN_SZ;
  24804. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  24805. RECORD_HEADER_SZ;
  24806. #ifdef WOLFSSL_DTLS
  24807. if (ssl->options.dtls) {
  24808. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24809. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24810. }
  24811. #endif
  24812. if (IsEncryptionOn(ssl, 1)) {
  24813. args->sendSz += MAX_MSG_EXTRA;
  24814. }
  24815. /* Use tmp buffer */
  24816. args->input = (byte*)XMALLOC(args->sendSz,
  24817. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24818. if (args->input == NULL)
  24819. ERROR_OUT(MEMORY_E, exit_sske);
  24820. args->output = args->input;
  24821. AddHeaders(args->output, args->length,
  24822. server_key_exchange, ssl);
  24823. /* key data */
  24824. c16toa((word16)(args->length - HINT_LEN_SZ),
  24825. args->output + args->idx);
  24826. args->idx += HINT_LEN_SZ;
  24827. XMEMCPY(args->output + args->idx,
  24828. ssl->arrays->server_hint,
  24829. args->length - HINT_LEN_SZ);
  24830. break;
  24831. }
  24832. #endif /* !NO_PSK */
  24833. #if !defined(NO_DH) && !defined(NO_PSK)
  24834. case dhe_psk_kea:
  24835. {
  24836. word32 hintLen;
  24837. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  24838. args->length = LENGTH_SZ * 3 + /* p, g, pub */
  24839. ssl->buffers.serverDH_P.length +
  24840. ssl->buffers.serverDH_G.length +
  24841. ssl->buffers.serverDH_Pub.length;
  24842. /* include size part */
  24843. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  24844. if (hintLen > MAX_PSK_ID_LEN) {
  24845. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  24846. }
  24847. args->length += hintLen + HINT_LEN_SZ;
  24848. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  24849. RECORD_HEADER_SZ;
  24850. #ifdef WOLFSSL_DTLS
  24851. if (ssl->options.dtls) {
  24852. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24853. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24854. }
  24855. #endif
  24856. if (IsEncryptionOn(ssl, 1)) {
  24857. args->sendSz += MAX_MSG_EXTRA;
  24858. }
  24859. /* Use tmp buffer */
  24860. args->input = (byte*)XMALLOC(args->sendSz,
  24861. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24862. if (args->input == NULL)
  24863. ERROR_OUT(MEMORY_E, exit_sske);
  24864. args->output = args->input;
  24865. AddHeaders(args->output, args->length,
  24866. server_key_exchange, ssl);
  24867. /* key data */
  24868. c16toa((word16)hintLen, args->output + args->idx);
  24869. args->idx += HINT_LEN_SZ;
  24870. XMEMCPY(args->output + args->idx,
  24871. ssl->arrays->server_hint, hintLen);
  24872. args->idx += hintLen;
  24873. /* add p, g, pub */
  24874. c16toa((word16)ssl->buffers.serverDH_P.length,
  24875. args->output + args->idx);
  24876. args->idx += LENGTH_SZ;
  24877. XMEMCPY(args->output + args->idx,
  24878. ssl->buffers.serverDH_P.buffer,
  24879. ssl->buffers.serverDH_P.length);
  24880. args->idx += ssl->buffers.serverDH_P.length;
  24881. /* g */
  24882. c16toa((word16)ssl->buffers.serverDH_G.length,
  24883. args->output + args->idx);
  24884. args->idx += LENGTH_SZ;
  24885. XMEMCPY(args->output + args->idx,
  24886. ssl->buffers.serverDH_G.buffer,
  24887. ssl->buffers.serverDH_G.length);
  24888. args->idx += ssl->buffers.serverDH_G.length;
  24889. /* pub */
  24890. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  24891. args->output + args->idx);
  24892. args->idx += LENGTH_SZ;
  24893. XMEMCPY(args->output + args->idx,
  24894. ssl->buffers.serverDH_Pub.buffer,
  24895. ssl->buffers.serverDH_Pub.length);
  24896. /* No need to update idx, since sizes are already set */
  24897. /* args->idx += ssl->buffers.serverDH_Pub.length; */
  24898. break;
  24899. }
  24900. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  24901. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  24902. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  24903. case ecdhe_psk_kea:
  24904. {
  24905. word32 hintLen;
  24906. /* curve type, named curve, length(1) */
  24907. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  24908. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  24909. args->exportSz = MAX_EXPORT_ECC_SZ;
  24910. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  24911. ssl->heap, DYNAMIC_TYPE_DER);
  24912. if (args->exportBuf == NULL) {
  24913. ERROR_OUT(MEMORY_E, exit_sske);
  24914. }
  24915. #ifdef HAVE_CURVE25519
  24916. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  24917. if (wc_curve25519_export_public_ex(
  24918. (curve25519_key*)ssl->eccTempKey,
  24919. args->exportBuf, &args->exportSz,
  24920. EC25519_LITTLE_ENDIAN) != 0) {
  24921. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  24922. }
  24923. }
  24924. else
  24925. #endif
  24926. #ifdef HAVE_CURVE448
  24927. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  24928. if (wc_curve448_export_public_ex(
  24929. (curve448_key*)ssl->eccTempKey,
  24930. args->exportBuf, &args->exportSz,
  24931. EC448_LITTLE_ENDIAN) != 0) {
  24932. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  24933. }
  24934. }
  24935. else
  24936. #endif
  24937. {
  24938. PRIVATE_KEY_UNLOCK();
  24939. ret = wc_ecc_export_x963(ssl->eccTempKey,
  24940. args->exportBuf, &args->exportSz);
  24941. PRIVATE_KEY_LOCK();
  24942. if (ret != 0) {
  24943. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  24944. }
  24945. }
  24946. args->length += args->exportSz;
  24947. /* include size part */
  24948. hintLen = (word32)XSTRLEN(ssl->arrays->server_hint);
  24949. if (hintLen > MAX_PSK_ID_LEN) {
  24950. ERROR_OUT(SERVER_HINT_ERROR, exit_sske);
  24951. }
  24952. args->length += hintLen + HINT_LEN_SZ;
  24953. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  24954. #ifdef WOLFSSL_DTLS
  24955. if (ssl->options.dtls) {
  24956. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24957. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  24958. }
  24959. #endif
  24960. if (IsEncryptionOn(ssl, 1)) {
  24961. args->sendSz += MAX_MSG_EXTRA;
  24962. }
  24963. /* Use tmp buffer */
  24964. args->input = (byte*)XMALLOC(args->sendSz,
  24965. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  24966. if (args->input == NULL)
  24967. ERROR_OUT(MEMORY_E, exit_sske);
  24968. args->output = args->input;
  24969. /* key data */
  24970. c16toa((word16)hintLen, args->output + args->idx);
  24971. args->idx += HINT_LEN_SZ;
  24972. XMEMCPY(args->output + args->idx,
  24973. ssl->arrays->server_hint, hintLen);
  24974. args->idx += hintLen;
  24975. /* ECC key exchange data */
  24976. args->output[args->idx++] = named_curve;
  24977. args->output[args->idx++] = 0x00; /* leading zero */
  24978. #ifdef HAVE_CURVE25519
  24979. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  24980. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  24981. else
  24982. #endif
  24983. #ifdef HAVE_CURVE448
  24984. if (ssl->ecdhCurveOID == ECC_X448_OID)
  24985. args->output[args->idx++] = WOLFSSL_ECC_X448;
  24986. else
  24987. #endif
  24988. {
  24989. #ifdef HAVE_ECC
  24990. args->output[args->idx++] =
  24991. SetCurveId(ssl->eccTempKey);
  24992. #endif
  24993. }
  24994. args->output[args->idx++] = (byte)args->exportSz;
  24995. XMEMCPY(args->output + args->idx, args->exportBuf,
  24996. args->exportSz);
  24997. break;
  24998. }
  24999. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  25000. #if defined(HAVE_ECC) || \
  25001. ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \
  25002. (defined(HAVE_ED25519) || defined(HAVE_ED448) || \
  25003. !defined(NO_RSA)))
  25004. case ecc_diffie_hellman_kea:
  25005. {
  25006. enum wc_HashType hashType;
  25007. word32 preSigSz, preSigIdx;
  25008. /* curve type, named curve, length(1) */
  25009. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  25010. args->length = ENUM_LEN + CURVE_LEN + ENUM_LEN;
  25011. /* Export temp ECC key and add to length */
  25012. args->exportSz = MAX_EXPORT_ECC_SZ;
  25013. args->exportBuf = (byte*)XMALLOC(MAX_EXPORT_ECC_SZ,
  25014. ssl->heap, DYNAMIC_TYPE_DER);
  25015. if (args->exportBuf == NULL) {
  25016. ERROR_OUT(MEMORY_E, exit_sske);
  25017. }
  25018. #ifdef HAVE_CURVE25519
  25019. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  25020. if (wc_curve25519_export_public_ex(
  25021. (curve25519_key*)ssl->eccTempKey,
  25022. args->exportBuf, &args->exportSz,
  25023. EC25519_LITTLE_ENDIAN) != 0) {
  25024. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  25025. }
  25026. }
  25027. else
  25028. #endif
  25029. #ifdef HAVE_CURVE448
  25030. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  25031. if (wc_curve448_export_public_ex(
  25032. (curve448_key*)ssl->eccTempKey,
  25033. args->exportBuf, &args->exportSz,
  25034. EC448_LITTLE_ENDIAN) != 0) {
  25035. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  25036. }
  25037. }
  25038. else
  25039. #endif
  25040. {
  25041. #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
  25042. PRIVATE_KEY_UNLOCK();
  25043. ret = wc_ecc_export_x963(ssl->eccTempKey,
  25044. args->exportBuf, &args->exportSz);
  25045. PRIVATE_KEY_LOCK();
  25046. if (ret != 0) {
  25047. ERROR_OUT(ECC_EXPORT_ERROR, exit_sske);
  25048. }
  25049. #endif
  25050. }
  25051. args->length += args->exportSz;
  25052. preSigSz = args->length;
  25053. preSigIdx = args->idx;
  25054. if (ssl->buffers.key == NULL) {
  25055. #ifdef HAVE_PK_CALLBACKS
  25056. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) {
  25057. args->tmpSigSz = GetPrivateKeySigSize(ssl);
  25058. if (args->tmpSigSz == 0) {
  25059. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  25060. }
  25061. }
  25062. else
  25063. #endif
  25064. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  25065. }
  25066. else {
  25067. switch(ssl->suites->sigAlgo) {
  25068. #ifndef NO_RSA
  25069. #ifdef WC_RSA_PSS
  25070. case rsa_pss_sa_algo:
  25071. #endif
  25072. case rsa_sa_algo:
  25073. {
  25074. word16 keySz;
  25075. ssl->buffers.keyType = rsa_sa_algo;
  25076. ret = DecodePrivateKey(ssl, &keySz);
  25077. if (ret != 0) {
  25078. goto exit_sske;
  25079. }
  25080. args->tmpSigSz = (word32)keySz;
  25081. break;
  25082. }
  25083. #endif /* !NO_RSA */
  25084. #ifdef HAVE_ECC
  25085. case ecc_dsa_sa_algo:
  25086. {
  25087. word16 keySz;
  25088. ssl->buffers.keyType = ecc_dsa_sa_algo;
  25089. ret = DecodePrivateKey(ssl, &keySz);
  25090. if (ret != 0) {
  25091. goto exit_sske;
  25092. }
  25093. /* worst case estimate */
  25094. args->tmpSigSz = keySz;
  25095. break;
  25096. }
  25097. #endif
  25098. #ifdef HAVE_ED25519
  25099. case ed25519_sa_algo:
  25100. {
  25101. word16 keySz;
  25102. ssl->buffers.keyType = ed25519_sa_algo;
  25103. ret = DecodePrivateKey(ssl, &keySz);
  25104. if (ret != 0) {
  25105. goto exit_sske;
  25106. }
  25107. /* worst case estimate */
  25108. args->tmpSigSz = ED25519_SIG_SIZE;
  25109. break;
  25110. }
  25111. #endif /* HAVE_ED25519 */
  25112. #ifdef HAVE_ED448
  25113. case ed448_sa_algo:
  25114. {
  25115. word16 keySz;
  25116. ssl->buffers.keyType = ed448_sa_algo;
  25117. ret = DecodePrivateKey(ssl, &keySz);
  25118. if (ret != 0) {
  25119. goto exit_sske;
  25120. }
  25121. /* worst case estimate */
  25122. args->tmpSigSz = ED448_SIG_SIZE;
  25123. break;
  25124. }
  25125. #endif /* HAVE_ED448 */
  25126. default:
  25127. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  25128. } /* switch(ssl->specs.sig_algo) */
  25129. }
  25130. /* sig length */
  25131. args->length += LENGTH_SZ;
  25132. args->length += args->tmpSigSz;
  25133. if (IsAtLeastTLSv1_2(ssl)) {
  25134. args->length += HASH_SIG_SIZE;
  25135. }
  25136. args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  25137. #ifdef WOLFSSL_DTLS
  25138. if (ssl->options.dtls) {
  25139. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25140. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25141. preSigIdx = args->idx;
  25142. }
  25143. #endif
  25144. if (IsEncryptionOn(ssl, 1)) {
  25145. args->sendSz += MAX_MSG_EXTRA;
  25146. }
  25147. /* Use tmp buffer */
  25148. args->input = (byte*)XMALLOC(args->sendSz,
  25149. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25150. if (args->input == NULL)
  25151. ERROR_OUT(MEMORY_E, exit_sske);
  25152. args->output = args->input;
  25153. /* record and message headers will be added below, when we're sure
  25154. of the sig length */
  25155. /* key exchange data */
  25156. args->output[args->idx++] = named_curve;
  25157. args->output[args->idx++] = 0x00; /* leading zero */
  25158. #ifdef HAVE_CURVE25519
  25159. if (ssl->ecdhCurveOID == ECC_X25519_OID)
  25160. args->output[args->idx++] = WOLFSSL_ECC_X25519;
  25161. else
  25162. #endif
  25163. #ifdef HAVE_CURVE448
  25164. if (ssl->ecdhCurveOID == ECC_X448_OID)
  25165. args->output[args->idx++] = WOLFSSL_ECC_X448;
  25166. else
  25167. #endif
  25168. {
  25169. #ifdef HAVE_ECC
  25170. args->output[args->idx++] =
  25171. SetCurveId(ssl->eccTempKey);
  25172. #endif
  25173. }
  25174. args->output[args->idx++] = (byte)args->exportSz;
  25175. XMEMCPY(args->output + args->idx, args->exportBuf, args->exportSz);
  25176. args->idx += args->exportSz;
  25177. /* Determine hash type */
  25178. if (IsAtLeastTLSv1_2(ssl)) {
  25179. EncodeSigAlg(ssl->suites->hashAlgo,
  25180. ssl->suites->sigAlgo,
  25181. &args->output[args->idx]);
  25182. args->idx += 2;
  25183. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  25184. if (hashType == WC_HASH_TYPE_NONE) {
  25185. ERROR_OUT(ALGO_ID_E, exit_sske);
  25186. }
  25187. } else {
  25188. /* only using sha and md5 for rsa */
  25189. #ifndef NO_OLD_TLS
  25190. hashType = WC_HASH_TYPE_SHA;
  25191. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  25192. hashType = WC_HASH_TYPE_MD5_SHA;
  25193. }
  25194. #else
  25195. ERROR_OUT(ALGO_ID_E, exit_sske);
  25196. #endif
  25197. }
  25198. /* Signature length will be written later, when we're sure what it is */
  25199. #ifdef HAVE_FUZZER
  25200. if (ssl->fuzzerCb) {
  25201. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  25202. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  25203. }
  25204. #endif
  25205. /* Assemble buffer to hash for signature */
  25206. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  25207. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  25208. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25209. if (args->sigDataBuf == NULL) {
  25210. ERROR_OUT(MEMORY_E, exit_sske);
  25211. }
  25212. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  25213. RAN_LEN);
  25214. XMEMCPY(args->sigDataBuf+RAN_LEN,
  25215. ssl->arrays->serverRandom, RAN_LEN);
  25216. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  25217. args->output + preSigIdx, preSigSz);
  25218. if (ssl->suites->sigAlgo != ed25519_sa_algo &&
  25219. ssl->suites->sigAlgo != ed448_sa_algo) {
  25220. ssl->buffers.sig.length =
  25221. wc_HashGetDigestSize(hashType);
  25222. if ((int)ssl->buffers.sig.length < 0) {
  25223. ERROR_OUT(HASH_TYPE_E, exit_sske);
  25224. }
  25225. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  25226. ssl->buffers.sig.length,
  25227. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25228. if (ssl->buffers.sig.buffer == NULL) {
  25229. ERROR_OUT(MEMORY_E, exit_sske);
  25230. }
  25231. /* Perform hash */
  25232. ret = wc_Hash(hashType, args->sigDataBuf,
  25233. args->sigDataSz,
  25234. ssl->buffers.sig.buffer,
  25235. ssl->buffers.sig.length);
  25236. if (ret != 0) {
  25237. goto exit_sske;
  25238. }
  25239. }
  25240. args->sigSz = args->tmpSigSz;
  25241. /* Sign hash to create signature */
  25242. switch (ssl->suites->sigAlgo)
  25243. {
  25244. #ifndef NO_RSA
  25245. case rsa_sa_algo:
  25246. {
  25247. /* For TLS 1.2 re-encode signature */
  25248. if (IsAtLeastTLSv1_2(ssl)) {
  25249. byte* encodedSig = (byte*)XMALLOC(
  25250. MAX_ENCODED_SIG_SZ, ssl->heap,
  25251. DYNAMIC_TYPE_SIGNATURE);
  25252. if (encodedSig == NULL) {
  25253. ERROR_OUT(MEMORY_E, exit_sske);
  25254. }
  25255. ssl->buffers.sig.length =
  25256. wc_EncodeSignature(encodedSig,
  25257. ssl->buffers.sig.buffer,
  25258. ssl->buffers.sig.length,
  25259. TypeHash(ssl->suites->hashAlgo));
  25260. /* Replace sig buffer with new one */
  25261. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  25262. DYNAMIC_TYPE_SIGNATURE);
  25263. ssl->buffers.sig.buffer = encodedSig;
  25264. }
  25265. /* write sig size here */
  25266. c16toa((word16)args->sigSz,
  25267. args->output + args->idx);
  25268. args->idx += LENGTH_SZ;
  25269. break;
  25270. }
  25271. #ifdef WC_RSA_PSS
  25272. case rsa_pss_sa_algo:
  25273. /* write sig size here */
  25274. c16toa((word16)args->sigSz,
  25275. args->output + args->idx);
  25276. args->idx += LENGTH_SZ;
  25277. break;
  25278. #endif
  25279. #endif /* !NO_RSA */
  25280. case ecc_dsa_sa_algo:
  25281. {
  25282. break;
  25283. }
  25284. #ifdef HAVE_ED25519
  25285. case ed25519_sa_algo:
  25286. ret = Ed25519CheckPubKey(ssl);
  25287. if (ret != 0)
  25288. goto exit_sske;
  25289. break;
  25290. #endif /* HAVE_ED25519 */
  25291. #ifdef HAVE_ED448
  25292. case ed448_sa_algo:
  25293. ret = Ed448CheckPubKey(ssl);
  25294. if (ret != 0)
  25295. goto exit_sske;
  25296. break;
  25297. #endif /* HAVE_ED448 */
  25298. default:
  25299. break;
  25300. } /* switch(ssl->specs.sig_algo) */
  25301. break;
  25302. }
  25303. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25304. #if !defined(NO_DH) && (!defined(NO_RSA) || \
  25305. (defined(HAVE_ANON) && !defined(WOLFSSL_NO_TLS12)))
  25306. case diffie_hellman_kea:
  25307. {
  25308. enum wc_HashType hashType;
  25309. word32 preSigSz, preSigIdx;
  25310. args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  25311. args->length = LENGTH_SZ * 3; /* p, g, pub */
  25312. args->length += ssl->buffers.serverDH_P.length +
  25313. ssl->buffers.serverDH_G.length +
  25314. ssl->buffers.serverDH_Pub.length;
  25315. preSigIdx = args->idx;
  25316. preSigSz = args->length;
  25317. if (!ssl->options.usingAnon_cipher) {
  25318. word16 keySz = 0;
  25319. /* sig length */
  25320. args->length += LENGTH_SZ;
  25321. if (ssl->buffers.key == NULL) {
  25322. #ifdef HAVE_PK_CALLBACKS
  25323. if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
  25324. keySz = (word32)GetPrivateKeySigSize(ssl);
  25325. else
  25326. #endif
  25327. ERROR_OUT(NO_PRIVATE_KEY, exit_sske);
  25328. }
  25329. else
  25330. {
  25331. if (ssl->buffers.keyType == 0)
  25332. ssl->buffers.keyType = rsa_sa_algo;
  25333. ret = DecodePrivateKey(ssl, &keySz);
  25334. if (ret != 0) {
  25335. goto exit_sske;
  25336. }
  25337. }
  25338. /* test if keySz has error */
  25339. if (keySz == 0) {
  25340. ERROR_OUT(keySz, exit_sske);
  25341. }
  25342. args->tmpSigSz = (word32)keySz;
  25343. args->length += args->tmpSigSz;
  25344. if (IsAtLeastTLSv1_2(ssl)) {
  25345. args->length += HASH_SIG_SIZE;
  25346. }
  25347. }
  25348. args->sendSz = args->length + HANDSHAKE_HEADER_SZ +
  25349. RECORD_HEADER_SZ;
  25350. #ifdef WOLFSSL_DTLS
  25351. if (ssl->options.dtls) {
  25352. args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25353. args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  25354. preSigIdx = args->idx;
  25355. }
  25356. #endif
  25357. if (IsEncryptionOn(ssl, 1)) {
  25358. args->sendSz += MAX_MSG_EXTRA;
  25359. }
  25360. /* Use tmp buffer */
  25361. args->input = (byte*)XMALLOC(args->sendSz,
  25362. ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25363. if (args->input == NULL)
  25364. ERROR_OUT(MEMORY_E, exit_sske);
  25365. args->output = args->input;
  25366. AddHeaders(args->output, args->length,
  25367. server_key_exchange, ssl);
  25368. /* add p, g, pub */
  25369. c16toa((word16)ssl->buffers.serverDH_P.length,
  25370. args->output + args->idx);
  25371. args->idx += LENGTH_SZ;
  25372. XMEMCPY(args->output + args->idx,
  25373. ssl->buffers.serverDH_P.buffer,
  25374. ssl->buffers.serverDH_P.length);
  25375. args->idx += ssl->buffers.serverDH_P.length;
  25376. /* g */
  25377. c16toa((word16)ssl->buffers.serverDH_G.length,
  25378. args->output + args->idx);
  25379. args->idx += LENGTH_SZ;
  25380. XMEMCPY(args->output + args->idx,
  25381. ssl->buffers.serverDH_G.buffer,
  25382. ssl->buffers.serverDH_G.length);
  25383. args->idx += ssl->buffers.serverDH_G.length;
  25384. /* pub */
  25385. c16toa((word16)ssl->buffers.serverDH_Pub.length,
  25386. args->output + args->idx);
  25387. args->idx += LENGTH_SZ;
  25388. XMEMCPY(args->output + args->idx,
  25389. ssl->buffers.serverDH_Pub.buffer,
  25390. ssl->buffers.serverDH_Pub.length);
  25391. args->idx += ssl->buffers.serverDH_Pub.length;
  25392. #ifdef HAVE_FUZZER
  25393. if (ssl->fuzzerCb) {
  25394. ssl->fuzzerCb(ssl, args->output + preSigIdx,
  25395. preSigSz, FUZZ_SIGNATURE, ssl->fuzzerCtx);
  25396. }
  25397. #endif
  25398. if (ssl->options.usingAnon_cipher) {
  25399. break;
  25400. }
  25401. /* Determine hash type */
  25402. if (IsAtLeastTLSv1_2(ssl)) {
  25403. EncodeSigAlg(ssl->suites->hashAlgo,
  25404. ssl->suites->sigAlgo,
  25405. &args->output[args->idx]);
  25406. args->idx += 2;
  25407. hashType = HashAlgoToType(ssl->suites->hashAlgo);
  25408. if (hashType == WC_HASH_TYPE_NONE) {
  25409. ERROR_OUT(ALGO_ID_E, exit_sske);
  25410. }
  25411. } else {
  25412. /* only using sha and md5 for rsa */
  25413. #ifndef NO_OLD_TLS
  25414. hashType = WC_HASH_TYPE_SHA;
  25415. if (ssl->suites->sigAlgo == rsa_sa_algo) {
  25416. hashType = WC_HASH_TYPE_MD5_SHA;
  25417. }
  25418. #else
  25419. ERROR_OUT(ALGO_ID_E, exit_sske);
  25420. #endif
  25421. }
  25422. /* signature size */
  25423. c16toa((word16)args->tmpSigSz, args->output + args->idx);
  25424. args->idx += LENGTH_SZ;
  25425. /* Assemble buffer to hash for signature */
  25426. args->sigDataSz = RAN_LEN + RAN_LEN + preSigSz;
  25427. args->sigDataBuf = (byte*)XMALLOC(args->sigDataSz,
  25428. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  25429. if (args->sigDataBuf == NULL) {
  25430. ERROR_OUT(MEMORY_E, exit_sske);
  25431. }
  25432. XMEMCPY(args->sigDataBuf, ssl->arrays->clientRandom,
  25433. RAN_LEN);
  25434. XMEMCPY(args->sigDataBuf+RAN_LEN,
  25435. ssl->arrays->serverRandom, RAN_LEN);
  25436. XMEMCPY(args->sigDataBuf+RAN_LEN+RAN_LEN,
  25437. args->output + preSigIdx, preSigSz);
  25438. if (ssl->suites->sigAlgo != ed25519_sa_algo &&
  25439. ssl->suites->sigAlgo != ed448_sa_algo) {
  25440. ssl->buffers.sig.length =
  25441. wc_HashGetDigestSize(hashType);
  25442. ssl->buffers.sig.buffer = (byte*)XMALLOC(
  25443. ssl->buffers.sig.length, ssl->heap,
  25444. DYNAMIC_TYPE_SIGNATURE);
  25445. if (ssl->buffers.sig.buffer == NULL) {
  25446. ERROR_OUT(MEMORY_E, exit_sske);
  25447. }
  25448. /* Perform hash */
  25449. ret = wc_Hash(hashType, args->sigDataBuf,
  25450. args->sigDataSz,
  25451. ssl->buffers.sig.buffer,
  25452. ssl->buffers.sig.length);
  25453. if (ret != 0) {
  25454. goto exit_sske;
  25455. }
  25456. }
  25457. args->sigSz = args->tmpSigSz;
  25458. /* Sign hash to create signature */
  25459. switch (ssl->suites->sigAlgo)
  25460. {
  25461. #ifndef NO_RSA
  25462. case rsa_sa_algo:
  25463. {
  25464. /* For TLS 1.2 re-encode signature */
  25465. if (IsAtLeastTLSv1_2(ssl)) {
  25466. byte* encodedSig = (byte*)XMALLOC(
  25467. MAX_ENCODED_SIG_SZ, ssl->heap,
  25468. DYNAMIC_TYPE_SIGNATURE);
  25469. if (encodedSig == NULL) {
  25470. ERROR_OUT(MEMORY_E, exit_sske);
  25471. }
  25472. ssl->buffers.sig.length =
  25473. wc_EncodeSignature(encodedSig,
  25474. ssl->buffers.sig.buffer,
  25475. ssl->buffers.sig.length,
  25476. TypeHash(ssl->suites->hashAlgo));
  25477. /* Replace sig buffer with new one */
  25478. XFREE(ssl->buffers.sig.buffer, ssl->heap,
  25479. DYNAMIC_TYPE_SIGNATURE);
  25480. ssl->buffers.sig.buffer = encodedSig;
  25481. }
  25482. break;
  25483. }
  25484. #endif /* NO_RSA */
  25485. default:
  25486. break;
  25487. } /* switch (ssl->suites->sigAlgo) */
  25488. break;
  25489. }
  25490. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  25491. default:
  25492. break;
  25493. } /* switch(ssl->specs.kea) */
  25494. /* Check for error */
  25495. if (ret != 0) {
  25496. goto exit_sske;
  25497. }
  25498. /* Advance state and proceed */
  25499. ssl->options.asyncState = TLS_ASYNC_DO;
  25500. } /* case TLS_ASYNC_BUILD */
  25501. FALL_THROUGH;
  25502. case TLS_ASYNC_DO:
  25503. {
  25504. switch(ssl->specs.kea)
  25505. {
  25506. #ifndef NO_PSK
  25507. case psk_kea:
  25508. {
  25509. break;
  25510. }
  25511. #endif /* !NO_PSK */
  25512. #if !defined(NO_DH) && !defined(NO_PSK)
  25513. case dhe_psk_kea:
  25514. {
  25515. break;
  25516. }
  25517. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  25518. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25519. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25520. case ecdhe_psk_kea:
  25521. {
  25522. break;
  25523. }
  25524. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  25525. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25526. defined(HAVE_CURVE448)
  25527. case ecc_diffie_hellman_kea:
  25528. {
  25529. /* Sign hash to create signature */
  25530. switch (ssl->suites->sigAlgo)
  25531. {
  25532. #ifndef NO_RSA
  25533. #ifdef WC_RSA_PSS
  25534. case rsa_pss_sa_algo:
  25535. #endif
  25536. case rsa_sa_algo:
  25537. {
  25538. RsaKey* key = (RsaKey*)ssl->hsKey;
  25539. ret = RsaSign(ssl,
  25540. ssl->buffers.sig.buffer,
  25541. ssl->buffers.sig.length,
  25542. args->output + args->idx,
  25543. &args->sigSz,
  25544. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  25545. key,
  25546. ssl->buffers.key
  25547. );
  25548. break;
  25549. }
  25550. #endif /* !NO_RSA */
  25551. #ifdef HAVE_ECC
  25552. case ecc_dsa_sa_algo:
  25553. {
  25554. ecc_key* key = (ecc_key*)ssl->hsKey;
  25555. ret = EccSign(ssl,
  25556. ssl->buffers.sig.buffer,
  25557. ssl->buffers.sig.length,
  25558. args->output + LENGTH_SZ + args->idx,
  25559. &args->sigSz,
  25560. key,
  25561. #ifdef HAVE_PK_CALLBACKS
  25562. ssl->buffers.key
  25563. #else
  25564. NULL
  25565. #endif
  25566. );
  25567. break;
  25568. }
  25569. #endif /* HAVE_ECC */
  25570. #ifdef HAVE_ED25519
  25571. case ed25519_sa_algo:
  25572. {
  25573. ed25519_key* key = (ed25519_key*)ssl->hsKey;
  25574. ret = Ed25519Sign(ssl,
  25575. args->sigDataBuf, args->sigDataSz,
  25576. args->output + LENGTH_SZ + args->idx,
  25577. &args->sigSz,
  25578. key,
  25579. #ifdef HAVE_PK_CALLBACKS
  25580. ssl->buffers.key
  25581. #else
  25582. NULL
  25583. #endif
  25584. );
  25585. break;
  25586. }
  25587. #endif
  25588. #ifdef HAVE_ED448
  25589. case ed448_sa_algo:
  25590. {
  25591. ed448_key* key = (ed448_key*)ssl->hsKey;
  25592. ret = Ed448Sign(ssl,
  25593. args->sigDataBuf, args->sigDataSz,
  25594. args->output + LENGTH_SZ + args->idx,
  25595. &args->sigSz,
  25596. key,
  25597. #ifdef HAVE_PK_CALLBACKS
  25598. ssl->buffers.key
  25599. #else
  25600. NULL
  25601. #endif
  25602. );
  25603. break;
  25604. }
  25605. #endif
  25606. default:
  25607. ERROR_OUT(ALGO_ID_E, exit_sske);
  25608. } /* switch(ssl->specs.sig_algo) */
  25609. break;
  25610. }
  25611. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25612. #if !defined(NO_DH) && !defined(NO_RSA)
  25613. case diffie_hellman_kea:
  25614. {
  25615. /* Sign hash to create signature */
  25616. switch (ssl->suites->sigAlgo)
  25617. {
  25618. #ifndef NO_RSA
  25619. #ifdef WC_RSA_PSS
  25620. case rsa_pss_sa_algo:
  25621. #endif
  25622. case rsa_sa_algo:
  25623. {
  25624. RsaKey* key = (RsaKey*)ssl->hsKey;
  25625. if (ssl->options.usingAnon_cipher) {
  25626. break;
  25627. }
  25628. ret = RsaSign(ssl,
  25629. ssl->buffers.sig.buffer,
  25630. ssl->buffers.sig.length,
  25631. args->output + args->idx,
  25632. &args->sigSz,
  25633. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  25634. key,
  25635. ssl->buffers.key
  25636. );
  25637. break;
  25638. }
  25639. #endif /* NO_RSA */
  25640. default:
  25641. break;
  25642. } /* switch (ssl->suites->sigAlgo) */
  25643. break;
  25644. }
  25645. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  25646. default:
  25647. break;
  25648. } /* switch(ssl->specs.kea) */
  25649. /* Check for error */
  25650. if (ret != 0) {
  25651. goto exit_sske;
  25652. }
  25653. /* Advance state and proceed */
  25654. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  25655. } /* case TLS_ASYNC_DO */
  25656. FALL_THROUGH;
  25657. case TLS_ASYNC_VERIFY:
  25658. {
  25659. switch(ssl->specs.kea)
  25660. {
  25661. #ifndef NO_PSK
  25662. case psk_kea:
  25663. {
  25664. /* Nothing to do in this sub-state */
  25665. break;
  25666. }
  25667. #endif /* !NO_PSK */
  25668. #if !defined(NO_DH) && !defined(NO_PSK)
  25669. case dhe_psk_kea:
  25670. {
  25671. /* Nothing to do in this sub-state */
  25672. break;
  25673. }
  25674. #endif /* !defined(NO_DH) && !defined(NO_PSK) */
  25675. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25676. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  25677. case ecdhe_psk_kea:
  25678. {
  25679. /* Nothing to do in this sub-state */
  25680. break;
  25681. }
  25682. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  25683. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25684. defined(HAVE_CURVE448)
  25685. case ecc_diffie_hellman_kea:
  25686. {
  25687. switch(ssl->suites->sigAlgo)
  25688. {
  25689. #ifndef NO_RSA
  25690. #ifdef WC_RSA_PSS
  25691. case rsa_pss_sa_algo:
  25692. #endif
  25693. case rsa_sa_algo:
  25694. {
  25695. RsaKey* key = (RsaKey*)ssl->hsKey;
  25696. if (args->verifySig == NULL) {
  25697. if (args->sigSz == 0) {
  25698. ERROR_OUT(BAD_COND_E, exit_sske);
  25699. }
  25700. args->verifySig = (byte*)XMALLOC(
  25701. args->sigSz, ssl->heap,
  25702. DYNAMIC_TYPE_SIGNATURE);
  25703. if (!args->verifySig) {
  25704. ERROR_OUT(MEMORY_E, exit_sske);
  25705. }
  25706. XMEMCPY(args->verifySig,
  25707. args->output + args->idx, args->sigSz);
  25708. }
  25709. /* check for signature faults */
  25710. ret = VerifyRsaSign(ssl,
  25711. args->verifySig, args->sigSz,
  25712. ssl->buffers.sig.buffer,
  25713. ssl->buffers.sig.length,
  25714. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  25715. key, ssl->buffers.key
  25716. );
  25717. break;
  25718. }
  25719. #endif
  25720. case ecc_dsa_sa_algo:
  25721. #ifdef HAVE_ED25519
  25722. case ed25519_sa_algo:
  25723. #endif
  25724. #ifdef HAVE_ED448
  25725. case ed448_sa_algo:
  25726. #endif
  25727. {
  25728. /* Now that we know the real sig size, write it. */
  25729. c16toa((word16)args->sigSz,
  25730. args->output + args->idx);
  25731. /* And adjust length and sendSz from estimates */
  25732. args->length += args->sigSz - args->tmpSigSz;
  25733. args->sendSz += args->sigSz - args->tmpSigSz;
  25734. break;
  25735. }
  25736. default:
  25737. ERROR_OUT(ALGO_ID_E, exit_sske); /* unsupported type */
  25738. } /* switch(ssl->specs.sig_algo) */
  25739. break;
  25740. }
  25741. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25742. #if !defined(NO_DH) && !defined(NO_RSA)
  25743. case diffie_hellman_kea:
  25744. {
  25745. switch (ssl->suites->sigAlgo)
  25746. {
  25747. #ifndef NO_RSA
  25748. #ifndef WC_RSA_PSS
  25749. case rsa_pss_sa_algo:
  25750. #endif
  25751. case rsa_sa_algo:
  25752. {
  25753. RsaKey* key = (RsaKey*)ssl->hsKey;
  25754. if (ssl->options.usingAnon_cipher) {
  25755. break;
  25756. }
  25757. if (args->verifySig == NULL) {
  25758. if (args->sigSz == 0) {
  25759. ERROR_OUT(BAD_COND_E, exit_sske);
  25760. }
  25761. args->verifySig = (byte*)XMALLOC(
  25762. args->sigSz, ssl->heap,
  25763. DYNAMIC_TYPE_SIGNATURE);
  25764. if (!args->verifySig) {
  25765. ERROR_OUT(MEMORY_E, exit_sske);
  25766. }
  25767. XMEMCPY(args->verifySig,
  25768. args->output + args->idx, args->sigSz);
  25769. }
  25770. /* check for signature faults */
  25771. ret = VerifyRsaSign(ssl,
  25772. args->verifySig, args->sigSz,
  25773. ssl->buffers.sig.buffer,
  25774. ssl->buffers.sig.length,
  25775. ssl->suites->sigAlgo, ssl->suites->hashAlgo,
  25776. key, ssl->buffers.key
  25777. );
  25778. break;
  25779. }
  25780. #endif
  25781. } /* switch (ssl->suites->sigAlgo) */
  25782. break;
  25783. }
  25784. #endif /* !defined(NO_DH) && !defined(NO_RSA) */
  25785. default:
  25786. break;
  25787. } /* switch(ssl->specs.kea) */
  25788. /* Check for error */
  25789. if (ret != 0) {
  25790. goto exit_sske;
  25791. }
  25792. /* Advance state and proceed */
  25793. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  25794. } /* case TLS_ASYNC_VERIFY */
  25795. FALL_THROUGH;
  25796. case TLS_ASYNC_FINALIZE:
  25797. {
  25798. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25799. defined(HAVE_CURVE448)
  25800. if (ssl->specs.kea == ecdhe_psk_kea ||
  25801. ssl->specs.kea == ecc_diffie_hellman_kea) {
  25802. /* Check output to make sure it was set */
  25803. if (args->output) {
  25804. AddHeaders(args->output, args->length,
  25805. server_key_exchange, ssl);
  25806. }
  25807. else {
  25808. ERROR_OUT(BUFFER_ERROR, exit_sske);
  25809. }
  25810. }
  25811. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  25812. /* Advance state and proceed */
  25813. ssl->options.asyncState = TLS_ASYNC_END;
  25814. } /* case TLS_ASYNC_FINALIZE */
  25815. FALL_THROUGH;
  25816. case TLS_ASYNC_END:
  25817. {
  25818. ret = SendHandshakeMsg(ssl, args->output, args->length,
  25819. server_key_exchange, "ServerKeyExchange");
  25820. if (ret != 0)
  25821. goto exit_sske;
  25822. ssl->options.serverState = SERVER_KEYEXCHANGE_COMPLETE;
  25823. break;
  25824. }
  25825. default:
  25826. ret = INPUT_CASE_ERROR;
  25827. } /* switch(ssl->options.asyncState) */
  25828. exit_sske:
  25829. WOLFSSL_LEAVE("SendServerKeyExchange", ret);
  25830. WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND);
  25831. #ifdef WOLFSSL_ASYNC_IO
  25832. /* Handle async operation */
  25833. if (ret == WANT_WRITE
  25834. #ifdef WOLFSSL_ASYNC_CRYPT
  25835. || ret == WC_PENDING_E
  25836. #endif
  25837. )
  25838. return ret;
  25839. #endif /* WOLFSSL_ASYNC_IO */
  25840. /* Final cleanup */
  25841. if (args->input != NULL) {
  25842. XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  25843. args->input = NULL;
  25844. }
  25845. #ifdef WOLFSSL_ASYNC_IO
  25846. /* Cleanup async */
  25847. FreeAsyncCtx(ssl, 0);
  25848. #else
  25849. FreeSskeArgs(ssl, args);
  25850. #endif
  25851. FreeKeyExchange(ssl);
  25852. return ret;
  25853. }
  25854. #if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \
  25855. defined(OPENSSL_ALL)
  25856. /* search suites for specific one, idx on success, negative on error */
  25857. static int FindSuite(Suites* suites, byte first, byte second)
  25858. {
  25859. int i;
  25860. if (suites == NULL || suites->suiteSz == 0) {
  25861. WOLFSSL_MSG("Suites pointer error or suiteSz 0");
  25862. return SUITES_ERROR;
  25863. }
  25864. for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) {
  25865. if (suites->suites[i] == first &&
  25866. suites->suites[i+1] == second )
  25867. return i;
  25868. }
  25869. return MATCH_SUITE_ERROR;
  25870. }
  25871. #endif
  25872. #endif /* !WOLFSSL_NO_TLS12 */
  25873. /* Make sure server cert/key are valid for this suite, true on success
  25874. * Returns 1 for valid server suite or 0 if not found
  25875. * For asynchronous this can return WC_PENDING_E
  25876. */
  25877. static int VerifyServerSuite(WOLFSSL* ssl, word16 idx)
  25878. {
  25879. #ifndef NO_PSK
  25880. int havePSK = ssl->options.havePSK;
  25881. #endif
  25882. byte first;
  25883. byte second;
  25884. WOLFSSL_ENTER("VerifyServerSuite");
  25885. if (ssl->suites == NULL) {
  25886. WOLFSSL_MSG("Suites pointer error");
  25887. return 0;
  25888. }
  25889. first = ssl->suites->suites[idx];
  25890. second = ssl->suites->suites[idx+1];
  25891. if (CipherRequires(first, second, REQUIRES_RSA)) {
  25892. WOLFSSL_MSG("Requires RSA");
  25893. if (ssl->options.haveRSA == 0) {
  25894. WOLFSSL_MSG("Don't have RSA");
  25895. return 0;
  25896. }
  25897. }
  25898. if (CipherRequires(first, second, REQUIRES_DHE)) {
  25899. WOLFSSL_MSG("Requires DHE");
  25900. if (ssl->options.haveDH == 0) {
  25901. WOLFSSL_MSG("Don't have DHE");
  25902. return 0;
  25903. }
  25904. }
  25905. if (CipherRequires(first, second, REQUIRES_ECC)) {
  25906. WOLFSSL_MSG("Requires ECC");
  25907. if (ssl->options.haveECC == 0) {
  25908. WOLFSSL_MSG("Don't have ECC");
  25909. return 0;
  25910. }
  25911. }
  25912. if (CipherRequires(first, second, REQUIRES_ECC_STATIC)) {
  25913. WOLFSSL_MSG("Requires static ECC");
  25914. if (ssl->options.haveStaticECC == 0) {
  25915. WOLFSSL_MSG("Don't have static ECC");
  25916. return 0;
  25917. }
  25918. }
  25919. if (CipherRequires(first, second, REQUIRES_PSK)) {
  25920. WOLFSSL_MSG("Requires PSK");
  25921. #ifndef NO_PSK
  25922. if (havePSK == 0)
  25923. #endif
  25924. {
  25925. WOLFSSL_MSG("Don't have PSK");
  25926. return 0;
  25927. }
  25928. }
  25929. if (CipherRequires(first, second, REQUIRES_RSA_SIG)) {
  25930. WOLFSSL_MSG("Requires RSA Signature");
  25931. if (ssl->options.side == WOLFSSL_SERVER_END &&
  25932. ssl->options.haveECDSAsig == 1) {
  25933. WOLFSSL_MSG("Don't have RSA Signature");
  25934. return 0;
  25935. }
  25936. }
  25937. #if !defined(WOLFSSL_OLDTLS_AEAD_CIPHERSUITES)
  25938. if (CipherRequires(first, second, REQUIRES_AEAD)) {
  25939. WOLFSSL_MSG("Requires AEAD");
  25940. if (ssl->version.major == SSLv3_MAJOR &&
  25941. ssl->version.minor < TLSv1_2_MINOR) {
  25942. WOLFSSL_MSG("Version of SSL does not support AEAD ciphers");
  25943. return 0;
  25944. }
  25945. }
  25946. #endif
  25947. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  25948. defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
  25949. if (!TLSX_ValidateSupportedCurves(ssl, first, second)) {
  25950. WOLFSSL_MSG("Don't have matching curves");
  25951. return 0;
  25952. }
  25953. #endif
  25954. #ifdef WOLFSSL_TLS13
  25955. if (IsAtLeastTLSv1_3(ssl->version) &&
  25956. ssl->options.side == WOLFSSL_SERVER_END) {
  25957. #ifdef HAVE_SUPPORTED_CURVES
  25958. int doHelloRetry = 0;
  25959. /* Try to establish a key share. */
  25960. int ret = TLSX_KeyShare_Establish(ssl, &doHelloRetry);
  25961. if (doHelloRetry) {
  25962. ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
  25963. }
  25964. #ifdef WOLFSSL_ASYNC_CRYPT
  25965. if (ret == WC_PENDING_E)
  25966. return ret;
  25967. #endif
  25968. if (!doHelloRetry && ret != 0) {
  25969. return 0; /* not found */
  25970. }
  25971. #endif /* HAVE_SUPPORTED_CURVES */
  25972. }
  25973. else if (first == TLS13_BYTE || (first == ECC_BYTE &&
  25974. (second == TLS_SHA256_SHA256 || second == TLS_SHA384_SHA384))) {
  25975. /* Can't negotiate TLS 1.3 cipher suites with lower protocol
  25976. * version. */
  25977. return 0;
  25978. }
  25979. #endif /* WOLFSSL_TLS13 */
  25980. return 1;
  25981. }
  25982. static int CompareSuites(WOLFSSL* ssl, Suites* peerSuites, word16 i,
  25983. word16 j)
  25984. {
  25985. if (ssl->suites->suites[i] == peerSuites->suites[j] &&
  25986. ssl->suites->suites[i+1] == peerSuites->suites[j+1] ) {
  25987. int ret = VerifyServerSuite(ssl, i);
  25988. #ifdef WOLFSSL_ASYNC_CRYPT
  25989. if (ret == WC_PENDING_E)
  25990. return ret;
  25991. #endif
  25992. if (ret) {
  25993. WOLFSSL_MSG("Verified suite validity");
  25994. ssl->options.cipherSuite0 = ssl->suites->suites[i];
  25995. ssl->options.cipherSuite = ssl->suites->suites[i+1];
  25996. ret = SetCipherSpecs(ssl);
  25997. if (ret == 0) {
  25998. ret = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo,
  25999. peerSuites->hashSigAlgoSz);
  26000. }
  26001. return ret;
  26002. }
  26003. else {
  26004. WOLFSSL_MSG("Could not verify suite validity, continue");
  26005. }
  26006. }
  26007. return MATCH_SUITE_ERROR;
  26008. }
  26009. int MatchSuite(WOLFSSL* ssl, Suites* peerSuites)
  26010. {
  26011. int ret;
  26012. word16 i, j;
  26013. WOLFSSL_ENTER("MatchSuite");
  26014. /* & 0x1 equivalent % 2 */
  26015. if (peerSuites->suiteSz == 0 || peerSuites->suiteSz & 0x1)
  26016. return BUFFER_ERROR;
  26017. if (ssl->suites == NULL)
  26018. return SUITES_ERROR;
  26019. if (!ssl->options.useClientOrder) {
  26020. /* Server order */
  26021. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  26022. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  26023. ret = CompareSuites(ssl, peerSuites, i, j);
  26024. if (ret != MATCH_SUITE_ERROR)
  26025. return ret;
  26026. }
  26027. }
  26028. }
  26029. else {
  26030. /* Client order */
  26031. for (j = 0; j < peerSuites->suiteSz; j += 2) {
  26032. for (i = 0; i < ssl->suites->suiteSz; i += 2) {
  26033. ret = CompareSuites(ssl, peerSuites, i, j);
  26034. if (ret != MATCH_SUITE_ERROR)
  26035. return ret;
  26036. }
  26037. }
  26038. }
  26039. return MATCH_SUITE_ERROR;
  26040. }
  26041. #ifdef OLD_HELLO_ALLOWED
  26042. /* process old style client hello, deprecate? */
  26043. int ProcessOldClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  26044. word32 inSz, word16 sz)
  26045. {
  26046. word32 idx = *inOutIdx;
  26047. word16 sessionSz;
  26048. word16 randomSz;
  26049. word16 i, j;
  26050. ProtocolVersion pv;
  26051. Suites clSuites;
  26052. int ret = -1;
  26053. (void)inSz;
  26054. WOLFSSL_MSG("Got old format client hello");
  26055. #ifdef WOLFSSL_CALLBACKS
  26056. if (ssl->hsInfoOn)
  26057. AddPacketName(ssl, "ClientHello");
  26058. if (ssl->toInfoOn)
  26059. AddLateName("ClientHello", &ssl->timeoutInfo);
  26060. #endif
  26061. /* manually hash input since different format */
  26062. #ifndef NO_OLD_TLS
  26063. #ifndef NO_MD5
  26064. wc_Md5Update(&ssl->hsHashes->hashMd5, input + idx, sz);
  26065. #endif
  26066. #ifndef NO_SHA
  26067. wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz);
  26068. #endif
  26069. #endif
  26070. #ifndef NO_SHA256
  26071. if (IsAtLeastTLSv1_2(ssl)) {
  26072. int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256,
  26073. input + idx, sz);
  26074. if (shaRet != 0)
  26075. return shaRet;
  26076. }
  26077. #endif
  26078. /* does this value mean client_hello? */
  26079. idx++;
  26080. /* version */
  26081. pv.major = input[idx++];
  26082. pv.minor = input[idx++];
  26083. ssl->chVersion = pv; /* store */
  26084. if (ssl->version.minor > pv.minor) {
  26085. byte haveRSA = 0;
  26086. byte havePSK = 0;
  26087. int keySz = 0;
  26088. if (!ssl->options.downgrade) {
  26089. WOLFSSL_MSG("Client trying to connect with lesser version");
  26090. return VERSION_ERROR;
  26091. }
  26092. if (pv.minor < ssl->options.minDowngrade) {
  26093. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  26094. return VERSION_ERROR;
  26095. }
  26096. if (pv.minor == SSLv3_MINOR) {
  26097. /* turn off tls */
  26098. WOLFSSL_MSG("\tdowngrading to SSLv3");
  26099. ssl->options.tls = 0;
  26100. ssl->options.tls1_1 = 0;
  26101. ssl->version.minor = SSLv3_MINOR;
  26102. }
  26103. else if (pv.minor == TLSv1_MINOR) {
  26104. WOLFSSL_MSG("\tdowngrading to TLSv1");
  26105. /* turn off tls 1.1+ */
  26106. ssl->options.tls1_1 = 0;
  26107. ssl->version.minor = TLSv1_MINOR;
  26108. }
  26109. else if (pv.minor == TLSv1_1_MINOR) {
  26110. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  26111. ssl->version.minor = TLSv1_1_MINOR;
  26112. }
  26113. else if (pv.minor == TLSv1_2_MINOR) {
  26114. WOLFSSL_MSG(" downgrading to TLSv1.2");
  26115. ssl->version.minor = TLSv1_2_MINOR;
  26116. }
  26117. #ifndef NO_RSA
  26118. haveRSA = 1;
  26119. #endif
  26120. #ifndef NO_PSK
  26121. havePSK = ssl->options.havePSK;
  26122. #endif
  26123. #ifndef NO_CERTS
  26124. keySz = ssl->buffers.keySz;
  26125. #endif
  26126. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  26127. ssl->options.haveDH, ssl->options.haveECDSAsig,
  26128. ssl->options.haveECC, ssl->options.haveStaticECC,
  26129. ssl->options.haveFalconSig, ssl->options.haveAnon,
  26130. ssl->options.side);
  26131. }
  26132. /* suite size */
  26133. ato16(&input[idx], &clSuites.suiteSz);
  26134. idx += OPAQUE16_LEN;
  26135. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
  26136. return BUFFER_ERROR;
  26137. /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
  26138. if (clSuites.suiteSz % 3 != 0)
  26139. return BUFFER_ERROR;
  26140. clSuites.hashSigAlgoSz = 0;
  26141. /* session size */
  26142. ato16(&input[idx], &sessionSz);
  26143. idx += OPAQUE16_LEN;
  26144. if (sessionSz > ID_LEN)
  26145. return BUFFER_ERROR;
  26146. /* random size */
  26147. ato16(&input[idx], &randomSz);
  26148. idx += OPAQUE16_LEN;
  26149. if (randomSz > RAN_LEN)
  26150. return BUFFER_ERROR;
  26151. /* suites */
  26152. for (i = 0, j = 0; i < clSuites.suiteSz; i += 3) {
  26153. byte first = input[idx++];
  26154. if (!first) { /* implicit: skip sslv2 type */
  26155. XMEMCPY(&clSuites.suites[j], &input[idx], SUITE_LEN);
  26156. j += SUITE_LEN;
  26157. }
  26158. idx += SUITE_LEN;
  26159. }
  26160. clSuites.suiteSz = j;
  26161. /* session id */
  26162. if (sessionSz) {
  26163. XMEMCPY(ssl->arrays->sessionID, input + idx, sessionSz);
  26164. ssl->arrays->sessionIDSz = (byte)sessionSz;
  26165. idx += sessionSz;
  26166. ssl->options.resuming = 1;
  26167. }
  26168. /* random */
  26169. if (randomSz < RAN_LEN)
  26170. XMEMSET(ssl->arrays->clientRandom, 0, RAN_LEN - randomSz);
  26171. XMEMCPY(&ssl->arrays->clientRandom[RAN_LEN - randomSz], input + idx,
  26172. randomSz);
  26173. idx += randomSz;
  26174. if (ssl->options.usingCompression)
  26175. ssl->options.usingCompression = 0; /* turn off */
  26176. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  26177. ssl->cbmode = SSL_CB_MODE_WRITE;
  26178. *inOutIdx = idx;
  26179. ssl->options.haveSessionId = 1;
  26180. /* DoClientHello uses same resume code */
  26181. if (ssl->options.resuming) { /* let's try */
  26182. WOLFSSL_SESSION* session = wolfSSL_GetSession(ssl,
  26183. ssl->arrays->masterSecret, 1);
  26184. #ifdef HAVE_SESSION_TICKET
  26185. if (ssl->options.useTicket == 1) {
  26186. session = ssl->session;
  26187. }
  26188. #endif
  26189. if (!session) {
  26190. WOLFSSL_MSG("Session lookup for resume failed");
  26191. ssl->options.resuming = 0;
  26192. } else {
  26193. if (MatchSuite(ssl, &clSuites) < 0) {
  26194. WOLFSSL_MSG("Unsupported cipher suite, OldClientHello");
  26195. return UNSUPPORTED_SUITE;
  26196. }
  26197. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom,
  26198. RAN_LEN);
  26199. if (ret != 0)
  26200. return ret;
  26201. #ifdef NO_OLD_TLS
  26202. ret = DeriveTlsKeys(ssl);
  26203. #else
  26204. #ifndef NO_TLS
  26205. if (ssl->options.tls)
  26206. ret = DeriveTlsKeys(ssl);
  26207. #endif
  26208. if (!ssl->options.tls)
  26209. ret = DeriveKeys(ssl);
  26210. #endif
  26211. /* SERVER: peer auth based on session secret. */
  26212. ssl->options.peerAuthGood = (ret == 0);
  26213. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  26214. return ret;
  26215. }
  26216. }
  26217. ret = MatchSuite(ssl, &clSuites);
  26218. if (ret != 0)return ret;
  26219. return SanityCheckMsgReceived(ssl, client_hello);
  26220. }
  26221. #endif /* OLD_HELLO_ALLOWED */
  26222. #ifndef WOLFSSL_NO_TLS12
  26223. /**
  26224. * Handles session resumption.
  26225. * Session tickets are checked for validity based on the time each ticket
  26226. * was created, timeout value and the current time. If the tickets are
  26227. * judged expired, falls back to full-handshake. If you want disable this
  26228. * session ticket validation check in TLS1.2 and below, define
  26229. * WOLFSSL_NO_TICKET_EXPRE.
  26230. */
  26231. int HandleTlsResumption(WOLFSSL* ssl, int bogusID, Suites* clSuites)
  26232. {
  26233. int ret = 0;
  26234. WOLFSSL_SESSION* session;
  26235. (void)bogusID;
  26236. #ifdef HAVE_SESSION_TICKET
  26237. if (ssl->options.useTicket == 1) {
  26238. session = ssl->session;
  26239. } else if (bogusID == 1 && ssl->options.rejectTicket == 0) {
  26240. WOLFSSL_MSG("Bogus session ID without session ticket");
  26241. return BUFFER_ERROR;
  26242. } else
  26243. #endif
  26244. {
  26245. session = wolfSSL_GetSession(ssl, ssl->arrays->masterSecret, 1);
  26246. }
  26247. if (!session) {
  26248. WOLFSSL_MSG("Session lookup for resume failed");
  26249. ssl->options.resuming = 0;
  26250. return ret;
  26251. }
  26252. #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_TICKET_EXPIRE) && \
  26253. !defined(NO_ASN_TIME)
  26254. /* check if the ticket is valid */
  26255. if (LowResTimer() > session->bornOn + ssl->timeout) {
  26256. WOLFSSL_MSG("Expired session ticket, fall back to full handshake.");
  26257. ssl->options.resuming = 0;
  26258. }
  26259. #endif /* HAVE_SESSION_TICKET && !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */
  26260. else if (session->haveEMS != ssl->options.haveEMS) {
  26261. /* RFC 7627, 5.3, server-side */
  26262. /* if old sess didn't have EMS, but new does, full handshake */
  26263. if (!session->haveEMS && ssl->options.haveEMS) {
  26264. WOLFSSL_MSG("Attempting to resume a session that didn't "
  26265. "use EMS with a new session with EMS. Do full "
  26266. "handshake.");
  26267. ssl->options.resuming = 0;
  26268. }
  26269. /* if old sess used EMS, but new doesn't, MUST abort */
  26270. else if (session->haveEMS && !ssl->options.haveEMS) {
  26271. WOLFSSL_MSG("Trying to resume a session with EMS without "
  26272. "using EMS");
  26273. #ifdef WOLFSSL_EXTRA_ALERTS
  26274. SendAlert(ssl, alert_fatal, handshake_failure);
  26275. #endif
  26276. ret = EXT_MASTER_SECRET_NEEDED_E;
  26277. }
  26278. }
  26279. else {
  26280. #ifndef NO_RESUME_SUITE_CHECK
  26281. int j;
  26282. /* Check client suites include the one in session */
  26283. for (j = 0; j < clSuites->suiteSz; j += 2) {
  26284. if (clSuites->suites[j] == session->cipherSuite0 &&
  26285. clSuites->suites[j+1] == session->cipherSuite) {
  26286. break;
  26287. }
  26288. }
  26289. if (j == clSuites->suiteSz) {
  26290. WOLFSSL_MSG("Prev session's cipher suite not in ClientHello");
  26291. #ifdef WOLFSSL_EXTRA_ALERTS
  26292. SendAlert(ssl, alert_fatal, illegal_parameter);
  26293. #endif
  26294. ret = UNSUPPORTED_SUITE;
  26295. }
  26296. #endif
  26297. if (ret == 0 && ssl->options.resuming) {
  26298. /* for resumption use the cipher suite from session */
  26299. ssl->options.cipherSuite0 = session->cipherSuite0;
  26300. ssl->options.cipherSuite = session->cipherSuite;
  26301. ret = SetCipherSpecs(ssl);
  26302. if (ret == 0) {
  26303. ret = PickHashSigAlgo(ssl, clSuites->hashSigAlgo,
  26304. clSuites->hashSigAlgoSz);
  26305. }
  26306. }
  26307. else if (ret == 0) {
  26308. if (MatchSuite(ssl, clSuites) < 0) {
  26309. WOLFSSL_MSG("Unsupported cipher suite, ClientHello");
  26310. ret = UNSUPPORTED_SUITE;
  26311. }
  26312. }
  26313. if (ret == 0) {
  26314. ret = wc_RNG_GenerateBlock(ssl->rng,
  26315. ssl->arrays->serverRandom, RAN_LEN);
  26316. }
  26317. if (ret == 0) {
  26318. #ifdef NO_OLD_TLS
  26319. ret = DeriveTlsKeys(ssl);
  26320. #else
  26321. #ifndef NO_TLS
  26322. if (ssl->options.tls)
  26323. ret = DeriveTlsKeys(ssl);
  26324. #endif
  26325. if (!ssl->options.tls)
  26326. ret = DeriveKeys(ssl);
  26327. #endif
  26328. /* SERVER: peer auth based on session secret. */
  26329. ssl->options.peerAuthGood = (ret == 0);
  26330. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  26331. }
  26332. }
  26333. return ret;
  26334. }
  26335. /* handle processing of client_hello (1) */
  26336. int DoClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
  26337. word32 helloSz)
  26338. {
  26339. byte b;
  26340. byte bogusID = 0; /* flag for a bogus session id */
  26341. ProtocolVersion pv;
  26342. Suites clSuites;
  26343. word32 i = *inOutIdx;
  26344. word32 begin = i;
  26345. int ret = 0;
  26346. #ifdef WOLFSSL_DTLS
  26347. Hmac cookieHmac;
  26348. byte newCookie[MAX_COOKIE_LEN];
  26349. byte peerCookie[MAX_COOKIE_LEN];
  26350. byte peerCookieSz = 0;
  26351. byte cookieType;
  26352. byte cookieSz = 0;
  26353. XMEMSET(&cookieHmac, 0, sizeof(Hmac));
  26354. #endif /* WOLFSSL_DTLS */
  26355. WOLFSSL_START(WC_FUNC_CLIENT_HELLO_DO);
  26356. WOLFSSL_ENTER("DoClientHello");
  26357. #ifdef WOLFSSL_CALLBACKS
  26358. if (ssl->hsInfoOn) AddPacketName(ssl, "ClientHello");
  26359. if (ssl->toInfoOn) AddLateName("ClientHello", &ssl->timeoutInfo);
  26360. #endif
  26361. /* protocol version, random and session id length check */
  26362. if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz)
  26363. return BUFFER_ERROR;
  26364. /* protocol version */
  26365. XMEMCPY(&pv, input + i, OPAQUE16_LEN);
  26366. ssl->chVersion = pv; /* store */
  26367. #ifdef WOLFSSL_DTLS
  26368. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  26369. #if defined(NO_SHA) && defined(NO_SHA256)
  26370. #error "DTLS needs either SHA or SHA-256"
  26371. #endif /* NO_SHA && NO_SHA256 */
  26372. #if !defined(NO_SHA) && defined(NO_SHA256)
  26373. cookieType = WC_SHA;
  26374. cookieSz = WC_SHA_DIGEST_SIZE;
  26375. #endif /* NO_SHA */
  26376. #ifndef NO_SHA256
  26377. cookieType = WC_SHA256;
  26378. cookieSz = WC_SHA256_DIGEST_SIZE;
  26379. #endif /* NO_SHA256 */
  26380. ret = wc_HmacSetKey(&cookieHmac, cookieType,
  26381. ssl->buffers.dtlsCookieSecret.buffer,
  26382. ssl->buffers.dtlsCookieSecret.length);
  26383. if (ret != 0) goto out;
  26384. ret = wc_HmacUpdate(&cookieHmac,
  26385. (const byte*)ssl->buffers.dtlsCtx.peer.sa,
  26386. ssl->buffers.dtlsCtx.peer.sz);
  26387. if (ret != 0) goto out;
  26388. ret = wc_HmacUpdate(&cookieHmac, input + i, OPAQUE16_LEN);
  26389. if (ret != 0) goto out;
  26390. }
  26391. #endif /* WOLFSSL_DTLS */
  26392. i += OPAQUE16_LEN;
  26393. /* Legacy protocol version cannot negotiate TLS 1.3 or higher. */
  26394. if (pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_3_MINOR)
  26395. pv.minor = TLSv1_2_MINOR;
  26396. if ((!ssl->options.dtls && ssl->version.minor > pv.minor) ||
  26397. (ssl->options.dtls && ssl->version.minor != DTLS_MINOR
  26398. && ssl->version.minor != DTLSv1_2_MINOR && pv.minor != DTLS_MINOR
  26399. && pv.minor != DTLSv1_2_MINOR)) {
  26400. word16 haveRSA = 0;
  26401. word16 havePSK = 0;
  26402. int keySz = 0;
  26403. if (!ssl->options.downgrade) {
  26404. WOLFSSL_MSG("Client trying to connect with lesser version");
  26405. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA)
  26406. SendAlert(ssl, alert_fatal, handshake_failure);
  26407. #endif
  26408. ret = VERSION_ERROR;
  26409. goto out;
  26410. }
  26411. if (pv.minor < ssl->options.minDowngrade) {
  26412. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  26413. #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA)
  26414. SendAlert(ssl, alert_fatal, handshake_failure);
  26415. #endif
  26416. ret = VERSION_ERROR;
  26417. goto out;
  26418. }
  26419. if (pv.minor == SSLv3_MINOR) {
  26420. /* turn off tls */
  26421. WOLFSSL_MSG("\tdowngrading to SSLv3");
  26422. ssl->options.tls = 0;
  26423. ssl->options.tls1_1 = 0;
  26424. ssl->version.minor = SSLv3_MINOR;
  26425. }
  26426. else if (pv.minor == TLSv1_MINOR) {
  26427. /* turn off tls 1.1+ */
  26428. WOLFSSL_MSG("\tdowngrading to TLSv1");
  26429. ssl->options.tls1_1 = 0;
  26430. ssl->version.minor = TLSv1_MINOR;
  26431. }
  26432. else if (pv.minor == TLSv1_1_MINOR) {
  26433. WOLFSSL_MSG("\tdowngrading to TLSv1.1");
  26434. ssl->version.minor = TLSv1_1_MINOR;
  26435. }
  26436. else if (pv.minor == TLSv1_2_MINOR) {
  26437. WOLFSSL_MSG(" downgrading to TLSv1.2");
  26438. ssl->version.minor = TLSv1_2_MINOR;
  26439. }
  26440. #ifndef NO_RSA
  26441. haveRSA = 1;
  26442. #endif
  26443. #ifndef NO_PSK
  26444. havePSK = ssl->options.havePSK;
  26445. #endif
  26446. #ifndef NO_CERTS
  26447. keySz = ssl->buffers.keySz;
  26448. #endif
  26449. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  26450. ssl->options.haveDH, ssl->options.haveECDSAsig,
  26451. ssl->options.haveECC, ssl->options.haveStaticECC,
  26452. ssl->options.haveFalconSig, ssl->options.haveAnon,
  26453. ssl->options.side);
  26454. }
  26455. #ifdef OPENSSL_EXTRA
  26456. /* check if option is set to not allow the current version
  26457. * set from either wolfSSL_set_options or wolfSSL_CTX_set_options */
  26458. if (!ssl->options.dtls && ssl->options.downgrade &&
  26459. ssl->options.mask > 0) {
  26460. int reset = 0;
  26461. if (ssl->version.minor == TLSv1_2_MINOR &&
  26462. (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
  26463. WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
  26464. ssl->version.minor = TLSv1_1_MINOR;
  26465. reset = 1;
  26466. }
  26467. if (ssl->version.minor == TLSv1_1_MINOR &&
  26468. (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
  26469. WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
  26470. ssl->options.tls1_1 = 0;
  26471. ssl->version.minor = TLSv1_MINOR;
  26472. reset = 1;
  26473. }
  26474. if (ssl->version.minor == TLSv1_MINOR &&
  26475. (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
  26476. WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
  26477. ssl->options.tls = 0;
  26478. ssl->options.tls1_1 = 0;
  26479. ssl->version.minor = SSLv3_MINOR;
  26480. reset = 1;
  26481. }
  26482. if (ssl->version.minor == SSLv3_MINOR &&
  26483. (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
  26484. WOLFSSL_MSG("\tError, option set to not allow SSLv3");
  26485. ret = VERSION_ERROR;
  26486. goto out;
  26487. }
  26488. if (ssl->version.minor < ssl->options.minDowngrade) {
  26489. WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
  26490. ret = VERSION_ERROR;
  26491. goto out;
  26492. }
  26493. if (reset) {
  26494. word16 haveRSA = 0;
  26495. word16 havePSK = 0;
  26496. int keySz = 0;
  26497. #ifndef NO_RSA
  26498. haveRSA = 1;
  26499. #endif
  26500. #ifndef NO_PSK
  26501. havePSK = ssl->options.havePSK;
  26502. #endif
  26503. #ifndef NO_CERTS
  26504. keySz = ssl->buffers.keySz;
  26505. #endif
  26506. /* reset cipher suites to account for TLS version change */
  26507. InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
  26508. ssl->options.haveDH, ssl->options.haveECDSAsig,
  26509. ssl->options.haveECC, ssl->options.haveStaticECC,
  26510. ssl->options.haveFalconSig, ssl->options.haveAnon,
  26511. ssl->options.side);
  26512. }
  26513. }
  26514. #endif
  26515. /* random */
  26516. XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
  26517. #ifdef WOLFSSL_DTLS
  26518. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  26519. ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN);
  26520. if (ret != 0) goto out;
  26521. }
  26522. #endif /* WOLFSSL_DTLS */
  26523. i += RAN_LEN;
  26524. #ifdef SHOW_SECRETS
  26525. {
  26526. int j;
  26527. printf("client random: ");
  26528. for (j = 0; j < RAN_LEN; j++)
  26529. printf("%02x", ssl->arrays->clientRandom[j]);
  26530. printf("\n");
  26531. }
  26532. #endif
  26533. /* session id */
  26534. b = input[i++];
  26535. #ifdef HAVE_SESSION_TICKET
  26536. if (b > 0 && b < ID_LEN) {
  26537. bogusID = 1;
  26538. WOLFSSL_MSG("Client sent bogus session id, let's allow for echo");
  26539. }
  26540. #endif
  26541. if (b == ID_LEN || bogusID) {
  26542. if ((i - begin) + b > helloSz) {
  26543. ret = BUFFER_ERROR;
  26544. goto out;
  26545. }
  26546. XMEMCPY(ssl->arrays->sessionID, input + i, b);
  26547. #ifdef WOLFSSL_DTLS
  26548. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) &&
  26549. !IsSCR(ssl)) {
  26550. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  26551. if (ret != 0) goto out;
  26552. }
  26553. #endif /* WOLFSSL_DTLS */
  26554. ssl->arrays->sessionIDSz = b;
  26555. i += b;
  26556. ssl->options.resuming = 1; /* client wants to resume */
  26557. WOLFSSL_MSG("Client wants to resume session");
  26558. }
  26559. else if (b) {
  26560. WOLFSSL_MSG("Invalid session ID size");
  26561. ret = BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
  26562. goto out;
  26563. }
  26564. #ifdef WOLFSSL_DTLS
  26565. /* cookie */
  26566. if (ssl->options.dtls) {
  26567. if ((i - begin) + OPAQUE8_LEN > helloSz) {
  26568. ret = BUFFER_ERROR;
  26569. goto out;
  26570. }
  26571. peerCookieSz = input[i++];
  26572. if (peerCookieSz) {
  26573. if (peerCookieSz > MAX_COOKIE_LEN) {
  26574. ret = BUFFER_ERROR;
  26575. goto out;
  26576. }
  26577. if ((i - begin) + peerCookieSz > helloSz) {
  26578. ret = BUFFER_ERROR;
  26579. goto out;
  26580. }
  26581. XMEMCPY(peerCookie, input + i, peerCookieSz);
  26582. i += peerCookieSz;
  26583. }
  26584. }
  26585. #endif
  26586. /* suites */
  26587. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  26588. ret = BUFFER_ERROR;
  26589. goto out;
  26590. }
  26591. ato16(&input[i], &clSuites.suiteSz);
  26592. i += OPAQUE16_LEN;
  26593. /* Cipher suite lists are always multiples of two in length. */
  26594. if (clSuites.suiteSz % 2 != 0) {
  26595. ret = BUFFER_ERROR;
  26596. goto out;
  26597. }
  26598. /* suites and compression length check */
  26599. if ((i - begin) + clSuites.suiteSz + OPAQUE8_LEN > helloSz) {
  26600. ret = BUFFER_ERROR;
  26601. goto out;
  26602. }
  26603. if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ) {
  26604. ret = BUFFER_ERROR;
  26605. goto out;
  26606. }
  26607. XMEMCPY(clSuites.suites, input + i, clSuites.suiteSz);
  26608. #ifdef HAVE_SERVER_RENEGOTIATION_INFO
  26609. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  26610. if (FindSuite(&clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV) >= 0) {
  26611. TLSX* extension;
  26612. /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
  26613. ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
  26614. if (ret != WOLFSSL_SUCCESS)
  26615. goto out;
  26616. extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
  26617. if (extension) {
  26618. ssl->secure_renegotiation =
  26619. (SecureRenegotiation*)extension->data;
  26620. ssl->secure_renegotiation->enabled = 1;
  26621. }
  26622. }
  26623. #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
  26624. #if defined(HAVE_FALLBACK_SCSV) || defined(OPENSSL_ALL)
  26625. /* check for TLS_FALLBACK_SCSV suite */
  26626. if (FindSuite(&clSuites, TLS_FALLBACK_SCSV, 0) >= 0) {
  26627. WOLFSSL_MSG("Found Fallback SCSV");
  26628. if (ssl->ctx->method->version.minor > pv.minor) {
  26629. WOLFSSL_MSG("Client trying to connect with lesser version");
  26630. SendAlert(ssl, alert_fatal, inappropriate_fallback);
  26631. ret = VERSION_ERROR;
  26632. goto out;
  26633. }
  26634. }
  26635. #endif
  26636. #ifdef WOLFSSL_DTLS
  26637. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  26638. ret = wc_HmacUpdate(&cookieHmac,
  26639. input + i - OPAQUE16_LEN,
  26640. clSuites.suiteSz + OPAQUE16_LEN);
  26641. if (ret != 0) goto out;
  26642. }
  26643. #endif /* WOLFSSL_DTLS */
  26644. i += clSuites.suiteSz;
  26645. clSuites.hashSigAlgoSz = 0;
  26646. /* compression length */
  26647. b = input[i++];
  26648. if ((i - begin) + b > helloSz) {
  26649. ret = BUFFER_ERROR;
  26650. goto out;
  26651. }
  26652. if (b == 0) {
  26653. WOLFSSL_MSG("No compression types in list");
  26654. #ifdef WOLFSSL_EXTRA_ALERTS
  26655. SendAlert(ssl, alert_fatal, decode_error);
  26656. #endif
  26657. ret = COMPRESSION_ERROR;
  26658. goto out;
  26659. }
  26660. #ifdef WOLFSSL_DTLS
  26661. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  26662. ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
  26663. if (ret != 0) goto out;
  26664. ret = wc_HmacFinal(&cookieHmac, newCookie);
  26665. if (ret != 0) goto out;
  26666. /* If a cookie callback is set, call it to overwrite the cookie.
  26667. * This should be deprecated. The code now calculates the cookie
  26668. * using an HMAC as expected. */
  26669. if (ssl->ctx->CBIOCookie != NULL &&
  26670. ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz,
  26671. ssl->IOCB_CookieCtx) != cookieSz) {
  26672. ret = COOKIE_ERROR;
  26673. goto out;
  26674. }
  26675. #ifndef WOLFSSL_DTLS_NO_HVR_ON_RESUME
  26676. if (peerCookieSz != cookieSz ||
  26677. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  26678. *inOutIdx += helloSz;
  26679. ret = SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  26680. goto out;
  26681. }
  26682. #endif /* !WOLFSSL_DTLS_NO_HVR_ON_RESUME */
  26683. }
  26684. #endif /* WOLFSSL_DTLS */
  26685. {
  26686. /* compression match types */
  26687. int matchNo = 0;
  26688. int matchZlib = 0;
  26689. while (b--) {
  26690. byte comp = input[i++];
  26691. if (comp == NO_COMPRESSION) {
  26692. matchNo = 1;
  26693. }
  26694. if (comp == ZLIB_COMPRESSION) {
  26695. matchZlib = 1;
  26696. }
  26697. }
  26698. if (ssl->options.usingCompression == 0 && matchNo) {
  26699. WOLFSSL_MSG("Matched No Compression");
  26700. } else if (ssl->options.usingCompression && matchZlib) {
  26701. WOLFSSL_MSG("Matched zlib Compression");
  26702. } else if (ssl->options.usingCompression && matchNo) {
  26703. WOLFSSL_MSG("Could only match no compression, turning off");
  26704. ssl->options.usingCompression = 0; /* turn off */
  26705. } else {
  26706. WOLFSSL_MSG("Could not match compression");
  26707. #ifdef WOLFSSL_EXTRA_ALERTS
  26708. SendAlert(ssl, alert_fatal, illegal_parameter);
  26709. #endif
  26710. ret = COMPRESSION_ERROR;
  26711. goto out;
  26712. }
  26713. }
  26714. *inOutIdx = i;
  26715. /* tls extensions */
  26716. if ((i - begin) < helloSz) {
  26717. #ifdef HAVE_TLS_EXTENSIONS
  26718. if (TLSX_SupportExtensions(ssl))
  26719. #else
  26720. if (IsAtLeastTLSv1_2(ssl))
  26721. #endif
  26722. {
  26723. /* Process the hello extension. Skip unsupported. */
  26724. word16 totalExtSz;
  26725. #ifdef HAVE_TLS_EXTENSIONS
  26726. /* auto populate extensions supported unless user defined */
  26727. if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
  26728. goto out;
  26729. #endif
  26730. if ((i - begin) + OPAQUE16_LEN > helloSz) {
  26731. ret = BUFFER_ERROR;
  26732. goto out;
  26733. }
  26734. ato16(&input[i], &totalExtSz);
  26735. i += OPAQUE16_LEN;
  26736. if ((i - begin) + totalExtSz > helloSz) {
  26737. ret = BUFFER_ERROR;
  26738. goto out;
  26739. }
  26740. #ifdef HAVE_TLS_EXTENSIONS
  26741. /* tls extensions */
  26742. if ((ret = TLSX_Parse(ssl, input + i, totalExtSz, client_hello,
  26743. &clSuites)))
  26744. goto out;
  26745. #ifdef WOLFSSL_TLS13
  26746. if (TLSX_Find(ssl->extensions,
  26747. TLSX_SUPPORTED_VERSIONS) != NULL) {
  26748. WOLFSSL_MSG(
  26749. "Client attempting to connect with higher version");
  26750. ret = VERSION_ERROR;
  26751. goto out;
  26752. }
  26753. #endif
  26754. #ifdef HAVE_SNI
  26755. if((ret=SNI_Callback(ssl)))
  26756. goto out;
  26757. #endif
  26758. i += totalExtSz;
  26759. #else
  26760. while (totalExtSz) {
  26761. word16 extId, extSz;
  26762. if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
  26763. ret = BUFFER_ERROR;
  26764. goto out;
  26765. }
  26766. ato16(&input[i], &extId);
  26767. i += OPAQUE16_LEN;
  26768. ato16(&input[i], &extSz);
  26769. i += OPAQUE16_LEN;
  26770. if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
  26771. ret = BUFFER_ERROR;
  26772. goto out;
  26773. }
  26774. if (extId == HELLO_EXT_SIG_ALGO) {
  26775. word16 hashSigAlgoSz;
  26776. ato16(&input[i], &hashSigAlgoSz);
  26777. i += OPAQUE16_LEN;
  26778. if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
  26779. ret = BUFFER_ERROR;
  26780. goto out;
  26781. }
  26782. if (hashSigAlgoSz % 2 != 0) {
  26783. ret = BUFFER_ERROR;
  26784. goto out;
  26785. }
  26786. clSuites.hashSigAlgoSz = hashSigAlgoSz;
  26787. if (clSuites.hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
  26788. WOLFSSL_MSG("ClientHello SigAlgo list exceeds max, "
  26789. "truncating");
  26790. clSuites.hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
  26791. }
  26792. XMEMCPY(clSuites.hashSigAlgo, &input[i],
  26793. clSuites.hashSigAlgoSz);
  26794. i += hashSigAlgoSz;
  26795. }
  26796. #ifdef HAVE_EXTENDED_MASTER
  26797. else if (extId == HELLO_EXT_EXTMS)
  26798. ssl->options.haveEMS = 1;
  26799. #endif
  26800. else
  26801. i += extSz;
  26802. totalExtSz -= OPAQUE16_LEN + OPAQUE16_LEN + extSz;
  26803. }
  26804. #endif
  26805. *inOutIdx = i;
  26806. }
  26807. else
  26808. *inOutIdx = begin + helloSz; /* skip extensions */
  26809. }
  26810. ssl->options.clientState = CLIENT_HELLO_COMPLETE;
  26811. ssl->options.haveSessionId = 1;
  26812. /* ProcessOld uses same resume code */
  26813. if (ssl->options.resuming) {
  26814. ret = HandleTlsResumption(ssl, bogusID, &clSuites);
  26815. if (ret != 0)
  26816. goto out;
  26817. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  26818. !defined(WOLFSSL_AEAD_ONLY)
  26819. if (ssl->options.encThenMac && ssl->specs.cipher_type == block) {
  26820. ret = TLSX_EncryptThenMac_Respond(ssl);
  26821. if (ret != 0)
  26822. goto out;
  26823. }
  26824. else
  26825. ssl->options.encThenMac = 0;
  26826. #endif
  26827. if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
  26828. WOLFSSL_LEAVE("DoClientHello", ret);
  26829. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  26830. goto out;
  26831. }
  26832. }
  26833. #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_NO_HVR_ON_RESUME)
  26834. if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) {
  26835. if (!ssl->options.resuming) {
  26836. /* resume failed, check the cookie */
  26837. if (peerCookieSz != cookieSz ||
  26838. XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
  26839. *inOutIdx = begin + helloSz;
  26840. ret = SendHelloVerifyRequest(ssl, newCookie, cookieSz);
  26841. goto out;
  26842. }
  26843. }
  26844. }
  26845. #endif /* WOLFSSL_DTLS && WOLFSSL_DTLS_NO_HVR_ON_RESUME */
  26846. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_DH_DEFAULT_PARAMS)
  26847. #if defined(HAVE_FFDHE) && defined(HAVE_SUPPORTED_CURVES)
  26848. if (TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS) != NULL) {
  26849. /* Set FFDHE parameters or clear DHE parameters if FFDH parameters
  26850. * present and no matches in the server's list. */
  26851. ret = TLSX_SupportedFFDHE_Set(ssl);
  26852. if (ret != 0)
  26853. goto out;
  26854. }
  26855. #endif
  26856. #endif
  26857. #ifdef OPENSSL_EXTRA
  26858. /* Give user last chance to provide a cert for cipher selection */
  26859. if (ret == 0 && ssl->ctx->certSetupCb != NULL)
  26860. ret = CertSetupCbWrapper(ssl);
  26861. #endif
  26862. if (ret == 0)
  26863. ret = MatchSuite(ssl, &clSuites);
  26864. #ifdef WOLFSSL_EXTRA_ALERTS
  26865. if (ret == BUFFER_ERROR)
  26866. SendAlert(ssl, alert_fatal, decode_error);
  26867. else if (ret < 0)
  26868. SendAlert(ssl, alert_fatal, handshake_failure);
  26869. #endif
  26870. #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_ENCRYPT_THEN_MAC) && \
  26871. !defined(WOLFSSL_AEAD_ONLY)
  26872. if (ret == 0 && ssl->options.encThenMac &&
  26873. ssl->specs.cipher_type == block) {
  26874. ret = TLSX_EncryptThenMac_Respond(ssl);
  26875. }
  26876. else
  26877. ssl->options.encThenMac = 0;
  26878. #endif
  26879. #ifdef WOLFSSL_DTLS
  26880. if (ret == 0 && ssl->options.dtls)
  26881. DtlsMsgPoolReset(ssl);
  26882. #endif
  26883. out:
  26884. #ifdef WOLFSSL_DTLS
  26885. wc_HmacFree(&cookieHmac);
  26886. #endif
  26887. WOLFSSL_LEAVE("DoClientHello", ret);
  26888. WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
  26889. return ret;
  26890. }
  26891. #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
  26892. defined(HAVE_ED448)) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  26893. typedef struct DcvArgs {
  26894. byte* output; /* not allocated */
  26895. word32 sendSz;
  26896. word16 sz;
  26897. word32 sigSz;
  26898. word32 idx;
  26899. word32 begin;
  26900. byte hashAlgo;
  26901. byte sigAlgo;
  26902. } DcvArgs;
  26903. static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs)
  26904. {
  26905. DcvArgs* args = (DcvArgs*)pArgs;
  26906. (void)ssl;
  26907. (void)args;
  26908. }
  26909. /* handle processing of certificate_verify (15) */
  26910. static int DoCertificateVerify(WOLFSSL* ssl, byte* input,
  26911. word32* inOutIdx, word32 size)
  26912. {
  26913. int ret = 0;
  26914. #ifdef WOLFSSL_ASYNC_CRYPT
  26915. DcvArgs* args = NULL;
  26916. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  26917. #else
  26918. DcvArgs args[1];
  26919. #endif
  26920. WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_DO);
  26921. WOLFSSL_ENTER("DoCertificateVerify");
  26922. #ifdef WOLFSSL_ASYNC_CRYPT
  26923. if (ssl->async == NULL) {
  26924. ssl->async = (struct WOLFSSL_ASYNC*)
  26925. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  26926. DYNAMIC_TYPE_ASYNC);
  26927. if (ssl->async == NULL)
  26928. ERROR_OUT(MEMORY_E, exit_dcv);
  26929. }
  26930. args = (DcvArgs*)ssl->async->args;
  26931. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  26932. if (ret != WC_NOT_PENDING_E) {
  26933. /* Check for error */
  26934. if (ret < 0)
  26935. goto exit_dcv;
  26936. }
  26937. else
  26938. #endif
  26939. {
  26940. /* Reset state */
  26941. ret = 0;
  26942. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  26943. XMEMSET(args, 0, sizeof(DcvArgs));
  26944. args->hashAlgo = sha_mac;
  26945. args->sigAlgo = anonymous_sa_algo;
  26946. args->idx = *inOutIdx;
  26947. args->begin = *inOutIdx;
  26948. #ifdef WOLFSSL_ASYNC_CRYPT
  26949. ssl->async->freeArgs = FreeDcvArgs;
  26950. #endif
  26951. }
  26952. switch(ssl->options.asyncState)
  26953. {
  26954. case TLS_ASYNC_BEGIN:
  26955. {
  26956. #ifdef WOLFSSL_CALLBACKS
  26957. if (ssl->hsInfoOn)
  26958. AddPacketName(ssl, "CertificateVerify");
  26959. if (ssl->toInfoOn)
  26960. AddLateName("CertificateVerify", &ssl->timeoutInfo);
  26961. #endif
  26962. /* Advance state and proceed */
  26963. ssl->options.asyncState = TLS_ASYNC_BUILD;
  26964. } /* case TLS_ASYNC_BEGIN */
  26965. FALL_THROUGH;
  26966. case TLS_ASYNC_BUILD:
  26967. {
  26968. if (IsAtLeastTLSv1_2(ssl)) {
  26969. if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > size) {
  26970. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  26971. }
  26972. DecodeSigAlg(&input[args->idx], &args->hashAlgo,
  26973. &args->sigAlgo);
  26974. args->idx += 2;
  26975. }
  26976. #ifndef NO_RSA
  26977. else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0)
  26978. args->sigAlgo = rsa_sa_algo;
  26979. #endif
  26980. #ifdef HAVE_ECC
  26981. else if (ssl->peerEccDsaKeyPresent)
  26982. args->sigAlgo = ecc_dsa_sa_algo;
  26983. #endif
  26984. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  26985. else if (ssl->peerEd25519KeyPresent)
  26986. args->sigAlgo = ed25519_sa_algo;
  26987. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  26988. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  26989. else if (ssl->peerEd448KeyPresent)
  26990. args->sigAlgo = ed448_sa_algo;
  26991. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  26992. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  26993. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  26994. }
  26995. ato16(input + args->idx, &args->sz);
  26996. args->idx += OPAQUE16_LEN;
  26997. if ((args->idx - args->begin) + args->sz > size ||
  26998. args->sz > ENCRYPT_LEN) {
  26999. ERROR_OUT(BUFFER_ERROR, exit_dcv);
  27000. }
  27001. #ifdef HAVE_ECC
  27002. if (ssl->peerEccDsaKeyPresent) {
  27003. WOLFSSL_MSG("Doing ECC peer cert verify");
  27004. /* make sure a default is defined */
  27005. #if !defined(NO_SHA)
  27006. SetDigest(ssl, sha_mac);
  27007. #elif !defined(NO_SHA256)
  27008. SetDigest(ssl, sha256_mac);
  27009. #elif defined(WOLFSSL_SHA384)
  27010. SetDigest(ssl, sha384_mac);
  27011. #elif defined(WOLFSSL_SHA512)
  27012. SetDigest(ssl, sha512_mac);
  27013. #else
  27014. #error No digest enabled for ECC sig verify
  27015. #endif
  27016. if (IsAtLeastTLSv1_2(ssl)) {
  27017. if (args->sigAlgo != ecc_dsa_sa_algo) {
  27018. WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
  27019. }
  27020. SetDigest(ssl, args->hashAlgo);
  27021. }
  27022. }
  27023. #endif /* HAVE_ECC */
  27024. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  27025. if (ssl->peerEd25519KeyPresent) {
  27026. WOLFSSL_MSG("Doing ED25519 peer cert verify");
  27027. if (IsAtLeastTLSv1_2(ssl) &&
  27028. args->sigAlgo != ed25519_sa_algo) {
  27029. WOLFSSL_MSG(
  27030. "Oops, peer sent ED25519 key but not in verify");
  27031. }
  27032. }
  27033. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  27034. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  27035. if (ssl->peerEd448KeyPresent) {
  27036. WOLFSSL_MSG("Doing ED448 peer cert verify");
  27037. if (IsAtLeastTLSv1_2(ssl) &&
  27038. args->sigAlgo != ed448_sa_algo) {
  27039. WOLFSSL_MSG(
  27040. "Oops, peer sent ED448 key but not in verify");
  27041. }
  27042. }
  27043. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  27044. /* Advance state and proceed */
  27045. ssl->options.asyncState = TLS_ASYNC_DO;
  27046. } /* case TLS_ASYNC_BUILD */
  27047. FALL_THROUGH;
  27048. case TLS_ASYNC_DO:
  27049. {
  27050. #ifndef NO_RSA
  27051. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  27052. WOLFSSL_MSG("Doing RSA peer cert verify");
  27053. ret = RsaVerify(ssl,
  27054. input + args->idx,
  27055. args->sz,
  27056. &args->output,
  27057. args->sigAlgo, args->hashAlgo,
  27058. ssl->peerRsaKey,
  27059. #ifdef HAVE_PK_CALLBACKS
  27060. &ssl->buffers.peerRsaKey
  27061. #else
  27062. NULL
  27063. #endif
  27064. );
  27065. if (ret >= 0) {
  27066. if (args->sigAlgo == rsa_sa_algo)
  27067. args->sendSz = ret;
  27068. else {
  27069. args->sigSz = ret;
  27070. args->sendSz = ssl->buffers.digest.length;
  27071. }
  27072. ret = 0;
  27073. }
  27074. }
  27075. #endif /* !NO_RSA */
  27076. #ifdef HAVE_ECC
  27077. if (ssl->peerEccDsaKeyPresent) {
  27078. WOLFSSL_MSG("Doing ECC peer cert verify");
  27079. ret = EccVerify(ssl,
  27080. input + args->idx, args->sz,
  27081. ssl->buffers.digest.buffer, ssl->buffers.digest.length,
  27082. ssl->peerEccDsaKey,
  27083. #ifdef HAVE_PK_CALLBACKS
  27084. &ssl->buffers.peerEccDsaKey
  27085. #else
  27086. NULL
  27087. #endif
  27088. );
  27089. /* SERVER: Data verified with certificate's public key. */
  27090. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  27091. (ret == 0);
  27092. }
  27093. #endif /* HAVE_ECC */
  27094. #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
  27095. if (ssl->peerEd25519KeyPresent) {
  27096. WOLFSSL_MSG("Doing Ed25519 peer cert verify");
  27097. ret = Ed25519Verify(ssl,
  27098. input + args->idx, args->sz,
  27099. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  27100. ssl->peerEd25519Key,
  27101. #ifdef HAVE_PK_CALLBACKS
  27102. &ssl->buffers.peerEd25519Key
  27103. #else
  27104. NULL
  27105. #endif
  27106. );
  27107. /* SERVER: Data verified with certificate's public key. */
  27108. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  27109. (ret == 0);
  27110. }
  27111. #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
  27112. #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
  27113. if (ssl->peerEd448KeyPresent) {
  27114. WOLFSSL_MSG("Doing Ed448 peer cert verify");
  27115. ret = Ed448Verify(ssl,
  27116. input + args->idx, args->sz,
  27117. ssl->hsHashes->messages, ssl->hsHashes->prevLen,
  27118. ssl->peerEd448Key,
  27119. #ifdef HAVE_PK_CALLBACKS
  27120. &ssl->buffers.peerEd448Key
  27121. #else
  27122. NULL
  27123. #endif
  27124. );
  27125. /* SERVER: Data verified with certificate's public key. */
  27126. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  27127. (ret == 0);
  27128. }
  27129. #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
  27130. #ifdef WOLFSSL_ASYNC_CRYPT
  27131. /* handle async pending */
  27132. if (ret == WC_PENDING_E)
  27133. goto exit_dcv;
  27134. #endif
  27135. /* Check for error */
  27136. if (ret != 0) {
  27137. ret = SIG_VERIFY_E;
  27138. goto exit_dcv;
  27139. }
  27140. /* Advance state and proceed */
  27141. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  27142. } /* case TLS_ASYNC_DO */
  27143. FALL_THROUGH;
  27144. case TLS_ASYNC_VERIFY:
  27145. {
  27146. #ifndef NO_RSA
  27147. if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
  27148. if (IsAtLeastTLSv1_2(ssl)) {
  27149. #ifdef WC_RSA_PSS
  27150. if (args->sigAlgo == rsa_pss_sa_algo) {
  27151. SetDigest(ssl, args->hashAlgo);
  27152. #ifdef HAVE_SELFTEST
  27153. ret = wc_RsaPSS_CheckPadding(
  27154. ssl->buffers.digest.buffer,
  27155. ssl->buffers.digest.length,
  27156. args->output, args->sigSz,
  27157. HashAlgoToType(args->hashAlgo));
  27158. #else
  27159. ret = wc_RsaPSS_CheckPadding_ex(
  27160. ssl->buffers.digest.buffer,
  27161. ssl->buffers.digest.length,
  27162. args->output, args->sigSz,
  27163. HashAlgoToType(args->hashAlgo), -1,
  27164. mp_count_bits(&ssl->peerRsaKey->n));
  27165. #endif
  27166. if (ret != 0) {
  27167. ret = SIG_VERIFY_E;
  27168. goto exit_dcv;
  27169. }
  27170. }
  27171. else
  27172. #endif
  27173. {
  27174. #ifndef WOLFSSL_SMALL_STACK
  27175. byte encodedSig[MAX_ENCODED_SIG_SZ];
  27176. #else
  27177. byte* encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ,
  27178. ssl->heap, DYNAMIC_TYPE_SIGNATURE);
  27179. if (encodedSig == NULL) {
  27180. ERROR_OUT(MEMORY_E, exit_dcv);
  27181. }
  27182. #endif
  27183. if (args->sigAlgo != rsa_sa_algo) {
  27184. WOLFSSL_MSG("Oops, peer sent RSA key but not "
  27185. "in verify");
  27186. }
  27187. SetDigest(ssl, args->hashAlgo);
  27188. args->sigSz = wc_EncodeSignature(encodedSig,
  27189. ssl->buffers.digest.buffer,
  27190. ssl->buffers.digest.length,
  27191. TypeHash(args->hashAlgo));
  27192. if (args->sendSz != args->sigSz || !args->output ||
  27193. XMEMCMP(args->output, encodedSig,
  27194. min(args->sigSz, MAX_ENCODED_SIG_SZ)) != 0) {
  27195. ret = VERIFY_CERT_ERROR;
  27196. }
  27197. #ifdef WOLFSSL_SMALL_STACK
  27198. XFREE(encodedSig, ssl->heap,
  27199. DYNAMIC_TYPE_SIGNATURE);
  27200. #endif
  27201. }
  27202. }
  27203. else {
  27204. if (args->sendSz != FINISHED_SZ || !args->output ||
  27205. XMEMCMP(args->output,
  27206. &ssl->hsHashes->certHashes, FINISHED_SZ) != 0) {
  27207. ret = VERIFY_CERT_ERROR;
  27208. }
  27209. }
  27210. if (ret == 0) {
  27211. /* SERVER: Data verified with cert's public key. */
  27212. ssl->options.peerAuthGood = ssl->options.havePeerCert &&
  27213. (ret == 0);
  27214. }
  27215. }
  27216. #endif /* !NO_RSA */
  27217. if (ret != 0)
  27218. break;
  27219. /* Advance state and proceed */
  27220. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  27221. } /* case TLS_ASYNC_VERIFY */
  27222. FALL_THROUGH;
  27223. case TLS_ASYNC_FINALIZE:
  27224. {
  27225. if (IsEncryptionOn(ssl, 0)) {
  27226. args->idx += ssl->keys.padSz;
  27227. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  27228. if (ssl->options.startedETMRead)
  27229. args->idx += MacSize(ssl);
  27230. #endif
  27231. }
  27232. ssl->options.havePeerVerify = 1;
  27233. /* Set final index */
  27234. args->idx += args->sz;
  27235. *inOutIdx = args->idx;
  27236. /* Advance state and proceed */
  27237. ssl->options.asyncState = TLS_ASYNC_END;
  27238. } /* case TLS_ASYNC_FINALIZE */
  27239. FALL_THROUGH;
  27240. case TLS_ASYNC_END:
  27241. {
  27242. break;
  27243. }
  27244. default:
  27245. ret = INPUT_CASE_ERROR;
  27246. } /* switch(ssl->options.asyncState) */
  27247. exit_dcv:
  27248. WOLFSSL_LEAVE("DoCertificateVerify", ret);
  27249. WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_DO);
  27250. #ifdef WOLFSSL_ASYNC_CRYPT
  27251. /* Handle async operation */
  27252. if (ret == WC_PENDING_E) {
  27253. /* Mark message as not received so it can process again */
  27254. ssl->msgsReceived.got_certificate_verify = 0;
  27255. return ret;
  27256. }
  27257. #endif /* WOLFSSL_ASYNC_CRYPT */
  27258. #ifdef WOLFSSL_EXTRA_ALERTS
  27259. if (ret == BUFFER_ERROR)
  27260. SendAlert(ssl, alert_fatal, decode_error);
  27261. else if (ret == SIG_VERIFY_E)
  27262. SendAlert(ssl, alert_fatal, decrypt_error);
  27263. else if (ret != 0)
  27264. SendAlert(ssl, alert_fatal, bad_certificate);
  27265. #endif
  27266. /* Digest is not allocated, so do this to prevent free */
  27267. ssl->buffers.digest.buffer = NULL;
  27268. ssl->buffers.digest.length = 0;
  27269. #ifdef WOLFSSL_ASYNC_CRYPT
  27270. /* Cleanup async */
  27271. FreeAsyncCtx(ssl, 0);
  27272. #else
  27273. FreeDcvArgs(ssl, args);
  27274. #endif
  27275. /* Final cleanup */
  27276. FreeKeyExchange(ssl);
  27277. return ret;
  27278. }
  27279. #endif /* (!NO_RSA || ECC || ED25519 || ED448) && !WOLFSSL_NO_CLIENT_AUTH */
  27280. /* handle generation of server_hello_done (14) */
  27281. int SendServerHelloDone(WOLFSSL* ssl)
  27282. {
  27283. byte* output;
  27284. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27285. int ret;
  27286. WOLFSSL_START(WC_FUNC_SERVER_HELLO_DONE_SEND);
  27287. WOLFSSL_ENTER("SendServerHelloDone");
  27288. #ifdef WOLFSSL_DTLS
  27289. if (ssl->options.dtls)
  27290. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27291. #endif
  27292. if (IsEncryptionOn(ssl, 1))
  27293. sendSz += MAX_MSG_EXTRA;
  27294. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  27295. * is not advanced yet */
  27296. ssl->options.buildingMsg = 1;
  27297. /* check for available size */
  27298. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  27299. return ret;
  27300. /* get output buffer */
  27301. output = ssl->buffers.outputBuffer.buffer +
  27302. ssl->buffers.outputBuffer.length;
  27303. AddHeaders(output, 0, server_hello_done, ssl);
  27304. if (IsEncryptionOn(ssl, 1)) {
  27305. byte* input;
  27306. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  27307. int recordHeaderSz = RECORD_HEADER_SZ;
  27308. if (ssl->options.dtls) {
  27309. recordHeaderSz += DTLS_RECORD_EXTRA;
  27310. inputSz += DTLS_HANDSHAKE_EXTRA;
  27311. }
  27312. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27313. if (input == NULL)
  27314. return MEMORY_E;
  27315. XMEMCPY(input, output + recordHeaderSz, inputSz);
  27316. #ifdef WOLFSSL_DTLS
  27317. if (IsDtlsNotSctpMode(ssl) &&
  27318. (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
  27319. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27320. return ret;
  27321. }
  27322. #endif
  27323. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  27324. handshake, 1, 0, 0, CUR_ORDER);
  27325. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27326. if (sendSz < 0)
  27327. return sendSz;
  27328. } else {
  27329. #ifdef WOLFSSL_DTLS
  27330. if (IsDtlsNotSctpMode(ssl)) {
  27331. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
  27332. return ret;
  27333. }
  27334. if (ssl->options.dtls)
  27335. DtlsSEQIncrement(ssl, CUR_ORDER);
  27336. #endif
  27337. ret = HashOutput(ssl, output, sendSz, 0);
  27338. if (ret != 0)
  27339. return ret;
  27340. }
  27341. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  27342. if (ssl->hsInfoOn)
  27343. AddPacketName(ssl, "ServerHelloDone");
  27344. if (ssl->toInfoOn)
  27345. AddPacketInfo(ssl, "ServerHelloDone", handshake, output, sendSz,
  27346. WRITE_PROTO, ssl->heap);
  27347. #endif
  27348. ssl->options.serverState = SERVER_HELLODONE_COMPLETE;
  27349. ssl->options.buildingMsg = 0;
  27350. ssl->buffers.outputBuffer.length += sendSz;
  27351. ret = SendBuffered(ssl);
  27352. WOLFSSL_LEAVE("SendServerHelloDone", ret);
  27353. WOLFSSL_END(WC_FUNC_SERVER_HELLO_DONE_SEND);
  27354. return ret;
  27355. }
  27356. #endif /* !WOLFSSL_NO_TLS12 */
  27357. #ifdef HAVE_SESSION_TICKET
  27358. #define WOLFSSL_TICKET_FIXED_SZ (WOLFSSL_TICKET_NAME_SZ + \
  27359. WOLFSSL_TICKET_IV_SZ + WOLFSSL_TICKET_MAC_SZ + OPAQUE32_LEN)
  27360. #if defined(WOLFSSL_GENERAL_ALIGNMENT) && WOLFSSL_GENERAL_ALIGNMENT > 0
  27361. /* round up to WOLFSSL_GENERAL_ALIGNMENT */
  27362. #define WOLFSSL_TICKET_ENC_SZ \
  27363. (((SESSION_TICKET_LEN - WOLFSSL_TICKET_FIXED_SZ) + \
  27364. WOLFSSL_GENERAL_ALIGNMENT - 1) & ~(WOLFSSL_GENERAL_ALIGNMENT-1))
  27365. #else
  27366. #define WOLFSSL_TICKET_ENC_SZ (SESSION_TICKET_LEN - WOLFSSL_TICKET_FIXED_SZ)
  27367. #endif
  27368. /* Our ticket format. All members need to be a byte or array of byte to
  27369. * avoid alignment issues */
  27370. typedef struct InternalTicket {
  27371. ProtocolVersion pv; /* version when ticket created */
  27372. byte suite[SUITE_LEN]; /* cipher suite when created */
  27373. byte msecret[SECRET_LEN]; /* master secret */
  27374. byte timestamp[TIMESTAMP_LEN]; /* born on */
  27375. byte haveEMS; /* have extended master secret */
  27376. #ifdef WOLFSSL_TLS13
  27377. byte ageAdd[AGEADD_LEN]; /* Obfuscation of age */
  27378. byte namedGroup[NAMEDGROUP_LEN]; /* Named group used */
  27379. TicketNonce ticketNonce; /* Ticket nonce */
  27380. #ifdef WOLFSSL_EARLY_DATA
  27381. byte maxEarlyDataSz[MAXEARLYDATASZ_LEN]; /* Max size of
  27382. * early data */
  27383. #endif
  27384. #endif
  27385. #ifdef WOLFSSL_TICKET_HAVE_ID
  27386. byte id[ID_LEN];
  27387. #endif
  27388. } InternalTicket;
  27389. static WC_INLINE int compare_InternalTickets(
  27390. InternalTicket *a,
  27391. InternalTicket *b)
  27392. {
  27393. if ((a->pv.major == b->pv.major) &&
  27394. (a->pv.minor == b->pv.minor) &&
  27395. (XMEMCMP(a->suite,b->suite,sizeof a->suite) == 0) &&
  27396. (XMEMCMP(a->msecret,b->msecret,sizeof a->msecret) == 0) &&
  27397. (XMEMCMP(a->timestamp, b->timestamp, sizeof a->timestamp) == 0) &&
  27398. (a->haveEMS == b->haveEMS)
  27399. #ifdef WOLFSSL_TLS13
  27400. &&
  27401. (XMEMCMP(a->ageAdd, b->ageAdd, sizeof a->ageAdd) == 0) &&
  27402. (XMEMCMP(a->namedGroup, b->namedGroup, sizeof a->namedGroup)
  27403. == 0) &&
  27404. (a->ticketNonce.len == b->ticketNonce.len) &&
  27405. (XMEMCMP(
  27406. a->ticketNonce.data,
  27407. b->ticketNonce.data,
  27408. a->ticketNonce.len) == 0)
  27409. #ifdef WOLFSSL_EARLY_DATA
  27410. && (XMEMCMP(
  27411. a->maxEarlyDataSz,
  27412. b->maxEarlyDataSz,
  27413. sizeof a->maxEarlyDataSz) == 0)
  27414. #endif
  27415. #endif
  27416. )
  27417. return 0;
  27418. else
  27419. return -1;
  27420. }
  27421. /* RFC 5077 defines this for session tickets */
  27422. /* fit within SESSION_TICKET_LEN */
  27423. typedef struct ExternalTicket {
  27424. byte key_name[WOLFSSL_TICKET_NAME_SZ]; /* key context name - 16 */
  27425. byte iv[WOLFSSL_TICKET_IV_SZ]; /* this ticket's iv - 16 */
  27426. byte enc_len[OPAQUE32_LEN]; /* encrypted length - 4 */
  27427. byte enc_ticket[WOLFSSL_TICKET_ENC_SZ]; /* encrypted internal ticket */
  27428. byte mac[WOLFSSL_TICKET_MAC_SZ]; /* total mac - 32 */
  27429. /* !! if add to structure, add to TICKET_FIXED_SZ !! */
  27430. } ExternalTicket;
  27431. /* create a new session ticket, 0 on success */
  27432. int CreateTicket(WOLFSSL* ssl)
  27433. {
  27434. InternalTicket it;
  27435. ExternalTicket* et = (ExternalTicket*)ssl->session->ticket;
  27436. int encLen;
  27437. int ret;
  27438. byte zeros[WOLFSSL_TICKET_MAC_SZ]; /* biggest cmp size */
  27439. XMEMSET(&it, 0, sizeof(it));
  27440. /* build internal */
  27441. it.pv.major = ssl->version.major;
  27442. it.pv.minor = ssl->version.minor;
  27443. it.suite[0] = ssl->options.cipherSuite0;
  27444. it.suite[1] = ssl->options.cipherSuite;
  27445. #ifdef WOLFSSL_EARLY_DATA
  27446. c32toa(ssl->options.maxEarlyDataSz, it.maxEarlyDataSz);
  27447. #endif
  27448. if (!ssl->options.tls1_3) {
  27449. XMEMCPY(it.msecret, ssl->arrays->masterSecret, SECRET_LEN);
  27450. #ifndef NO_ASN_TIME
  27451. c32toa(LowResTimer(), (byte*)&it.timestamp);
  27452. #endif
  27453. it.haveEMS = (byte) ssl->options.haveEMS;
  27454. }
  27455. else {
  27456. #ifdef WOLFSSL_TLS13
  27457. /* Client adds to ticket age to obfuscate. */
  27458. ret = wc_RNG_GenerateBlock(ssl->rng, (byte*)&it.ageAdd,
  27459. sizeof(it.ageAdd));
  27460. if (ret != 0)
  27461. return BAD_TICKET_ENCRYPT;
  27462. ato32(it.ageAdd, &ssl->session->ticketAdd);
  27463. c16toa(ssl->session->namedGroup, it.namedGroup);
  27464. c32toa(TimeNowInMilliseconds(), it.timestamp);
  27465. /* Resumption master secret. */
  27466. XMEMCPY(it.msecret, ssl->session->masterSecret, SECRET_LEN);
  27467. XMEMCPY(&it.ticketNonce, &ssl->session->ticketNonce,
  27468. sizeof(TicketNonce));
  27469. #endif
  27470. }
  27471. #ifdef WOLFSSL_TICKET_HAVE_ID
  27472. {
  27473. const byte* id = NULL;
  27474. byte idSz = 0;
  27475. if (ssl->session->haveAltSessionID) {
  27476. id = ssl->session->altSessionID;
  27477. idSz = ID_LEN;
  27478. }
  27479. else if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) {
  27480. id = ssl->arrays->sessionID;
  27481. idSz = ssl->arrays->sessionIDSz;
  27482. }
  27483. else {
  27484. id = ssl->session->sessionID;
  27485. idSz = ssl->session->sessionIDSz;
  27486. }
  27487. if (idSz == 0) {
  27488. ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID,
  27489. ID_LEN);
  27490. if (ret != 0)
  27491. return ret;
  27492. ssl->session->haveAltSessionID = 1;
  27493. id = ssl->session->altSessionID;
  27494. idSz = ID_LEN;
  27495. }
  27496. /* make sure idSz is not larger than ID_LEN */
  27497. if (idSz > ID_LEN)
  27498. idSz = ID_LEN;
  27499. XMEMCPY(it.id, id, idSz);
  27500. }
  27501. #endif
  27502. /* encrypt */
  27503. encLen = WOLFSSL_TICKET_ENC_SZ; /* max size user can use */
  27504. if (ssl->ctx->ticketEncCb == NULL
  27505. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  27506. ||
  27507. /* SSL_OP_NO_TICKET turns off tickets in < 1.2. Forces
  27508. * "stateful" tickets for 1.3 so just use the regular
  27509. * stateless ones. */
  27510. (!IsAtLeastTLSv1_3(ssl->version) &&
  27511. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  27512. #endif
  27513. ) {
  27514. ret = WOLFSSL_TICKET_RET_FATAL;
  27515. }
  27516. else {
  27517. /* build external */
  27518. XMEMCPY(et->enc_ticket, &it, sizeof(InternalTicket));
  27519. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac, 1,
  27520. et->enc_ticket, sizeof(InternalTicket),
  27521. &encLen, ssl->ctx->ticketEncCtx);
  27522. if (ret != WOLFSSL_TICKET_RET_OK) {
  27523. ForceZero(et->enc_ticket, sizeof(it));
  27524. }
  27525. }
  27526. if (ret == WOLFSSL_TICKET_RET_OK) {
  27527. if (encLen < (int)sizeof(InternalTicket) ||
  27528. encLen > WOLFSSL_TICKET_ENC_SZ) {
  27529. ForceZero(&it, sizeof(it));
  27530. ForceZero(et->enc_ticket, sizeof(it));
  27531. WOLFSSL_MSG("Bad user ticket encrypt size");
  27532. return BAD_TICKET_KEY_CB_SZ;
  27533. }
  27534. /* sanity checks on encrypt callback */
  27535. /* internal ticket can't be the same if encrypted */
  27536. if (compare_InternalTickets((InternalTicket *)et->enc_ticket, &it)
  27537. == 0)
  27538. {
  27539. ForceZero(&it, sizeof(it));
  27540. ForceZero(et->enc_ticket, sizeof(it));
  27541. WOLFSSL_MSG("User ticket encrypt didn't encrypt");
  27542. return BAD_TICKET_ENCRYPT;
  27543. }
  27544. ForceZero(&it, sizeof(it));
  27545. XMEMSET(zeros, 0, sizeof(zeros));
  27546. /* name */
  27547. if (XMEMCMP(et->key_name, zeros, WOLFSSL_TICKET_NAME_SZ) == 0) {
  27548. WOLFSSL_MSG("User ticket encrypt didn't set name");
  27549. return BAD_TICKET_ENCRYPT;
  27550. }
  27551. /* iv */
  27552. if (XMEMCMP(et->iv, zeros, WOLFSSL_TICKET_IV_SZ) == 0) {
  27553. WOLFSSL_MSG("User ticket encrypt didn't set iv");
  27554. return BAD_TICKET_ENCRYPT;
  27555. }
  27556. /* mac */
  27557. if (XMEMCMP(et->mac, zeros, WOLFSSL_TICKET_MAC_SZ) == 0) {
  27558. WOLFSSL_MSG("User ticket encrypt didn't set mac");
  27559. return BAD_TICKET_ENCRYPT;
  27560. }
  27561. /* set size */
  27562. c32toa((word32)encLen, et->enc_len);
  27563. ssl->session->ticketLen = (word16)(encLen + WOLFSSL_TICKET_FIXED_SZ);
  27564. if (encLen < WOLFSSL_TICKET_ENC_SZ) {
  27565. /* move mac up since whole enc buffer not used */
  27566. XMEMMOVE(et->enc_ticket +encLen, et->mac,WOLFSSL_TICKET_MAC_SZ);
  27567. }
  27568. }
  27569. return ret;
  27570. }
  27571. /* Parse ticket sent by client, returns callback return value */
  27572. int DoClientTicket(WOLFSSL* ssl, const byte* input, word32 len)
  27573. {
  27574. ExternalTicket* et;
  27575. InternalTicket* it;
  27576. int ret;
  27577. int outLen;
  27578. word32 inLen;
  27579. WOLFSSL_START(WC_FUNC_TICKET_DO);
  27580. WOLFSSL_ENTER("DoClientTicket");
  27581. if (len > SESSION_TICKET_LEN ||
  27582. len < (word32)(sizeof(InternalTicket) + WOLFSSL_TICKET_FIXED_SZ)) {
  27583. return BAD_TICKET_MSG_SZ;
  27584. }
  27585. et = (ExternalTicket*)input;
  27586. /* decrypt */
  27587. ato32(et->enc_len, &inLen);
  27588. if (inLen > (word16)(len - WOLFSSL_TICKET_FIXED_SZ)) {
  27589. return BAD_TICKET_MSG_SZ;
  27590. }
  27591. outLen = (int)inLen; /* may be reduced by user padding */
  27592. if (ssl->ctx->ticketEncCb == NULL
  27593. #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(WOLFSSL_WPAS_SMALL)
  27594. ||
  27595. /* SSL_OP_NO_TICKET turns off tickets in < 1.2. Forces
  27596. * "stateful" tickets for 1.3 so just use the regular
  27597. * stateless ones. */
  27598. (!IsAtLeastTLSv1_3(ssl->version) &&
  27599. (ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0)
  27600. #endif
  27601. ) {
  27602. ret = WOLFSSL_TICKET_RET_FATAL;
  27603. }
  27604. else {
  27605. ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv,
  27606. et->enc_ticket + inLen, 0,
  27607. et->enc_ticket, inLen, &outLen,
  27608. ssl->ctx->ticketEncCtx);
  27609. }
  27610. if (ret == WOLFSSL_TICKET_RET_FATAL)
  27611. ret = WOLFSSL_TICKET_RET_REJECT;
  27612. if (ret < 0)
  27613. return ret;
  27614. if (outLen > (int)inLen || outLen < (int)sizeof(InternalTicket)) {
  27615. WOLFSSL_MSG("Bad user ticket decrypt len");
  27616. return BAD_TICKET_KEY_CB_SZ;
  27617. }
  27618. it = (InternalTicket*)et->enc_ticket;
  27619. /* get master secret */
  27620. if (ret == WOLFSSL_TICKET_RET_OK || ret == WOLFSSL_TICKET_RET_CREATE) {
  27621. if (ssl->version.minor < it->pv.minor) {
  27622. ForceZero(it, sizeof(*it));
  27623. WOLFSSL_MSG("Ticket has greater version");
  27624. return VERSION_ERROR;
  27625. }
  27626. else if (ssl->version.minor > it->pv.minor) {
  27627. if (IsAtLeastTLSv1_3(it->pv) != IsAtLeastTLSv1_3(ssl->version)) {
  27628. ForceZero(it, sizeof(*it));
  27629. WOLFSSL_MSG("Tickets cannot be shared between "
  27630. "TLS 1.3 and TLS 1.2 and lower");
  27631. return VERSION_ERROR;
  27632. }
  27633. if (!ssl->options.downgrade) {
  27634. ForceZero(it, sizeof(*it));
  27635. WOLFSSL_MSG("Ticket has lesser version");
  27636. return VERSION_ERROR;
  27637. }
  27638. WOLFSSL_MSG("Downgrading protocol due to ticket");
  27639. if (it->pv.minor < ssl->options.minDowngrade) {
  27640. ForceZero(it, sizeof(*it));
  27641. return VERSION_ERROR;
  27642. }
  27643. ssl->version.minor = it->pv.minor;
  27644. }
  27645. #ifdef WOLFSSL_TICKET_HAVE_ID
  27646. {
  27647. ssl->session->haveAltSessionID = 1;
  27648. XMEMCPY(ssl->session->altSessionID, it->id, ID_LEN);
  27649. if (wolfSSL_GetSession(ssl, NULL, 1) != NULL) {
  27650. WOLFSSL_MSG("Found session matching the session id"
  27651. " found in the ticket");
  27652. }
  27653. else {
  27654. WOLFSSL_MSG("Can't find session matching the session id"
  27655. " found in the ticket");
  27656. }
  27657. }
  27658. #endif
  27659. if (!IsAtLeastTLSv1_3(ssl->version)) {
  27660. XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN);
  27661. /* Copy the haveExtendedMasterSecret property from the ticket to
  27662. * the saved session, so the property may be checked later. */
  27663. ssl->session->haveEMS = it->haveEMS;
  27664. ato32((const byte*)&it->timestamp, &ssl->session->bornOn);
  27665. #ifndef NO_RESUME_SUITE_CHECK
  27666. ssl->session->cipherSuite0 = it->suite[0];
  27667. ssl->session->cipherSuite = it->suite[1];
  27668. #endif
  27669. }
  27670. else {
  27671. #ifdef WOLFSSL_TLS13
  27672. /* Restore information to renegotiate. */
  27673. ato32(it->timestamp, &ssl->session->ticketSeen);
  27674. ato32(it->ageAdd, &ssl->session->ticketAdd);
  27675. ssl->session->cipherSuite0 = it->suite[0];
  27676. ssl->session->cipherSuite = it->suite[1];
  27677. #ifdef WOLFSSL_EARLY_DATA
  27678. ato32(it->maxEarlyDataSz, &ssl->session->maxEarlyDataSz);
  27679. #endif
  27680. /* Resumption master secret. */
  27681. XMEMCPY(ssl->session->masterSecret, it->msecret, SECRET_LEN);
  27682. XMEMCPY(&ssl->session->ticketNonce, &it->ticketNonce,
  27683. sizeof(TicketNonce));
  27684. ato16(it->namedGroup, &ssl->session->namedGroup);
  27685. #endif
  27686. }
  27687. }
  27688. ForceZero(it, sizeof(*it));
  27689. WOLFSSL_LEAVE("DoClientTicket", ret);
  27690. WOLFSSL_END(WC_FUNC_TICKET_DO);
  27691. return ret;
  27692. }
  27693. /* send Session Ticket */
  27694. int SendTicket(WOLFSSL* ssl)
  27695. {
  27696. byte* output;
  27697. int ret;
  27698. int sendSz;
  27699. word32 length = SESSION_HINT_SZ + LENGTH_SZ;
  27700. word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  27701. WOLFSSL_START(WC_FUNC_TICKET_SEND);
  27702. WOLFSSL_ENTER("SendTicket");
  27703. if (ssl->options.createTicket) {
  27704. ret = CreateTicket(ssl);
  27705. if (ret != 0) return ret;
  27706. }
  27707. length += ssl->session->ticketLen;
  27708. sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
  27709. if (!ssl->options.dtls) {
  27710. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  27711. sendSz += MAX_MSG_EXTRA;
  27712. }
  27713. else {
  27714. #ifdef WOLFSSL_DTLS
  27715. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27716. idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  27717. #endif
  27718. }
  27719. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
  27720. sendSz += cipherExtraData(ssl);
  27721. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  27722. * is not advanced yet */
  27723. ssl->options.buildingMsg = 1;
  27724. /* check for available size */
  27725. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  27726. return ret;
  27727. /* get output buffer */
  27728. output = ssl->buffers.outputBuffer.buffer +
  27729. ssl->buffers.outputBuffer.length;
  27730. AddHeaders(output, length, session_ticket, ssl);
  27731. /* hint */
  27732. c32toa(ssl->ctx->ticketHint, output + idx);
  27733. idx += SESSION_HINT_SZ;
  27734. /* length */
  27735. c16toa(ssl->session->ticketLen, output + idx);
  27736. idx += LENGTH_SZ;
  27737. /* ticket */
  27738. XMEMCPY(output + idx, ssl->session->ticket, ssl->session->ticketLen);
  27739. idx += ssl->session->ticketLen;
  27740. if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
  27741. byte* input;
  27742. int inputSz = idx; /* build msg adds rec hdr */
  27743. int recordHeaderSz = RECORD_HEADER_SZ;
  27744. if (ssl->options.dtls)
  27745. recordHeaderSz += DTLS_RECORD_EXTRA;
  27746. inputSz -= recordHeaderSz;
  27747. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27748. if (input == NULL)
  27749. return MEMORY_E;
  27750. XMEMCPY(input, output + recordHeaderSz, inputSz);
  27751. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  27752. handshake, 1, 0, 0, CUR_ORDER);
  27753. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  27754. if (sendSz < 0)
  27755. return sendSz;
  27756. }
  27757. else {
  27758. #ifdef WOLFSSL_DTLS
  27759. if (ssl->options.dtls) {
  27760. if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
  27761. return ret;
  27762. DtlsSEQIncrement(ssl, CUR_ORDER);
  27763. }
  27764. #endif
  27765. ret = HashOutput(ssl, output, sendSz, 0);
  27766. if (ret != 0)
  27767. return ret;
  27768. }
  27769. ssl->buffers.outputBuffer.length += sendSz;
  27770. ssl->options.buildingMsg = 0;
  27771. if (!ssl->options.groupMessages)
  27772. ret = SendBuffered(ssl);
  27773. WOLFSSL_LEAVE("SendTicket", ret);
  27774. WOLFSSL_END(WC_FUNC_TICKET_SEND);
  27775. return ret;
  27776. }
  27777. #ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
  27778. /* Initialize the context for session ticket encryption.
  27779. *
  27780. * @param [in] ctx SSL context.
  27781. * @param [in] keyCtx Context for session ticket encryption.
  27782. * @return 0 on success.
  27783. * @return BAD_MUTEX_E when initializing mutex fails.
  27784. */
  27785. static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
  27786. {
  27787. int ret = 0;
  27788. XMEMSET(keyCtx, 0, sizeof(*keyCtx));
  27789. keyCtx->ctx = ctx;
  27790. #ifndef SINGLE_THREADED
  27791. ret = wc_InitMutex(&keyCtx->mutex);
  27792. #endif
  27793. return ret;
  27794. }
  27795. /* Setup the session ticket encryption context for this.
  27796. *
  27797. * Initialize RNG, generate name, generate primary key and set primary key
  27798. * expirary.
  27799. *
  27800. * @param [in] keyCtx Context for session ticket encryption.
  27801. * @param [in] heap Dynamic memory allocation hint.
  27802. * @param [in] devId Device identifier.
  27803. * @return 0 on success.
  27804. * @return Other value when random number generator fails.
  27805. */
  27806. static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
  27807. {
  27808. int ret;
  27809. #ifndef SINGLE_THREADED
  27810. ret = 0;
  27811. /* Check that key wasn't set up while waiting. */
  27812. if (keyCtx->expirary[0] == 0)
  27813. #endif
  27814. {
  27815. ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
  27816. if (ret == 0) {
  27817. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
  27818. sizeof(keyCtx->name));
  27819. }
  27820. if (ret == 0) {
  27821. /* Mask of the bottom bit - used for index of key. */
  27822. keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
  27823. /* Generate initial primary key. */
  27824. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
  27825. WOLFSSL_TICKET_KEY_SZ);
  27826. }
  27827. if (ret == 0) {
  27828. keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
  27829. }
  27830. }
  27831. return ret;
  27832. }
  27833. /* Free the context for session ticket encryption.
  27834. *
  27835. * Zeroize keys and name.
  27836. *
  27837. * @param [in] keyCtx Context for session ticket encryption.
  27838. */
  27839. static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
  27840. {
  27841. /* Zeroize sensitive data. */
  27842. ForceZero(keyCtx->name, sizeof(keyCtx->name));
  27843. ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
  27844. ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
  27845. #ifndef SINGLE_THREADED
  27846. wc_FreeMutex(&keyCtx->mutex);
  27847. #endif
  27848. wc_FreeRng(&keyCtx->rng);
  27849. }
  27850. #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
  27851. !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
  27852. !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
  27853. /* Ticket encryption/decryption implementation.
  27854. *
  27855. * @param [in] key Key for encryption/decryption.
  27856. * @param [in] keyLen Length of key in bytes.
  27857. * @param [in] iv IV/Nonce for encryption/decryption.
  27858. * @param [in] aad Additional authentication data.
  27859. * @param [in] aadSz Length of additional authentication data.
  27860. * @param [in] in Data to encrypt/decrypt.
  27861. * @param [in] inLen Length of encrypted data.
  27862. * @param [out] out Resulting data from encrypt/decrypt.
  27863. * @param [out] outLen Size of resulting data.
  27864. * @param [in] tag Authentication tag for encrypted data.
  27865. * @param [in] heap Dynamic memory allocation data hint.
  27866. * @param [in] enc 1 when encrypting, 0 when decrypting.
  27867. * @return 0 on success.
  27868. * @return Other value when encryption/decryption fails.
  27869. */
  27870. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  27871. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  27872. void* heap, int enc)
  27873. {
  27874. int ret;
  27875. (void)keyLen;
  27876. (void)heap;
  27877. if (enc) {
  27878. ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
  27879. tag);
  27880. }
  27881. else {
  27882. ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
  27883. out);
  27884. }
  27885. *outLen = inLen;
  27886. return ret;
  27887. }
  27888. #elif defined(HAVE_AESGCM)
  27889. /* Ticket encryption/decryption implementation.
  27890. *
  27891. * @param [in] key Key for encryption/decryption.
  27892. * @param [in] keyLen Length of key in bytes.
  27893. * @param [in] iv IV/Nonce for encryption/decryption.
  27894. * @param [in] aad Additional authentication data.
  27895. * @param [in] aadSz Length of additional authentication data.
  27896. * @param [in] in Data to encrypt/decrypt.
  27897. * @param [in] inLen Length of encrypted data.
  27898. * @param [out] out Resulting data from encrypt/decrypt.
  27899. * @param [out] outLen Size of resulting data.
  27900. * @param [in] tag Authentication tag for encrypted data.
  27901. * @param [in] heap Dynamic memory allocation data hint.
  27902. * @param [in] enc 1 when encrypting, 0 when decrypting.
  27903. * @return 0 on success.
  27904. * @return MEMORY_E when dynamic memory allocation fails.
  27905. * @return Other value when encryption/decryption fails.
  27906. */
  27907. static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
  27908. byte* in, int inLen, byte* out, int* outLen, byte* tag,
  27909. void* heap, int enc)
  27910. {
  27911. int ret;
  27912. #ifdef WOLFSSL_SMALL_STACK
  27913. Aes* aes;
  27914. #else
  27915. Aes aes[1];
  27916. #endif
  27917. (void)heap;
  27918. #ifdef WOLFSSL_SMALL_STACK
  27919. aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
  27920. if (aes == NULL)
  27921. return MEMORY_E;
  27922. #endif
  27923. if (enc) {
  27924. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  27925. if (ret == 0) {
  27926. ret = wc_AesGcmSetKey(aes, key, keyLen);
  27927. }
  27928. if (ret == 0) {
  27929. ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  27930. tag, AES_BLOCK_SIZE, aad, aadSz);
  27931. }
  27932. wc_AesFree(aes);
  27933. }
  27934. else {
  27935. ret = wc_AesInit(aes, NULL, INVALID_DEVID);
  27936. if (ret == 0) {
  27937. ret = wc_AesGcmSetKey(aes, key, keyLen);
  27938. }
  27939. if (ret == 0) {
  27940. ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
  27941. tag, AES_BLOCK_SIZE, aad, aadSz);
  27942. }
  27943. wc_AesFree(aes);
  27944. }
  27945. #ifdef WOLFSSL_SMALL_STACK
  27946. XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
  27947. #endif
  27948. *outLen = inLen;
  27949. return ret;
  27950. }
  27951. #else
  27952. #error "No encryption algorithm available for default ticket encryption."
  27953. #endif
  27954. /* Choose a key to use for encryption.
  27955. *
  27956. * Generate a new key if the current ones are expired.
  27957. * If the secondary key has not been used and the primary key has expired then
  27958. * generate a new primary key.
  27959. *
  27960. * @param [in] Ticket encryption callback context.
  27961. * @param [in] Session ticket lifetime.
  27962. * @param [out] Index of key to use for encryption.
  27963. * @return 0 on success.
  27964. * @return Other value when random number generation fails.
  27965. */
  27966. static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
  27967. int* keyIdx)
  27968. {
  27969. int ret = 0;
  27970. /* Get new current time as lock may have taken some time. */
  27971. word32 now = LowResTimer();
  27972. /* Check expirary of primary key for encrypt. */
  27973. if (keyCtx->expirary[0] >= now + ticketHint) {
  27974. *keyIdx = 0;
  27975. }
  27976. /* Check expirary of primary key for encrypt. */
  27977. else if (keyCtx->expirary[1] >= now + ticketHint) {
  27978. *keyIdx = 1;
  27979. }
  27980. /* No key available to use. */
  27981. else {
  27982. int genKey;
  27983. /* Generate which ever key is expired for decrypt - primary first. */
  27984. if (keyCtx->expirary[0] < now) {
  27985. genKey = 0;
  27986. }
  27987. else if (keyCtx->expirary[1] < now) {
  27988. genKey = 1;
  27989. }
  27990. /* Timeouts and expirary should not allow this to happen. */
  27991. else {
  27992. return BAD_STATE_E;
  27993. }
  27994. /* Generate the required key */
  27995. ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
  27996. WOLFSSL_TICKET_KEY_SZ);
  27997. if (ret == 0) {
  27998. keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
  27999. *keyIdx = genKey;
  28000. }
  28001. }
  28002. return ret;
  28003. }
  28004. /* Default Session Ticket encryption/decryption callback.
  28005. *
  28006. * Use ChaCha20-Poly1305 or AES-GCM to encrypt/decrypt the ticket.
  28007. * Two keys are used:
  28008. * - When the first expires for encryption, then use the other.
  28009. * - Don't encrypt with key if the ticket lifetime will go beyond expirary.
  28010. * - Generate a new primary key when primary key expired for decrypt and
  28011. * no secondary key is activate for encryption.
  28012. * - Generate a new secondary key when expired and needed.
  28013. * - Calculate expirary starting from first encrypted ticket.
  28014. * - Key name has last bit set to indicate index of key.
  28015. * Keys expire for decryption after ticket key lifetime from the first encrypted
  28016. * ticket.
  28017. * Keys can only be use for encryption while the ticket hint does not exceed
  28018. * the key lifetime.
  28019. * Lifetime of a key must be greater than the lifetime of a ticket. This means
  28020. * that if one ticket is only valid for decryption, then the other will be
  28021. * valid for encryption.
  28022. * AAD = key_name | iv | ticket len (16-bits network order)
  28023. *
  28024. * @param [in] ssl SSL connection.
  28025. * @param [in,out] key_name Name of key from client.
  28026. * Encrypt: name of key returned.
  28027. * Decrypt: name from ticket message to check.
  28028. * @param [in] iv IV to use in encryption/decryption.
  28029. * @param [in] mac MAC for authentication of encrypted data.
  28030. * @param [in] enc 1 when encrypting ticket, 0 when decrypting.
  28031. * @param [in,out] ticket Encrypted/decrypted session ticket bytes.
  28032. * @param [in] inLen Length of incoming ticket.
  28033. * @param [out] outLen Length of outgoing ticket.
  28034. * @param [in] userCtx Context for encryption/decryption of ticket.
  28035. * @return WOLFSSL_TICKET_RET_OK when successful.
  28036. * @return WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
  28037. * be created for TLS 1.2 and below.
  28038. * @return WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
  28039. * decrypted ticket.
  28040. * @return WOLFSSL_TICKET_RET_FATAL when key name does not match.
  28041. */
  28042. static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
  28043. byte iv[WOLFSSL_TICKET_IV_SZ],
  28044. byte mac[WOLFSSL_TICKET_MAC_SZ],
  28045. int enc, byte* ticket, int inLen, int* outLen,
  28046. void* userCtx)
  28047. {
  28048. int ret;
  28049. TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
  28050. WOLFSSL_CTX* ctx = keyCtx->ctx;
  28051. word16 sLen = XHTONS((word16)inLen);
  28052. byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
  28053. int aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
  28054. byte* p = aad;
  28055. int keyIdx = 0;
  28056. WOLFSSL_ENTER("DefTicketEncCb");
  28057. /* Check we have setup the RNG, name and primary key. */
  28058. if (keyCtx->expirary[0] == 0) {
  28059. #ifndef SINGLE_THREADED
  28060. /* Lock around access to expirary and key - stop initial key being
  28061. * generated twice at the same time. */
  28062. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  28063. WOLFSSL_MSG("Couldn't lock key context mutex");
  28064. return WOLFSSL_TICKET_RET_REJECT;
  28065. }
  28066. #endif
  28067. /* Sets expirary of primary key in setup. */
  28068. ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
  28069. #ifndef SINGLE_THREADED
  28070. wc_UnLockMutex(&keyCtx->mutex);
  28071. #endif
  28072. if (ret != 0)
  28073. return ret;
  28074. }
  28075. if (enc) {
  28076. /* Return the name of the key - missing key index. */
  28077. XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  28078. /* Generate a new IV into buffer to be returned.
  28079. * Don't use the RNG in keyCtx as it's for generating private data. */
  28080. ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
  28081. if (ret != 0) {
  28082. return WOLFSSL_TICKET_RET_REJECT;
  28083. }
  28084. }
  28085. else {
  28086. /* Mask of last bit that is the key index. */
  28087. byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
  28088. /* For decryption, see if we know this key - check all but last byte. */
  28089. if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
  28090. return WOLFSSL_TICKET_RET_FATAL;
  28091. }
  28092. /* Ensure last byte without index bit matches too. */
  28093. if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
  28094. return WOLFSSL_TICKET_RET_FATAL;
  28095. }
  28096. }
  28097. /* Build AAD from: key name, iv, and length of ticket. */
  28098. XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
  28099. p += WOLFSSL_TICKET_NAME_SZ;
  28100. XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
  28101. p += WOLFSSL_TICKET_IV_SZ;
  28102. XMEMCPY(p, &sLen, sizeof(sLen));
  28103. /* Encrypt ticket. */
  28104. if (enc) {
  28105. word32 now;
  28106. now = LowResTimer();
  28107. /* As long as encryption expirary isn't imminent - no lock. */
  28108. if (keyCtx->expirary[0] > now + ctx->ticketHint) {
  28109. keyIdx = 0;
  28110. }
  28111. else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
  28112. keyIdx = 1;
  28113. }
  28114. else {
  28115. #ifndef SINGLE_THREADED
  28116. /* Lock around access to expirary and key - stop key being generated
  28117. * twice at the same time. */
  28118. if (wc_LockMutex(&keyCtx->mutex) != 0) {
  28119. WOLFSSL_MSG("Couldn't lock key context mutex");
  28120. return WOLFSSL_TICKET_RET_REJECT;
  28121. }
  28122. #endif
  28123. ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
  28124. #ifndef SINGLE_THREADED
  28125. wc_UnLockMutex(&keyCtx->mutex);
  28126. #endif
  28127. if (ret != 0) {
  28128. return WOLFSSL_TICKET_RET_REJECT;
  28129. }
  28130. }
  28131. /* Set the name of the key to the index chosen. */
  28132. key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  28133. /* Update AAD too. */
  28134. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  28135. /* Encrypt ticket data. */
  28136. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  28137. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  28138. 1);
  28139. if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
  28140. }
  28141. /* Decrypt ticket. */
  28142. else {
  28143. /* Get index of key from name. */
  28144. keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
  28145. /* Update AAD with index. */
  28146. aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
  28147. /* Check expirary */
  28148. if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
  28149. return WOLFSSL_TICKET_RET_REJECT;
  28150. }
  28151. /* Decrypt ticket data. */
  28152. ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
  28153. aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
  28154. 0);
  28155. if (ret != 0) {
  28156. return WOLFSSL_TICKET_RET_REJECT;
  28157. }
  28158. }
  28159. #ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
  28160. if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
  28161. return WOLFSSL_TICKET_RET_CREATE;
  28162. #endif
  28163. return WOLFSSL_TICKET_RET_OK;
  28164. }
  28165. #endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
  28166. #endif /* HAVE_SESSION_TICKET */
  28167. #ifndef WOLFSSL_NO_TLS12
  28168. #if defined(HAVE_SECURE_RENEGOTIATION) && \
  28169. !defined(NO_WOLFSSL_SERVER)
  28170. /* handle generation of server's hello_request (0) */
  28171. int SendHelloRequest(WOLFSSL* ssl)
  28172. {
  28173. byte* output;
  28174. int sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
  28175. int ret;
  28176. WOLFSSL_START(WC_FUNC_HELLO_REQUEST_SEND);
  28177. WOLFSSL_ENTER("SendHelloRequest");
  28178. if (IsEncryptionOn(ssl, 1))
  28179. sendSz += MAX_MSG_EXTRA;
  28180. if (ssl->options.dtls)
  28181. sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
  28182. /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state
  28183. * is not advanced yet */
  28184. ssl->options.buildingMsg = 1;
  28185. /* check for available size */
  28186. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  28187. return ret;
  28188. /* get output buffer */
  28189. output = ssl->buffers.outputBuffer.buffer +
  28190. ssl->buffers.outputBuffer.length;
  28191. AddHeaders(output, 0, hello_request, ssl);
  28192. if (IsEncryptionOn(ssl, 1)) {
  28193. byte* input;
  28194. int inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
  28195. int recordHeaderSz = RECORD_HEADER_SZ;
  28196. if (ssl->options.dtls) {
  28197. recordHeaderSz += DTLS_RECORD_EXTRA;
  28198. inputSz += DTLS_HANDSHAKE_EXTRA;
  28199. }
  28200. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28201. if (input == NULL)
  28202. return MEMORY_E;
  28203. XMEMCPY(input, output + recordHeaderSz, inputSz);
  28204. #ifdef WOLFSSL_DTLS
  28205. if (IsDtlsNotSctpMode(ssl) &&
  28206. (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
  28207. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28208. return ret;
  28209. }
  28210. #endif
  28211. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  28212. handshake, 0, 0, 0, CUR_ORDER);
  28213. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28214. if (sendSz < 0)
  28215. return sendSz;
  28216. }
  28217. ssl->buffers.outputBuffer.length += sendSz;
  28218. ssl->options.buildingMsg = 0;
  28219. ret = SendBuffered(ssl);
  28220. WOLFSSL_LEAVE("SendHelloRequest", ret);
  28221. WOLFSSL_END(WC_FUNC_HELLO_REQUEST_SEND);
  28222. return ret;
  28223. }
  28224. #endif /* HAVE_SECURE_RENEGOTIATION && !NO_WOLFSSL_SERVER */
  28225. #ifdef WOLFSSL_DTLS
  28226. /* handle generation of DTLS hello_verify_request (3) */
  28227. static int SendHelloVerifyRequest(WOLFSSL* ssl,
  28228. const byte* cookie, byte cookieSz)
  28229. {
  28230. byte* output;
  28231. int length = VERSION_SZ + ENUM_LEN + cookieSz;
  28232. int idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ;
  28233. int sendSz = length + idx;
  28234. int ret;
  28235. /* are we in scr */
  28236. if (IsEncryptionOn(ssl, 1)) {
  28237. sendSz += MAX_MSG_EXTRA;
  28238. }
  28239. /* reset states */
  28240. ssl->msgsReceived.got_client_hello = 0;
  28241. ssl->keys.dtls_handshake_number = 0;
  28242. ssl->keys.dtls_expected_peer_handshake_number = 0;
  28243. ssl->options.clientState = 0;
  28244. ret = InitHandshakeHashes(ssl);
  28245. if (ret != 0)
  28246. return ret;
  28247. /* check for available size */
  28248. if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
  28249. return ret;
  28250. /* get output buffer */
  28251. output = ssl->buffers.outputBuffer.buffer +
  28252. ssl->buffers.outputBuffer.length;
  28253. /* Hello Verify Request should use the same sequence number
  28254. * as the Client Hello unless we are in renegotiation then
  28255. * don't change numbers */
  28256. #ifdef HAVE_SECURE_RENEGOTIATION
  28257. if (!IsSCR(ssl))
  28258. #endif
  28259. {
  28260. ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
  28261. ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
  28262. }
  28263. AddHeaders(output, length, hello_verify_request, ssl);
  28264. #ifdef OPENSSL_EXTRA
  28265. output[idx++] = DTLS_MAJOR;
  28266. output[idx++] = DTLS_MINOR;
  28267. #else
  28268. output[idx++] = ssl->version.major;
  28269. output[idx++] = ssl->version.minor;
  28270. #endif
  28271. output[idx++] = cookieSz;
  28272. if (cookie == NULL || cookieSz == 0)
  28273. return COOKIE_ERROR;
  28274. XMEMCPY(output + idx, cookie, cookieSz);
  28275. #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
  28276. if (ssl->hsInfoOn)
  28277. AddPacketName(ssl, "HelloVerifyRequest");
  28278. if (ssl->toInfoOn)
  28279. AddPacketInfo(ssl, "HelloVerifyRequest", handshake, output,
  28280. sendSz, WRITE_PROTO, ssl->heap);
  28281. #endif
  28282. /* are we in scr */
  28283. if (IsEncryptionOn(ssl, 1)) {
  28284. byte* input;
  28285. int inputSz = DTLS_HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
  28286. int recordHeaderSz = DTLS_RECORD_HEADER_SZ;
  28287. input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28288. if (input == NULL)
  28289. return MEMORY_E;
  28290. XMEMCPY(input, output + recordHeaderSz, inputSz);
  28291. sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
  28292. handshake, 0, 0, 0, CUR_ORDER);
  28293. XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
  28294. if (sendSz < 0)
  28295. return sendSz;
  28296. }
  28297. ssl->buffers.outputBuffer.length += sendSz;
  28298. DtlsSEQIncrement(ssl, CUR_ORDER);
  28299. return SendBuffered(ssl);
  28300. }
  28301. #endif /* WOLFSSL_DTLS */
  28302. typedef struct DckeArgs {
  28303. byte* output; /* not allocated */
  28304. word32 length;
  28305. word32 idx;
  28306. word32 begin;
  28307. word32 sigSz;
  28308. #ifndef NO_RSA
  28309. int lastErr;
  28310. #endif
  28311. } DckeArgs;
  28312. static void FreeDckeArgs(WOLFSSL* ssl, void* pArgs)
  28313. {
  28314. DckeArgs* args = (DckeArgs*)pArgs;
  28315. (void)ssl;
  28316. (void)args;
  28317. }
  28318. /* handle processing client_key_exchange (16) */
  28319. static int DoClientKeyExchange(WOLFSSL* ssl, byte* input, word32* inOutIdx,
  28320. word32 size)
  28321. {
  28322. int ret;
  28323. #ifdef WOLFSSL_ASYNC_CRYPT
  28324. DckeArgs* args = NULL;
  28325. WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args);
  28326. #else
  28327. DckeArgs args[1];
  28328. #endif
  28329. (void)size;
  28330. (void)input;
  28331. WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  28332. WOLFSSL_ENTER("DoClientKeyExchange");
  28333. #ifdef WOLFSSL_ASYNC_CRYPT
  28334. if (ssl->async == NULL) {
  28335. ssl->async = (struct WOLFSSL_ASYNC*)
  28336. XMALLOC(sizeof(struct WOLFSSL_ASYNC), ssl->heap,
  28337. DYNAMIC_TYPE_ASYNC);
  28338. if (ssl->async == NULL)
  28339. ERROR_OUT(MEMORY_E, exit_dcke);
  28340. }
  28341. args = (DckeArgs*)ssl->async->args;
  28342. ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
  28343. if (ret != WC_NOT_PENDING_E) {
  28344. /* Check for error */
  28345. if (ret < 0)
  28346. goto exit_dcke;
  28347. }
  28348. else
  28349. #endif /* WOLFSSL_ASYNC_CRYPT */
  28350. {
  28351. /* Reset state */
  28352. ret = 0;
  28353. ssl->options.asyncState = TLS_ASYNC_BEGIN;
  28354. XMEMSET(args, 0, sizeof(DckeArgs));
  28355. args->idx = *inOutIdx;
  28356. args->begin = *inOutIdx;
  28357. #ifdef WOLFSSL_ASYNC_CRYPT
  28358. ssl->async->freeArgs = FreeDckeArgs;
  28359. #endif
  28360. }
  28361. /* Do Client Key Exchange State Machine */
  28362. switch(ssl->options.asyncState)
  28363. {
  28364. case TLS_ASYNC_BEGIN:
  28365. {
  28366. /* Sanity checks */
  28367. /* server side checked in SanityCheckMsgReceived */
  28368. if (ssl->options.clientState < CLIENT_HELLO_COMPLETE) {
  28369. WOLFSSL_MSG("Client sending keyexchange at wrong time");
  28370. SendAlert(ssl, alert_fatal, unexpected_message);
  28371. ERROR_OUT(OUT_OF_ORDER_E, exit_dcke);
  28372. }
  28373. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  28374. if (ssl->options.verifyPeer &&
  28375. (ssl->options.mutualAuth || ssl->options.failNoCert)) {
  28376. if (!ssl->options.havePeerCert) {
  28377. WOLFSSL_MSG("client didn't present peer cert");
  28378. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  28379. }
  28380. }
  28381. if (ssl->options.verifyPeer && ssl->options.failNoCertxPSK) {
  28382. if (!ssl->options.havePeerCert &&
  28383. !ssl->options.usingPSK_cipher) {
  28384. WOLFSSL_MSG("client didn't present peer cert");
  28385. ERROR_OUT(NO_PEER_CERT, exit_dcke);
  28386. }
  28387. }
  28388. #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
  28389. #if defined(WOLFSSL_CALLBACKS)
  28390. if (ssl->hsInfoOn) {
  28391. AddPacketName(ssl, "ClientKeyExchange");
  28392. }
  28393. if (ssl->toInfoOn) {
  28394. AddLateName("ClientKeyExchange", &ssl->timeoutInfo);
  28395. }
  28396. #endif
  28397. if (ssl->arrays->preMasterSecret == NULL) {
  28398. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  28399. ssl->arrays->preMasterSecret = (byte*)XMALLOC(ENCRYPT_LEN,
  28400. ssl->heap, DYNAMIC_TYPE_SECRET);
  28401. if (ssl->arrays->preMasterSecret == NULL) {
  28402. ERROR_OUT(MEMORY_E, exit_dcke);
  28403. }
  28404. XMEMSET(ssl->arrays->preMasterSecret, 0, ENCRYPT_LEN);
  28405. }
  28406. switch (ssl->specs.kea) {
  28407. #ifndef NO_RSA
  28408. case rsa_kea:
  28409. {
  28410. break;
  28411. } /* rsa_kea */
  28412. #endif /* !NO_RSA */
  28413. #ifndef NO_PSK
  28414. case psk_kea:
  28415. {
  28416. /* sanity check that PSK server callback has been set */
  28417. if (ssl->options.server_psk_cb == NULL) {
  28418. WOLFSSL_MSG("No server PSK callback set");
  28419. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  28420. }
  28421. break;
  28422. }
  28423. #endif /* !NO_PSK */
  28424. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28425. defined(HAVE_CURVE448)
  28426. case ecc_diffie_hellman_kea:
  28427. {
  28428. break;
  28429. }
  28430. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28431. #ifndef NO_DH
  28432. case diffie_hellman_kea:
  28433. {
  28434. break;
  28435. }
  28436. #endif /* !NO_DH */
  28437. #if !defined(NO_DH) && !defined(NO_PSK)
  28438. case dhe_psk_kea:
  28439. {
  28440. /* sanity check that PSK server callback has been set */
  28441. if (ssl->options.server_psk_cb == NULL) {
  28442. WOLFSSL_MSG("No server PSK callback set");
  28443. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  28444. }
  28445. break;
  28446. }
  28447. #endif /* !NO_DH && !NO_PSK */
  28448. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28449. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28450. case ecdhe_psk_kea:
  28451. {
  28452. /* sanity check that PSK server callback has been set */
  28453. if (ssl->options.server_psk_cb == NULL) {
  28454. WOLFSSL_MSG("No server PSK callback set");
  28455. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  28456. }
  28457. break;
  28458. }
  28459. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  28460. default:
  28461. WOLFSSL_MSG("Bad kea type");
  28462. ret = BAD_KEA_TYPE_E;
  28463. } /* switch (ssl->specs.kea) */
  28464. /* Check for error */
  28465. if (ret != 0) {
  28466. goto exit_dcke;
  28467. }
  28468. /* Advance state and proceed */
  28469. ssl->options.asyncState = TLS_ASYNC_BUILD;
  28470. } /* TLS_ASYNC_BEGIN */
  28471. FALL_THROUGH;
  28472. case TLS_ASYNC_BUILD:
  28473. {
  28474. switch (ssl->specs.kea) {
  28475. #ifndef NO_RSA
  28476. case rsa_kea:
  28477. {
  28478. word16 keySz;
  28479. ssl->buffers.keyType = rsa_sa_algo;
  28480. ret = DecodePrivateKey(ssl, &keySz);
  28481. if (ret != 0) {
  28482. goto exit_dcke;
  28483. }
  28484. args->length = (word32)keySz;
  28485. ssl->arrays->preMasterSz = SECRET_LEN;
  28486. if (ssl->options.tls) {
  28487. word16 check;
  28488. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  28489. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28490. }
  28491. ato16(input + args->idx, &check);
  28492. args->idx += OPAQUE16_LEN;
  28493. if ((word32)check != args->length) {
  28494. WOLFSSL_MSG("RSA explicit size doesn't match");
  28495. #ifdef WOLFSSL_EXTRA_ALERTS
  28496. SendAlert(ssl, alert_fatal, bad_record_mac);
  28497. #endif
  28498. ERROR_OUT(RSA_PRIVATE_ERROR, exit_dcke);
  28499. }
  28500. }
  28501. if ((args->idx - args->begin) + args->length > size) {
  28502. WOLFSSL_MSG("RSA message too big");
  28503. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28504. }
  28505. /* pre-load PreMasterSecret with RNG data */
  28506. ret = wc_RNG_GenerateBlock(ssl->rng,
  28507. &ssl->arrays->preMasterSecret[VERSION_SZ],
  28508. SECRET_LEN - VERSION_SZ);
  28509. if (ret != 0) {
  28510. goto exit_dcke;
  28511. }
  28512. args->output = NULL;
  28513. break;
  28514. } /* rsa_kea */
  28515. #endif /* !NO_RSA */
  28516. #ifndef NO_PSK
  28517. case psk_kea:
  28518. {
  28519. byte* pms = ssl->arrays->preMasterSecret;
  28520. word16 ci_sz;
  28521. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  28522. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28523. }
  28524. ato16(input + args->idx, &ci_sz);
  28525. args->idx += OPAQUE16_LEN;
  28526. if (ci_sz > MAX_PSK_ID_LEN) {
  28527. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  28528. }
  28529. if ((args->idx - args->begin) + ci_sz > size) {
  28530. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28531. }
  28532. XMEMCPY(ssl->arrays->client_identity,
  28533. input + args->idx, ci_sz);
  28534. args->idx += ci_sz;
  28535. ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
  28536. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  28537. ssl->arrays->client_identity, ssl->arrays->psk_key,
  28538. MAX_PSK_KEY_LEN);
  28539. if (ssl->arrays->psk_keySz == 0 ||
  28540. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  28541. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  28542. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  28543. SendAlert(ssl, alert_fatal,
  28544. unknown_psk_identity);
  28545. #endif
  28546. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  28547. }
  28548. /* SERVER: Pre-shared Key for peer authentication. */
  28549. ssl->options.peerAuthGood = 1;
  28550. /* make psk pre master secret */
  28551. /* length of key + length 0s + length of key + key */
  28552. c16toa((word16) ssl->arrays->psk_keySz, pms);
  28553. pms += OPAQUE16_LEN;
  28554. XMEMSET(pms, 0, ssl->arrays->psk_keySz);
  28555. pms += ssl->arrays->psk_keySz;
  28556. c16toa((word16) ssl->arrays->psk_keySz, pms);
  28557. pms += OPAQUE16_LEN;
  28558. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  28559. ssl->arrays->preMasterSz =
  28560. (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2);
  28561. break;
  28562. }
  28563. #endif /* !NO_PSK */
  28564. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28565. defined(HAVE_CURVE448)
  28566. case ecc_diffie_hellman_kea:
  28567. {
  28568. #ifdef HAVE_ECC
  28569. ecc_key* private_key = ssl->eccTempKey;
  28570. /* handle static private key */
  28571. if (ssl->specs.static_ecdh &&
  28572. ssl->ecdhCurveOID != ECC_X25519_OID &&
  28573. ssl->ecdhCurveOID != ECC_X448_OID) {
  28574. word16 keySz;
  28575. ssl->buffers.keyType = ecc_dsa_sa_algo;
  28576. ret = DecodePrivateKey(ssl, &keySz);
  28577. if (ret != 0) {
  28578. goto exit_dcke;
  28579. }
  28580. private_key = (ecc_key*)ssl->hsKey;
  28581. }
  28582. #endif
  28583. /* import peer ECC key */
  28584. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  28585. #ifdef WOLFSSL_EXTRA_ALERTS
  28586. SendAlert(ssl, alert_fatal, decode_error);
  28587. #endif
  28588. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28589. }
  28590. args->length = input[args->idx++];
  28591. if ((args->idx - args->begin) + args->length > size) {
  28592. #ifdef WOLFSSL_EXTRA_ALERTS
  28593. SendAlert(ssl, alert_fatal, decode_error);
  28594. #endif
  28595. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28596. }
  28597. #ifdef HAVE_CURVE25519
  28598. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  28599. #ifdef HAVE_PK_CALLBACKS
  28600. /* if callback then use it for shared secret */
  28601. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  28602. break;
  28603. }
  28604. #endif
  28605. if (ssl->peerX25519Key == NULL) {
  28606. /* alloc/init on demand */
  28607. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  28608. (void**)&ssl->peerX25519Key);
  28609. if (ret != 0) {
  28610. goto exit_dcke;
  28611. }
  28612. } else if (ssl->peerX25519KeyPresent) {
  28613. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  28614. ssl->peerX25519Key);
  28615. ssl->peerX25519KeyPresent = 0;
  28616. if (ret != 0) {
  28617. goto exit_dcke;
  28618. }
  28619. }
  28620. if ((ret = wc_curve25519_check_public(
  28621. input + args->idx, args->length,
  28622. EC25519_LITTLE_ENDIAN)) != 0) {
  28623. #ifdef WOLFSSL_EXTRA_ALERTS
  28624. if (ret == BUFFER_E)
  28625. SendAlert(ssl, alert_fatal, decode_error);
  28626. else if (ret == ECC_OUT_OF_RANGE_E)
  28627. SendAlert(ssl, alert_fatal, bad_record_mac);
  28628. else {
  28629. SendAlert(ssl, alert_fatal,
  28630. illegal_parameter);
  28631. }
  28632. #endif
  28633. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  28634. }
  28635. if (wc_curve25519_import_public_ex(
  28636. input + args->idx, args->length,
  28637. ssl->peerX25519Key,
  28638. EC25519_LITTLE_ENDIAN)) {
  28639. #ifdef WOLFSSL_EXTRA_ALERTS
  28640. SendAlert(ssl, alert_fatal, illegal_parameter);
  28641. #endif
  28642. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  28643. }
  28644. ssl->arrays->preMasterSz = CURVE25519_KEYSIZE;
  28645. ssl->peerX25519KeyPresent = 1;
  28646. break;
  28647. }
  28648. #endif
  28649. #ifdef HAVE_CURVE448
  28650. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  28651. #ifdef HAVE_PK_CALLBACKS
  28652. /* if callback then use it for shared secret */
  28653. if (ssl->ctx->X448SharedSecretCb != NULL) {
  28654. break;
  28655. }
  28656. #endif
  28657. if (ssl->peerX448Key == NULL) {
  28658. /* alloc/init on demand */
  28659. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  28660. (void**)&ssl->peerX448Key);
  28661. if (ret != 0) {
  28662. goto exit_dcke;
  28663. }
  28664. } else if (ssl->peerX448KeyPresent) {
  28665. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  28666. ssl->peerX448Key);
  28667. ssl->peerX448KeyPresent = 0;
  28668. if (ret != 0) {
  28669. goto exit_dcke;
  28670. }
  28671. }
  28672. if ((ret = wc_curve448_check_public(
  28673. input + args->idx, args->length,
  28674. EC448_LITTLE_ENDIAN)) != 0) {
  28675. #ifdef WOLFSSL_EXTRA_ALERTS
  28676. if (ret == BUFFER_E)
  28677. SendAlert(ssl, alert_fatal, decode_error);
  28678. else if (ret == ECC_OUT_OF_RANGE_E)
  28679. SendAlert(ssl, alert_fatal, bad_record_mac);
  28680. else {
  28681. SendAlert(ssl, alert_fatal,
  28682. illegal_parameter);
  28683. }
  28684. #endif
  28685. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  28686. }
  28687. if (wc_curve448_import_public_ex(
  28688. input + args->idx, args->length,
  28689. ssl->peerX448Key,
  28690. EC448_LITTLE_ENDIAN)) {
  28691. #ifdef WOLFSSL_EXTRA_ALERTS
  28692. SendAlert(ssl, alert_fatal, illegal_parameter);
  28693. #endif
  28694. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  28695. }
  28696. ssl->arrays->preMasterSz = CURVE448_KEY_SIZE;
  28697. ssl->peerX448KeyPresent = 1;
  28698. break;
  28699. }
  28700. #endif
  28701. #ifdef HAVE_ECC
  28702. #ifdef HAVE_PK_CALLBACKS
  28703. /* if callback then use it for shared secret */
  28704. if (ssl->ctx->EccSharedSecretCb != NULL) {
  28705. break;
  28706. }
  28707. #endif
  28708. if (!ssl->specs.static_ecdh &&
  28709. ssl->eccTempKeyPresent == 0) {
  28710. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  28711. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  28712. }
  28713. if (ssl->peerEccKey == NULL) {
  28714. /* alloc/init on demand */
  28715. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  28716. (void**)&ssl->peerEccKey);
  28717. if (ret != 0) {
  28718. goto exit_dcke;
  28719. }
  28720. } else if (ssl->peerEccKeyPresent) {
  28721. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  28722. ssl->peerEccKey);
  28723. ssl->peerEccKeyPresent = 0;
  28724. if (ret != 0) {
  28725. goto exit_dcke;
  28726. }
  28727. }
  28728. if (wc_ecc_import_x963_ex(input + args->idx,
  28729. args->length, ssl->peerEccKey,
  28730. private_key->dp->id)) {
  28731. #ifdef WOLFSSL_EXTRA_ALERTS
  28732. SendAlert(ssl, alert_fatal, illegal_parameter);
  28733. #endif
  28734. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  28735. }
  28736. ssl->arrays->preMasterSz = private_key->dp->size;
  28737. ssl->peerEccKeyPresent = 1;
  28738. #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
  28739. /* client_hello may have sent FFEDH2048, which sets namedGroup,
  28740. but that is not being used, so clear it */
  28741. /* resolves issue with server side wolfSSL_get_curve_name */
  28742. ssl->namedGroup = 0;
  28743. #endif
  28744. #endif /* HAVE_ECC */
  28745. break;
  28746. }
  28747. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  28748. #ifndef NO_DH
  28749. case diffie_hellman_kea:
  28750. {
  28751. word16 clientPubSz;
  28752. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  28753. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28754. }
  28755. ato16(input + args->idx, &clientPubSz);
  28756. args->idx += OPAQUE16_LEN;
  28757. if ((args->idx - args->begin) + clientPubSz > size) {
  28758. #ifdef WOLFSSL_EXTRA_ALERTS
  28759. SendAlert(ssl, alert_fatal, decode_error);
  28760. #endif
  28761. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28762. }
  28763. args->sigSz = clientPubSz;
  28764. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  28765. (void**)&ssl->buffers.serverDH_Key);
  28766. if (ret != 0) {
  28767. goto exit_dcke;
  28768. }
  28769. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  28770. ssl->buffers.serverDH_P.buffer,
  28771. ssl->buffers.serverDH_P.length,
  28772. ssl->buffers.serverDH_G.buffer,
  28773. ssl->buffers.serverDH_G.length);
  28774. /* set the max agree result size */
  28775. ssl->arrays->preMasterSz = ENCRYPT_LEN;
  28776. break;
  28777. }
  28778. #endif /* !NO_DH */
  28779. #if !defined(NO_DH) && !defined(NO_PSK)
  28780. case dhe_psk_kea:
  28781. {
  28782. word16 clientSz;
  28783. /* Read in the PSK hint */
  28784. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  28785. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28786. }
  28787. ato16(input + args->idx, &clientSz);
  28788. args->idx += OPAQUE16_LEN;
  28789. if (clientSz > MAX_PSK_ID_LEN) {
  28790. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  28791. }
  28792. if ((args->idx - args->begin) + clientSz > size) {
  28793. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28794. }
  28795. XMEMCPY(ssl->arrays->client_identity, input + args->idx,
  28796. clientSz);
  28797. args->idx += clientSz;
  28798. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  28799. /* Read in the DHE business */
  28800. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  28801. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28802. }
  28803. ato16(input + args->idx, &clientSz);
  28804. args->idx += OPAQUE16_LEN;
  28805. if ((args->idx - args->begin) + clientSz > size) {
  28806. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28807. }
  28808. args->sigSz = clientSz;
  28809. ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
  28810. (void**)&ssl->buffers.serverDH_Key);
  28811. if (ret != 0) {
  28812. goto exit_dcke;
  28813. }
  28814. ret = wc_DhSetKey(ssl->buffers.serverDH_Key,
  28815. ssl->buffers.serverDH_P.buffer,
  28816. ssl->buffers.serverDH_P.length,
  28817. ssl->buffers.serverDH_G.buffer,
  28818. ssl->buffers.serverDH_G.length);
  28819. break;
  28820. }
  28821. #endif /* !NO_DH && !NO_PSK */
  28822. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  28823. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  28824. case ecdhe_psk_kea:
  28825. {
  28826. word16 clientSz;
  28827. /* Read in the PSK hint */
  28828. if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
  28829. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28830. }
  28831. ato16(input + args->idx, &clientSz);
  28832. args->idx += OPAQUE16_LEN;
  28833. if (clientSz > MAX_PSK_ID_LEN) {
  28834. ERROR_OUT(CLIENT_ID_ERROR, exit_dcke);
  28835. }
  28836. if ((args->idx - args->begin) + clientSz > size) {
  28837. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28838. }
  28839. XMEMCPY(ssl->arrays->client_identity,
  28840. input + args->idx, clientSz);
  28841. args->idx += clientSz;
  28842. ssl->arrays->client_identity[clientSz] = '\0'; /* null term */
  28843. /* import peer ECC key */
  28844. if ((args->idx - args->begin) + OPAQUE8_LEN > size) {
  28845. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28846. }
  28847. args->length = input[args->idx++];
  28848. if ((args->idx - args->begin) + args->length > size) {
  28849. ERROR_OUT(BUFFER_ERROR, exit_dcke);
  28850. }
  28851. args->sigSz = ENCRYPT_LEN - OPAQUE16_LEN;
  28852. #ifdef HAVE_CURVE25519
  28853. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  28854. #ifdef HAVE_PK_CALLBACKS
  28855. /* if callback then use it for shared secret */
  28856. if (ssl->ctx->X25519SharedSecretCb != NULL) {
  28857. break;
  28858. }
  28859. #endif
  28860. if (ssl->eccTempKeyPresent == 0) {
  28861. WOLFSSL_MSG(
  28862. "X25519 ephemeral key not made correctly");
  28863. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  28864. }
  28865. if (ssl->peerX25519Key == NULL) {
  28866. /* alloc/init on demand */
  28867. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE25519,
  28868. (void**)&ssl->peerX25519Key);
  28869. if (ret != 0) {
  28870. goto exit_dcke;
  28871. }
  28872. } else if (ssl->peerX25519KeyPresent) {
  28873. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE25519,
  28874. ssl->peerX25519Key);
  28875. ssl->peerX25519KeyPresent = 0;
  28876. if (ret != 0) {
  28877. goto exit_dcke;
  28878. }
  28879. }
  28880. if ((ret = wc_curve25519_check_public(
  28881. input + args->idx, args->length,
  28882. EC25519_LITTLE_ENDIAN)) != 0) {
  28883. #ifdef WOLFSSL_EXTRA_ALERTS
  28884. if (ret == BUFFER_E)
  28885. SendAlert(ssl, alert_fatal, decode_error);
  28886. else if (ret == ECC_OUT_OF_RANGE_E)
  28887. SendAlert(ssl, alert_fatal, bad_record_mac);
  28888. else {
  28889. SendAlert(ssl, alert_fatal,
  28890. illegal_parameter);
  28891. }
  28892. #endif
  28893. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  28894. }
  28895. if (wc_curve25519_import_public_ex(
  28896. input + args->idx, args->length,
  28897. ssl->peerX25519Key,
  28898. EC25519_LITTLE_ENDIAN)) {
  28899. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  28900. }
  28901. ssl->peerX25519KeyPresent = 1;
  28902. break;
  28903. }
  28904. #endif
  28905. #ifdef HAVE_CURVE448
  28906. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  28907. #ifdef HAVE_PK_CALLBACKS
  28908. /* if callback then use it for shared secret */
  28909. if (ssl->ctx->X448SharedSecretCb != NULL) {
  28910. break;
  28911. }
  28912. #endif
  28913. if (ssl->eccTempKeyPresent == 0) {
  28914. WOLFSSL_MSG(
  28915. "X448 ephemeral key not made correctly");
  28916. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  28917. }
  28918. if (ssl->peerX448Key == NULL) {
  28919. /* alloc/init on demand */
  28920. ret = AllocKey(ssl, DYNAMIC_TYPE_CURVE448,
  28921. (void**)&ssl->peerX448Key);
  28922. if (ret != 0) {
  28923. goto exit_dcke;
  28924. }
  28925. } else if (ssl->peerX448KeyPresent) {
  28926. ret = ReuseKey(ssl, DYNAMIC_TYPE_CURVE448,
  28927. ssl->peerX448Key);
  28928. ssl->peerX448KeyPresent = 0;
  28929. if (ret != 0) {
  28930. goto exit_dcke;
  28931. }
  28932. }
  28933. if ((ret = wc_curve448_check_public(
  28934. input + args->idx, args->length,
  28935. EC448_LITTLE_ENDIAN)) != 0) {
  28936. #ifdef WOLFSSL_EXTRA_ALERTS
  28937. if (ret == BUFFER_E)
  28938. SendAlert(ssl, alert_fatal, decode_error);
  28939. else if (ret == ECC_OUT_OF_RANGE_E)
  28940. SendAlert(ssl, alert_fatal, bad_record_mac);
  28941. else {
  28942. SendAlert(ssl, alert_fatal,
  28943. illegal_parameter);
  28944. }
  28945. #endif
  28946. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  28947. }
  28948. if (wc_curve448_import_public_ex(
  28949. input + args->idx, args->length,
  28950. ssl->peerX448Key,
  28951. EC448_LITTLE_ENDIAN)) {
  28952. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  28953. }
  28954. ssl->peerX448KeyPresent = 1;
  28955. break;
  28956. }
  28957. #endif
  28958. #ifdef HAVE_PK_CALLBACKS
  28959. /* if callback then use it for shared secret */
  28960. if (ssl->ctx->EccSharedSecretCb != NULL) {
  28961. break;
  28962. }
  28963. #endif
  28964. if (ssl->eccTempKeyPresent == 0) {
  28965. WOLFSSL_MSG("Ecc ephemeral key not made correctly");
  28966. ERROR_OUT(ECC_MAKEKEY_ERROR, exit_dcke);
  28967. }
  28968. if (ssl->peerEccKey == NULL) {
  28969. /* alloc/init on demand */
  28970. ret = AllocKey(ssl, DYNAMIC_TYPE_ECC,
  28971. (void**)&ssl->peerEccKey);
  28972. if (ret != 0) {
  28973. goto exit_dcke;
  28974. }
  28975. }
  28976. else if (ssl->peerEccKeyPresent) {
  28977. ret = ReuseKey(ssl, DYNAMIC_TYPE_ECC,
  28978. ssl->peerEccKey);
  28979. ssl->peerEccKeyPresent = 0;
  28980. if (ret != 0) {
  28981. goto exit_dcke;
  28982. }
  28983. }
  28984. if (wc_ecc_import_x963_ex(input + args->idx,
  28985. args->length, ssl->peerEccKey,
  28986. ssl->eccTempKey->dp->id)) {
  28987. ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke);
  28988. }
  28989. ssl->peerEccKeyPresent = 1;
  28990. break;
  28991. }
  28992. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  28993. default:
  28994. ret = BAD_KEA_TYPE_E;
  28995. } /* switch (ssl->specs.kea) */
  28996. /* Check for error */
  28997. if (ret != 0) {
  28998. goto exit_dcke;
  28999. }
  29000. /* Advance state and proceed */
  29001. ssl->options.asyncState = TLS_ASYNC_DO;
  29002. } /* TLS_ASYNC_BUILD */
  29003. FALL_THROUGH;
  29004. case TLS_ASYNC_DO:
  29005. {
  29006. switch (ssl->specs.kea) {
  29007. #ifndef NO_RSA
  29008. case rsa_kea:
  29009. {
  29010. RsaKey* key = (RsaKey*)ssl->hsKey;
  29011. ret = RsaDec(ssl,
  29012. input + args->idx,
  29013. args->length,
  29014. &args->output,
  29015. &args->sigSz,
  29016. key,
  29017. #ifdef HAVE_PK_CALLBACKS
  29018. ssl->buffers.key
  29019. #else
  29020. NULL
  29021. #endif
  29022. );
  29023. /* Errors that can occur here that should be
  29024. * indistinguishable:
  29025. * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR
  29026. */
  29027. #ifdef WOLFSSL_ASYNC_CRYPT
  29028. if (ret == WC_PENDING_E)
  29029. goto exit_dcke;
  29030. #endif
  29031. if (ret == BAD_FUNC_ARG)
  29032. goto exit_dcke;
  29033. args->lastErr = ret - (SECRET_LEN - args->sigSz);
  29034. ret = 0;
  29035. break;
  29036. } /* rsa_kea */
  29037. #endif /* !NO_RSA */
  29038. #ifndef NO_PSK
  29039. case psk_kea:
  29040. {
  29041. break;
  29042. }
  29043. #endif /* !NO_PSK */
  29044. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  29045. defined(HAVE_CURVE448)
  29046. case ecc_diffie_hellman_kea:
  29047. {
  29048. void* private_key = ssl->eccTempKey;
  29049. (void)private_key;
  29050. #ifdef HAVE_CURVE25519
  29051. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  29052. ret = X25519SharedSecret(ssl,
  29053. (curve25519_key*)private_key,
  29054. ssl->peerX25519Key,
  29055. input + args->idx, &args->length,
  29056. ssl->arrays->preMasterSecret,
  29057. &ssl->arrays->preMasterSz,
  29058. WOLFSSL_SERVER_END
  29059. );
  29060. break;
  29061. }
  29062. #endif
  29063. #ifdef HAVE_CURVE448
  29064. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  29065. ret = X448SharedSecret(ssl,
  29066. (curve448_key*)private_key,
  29067. ssl->peerX448Key,
  29068. input + args->idx, &args->length,
  29069. ssl->arrays->preMasterSecret,
  29070. &ssl->arrays->preMasterSz,
  29071. WOLFSSL_SERVER_END
  29072. );
  29073. break;
  29074. }
  29075. #endif
  29076. #ifdef HAVE_ECC
  29077. if (ssl->specs.static_ecdh) {
  29078. private_key = ssl->hsKey;
  29079. }
  29080. /* Generate shared secret */
  29081. ret = EccSharedSecret(ssl,
  29082. (ecc_key*)private_key, ssl->peerEccKey,
  29083. input + args->idx, &args->length,
  29084. ssl->arrays->preMasterSecret,
  29085. &ssl->arrays->preMasterSz,
  29086. WOLFSSL_SERVER_END
  29087. );
  29088. #ifdef WOLFSSL_ASYNC_CRYPT
  29089. if (ret != WC_PENDING_E)
  29090. #endif
  29091. {
  29092. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  29093. (void**)&ssl->peerEccKey);
  29094. ssl->peerEccKeyPresent = 0;
  29095. }
  29096. #endif
  29097. break;
  29098. }
  29099. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  29100. #ifndef NO_DH
  29101. case diffie_hellman_kea:
  29102. {
  29103. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  29104. ssl->buffers.serverDH_Priv.buffer,
  29105. ssl->buffers.serverDH_Priv.length,
  29106. input + args->idx,
  29107. (word16)args->sigSz,
  29108. ssl->arrays->preMasterSecret,
  29109. &ssl->arrays->preMasterSz,
  29110. ssl->buffers.serverDH_P.buffer,
  29111. ssl->buffers.serverDH_P.length);
  29112. break;
  29113. }
  29114. #endif /* !NO_DH */
  29115. #if !defined(NO_DH) && !defined(NO_PSK)
  29116. case dhe_psk_kea:
  29117. {
  29118. ret = DhAgree(ssl, ssl->buffers.serverDH_Key,
  29119. ssl->buffers.serverDH_Priv.buffer,
  29120. ssl->buffers.serverDH_Priv.length,
  29121. input + args->idx,
  29122. (word16)args->sigSz,
  29123. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  29124. &ssl->arrays->preMasterSz,
  29125. ssl->buffers.serverDH_P.buffer,
  29126. ssl->buffers.serverDH_P.length);
  29127. break;
  29128. }
  29129. #endif /* !NO_DH && !NO_PSK */
  29130. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  29131. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  29132. case ecdhe_psk_kea:
  29133. {
  29134. #ifdef HAVE_CURVE25519
  29135. if (ssl->ecdhCurveOID == ECC_X25519_OID) {
  29136. ret = X25519SharedSecret(ssl,
  29137. (curve25519_key*)ssl->eccTempKey,
  29138. ssl->peerX25519Key,
  29139. input + args->idx, &args->length,
  29140. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  29141. &args->sigSz,
  29142. WOLFSSL_SERVER_END
  29143. );
  29144. #ifdef WOLFSSL_ASYNC_CRYPT
  29145. if (ret != WC_PENDING_E)
  29146. #endif
  29147. {
  29148. FreeKey(ssl, DYNAMIC_TYPE_CURVE25519,
  29149. (void**)&ssl->peerX25519Key);
  29150. ssl->peerX25519KeyPresent = 0;
  29151. }
  29152. break;
  29153. }
  29154. #endif
  29155. #ifdef HAVE_CURVE448
  29156. if (ssl->ecdhCurveOID == ECC_X448_OID) {
  29157. ret = X448SharedSecret(ssl,
  29158. (curve448_key*)ssl->eccTempKey,
  29159. ssl->peerX448Key,
  29160. input + args->idx, &args->length,
  29161. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  29162. &args->sigSz,
  29163. WOLFSSL_SERVER_END
  29164. );
  29165. #ifdef WOLFSSL_ASYNC_CRYPT
  29166. if (ret != WC_PENDING_E)
  29167. #endif
  29168. {
  29169. FreeKey(ssl, DYNAMIC_TYPE_CURVE448,
  29170. (void**)&ssl->peerX448Key);
  29171. ssl->peerX448KeyPresent = 0;
  29172. }
  29173. break;
  29174. }
  29175. #endif
  29176. /* Generate shared secret */
  29177. ret = EccSharedSecret(ssl,
  29178. ssl->eccTempKey, ssl->peerEccKey,
  29179. input + args->idx, &args->length,
  29180. ssl->arrays->preMasterSecret + OPAQUE16_LEN,
  29181. &args->sigSz,
  29182. WOLFSSL_SERVER_END
  29183. );
  29184. if (!ssl->specs.static_ecdh
  29185. #ifdef WOLFSSL_ASYNC_CRYPT
  29186. && ret != WC_PENDING_E
  29187. #endif
  29188. ) {
  29189. FreeKey(ssl, DYNAMIC_TYPE_ECC,
  29190. (void**)&ssl->peerEccKey);
  29191. ssl->peerEccKeyPresent = 0;
  29192. }
  29193. break;
  29194. }
  29195. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  29196. default:
  29197. ret = BAD_KEA_TYPE_E;
  29198. } /* switch (ssl->specs.kea) */
  29199. /* Check for error */
  29200. if (ret != 0) {
  29201. goto exit_dcke;
  29202. }
  29203. /* Advance state and proceed */
  29204. ssl->options.asyncState = TLS_ASYNC_VERIFY;
  29205. } /* TLS_ASYNC_DO */
  29206. FALL_THROUGH;
  29207. case TLS_ASYNC_VERIFY:
  29208. {
  29209. switch (ssl->specs.kea) {
  29210. #ifndef NO_RSA
  29211. case rsa_kea:
  29212. {
  29213. byte mask;
  29214. int i;
  29215. /* Add the signature length to idx */
  29216. args->idx += args->length;
  29217. #ifdef DEBUG_WOLFSSL
  29218. /* check version (debug warning message only) */
  29219. if (args->output != NULL) {
  29220. if (args->output[0] != ssl->chVersion.major ||
  29221. args->output[1] != ssl->chVersion.minor) {
  29222. WOLFSSL_MSG("preMasterSecret version mismatch");
  29223. }
  29224. }
  29225. #endif
  29226. /* RFC5246 7.4.7.1:
  29227. * Treat incorrectly formatted message blocks and/or
  29228. * mismatched version numbers in a manner
  29229. * indistinguishable from correctly formatted RSA blocks
  29230. */
  29231. ret = args->lastErr;
  29232. args->lastErr = 0; /* reset */
  29233. /* On error 'ret' will be negative - top bit set */
  29234. mask = ((unsigned int)ret >>
  29235. ((sizeof(ret) * 8) - 1)) - 1;
  29236. /* build PreMasterSecret */
  29237. ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
  29238. ssl->arrays->preMasterSecret[1] = ssl->chVersion.minor;
  29239. if (args->output != NULL) {
  29240. /* Use random secret on error */
  29241. for (i = VERSION_SZ; i < SECRET_LEN; i++) {
  29242. ssl->arrays->preMasterSecret[i] =
  29243. ctMaskSel(mask, args->output[i],
  29244. ssl->arrays->preMasterSecret[i]);
  29245. }
  29246. }
  29247. /* preMasterSecret has RNG and version set
  29248. * return proper length and ignore error
  29249. * error will be caught as decryption error
  29250. */
  29251. args->sigSz = SECRET_LEN;
  29252. ret = 0;
  29253. break;
  29254. } /* rsa_kea */
  29255. #endif /* !NO_RSA */
  29256. #ifndef NO_PSK
  29257. case psk_kea:
  29258. {
  29259. break;
  29260. }
  29261. #endif /* !NO_PSK */
  29262. #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  29263. defined(HAVE_CURVE448)
  29264. case ecc_diffie_hellman_kea:
  29265. {
  29266. /* skip past the imported peer key */
  29267. args->idx += args->length;
  29268. break;
  29269. }
  29270. #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
  29271. #ifndef NO_DH
  29272. case diffie_hellman_kea:
  29273. {
  29274. args->idx += (word16)args->sigSz;
  29275. break;
  29276. }
  29277. #endif /* !NO_DH */
  29278. #if !defined(NO_DH) && !defined(NO_PSK)
  29279. case dhe_psk_kea:
  29280. {
  29281. byte* pms = ssl->arrays->preMasterSecret;
  29282. word16 clientSz = (word16)args->sigSz;
  29283. args->idx += clientSz;
  29284. c16toa((word16)ssl->arrays->preMasterSz, pms);
  29285. ssl->arrays->preMasterSz += OPAQUE16_LEN;
  29286. pms += ssl->arrays->preMasterSz;
  29287. /* Use the PSK hint to look up the PSK and add it to the
  29288. * preMasterSecret here. */
  29289. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  29290. ssl->arrays->client_identity, ssl->arrays->psk_key,
  29291. MAX_PSK_KEY_LEN);
  29292. if (ssl->arrays->psk_keySz == 0 ||
  29293. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  29294. #if defined(WOLFSSL_EXTRA_ALERTS) || \
  29295. defined(WOLFSSL_PSK_IDENTITY_ALERT)
  29296. SendAlert(ssl, alert_fatal,
  29297. unknown_psk_identity);
  29298. #endif
  29299. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  29300. }
  29301. /* SERVER: Pre-shared Key for peer authentication. */
  29302. ssl->options.peerAuthGood = 1;
  29303. c16toa((word16) ssl->arrays->psk_keySz, pms);
  29304. pms += OPAQUE16_LEN;
  29305. XMEMCPY(pms, ssl->arrays->psk_key,
  29306. ssl->arrays->psk_keySz);
  29307. ssl->arrays->preMasterSz += ssl->arrays->psk_keySz +
  29308. OPAQUE16_LEN;
  29309. break;
  29310. }
  29311. #endif /* !NO_DH && !NO_PSK */
  29312. #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
  29313. defined(HAVE_CURVE448)) && !defined(NO_PSK)
  29314. case ecdhe_psk_kea:
  29315. {
  29316. byte* pms = ssl->arrays->preMasterSecret;
  29317. word16 clientSz = (word16)args->sigSz;
  29318. /* skip past the imported peer key */
  29319. args->idx += args->length;
  29320. /* Add preMasterSecret */
  29321. c16toa(clientSz, pms);
  29322. ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
  29323. pms += ssl->arrays->preMasterSz;
  29324. /* Use the PSK hint to look up the PSK and add it to the
  29325. * preMasterSecret here. */
  29326. ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
  29327. ssl->arrays->client_identity, ssl->arrays->psk_key,
  29328. MAX_PSK_KEY_LEN);
  29329. if (ssl->arrays->psk_keySz == 0 ||
  29330. ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
  29331. ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
  29332. }
  29333. /* SERVER: Pre-shared Key for peer authentication. */
  29334. ssl->options.peerAuthGood = 1;
  29335. c16toa((word16) ssl->arrays->psk_keySz, pms);
  29336. pms += OPAQUE16_LEN;
  29337. XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
  29338. ssl->arrays->preMasterSz +=
  29339. ssl->arrays->psk_keySz + OPAQUE16_LEN;
  29340. break;
  29341. }
  29342. #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
  29343. default:
  29344. ret = BAD_KEA_TYPE_E;
  29345. } /* switch (ssl->specs.kea) */
  29346. /* Check for error */
  29347. if (ret != 0) {
  29348. goto exit_dcke;
  29349. }
  29350. /* Advance state and proceed */
  29351. ssl->options.asyncState = TLS_ASYNC_FINALIZE;
  29352. } /* TLS_ASYNC_VERIFY */
  29353. FALL_THROUGH;
  29354. case TLS_ASYNC_FINALIZE:
  29355. {
  29356. if (IsEncryptionOn(ssl, 0)) {
  29357. args->idx += ssl->keys.padSz;
  29358. #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
  29359. if (ssl->options.startedETMRead)
  29360. args->idx += MacSize(ssl);
  29361. #endif
  29362. }
  29363. ret = MakeMasterSecret(ssl);
  29364. /* Check for error */
  29365. if (ret != 0) {
  29366. goto exit_dcke;
  29367. }
  29368. /* Advance state and proceed */
  29369. ssl->options.asyncState = TLS_ASYNC_END;
  29370. } /* TLS_ASYNC_FINALIZE */
  29371. FALL_THROUGH;
  29372. case TLS_ASYNC_END:
  29373. {
  29374. /* Set final index */
  29375. *inOutIdx = args->idx;
  29376. ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
  29377. #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
  29378. if (ssl->options.verifyPeer) {
  29379. ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
  29380. }
  29381. #endif
  29382. break;
  29383. } /* TLS_ASYNC_END */
  29384. default:
  29385. ret = INPUT_CASE_ERROR;
  29386. } /* switch(ssl->options.asyncState) */
  29387. exit_dcke:
  29388. WOLFSSL_LEAVE("DoClientKeyExchange", ret);
  29389. WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO);
  29390. #ifdef WOLFSSL_ASYNC_CRYPT
  29391. /* Handle async operation */
  29392. if (ret == WC_PENDING_E) {
  29393. /* Mark message as not received so it can process again */
  29394. ssl->msgsReceived.got_client_key_exchange = 0;
  29395. return ret;
  29396. }
  29397. /* Cleanup async */
  29398. FreeAsyncCtx(ssl, 0);
  29399. #else
  29400. FreeDckeArgs(ssl, args);
  29401. #endif /* WOLFSSL_ASYNC_CRYPT */
  29402. #ifdef OPENSSL_ALL
  29403. /* add error ret value to error queue */
  29404. if (ret != 0) {
  29405. WOLFSSL_ERROR(ret);
  29406. }
  29407. #endif
  29408. /* Cleanup PMS */
  29409. if (ssl->arrays->preMasterSecret != NULL) {
  29410. ForceZero(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
  29411. }
  29412. ssl->arrays->preMasterSz = 0;
  29413. /* Final cleanup */
  29414. FreeKeyExchange(ssl);
  29415. return ret;
  29416. }
  29417. #endif /* !WOLFSSL_NO_TLS12 */
  29418. #ifdef HAVE_SNI
  29419. int SNI_Callback(WOLFSSL* ssl)
  29420. {
  29421. int ad = 0;
  29422. int sniRet = 0;
  29423. /* Stunnel supports a custom sni callback to switch an SSL's ctx
  29424. * when SNI is received. Call it now if exists */
  29425. if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) {
  29426. WOLFSSL_MSG("Calling custom sni callback");
  29427. sniRet = ssl->ctx->sniRecvCb(ssl, &ad, ssl->ctx->sniRecvCbArg);
  29428. switch (sniRet) {
  29429. case warning_return:
  29430. WOLFSSL_MSG("Error in custom sni callback. Warning alert");
  29431. SendAlert(ssl, alert_warning, ad);
  29432. break;
  29433. case fatal_return:
  29434. WOLFSSL_MSG("Error in custom sni callback. Fatal alert");
  29435. SendAlert(ssl, alert_fatal, ad);
  29436. return FATAL_ERROR;
  29437. case noack_return:
  29438. WOLFSSL_MSG("Server quietly not acking servername.");
  29439. break;
  29440. default:
  29441. break;
  29442. }
  29443. }
  29444. return 0;
  29445. }
  29446. #endif /* HAVE_SNI */
  29447. #endif /* NO_WOLFSSL_SERVER */
  29448. #ifdef WOLFSSL_ASYNC_CRYPT
  29449. int wolfSSL_AsyncPop(WOLFSSL* ssl, byte* state)
  29450. {
  29451. int ret = 0;
  29452. WC_ASYNC_DEV* asyncDev;
  29453. WOLF_EVENT* event;
  29454. if (ssl == NULL) {
  29455. return BAD_FUNC_ARG;
  29456. }
  29457. /* check for pending async */
  29458. asyncDev = ssl->asyncDev;
  29459. if (asyncDev) {
  29460. /* grab event pointer */
  29461. event = &asyncDev->event;
  29462. ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL);
  29463. if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) {
  29464. /* advance key share state if doesn't need called again */
  29465. if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) {
  29466. (*state)++;
  29467. }
  29468. /* clear event */
  29469. XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT));
  29470. /* clear async dev */
  29471. ssl->asyncDev = NULL;
  29472. }
  29473. }
  29474. else {
  29475. ret = WC_NOT_PENDING_E;
  29476. }
  29477. WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret);
  29478. return ret;
  29479. }
  29480. int wolfSSL_AsyncInit(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev, word32 flags)
  29481. {
  29482. int ret;
  29483. WOLF_EVENT* event;
  29484. if (ssl == NULL || asyncDev == NULL) {
  29485. return BAD_FUNC_ARG;
  29486. }
  29487. /* grab event pointer */
  29488. event = &asyncDev->event;
  29489. /* init event */
  29490. ret = wolfAsync_EventInit(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL, ssl, flags);
  29491. WOLFSSL_LEAVE("wolfSSL_AsyncInit", ret);
  29492. return ret;
  29493. }
  29494. int wolfSSL_AsyncPush(WOLFSSL* ssl, WC_ASYNC_DEV* asyncDev)
  29495. {
  29496. int ret;
  29497. WOLF_EVENT* event;
  29498. if (ssl == NULL || asyncDev == NULL) {
  29499. return BAD_FUNC_ARG;
  29500. }
  29501. /* grab event pointer */
  29502. event = &asyncDev->event;
  29503. /* store reference to active async operation */
  29504. ssl->asyncDev = asyncDev;
  29505. /* place event into queue */
  29506. ret = wolfAsync_EventQueuePush(&ssl->ctx->event_queue, event);
  29507. /* success means return WC_PENDING_E */
  29508. if (ret == 0) {
  29509. ret = WC_PENDING_E;
  29510. }
  29511. WOLFSSL_LEAVE("wolfSSL_AsyncPush", ret);
  29512. return ret;
  29513. }
  29514. #endif /* WOLFSSL_ASYNC_CRYPT */
  29515. /**
  29516. * Return the max fragment size. This is essentially the maximum
  29517. * fragment_length available.
  29518. * @param ssl WOLFSSL object containing ciphersuite information.
  29519. * @param maxFragment The amount of space we want to check is available. This
  29520. * is only the fragment length WITHOUT the (D)TLS headers.
  29521. * @return Max fragment size
  29522. */
  29523. int wolfSSL_GetMaxFragSize(WOLFSSL* ssl, int maxFragment)
  29524. {
  29525. (void) ssl; /* Avoid compiler warnings */
  29526. if (maxFragment > MAX_RECORD_SIZE) {
  29527. maxFragment = MAX_RECORD_SIZE;
  29528. }
  29529. #ifdef HAVE_MAX_FRAGMENT
  29530. if ((ssl->max_fragment != 0) && ((word16)maxFragment > ssl->max_fragment)) {
  29531. maxFragment = ssl->max_fragment;
  29532. }
  29533. #endif /* HAVE_MAX_FRAGMENT */
  29534. #ifdef WOLFSSL_DTLS
  29535. if (IsDtlsNotSctpMode(ssl)) {
  29536. int outputSz, mtuSz;
  29537. /* Given a input buffer size of maxFragment, how big will the
  29538. * encrypted output be? */
  29539. if (IsEncryptionOn(ssl, 1)) {
  29540. outputSz = BuildMessage(ssl, NULL, 0, NULL,
  29541. maxFragment + DTLS_HANDSHAKE_HEADER_SZ,
  29542. application_data, 0, 1, 0, CUR_ORDER);
  29543. }
  29544. else {
  29545. outputSz = maxFragment + DTLS_RECORD_HEADER_SZ +
  29546. DTLS_HANDSHAKE_HEADER_SZ;
  29547. }
  29548. /* Readjust maxFragment for MTU size. */
  29549. #if defined(WOLFSSL_DTLS_MTU)
  29550. mtuSz = ssl->dtlsMtuSz;
  29551. #else
  29552. mtuSz = MAX_MTU;
  29553. #endif
  29554. maxFragment = ModifyForMTU(ssl, maxFragment, outputSz, mtuSz);
  29555. }
  29556. #endif
  29557. return maxFragment;
  29558. }
  29559. #if defined(WOLFSSL_IOTSAFE) && defined(HAVE_PK_CALLBACKS)
  29560. IOTSAFE *wolfSSL_get_iotsafe_ctx(WOLFSSL *ssl)
  29561. {
  29562. if (ssl == NULL)
  29563. return NULL;
  29564. return &ssl->iotsafe;
  29565. }
  29566. int wolfSSL_set_iotsafe_ctx(WOLFSSL *ssl, IOTSAFE *iotsafe)
  29567. {
  29568. if ((ssl == NULL) || (iotsafe == NULL))
  29569. return BAD_FUNC_ARG;
  29570. XMEMCPY(&ssl->iotsafe, iotsafe, sizeof(IOTSAFE));
  29571. return 0;
  29572. }
  29573. #endif
  29574. #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
  29575. /* create an instance of WOLFSSL_BY_DIR_HASH structure */
  29576. WOLFSSL_BY_DIR_HASH* wolfSSL_BY_DIR_HASH_new(void)
  29577. {
  29578. WOLFSSL_BY_DIR_HASH* dir_hash;
  29579. WOLFSSL_ENTER("wolfSSL_BY_DIR_HASH_new");
  29580. dir_hash = (WOLFSSL_BY_DIR_HASH*)XMALLOC(sizeof(WOLFSSL_BY_DIR_HASH), NULL,
  29581. DYNAMIC_TYPE_OPENSSL);
  29582. if (dir_hash) {
  29583. XMEMSET(dir_hash, 0, sizeof(WOLFSSL_BY_DIR_HASH));
  29584. }
  29585. return dir_hash;
  29586. }
  29587. /* release a WOLFSSL_BY_DIR_HASH resource */
  29588. void wolfSSL_BY_DIR_HASH_free(WOLFSSL_BY_DIR_HASH* dir_hash)
  29589. {
  29590. if (dir_hash == NULL)
  29591. return;
  29592. XFREE(dir_hash, NULL, DYNAMIC_TYPE_OPENSSL);
  29593. }
  29594. /* create an instance of WOLFSSL_STACK for STACK_TYPE_BY_DIR_hash */
  29595. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_HASH_new_null(void)
  29596. {
  29597. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  29598. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_new_null");
  29599. if (sk) {
  29600. sk->type = STACK_TYPE_BY_DIR_hash;
  29601. }
  29602. return sk;
  29603. }
  29604. /* returns value less than 0 on fail to match
  29605. * On a successful match the priority level found is returned
  29606. */
  29607. int wolfSSL_sk_BY_DIR_HASH_find(
  29608. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk, const WOLFSSL_BY_DIR_HASH* toFind)
  29609. {
  29610. WOLFSSL_STACK* next;
  29611. int i, sz;
  29612. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_find");
  29613. if (sk == NULL || toFind == NULL) {
  29614. return WOLFSSL_FAILURE;
  29615. }
  29616. sz = wolfSSL_sk_BY_DIR_HASH_num(sk);
  29617. next = sk;
  29618. for (i = 0; i < sz && next != NULL; i++) {
  29619. if (next->data.dir_hash->hash_value == toFind->hash_value) {
  29620. return sz - i; /* reverse because stack pushed highest on first */
  29621. }
  29622. next = next->next;
  29623. }
  29624. return -1;
  29625. }
  29626. /* return a number of WOLFSSL_BY_DIR_HASH in stack */
  29627. int wolfSSL_sk_BY_DIR_HASH_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  29628. {
  29629. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_num");
  29630. if (sk == NULL)
  29631. return -1;
  29632. return (int)sk->num;
  29633. }
  29634. /* return WOLFSSL_BY_DIR_HASH instance at i */
  29635. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_value(
  29636. const WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk, int i)
  29637. {
  29638. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_value");
  29639. for (; sk != NULL && i > 0; i--)
  29640. sk = sk->next;
  29641. if (i != 0 || sk == NULL)
  29642. return NULL;
  29643. return sk->data.dir_hash;
  29644. }
  29645. /* pop WOLFSSL_BY_DIR_HASH instance, and remove its node from stack */
  29646. WOLFSSL_BY_DIR_HASH* wolfSSL_sk_BY_DIR_HASH_pop(
  29647. WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk)
  29648. {
  29649. WOLFSSL_STACK* node;
  29650. WOLFSSL_BY_DIR_HASH* hash;
  29651. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop");
  29652. if (sk == NULL) {
  29653. return NULL;
  29654. }
  29655. node = sk->next;
  29656. hash = sk->data.dir_hash;
  29657. if (node != NULL) { /* update sk and remove node from stack */
  29658. sk->data.dir_hash = node->data.dir_hash;
  29659. sk->next = node->next;
  29660. wolfSSL_sk_free_node(node);
  29661. }
  29662. else { /* last x509 in stack */
  29663. sk->data.dir_hash = NULL;
  29664. }
  29665. if (sk->num > 0) {
  29666. sk->num -= 1;
  29667. }
  29668. return hash;
  29669. }
  29670. /* release all contents in stack, and then release stack itself. */
  29671. /* Second argument is a function pointer to release resouces. */
  29672. /* It calls the function to release resouces when t is passed */
  29673. /* instead of wolfSSL_BY_DIR_HASH_free(). */
  29674. void wolfSSL_sk_BY_DIR_HASH_pop_free(WOLF_STACK_OF(BY_DIR_HASH)* sk,
  29675. void (*f) (WOLFSSL_BY_DIR_HASH*))
  29676. {
  29677. WOLFSSL_STACK* node;
  29678. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_pop_free");
  29679. if (sk == NULL) {
  29680. return;
  29681. }
  29682. /* parse through stack freeing each node */
  29683. node = sk->next;
  29684. while (node && sk->num > 1) {
  29685. WOLFSSL_STACK* tmp = node;
  29686. node = node->next;
  29687. if (f)
  29688. f(tmp->data.dir_hash);
  29689. else
  29690. wolfSSL_BY_DIR_HASH_free(tmp->data.dir_hash);
  29691. tmp->data.dir_hash = NULL;
  29692. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  29693. sk->num -= 1;
  29694. }
  29695. /* free head of stack */
  29696. if (sk->num == 1) {
  29697. if (f)
  29698. f(sk->data.dir_hash);
  29699. else
  29700. wolfSSL_BY_DIR_HASH_free(sk->data.dir_hash);
  29701. sk->data.dir_hash = NULL;
  29702. }
  29703. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  29704. }
  29705. /* release all contents in stack, and then release stack itself */
  29706. void wolfSSL_sk_BY_DIR_HASH_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH) *sk)
  29707. {
  29708. wolfSSL_sk_BY_DIR_HASH_pop_free(sk, NULL);
  29709. }
  29710. /* Adds the WOLFSSL_BY_DIR_HASH to the stack "sk". "sk" takes control of "in" and
  29711. * tries to free it when the stack is free'd.
  29712. *
  29713. * return 1 on success 0 on fail
  29714. */
  29715. int wolfSSL_sk_BY_DIR_HASH_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_HASH)* sk,
  29716. WOLFSSL_BY_DIR_HASH* in)
  29717. {
  29718. WOLFSSL_STACK* node;
  29719. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_HASH_push");
  29720. if (sk == NULL || in == NULL) {
  29721. return WOLFSSL_FAILURE;
  29722. }
  29723. /* no previous values in stack */
  29724. if (sk->data.dir_hash == NULL) {
  29725. sk->data.dir_hash = in;
  29726. sk->num += 1;
  29727. return WOLFSSL_SUCCESS;
  29728. }
  29729. /* stack already has value(s) create a new node and add more */
  29730. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  29731. DYNAMIC_TYPE_OPENSSL);
  29732. if (node == NULL) {
  29733. WOLFSSL_MSG("Memory error");
  29734. return WOLFSSL_FAILURE;
  29735. }
  29736. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  29737. /* push new obj onto head of stack */
  29738. node->data.dir_hash = sk->data.dir_hash;
  29739. node->next = sk->next;
  29740. node->type = sk->type;
  29741. sk->next = node;
  29742. sk->data.dir_hash = in;
  29743. sk->num += 1;
  29744. return WOLFSSL_SUCCESS;
  29745. }
  29746. /* create an instance of WOLFSSL_BY_DIR_entry structure */
  29747. WOLFSSL_BY_DIR_entry* wolfSSL_BY_DIR_entry_new(void)
  29748. {
  29749. WOLFSSL_BY_DIR_entry* entry;
  29750. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_new");
  29751. entry = (WOLFSSL_BY_DIR_entry*)XMALLOC(sizeof(WOLFSSL_BY_DIR_entry), NULL,
  29752. DYNAMIC_TYPE_OPENSSL);
  29753. if (entry) {
  29754. XMEMSET(entry, 0, sizeof(WOLFSSL_BY_DIR_entry));
  29755. }
  29756. return entry;
  29757. }
  29758. /* release a WOLFSSL_BY_DIR_entry resource */
  29759. void wolfSSL_BY_DIR_entry_free(WOLFSSL_BY_DIR_entry* entry)
  29760. {
  29761. WOLFSSL_ENTER("wolfSSL_BY_DIR_entry_free");
  29762. if (entry == NULL)
  29763. return;
  29764. if (entry->hashes) {
  29765. wolfSSL_sk_BY_DIR_HASH_free(entry->hashes);
  29766. }
  29767. if (entry->dir_name != NULL) {
  29768. XFREE(entry->dir_name, NULL, DYNAMIC_TYPE_OPENSSL);
  29769. }
  29770. XFREE(entry, NULL, DYNAMIC_TYPE_OPENSSL);
  29771. }
  29772. WOLFSSL_STACK* wolfSSL_sk_BY_DIR_entry_new_null(void)
  29773. {
  29774. WOLFSSL_STACK* sk = wolfSSL_sk_new_node(NULL);
  29775. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_new_null");
  29776. if (sk) {
  29777. sk->type = STACK_TYPE_BY_DIR_entry;
  29778. }
  29779. return sk;
  29780. }
  29781. /* return a number of WOLFSSL_BY_DIR_entry in stack */
  29782. int wolfSSL_sk_BY_DIR_entry_num(const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk)
  29783. {
  29784. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_num");
  29785. if (sk == NULL)
  29786. return -1;
  29787. return (int)sk->num;
  29788. }
  29789. /* return WOLFSSL_BY_DIR_entry instance at i */
  29790. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_value(
  29791. const WOLF_STACK_OF(WOLFSSL_BY_DIR_entry) *sk, int i)
  29792. {
  29793. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_value");
  29794. for (; sk != NULL && i > 0; i--)
  29795. sk = sk->next;
  29796. if (i != 0 || sk == NULL)
  29797. return NULL;
  29798. return sk->data.dir_entry;
  29799. }
  29800. /* pop WOLFSSL_BY_DIR_entry instance first, and remove its node from stack */
  29801. WOLFSSL_BY_DIR_entry* wolfSSL_sk_BY_DIR_entry_pop(
  29802. WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk)
  29803. {
  29804. WOLFSSL_STACK* node;
  29805. WOLFSSL_BY_DIR_entry* entry;
  29806. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop");
  29807. if (sk == NULL) {
  29808. return NULL;
  29809. }
  29810. node = sk->next;
  29811. entry = sk->data.dir_entry;
  29812. if (node != NULL) { /* update sk and remove node from stack */
  29813. sk->data.dir_entry = node->data.dir_entry;
  29814. sk->next = node->next;
  29815. wolfSSL_sk_free_node(node);
  29816. }
  29817. else { /* last x509 in stack */
  29818. sk->data.dir_entry = NULL;
  29819. }
  29820. if (sk->num > 0) {
  29821. sk->num -= 1;
  29822. }
  29823. return entry;
  29824. }
  29825. /* release all contents in stack, and then release stack itself. */
  29826. /* Second argument is a function pointer to release resouces. */
  29827. /* It calls the function to release resouces when t is passed */
  29828. /* instead of wolfSSL_BY_DIR_entry_free(). */
  29829. void wolfSSL_sk_BY_DIR_entry_pop_free(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  29830. void (*f) (WOLFSSL_BY_DIR_entry*))
  29831. {
  29832. WOLFSSL_STACK* node;
  29833. WOLFSSL_ENTER("wolfSSL_sk_BY_DIR_entry_pop_free");
  29834. if (sk == NULL) {
  29835. return;
  29836. }
  29837. /* parse through stack freeing each node */
  29838. node = sk->next;
  29839. while (node && sk->num > 1) {
  29840. WOLFSSL_STACK* tmp = node;
  29841. node = node->next;
  29842. if (f)
  29843. f(tmp->data.dir_entry);
  29844. else
  29845. wolfSSL_BY_DIR_entry_free(tmp->data.dir_entry);
  29846. tmp->data.dir_entry = NULL;
  29847. XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
  29848. sk->num -= 1;
  29849. }
  29850. /* free head of stack */
  29851. if (sk->num == 1) {
  29852. if (f)
  29853. f(sk->data.dir_entry);
  29854. else
  29855. wolfSSL_BY_DIR_entry_free(sk->data.dir_entry);
  29856. sk->data.dir_entry = NULL;
  29857. }
  29858. XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
  29859. }
  29860. /* release all contents in stack, and then release stack itself */
  29861. void wolfSSL_sk_BY_DIR_entry_free(WOLF_STACK_OF(wolfSSL_BY_DIR_entry) *sk)
  29862. {
  29863. wolfSSL_sk_BY_DIR_entry_pop_free(sk, NULL);
  29864. }
  29865. /* Adds the wolfSSL_BY_DIR_entry to the stack "sk". "sk" takes control of "in" and
  29866. * tries to free it when the stack is free'd.
  29867. *
  29868. * return 1 on success 0 on fail
  29869. */
  29870. int wolfSSL_sk_BY_DIR_entry_push(WOLF_STACK_OF(WOLFSSL_BY_DIR_entry)* sk,
  29871. WOLFSSL_BY_DIR_entry* in)
  29872. {
  29873. WOLFSSL_STACK* node;
  29874. if (sk == NULL || in == NULL) {
  29875. return WOLFSSL_FAILURE;
  29876. }
  29877. /* no previous values in stack */
  29878. if (sk->data.dir_entry == NULL) {
  29879. sk->data.dir_entry = in;
  29880. sk->num += 1;
  29881. return WOLFSSL_SUCCESS;
  29882. }
  29883. /* stack already has value(s) create a new node and add more */
  29884. node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
  29885. DYNAMIC_TYPE_OPENSSL);
  29886. if (node == NULL) {
  29887. WOLFSSL_MSG("Memory error");
  29888. return WOLFSSL_FAILURE;
  29889. }
  29890. XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
  29891. /* push new obj onto head of stack */
  29892. node->data.dir_entry = sk->data.dir_entry;
  29893. node->next = sk->next;
  29894. node->type = sk->type;
  29895. sk->next = node;
  29896. sk->data.dir_entry = in;
  29897. sk->num += 1;
  29898. return WOLFSSL_SUCCESS;
  29899. }
  29900. #endif /* OPENSSL_ALL */
  29901. #undef ERROR_OUT
  29902. #endif /* WOLFCRYPT_ONLY */